BasePurchase.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <?php
  2. namespace addons\UpgradeGift\common\logic\order\purchase;
  3. use addons\Agent\common\enums\AgentEnum;
  4. use addons\Mch\common\models\Mch;
  5. use common\enums\AddonsEnum;
  6. use common\enums\AppEnum;
  7. use common\enums\OrderSourceEnum;
  8. use common\enums\ShippingTypeEnum;
  9. use common\enums\StatusEnum;
  10. use common\helpers\ArrayHelper;
  11. use common\models\goods\Goods;
  12. use common\models\mall\Mall;
  13. use common\models\mall\MallAddons;
  14. use common\models\user\UserAddress;
  15. use common\traits\ErrorTrait;
  16. use Exception;
  17. use yii\helpers\Json;
  18. // 支付方式接口
  19. abstract class BasePurchase
  20. {
  21. use ErrorTrait;
  22. public $isNewRecord = false; // 是否是新增操作
  23. /**
  24. * 执行
  25. * @Author bing
  26. * @DateTime 2021-09-23 09:46:41
  27. * @copyright: Copyright (c) 2020 广东七件事集团
  28. * @param $form
  29. * @return
  30. */
  31. abstract public function execute($form);
  32. /**
  33. * 获取下单类型
  34. * @Author bing
  35. * @DateTime 2021-09-23 09:48:45
  36. * @copyright: Copyright (c) 2020 广东七件事集团
  37. * @return string
  38. */
  39. abstract public static function getType(): string;
  40. public function afterExecute($form, string $type)
  41. {
  42. try {
  43. // 重组默认商品信息
  44. // $default_goods = ArrayHelper::arrayKey($form['default_goods'], 'id');
  45. $order_goods = $form['order_goods'];
  46. $group_order_goods = [];
  47. $mch_arr = [];
  48. $data = is_array($form->data)?$form->data:Json::decode($form->data,true);
  49. $mall_id_arr = array_column($order_goods,'mall_id');
  50. //多商户
  51. if (MallAddons::isInstall($mall_id_arr[0], AddonsEnum::ADDONS_NAME_MCH)){
  52. $mch_ids = array_column($order_goods,'mch_id');
  53. $mch_list = Mch::lists(['where'=>[['id' =>$mch_ids]],'select'=>'id,store_name as name,expire_time','index'=>'id'], true);
  54. if($mch_list){
  55. $mch_arr = array_column($mch_list,'name','id');
  56. }
  57. }
  58. $mall_list = Mall::lists(['where'=>[['id' =>$mall_id_arr]],'select'=>'id,name'], true);
  59. $mall_arr = array_column($mall_list,'name','id');
  60. // if ($this->checkMarketingType($data) == false) throw new Exception('营销类型有误');
  61. $extra_info = '';
  62. $marketing_id = 0;
  63. $marketing_type = '';
  64. $order_source = '';
  65. if(!empty($data['marketing_id'])) $marketing_id = $data['marketing_id'];
  66. if(!empty($data['order_source'])) $order_source = $data['order_source'];
  67. if(!empty($data['marketing_type'])) $marketing_type = $data['marketing_type'];
  68. if(!empty($data['extra_info'])) $extra_info = json_encode($data['extra_info']);
  69. $supply_chain = [];
  70. // 产品按照商户重新归类组别
  71. foreach ($order_goods as $item) {
  72. if(!isset($group_order_goods[$item['mch_id']])){
  73. \Yii::error("goods_id {$item['goods_id']} -> {$item['goods_attr_id']} -> " . var_export($item, true));
  74. $group_order_goods[$item['mch_id']]['mch_order_info']['mch_id'] = $item['mch_id'];
  75. if(is_string($item['mch_id']) || $item['mch_id'] == 0){
  76. // 平台
  77. if(empty($mall_arr[$item['mall_id']]))throw new Exception('商城不存在');
  78. if (!empty($form->process_extra_data['supply_chain'][$item['goods_id']])) { // 包含供应链商品
  79. $t_supply_chain_name = $form->process_extra_data['supply_chain'][$item['goods_id']];
  80. if (empty($supply_chain[$t_supply_chain_name])) {
  81. $supply_chain[$t_supply_chain_name] =
  82. $this->getSupplyMallName($item['mall_id'], $t_supply_chain_name, $mall_arr[$item['mall_id']]); // 获取供应链指定名称
  83. }
  84. $group_order_goods[$item['mch_id']]['mch_order_info']['mch_name'] = $supply_chain[$t_supply_chain_name];
  85. $item['mch_id'] = $t_supply_chain_name;
  86. } else {
  87. $group_order_goods[$item['mch_id']]['mch_order_info']['mch_name'] = $mall_arr[$item['mall_id']];
  88. }
  89. }else{
  90. // 查询商户信息
  91. if(!empty($mch_arr[$item['mch_id']])){
  92. if(!empty($mch_list[$item['mch_id']]['expire_time'])&&$mch_list[$item['mch_id']]['expire_time']<=time()){
  93. throw new Exception('商户:'.$mch_arr[$item['mch_id']].'已过期');
  94. }
  95. $group_order_goods[$item['mch_id']]['mch_order_info']['mch_name'] = $mch_arr[$item['mch_id']];
  96. }else{
  97. $group_order_goods[$item['mch_id']]['mch_order_info']['mch_name'] = $mall_arr[$item['mall_id']];
  98. }
  99. $marketing_id =$item['mch_id'];
  100. $marketing_type ='Mch';
  101. }
  102. // 主订单信息
  103. $group_order_goods[$item['mch_id']]['mch_order_info']['user_id'] = $item['user_id'];
  104. $group_order_goods[$item['mch_id']]['mch_order_info']['mall_id'] = $item['mall_id'];
  105. $group_order_goods[$item['mch_id']]['mch_order_info']['address_id'] = 0;
  106. $group_order_goods[$item['mch_id']]['mch_order_info']['order_source'] = $order_source;
  107. $group_order_goods[$item['mch_id']]['mch_order_info']['remark'] = $data['remark'][$item['mch_id']]??'';
  108. $group_order_goods[$item['mch_id']]['mch_order_info']['original_goods_price'] = $item['original_goods_price'] ?? 0;
  109. $group_order_goods[$item['mch_id']]['mch_order_info']['goods_price'] = 0; // TODO 赠送商品0元
  110. $group_order_goods[$item['mch_id']]['mch_order_info']['pay_money'] = 0; // TODO 赠送商品0元
  111. $group_order_goods[$item['mch_id']]['mch_order_info']['marketing_type'] = $data['marketing_type'] ?? '';
  112. $group_order_goods[$item['mch_id']]['mch_order_info']['marketing_id'] = $data['marketing_id'] ?? 0;
  113. $group_order_goods[$item['mch_id']]['mch_order_info']['shipping_type'] = $data['shipping_type'] ?? ShippingTypeEnum::LOGISTICS;
  114. }else{
  115. $group_order_goods[$item['mch_id']]['mch_order_info']['original_goods_price'] += $item['original_goods_price'] ?? 0;
  116. // $group_order_goods[$item['mch_id']]['mch_order_info']['goods_price'] += $item['goods_price']; // TODO 赠送商品0元
  117. // $group_order_goods[$item['mch_id']]['mch_order_info']['pay_money'] += $item['goods_price']; // TODO 赠送商品0元
  118. $group_order_goods[$item['mch_id']]['mch_order_info']['marketing_type'] = $data['marketing_type'] ?? '';
  119. }
  120. if (!isset($group_order_goods[$item['mch_id']]['goods'][$item['goods_id']])) {
  121. $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_id'] = $item['goods_id'];
  122. $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_price'] = 0;
  123. $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['num'] = 0;
  124. $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_name'] = $item['goods_name'];
  125. $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_details'] = [];
  126. $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['original_goods_price'] = 0;
  127. }
  128. $group_order_goods[$item['mch_id']]['mch_order_info']['marketing_id'] = $marketing_id;
  129. $group_order_goods[$item['mch_id']]['mch_order_info']['marketing_type'] = $marketing_type;
  130. $group_order_goods[$item['mch_id']]['mch_order_info']['extra_info'] = $extra_info;
  131. $group_order_goods[$item['mch_id']]['mch_order_info']['is_virtual'] = $form->is_virtual;
  132. // $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_price'] += $item['goods_price']; // TODO 赠送商品0元
  133. $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['original_goods_price'] += $item['original_goods_price'];
  134. $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['num'] += $item['num'];
  135. $item['goods_price'] = 0; // TODO 赠送商品0元
  136. if($order_source === OrderSourceEnum::SOURCE_RESERVE){
  137. // 预约订单单独处理
  138. $group_order_goods[$item['mch_id']]['mch_order_info']['order_source'] = OrderSourceEnum::SOURCE_RESERVE;
  139. // dd($form->sku[$item['goods_id']]);
  140. $item['unit'] = $form->sku[$item['goods_id']]['goods']['unit'];
  141. $info = $form->sku[$item['goods_id']];
  142. $reserve = $info['reserve'] ? ArrayHelper::toArray($info['reserve']) : [];
  143. unset($info['reserve'],$info['goods']);
  144. $reserve['sku'] = $info;
  145. $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['reserve'] = $reserve;
  146. }
  147. $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_details'][] = $item;
  148. }
  149. // 写入组别
  150. $form['group_order_goods'] = $group_order_goods;
  151. $form['address_id'] = $data['address_id'];
  152. return $form;
  153. }catch(Exception $e){
  154. $this->setError($e->getMessage());
  155. return false;
  156. }
  157. }
  158. /**
  159. * @desc:校验收货地址
  160. * @Author: hua
  161. * @Date: 2021/11/23
  162. * @Time: 10:49
  163. * @Copyright: copyright (c) 2021 广东七件事集团
  164. * @param $action
  165. * @param $data
  166. * @param $user_id
  167. * @throws Exception
  168. */
  169. public function checkAddress($action,$data,$user_id){
  170. if($action==AppEnum::ACTION_CREATE&&(empty($data['shipping_type'])||$data['shipping_type']!=ShippingTypeEnum::PICKUP)) {
  171. if (empty($data['address_id'])) throw new Exception('收货地址不能为空');
  172. $res = UserAddress::findOne(['id' => $data['address_id'], 'status' => StatusEnum::ENABLED, 'user_id' => $user_id]);
  173. if (empty($res)) throw new Exception('收货地址无效');
  174. // $orderConfig = \Yii::$app->services->setting->mall->get($data['mall_id'], 'order');
  175. // if ($orderConfig['is_town'] && !$res['town']) throw new Exception('收货地址缺少镇乡');
  176. }
  177. }
  178. /**
  179. * 检测营销活动类型
  180. * @Author: lun
  181. * @DateTime: 2022/1/10 0010 10:26
  182. * @Copyright: copyright (c) 2021 广东七件事集团
  183. * @param $data
  184. * @return bool
  185. */
  186. public function checkMarketingType($data)
  187. {
  188. if (!empty($data['marketing_type'])) {
  189. $addons_arr = AddonsEnum::getAddonsNameMap();
  190. if (empty($addons_arr[$data['marketing_type']])) return false;
  191. }
  192. return true;
  193. }
  194. protected function getSupplyMallName(int $mall_id, string $addons_name, string $default)
  195. {
  196. $service = "\addons\\$addons_name\common\service\SettingService";
  197. $service = new $service(['mall_id' => $mall_id]);
  198. $config = $service->getSetting();
  199. if (empty($config['is_enable_shopping_cart_settle'])) throw new Exception("非法操作");
  200. return !empty($config['shopping_cart_mall_name']) ? $config['shopping_cart_mall_name'] : $default;
  201. }
  202. }