store_id = $this->store_id; $model->name = $name; $model->pic_url = $pic_url; $model->sort = $sort; $model->is_show = $is_show; $save = $model->save(); if(!$save){ \Yii::error([__METHOD__, $model->attributes]); throw new \Exception('操作失败,' . array_shift($model->getFirstErrors())); } return [ 'code' => 0, 'msg' => '操作成功', ]; }catch(\Exception $e){ \Yii::error([__METHOD__, $e]); return [ 'code' => 1, 'msg' => $e->getMessage(), ]; } } public function catListSelect() { $query = BookingGoodsCat::find()->where(['store_id' => $this->store_id, 'is_delete' => 0, 'is_show' => 1]); $query->orderBy('sort desc'); $query->select(['id', 'name', 'sort']); $res = $query->all(); return [ 'code' => 0, 'msg' => 'success', 'data' => $res, // 'q' => $query->createCommand()->getRawSql(), ]; } public function catList() { $query = BookingGoodsCat::find()->where(['is_delete' => 0]); $this->store_id && $query->andWhere(['store_id' => $this->store_id]); if($this->name){ $query->andWhere(['like', 'name', $this->name]); } if($this->status >= 0){ $query->andWhere(['is_show' => $this->status]); } $query->orderBy('sort desc'); $res = pagination_make($query); return [ 'code' => 0, 'msg' => 'success', 'data' => $res, // 'q' => $query->createCommand()->getRawSql(), ]; } public function catStatus () { try { if ($this->ids) { $ids = explode(',', $this->ids); if (in_array($this->status, [0, 1])) { BookingGoodsCat::updateAll(['is_show' => $this->status], ['and', ['in', 'id', $ids], ['store_id' => $this->store_id]]); } if ((int)$this->status === 2) { BookingGoodsCat::updateAll(['is_delete' => 1], ['and', ['in', 'id', $ids], ['store_id' => $this->store_id]]); } } return [ 'code' => 0, 'msg' => '操作成功!' ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } public function catInfo($id = 0) { $model = BookingGoodsCat::findOne($id); return [ 'code' => 0, 'msg' => '操作成功', 'data' => $model, ]; } public static function bookingGoodsExtSave($store_id, $goods_id, $cat_id) { $goods_ext = BookingGoodsExt::findOne(['goods_id' => $goods_id]) ?? new BookingGoodsExt(); $goods_ext->store_id = $store_id; $goods_ext->goods_id = $goods_id; $goods_ext->cat_id = $cat_id; if (!$goods_ext->save()) { \Yii::error([__METHOD__, $goods_ext->attributes]); return [ 'code'=>1, 'msg'=>'预约商品保存错误' . array_shift($goods_ext->getFirstErrors()), ]; } return [ 'code' => 0, 'msg' => '保存成功', 'data' => $goods_ext, ]; } public function bookingOrderCountByGoods($params) { $query = Order::find()->alias('o')->leftJoin(['boe' => BookingOrderExt::tableName()], 'o.id=boe.order_id'); $query->leftJoin(['od' => OrderDetail::tableName()], 'o.id=od.order_id'); $query->leftJoin(['gb' => \app\models\GoodsBook::tableName()], 'gb.goods_id=od.goods_id'); $query->leftJoin(['bge' => BookingGoodsExt::tableName()], 'od.goods_id=bge.goods_id'); $query->leftJoin(['bgc' => BookingGoodsCat::tableName()], 'bge.cat_id=bgc.id'); if(empty($params['booking_time_start']) || empty($params['booking_time_end'])){ return [ 'code'=>1, 'msg'=>'请选择时间', ]; } $query->andWhere([ 'o.store_id' => $this->store_id, 'o.order_type' => 2, 'o.is_delete' => 0, 'o.is_recycle' => 0, ]); $query->andWhere([ '!=', 'o.trade_status', 1, ]); if($params['md_id'] > 0){ $query->andWhere(['o.md_id' => $params['md_id']]); } if($params['goods_name']){ $query->andWhere(['like', 'od.goods_name', $params['goods_name']]); } if($params['booking_time_start']){ $query->andWhere(['>=', 'boe.booking_time_end', $params['booking_time_start']]); } if($params['booking_time_end']){ $query->andWhere(['<=', 'boe.booking_time_start', $params['booking_time_end']]); } $addSelect = ['gb.service_book', 'od.goods_id', 'od.goods_name', 'od.pic', 'bgc.name', 'count(1) order_count']; $query->groupBy('od.goods_id'); $query->select($addSelect); $list = $query->asArray()->all(); return [ 'code' => 0, 'msg' => 'ok', 'data' => $list, 'md_id' => $params['md_id'], ]; } public function bookingOrderCountByWorker($params) { $query = Order::find()->alias('o')->leftJoin(['boe' => BookingOrderExt::tableName()], 'o.id=boe.order_id'); $query->leftJoin(['od' => OrderDetail::tableName()], 'o.id=od.order_id'); $query->leftJoin(['gb' => \app\models\GoodsBook::tableName()], 'gb.goods_id=od.goods_id'); if(empty($params['booking_time_start']) || empty($params['booking_time_end']) || empty($params['goods_id'])){ return [ 'code'=>1, 'msg'=>'参数错误', ]; } $query->andWhere([ 'o.store_id' => $this->store_id, 'o.order_type' => 2, 'o.is_delete' => 0, 'o.is_recycle' => 0, ]); $query->andWhere([ '!=', 'o.trade_status', 1, ]); if($params['md_id'] > 0){ $query->andWhere(['o.md_id' => $params['md_id']]); } if($params['goods_id']){ $query->andWhere(['od.goods_id' => $params['goods_id']]); } if($params['booking_time_start']){ $query->andWhere(['>=', 'boe.booking_time_end', $params['booking_time_start']]); } if($params['booking_time_end']){ $query->andWhere(['<=', 'boe.booking_time_start', $params['booking_time_end']]); } $addSelect = ['boe.booking_time_start', 'boe.worker_id', 'boe.worker_name', 'count(1) order_count']; $query->groupBy('boe.booking_time_start, boe.worker_id'); $query->select($addSelect); $list = $query->asArray()->all(); $newList = []; foreach($list as $item){ $btime = (explode(' ', $item['booking_time_start']))[1]; $newList[$btime]['count'] += $item['order_count']; $newList[$btime]['list'][] = $item; } return [ 'code' => 0, 'msg' => 'ok', 'data' => $newList, 'md_id' => $params['md_id'], ]; } public function bookingOrderList($params) { $query = Order::find()->alias('o')->leftJoin(['boe' => BookingOrderExt::tableName()], 'o.id=boe.order_id'); $query->leftJoin(['od' => OrderDetail::tableName()], 'o.id=od.order_id'); $query->leftJoin(['u' => User::tableName()], 'u.id=o.user_id'); if(empty($params['booking_time_start']) || empty($params['booking_time_end'])){ return [ 'code'=>1, 'msg'=>'请选择时间', ]; } $query->andWhere([ 'o.store_id' => $this->store_id, 'o.order_type' => 2, 'o.is_delete' => 0, 'o.is_recycle' => 0, ]); $query->andWhere([ '!=', 'o.trade_status', 1, ]); if($params['md_id'] > 0){ $query->andWhere(['o.md_id' => $params['md_id']]); } if($params['goods_name']){ $query->andWhere(['like', 'od.goods_name', $params['goods_name']]); } if($params['worker_id']){ $query->andWhere(['boe.worker_id' => $params['worker_id']]); } if($params['booking_time_start']){ $query->andWhere(['>=', 'boe.booking_time_end', $params['booking_time_start']]); } if($params['booking_time_end']){ $query->andWhere(['<=', 'boe.booking_time_start', $params['booking_time_end']]); } if($params['status_ext'] == 500){ //已超时 $query->andWhere(['and', ['<', 'boe.booking_time_end', BookingOrderExt::STATUS_EXT_START], ['>', 'boe.booking_time_end', time()]]); }elseif($params['status_ext'] == 600){ //未分配 $query->andWhere(['boe.worker_id' => 0]); }else{ isset($params['status_ext']) && $params['status_ext'] > -1 && $query->andWhere(['boe.time_sys_confirm' => $params['status_ext']]); } $addSelect = ['u.binding', 'o.id', 'o.md_id', 'o.user_id', 'o.created_at', 'o.name', 'o.mobile', 'o.remark', 'od.goods_name', 'od.goods_id', 'od.attr', 'boe.worker_id', 'boe.worker_name', 'boe.status_ext', 'boe.time_sys_confirm']; $addSelect = array_merge($addSelect, ['IF(boe.booking_time_end < "'.date('Y-m-d H:i:s').'" AND boe.status_ext < '. BookingOrderExt::STATUS_EXT_START .', 1, 0) booking_time_out']); $query->select($addSelect); $query->orderBy(['boe.booking_time_start' => SORT_ASC, 'o.id' => SORT_ASC]); $list = $query->asArray()->all(); foreach($list as &$item){ if (empty($item['binding'])) { $item['nickname'] = $item['de_name']; $item['avatar'] = $item['avatar_url']; } else { $sass_user = SaasUser::findOne(['mobile' => $item['binding']]); if ($sass_user) { $item['nickname'] = $sass_user->name; $item['avatar'] = $sass_user->avatar; } } $tmp_attr = json_decode($item['attr'], true); $item['attr'] = $tmp_attr; $item['boe_stime'] = date('w', strtotime($tmp_attr['start_date'])); $tmp_time = explode('-', $tmp_attr['time']); $item['boe_stime'] = $tmp_time[0]; } return [ 'code' => 0, 'msg' => 'ok', 'data' => $list, ]; } public function bookingOrderSave($params) { $time = explode('-', $params['time']); $start_date = $params['date'] . ' ' . $time[0]; $end_date = $params['date'] . ' ' . $time[1]; $order = $params['order_id'] ? Order::findOne($params['order_id']) : new Order(); if(!$params['order_id']){ $order->created_at = time(); $order->store_id = $this->store_id; $order->user_id = $params['user_id']; $order->order_no = OrderNo::getOrderNo(OrderNo::ORDER_MALL); $order->pay_price = 0; $order->version = cyy_version(); $order->order_type = 2; $order->is_offline = 1; $order->order_origin = Order::ORDER_SOURCE_MANAGE; $order->integral = json_encode(['forehead' => 0, 'forehead_integral' => 0], JSON_UNESCAPED_UNICODE); $order->discount = 10; $order->first_price = 0; $order->second_price = 0; $order->third_price = 0; } if(isset($params['mobile']) && isset($params['name'])){ $order->mobile = $params['mobile']; $order->name = $params['name']; $order->book_info = json_encode([ 'name' => $params['name'], 'mobile' => $params['mobile'], ]); } isset($params['remark']) && $order->remark = $params['remark']; if(!$order->save()){ \Yii::error([__METHOD__, $order->attributes]); return [ 'code'=>1, 'msg'=>'订单信息保存错误' . array_shift($order->getFirstErrors()), ]; } $order->refresh(); $order->trade_status = Order::ORDER_FLOW_NO_SEND; $order->is_pay = 1; $order->pay_time = time(); if($params['md_id']){ $order->md_id = $params['md_id']; } if(!$order->save()){ \Yii::error([__METHOD__, $order->attributes]); return [ 'code'=>1, 'msg'=>'订单信息保存错误' . array_shift($order->getFirstErrors()), ]; } if(!$params['order_id']){ $goods = Goods::findOne($params['goods_id']); $order_detail = new OrderDetail(); $order_detail->order_id = $order->id; $order_detail->goods_id = $goods->id; $order_detail->goods_name = $goods->name; $order_detail->attr = json_encode([ 'start_date' => $start_date, 'end_date' => $end_date, 'time' => $params['time'], 'date' => $params['date'], 'price' => 0, ], JSON_UNESCAPED_UNICODE); $order_detail->pic = $goods->cover_pic; $order_detail->goods_info = json_encode($goods->toArray()); if(!$order_detail->save()){ \Yii::error([__METHOD__, $order_detail->attributes]); return [ 'code'=>1, 'msg'=>'订单详情信息保存错误' . array_shift($order_detail->getFirstErrors()), ]; } } $boe = BookingOrderExt::findOne(['order_id' => $order->id]); $boe->booking_time_start = $start_date; $boe->booking_time_end = $end_date; if($params['worker_id']){ $boe->setWorker($params['worker_id'], $params['worker_name']); } if(!$boe->save()){ \Yii::error([__METHOD__, $boe->attributes]); return [ 'code'=>1, 'msg'=>'订单预约ext信息保存错误' . array_shift($boe->getFirstErrors()), ]; } return [ 'code' => 0, 'msg' => '保存成功', '$order' => $order, '$order_detail' => $order_detail, '$boe' => $boe, ]; } //分配订单 public function orderSetWorker($params) { $store_id = $this->store_id; $order_id = $params['order_id']; $boe = BookingOrderExt::findOne(['order_id' => $order_id, 'store_id' => $store_id]); $boe->setWorker($params['worker_id'], $params['worker_name']); if(!$boe->save()){ \Yii::error([__METHOD__, $boe->attributes]); return [ 'code'=>1, 'msg'=>'订单预约ext信息保存错误' . array_shift($boe->getFirstErrors()), ]; } return [ 'code' => 0, 'msg' => '保存成功', '$boe' => $boe, ]; } //确认收款 public function orderIsPay($params) { $store_id = $this->store_id; $order_id = $params['order_id']; if(empty($order_id)){ return [ 'code' => 1, 'msg' => '参数错误1', '$order_id' => $order_id, ]; } $order = Order::findOne(['id' => $order_id, 'store_id' => $store_id, 'trade_status' => Order::ORDER_FLOW_DEFAULT]); if(empty($order)){ return [ 'code' => 1, 'msg' => '参数错误,订单不存在或状态异常', ]; } $t = \Yii::$app->db->beginTransaction(); try{ $order = Order::find()->where('id = :id FOR UPDATE', [':id' => $order_id])->one(); if(!$order){ throw new \Exception('锁失败'); } $order->is_pay = 1; $order->pay_type = 3; $order->pay_time = time(); $order->trade_status = Order::ORDER_FLOW_NO_SEND; $save = $order->save(); if(!$save){ throw new \Exception(array_shift($order->getFirstErrors())); } // 支付完成后,相关操作 $form = new OrderComplete(); $form->order_id = $order->id; $form->order_type = 2; $form->store_id = $store_id; $form->notify(); $t->commit(); return [ 'code' => 0, 'msg' => '操作成功', ]; } catch (\Exception $ex) { $t->rollBack(); return [ 'code' => 1, 'msg' => '操作失败,' . $ex->getMessage(), ]; } } //确认收货 public function orderConfirm($params) { $store_id = $this->store_id; $order_id = $params['order_id']; if(empty($order_id)){ return [ 'code' => 1, 'msg' => '参数错误1', '$order_id' => $order_id, ]; } $order = Order::findOne(['id' => $order_id, 'store_id' => $store_id, 'is_pay' => 1]); if(empty($order)){ return [ 'code' => 1, 'msg' => '参数错误,订单不存在或订单未付款', ]; } $t = \Yii::$app->db->beginTransaction(); try{ $order = Order::find()->where('id = :id FOR UPDATE', [':id' => $order_id])->one(); if(!$order){ throw new \Exception('锁失败'); } $order->trade_status = Order::ORDER_FLOW_CONFIRM; $order->confirm_time = time(); $save = $order->save(); if(!$save){ throw new \Exception(array_shift($order->getFirstErrors())); } $t->commit(); return [ 'code' => 0, 'msg' => '操作成功', ]; } catch (\Exception $ex) { $t->rollBack(); return [ 'code' => 1, 'msg' => '操作失败,' . $ex->getMessage(), ]; } } }