| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- <?php
- namespace addons\Community\common\service;
- use addons\Community\common\enums\CommunityEnum;
- use addons\Community\common\events\OrderPickupEvent;
- use addons\Community\common\models\CommunityHead;
- use addons\Community\common\models\CommunityHeadOrder;
- use addons\Community\common\models\CommunitySignLog;
- use common\enums\ClerkEnum;
- use common\enums\MarketingTypeEnum;
- use addons\Store\common\models\StoreClerk;
- use common\enums\OrderStatusEnum;
- use common\enums\PayTypeEnum;
- use common\enums\ShippingTypeEnum;
- use common\enums\StatusEnum;
- use common\events\order\OrderTakeDeliveryEvent;
- use common\globals\GlobalInvoke;
- use common\models\common\ClerkLog;
- use common\models\goods\Goods;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use common\models\order\OrderMarketing;
- use Yii;
- use yii\db\Exception;
- use addons\Store\common\models\Store;
- class SignService
- {
- /**
- * 实行核销
- * @param int $mall_id
- * @param string $order_no
- * @param int $user_id
- * @param string $key
- * @return bool|string
- */
- public function create(int $mall_id, string $order_no, int $user_id, string $key = 'order_no')
- {
- $t = Yii::$app->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());
- }
- }
- }
|