GoodsSku.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. namespace app\admin\controller\shop;
  3. use app\common\controller\Backend;
  4. use app\admin\model\shop\Spec;
  5. use app\admin\model\shop\GoodsSkuSpec;
  6. use app\admin\model\shop\Goods;
  7. use think\Db;
  8. /**
  9. * 商品SKU管理
  10. *
  11. * @icon fa fa-circle-o
  12. */
  13. class GoodsSku extends Backend
  14. {
  15. /**
  16. * GoodsSku模型对象
  17. * @var \app\admin\model\shop\GoodsSku
  18. */
  19. protected $model = null;
  20. public function _initialize()
  21. {
  22. parent::_initialize();
  23. $this->model = new \app\admin\model\shop\GoodsSku;
  24. }
  25. //添加、编辑商品规格
  26. public function add()
  27. {
  28. $goods_id = $this->request->param('goods_id');
  29. if (!$goods_id) {
  30. $this->error('参数错误');
  31. }
  32. $goods = Goods::get($goods_id);
  33. if (empty($goods)) {
  34. $this->error('商品不存在');
  35. }
  36. if ($this->request->isPost()) {
  37. $skus = $this->request->post('skus/a', '', 'trim,xss_clean');
  38. $spec = $this->request->post('spec/a', '', 'trim,xss_clean');
  39. if (empty($skus)) {
  40. $this->model->where('goods_id', $goods_id)->delete();
  41. $goods->spec_type = 0;
  42. $goods->save();
  43. $this->success('保存成功');
  44. }
  45. //坚持skus 和 spec 是否对上
  46. foreach ($skus as $item) {
  47. if (!isset($item['skus']) || !is_array($item['skus']) || empty($item['skus'])) {
  48. $this->error('规格属性不能为空');
  49. }
  50. if (!isset($item['price']) || !isset($item['marketprice'])) {
  51. $this->error('请录入价格');
  52. }
  53. if (($item['marketprice'] > 0 || $item['price'] > 0 || $item['stocks'] > 0) && $item['marketprice'] <= $item['price']) {
  54. $this->error('市场价必须大于销售价');
  55. }
  56. foreach ($item['skus'] as $k => $v) {
  57. if (empty($v)) {
  58. $this->error('规格属性不能为空');
  59. }
  60. if (!isset($spec[$k]['value']) || empty($spec[$k]['name'])) {
  61. $this->error('规格名称不能为空');
  62. }
  63. if (empty($spec[$k]['value']) || !in_array($v, $spec[$k]['value'])) {
  64. $this->error('规格属性不匹配');
  65. }
  66. }
  67. }
  68. // 启动事务
  69. Db::startTrans();
  70. try {
  71. //属性入库
  72. $spec_list = Spec::push($spec);
  73. $new_spec = GoodsSkuSpec::push($spec_list, $goods_id);
  74. //匹配属性
  75. $list = $this->model->where('goods_id', $goods_id)->select();
  76. $newData = [];
  77. $stocks = 0;
  78. foreach ($skus as $k => $sk) {
  79. if (isset($list[$k])) {
  80. $row = $list[$k];
  81. $sku_ids1 = explode(',', $row['sku_id']);
  82. sort($sku_ids1);
  83. $sku_ids2 = $this->getSkuId($sk['skus'], $new_spec);
  84. //相等的更新
  85. if (implode(',', $sku_ids1) == $sku_ids2) {
  86. $row->save([
  87. 'goods_sn' => isset($sk['goods_sn']) ? $sk['goods_sn'] : '',
  88. 'image' => isset($sk['image']) ? $sk['image'] : '',
  89. 'price' => isset($sk['price']) ? $sk['price'] : '',
  90. 'marketprice' => isset($sk['marketprice']) ? $sk['marketprice'] : '',
  91. 'stocks' => isset($sk['stocks']) ? $sk['stocks'] : ''
  92. ]);
  93. //不等的
  94. } else {
  95. $row->save([
  96. 'goods_sn' => isset($sk['goods_sn']) ? $sk['goods_sn'] : '',
  97. 'image' => isset($sk['image']) ? $sk['image'] : '',
  98. 'price' => isset($sk['price']) ? $sk['price'] : '',
  99. 'marketprice' => isset($sk['marketprice']) ? $sk['marketprice'] : '',
  100. 'stocks' => isset($sk['stocks']) ? $sk['stocks'] : '',
  101. 'sku_id' => $this->getSkuId($sk['skus'], $new_spec),
  102. 'sales' => 0
  103. ]);
  104. }
  105. unset($list[$k]);
  106. } else { //多余的
  107. $newData[] = [
  108. 'goods_id' => $goods_id,
  109. 'goods_sn' => isset($sk['goods_sn']) ? $sk['goods_sn'] : '',
  110. 'image' => isset($sk['image']) ? $sk['image'] : '',
  111. 'price' => isset($sk['price']) ? $sk['price'] : '',
  112. 'marketprice' => isset($sk['marketprice']) ? $sk['marketprice'] : '',
  113. 'stocks' => isset($sk['stocks']) ? $sk['stocks'] : '',
  114. 'sku_id' => $this->getSkuId($sk['skus'], $new_spec),
  115. ];
  116. }
  117. $stocks = bcadd($stocks, isset($sk['stocks']) ? $sk['stocks'] : 0);
  118. }
  119. if (!empty($newData)) {
  120. $this->model->saveAll($newData);
  121. }
  122. $goods->save(['stocks' => $stocks, 'spec_type' => (empty($skus) ? 0 : 1)]);
  123. //原来多的删除
  124. foreach ($list as $it) {
  125. $it->delete();
  126. }
  127. // 提交事务
  128. Db::commit();
  129. } catch (\Exception $e) {
  130. // 回滚事务
  131. Db::rollback();
  132. $this->error($e->getMessage());
  133. }
  134. $this->success('添加成功');
  135. }
  136. //查询属性输出
  137. $list = $this->model->field("sku.*,GROUP_CONCAT(sp.name,':',sv.value ORDER BY sp.id asc) sku_attr")
  138. ->alias('sku')
  139. ->where('sku.goods_id', $goods_id)
  140. ->join('shop_goods_sku_spec p', "FIND_IN_SET(p.id,sku.spec_value_ids)", 'LEFT')
  141. ->join('shop_spec sp', 'sp.id=p.spec_id', 'LEFT')
  142. ->join('shop_spec_value sv', 'sv.id=p.spec_value_id', 'LEFT')
  143. ->group('sku.id')
  144. ->select();
  145. $this->assignconfig('goods_skus', $list);
  146. $this->assignconfig('goods', $goods);
  147. return $this->view->fetch();
  148. }
  149. protected function getSkuId($skus, $new_spec)
  150. {
  151. $arr = [];
  152. foreach ($skus as $item) {
  153. $arr[] = $new_spec[$item]['id'];
  154. }
  155. sort($arr);
  156. return implode(',', $arr);
  157. }
  158. }