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(StoreOrder::class, ['order_no' => 'order_no']); } public function getStoreClerk() { return $this->hasOne(StoreClerk::class, ['id' => 'clerk_id']); } public static function setData(array $params) { $clerk_code = (string)$params['clerk_code']; $clerk_code_pre = $clerk_code[0] . $clerk_code[1]; if(strpos($params['clerk_code'],'PSC') !== false||$clerk_code_pre==ClerkEnum::PLATFORM_ORDER_BY_O2O_STORE_CLERK_CODE_PRE) { //平台订单通过门店核销员核销 return self::clerkPlatformStoreOrderDetail($params); } if(strpos($params['clerk_code'],'HXQ') !== false||$clerk_code_pre==ClerkEnum::O2O_STORE_CLERK_COUPON_CODE_PRE) { //门店核销券通过门店核销员核销 return self::clerkStoreVerification($params); } $t = Yii::$app->db->beginTransaction(); try { $order = Order::findOne(['clerk_code'=> $params['clerk_code']]); if($order){ $order->order_status = OrderStatusEnum::TAKE_FINISH; $order->sign_time = time(); $res = $order->save(); if($res==false) throw new \Exception($order->getErrorMessage()); } $store_order = StoreOrder::getOne([['order_no' => $order['order_no']], ['mall_id' => $params['mall_id']], ['store_id' => $order['store_id']]]); if (empty($store_order)) throw new \Exception('订单不存在'); if ($store_order->order_status != OrderStatusEnum::TAKE) throw new \Exception('该订单不是待自提'); if ($store_order->order_status == OrderStatusEnum::TAKE_FINISH) throw new \Exception('已自提'); if ($store_order->shipping_type != ShippingTypeEnum::PICKUP) throw new \Exception('该订单不是自提订单'); $params['order_no'] = $store_order['order_no']; $params['user_id'] = $store_order['user_id']; $params['mobile'] = $store_order['mobile']; $model = new self(); $model->loadDefaultValues(); if (!$model->load($params, '')) throw new \Exception($model->getErrorMessage()); if (!$model->save()) throw new \Exception($model->getErrorMessage()); $store_order->order_status = OrderStatusEnum::TAKE_FINISH; $store_order->sign_time = time(); $store_order->save(); // 维护累计核销金额及累计核销订单数 $storeClerkFind = StoreClerk::find(); StoreClerk::paramPack([ 'where' => [['mall_id' => $params['mall_id']], ['user_id' => $params['user_id']], ['store_id' => $order['store_id']], ['status' => StatusEnum::ENABLED]], 'select' => 'id' ], $storeClerkFind); if ($storeClerkId = $storeClerkFind->scalar()) { $nums = OrderDetail::find()->where(['order_id'=>$order['id']])->sum('num'); StoreClerk::incrNumsAndTotalMoney($storeClerkId, $nums, $store_order['pay_money']); } $t->commit(); // 微信小程序发货 $event = new StoreSelfPickupOrderClerkEvent($params['mall_id']); $data['id'] = $order['id']; Yii::$app->services->events->dispatch($event, $data, $event->listeners); return $model; } catch (\Exception $e) { $t->rollBack(); 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 = StoreClerk::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 = Store::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 = Store::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 = StoreClerk::find(); StoreClerk::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]); StoreClerk::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'; $where = []; $where[] = ['mall_id' => $params['mall_id']]; $where[] = ['id' => $params['order_id']]; $order = Order::getOne($where, true, ['detail' => function ($query) use($order_detail_id) { $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,goods_price')->where(['id' => $order_detail_id]); }], false, $select); if (empty($order) || $order['store_id'] > 0) { throw new \Exception('该订单不存在'); } $rse = StoreClerk::getOne([['mall_id' => $params['mall_id']], ['user_id' => $params['user_id']], ['status' => StatusEnum::ENABLED]],true); if (empty($rse)){ throw new \Exception('你不是核销员'); } $goods_setting = PlatformStoreClerkGoodsSetting::getGoodsInfo($params['mall_id'],$params['goods_id']); if(!$goods_setting ) { throw new \Exception('商品尚未关联该门店'); } $clerk_list = StoreClerk::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); $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 = Store::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['show_clerk_button'] = $order['order_status'] == OrderStatusEnum::TAKE ? 1:0; $order['clerk_code'] = $params['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; } } public static function updateOldData(){ try { $i = 1; $page_size = 100; while (true) { $list = self::find()->where(['>', 'status', 0]) ->offset(($i - 1) * $page_size)->limit($page_size)->all(); if (empty($list)) { break; } $order_nos = array_column($list,'order_no'); $clerk_ids = array_column($list,'clerk_id'); $store_ids = array_column($list,'store_id'); $store_clerk_list = StoreClerk::lists(['where'=>[['id'=>$clerk_ids]],'index'=>'id']); $store_list = Store::lists(['where'=>[['id'=>$store_ids]],'index'=>'id']); $order_list = Order::lists(['where'=>[['order_no'=>$order_nos]],'index'=>'order_no'],false); foreach ($list as $item){ if(empty($order_list[$item['order_no']])||empty($store_clerk_list[$item['clerk_id']])||empty($store_list[$item['store_id']])) { continue; } $order = $order_list[$item['order_no']]; if(\common\models\common\ClerkLog::findOne(['clerk_code'=>$order['clerk_code'],'type' => ClerkEnum::O2O_SELF_PICKUP_ORDERS_CLERK_CODE_PRE])) { continue; } $clerk_code = StoreOrder::getClerkCode($item['mall_id']); $store_clerk = $store_clerk_list[$item['clerk_id']]; $store = $store_list[$item['store_id']]; $order_detail = OrderDetail::find()->where(['order_id'=>$order['id']])->orderBy('id asc')->one(); $nums = OrderDetail::find()->where(['order_id'=>$order['id']])->sum('num'); $store_goods = StoreGoods::find()->where(['id'=>$order_detail['goods_id']])->one(); StoreOrder::updateAll(['clerk_code'=>$clerk_code],['order_no'=>$item['order_no']]); $order->clerk_code = $clerk_code; $order->save(); $add_clerk_log_data = [ 'mall_id' => $order['mall_id'], 'user_id' => $store_clerk['user_id'], 'mall_logo' => $store['logo_img'], 'mall_name' => $store['store_name'], 'name' => $order_detail['goods_name'], 'pic' => $order_detail['pic_url'], 'clerk_code' => $clerk_code, 'type' => ClerkEnum::O2O_SELF_PICKUP_ORDERS_CLERK_CODE_PRE, 'extra' => json_encode([ 'pay_money' => $order['pay_money'], 'order_money' => $order['pay_money'], 'clerk_nums' => $nums??0, 'subtitle' => $store_goods['subtitle']??'', 'order_id' => $order['id'] ?? 0, ]), ]; $clerk_log_model = \common\models\common\ClerkLog::setData($add_clerk_log_data); var_dump($item['order_no']); } $i++; } }catch (\Exception $e){ var_dump($e->getMessage().$e->getFile().$e->getLine()); } } }