| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475 |
- <?php
- namespace addons\Store\common\models;
- use addons\Clerk\common\models\ClerkLog;
- use addons\PlatformStoreClerk\common\models\PlatformStoreClerkGoodsSetting;
- use addons\PlatformStoreClerk\common\models\PlatformStoreClerkOrderDetail;
- use addons\Starfish\common\enums\StarfishEnum;
- use addons\Store\common\events\order\StoreSelfPickupOrderClerkEvent;
- use common\enums\AddonsEnum;
- use common\enums\ClerkEnum;
- use common\enums\MarketingTypeEnum;
- use common\enums\OrderStatusEnum;
- use common\enums\PayTypeEnum;
- use common\enums\RabbitMqEnum;
- use common\enums\ShippingStatusEnum;
- use common\enums\ShippingTypeEnum;
- use common\enums\StatusEnum;
- use common\globals\GlobalInvoke;
- use common\models\base\BaseActiveRecord;
- use common\models\goods\Goods;
- use common\models\mall\Mall;
- use common\models\mall\MallAddons;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use common\models\order\OrderMarketing;
- use common\models\user\User;
- use services\common\UserWalletService;
- use addons\Store\addons\Verification\common\models\StoreVerificationCouponsClerkLog;
- use common\helpers\LockHelper;
- use Yii;
- /**
- * This is the model class for table "qimall_addons_store_clerk_log".
- *
- * @property int $id
- * @property int $mall_id
- * @property int $store_id 门店id
- * @property int $user_id 会员id
- * @property int $clerk_id 核销员id
- * @property string $mobile 电话
- * @property string $order_no 订单编号
- * @property int $status 状态[0禁用 1启用 -1删除]
- * @property int $created_at 创建时间
- * @property int $updated_at 修改时间
- */
- class StoreClerkLog extends BaseActiveRecord
- {
- /**
- * {@inheritdoc}
- */
- public static function tableName()
- {
- return '{{%addons_store_clerk_log}}';
- }
- /**
- * {@inheritdoc}
- */
- public function rules()
- {
- return [
- [['mall_id', 'store_id', 'user_id', 'clerk_id', 'status', 'created_at', 'updated_at'], 'integer'],
- [['mobile'], 'string', 'max' => 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());
- }
- }
- }
|