| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610 |
- <?php
- /**
- * 重庆赤晓店信息科技有限公司
- * https://www.chixiaodian.com
- * Copyright (c) 2023 赤店商城 All rights reserved.
- */
- namespace app\modules\admin\models\booking;
- use app\models\District;
- use app\models\SaasUser;
- use app\models\Order;
- use app\models\Cash;
- use app\models\User;
- use app\models\Worker;
- use app\models\WorkerCatExt;
- use app\models\WorkerOrderExt;
- use app\models\WorkerCat;
- use app\models\WorkerLevel;
- use app\models\WorkerPic;
- use app\models\WorkerSetting;
- use app\models\OrderComment;
- use app\models\OrderDetail;
- use app\utils\Notice\NoticeSend;
- use app\modules\client\models\v1\LoginForm;
- use app\models\UserShareMoney;
- use app\modules\client\models\OrderComplete;
- use app\models\BookingGoodsCat;
- use app\models\BookingGoodsExt;
- use app\models\BookingOrderExt;
- use app\utils\OrderNo;
- use app\models\Goods;
- class BookingForm extends Model
- {
- public $store_id;
-
- public $verify_code;
- public $id;
- public $ids;
- public $name; //名称
- public $mobile;
- public $gender;
- public $age;
- public $form;
- public $type;
- public $cat_id;
- public $user;
- public $user_id;
- public $worker_id;
- public $worker_name;
- public $level;
- public $desc;
- public $tel;
- public $logo;
- public $status;
- public $open_status;
- public $reason;
- public $area;
- public $lat;
- public $lng;
- public $province_id;
- public $city_id;
- public $district_id;
- public $address;
- public $nickname;
- public $order_id;
- public $goods_id;
- public $goods_name;
- public $score;
- public $begin;
- public $end;
- public $key_word;
- public $is_hide;
- public $setting;
- public $pic_url;
- public function rules()
- {
- return [
- [['id', 'user_id', 'level', 'type', 'status', 'province_id', 'city_id', 'district_id', 'open_status', 'gender', 'age'], 'integer'],
- [['desc', 'name', 'tel', 'logo', 'reason', 'area', 'lat', 'lng', 'address', 'nickname', 'verify_code', 'cat_id'], 'string'],
- [['user', 'form', 'order_id', 'worker_id', 'worker_name', 'goods_name', 'score', 'begin', 'end', 'key_word', 'gender', 'is_hide', 'setting', 'pic_url', 'goods_id', 'ids'], 'safe'],
- ];
- }
-
-
- public function catSave($id = 0, $name = '', $pic_url = '', $sort = 100, $is_show = 1) {
- try{
- $model = $id ? BookingGoodsCat::findOne($id) : new BookingGoodsCat();
- $model->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(),
- ];
- }
- }
- }
|