BasePurchase.php 8.8 KB

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