修改邮费模板管理

This commit is contained in:
Anyon 2020-09-17 14:32:58 +08:00
parent 07a2c65fbe
commit ba2205de89
7 changed files with 117 additions and 211 deletions

View File

@ -3,7 +3,6 @@
namespace app\data\controller;
use app\data\service\TruckService;
use app\store\service\OpenCuciService;
use think\admin\Controller;
use think\admin\service\SystemService;
use think\exception\HttpResponseException;
@ -75,7 +74,10 @@ class ShopTruckCompany extends Controller
*/
public function state()
{
$this->_save($this->table);
$this->_save($this->table, $this->_vali([
'status.in:0,1' => '状态值范围异常!',
'status.require' => '状态值不能为空!',
]));
}
/**

View File

@ -5,10 +5,9 @@ namespace app\data\controller;
use app\data\service\TruckService;
use think\admin\Controller;
use think\admin\extend\CodeExtend;
use think\admin\extend\DataExtend;
/**
* 配送运费模板管理
* 费模板管理
* Class ShopTruckTemplate
* @package app\data\controller
*/
@ -31,12 +30,14 @@ class ShopTruckTemplate extends Controller
public function index()
{
$this->title = '快递邮费配置';
$query = $this->_query($this->table)->like('name');
$query = $this->_query($this->table);
$query->like('code,name')->dateBetween('create_at');
$query->where(['deleted' => 0])->order('sort desc,id desc')->page();
}
/**
* 添加配送邮费模板
* @auth true
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
@ -44,7 +45,20 @@ class ShopTruckTemplate extends Controller
public function add()
{
$this->title = '添加配送邮费模板';
$this->_form($this->table, 'form');
$this->_form($this->table, 'form', 'code');
}
/**
* 编辑配送邮费模板
* @auth true
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function edit()
{
$this->title = '编辑配送邮费模板';
$this->_form($this->table, 'form', 'code');
}
/**
@ -61,41 +75,38 @@ class ShopTruckTemplate extends Controller
}
}
public function region()
/**
* 表单结果处理
* @param boolean $result
*/
protected function _form_result($result)
{
$this->citys = TruckService::instance()->region(2);
$this->fetch('form_region');
if ($result && $this->request->isPost()) {
$this->success('邮费模板保存成功!', 'javascript:history.back()');
}
}
/**
* 修改快递模板
* 启用或禁用邮费模板
* @auth true
* @throws \think\db\exception\DbException
*/
public function edit()
public function state()
{
[$list, $idxs, $post] = [[], [], $this->request->post()];
foreach (array_keys($post) as $key) if (stripos($key, 'order_reduction_state_') !== false) {
$idxs[] = str_replace('order_reduction_state_', '', $key);
}
foreach (array_unique($idxs) as $index) if (!empty($post["rule_{$index}"])) $list[] = [
'rule' => ',' . join(',', $post["rule_{$index}"]) . ',',
// 订单满减配置
'order_reduction_state' => $post["order_reduction_state_{$index}"],
'order_reduction_price' => $post["order_reduction_price_{$index}"],
// 首件邮费配置
'first_number' => $post["first_number_{$index}"],
'first_price' => $post["first_price_{$index}"],
// 首件邮费配置
'next_number' => $post["next_number_{$index}"],
'next_price' => $post["next_price_{$index}"],
// 默认邮费规则
'is_default' => $post["is_default_{$index}"],
];
if (empty($list)) $this->error('请配置有效的邮费规则');
$this->app->db->name($this->table)->where('1=1')->delete();
$this->app->db->name($this->table)->insertAll($list);
$this->success('邮费规则配置成功!');
$this->_save($this->table, $this->_vali([
'status.in:0,1' => '状态值范围异常!',
'status.require' => '状态值不能为空!',
]), 'code');
}
/**
* 删除邮费模板
* @auth true
* @throws \think\db\exception\DbException
*/
public function remove()
{
$this->_delete($this->table, 'code');
}
}

View File

@ -2,7 +2,7 @@
{block name="content"}
<div id="TruckForm">
<form onsubmit="return false;" action="{:request()->url()}" method="post" class='layui-form layui-card' autocomplete="off">
<form onsubmit="return false;" data-auto="true" action="{:request()->url()}" method="post" class='layui-form layui-card' autocomplete="off">
<div class="layui-card-body padding-40">
<label class="layui-form-item block relative">
<span class="color-green font-w7 margin-right-5">邮费模板名称</span><span class="color-desc">Name</span>
@ -20,31 +20,34 @@
</tr>
</thead>
<tbody>
<tr ng-repeat="item in rules">
<tr ng-repeat="item in rules" ng-if="item.city.length > 0">
<td>
<span class="margin-right-5" ng-repeat="province in item.city" ng-if="ShowProvinceStatus(province)">
<b class="font-w7" ng-bind="province.name"></b>
<span class="color-desc">{{ShowProvinceCityName(province)}}</span>
</span>
<span class="margin-right-5" ng-repeat="province in item.city" ng-if="ShowProvinceStatus(province)">
<b class="font-w7" ng-bind="province.name"></b>
<b class="color-desc">{{ShowProvinceCityName(province)}}</b>
</span>
<a class="margin-left-5" ng-click="EditRuleItem(item)">编辑</a>
<a class="margin-left-5" ng-click="RemoveRuleItem(item)">删除</a>
</td>
<td><input class="layui-input" ng-model="item.rule.firstNumber"></td>
<td><input class="layui-input" ng-model="item.rule.firstAmount"></td>
<td><input class="layui-input" ng-model="item.rule.repeatNumber"></td>
<td><input class="layui-input" ng-model="item.rule.repeatAmount"></td>
<td class="padding-0"><input class="layui-input border-0" ng-model="item.rule.firstNumber"></td>
<td class="padding-0"><input class="layui-input border-0" ng-model="item.rule.firstAmount"></td>
<td class="padding-0"><input class="layui-input border-0" ng-model="item.rule.repeatNumber"></td>
<td class="padding-0"><input class="layui-input border-0" ng-model="item.rule.repeatAmount"></td>
</tr>
<tr>
<td colspan="5"><a ng-click="AddRuleItem()">添加可配送区域和运费</a></td>
</tr>
</tbody>
</table>
<label class="layui-form-item text-center layui-hide">
<textarea name="content" class="layui-textarea layui-bg-gray">{{getRuleData()}}</textarea>
<textarea name="default" class="layui-textarea layui-bg-gray">{$vo.content|default=''|raw}</textarea>
</label>
<div class="hr-line-dashed"></div>
{if auth('edit')}
{notempty name='vo.code'}<input type="hidden" name="code" value="{$vo.code}">{/notempty}
<div class="layui-form-item text-center">
<button class="layui-btn" type='submit'>保存数据</button>
</div>
{/if}
</div>
</form>
@ -83,6 +86,7 @@
</div>
</div>
</div>
<div class="layui-form-item text-center">
<button class="layui-btn" ng-click="SetRuleItem()">确定选择</button>
</div>
@ -104,6 +108,22 @@
$rootScope.rules = [];
$rootScope.city = {subs: []};
$rootScope.citys = angular.fromJson(_data) || [];
/*! 生成待提交的数据 */
$rootScope.getRuleData = function () {
var data = [];
$rootScope.rules.forEach(function (rule) {
var item = {city: [], rule: rule.rule};
rule.city.forEach(function (province) {
var citys = [];
province.subs.forEach(function (city) {
citys.push(city.name)
});
item.city.push({name: province.name, subs: citys})
});
if (item.city.length > 0) data.push(item);
});
return data;
};
/*! 默认显示城市 */
$rootScope.citys.forEach(function (item) {
delete item.id, delete item.pid;
@ -196,16 +216,18 @@
if (item.show) item.status = !!province.status;
});
};
/*! 显示区域选择器 */
$rootScope.showDialog = function () {
layui.layer.open({
type: 1, shade: false, area: '800px', title: '选择配送区域',
type: 1, shade: false, area: '800px', title: '区域选择器',
content: $('#RegionDialog').removeClass('layui-hide'), end: function () {
$('#RegionDialog').addClass('layui-hide');
$rootScope.SetRuleItem();
}
});
};
$rootScope.$watch('citys', function () {
/*! 实时生成规则数据 */
$rootScope.setRuleData = function () {
/*! 合并当前操作数据到缓存 */
var _province_cache = {}, _city_cache = {};
$rootScope.rule.city.forEach(function (province) {
@ -238,7 +260,27 @@
if (province.subs.length > 0) provinces.push(province);
}
$rootScope.rule.city = provinces;
}, true);
}
/*! 数据变化监听处理 */
$rootScope.$watch('citys', $rootScope.setRuleData, true);
/*! 默认数据显示处理 */
var defaultItems = angular.fromJson($('[name="default"]').val() || '[]') || [];
defaultItems.forEach(function (item) {
$rootScope.rule = angular.fromJson(angular.toJson(_rule));
$rootScope.rule.rule = item.rule;
$rootScope.rules.push($rootScope.rule);
item.city.forEach(function (province) {
province.subs.forEach(function (city) {
$rootScope.citys.forEach(function (_item) {
_item.subs.forEach(function (_city) {
if (_city.name === city) _city.status = true;
});
});
});
});
$rootScope.setRuleData();
$rootScope.SetRuleItem();
});
}
});
</script>

View File

@ -1,55 +0,0 @@
<fieldset class="margin-bottom-20 relative" data-item-boxs>
<legend class="color-green font-s14">
<span class="layui-badge">{$group|default='邮费规则分组'}</span>
<input type="hidden" name="group[]" value="{$group|default='邮费规则分组'}">
</legend>
{if $group neq '默认邮费模板'}
<a onclick="delRuleItem(this)" class="layui-btn layui-btn-sm layui-btn-danger absolute" style="top:15px;right:5px;padding:0 5px">
<i class="layui-icon layui-icon-close margin-left-5 margin-right-5"></i>
</a>
<input type="hidden" name="default[]" value="1">
{else}
<input type="hidden" name="default[]" value="0">
{/if}
<div class="layui-form-item block relative">
<div class="color-desc font-s14">订单总金额满足条件时将减免该订单的所有邮费(请谨慎配置)</div>
<div class="layui-inline">
<label class="layui-form-label font-s14 padding-left-0 padding-right-10" style="width:auto">订单总金额满</label>
<div class="layui-input-inline" style="width:100px;">
<input type="text" name="reduct_amount[]" placeholder="" autocomplete="off" class="layui-input">
</div>
<label class="layui-form-label padding-left-5 padding-right-5" style="width:auto">元包邮</label>
</div>
</div>
<div data-city-box class="layui-form-item">
<div class="color-desc">
根据配送目的地的省份进行运费计算邮费(不在规则内的将使用默认邮费规则)
</div>
<div class="layui-row layui-col-space10 layui-bg-gray">
<div class="layui-col-xs3 text-center">首件(个)</div>
<div class="layui-col-xs3 text-center">运费(元)</div>
<div class="layui-col-xs3 text-center">续件(个)</div>
<div class="layui-col-xs3 text-center">续费(元)</div>
<label class="layui-col-xs3">
<input name="first_number[]" value="{$item.first_number|default='1'}" data-blur-number="0" class="layui-input text-center padding-left-0">
</label>
<label class="layui-col-xs3">
<input name="first_amount[]" value="{$item.first_amount|default='0.00'}" data-blur-number="2" class="layui-input text-center padding-left-0">
</label>
<label class="layui-col-xs3">
<input name="next_number[]" value="{$item.next_number|default='1'}" data-blur-number="0" class="layui-input text-center padding-left-0">
</label>
<label class="layui-col-xs3">
<input name="next_amount[]" value="{$item.next_amount|default='0.00'}" data-blur-number="2" class="layui-input text-center padding-left-0">
</label>
</div>
</div>
</fieldset>

View File

@ -1,98 +0,0 @@
<div class='layui-form layui-card layui-hide' id="RegionContainer">
<div class="layui-card-body padding-20 padding-bottom-0">
<div class="layui-row layui-col-space10">
<div class="layui-col-xs8">
<div class="layui-textarea" style="height:360px;overflow:auto">
<div>
<span class="pointer notselect margin-right-10" ng-click="setCheckAll(true)">全选</span>
<span class="pointer notselect margin-right-10" ng-click="setCheckAll(false)">取消</span>
</div>
<hr class="hr-line-dashed margin-top-5 margin-bottom-5">
<div class="layui-row layui-col-space5">
<div class="layui-col-xs3 nowrap" data-city-left ng-repeat="x in citys">
<label class="think-checkbox margin-right-0">
<input type="checkbox" ng-model="x.status" ng-change="setActiveCity(x)" ng-value="x.name" lay-ignore>
</label>
<span class="pointer notselect" ng-click="setActiveCity(x)">{{x.name}}</span>
</div>
</div>
</div>
</div>
<div class="layui-col-xs4">
<div class="layui-textarea" style="height:360px;overflow:auto">
<div>
<span class="pointer notselect margin-right-10" ng-click="setCheckItem(true)">全选</span>
<span class="pointer notselect margin-right-10" ng-click="setCheckItem(false)">取消</span>
<b ng-bind="city.name"></b>
</div>
<hr class="hr-line-dashed margin-top-5 margin-bottom-5">
<label ng-repeat="x in city.sub" class="think-checkbox nowrap layui-elip">
<input type="checkbox" ng-model="x.status" ng-value="x.name" value="" lay-ignore> {{x.name}}
</label>
</div>
</div>
</div>
<div class="layui-form-item layui-hide">{{items}}</div>
<div class="hr-line-dashed"></div>
<div class="layui-form-item text-center">
<button class="layui-btn" ng-click="submit()">确定选择</button>
<button class="layui-btn layui-btn-danger" data-close>取消编辑</button>
</div>
</div>
</div>
<label class="layui-hide">
<textarea id="CitysData">{$citys|json_encode|raw}</textarea>
</label>
<script>
require(['angular'], function () {
var app = angular.module("RegionContainer", []).run(callback);
angular.bootstrap(document.getElementById(app.name), [app.name]);
function callback($rootScope) {
$rootScope.items = [];
$rootScope.city = {sub: []};
$rootScope.citys = angular.fromJson($('#CitysData').val()) || [];
$rootScope.setCheckAll = function (status) {
$rootScope.citys.forEach(function (item) {
item.status = !!status;
item.sub.forEach(function (item) {
item.status = !!status;
});
})
};
$rootScope.submit = function () {
top.setCitys($rootScope.items);
};
$rootScope.setCheckItem = function (status) {
$rootScope.city.sub.forEach(function (item) {
item.status = !!status;
});
};
$rootScope.setActiveCity = function (city) {
$rootScope.city = city;
city.sub.forEach(function (item) {
item.status = city.status;
});
};
$rootScope.$watch('citys', function () {
let citys = [], full = 1;
$rootScope.citys.forEach(function (item) {
let subs = [];
item.sub.forEach(function (item) {
if (item.status) subs.push(item.name)
});
subs.length === item.sub.length ? subs = [] : full = 0;
item.status ? citys.push({name: item.name, subs: subs.join(',')}) : full = 0;
$rootScope.items = full ? [{name: '全国'}] : citys;
});
}, true);
$rootScope.$watch('city', function () {
$rootScope.city.status = $rootScope.city.sub.some(function (city) {
if (city.status) return true;
});
}, true);
}
});
</script>

View File

@ -24,8 +24,10 @@
<th class='list-table-sort-td'>
<button type="button" data-reload class="layui-btn layui-btn-xs"> </button>
</th>
<th class='text-left nowrap'>模板编号</th>
<th class='text-left nowrap'>模板名称</th>
<th class="text-center">创建时间</th>
<th class='text-left nowrap'>使用状态</th>
<th class="text-left">创建时间</th>
<th></th>
</tr>
</thead>
@ -41,19 +43,21 @@
<input data-action-blur="{:request()->url()}" data-value="id#{$vo.id};action#sort;sort#{value}" data-loading="false" value="{$vo.sort}" class="list-sort-input">
</label>
</td>
<td class='text-left nowrap'>{$vo.code|default=''}</td>
<td class='text-left nowrap'>{$vo.name|default=''}</td>
<td class='text-center nowrap'>{$vo.create_at|format_datetime}</td>
<td class="text-left nowrap">{if $vo.status eq 0}<span class="color-red">已禁用</span>{elseif $vo.status eq 1}<span class="color-green">使用中</span>{/if}</td>
<td class='text-left nowrap'>{$vo.create_at|format_datetime}</td>
<td class='text-left nowrap'>
<!--{if auth("edit")}-->
<a data-dbclick class="layui-btn layui-btn-xs" data-title="编辑快递公司" data-open='{:url("edit")}?id={$vo.id}'> </a>
<a data-dbclick class="layui-btn layui-btn-xs" data-title="编辑快递公司" data-open='{:url("edit")}?code={$vo.code}'> </a>
<!--{/if}-->
<!--{if $vo.status eq 1 and auth("state")}-->
<a class="layui-btn layui-btn-warm layui-btn-xs" data-action="{:url('state')}" data-value="id#{$vo.id};status#0"> </a>
<a class="layui-btn layui-btn-warm layui-btn-xs" data-action="{:url('state')}" data-value="code#{$vo.code};status#0"> </a>
<!--{elseif auth("state")}-->
<a class="layui-btn layui-btn-warm layui-btn-xs" data-action="{:url('state')}" data-value="id#{$vo.id};status#1"> </a>
<a class="layui-btn layui-btn-warm layui-btn-xs" data-action="{:url('state')}" data-value="code#{$vo.code};status#1"> </a>
<!--{/if}-->
<!--{if auth("remove")}-->
<a class="layui-btn layui-btn-danger layui-btn-xs" data-confirm="确定要删除数据吗?" data-action="{:url('remove')}" data-value="id#{$vo.id}"> </a>
<a class="layui-btn layui-btn-danger layui-btn-xs" data-confirm="确定要删除数据吗?" data-action="{:url('remove')}" data-value="code#{$vo.code}"> </a>
<!--{/if}-->
</td>
</tr>

View File

@ -2,15 +2,15 @@
<legend>条件搜索</legend>
<form class="layui-form layui-form-pane form-search" action="{:url('')}" onsubmit="return false" method="get" autocomplete="off">
<div class="layui-form-item layui-inline">
<label class="layui-form-label">快递名称</label>
<label class="layui-form-label">模板编号</label>
<div class="layui-input-inline">
<input name="name" value="{:input('name','')}" placeholder="请输入快递名称" class="layui-input">
<input name="code" value="{:input('code','')}" placeholder="请输入模板编号" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-inline">
<label class="layui-form-label">快递编码</label>
<label class="layui-form-label">模板名称</label>
<div class="layui-input-inline">
<input name="code" value="{:input('code','')}" placeholder="请输入快递编码" class="layui-input">
<input name="name" value="{:input('name','')}" placeholder="请输入模板名称" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-inline">