db->beginTransaction(); try { $clerk_code_pre = $order_no[0] . $order_no[1]; if($clerk_code_pre==ClerkEnum::COMMUNITY_CLERK_CODE_PRE){ $order = Order::findOne(['clerk_code' => $order_no, 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED]); }else{ $order = Order::findOne([$key => $order_no, 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED]); } if (!empty($order)) { $order_status = $order->order_status; $order->order_status = OrderStatusEnum::SING; $order->sign_time = time(); $res = $order->save(); if (!$res) throw new \Exception($order->getErrorMessage()); } else { throw new \Exception("订单不存在1"); } /** * @var $data CommunityHeadOrder */ $data = CommunityHeadOrder::getOne([ ['user_id' => $user_id], ['mall_id' => $mall_id], ['order_id' => $order->id] ]); if (!$data) throw new \Exception('您没有核销权限'); // 什么情况下订单可以进行核销 $config = Yii::$app->services->setting->addons->get($mall_id, CommunityEnum::ADDONS_NAME, 'basic'); $is_enable_write_off = !empty($config['is_enable_write_off']) ? StatusEnum::ENABLED : StatusEnum::DISABLED; // 是否有开启核销 if (!empty($is_enable_write_off)) { // 如果有开启 if ($order->shipping_type == ShippingTypeEnum::PICKUP) { // 自提订单 $sing_status = [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS]; } else { // 如果是送货上门的,那么团长不能帮忙签收及核销 throw new \Exception("您没有核销权限"); } } else { // 如果没有开启,那么走原有的逻辑 $sing_status = [OrderStatusEnum::SHIPMENTS]; } if (!in_array($order_status, $sing_status)) { throw new Exception('当前状态不可核销'); } // 先处理发货 if ($order_status == OrderStatusEnum::PAY) { // 执行发货操作 // $form['mall_id'] = $mall_id; // $form['mch_id'] = 0; // $form['shipping_type'] = 0; // $form['id'] = $order->id; // $form['operator_id'] = $user_id; // $form['order_detail_ids'] = OrderDetail::find()->where(['order_id' => $order->id])->select('id')->column(); // $form['operator_name'] = $data->head->name ?? ''; // OrderExpress::delivery($form); // 发货 /** * liuzhantao的注释: * 上面这个代码本来就注释的,不是我写的 * 我要说明的是下列这个代码:需要支付类型是“微信支付”,才能执行成功,如果我是余额支付,那就执行失败,并返回错误,因此这样是不对的 * 所以我增加了判断,订单类型是“微信支付”,才执行该代码 */ if($order->payment_type == 1){ \common\listeners\order\OrderFinishListener::uploadShippingInfo($order, 4); } } $data->order_status = OrderStatusEnum::SING; if (!$data->save()) throw new \Exception('核销失败'); $model = new CommunitySignLog(); $model->mall_id = $mall_id; $model->user_id = $user_id; $model->order_id = $order->id; $model->head_id = $data->head_id; $model->buyer_user_id = $order->user_id; if (!$model->save()) throw new \Exception('核销失败!'); $t->commit(); // 通过确认收货事件触发分佣 $event = new OrderTakeDeliveryEvent($mall_id); $eData['id'] = $order->id; $eData['operator_id'] = $user_id; $eData['operator_name'] = $data->head->name ?? ''; Yii::$app->services->events->dispatch($event, $eData, $event->listeners); // 执行事件 // $event = new OrderPickupEvent($mall_id); // Yii::$app->services->events->dispatch($event,[ // 'mall_id' => $mall_id, // 'id' => $order->id, // ], $event->listeners); return true; } catch (\Exception $e) { $t->rollBack(); return $e->getMessage(); } } /** * 团长收货 * @param int $mall_id * @param string $order_no * @param int $user_id * @return string|true */ public function receive(int $mall_id, string $order_no, int $user_id) { $t = Yii::$app->db->beginTransaction(); try { $order = Order::findOne(['order_no' => $order_no, 'mall_id' => $mall_id]); if ($order) { $order->order_status = OrderStatusEnum::SING; $order->sign_time = time(); $res = $order->save(); if (!$res) throw new \Exception($order->getErrorMessage()); } $data = CommunityHeadOrder::getOne([ ['user_id' => $user_id], ['mall_id' => $mall_id], ['order_id' => $order->id] ]); if (!$data) throw new \Exception('您没有核销权限'); if ($data->order_status != OrderStatusEnum::SHIPMENTS) { throw new Exception('当前状态不可核销'); } $data->order_status = OrderStatusEnum::TAKE_FINISH; if (!$data->save()) throw new \Exception('核销失败'); $model = new CommunitySignLog(); $model->mall_id = $mall_id; $model->user_id = $user_id; $model->order_id = $order->id; $model->head_id = $data->head_id; $model->buyer_user_id = $order->user_id; if (!$model->save()) throw new \Exception('核销失败!'); $t->commit(); // 执行事件 $event = new OrderPickupEvent($mall_id); Yii::$app->services->events->dispatch($event, [ 'mall_id' => $mall_id, 'id' => $order->id, ], $event->listeners); return true; } catch (\Exception $e) { $t->rollBack(); return $e->getMessage(); } } public function getSelfPickupOrderClerkData($params) { try { $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, 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'; $where = []; $clerk_code = $params['clerk_code']; $mall_id = $params['mall_id']; $platform = $params['platform']; $user_id = $params['user_id']; $where[] = ['clerk_code' => $clerk_code]; $where[] = ['mall_id' => $mall_id]; $where[] = ['status' => StatusEnum::ENABLED]; $order = Order::getOne($where, true, ['detail' => function ($query) { $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'); }], false, $select); if (empty($order)) throw new Exception('该订单不存在'); $data = CommunityHeadOrder::getOne([ ['user_id' => $user_id], ['mall_id' => $mall_id], ['order_id' => $order['id']] ]); if (!$data) throw new \Exception('您没有核销权限'); $marketing = OrderMarketing::getMarketingInfo($order); $order['order_status_text'] = OrderStatusEnum::getMap(); $order['is_feedback_text'] = OrderStatusEnum::getFeedbackMap(); $order['shipping_type_text'] = ShippingTypeEnum::getMap(); $order['payment_type_text'] = PayTypeEnum::getMap(); $order['pay_type_list'] = \Yii::$app->services->pay->getEnablePayment($mall_id, $platform); $adjust_money = array_sum(array_column($order['detail'], 'adjust_money'));//预留字段 if ($adjust_money) { $order['change_price'] = $adjust_money; } $order['marketing'] = $marketing; $order['marketing_type_map'] = MarketingTypeEnum::getMap(); $order_setting = Yii::$app->services->setting->mall->get($mall_id, 'order'); $order['payment_expire_time'] = $order_setting['payment_expire_time'] ?? 30; $order['auto_receiving_time'] = $order_setting['auto_receiving_time'] ?? 14; // 获取订单详情的状态文字描述 $order['status_text'] = OrderStatusEnum::getApiStatus($order['status'], $order['shipping_type']); $order['status'] == OrderStatusEnum::NOT_PAY && $order['status_text']['desc'] = $order['payment_expire_time'] . $order['status_text']['desc']; $order['status'] == OrderStatusEnum::SHIPMENTS && $order['status_text']['desc'] = $order['auto_receiving_time'] . $order['status_text']['desc']; // 公共调用 // $order = GlobalInvoke::exec(GlobalInvoke::ORDER_DETAIL, $mall_id, [ // 'order' => $order, // 'mall_id' => $mall_id, // ]) ?: $order; $order['clerk_code_pre'] = ClerkEnum::COMMUNITY_CLERK_CODE_PRE; return $order; } catch (Exception $e) { throw new Exception($e->getMessage()); } } public function selfPickupOrderClerk($params) { $t = Yii::$app->db->beginTransaction(); try { $clerk_code = $params['clerk_code']; $mall_id = $params['mall_id']; $user_id = $params['user_id']; $order = Order::findOne(['mall_id' => $mall_id, 'clerk_code' => $clerk_code, 'status' => StatusEnum::ENABLED]); if (empty($order)) throw new \Exception('自提订单不存在'); $ret = $this->create($mall_id, $order['order_no'], $user_id); if (is_string($ret)) { throw new \Exception($ret); } $nums = OrderDetail::find()->where(['order_id' => $order['id']])->sum('num'); $order_detail = OrderDetail::findOne(['order_id' => $order['id']]); $goods = Goods::findOne(['id' => $order_detail['goods_id']]); $community_head_order = CommunityHeadOrder::findOne(['order_id' => $order['id']]); $community_head = CommunityHead::findOne(['id' => $community_head_order['head_id']]); $add_clerk_log_data = [ 'mall_id' => $params['mall_id'], 'user_id' => $user_id, 'mall_logo' => $community_head['logo'], 'mall_name' => $community_head['name'], 'name' => $order_detail['goods_name'], 'pic' => $order_detail['pic_url'], 'clerk_code' => (string)$params['clerk_code'], 'type' => ClerkEnum::COMMUNITY_CLERK_CODE_PRE, 'extra' => json_encode([ 'pay_money' => $order['pay_money'], 'order_money' => $order['pay_money'], 'clerk_nums' => $nums ?? 0, 'subtitle' => $goods['subtitle'] ?? '', 'order_id' => $order['id'] ?? 0, ]), ]; $clerk_log_model = ClerkLog::setData($add_clerk_log_data); if ($clerk_log_model == false) { throw new \Exception(ClerkLog::getStaticError()); } $t->commit(); return true; } catch (\Exception $e) { $t->rollBack(); throw new Exception($e->getMessage()); } } public function getClerkLogDetail($params){ try { $clerk_log_model = ClerkLog::findOne(['id'=>$params['clerk_log_id'],'mall_id'=>$params['mall_id'],'user_id'=>$params['user_id'],'type'=>$params['type']]); $extra = json_decode($clerk_log_model['extra'],true); $order_id = $extra['order_id']; $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, 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'; $where = []; $mall_id = $params['mall_id']; $platform = $params['platform']; $where[] = ['id' => $order_id]; $where[] = ['mall_id' => $mall_id]; $where[] = ['status' => StatusEnum::ENABLED]; $order = Order::getOne($where, true, ['detail' => function ($query) { $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'); }], false, $select); if (empty($order)) { throw new Exception('该订单不存在'); } $store_id = $order['store_id']; $marketing = OrderMarketing::getMarketingInfo($order); $order['order_status_text'] = OrderStatusEnum::getMap(); $order['is_feedback_text'] = OrderStatusEnum::getFeedbackMap(); $order['shipping_type_text'] = ShippingTypeEnum::getMap(); $order['payment_type_text'] = PayTypeEnum::getMap(); $order['pay_type_list'] = \Yii::$app->services->pay->getEnablePayment($mall_id, $platform); $adjust_money = array_sum(array_column($order['detail'], 'adjust_money'));//预留字段 if ($adjust_money) { $order['change_price'] = $adjust_money; } $order['marketing'] = $marketing; $order['marketing_type_map'] = MarketingTypeEnum::getMap(); $order_setting = Yii::$app->services->setting->mall->get($mall_id, 'order'); $order['payment_expire_time'] = $order_setting['payment_expire_time'] ?? 30; $order['auto_receiving_time'] = $order_setting['auto_receiving_time'] ?? 14; // 获取订单详情的状态文字描述 $order['status_text'] = OrderStatusEnum::getApiStatus($order['status'], $order['shipping_type']); $order['status'] == OrderStatusEnum::NOT_PAY && $order['status_text']['desc'] = $order['payment_expire_time'] . $order['status_text']['desc']; $order['status'] == OrderStatusEnum::SHIPMENTS && $order['status_text']['desc'] = $order['auto_receiving_time'] . $order['status_text']['desc']; // // 公共调用 // $order = GlobalInvoke::exec(GlobalInvoke::ORDER_DETAIL, $mall_id, [ // 'order' => $order, // 'mall_id' => $mall_id, // ]) ?: $order; $order['clerk_code_pre'] = ClerkEnum::COMMUNITY_CLERK_CODE_PRE; return $order; }catch (Exception $e){ throw new Exception($e->getMessage()); } } }