修改商品管理

This commit is contained in:
Anyon 2020-09-08 18:57:55 +08:00
parent 9de81664ba
commit 22425061bb
2 changed files with 61 additions and 91 deletions

View File

@ -151,28 +151,28 @@ class ShopGoods extends Controller
$this->cates = GoodsService::instance()->getCateList('arr2table');
// 商品默认规格
$fields = 'goods_sku,goods_code,goods_spec,price_selling,price_market,number_virtual,number_express express,status';
$this->items = $this->app->db->name('ShopGoodsItem')->where(['goods_code' => $data['code']])->column($fields, 'goods_spec');
$data['items'] = $this->app->db->name('ShopGoodsItem')->where(['goods_code' => $data['code']])->column($fields, 'goods_spec');
} elseif ($this->request->isPost()) {
if (empty($data['cover'])) $this->error('商品图片不能为空!');
if (empty($data['slider'])) $this->error('轮播图不能为空!');
// 商品规格保存
[$specs, $count] = [json_decode($data['lists'], true), 0];
foreach ($specs as $item) {
[$count, $items] = [0, json_decode($data['items_data'], true)];
foreach ($items as $item) {
$count += intval($item[0]['status']);
if (empty($data['price_market'])) $data['price_market'] = $item[0]['market'];
}
if (empty($count)) $this->error('无可用的商品规格!');
$this->app->db->name('ShopGoodsItem')->where(['goods_code' => $data['code']])->update(['status' => '0']);
foreach ($specs as $item) data_save('ShopGoodsItem', [
foreach ($items as $item) data_save('ShopGoodsItem', [
'goods_sku' => $item[0]['sku'],
'goods_code' => $item[0]['code'],
'goods_spec' => $item[0]['spec'],
'goods_code' => $data['code'],
'goods_spec' => $item[0]['key'],
'price_market' => $item[0]['market'],
'price_selling' => $item[0]['selling'],
'number_virtual' => $item[0]['virtual'],
'number_express' => $item[0]['express'],
'status' => $item[0]['status'] ? 1 : 0,
], 'goods_spec', ['goods_id' => $data['id']]);
], 'goods_spec', ['goods_code' => $data['code']]);
}
}

View File

@ -35,12 +35,12 @@
</tr>
<tr>
<td class="text-center">
<input name="image_logo" type="hidden" value="{$vo.image_logo|default=''}">
<script>$('[name="image_logo"]').uploadOneImage();</script>
<input name="cover" type="hidden" value="{$vo.cover|default=''}">
<script>$('[name="cover"]').uploadOneImage();</script>
</td>
<td class="text-left">
<input name="image_slider" type="hidden" value="{$vo.image_slider|default=''}">
<script>$('[name="image_slider"]').uploadMultipleImage();</script>
<input name="slider" type="hidden" value="{$vo.slider|default=''}">
<script>$('[name="slider"]').uploadMultipleImage();</script>
</td>
</tr>
</thead>
@ -48,18 +48,6 @@
</div>
<div class="layui-clear goods-item-box">
<fieldset>
<legend class="layui-bg-gray">入会礼包配置</legend>
<div class="layui-form-item">
{foreach [0=>'非入会礼包,购买后不会影响等级',1=>'入会员礼包,购买后升级会员级别'] as $k=>$v}
{if (isset($vo.vip_mod) and $vo.vip_mod eq $k) or (empty($vo.vip_mod) and $k eq 0)}
<input type="radio" name="vip_mod" value="{$k}" title="{$v}" checked lay-filter="vip_mod">
{else}
<input type="radio" name="vip_mod" value="{$k}" title="{$v}" lay-filter="vip_mod">
{/if}{/foreach}
</div>
</fieldset>
<fieldset>
<legend class="layui-bg-gray">商品限购设置</legend>
<label class="layui-form-item">
@ -94,7 +82,7 @@
<table class="layui-table margin-top-10">
<thead>
<tr>
<th ng-repeat="x in specsTreeNava track by $index" class="nowrap" ng-bind="x"></th>
<th ng-repeat="x in navas track by $index" class="nowrap" ng-bind="x"></th>
<th width="10%" class="text-center nowrap">商品SKU <a ng-click="batchSet('sku',0)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
<th width="10%" class="text-center nowrap">市场价格 <a ng-click="batchSet('market',2)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
<th width="10%" class="text-center nowrap">销售价格 <a ng-click="batchSet('selling',2)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
@ -104,7 +92,7 @@
</tr>
</thead>
<tbody>
<tr ng-repeat="rows in specsTreeData track by $index">
<tr ng-repeat="rows in items track by $index">
<td class="layui-bg-gray" ng-if="td.show" rowspan="{{td.span}}" ng-repeat="td in rows" ng-bind="td.name"></td>
<td class="padding-0">
<label class="padding-0 margin-0">
@ -138,8 +126,8 @@
</tbody>
</table>
<p class="color-desc">请注意商品SKU与商品条码尽量不要重复也不能产生订单后再修改</p>
<textarea class="layui-textarea layui-hide" name="specs">{{specs}}</textarea>
<textarea class="layui-textarea layui-hide" name="lists">{{specsTreeData}}</textarea>
<textarea class="layui-textarea layui-hide" name="specs_data">{{specs}}</textarea>
<textarea class="layui-textarea layui-hide" name="items_data">{{items}}</textarea>
</div>
<div class="layui-form-item block">
@ -148,8 +136,8 @@
</div>
<div class="layui-form-item text-center">
{notempty name='vo.id'}<input type="hidden" name="id" value="{$vo.id}">{/notempty}
<button class="layui-btn layui-btn-danger" ng-click="hsitoryBack()" type="button">取消编辑</button>
{notempty name='vo.code'}<input type="hidden" name="code" value="{$vo.code}">{/notempty}
<button class="layui-btn layui-btn-danger" ng-click="pageBack()" type="button">取消编辑</button>
<button class="layui-btn" type="submit">保存商品</button>
</div>
@ -159,19 +147,10 @@
{block name='script'}
<textarea class="layui-hide" id="goods-specs">{$vo.specs|raw|default=''}</textarea>
<textarea class="layui-hide" id="goods-value">{$defaultValues|raw|default=''}</textarea>
<textarea class="layui-hide" id="goods-items">{$vo.items|json_encode|raw|default=''}</textarea>
<script>
/*! 表单初始化 */
window.form.render();
window.form.on('radio(vip_mod)', (function set_vip_mod(data) {
this.selecter = $('select[name="vip_level"]');
if (parseInt(data.value)) {
this.selecter.removeClass('layui-disabled').removeAttr('disabled');
} else {
this.selecter.addClass('layui-disabled').attr('disabled', 'disabled');
}
return form.render('select'), set_vip_mod;
})({value: ('{$vo.vip_mod|default="0"}')}));
/*! 加载扩展插件 */
require(['ckeditor', 'angular'], function () {
@ -181,92 +160,83 @@
function callback($rootScope) {
$rootScope.isAddMode = parseInt('{$isAddMode|default=0}');
$rootScope.maps = JSON.parse(angular.element('#goods-value').val() || '[]') || {};
$rootScope.items = JSON.parse(angular.element('#goods-items').val() || '[]') || {};
$rootScope.specs = JSON.parse(angular.element('#goods-specs').val() || '[{"name":"默认分组","list":[{"name":"默认规格","check":true}]}]');
// 批量设置数值
$rootScope.batchSet = function (type, fixed) {
layer.prompt({title: '请输入数值', formType: 0}, function (value, index) {
$rootScope.$apply(function () {
var val = (parseFloat(value) || 0).toFixed(fixed);
for (var i in $rootScope.specsTreeData) for (var j in $rootScope.specsTreeData[i]) {
$rootScope.specsTreeData[i][j][type] = val;
for (var i in $rootScope.items) for (var j in $rootScope.items[i]) {
$rootScope.items[i][j][type] = val;
}
});
layer.close(index);
});
};
// 返回商品列表
$rootScope.hsitoryBack = function () {
$rootScope.pageBack = function () {
$.msg.confirm('确定要取消编辑吗?', function (index) {
history.back(), $.msg.close(index);
});
};
// 设置默认值
$rootScope.setValue = function (key, type, value, call) {
$rootScope.maps[key] || ($rootScope.maps[key] = {});
return $rootScope.maps[key][type] = eval(call.replace('_', "'" + value + "'"));
$rootScope.items[key] || ($rootScope.items[key] = {});
return $rootScope.items[key][type] = eval(call.replace('_', "'" + value + "'"));
};
// 读取默认值
$rootScope.getValue = function (key, callback) {
if (typeof callback === 'function') {
return callback($rootScope.maps[key] || {});
}
return {};
$rootScope.getValue = function (key, name, value) {
var item = ($rootScope.items[key] || {key: {}});
return typeof item[name] !== 'undefined' ? item[name] : value;
};
// 去除空白字符
$rootScope.trimSpace = function (value) {
return (value + '').replace(/\s*/ig, '');
};
// 生成交叉表格数据
$rootScope.specsTreeData = [];
$rootScope.specsTreeNava = [];
$rootScope.items = [], $rootScope.navas = [];
// 当前商品规格发生变化时重新计算规格列表
$rootScope.$watch('specs', function () {
var data = $rootScope.specs, list = [], navs = [], table = [[]];
var specs = $rootScope.specs, data = [], navs = [], table = [[]];
// 过滤无效记录
for (var i in data) {
for (var i in specs) {
var tmp = [];
for (var j in data[i].list) if (data[i].list[j].check && data[i].list[j].name.length > 0) {
data[i].list[j].span = 1, data[i].list[j].show = true, data[i].list[j].group = data[i].name;
tmp.push(data[i].list[j]);
for (var j in specs[i].list) if (specs[i].list[j].check && specs[i].list[j].name.length > 0) {
specs[i].list[j].span = 1, specs[i].list[j].show = true, specs[i].list[j].group = specs[i].name;
tmp.push(specs[i].list[j]);
}
list.push(tmp), navs.push(data[i].name);
data.push(tmp), navs.push(specs[i].name);
}
$rootScope.specsTreeNava = navs;
$rootScope.navas = navs;
// 表格交叉
for (var i in list) {
var tmp = [];
for (var j in table) for (var k in list[i]) tmp.push(table[j].concat(list[i][k]));
table = tmp;
}
data.forEach(function (line) {
var temp = [];
line.forEach(function (item) {
table.forEach(function (rows) {
temp.push(rows.concat(item))
});
})
table = temp;
});
// 表格合并
list = angular.fromJson(angular.toJson(table));
for (var i in list) {
var key = [], _key = '';
for (var td in list[i]) key.push(list[i][td].group + '::' + list[i][td].name);
for (var td in list[i]) if (_key.length === 0) {
list[i][0].key = _key = key.join(';;');
list[i][0].sku = $rootScope.getValue(_key, function (data) {
return data.sku || '0';
});
list[i][0].market = $rootScope.getValue(_key, function (data) {
return data.market || '0.00';
});
list[i][0].selling = $rootScope.getValue(_key, function (data) {
return data.selling || '0.00';
});
list[i][0].virtual = $rootScope.getValue(_key, function (data) {
return data.virtual || '0';
});
list[i][0].express = $rootScope.getValue(_key, function (data) {
return data.express || '1';
});
list[i][0].status = $rootScope.getValue(_key, function (data) {
return !!(typeof data.status !== 'undefined' ? data.status : true);
});
}
}
$rootScope.specsTreeData = list;
data = angular.fromJson(angular.toJson(table));
data.forEach(function (rows) {
var keys = [];
rows.forEach(function (item) {
keys.push(item.group + '::' + item.name);
}), rows.every(function (item) {
item.key = keys.join(';;');
item.sku = $rootScope.getValue(item.key, 'sku', 'S' + Date.now() + (Math.random() * 100).toFixed());
item.status = $rootScope.getValue(item.key, 'status', true);
item.market = $rootScope.getValue(item.key, 'market', '0.00');
item.selling = $rootScope.getValue(item.key, 'selling', '0.00');
item.virtual = $rootScope.getValue(item.key, 'virtual', '0');
item.express = $rootScope.getValue(item.key, 'express', '1');
return false;
});
});
$rootScope.items = data;
}, true);
// 判断规则是否能取消选择
$rootScope.checkListChecked = function (list, check) {