| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711 |
- <?php
- namespace api\modules\v1\controllers\order;
- use addons\ReservationService\common\enums\ReservationServiceEnum;
- use addons\ReservationService\common\models\ReservationServiceOrder;
- use addons\ReservationService\common\models\ReservationServiceUser;
- use addons\ReservationService\common\services\OrderService;
- use addons\ReservationService\common\services\TechniciansService;
- use addons\SecondaryCard\common\service\SecondaryCardOrderService;
- use addons\Store\common\models\Store;
- use addons\Store\common\models\StoreGoodsReserve;
- use addons\Store\common\models\StoreGoodsReserveSku;
- use addons\Store\common\models\StoreOrder;
- use addons\Store\common\models\StoreOrderReserve;
- use addons\Store\common\models\StoreReserveSetting;
- use addons\Store\common\services\StoreReserveSettingService;
- use api\controllers\OnAuthController;
- use common\enums\AddonsEnum;
- use common\enums\ApiStatusEnum;
- use common\enums\ClerkEnum;
- use common\enums\GlobalFuncEnum;
- use common\enums\MarketingTypeEnum;
- use common\enums\OrderSourceEnum;
- use common\enums\OrderStatusEnum;
- use common\enums\PayTypeEnum;
- use common\enums\RefundReasonEnum;
- use common\enums\RefundTypeEnum;
- use common\enums\ShippingTypeEnum;
- use common\enums\StatusEnum;
- use common\globals\GlobalInvoke;
- use common\helpers\DateHelper;
- use common\models\goods\Goods;
- use common\models\goods\GoodsAttr;
- use common\models\goods\GoodsReserve;
- use common\models\goods\GoodsReserveSku;
- use common\models\mall\MallAddons;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use common\models\order\OrderMarketing;
- use common\models\order\OrderReserve;
- use Yii;
- use yii\helpers\Json;
- /**
- * Class OrderController
- * @package api\modules\order\controllers
- */
- class ReserveOrderController extends OnAuthController
- {
- public $modelClass = '';
- /**
- * 不用进行登录验证的方法
- *
- * 例如: ['index', 'update', 'create', 'view', 'delete']
- * 默认全部需要验证
- *
- * @var array
- */
- protected $authOptional = [];
- public function actionList()
- {
- $params = \Yii::$app->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);
- }
- }
|