11], [['order_no'], 'string', 'max' => 100], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => 'ID', 'mall_id' => 'Mall ID', 'store_id' => '门店id', 'user_id' => '会员id', 'clerk_id' => '核销员id', 'mobile' => '电话', 'order_no' => '订单编号', 'status' => '状态[0禁用 1启用 -1删除]', 'created_at' => '创建时间', 'updated_at' => '修改时间', ]; } public function getUser() { return $this->hasOne(User::class, ['id' => 'user_id']); } public function getOrder() { return $this->hasOne(Order::class, ['order_no' => 'order_no']); } public function getDetail() { return $this->hasMany(OrderDetail::class, ['order_id' => 'id'])->via('order')->asArray(); } public function getStoreClerk() { return $this->hasOne(HappinessClerk::class, ['id' => 'clerk_id']); } public function getClerkUser() { return $this->hasOne(User::class, ['id' => 'user_id'])->via('storeClerk'); } public function getStore() { return $this->hasOne(HappinessStore::class, ['id' => 'store_id']); } public static function setData(array $params) { $clerk_code = (string)$params['clerk_code']; $clerk_code_pre = $clerk_code[0] . $clerk_code[1]; $t = Yii::$app->db->beginTransaction(); try { $order = Order::findOne(['clerk_code'=> $params['clerk_code']]); $order_no=$order['order_no']; $store_order = HappinessOrder::getOne([['order_no' => $order['order_no']], ['mall_id' => $params['mall_id']], ['store_id' => $params['store_id']]]); if (empty($store_order)) throw new \Exception('订单不存在'); if ($order->order_status != OrderStatusEnum::TAKE) throw new \Exception('该订单不是待自提'); if ($order->order_status == OrderStatusEnum::ACCOMPLISH) throw new \Exception('已自提'); if ($order->shipping_type != ShippingTypeEnum::PICKUP) throw new \Exception('该订单不是自提订单'); //获取订单详情 $detail = OrderDetail::lists([ 'where' => [ ['mall_id' => $params['mall_id']], ['order_id' => $order['id']], ], ]); if (empty($detail)) throw new Exception('订单不存在'); foreach ($detail as $key => $value) { if ($value['is_feedback'] == 1) throw new Exception('存在售后中商品,无法完成订单'); } if($order){ $order->order_status = OrderStatusEnum::ACCOMPLISH; $order->consign_time = time(); $order->sign_time = time(); $order->finish_time = time(); $res = $order->save(); if($res==false) throw new \Exception($order->getErrorMessage()); } // 维护累计核销金额及累计核销订单数 $params['order_no'] = $order['order_no']; $params['user_id'] = $order['user_id']; $params['mobile'] = $order['mobile']; $happiness_clerk = HappinessClerk::getOne([ ['mall_id' => $params['mall_id']], ['id' => $params['clerk_id']], ['store_id' => $params['store_id']], ['status' => StatusEnum::ENABLED] ]); if (!empty($happiness_clerk)) { $nums = OrderDetail::find()->where(['order_id'=>$order['id']])->sum('num'); $happiness_clerk->nums += $nums; $happiness_clerk->total_money += $order['pay_money']; $happiness_clerk->save(); } //记录核销日志 $model = new self(); $model->loadDefaultValues(); if (!$model->load($params, '')) throw new \Exception($model->getErrorMessage()); if (!$model->save()) throw new \Exception($model->getErrorMessage()); $t->commit(); // 触发订单过售后事件,事务提交完成后触发 $event = new OrderFinishEvent($params['mall_id']); $order_data['id'] = $order['id']; $order_data['order_no'] = $order['order_no']; $order_data['operator_id'] = $params['operator_id'] ?? 0; $order_data['operator_name'] = $params['operator_name'] ?? '系统'; Yii::$app->services->events->dispatch($event, $order_data, $event->listeners); return $model; } catch (\Exception $e) { $t->rollBack(); // var_dump($e->getMessage()); self::$static_error = $e->getMessage(); return false; } } public static function clerkPlatformStoreOrderDetail($params) { try { $mall_id = $params['mall_id']; if (!MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_PLATFORM_STORE_CLERK)) { throw new \Exception('请安装门店核销员插件'); } $clerk_detail = PlatformStoreClerkOrderDetail::getOrderByCode($mall_id, $params['clerk_code'],false); if (!$clerk_detail) throw new \Exception('该订单不存在'); if ($clerk_detail->clerk_status !== 0) throw new \Exception('该订单已核销'); // $rse = StoreClerk::getOne([['mall_id' => $mall_id], ['user_id' => $params['user_id']], ['status' => StatusEnum::ENABLED]],true); $clerk_list = HappinessClerk::find()->where(['mall_id' => $mall_id,'user_id' => $params['user_id'],'status' => StatusEnum::ENABLED])->asArray()->all(); if(!$clerk_list) throw new \Exception('你不是核销员'); $clerk_store = array_column($clerk_list,null,'store_id'); $clerk_store_ids = array_keys($clerk_store); //$store_id = $rse['store_id']; $goods_setting = PlatformStoreClerkGoodsSetting::getGoodsInfo($mall_id,$clerk_detail->goods_id); if(!$goods_setting) throw new \Exception('商品尚未关联该门店'); $cate_id = $goods_setting['cate_id']; $is_bind_store = $goods_setting['is_bind_store'] ?? 0; $where = ['id' => $clerk_store_ids,'status' => StatusEnum::ENABLED]; if($is_bind_store > 0 && $cate_id){ $where['c_id'] = $cate_id; } $store_list = HappinessStore::find()->where($where)->select('id')->asArray()->all(); if(!$store_list) throw new \Exception('商品尚未关联该门店'); $store_id = $store_list[0]['id']; $clerk_user_id = $clerk_store[$store_id]['user_id']; //$store_ids = explode(',',$goods_setting['store_ids']); // $rse = StoreClerk::getOne([['mall_id' => $mall_id], ['user_id' => $params['user_id']], ['status' => StatusEnum::ENABLED],['store_id' => $store_ids]],true); // // if (empty($rse)) throw new \Exception('你不是核销员'); // $store_id = $rse['store_id']; // // if(!in_array($store_id,$store_ids)) throw new \Exception('商品尚未关联该门店'); //$order = Order::findOne(['id' => $clerk_detail->order_id]); //$order_detail = OrderDetail::findOne(['id' => $clerk_detail->order_detail_id]); //核销操作 $clerk_detail->clerk_status = 1; $clerk_detail->clerk_time = time(); $clerk_detail->clerk_store_id = $store_id; $clerk_detail->clerk_user_id = $clerk_user_id; $clerk_detail->save(); if($clerk_detail->reward_num > 0){ \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_ORDER, RabbitMqEnum::ORDER_QUEUE, ['clerk_detail_id' => $clerk_detail->id,'store_id' => $store_id], PlatformStoreClerkOrderDetail::class, 'sendStoreReward'); //发放核销奖励 // $insert_wallet[] = [ // 'mall_id' => $mall_id, // 'user_id' => $rse['user_id'], // 'is_frozen' => false, // 'wallet_type' => 'commission', // 'money' => $clerk_detail->reward_num, // 'desc' => '核销奖励', // 'source_table' => PlatformStoreClerkOrderDetail::tableName(), // 'source_table_id' => $clerk_detail->id, // 'from_type' => AddonsEnum::ADDONS_NAME_PLATFORM_STORE_CLERK, // 'capital_type' => 'store_clerk_order', // 'order_no' => $order['order_no'], // 'contributor_name' => $order_detail['goods_name'] // ]; //$res = UserWalletService::batchHandleByQueue($insert_wallet); //if (empty($res)) throw new \Exception(UserWalletService::getStaticError()); } $goods = Goods::findOne(['id'=>$clerk_detail->goods_id]); $store = HappinessStore::getOne([['id' => $store_id]], true, [], false, 'id,user_id,balance,logo_img,store_name'); $order_detail = OrderDetail::findOne(['id'=>$clerk_detail['order_detail_id']]); $add_clerk_log_data = [ 'mall_id' => $params['mall_id'], 'user_id' => $params['user_id'], 'mall_logo' => $store['logo_img']??'', 'mall_name' => $store['store_name']??'', 'name' => $goods['goods_name'], 'pic' => $order_detail['pic_url'], 'clerk_code' => (string)$params['clerk_code'], 'type' => ClerkEnum::PLATFORM_ORDER_BY_O2O_STORE_CLERK_CODE_PRE, 'extra' => json_encode([ 'pay_money' => $order_detail['goods_price'], 'order_money' => $order_detail['goods_price'], 'clerk_nums' => $order_detail['num']??0, 'subtitle' => $goods['subtitle']??'', 'platform_store_clerk_order_detail_id' => $clerk_detail['id'], ]), ]; $clerk_log_model = \common\models\common\ClerkLog::setData($add_clerk_log_data); if ($clerk_log_model == false) { throw new \Exception(\common\models\common\ClerkLog::getStaticError()); } // 维护累计核销金额及累计核销订单数 $storeClerkFind = HappinessClerk::find(); HappinessClerk::paramPack([ 'where' => [['mall_id' => $params['mall_id']], ['user_id' => $clerk_user_id], ['store_id' => $store_id], ['status' => StatusEnum::ENABLED]], 'select' => 'id' ], $storeClerkFind); if ($storeClerkId = $storeClerkFind->scalar()) { $nums = OrderDetail::find()->where(['order_id'=>$clerk_detail->order_id])->sum('num'); $order = Order::findOne(['id' => $clerk_detail->order_id]); HappinessClerk::incrNumsAndTotalMoney($storeClerkId, $nums, $order['pay_money'] ?? 0); } $event = new StoreSelfPickupOrderClerkEvent($params['mall_id']); $data['id'] = $clerk_detail['order_id']; Yii::$app->services->events->dispatch($event, $data, $event->listeners); return true; } catch (\Exception $e) { self::$static_error = $e->getMessage(); Yii::error('clerkPlatformStoreOrderDetail error:'.$e->getMessage().' File:'.$e->getFile().' Line:'.$e->getLine(), 'addons\Store\common\models\StoreClerkLog'); return false; } } public static function getPlatformStoreOrderDetail($params) { // $order_detail_id = $params['order_detail_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 = []; $where[] = ['mall_id' => $params['mall_id']]; $where[] = ['order_no' => $params['order_no']]; $order = Order::getOne($where, true, ['detail'], false, $select); if (empty($order) ) { throw new \Exception('该订单不存在'); } $rse = HappinessClerk::getOne([['mall_id' => $params['mall_id']], ['user_id' => $params['user_id']], ['status' => StatusEnum::ENABLED]],true); if (empty($rse)){ throw new \Exception('你不是核销员'); } $clerk_list = HappinessClerk::find()->where(['mall_id' => $params['mall_id'],'user_id' => $params['user_id'],'status' => StatusEnum::ENABLED])->asArray()->all(); if(!$clerk_list){ throw new \Exception('你不是核销员'); } $clerk_store = array_column($clerk_list,null,'store_id'); $clerk_store_ids = array_keys($clerk_store); $where = ['id' => $clerk_store_ids,'status' => StatusEnum::ENABLED]; $store_list = HappinessStore::find()->where($where)->select('id')->asArray()->all(); if(!$store_list) { throw new \Exception('商品尚未关联该门店'); } $store_id = $store_list[0]['id']; $clerk_user_id = $clerk_store[$store_id]['user_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($params['mall_id'],$params['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($params['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, $params['mall_id'], [ 'order' => $order, 'mall_id' => $params['mall_id'], ]) ?: $order; $order['store_name'] = $order['happiness_store']['store_name']; $order['show_clerk_button'] = $order['order_status'] == OrderStatusEnum::TAKE ? 1:0; // $order['clerk_code'] = $order['clerk_code']; // $order['pay_money'] = $order['detail'][0]['goods_price']; return $order; } public static function clerkStoreVerification($params){ try { $key = sprintf('StoreVerification:%s', $params['clerk_code']); if (LockHelper::fLock($key)) throw new \Exception('请勿频繁请求'); StoreVerificationCouponsClerkLog::clerkStoreVerificationByClerkCode($params); LockHelper::unFLock($key); return true; } catch (\Exception $e) { LockHelper::unFLock($key); self::$static_error = $e->getMessage(); return false; } } public static function clerkStoreVerificationByClerkCode($params){ $key = sprintf('StoreVerification:%s', $params['mall_id'].$params['clerk_code']); try { if (LockHelper::fLock($key)) throw new \Exception('请勿频繁请求'); StoreVerificationCouponsClerkLog::clerkStoreVerificationByClerkCode($params); LockHelper::unFLock($key); return true; } catch (\Exception $e) { LockHelper::unFLock($key); self::$static_error = $e->getMessage(); return false; } } }