| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432 |
- <?php
- namespace addons\Happiness\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\events\order\OrderFinishEvent;
- use common\helpers\LockHelper;
- use Exception;
- 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 HappinessClerkLog extends BaseActiveRecord
- {
- /**
- * {@inheritdoc}
- */
- public static function tableName()
- {
- return '{{%addons_happiness_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(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;
- }
- }
- }
|