SignService.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. <?php
  2. namespace addons\Community\common\service;
  3. use addons\Community\common\enums\CommunityEnum;
  4. use addons\Community\common\events\OrderPickupEvent;
  5. use addons\Community\common\models\CommunityHead;
  6. use addons\Community\common\models\CommunityHeadOrder;
  7. use addons\Community\common\models\CommunitySignLog;
  8. use common\enums\ClerkEnum;
  9. use common\enums\MarketingTypeEnum;
  10. use addons\Store\common\models\StoreClerk;
  11. use common\enums\OrderStatusEnum;
  12. use common\enums\PayTypeEnum;
  13. use common\enums\ShippingTypeEnum;
  14. use common\enums\StatusEnum;
  15. use common\events\order\OrderTakeDeliveryEvent;
  16. use common\globals\GlobalInvoke;
  17. use common\models\common\ClerkLog;
  18. use common\models\goods\Goods;
  19. use common\models\order\Order;
  20. use common\models\order\OrderDetail;
  21. use common\models\order\OrderMarketing;
  22. use Yii;
  23. use yii\db\Exception;
  24. use addons\Store\common\models\Store;
  25. class SignService
  26. {
  27. /**
  28. * 实行核销
  29. * @param int $mall_id
  30. * @param string $order_no
  31. * @param int $user_id
  32. * @param string $key
  33. * @return bool|string
  34. */
  35. public function create(int $mall_id, string $order_no, int $user_id, string $key = 'order_no')
  36. {
  37. $t = Yii::$app->db->beginTransaction();
  38. try {
  39. $clerk_code_pre = $order_no[0] . $order_no[1];
  40. if($clerk_code_pre==ClerkEnum::COMMUNITY_CLERK_CODE_PRE){
  41. $order = Order::findOne(['clerk_code' => $order_no, 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED]);
  42. }else{
  43. $order = Order::findOne([$key => $order_no, 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED]);
  44. }
  45. if (!empty($order)) {
  46. $order_status = $order->order_status;
  47. $order->order_status = OrderStatusEnum::SING;
  48. $order->sign_time = time();
  49. $res = $order->save();
  50. if (!$res) throw new \Exception($order->getErrorMessage());
  51. } else {
  52. throw new \Exception("订单不存在1");
  53. }
  54. /**
  55. * @var $data CommunityHeadOrder
  56. */
  57. $data = CommunityHeadOrder::getOne([
  58. ['user_id' => $user_id],
  59. ['mall_id' => $mall_id],
  60. ['order_id' => $order->id]
  61. ]);
  62. if (!$data) throw new \Exception('您没有核销权限');
  63. // 什么情况下订单可以进行核销
  64. $config = Yii::$app->services->setting->addons->get($mall_id, CommunityEnum::ADDONS_NAME, 'basic');
  65. $is_enable_write_off = !empty($config['is_enable_write_off']) ? StatusEnum::ENABLED : StatusEnum::DISABLED; // 是否有开启核销
  66. if (!empty($is_enable_write_off)) { // 如果有开启
  67. if ($order->shipping_type == ShippingTypeEnum::PICKUP) { // 自提订单
  68. $sing_status = [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS];
  69. } else { // 如果是送货上门的,那么团长不能帮忙签收及核销
  70. throw new \Exception("您没有核销权限");
  71. }
  72. } else { // 如果没有开启,那么走原有的逻辑
  73. $sing_status = [OrderStatusEnum::SHIPMENTS];
  74. }
  75. if (!in_array($order_status, $sing_status)) {
  76. throw new Exception('当前状态不可核销');
  77. }
  78. // 先处理发货
  79. if ($order_status == OrderStatusEnum::PAY) {
  80. // 执行发货操作
  81. // $form['mall_id'] = $mall_id;
  82. // $form['mch_id'] = 0;
  83. // $form['shipping_type'] = 0;
  84. // $form['id'] = $order->id;
  85. // $form['operator_id'] = $user_id;
  86. // $form['order_detail_ids'] = OrderDetail::find()->where(['order_id' => $order->id])->select('id')->column();
  87. // $form['operator_name'] = $data->head->name ?? '';
  88. // OrderExpress::delivery($form); // 发货
  89. /**
  90. * liuzhantao的注释:
  91. * 上面这个代码本来就注释的,不是我写的
  92. * 我要说明的是下列这个代码:需要支付类型是“微信支付”,才能执行成功,如果我是余额支付,那就执行失败,并返回错误,因此这样是不对的
  93. * 所以我增加了判断,订单类型是“微信支付”,才执行该代码
  94. */
  95. if($order->payment_type == 1){
  96. \common\listeners\order\OrderFinishListener::uploadShippingInfo($order, 4);
  97. }
  98. }
  99. $data->order_status = OrderStatusEnum::SING;
  100. if (!$data->save()) throw new \Exception('核销失败');
  101. $model = new CommunitySignLog();
  102. $model->mall_id = $mall_id;
  103. $model->user_id = $user_id;
  104. $model->order_id = $order->id;
  105. $model->head_id = $data->head_id;
  106. $model->buyer_user_id = $order->user_id;
  107. if (!$model->save()) throw new \Exception('核销失败!');
  108. $t->commit();
  109. // 通过确认收货事件触发分佣
  110. $event = new OrderTakeDeliveryEvent($mall_id);
  111. $eData['id'] = $order->id;
  112. $eData['operator_id'] = $user_id;
  113. $eData['operator_name'] = $data->head->name ?? '';
  114. Yii::$app->services->events->dispatch($event, $eData, $event->listeners);
  115. // 执行事件
  116. // $event = new OrderPickupEvent($mall_id);
  117. // Yii::$app->services->events->dispatch($event,[
  118. // 'mall_id' => $mall_id,
  119. // 'id' => $order->id,
  120. // ], $event->listeners);
  121. return true;
  122. } catch (\Exception $e) {
  123. $t->rollBack();
  124. return $e->getMessage();
  125. }
  126. }
  127. /**
  128. * 团长收货
  129. * @param int $mall_id
  130. * @param string $order_no
  131. * @param int $user_id
  132. * @return string|true
  133. */
  134. public function receive(int $mall_id, string $order_no, int $user_id)
  135. {
  136. $t = Yii::$app->db->beginTransaction();
  137. try {
  138. $order = Order::findOne(['order_no' => $order_no, 'mall_id' => $mall_id]);
  139. if ($order) {
  140. $order->order_status = OrderStatusEnum::SING;
  141. $order->sign_time = time();
  142. $res = $order->save();
  143. if (!$res) throw new \Exception($order->getErrorMessage());
  144. }
  145. $data = CommunityHeadOrder::getOne([
  146. ['user_id' => $user_id],
  147. ['mall_id' => $mall_id],
  148. ['order_id' => $order->id]
  149. ]);
  150. if (!$data) throw new \Exception('您没有核销权限');
  151. if ($data->order_status != OrderStatusEnum::SHIPMENTS) {
  152. throw new Exception('当前状态不可核销');
  153. }
  154. $data->order_status = OrderStatusEnum::TAKE_FINISH;
  155. if (!$data->save()) throw new \Exception('核销失败');
  156. $model = new CommunitySignLog();
  157. $model->mall_id = $mall_id;
  158. $model->user_id = $user_id;
  159. $model->order_id = $order->id;
  160. $model->head_id = $data->head_id;
  161. $model->buyer_user_id = $order->user_id;
  162. if (!$model->save()) throw new \Exception('核销失败!');
  163. $t->commit();
  164. // 执行事件
  165. $event = new OrderPickupEvent($mall_id);
  166. Yii::$app->services->events->dispatch($event, [
  167. 'mall_id' => $mall_id,
  168. 'id' => $order->id,
  169. ], $event->listeners);
  170. return true;
  171. } catch (\Exception $e) {
  172. $t->rollBack();
  173. return $e->getMessage();
  174. }
  175. }
  176. public function getSelfPickupOrderClerkData($params)
  177. {
  178. try {
  179. $select = 'id,mall_id,store_id,order_no,receiver_name,mobile,pay_money,shipping_money,original_goods_price,coupon_money,goods_price,order_status,pay_status,
  180. shipping_status,review_status,is_feedback,address,created_at,pay_time,region_name,remark,consign_time,finish_time,sign_time,shipping_type,payment_type,score,score_money,marketing_id,marketing_type,extra_info,order_source';
  181. $where = [];
  182. $clerk_code = $params['clerk_code'];
  183. $mall_id = $params['mall_id'];
  184. $platform = $params['platform'];
  185. $user_id = $params['user_id'];
  186. $where[] = ['clerk_code' => $clerk_code];
  187. $where[] = ['mall_id' => $mall_id];
  188. $where[] = ['status' => StatusEnum::ENABLED];
  189. $order = Order::getOne($where, true, ['detail' => function ($query) {
  190. $query->select('id,order_id,goods_id,goods_name,pic_url,num,price,is_feedback,sign_id,goods_attr_name,order_status,adjust_money,extra_info');
  191. }], false, $select);
  192. if (empty($order)) throw new Exception('该订单不存在');
  193. $data = CommunityHeadOrder::getOne([
  194. ['user_id' => $user_id],
  195. ['mall_id' => $mall_id],
  196. ['order_id' => $order['id']]
  197. ]);
  198. if (!$data) throw new \Exception('您没有核销权限');
  199. $marketing = OrderMarketing::getMarketingInfo($order);
  200. $order['order_status_text'] = OrderStatusEnum::getMap();
  201. $order['is_feedback_text'] = OrderStatusEnum::getFeedbackMap();
  202. $order['shipping_type_text'] = ShippingTypeEnum::getMap();
  203. $order['payment_type_text'] = PayTypeEnum::getMap();
  204. $order['pay_type_list'] = \Yii::$app->services->pay->getEnablePayment($mall_id, $platform);
  205. $adjust_money = array_sum(array_column($order['detail'], 'adjust_money'));//预留字段
  206. if ($adjust_money) {
  207. $order['change_price'] = $adjust_money;
  208. }
  209. $order['marketing'] = $marketing;
  210. $order['marketing_type_map'] = MarketingTypeEnum::getMap();
  211. $order_setting = Yii::$app->services->setting->mall->get($mall_id, 'order');
  212. $order['payment_expire_time'] = $order_setting['payment_expire_time'] ?? 30;
  213. $order['auto_receiving_time'] = $order_setting['auto_receiving_time'] ?? 14;
  214. // 获取订单详情的状态文字描述
  215. $order['status_text'] = OrderStatusEnum::getApiStatus($order['status'], $order['shipping_type']);
  216. $order['status'] == OrderStatusEnum::NOT_PAY && $order['status_text']['desc'] = $order['payment_expire_time'] . $order['status_text']['desc'];
  217. $order['status'] == OrderStatusEnum::SHIPMENTS && $order['status_text']['desc'] = $order['auto_receiving_time'] . $order['status_text']['desc'];
  218. // 公共调用
  219. // $order = GlobalInvoke::exec(GlobalInvoke::ORDER_DETAIL, $mall_id, [
  220. // 'order' => $order,
  221. // 'mall_id' => $mall_id,
  222. // ]) ?: $order;
  223. $order['clerk_code_pre'] = ClerkEnum::COMMUNITY_CLERK_CODE_PRE;
  224. return $order;
  225. } catch (Exception $e) {
  226. throw new Exception($e->getMessage());
  227. }
  228. }
  229. public function selfPickupOrderClerk($params)
  230. {
  231. $t = Yii::$app->db->beginTransaction();
  232. try {
  233. $clerk_code = $params['clerk_code'];
  234. $mall_id = $params['mall_id'];
  235. $user_id = $params['user_id'];
  236. $order = Order::findOne(['mall_id' => $mall_id, 'clerk_code' => $clerk_code, 'status' => StatusEnum::ENABLED]);
  237. if (empty($order)) throw new \Exception('自提订单不存在');
  238. $ret = $this->create($mall_id, $order['order_no'], $user_id);
  239. if (is_string($ret)) {
  240. throw new \Exception($ret);
  241. }
  242. $nums = OrderDetail::find()->where(['order_id' => $order['id']])->sum('num');
  243. $order_detail = OrderDetail::findOne(['order_id' => $order['id']]);
  244. $goods = Goods::findOne(['id' => $order_detail['goods_id']]);
  245. $community_head_order = CommunityHeadOrder::findOne(['order_id' => $order['id']]);
  246. $community_head = CommunityHead::findOne(['id' => $community_head_order['head_id']]);
  247. $add_clerk_log_data = [
  248. 'mall_id' => $params['mall_id'],
  249. 'user_id' => $user_id,
  250. 'mall_logo' => $community_head['logo'],
  251. 'mall_name' => $community_head['name'],
  252. 'name' => $order_detail['goods_name'],
  253. 'pic' => $order_detail['pic_url'],
  254. 'clerk_code' => (string)$params['clerk_code'],
  255. 'type' => ClerkEnum::COMMUNITY_CLERK_CODE_PRE,
  256. 'extra' => json_encode([
  257. 'pay_money' => $order['pay_money'],
  258. 'order_money' => $order['pay_money'],
  259. 'clerk_nums' => $nums ?? 0,
  260. 'subtitle' => $goods['subtitle'] ?? '',
  261. 'order_id' => $order['id'] ?? 0,
  262. ]),
  263. ];
  264. $clerk_log_model = ClerkLog::setData($add_clerk_log_data);
  265. if ($clerk_log_model == false) {
  266. throw new \Exception(ClerkLog::getStaticError());
  267. }
  268. $t->commit();
  269. return true;
  270. } catch (\Exception $e) {
  271. $t->rollBack();
  272. throw new Exception($e->getMessage());
  273. }
  274. }
  275. public function getClerkLogDetail($params){
  276. try {
  277. $clerk_log_model = ClerkLog::findOne(['id'=>$params['clerk_log_id'],'mall_id'=>$params['mall_id'],'user_id'=>$params['user_id'],'type'=>$params['type']]);
  278. $extra = json_decode($clerk_log_model['extra'],true);
  279. $order_id = $extra['order_id'];
  280. $select = 'id,mall_id,store_id,order_no,receiver_name,mobile,pay_money,shipping_money,original_goods_price,coupon_money,goods_price,order_status,pay_status,
  281. shipping_status,review_status,is_feedback,address,created_at,pay_time,region_name,remark,consign_time,finish_time,sign_time,shipping_type,payment_type,score,score_money,marketing_id,marketing_type,extra_info,order_source,clerk_code';
  282. $where = [];
  283. $mall_id = $params['mall_id'];
  284. $platform = $params['platform'];
  285. $where[] = ['id' => $order_id];
  286. $where[] = ['mall_id' => $mall_id];
  287. $where[] = ['status' => StatusEnum::ENABLED];
  288. $order = Order::getOne($where, true, ['detail' => function ($query) {
  289. $query->select('id,order_id,goods_id,goods_name,pic_url,num,price,is_feedback,sign_id,goods_attr_name,order_status,adjust_money,extra_info');
  290. }], false, $select);
  291. if (empty($order)) {
  292. throw new Exception('该订单不存在');
  293. }
  294. $store_id = $order['store_id'];
  295. $marketing = OrderMarketing::getMarketingInfo($order);
  296. $order['order_status_text'] = OrderStatusEnum::getMap();
  297. $order['is_feedback_text'] = OrderStatusEnum::getFeedbackMap();
  298. $order['shipping_type_text'] = ShippingTypeEnum::getMap();
  299. $order['payment_type_text'] = PayTypeEnum::getMap();
  300. $order['pay_type_list'] = \Yii::$app->services->pay->getEnablePayment($mall_id, $platform);
  301. $adjust_money = array_sum(array_column($order['detail'], 'adjust_money'));//预留字段
  302. if ($adjust_money) {
  303. $order['change_price'] = $adjust_money;
  304. }
  305. $order['marketing'] = $marketing;
  306. $order['marketing_type_map'] = MarketingTypeEnum::getMap();
  307. $order_setting = Yii::$app->services->setting->mall->get($mall_id, 'order');
  308. $order['payment_expire_time'] = $order_setting['payment_expire_time'] ?? 30;
  309. $order['auto_receiving_time'] = $order_setting['auto_receiving_time'] ?? 14;
  310. // 获取订单详情的状态文字描述
  311. $order['status_text'] = OrderStatusEnum::getApiStatus($order['status'], $order['shipping_type']);
  312. $order['status'] == OrderStatusEnum::NOT_PAY && $order['status_text']['desc'] = $order['payment_expire_time'] . $order['status_text']['desc'];
  313. $order['status'] == OrderStatusEnum::SHIPMENTS && $order['status_text']['desc'] = $order['auto_receiving_time'] . $order['status_text']['desc'];
  314. // // 公共调用
  315. // $order = GlobalInvoke::exec(GlobalInvoke::ORDER_DETAIL, $mall_id, [
  316. // 'order' => $order,
  317. // 'mall_id' => $mall_id,
  318. // ]) ?: $order;
  319. $order['clerk_code_pre'] = ClerkEnum::COMMUNITY_CLERK_CODE_PRE;
  320. return $order;
  321. }catch (Exception $e){
  322. throw new Exception($e->getMessage());
  323. }
  324. }
  325. }