Goods.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <?php
  2. namespace app\admin\controller\commission;
  3. use app\common\controller\Backend;
  4. use app\common\model\commission\CommissionGoods as CommissionGoodsModel;
  5. use app\common\model\Goods as GoodsModel;
  6. use app\common\model\commission\Level as LevelModel;
  7. use app\common\Enum\CommissionGoodsEnum;
  8. use think\Db;
  9. class Goods extends Backend
  10. {
  11. protected $model = null;
  12. protected $goodsModel;
  13. /**
  14. * 快速搜索时执行查找的字段
  15. */
  16. protected $searchFields = 'id,title,subtitle';
  17. /**
  18. * 是否是关联查询
  19. */
  20. protected $relationSearch = false;
  21. public function _initialize()
  22. {
  23. parent::_initialize();
  24. $this->model = new GoodsModel(); // 使用商品模型作为主模型,以便使用FastAdmin的标准功能
  25. $this->goodsModel = new GoodsModel();
  26. // 传递枚举配置给前端
  27. $this->assignconfig('commission_goods_participate_list', CommissionGoodsEnum::$participateList);
  28. $this->assignconfig('commission_goods_order_status_list', CommissionGoodsEnum::$orderStatusList);
  29. $this->assignconfig('commission_goods_rule_type_list', CommissionGoodsEnum::$ruleTypeList);
  30. $this->assignconfig('commission_goods_level_list', CommissionGoodsEnum::$levelList);
  31. $this->assignconfig('commission_goods_self_buy_list', CommissionGoodsEnum::$selfBuyList);
  32. $this->assignconfig('commission_goods_settlement_list', CommissionGoodsEnum::$settlementList);
  33. $this->assignconfig('commission_goods_commission_settlement_list', CommissionGoodsEnum::$commissionSettlementList);
  34. $this->assignconfig('commission_goods_commission_type_list', CommissionGoodsEnum::$commissionTypeList);
  35. }
  36. public function index()
  37. {
  38. if (!$this->request->isAjax()) {
  39. return $this->view->fetch();
  40. }
  41. //如果发送的来源是 Selectpage,则转发到 Selectpage
  42. if ($this->request->request('keyField')) {
  43. return $this->selectpage();
  44. }
  45. [$where, $sort, $order, $offset, $limit] = $this->buildparams();
  46. $list = $this->model
  47. ->with('commission_goods')
  48. ->where($where)
  49. ->order($sort, $order)
  50. ->paginate($limit);
  51. $result = ['total' => $list->total(), 'rows' => $list->items()];
  52. return json($result);
  53. }
  54. /**
  55. * 详情
  56. *
  57. * @param $id
  58. */
  59. public function detail($id)
  60. {
  61. $goodsList = collection(GoodsModel::with(['commission_goods'])->whereIn('id', $id)->select())->each(function ($goods) {
  62. $goods->skus = $goods->skus;
  63. $goods->sku_prices = $goods->sku_prices;
  64. });
  65. // 获取分销配置
  66. $config = [
  67. 'participate_list' => CommissionGoodsEnum::$participateList,
  68. 'rule_type_list' => CommissionGoodsEnum::$ruleTypeList,
  69. 'level_list' => CommissionGoodsEnum::$levelList
  70. ];
  71. $this->success('分销商品详情', null, [
  72. 'goods' => $goodsList,
  73. 'config' => $config
  74. ]);
  75. }
  76. /**
  77. * 设置佣金
  78. *
  79. * @param $ids
  80. */
  81. public function edit($ids = null)
  82. {
  83. if (!$this->request->isPost()) {
  84. // GET请求,显示设置页面
  85. $goodsIds = explode(',', $ids);
  86. $goodsList = GoodsModel::whereIn('id', $goodsIds)
  87. ->with(['commission_goods'])
  88. ->select();
  89. // 获取分销商等级列表
  90. $levelList = LevelModel::where('status', 'normal')
  91. ->order('level asc')
  92. ->select();
  93. $this->view->assign([
  94. 'goods_list' => $goodsList,
  95. 'level_list' => $levelList,
  96. 'goods_ids' => $ids
  97. ]);
  98. return $this->view->fetch();
  99. }
  100. // POST请求,保存设置
  101. $params = $this->request->post();
  102. // 验证必需参数
  103. if (empty($ids)) {
  104. $this->error('商品ID不能为空');
  105. }
  106. $result = Db::transaction(function () use ($ids, $params) {
  107. $goodsIds = explode(',', $ids);
  108. $count = 0;
  109. foreach ($goodsIds as $goods_id) {
  110. $goods_id = intval($goods_id);
  111. if ($goods_id <= 0) continue;
  112. // 查找或创建分销商品记录
  113. $commissionGoods = CommissionGoodsModel::where('goods_id', $goods_id)->find();
  114. if (!$commissionGoods) {
  115. $commissionGoods = new CommissionGoodsModel();
  116. $commissionGoods->goods_id = $goods_id;
  117. }
  118. // 保存基本设置
  119. $commissionGoods->status = intval($params['status'] ?? CommissionGoodsEnum::PARTICIPATE_NO);
  120. $commissionGoods->order_status = intval($params['order_status'] ?? CommissionGoodsEnum::ORDER_STATUS_YES);
  121. $commissionGoods->rule_type = intval($params['rule_type'] ?? CommissionGoodsEnum::RULE_TYPE_DEFAULT);
  122. $commissionGoods->self_buy = intval($params['self_buy'] ?? CommissionGoodsEnum::SELF_BUY_OFF);
  123. $commissionGoods->settlement_type = intval($params['settlement_type'] ?? CommissionGoodsEnum::SETTLEMENT_GOODS_PRICE);
  124. $commissionGoods->commission_settlement = intval($params['commission_settlement'] ?? CommissionGoodsEnum::COMMISSION_AFTER_PAY);
  125. // 保存扩展配置
  126. $config = [];
  127. if (!empty($params['config'])) {
  128. $config = is_array($params['config']) ? $params['config'] : json_decode($params['config'], true);
  129. }
  130. $commissionGoods->config = $config;
  131. $commissionGoods->save();
  132. // 如果是独立规则或批量规则,保存佣金规则
  133. if (in_array($commissionGoods->rule_type, [CommissionGoodsEnum::RULE_TYPE_CUSTOM, CommissionGoodsEnum::RULE_TYPE_BATCH])) {
  134. if (!empty($params['commission_rules'])) {
  135. $this->saveCommissionRules($goods_id, $params['commission_rules'], $commissionGoods->rule_type);
  136. }
  137. }
  138. $count++;
  139. }
  140. return $count;
  141. });
  142. if ($result) {
  143. $this->success('设置成功', '', $result);
  144. } else {
  145. $this->error('设置失败');
  146. }
  147. }
  148. /**
  149. * 保存佣金规则
  150. */
  151. private function saveCommissionRules($goodsId, $rulesData, $ruleType)
  152. {
  153. // 删除现有规则
  154. Db::name('commission_goods_rules')
  155. ->where('goods_id', $goodsId)
  156. ->delete();
  157. if (empty($rulesData) || !is_array($rulesData)) {
  158. return true;
  159. }
  160. $insertData = [];
  161. foreach ($rulesData as $agentLevel => $levelRules) {
  162. if (!is_array($levelRules)) continue;
  163. foreach ($levelRules as $commissionLevel => $rule) {
  164. if (empty($rule['value']) || bccomp($rule['value'], '0', 4) <= 0) {
  165. continue;
  166. }
  167. $insertData[] = [
  168. 'goods_id' => $goodsId,
  169. 'sku_id' => 0, // 批量规则统一为0,独立规则需要具体SKU ID
  170. 'agent_level' => intval($agentLevel),
  171. 'commission_level' => intval($commissionLevel),
  172. 'type' => $rule['type'] ?? 'rate',
  173. 'value' => floatval($rule['value']),
  174. 'status' => 1,
  175. 'createtime' => time(),
  176. 'updatetime' => time()
  177. ];
  178. }
  179. }
  180. if (!empty($insertData)) {
  181. return Db::name('commission_goods_rules')->insertAll($insertData);
  182. }
  183. return true;
  184. }
  185. }