request->get(); $where[] = ['mall_id' => $this->mall_id]; $where[] = ['user_id' => $this->user_id]; $where[] = ['status' => StatusEnum::ENABLED]; // $where[] = ['is_feedback' => OrderStatusEnum::NOT_FEEDBACK]; $where[] = ['order_source' => [OrderSourceEnum::SOURCE_RESERVE, OrderSourceEnum::SOURCE_STORE_RESERVE]]; if (isset($params['order_status']) && $params['order_status'] != 999) { if ($params['order_status'] == OrderStatusEnum::SING) { // 如果筛选的是已收货的订单那么就将已提货的订单一起取出来 $params['order_status'] = [OrderStatusEnum::SING, OrderStatusEnum::TAKE_FINISH]; } $where[] = ['order_status' => $params['order_status']]; if ($params['order_status'] == OrderStatusEnum::ACCOMPLISH) $where[] = ['is_comment' => StatusEnum::DISABLED]; } if (!empty($params['keyword'])) { $goods_list = Goods::lists(['where' => [ ['mall_id' => $this->mall_id], ['like', 'goods_name', trim($params['keyword']) . '%', false] ], 'select' => 'id']); $goods_ids = array_column($goods_list, 'id'); $order_detail_list = OrderDetail::lists(['where' => [ ['mall_id' => $this->mall_id], ['in', 'goods_id', $goods_ids] ], 'select' => 'order_id']); $order_ids = array_column($order_detail_list, 'order_id'); $where[] = [ 'or', ['id' => $order_ids], ]; } $params['order'] = 'id desc'; if (isset($params['order_status']) && $params['order_status'] != 999) { if ($params['order_status'] == OrderStatusEnum::SING) { $where[] = ['order_status' => [OrderStatusEnum::SING, OrderStatusEnum::TAKE_FINISH]]; } else { $where[] = ['order_status' => $params['order_status']]; } } if (!empty($params['keyword'])) { $goods_list = Goods::lists(['where' => [ ['mall_id' => $this->mall_id], ['like', 'goods_name', trim($params['keyword']) . '%', false] ], 'select' => 'id']); $goods_ids = array_column($goods_list, 'id'); $order_detail_list = OrderDetail::lists(['where' => [ ['mall_id' => $this->mall_id], ['in', 'goods_id', $goods_ids] ], 'select' => 'order_id']); $order_ids = array_column($order_detail_list, 'order_id'); $where[] = [ 'or', ['id' => $order_ids], ['like', 'order_no', trim($params['keyword']) . '%', false] ]; } // is_comment 是否评价 0为未评价 1为已评价 2为已追评 $select = 'id,pay_money,score,order_status,shipping_type,is_recycle,marketing_type,extra_info,order_source,store_id,mch_id,is_comment,marketing_id,is_feedback'; $params['order'] = 'id desc'; $params['select'] = $select; $params['where'] = $where; $params['with'] = [ 'detail' => function ($query) { $query->select('id,order_id,goods_id,goods_name,pic_url,goods_attr_id,num,price,is_feedback,sign_id,goods_attr_name,extra_info,adjust_money'); }, 'reserve' => function ($query) { $query->select('id,order_id,reserve_date_time,province_id,city_id,district_id,detail,lat,lng,region_name,reserve_status,reserve_code,service_type,reserve_type,tech_id'); }, ]; $order_list = Order::listPage($params); $order_list['mall_name'] = $this->mall['name']; $order_list['mall_logo'] = Yii::$app->services->setting->mall->get($this->mall_id, 'basic.logo'); $score_name = Yii::$app->services->setting->mall->get($this->mall_id, 'score.score_name'); if (!empty($order_list['list'])) { $store_reserve_setting_list = []; if (MallAddons::isInstall($this->mall_id, 'Store')) { $store_ids = array_column($order_list['list'], 'store_id'); $store_reserve_setting_list = (new StoreReserveSettingService(['mall_id' => $this->mall_id]))->list($store_ids); } $fields = 'id,main_order_id as order_id,reserve_date_time,province_id,city_id,district_id,detail,lat,lng,region_name,reserve_status,reserve_code,service_type,reserve_type'; foreach ($order_list['list'] as $key => $val) { array_map(function ($arg) use (&$val) { if (!isset($val['num'])) $val['num'] = 0; $val['num'] += $arg['num']; }, $val['detail']); // 剩余库存 $stock = []; if ($val['detail']) { foreach ($val['detail'] as $k => $v) { $order_list['list'][$key]['detail'][$k]['price'] = $order_list['list'][$key]['detail'][$k]['price'] + $order_list['list'][$key]['detail'][$k]['adjust_money']; $order_list['list'][$key]['detail'][$k]['price'] = round($order_list['list'][$key]['detail'][$k]['price'], 2); $goods_unit = Goods::getOne([['=', 'id', $v['goods_id']]], false, '', '', 'unit')['unit']; $val['detail'][$k]['unit'] = $goods_unit; // 当订单关闭时可以直接再次购买 if ($val['order_status'] == OrderStatusEnum::REPEAL) { // 查询商品是否有货 $stock[] = [ 'num' => $v['num'], 'store_id' => $v['store_id'] ?? 0, 'goods_id' => $v['goods_id'], 'attr_id' => $v['goods_attr_id'], 'stock' => GoodsAttr::find()->where(['id' => $v['goods_attr_id']])->select('stock')->scalar(), ]; } } } // 获取支付金额 $order_list['list'][$key] = GlobalInvoke::exec(GlobalInvoke::ORDER_DETAIL, $this->mall_id, [ 'order' => $val, 'mall_id' => $this->mall_id, ]) ?: $val; if (!empty($val['store_id'])) { $order_list['list'][$key]['reserve'] = StoreOrderReserve::getOne([['main_order_id' => $val['id']]], true, [], 'id asc', $fields); } $order_list['list'][$key]['reserve']['employee_selection'] = 1; $order_list['list'][$key]['reserve']['user_acceptance'] = 0; if (isset($store_reserve_setting_list[$val['store_id']])) { $temp_setting = $store_reserve_setting_list[$val['store_id']]; $order_list['list'][$key]['reserve']['employee_selection'] = $temp_setting['employee_selection'] ?? 1; $order_list['list'][$key]['reserve']['user_acceptance'] = $temp_setting['user_acceptance'] ?? 0; } $reservation_service_order = ReservationServiceOrder::find()->where(['order_id' => $val['id']])->orderBy('id desc')->one(); $order_list['list'][$key]['reserve']['reject_reason'] = $reservation_service_order['reject_reason'] ?? ''; $order_list['list'][$key]['reserve']['remark'] = $reservation_service_order['remark'] ?? ''; $order_list['list'][$key]['reserve']['service_status'] = $reservation_service_order['service_status'] ?? ''; $order_list['list'][$key]['reserve']['server_status'] = $reservation_service_order['server_status'] ?? ''; $order_list['list'][$key]['mall_name'] = $this->mall['name']; $order_list['list'][$key]['mall_logo'] = Yii::$app->services->setting->mall->get($this->mall_id, 'basic.logo'); if (!empty($order_list['list'][$key]['store_id'])) { $store = Store::findOne(['id' => $order_list['list'][$key]['store_id']]); $order_list['list'][$key]['mall_name'] = $store->store_name; $order_list['list'][$key]['mall_logo'] = $store->logo_img; } $order_list['list'][$key]['service_type_text'] = $order_list['list'][$key]['reserve']['service_type'] == 1 ? '上门服务' : '到店服务'; $order_list['list'][$key]['reserve_date_time'] = !empty($order_list['list'][$key]['reserve']['reserve_date_time']) ? str_replace(',', '~', $order_list['list'][$key]['reserve']['reserve_date_time']) : ""; // 判断是否可以再次购买 $is_agent = empty($stock) ? 0 : 1; foreach ($stock as $v) { // 当库存小于购买数量 不可再次购买 if ($v['stock'] < $v['num']) { $is_agent = 0; } } $order_list['list'][$key]['is_agent'] = $is_agent; $order_list['list'][$key]['is_agent_data'] = $is_agent ? $stock : []; if ($val['marketing_type'] == 'ScoreMall' && !empty($val['score'])) $order_list['list'][$key]['pay_money'] .= '+' . $val['score'] . $score_name; } //次卡部分----start foreach ($order_list['list'] as &$item) { $item['secondary_card'] = []; $item['is_secondary_card'] = 0; } //次卡部分----end $order_list['list'] = GlobalInvoke::exec(GlobalFuncEnum::ORDER_LIST, $this->mall_id, [ 'order' => $order_list['list'], 'mall_id' => $this->mall_id, 'reserve' => true ]) ?: $order_list['list']; $order_list['shipping_type_text'] = ShippingTypeEnum::getMap(); $order_list['order_status_text'] = OrderStatusEnum::getReserveMap(); $order_list['service_status_text'] = ReservationServiceEnum::RESERVE_ORDER_STATUS_MAP; $order_list['server_status_text'] = ReservationServiceEnum::SERVER_STATUS_MAP; $order_list['is_feedback_text'] = OrderStatusEnum::getFeedbackMap(); } $order_list['pay_type_list'] = \Yii::$app->services->pay->getEnablePayment($this->mall_id, $this->platform); $order_list['marketing_type_map'] = MarketingTypeEnum::getMap(); $tabsIndex = [999, 0, 1, 2, 3, 4]; foreach ($tabsIndex as $index) { $badgeQuery = Order::find() ->where(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_feedback' => StatusEnum::DISABLED, 'status' => StatusEnum::ENABLED, 'order_source' => [OrderSourceEnum::SOURCE_RESERVE, OrderSourceEnum::SOURCE_STORE_RESERVE]]); $num = StatusEnum::DISABLED; switch ($index) { case 0: // 待支付 $num = $badgeQuery->andWhere(['order_status' => StatusEnum::DISABLED])->andWhere(['>=', 'created_at', time() - 86400])->count(); break; case 1: // 已付款 $num = $badgeQuery->andWhere(['order_status' => OrderStatusEnum::PAY])->andWhere(['>=', 'pay_time', time() - 86400])->count(); break; case 2: // 待服务 $num = $badgeQuery->andWhere(['order_status' => OrderStatusEnum::SHIPMENTS])->andWhere(['>=', 'shipping_time', time() - 86400])->count(); break; case 3: // 待验收 $num = $badgeQuery->andWhere(['order_status' => OrderStatusEnum::SING])->andWhere(['>=', 'sign_time', time() - 86400])->count(); break; case 4: // 待评价 $num = $badgeQuery->andWhere(['order_status' => OrderStatusEnum::ACCOMPLISH]) ->andWhere(['is_comment' => StatusEnum::DISABLED])->andWhere(['>=', 'finish_time', time() - 86400])->count(); break; } $order_list['tab_badge'][$index] = (int) $num; } // dd($order_list['tab_badge']); return $this->success('操作成功', $order_list, ApiStatusEnum::CODE_SUCCESS, JSON_BIGINT_AS_STRING); } /** * 订单详情 * @return mixed|void */ public function actionDetail() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['order_id'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $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,is_comment'; $where = []; $where[] = ['mall_id' => $this->mall_id]; $where[] = ['user_id' => $this->user_id]; $where[] = ['id' => $params['order_id']]; $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,goods_attr_id,goods_attr_name'); }, 'reserve' => function ($query) { $query->select('id,order_id,reserve_date_time,province_id,city_id,district_id,detail,lat,lng,region_name,reserve_status,reserve_code,reserve_type,service_type'); }, ], false, $select); if (empty($order)) return $this->error('该订单不存在', []); if (empty($order['reserve']) && !empty($order['store_id'])) { // 门店订单 $order['reserve'] = StoreOrderReserve::getOne([['main_order_id' => $order['id']]], true, [], 'id asc', 'id,main_order_id as order_id,reserve_date_time,province_id,city_id,district_id,detail,lat,lng,region_name,reserve_status,reserve_code,reserve_type,service_type'); } $marketing = OrderMarketing::getMarketingInfo($order); $order['order_status_text'] = OrderStatusEnum::getReserveMap(); $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($this->mall_id, $this->platform); $order['change_price'] = array_sum(array_column($order['detail'], 'adjust_money')); //预留字段 $order['marketing'] = $marketing; $order['marketing_type_map'] = MarketingTypeEnum::getMap(); $order_setting = Yii::$app->services->setting->mall->get($this->mall_id, 'order'); $order['payment_expire_time'] = $order_setting['payment_expire_time'] ?? 30; $order['auto_receiving_time'] = $order_setting['auto_receiving_time'] ?? 14; //查询商品单位 if ($order['detail']) { foreach ($order['detail'] as $k => $v) { $goods_unit = Goods::getOne([['=', 'id', $v['goods_id']]], false, '', '', 'unit')['unit']; $order['detail'][$k]['unit'] = $goods_unit; } } // 获取订单详情的状态文字描述 $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['mall_name'] = $this->mall['name']; $order['mall_logo'] = Yii::$app->services->setting->mall->get($this->mall_id, 'basic.logo'); if (!empty($order['store_id'])) { $store = Store::findOne(['id' => $order['store_id']]); $order['mall_name'] = $store->store_name; $order['mall_logo'] = $store->logo_img; } $order['service_type_text'] = $order['reserve']['service_type'] == 1 ? '上门服务' : '到店服务'; $order['reserve_date_time'] = !empty($order['reserve']['reserve_date_time']) ? str_replace(',', '~', $order['reserve']['reserve_date_time']) : ""; $order['tech'] = null; if ($order['reserve']['reserve_type'] == StatusEnum::ENABLED) { // 预约订单 $order['tech'] = (new OrderService())->getStaffByOrderId($params['order_id'], $order['mall_id']); } // 公共调用 $order['is_secondary_card'] = 0; $order = GlobalInvoke::exec(GlobalInvoke::ORDER_DETAIL, $this->mall_id, [ 'order' => $order, 'mall_id' => $this->mall_id, 'reserve' => true ]) ?: $order; $order['employee_selection'] = 1; if (MallAddons::isInstall($this->mall_id, 'Store') && !empty($order['store_id'])) { $store_reserve_setting = (new StoreReserveSettingService(['mall_id' => $this->mall_id, 'store_id' => $order['store_id']]))->detail(); $order['reserve']['employee_selection'] = $store_reserve_setting['employee_selection'] ?? 1; $order['reserve']['user_acceptance'] = $store_reserve_setting['user_acceptance'] ?? 0; } return $this->success('操作成功', $order, ApiStatusEnum::CODE_SUCCESS, JSON_BIGINT_AS_STRING); } /** * 获取预约码链接 * @return mixed|void */ public function actionGetReserveCodeLink() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['order_id'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $reserveOrder = OrderReserve::findOne(['order_id' => $params['order_id']]); if (empty($reserveOrder)) return $this->error('订单未找到'); if (empty($reserveOrder->reserve_code)) return $this->error('订单未生成核销码'); $link = '/v1/order/reserve-order/write-off?code=' . $reserveOrder->reserve_code; return $this->success('获取成功', ['path' => $link]); } /** * 核销 * @return mixed|void */ public function actionWriteOff() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['code'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $reserveOrder = OrderReserve::findOne(['reserve_code' => $params['code']]); if (empty($reserveOrder)) return $this->error('订单未找到'); if ($reserveOrder->reserve_status != OrderReserve::RESERVE_STATUS_WAIT) return $this->error('该订单已核销过,请勿重复操作'); $data['id'] = $reserveOrder->order_id; $data['mall_id'] = $this->mall_id; $data['user_id'] = $this->user_id; $data['operator_id'] = $this->user_id; $data['operator_name'] = $this->user->nickname ?? $this->user->mobile; $data['from'] = OrderSourceEnum::SOURCE_RESERVE; $res = Order::takeDelivery($data); if ($res === false) return $this->error(Goods::getStaticError()); return $this->success(); } /** * 验收 * @return mixed|void */ public function actionAcceptance() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['order_id'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $reserveOrder = OrderReserve::find()->where(['order_id' => $params['order_id']])->orderBy('id desc')->one(); if (empty($reserveOrder)) { $reserveOrder = StoreOrderReserve::find()->where(['main_order_id' => $params['order_id']])->orderBy('id desc')->one(); if (empty($reserveOrder)) { return $this->error('订单未找到'); } $store_reserve_setting = (new StoreReserveSettingService(['mall_id' => $this->mall_id, 'store_id' => $reserveOrder['store_id']]))->detail(); if (isset($store_reserve_setting['user_acceptance']) && empty($store_reserve_setting['user_acceptance'])) { return $this->error('该门店未开启用户验收'); } } else { $reservation_service_order = ReservationServiceOrder::find()->where(['order_id' => $params['order_id']])->orderBy('id desc')->one(); if (!empty($reservation_service_order['store_id'])) { $store_reserve_setting = (new StoreReserveSettingService(['mall_id' => $this->mall_id, 'store_id' => $reservation_service_order['store_id']]))->detail(); if (isset($store_reserve_setting['user_acceptance']) && empty($store_reserve_setting['user_acceptance'])) { return $this->error('该门店未开启用户验收'); } } } if ($reserveOrder->reserve_status != OrderReserve::RESERVE_STATUS_PENDDING) return $this->error('该订单还未核销,请先进行核销'); if ($reserveOrder->reserve_status == OrderReserve::RESERVE_STATUS_FINISH) return $this->error('该订单已验收,请勿重复操作'); $data['id'] = $params['order_id']; $data['mall_id'] = $this->mall_id; $data['user_id'] = $this->user_id; $data['operator_id'] = $this->user_id; $data['operator_name'] = $this->user->nickname ?? $this->user->mobile; $data['from'] = OrderSourceEnum::SOURCE_RESERVE; $res = Order::completes($data); if ($res === false) return $this->error(Goods::getStaticError()); return $this->success(); } /** * 预约订单售后选项 * @return mixed|void */ public function actionToRefundSubmit() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['order_detail_id'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $select = 'id,order_id,goods_name,sign_id,goods_attr_name,price,num,pic_url,goods_price,order_status,marketing_type,extra_info,adjust_money,store_id'; $order_detail = OrderDetail::getOne([['id' => $params['order_detail_id']], 'user_id' => $this->user_id, 'mall_id' => $this->mall_id], 1, [], false, $select); if (empty($order_detail)) return $this->error('订单不存在'); $order = Order::find()->select("extra_info,score,shipping_money,out_trade_no")->where(['id' => $order_detail['order_id']])->asArray()->one(); if ($order_detail['marketing_type'] == AddonsEnum::ADDONS_NAME_SCORE_MALL) { $order_detail['extra_info'] = $order['extra_info']; $order_detail['pay_score'] = $order['score']; } // 查询预约商品订单 if (empty($order_detail['store_id'])) { $reserveOrder = OrderReserve::findOne(['order_id' => $order_detail['order_id']]); } else { $reserveOrder = StoreOrderReserve::findOne(['main_order_id' => $order_detail['order_id']]); } $cancelRule = !empty($reserveOrder->cancel_rule) ? json_decode($reserveOrder->cancel_rule, true) : []; $startTime = strtotime(explode(',', $reserveOrder->reserve_date_time)[0]); $cancelFeePercent = 0; switch ($reserveOrder->cancel_type) { case OrderReserve::CANCEL_TYPE_NOT: // 不允许售后 return $this->error('此订单不能申请售后'); break; case OrderReserve::CANCEL_TYPE_TIME: // 提前N小时允许售后 $cancelSecond = ($cancelRule['cancel_hour'] ?? 0) * 3600; if (!empty($startTime) && (time() + $cancelSecond) >= $startTime) { return $this->error(date('Y-m-d H:i:s',$startTime - $cancelSecond).' 前才可以申请售后'); } break; case OrderReserve::CANCEL_TYPE_RATE: $cancelFeePercent = $cancelRule['cancel_fee_percent']; break; } // 公共调用 $order_detail = GlobalInvoke::exec(GlobalInvoke::ORDER_REFUND_SUBMIT, $this->mall_id, [ 'order_detail' => $order_detail, 'mall_id' => $this->mall_id, ]) ?: $order_detail; //价格等于商品价格加上修改价格 $order_detail['goods_price'] = round($order_detail['goods_price'] + $order_detail['adjust_money'], 2); $order_detail['cancel_fee_percent'] = $cancelFeePercent; $data['goods_info'] = $order_detail; $data['feedback_reason'] = RefundReasonEnum::getMap(); if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_RESERVATION_SERVICE)) { $tags = \Yii::$app->services->setting->addons->get($this->mall_id, ReservationServiceEnum::ADDONS_NAME, 'basic.refund_tags'); $data['feedback_reason'] = !empty($tags) ? Json::decode((string)$tags) : $data['feedback_reason']; } $feedback_type = RefundTypeEnum::getArr(); $data['feedback_type'] = []; $data['feedback_type'][] = $feedback_type[RefundTypeEnum::MONEY]; $data['order_status'] = $order_detail['order_status']; return $this->success('操作成功', $data); } /** * 预约 * @return mixed|null */ public function actionReserve() { $params = \Yii::$app->request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['order_id', 'select_time'], 'required'], [['secondary_card_no', 'latitude', 'longitude', 'store_id', 'tech_id', 'service_type'], 'safe'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); if (empty($params['tech_id'])) { $params['tech_id'] = 0; } try { if(!empty($params['secondary_card_no'])){ if(!MallAddons::isInstall($this->mall_id,'SecondaryCard')){ if (empty($order)) throw new \Exception('次卡插件未安装!'); } $params['mall_id'] = $this->mall_id; $params['user_id'] = $this->user_id; $res = $this->secondaryCardReserve($params); if(is_string($res)) return $this->error($res); return $this->success('提交成功'); } $order = Order::findOne(['id' => $params['order_id'], 'user_id' => $this->user_id]); if (empty($order)) throw new \Exception('订单不存在!'); if (empty($order->store_id)) { // 平台订单 if (empty($params['tech_id'])) { return $this->error('请选择技师'); } $reserveOrder = OrderReserve::findOne(['order_id' => $params['order_id'], 'user_id' => $this->user_id]); $goods = GoodsReserve::findOne(['goods_id' => OrderDetail::find()->where(['order_id' => $params['order_id']])->select('goods_id')->scalar()]); } else { // 门店订单 $storeOrder = StoreOrder::findOne(['order_no' => $order->order_no]); if (empty($storeOrder)) throw new \Exception('订单不存在'); $reserveOrder = StoreOrderReserve::findOne(['order_id' => $storeOrder->id, 'store_id' => $order->store_id]); $goods = StoreGoodsReserve::findOne(['goods_id' => OrderDetail::find()->where(['order_id' => $params['order_id']])->select('goods_id')->scalar()]); } if (empty($reserveOrder)) throw new \Exception('订单未找到'); if ($reserveOrder->reserve_type != StatusEnum::ENABLED) { throw new \Exception('当前订单不可进行预约'); } if ($reserveOrder->reserve_status != 0) { throw new \Exception('当前订单不可进行预约.'); } // if ($reserveOrder->order_status != OrderStatusEnum::PAY) { // throw new \Exception('当前订单不可进行预约!'); // } // 预约时间校验 // 取出商品 // 数据校验 if (!MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_RESERVATION_SERVICE)) { throw new \Exception('您还未安装当前插件'); } $time = strtotime($params['select_time']); if($time <= time()) throw new \Exception('选择时间错误'); if (!empty($goods->reserve_advance_hourse) && $time - time() < ($goods->reserve_advance_hourse * 3600)) throw new \Exception("当前项目需提前 {$goods->reserve_advance_hourse} 小时进行预约"); //检测技师 $orderDetail = OrderDetail::findOne(['order_id' => $order->id]); if (!empty($params['tech_id'])) { $check = TechniciansService::checkCanOrder($this->mall_id, $params['tech_id'], $params['select_time'], $orderDetail->goods_id, $orderDetail->goods_attr_id, $reserveOrder->lat, $reserveOrder->lng, $order->store_id); if (!$check) throw new \Exception(TechniciansService::getStaticError()); } // 开始处理 $t = Yii::$app->db->beginTransaction(); try { $reserve_code = OrderReserve::getClerkCode($order['mall_id'], ClerkEnum::RESERVATION_SERVICE_CLERK_CODE_PRE); // 处理数据 $start_at = strtotime($params['select_time']); if (empty($order->store_id)) { $sku = GoodsReserveSku::findOne(['id' => $orderDetail->goods_attr_id]); } else { $sku = StoreGoodsReserveSku::findOne(['id' => $orderDetail->goods_attr_id]); $reserveOrder->reserve_code = $reserve_code; } $reserveOrder->tech_id = $params['tech_id']; $reserveOrder->reserve_date_time = $params['select_time']; $reserveOrder->service_start_at = $start_at; $reserveOrder->service_end_at = $start_at + ($sku->service_min * 60); $reserveOrder->reserve_time_range_type = 2; if (!$reserveOrder->save()) throw new \Exception($reserveOrder->getErrorMessage()); $data = [ 'mall_id' => $this->mall_id, 'store_id' => $order->store_id, 'user_id' => $reserveOrder->user_id, 'tech_id' => $params['tech_id'], 'order_id' => $params['order_id'], 'order_no' => $order->order_no, 'service_start_at' => $start_at, 'service_end_at' => $start_at + ($sku->service_min * 60), 'remark' => '', 'commission' => 0, 'order_detail_id' => $orderDetail->id, 'goods_id' => $orderDetail->goods_id, 'lng' => $reserveOrder->lng, 'lat' => $reserveOrder->lat, 'goods_price' => $orderDetail->goods_price, 'service_type' => $reserveOrder->service_type, 'goods_reserve_sku_id' => $sku['id'], ]; if (!empty($order->store_id)) { $data['server_status'] = ReservationServiceEnum::ALREADY_BOOKED; $data['service_status'] = ReservationServiceEnum::RESERVE_ORDER_STATUS_TALKING; $main_order = Order::findOne(['order_no' => $order['order_no']]); $main_order->order_status = OrderStatusEnum::SHIPMENTS; $main_order->shipping_time = time(); $main_order->save(); $store_order = StoreOrder::findOne(['order_no' => $order['order_no']]); $store_order->order_status = OrderStatusEnum::SHIPMENTS; $store_order->shipping_time = time(); $store_order->clerk_code = $reserveOrder->reserve_code; $store_order->save(); } $reservation_service_order = (new OrderService())->save($data); OrderReserve::updateAll(['reservation_service_order_id' => $reservation_service_order['id']], ['order_id' => $order['id']]); StoreOrderReserve::updateAll(['reservation_service_order_id' => $reservation_service_order['id']], ['main_order_id' => $order['id']]); $t->commit(); } catch (\Exception $e) { $t->rollBack(); throw new \Exception($e->getMessage()); } } catch (\Exception $e) { return $this->error($e->getMessage()); } return $this->success('提交成功'); } /** * 次卡预约 * @Author:hua * @Date:2024-03-05 16:55 * @Copyright:copyright(c)2024 广东七件事集团 * @param $params * @return bool */ protected function secondaryCardReserve($params){ return SecondaryCardOrderService::secondaryCardReserve($params); } public function actionNumberIcons() { $tabsIndex = [999, 0, 1, 2, 3, 4]; foreach ($tabsIndex as $index) { $badgeQuery = Order::find() ->where(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_feedback' => StatusEnum::DISABLED, 'status' => StatusEnum::ENABLED, 'order_source' => [OrderSourceEnum::SOURCE_RESERVE, OrderSourceEnum::SOURCE_STORE_RESERVE]]); $num = StatusEnum::DISABLED; switch ($index) { case 0: // 待支付 $num = $badgeQuery->andWhere(['order_status' => StatusEnum::DISABLED])->andWhere(['>=', 'created_at', time() - 86400])->count(); break; case 1: // 已付款 $num = $badgeQuery->andWhere(['order_status' => OrderStatusEnum::PAY])->andWhere(['>=', 'pay_time', time() - 86400])->count(); break; case 2: // 待服务 $num = $badgeQuery->andWhere(['order_status' => OrderStatusEnum::SHIPMENTS])->andWhere(['>=', 'shipping_time', time() - 86400])->count(); break; case 3: // 待验收 $num = $badgeQuery->andWhere(['order_status' => OrderStatusEnum::SING])->andWhere(['>=', 'sign_time', time() - 86400])->count(); break; case 4: // 待评价 $num = $badgeQuery->andWhere(['order_status' => OrderStatusEnum::ACCOMPLISH]) ->andWhere(['is_comment' => StatusEnum::DISABLED])->andWhere(['>=', 'finish_time', time() - 86400])->count(); break; } $order_list['tab_badge'][$index] = (int) $num; } return $this->success('操作成功', $order_list); } }