store_id; $status = $this->status; $open_status = $this->open_status; $name = $this->name; $cat_id = $this->cat_id; $level = $this->level; $nickname = $this->nickname; $tel = $this->tel; $query = Worker::find()->alias('w')->where(['w.store_id' => $store_id, 'w.status' => [Worker::STATUS_WAIT_AUDIT, Worker::STATUS_VALID, Worker::STATUS_REJECT]]); if (!is_null($status) && in_array($status, [Worker::STATUS_WAIT_AUDIT, Worker::STATUS_VALID, Worker::STATUS_REJECT])) { $query->andWhere(['w.status' => $status]); } if (is_null($status)) { $query->andWhere(['w.status' => Worker::STATUS_VALID]); } if ($name) { $query->andWhere(['LIKE', 'w.name', $name]); } if ($tel) { $query->andWhere(['w.tel' => $tel]); } if ($cat_id) { $cat_id = explode(',', $cat_id); $worker_ = WorkerCatExt::find()->where(['cat_id' => $cat_id, 'is_delete' => 0])->select('worker_id')->column(); $worker_ = array_merge($worker_, [0]); $query->andWhere(['w.id' => $worker_]); } if ($level) { $query->andWhere(['w.level' => $level]); } if ($nickname) { $query->andWhere(['LIKE', 'su.name', $nickname]); } // if (!is_null($open_status) && in_array($open_status, [1, 2, 3])) { // $query->andWhere(['w.status' => $status]); // } if (!is_null($open_status)) { if (in_array($open_status, [0, 1])) { $query->andWhere(['w.open_status' => $open_status]); if ((int)$open_status === 1) { $worker_ids = WorkerOrderExt::find()->where(['AND', ['user_revoke' => 0], ['<', 'time_outgoing', time()], ['>', 'time_end_service', time()]])->select('worker_id')->column(); $worker_ids = array_merge($worker_ids, [0]); $query->andWhere(['NOT IN', 'w.id', $worker_ids]); } } if ((int)$open_status === 2) { $query->leftJoin(['o' => WorkerOrderExt::tableName()], 'o.worker_id = w.id'); $query->andWhere(['AND', ['w.open_status' => 1, 'o.user_revoke' => 0], ['<', 'o.time_outgoing', time()], ['>', 'o.time_end_service', time()] ]); } } $query->leftJoin(['u' => User::tableName()], 'w.user_id = u.id') ->leftJoin(['su' => SaasUser::tableName()], 'w.saas_user_id = su.id') ->select('w.*, su.name nickname') ->orderBy('w.created_at desc'); $list = pagination_make($query); foreach ($list['list'] as &$item) { $item['form'] = json_decode($item['form'], true); $item['status'] = (int)$item['status']; $item['open_status'] = (int)$item['open_status']; if ($item['book_end_time'] <= 0 && $item['book_start_time'] <= 0) { $item['worker_time'] = '未设置服务时间'; } if ($item['book_start_time'] > 0) { if (strlen($item['book_start_time']) === 3) { $item['book_start_time'] = '0' . $item['book_start_time']; } $hour = substr($item['book_start_time'], 0, 2); $minute = substr($item['book_start_time'], -2); $item['worker_time'] = $hour . ':' . $minute; } else { $item['worker_time'] = "00:00"; } if ($item['book_end_time'] > 0) { if (strlen($item['book_end_time']) === 3) { $item['book_end_time'] = '0' . $item['book_end_time']; } $hour = substr($item['book_end_time'], 0, 2); $minute = substr($item['book_end_time'], -2); $item['worker_time'] .= '-'. $hour . ':' . $minute; } else { $item['worker_time'] .= "-00:00"; } if ($item['open_status'] === 1) { $order_ext = WorkerOrderExt::find()->where(['AND', ['user_revoke' => 0, 'worker_id' => $item['id']], ['<=', 'time_start_service', time()], ['>=', 'time_end_service', time()] ])->one(); if ($order_ext) { $item['open_status'] = 2; } if ($item['open_status'] === 1) { if ($item['book_end_time'] < date("Hi")) { $item['open_status'] = 0; } } } //订单数量 $order_ext = WorkerOrderExt::find()->where(['worker_id' => $item['id']])->select('order_id')->asArray()->all(); $item['order_num'] = (int)count($order_ext); $item['province'] = District::find()->where(['id' => $item['province_id']])->select('name')->scalar(); $item['city'] = District::find()->where(['id' => $item['city_id']])->select('name')->scalar(); $item['district'] = District::find()->where(['id' => $item['district_id']])->select('name')->scalar(); // $item['address'] = $area['address']; $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']); $item['updated_at'] = date('Y-m-d H:i:s', $item['updated_at']); $item['pic_url'] = WorkerPic::find()->where(['worker_id' => $item['id'], 'is_delete' => 0])->select('pic_url')->asArray()->all(); if ($item['pic_url']) { foreach ($item['pic_url'] as &$value) { if (strpos($value['pic_url'], 'https:') === false && strpos($value['pic_url'], 'http:') === false) { $value['pic_url'] = 'https:' . $value['pic_url']; } } } $item['cat_id'] = WorkerCatExt::find()->where(['worker_id' => $item['id'], 'is_delete' => 0])->select('cat_id')->column(); $item['cat_name'] = WorkerCat::find()->where(['id' => $item['cat_id']])->select('name')->column(); } $worker_level = WorkerLevel::find()->where(['status' => 1, 'store_id' => $store_id, 'is_delete' => 0])->select('level id, name') ->asArray()->all(); $worker_cat = WorkerCat::find()->where(['is_show' => 1, 'store_id' => $store_id, 'is_delete' => 0])->select('id, name')->orderBy('sort desc') ->asArray()->all(); return [ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list['list'], 'worker_level' => $worker_level, 'worker_cat' => $worker_cat, 'pageNo' => $list['pageNo'], 'totalCount' => $list['totalCount'], ], ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } public function workerSave() { $t = \Yii::$app->db->beginTransaction(); try { $id = $this->id; $name = $this->name; $cat_id = $this->cat_id; $user_id = $this->user_id; $level = $this->level; $desc = $this->desc; $tel = $this->tel; $logo = $this->logo; $lat = $this->lat; $lng = $this->lng; $province_id = $this->province_id; $city_id = $this->city_id; $district_id = $this->district_id; $pic_url = $this->pic_url; $store_id = $this->store_id; //查询用户信息 $user = User::findOne(['store_id' => $store_id, 'id' => $user_id, 'is_delete' => 0]); if (!$user || !$user->binding) { throw new \Exception('商城用户信息查询失败'); } $saas_user = SaasUser::findOne(['mobile' => $user->binding]); if (!$saas_user) { throw new \Exception('用户信息查询失败'); } //查询分类信息 $work_cat = WorkerCat::findOne(['id' => $cat_id, 'store_id' => $store_id, 'is_show' => 1]); if (!$work_cat) { throw new \Exception('分类信息查询失败'); } //查询等级信息 if ($level) { $worker_level = WorkerLevel::findOne(['level' => $level, 'status' => 1, 'store_id' => $store_id]); if (!$worker_level) { throw new \Exception('服务人员等级查询失败'); } } else { $worker_level = WorkerLevel::find()->where(['status' => 1, 'store_id' => $store_id]) ->orderBy('id ASC')->select('level')->asArray()->one(); if (!$worker_level) { throw new \Exception('服务人员等级查询失败'); } $level = $worker_level['level']; } if ($province_id && $city_id && $district_id) { //地址信息 $province = District::find()->where(['id' => $province_id])->select('name')->scalar(); $city = District::find()->where(['id' => $city_id])->select('name')->scalar(); $district = District::find()->where(['id' => $district_id])->select('name')->scalar(); if (!$province || !$city || !$district) { throw new \Exception('省市区查询失败'); } } $worker = Worker::findOne(['id' => $id, 'store_id' => $store_id]); if (!$worker) { $worker = new Worker(); $worker->store_id = $store_id; $worker->form = ''; } $worker->status = 1; $worker->name = $name; // $worker->cat_id = $cat_id; $worker->user_id = $user->id; $worker->saas_user_id = $saas_user->id; $worker->level = $level; $worker->name = $name; // $worker->desc = $desc ?? ''; // $worker->tel = $tel ?? $saas_user->mobile; // $worker->logo = $logo ?? $saas_user->avatar; // $worker->area = '';//$area; // $worker->lat = $lat ?? '0.00'; // $worker->lng = $lng ?? '0.00'; // $worker->province_id = $province_id ?? 0; // $worker->city_id = $city_id ?? 0; // $worker->district_id = $district_id ?? 0; if (!$worker->save()) { throw new \Exception(implode(';', array_values($worker->firstErrors))); } WorkerCatExt::deleteAll(['worker_id' => $worker->id]); $cat_id = explode(',', $cat_id); foreach ($cat_id as $cat_id_) { $worker_cat = WorkerCat::findOne(['id' => $cat_id_, 'is_delete' => 0, 'is_show' => 1]); if ($worker_cat) { $worker_cat_ext = new WorkerCatExt(); $worker_cat_ext->cat_id = $cat_id_; $worker_cat_ext->worker_id = $worker->id; $worker_cat_ext->store_id = $store_id; $worker_cat_ext->save(); } } if (!is_null($pic_url)) { WorkerPic::updateAll(['is_delete' => 1], ['worker_id' => $worker->id, 'is_delete' => 0]); $pic_url = json_decode($pic_url, true); foreach ($pic_url as $item) { $pic = new WorkerPic(); $pic->worker_id = $worker->id; $pic->pic_url = $item['pic_url']; if (!$pic->save()) { throw new \Exception(json_encode($pic->errors)); } } } $t->commit(); return [ 'code' => 0, 'msg' => '操作成功' ]; } catch (\Exception $e) { $t->rollBack(); return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } public function workerStatus() { $t = \Yii::$app->db->beginTransaction(); try { $id = $this->id; $status = (int)$this->status; $reason = $this->reason; $store_id = $this->store_id; $worker = Worker::findOne(['id' => $id, 'store_id' => $store_id]); if (!$worker) { throw new \Exception('查询信息失败'); } if (!in_array($status, [Worker::STATUS_VALID, Worker::STATUS_REJECT, Worker::STATUS_CLOSE])) { throw new \Exception('状态参数错误'); } if ((int)$worker->status !== Worker::STATUS_WAIT_AUDIT && in_array($status, [Worker::STATUS_VALID, Worker::STATUS_REJECT])) { throw new \Exception('已审核完成,请勿重复操作'); } // if ((int)$worker->status !== Worker::STATUS_WAIT_AUDIT && $status === Worker::STATUS_REJECT) { // throw new \Exception('数据状态错误'); // } if (in_array($status, [Worker::STATUS_VALID, Worker::STATUS_REJECT])) { if ($status === Worker::STATUS_REJECT) { if (!$reason) { throw new \Exception('请填写原因'); } else { $worker->reason = $reason; } } } $worker->status = $status; if ($status == Worker::STATUS_CLOSE) { WorkerCatExt::deleteAll(['worker_id' => $worker->id]); } if (!$worker->save()) { throw new \Exception(json_encode($worker->errors)); } $t->commit(); if (in_array($status, [Worker::STATUS_VALID, Worker::STATUS_REJECT])) { $res = NoticeSend::AgentExamine($worker->id, 3); if (isset($res['code']) && $res['code'] !== 0) { debug_log($res, 'sms.log'); } } return [ 'code' => 0, 'msg' => '操作成功' ]; } catch (\Exception $e) { $t->rollBack(); return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } public function reg() { try { $form = new LoginForm(); $form->store_id = $this->store_id; $form->phone = $this->tel; $form->verify_code = $this->verify_code; $verifySmsCode = $form->verifySmsCode(LoginForm::CACHE_KEY_BIND_PHONE); if ($verifySmsCode['code'] != 0) { return $verifySmsCode; } $saas_user = SaasUser::findOne(['mobile' => $this->user->binding]); if (!$saas_user) { throw new \Exception('用户信息查询失败'); } $worker = Worker::findOne(['user_id' => $this->user->id, 'status' => Worker::STATUS_VALID]); if ($worker) { if($worker->status != Worker::STATUS_REJECT){ throw new \Exception('状态异常'); } }else{ $worker = new Worker(); $worker->store_id = $this->store_id; } $worker->cat_id = $this->cat_id; $worker->name = $this->name; $worker->user_id = $this->user->id; $worker->saas_user_id = $saas_user->id; $worker->tel = $this->tel; $worker->logo = $this->logo; $worker->gender = $this->gender; $worker->age = $this->age; $worker->logo = $this->logo; $worker->province_id = $this->province_id ?? 0; $worker->city_id = $this->city_id ?? 0; $worker->district_id = $this->district_id ?? 0; $worker->form = is_string($this->form) ? $this->form : json_encode($this->form); $worker->lat = $this->lat; $worker->lng = $this->lng; $worker->status = 0; if (!$worker->save()) { throw new \Exception('保存失败' . array_shift($worker->getFirstErrors())); } return [ 'code' => 0, 'msg' => '申请成功,请等待审核' ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => '保存失败' . $e->getMessage() ]; } } //分配订单-服务人员列表 public function canBindWorkerList() { $store_id = $this->store_id; $order_id = $this->order_id; $type = $this->type; $setting = WorkerSetting::getByStoreId($store_id); $orderSpace = $setting['order_space']; $WorkerOrderExt = WorkerOrderExt::findOne(['store_id' => $store_id, 'order_id' => $order_id, 'status_ext' => WorkerOrderExt::STATUS_EXT_WAIT_BIND]); if(empty($WorkerOrderExt)){ return [ 'code' => 1, 'msg' => '参数错误,订单ext不存在', ]; } $order = Order::findOne($order_id); $gnum = count($order->detail); $sql = ' SELECT w.id FROM cyy_worker w LEFT JOIN ( SELECT count(id) num, worker_id FROM cyy_worker_goods WHERE goods_id IN ( SELECT goods_id FROM cyy_order_detail WHERE order_id = :order_id AND is_delete=0 ) GROUP BY worker_id ) wg ON w.id = wg.worker_id WHERE wg.num = :gnum AND w.status != :status'; $queryWorkerId = \Yii::$app->db->createCommand($sql, [':order_id' => $order_id, ':gnum' => $gnum, ':status' => Worker::STATUS_VALID])->getRawSql(); $queryOrder = Worker::find()->alias('w')->leftJoin([ 'woe' => WorkerOrderExt::find()->where([ 'and', ['>=', 'status_ext', WorkerOrderExt::STATUS_EXT_HAS_BIND], ['<', 'status_ext', WorkerOrderExt::STATUS_EXT_CANCEL], ])->select('id doing, worker_id') ], 'w.id = woe.worker_id')->where([ 'w.store_id' => $store_id, 'w.status' => Worker::STATUS_VALID, ]); if($this->name){ $queryOrder->andWhere(['like', 'w.name', $this->name]); } if($this->tel){ $queryOrder->andWhere(['like', 'w.tel', $this->tel]); } if($type == 1){ $queryOrder->andWhere(['woe.doing' => null]); } if($type == 2){ $queryOrder->andWhere(['>', 'woe.doing', 0]); } if($type == 3){ $queryOrder->andWhere(['w.open_status' => 0]); } $queryOrder->andWhere('w.id in ('. $queryWorkerId .')'); $queryDis = 'ROUND(st_distance_sphere(point('. $WorkerOrderExt->lng .', '. $WorkerOrderExt->lat .'), point(w.lng, w.lat)), 2)'; $queryOrder->andWhere($queryDis . " < :dis", [':dis' => $orderSpace]); $queryOrder->select('*'); $queryOrder->addSelect([$queryDis . ' dis']); $queryOrder->orderBy('dis ASC, doing ASC'); $data = pagination_make($queryOrder); foreach($data['list'] as &$item){ $item['ignore'] = 0; $cacheV = WorkerOrderExt::cacheIgnoreOrderId($item->id); if($cacheV && in_array($order_id, array_keys($cacheV))){ $item['ignore'] = 1; } $item['canBind'] = 1; if(empty($item['doing'])){ $item['canBind'] = 1; } if($item['doing']){ $item['canBind'] = 2; } if(empty($item['open_status'])){ $item['canBind'] = 3; } } $res = [ 'code' => 0, 'msg' => 'success', 'data' => $data, 'q' => $queryOrder->createCommand()->getRawSql(), ]; return $res; } //分配订单 public function bindWorker() { $store_id = $this->store_id; $order_id = $this->order_id; $worker_id = $this->worker_id; if(empty($order_id) || empty($worker_id)){ return [ 'code' => 1, 'msg' => '参数错误1', '$order_id' => $order_id, '$worker_id' => $worker_id, ]; } $orderExt = WorkerOrderExt::findOne(['store_id' => $store_id, 'order_id' => $order_id, 'status_ext' => WorkerOrderExt::STATUS_EXT_WAIT_BIND]); if(empty($orderExt)){ return [ 'code' => 1, 'msg' => '参数错误,订单ext不存在', ]; } $t = \Yii::$app->db->beginTransaction(); try{ $orderExt = WorkerOrderExt::find()->where('id = :id FOR UPDATE', [':id' => $orderExt->id])->one(); if(!$orderExt){ throw new \Exception('锁失败'); } $orderExt->worker_id = $worker_id; $orderExt->status_ext = WorkerOrderExt::STATUS_EXT_WAIT_BIND_OK; $save = $orderExt->save(); if(!$save){ throw new \Exception(array_shift($orderExt->getFirstErrors())); } $t->commit(); $order = Order::findOne($order_id); NoticeSend::PlaceOrder($order->order_no, $order->md_id, $order->store_id, $order); return [ 'code' => 0, 'msg' => 'success', ]; } catch (\Exception $ex) { $t->rollBack(); return [ 'code' => 1, 'msg' => '操作失败,' . $ex->getMessage(), ]; } } //确认收款 public function orderIsPay() { $store_id = $this->store_id; $order_id = $this->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 = 0; $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() { $store_id = $this->store_id; $order_id = $this->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(), ]; } } public function commentList() { $store_id = $this->store_id; $queryOrder = WorkerOrderExt::find()->where(['store_id' => $store_id])->select('order_id'); $query = OrderComment::find()->alias('oc')->leftJoin([ 'woe' => WorkerOrderExt::tableName() ], 'oc.order_id = woe.order_id')->leftJoin([ 'w' => Worker::tableName() ], 'w.id = woe.worker_id')->leftJoin([ 'o' => Order::tableName() ], 'oc.order_id = o.id')->leftJoin([ 'od' => OrderDetail::tableName() ], 'oc.order_detail_id = od.id')->leftJoin([ 'u' => User::tableName() ], 'oc.user_id = u.id')->leftJoin([ 'su' => SaasUser::tableName() ], 'su.mobile = u.binding')->where([ 'oc.order_id' => $queryOrder, 'oc.is_delete' => OrderComment::IS_DELETE_FALSE, ])->groupBy('oc.id'); if(isset($this->is_hide) && $this->is_hide >= 0){ $query->andWhere(['oc.is_hide' => $this->is_hide]); } if($this->goods_name){ $query->andWhere(['like', 'od.goods_name', $this->goods_name]); } if($this->nickname){ $query->andWhere(['like', 'su.name', $this->nickname]); } if($this->key_word){ $query->andWhere(['like', 'od.content', $this->key_word]); } if($this->score > 0){ if($this->score == 3){ $query->andWhere(['>=', 'oc.score', $this->score]); }else{ $query->andWhere(['oc.score' => $this->score]); } } if($this->begin){ $query->andWhere(['>=', 'oc.created_at', $this->begin]); } if($this->end){ $query->andWhere(['<=', 'oc.created_at', $this->end]); } $queryOrderBy = 'oc.id DESC'; if($orderby == 1){ $queryOrderBy = 'oc.id DESC'; }else if($orderby == 2){ $queryOrderBy = 'oc.id ASC'; } $query->orderBy($queryOrderBy); $query->select('oc.*, o.order_no, od.goods_name, od.pic goods_pic, su.name su_name, su.avatar su_avatar, w.name w_name, w.logo w_logo, w.tel w_tel'); $data = pagination_make($query); foreach($data['list'] as &$item){ $item['pic_list'] = json_decode($item['pic_list']); } $data['data'] = $data['list']; unset($data['list']); $res = [ 'code' => 0, 'msg' => 'success', 'data' => $data, 'q' => $query->createCommand()->getRawSql(), ]; return $res; } public function setting() { $store_id = $this->store_id; $setting = WorkerSetting::getByStoreId($store_id); if($this->setting){ $post = $this->setting; if(is_string($post)){ $post = json_decode($post, true); } if (!$setting) { $setting = new WorkerSetting(); $setting->store_id = $this->store_id; } $setting->setAttributes($post, false); if($post['form_apply']['list']){ foreach($post['form_apply']['list'] as $i => &$item){ if(empty($item['id'])){ $item['id'] = time() . random_int(10000, 99999); } } } $setting->form_apply = $post['form_apply'] ? json_encode($post['form_apply']) : ''; $setting->tag = $post['tag']; $setting->banner = $post['banner'] ? json_encode($post['banner']) : ''; if (!$setting->save()) { // throw new \Exception('保存失败' . array_shift($setting->getFirstErrors())); return [ 'code' => 1, 'msg' => '保存失败' . array_shift($setting->getFirstErrors()), ]; } } if($setting){ $setting->form_apply = json_decode($setting->form_apply, true); $setting->banner = json_decode($setting->banner, true); } return [ 'code' => 0, 'msg' => 'ok', 'setting' => $setting ?? (object)[], ]; } //佣金列表 public function storeWorkerProfitList() { $query = Order::find()->alias('o')->leftJoin(['oe' => WorkerOrderExt::tableName()], 'o.id = oe.order_id')->where([ 'o.is_delete' => 0, 'o.store_id' => $this->store_id ])->andWhere([ '<>', 'o.trade_status', Order::ORDER_FLOW_CANCEL ]); $query->orderBy('o.id DESC'); $pagination = pagination_make($query); $listArray = $pagination['list']; return [ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $listArray, 'pageNo' => $pagination['pageNo'], 'pageSize' => $pagination['pageSize'], 'totalCount' => $pagination['totalCount'], ], ]; } //服务人员佣金列表 public function workerProfitList($is_price_no = 0) { $query = Order::find()->alias('o') ->leftJoin(['oe' => WorkerOrderExt::tableName()], 'o.id = oe.order_id') ->where([ 'o.is_delete' => 0, 'o.store_id' => $this->store_id ])->andWhere([ '<>', 'o.trade_status', Order::ORDER_FLOW_CANCEL ])->andWhere([ 'oe.worker_id' => $this->worker_id, 'o.is_pay' => 1, ]); $sumQuery = clone $query; $sum_money = $sumQuery->sum('worker_price'); $sumQueryIsPriceNo = clone $query; $sumQueryIsPriceNo->andWhere(['worker_is_price' => 0]); $sumMoneyIsPriceNo = $sumQueryIsPriceNo->sum('worker_price'); if($is_price_no){ $query->andWhere(['worker_is_price' => 0]); } $query->select('o.order_no, o.id, o.pay_time, oe.worker_is_price_time, oe.worker_is_price, oe.worker_price'); $query->orderBy('o.id DESC'); $pagination = pagination_make($query); $listArray = $pagination['list']; foreach($listArray as &$item){ $item['source_name'] = '服务人员佣金'; $item['created_at'] = $item['pay_time']; $item['send_time'] = $item['worker_is_price_time']; $item['money'] = $item['worker_price']; $item['is_price'] = $item['worker_is_price']; } return [ 'sum_money' => (float)$sum_money, 'sumMoneyIsPriceNo' => (float)$sumMoneyIsPriceNo, 'data' => $listArray, 'pageNo' => $pagination['pageNo'], 'pageSize' => $pagination['pageSize'], 'totalCount' => $pagination['totalCount'], ]; } //发放佣金 public static function workerProfitSend($order_id = 0) { $woe = WorkerOrderExt::findOne(['order_id' => $order_id, 'worker_is_price' => 0]); if(!$woe){ return [ 'code' => 1, 'msg' => '订单不存在或已发放', ]; } $key = 'workerProfitSend_' . $order_id; if(cache()->get($key)){ return [ 'code' => 1, 'msg' => '已操作,稍后再试', ]; } cache()->set($key, 1, 60); $t = \Yii::$app->db->beginTransaction(); try{ $woe->worker_is_price = 1; $woe->worker_is_price_time = time(); $save = $woe->save(); if(!$save){ throw new \Exception('发放状态修改失败' . array_shift($woe->getFirstErrors())); } $worker = Worker::findOne($woe->worker_id); $user = User::findOne($worker->user_id); $profit = $woe['worker_price']; $user->total_price += $profit; $user->price += $profit; $save = $user->save(); if(!$save){ throw new \Exception('用户佣金信息修改失败' . array_shift($user->getFirstErrors())); } UserShareMoney::set($profit, $user->id, $woe->order_id, 0, 1, $woe->store_id, Order::ORDER_TYPE_WORKER); $t->commit(); return [ 'code' => 0, 'msg' => 'ok', ]; } catch (\Exception $ex) { $t->rollBack(); return [ 'code' => 1, 'msg' => '操作失败,' . $ex->getMessage(), ]; } } /** * 获取提现列表 * @return array */ public function getStoreWorkerCashList(){ $query = Cash::find()->alias('c') ->where(['c.is_delete' => Cash::IS_DELETE_NO, 'c.store_id' => $this->store_id]) ->leftJoin(['u' => User::tableName()], 'u.id=c.user_id') ->leftJoin(['w' => Worker::tableName()], 'w.user_id=c.user_id') ->andWhere([ 'c.cash_type' => Cash::IS_CASH_TYPE_WORKER ]); if ($this->keyword) { $query->andWhere([ 'or', ['like', 'u.nickname', $this->keyword], ['like', 'w.name', $this->keyword] ]); } if ($this->dateStart) { $query->andWhere(['>=', 'c.created_at', strtotime($this->dateStart)]); } if ($this->dateEnd) { $query->andWhere(['<=', 'c.created_at', strtotime($this->dateEnd)]); } if ($this->status == Cash::STATUS_APPLY and $this->status != '') {//待审核 $query->andWhere(['c.status' => Cash::STATUS_APPLY]); } if ($this->status == Cash::STATUS_CONFIRM) {//待打款 $query->andWhere(['c.status' => Cash::STATUS_CONFIRM]); } if ($this->status == Cash::STATUS_GIVEN) {//已打款 $query->andWhere(['in', 'c.status', [Cash::STATUS_GIVEN, Cash::STATUS_RECHARGE]]); } if ($this->status == Cash::STATUS_REFUSE) {//无效 $query->andWhere(['c.status' => Cash::STATUS_REFUSE]); } if ($this->id) { $query->andWhere(['w.id' => $this->id]); } $query->distinct()->orderBy('c.status ASC,c.created_at DESC')->select([ 'c.*', 'u.nickname','u.platform', 'u.avatar_url','u.binding' ]); $pagination = pagination_make($query); $list = $pagination['list']; foreach($list as &$value){ $value['service_money'] = $value['service_charge'] * $value['price'] / 100; $value['created_at'] = date('Y-m-d H:i:s', $value['created_at']); $value['updated_at'] = !empty($value['updated_at']) ? date('Y-m-d H:i:s', $value['updated_at']) : ''; $value['money'] = Cash::getServiceMoney($value); $sassuser = SaasUser::findOne(['mobile' => $value['binding']]); $value['avatar_url'] = !empty($sassuser['avatar']) ? $sassuser['avatar'] : $value['avatar_url']; } return [ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list, 'pageNo' => $pagination['pageNo'], 'totalCount' => $pagination['totalCount'], ], ]; } /** * 获取提现列表 * @return array */ public function getWorkerCashList(){ $worker = Worker::findOne(['user_id' => $this->user_id, 'status' => 1]); if(!$worker){ return [ 'code' => 1, 'msg' => '用户不存在', ]; } $query = Cash::find()->alias('c') ->where(['c.is_delete' => Cash::IS_DELETE_NO, 'c.store_id' => $this->store_id]) ->andWhere([ 'c.user_id' => $this->user_id, 'c.cash_type' => Cash::IS_CASH_TYPE_WORKER ]); if ($this->dateStart) { $query->andWhere(['>=', 'c.created_at', strtotime($this->dateStart)]); } if ($this->dateEnd) { $query->andWhere(['<=', 'c.created_at', strtotime($this->dateEnd)]); } if ($this->status == Cash::STATUS_APPLY and $this->status != '') {//待审核 $query->andWhere(['c.status' => Cash::STATUS_APPLY]); } if ($this->status == Cash::STATUS_CONFIRM) {//待打款 $query->andWhere(['c.status' => Cash::STATUS_CONFIRM]); } if ($this->status == Cash::STATUS_GIVEN) {//已打款 $query->andWhere(['in', 'c.status', [Cash::STATUS_GIVEN, Cash::STATUS_RECHARGE]]); } if ($this->status == Cash::STATUS_REFUSE) {//无效 $query->andWhere(['c.status' => Cash::STATUS_REFUSE]); } $query->distinct()->orderBy('c.status ASC,c.created_at DESC'); $pagination = pagination_make($query); $list = $pagination['list']; foreach($list as &$value){ $value['service_money'] = $value['service_charge'] * $value['price'] / 100; $value['created_at'] = date('Y-m-d H:i:s', $value['created_at']); $value['updated_at'] = !empty($value['updated_at']) ? date('Y-m-d H:i:s', $value['updated_at']) : ''; $value['money'] = Cash::getServiceMoney($value); } return [ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list, 'pageNo' => $pagination['pageNo'], 'totalCount' => $pagination['totalCount'] ], ]; } }