Просмотр исходного кода

Merge branch 'm--tmp' into m--transfer

liugc 11 месяцев назад
Родитель
Сommit
ec1b9bd506

+ 37 - 4
app/adminapi/logic/works/ServiceWorkLogic.php

@@ -21,6 +21,7 @@ use app\common\logic\ThirdOrderLogic;
 use app\common\logic\WorkerAccountLogLogic;
 use app\common\model\third\ThirdOrders;
 use app\common\model\works\ServiceWorkDeterminedPrice;
+use app\workerapi\logic\MasterWorkerLogic;
 use think\Exception;
 use think\db\Query;
 use think\facade\Db;
@@ -467,14 +468,14 @@ class ServiceWorkLogic extends BaseLogic
             if($work->work_status >=6 ){
                 throw new \Exception('工单状态只能修改待结算之前的');
             }
-            if($work->master_worker_id == $params['master_worker_id']){
+            if($work->master_worker_id == $params['master_worker_id'] && !isset($params['is_grab_order'])){
                 throw new \Exception('分配的工程师相同');
             }
             $worker = MasterWorker::where(['id'=>$params['master_worker_id'],'is_disable' =>0])->findOrEmpty();
             if($worker->isEmpty()){
                 throw new \Exception('工程师不存在或被禁用');
             }
-            if($worker->master_worker_id){
+            if($worker->master_worker_id && !isset($params['is_grab_order'])){
                 MasterWorker::setWorktotal('dec',$worker->master_worker_id);
             }
             $work->master_worker_id = $params['master_worker_id'];
@@ -485,7 +486,7 @@ class ServiceWorkLogic extends BaseLogic
             $work_log = [
                 'work_id'=>$work->id,
                 'master_worker_id'=>$work->master_worker_id,
-                'type' => 0,
+                'type' => isset($params['is_grab_order'])?3:0,
                 'opera_log'=>'后台用户['.$userInfo['admin_id'].']'.$userInfo['name'].'于'.date('Y-m-d H:i:s',time()).'分配了工程师'.'编号['.$worker->worker_number.']'.$worker->real_name
             ];
             ServiceWorkerAllocateWorkerLogic::add($work_log);
@@ -1206,5 +1207,37 @@ class ServiceWorkLogic extends BaseLogic
         }
     }
 
-
+    /**
+     * 工程师抢单
+     */
+    public static function grabOrder($params): bool
+    {
+        if(MasterWorkerLogic::isReceivingOrders($params['master_worker_id'])){
+            Log::info('抢单失败:工程师不能接单:'.$params['id'].'--'.$params['master_worker_id']);
+            self::setError('未达到接单条件');
+            return false;
+        }
+        Db::startTrans();
+        try {
+            // 抢单
+            $serviceWork = ServiceWork::where(['work_pay_status'=>1,'work_status'=>0,'service_status'=>0,'master_worker_id'=>0])
+                ->where('id',$params['id'])->update(['master_worker_id'=>$params['master_worker_id'],'work_status'=>1]);
+            Db::commit();
+            if($serviceWork == 1){
+                Log::info('抢单成功:'.$params['id'].'--'.$params['master_worker_id']);
+                $params['is_grab_order'] = 1;
+                self::allocateWorker($params,['admin_id'=>0,'name'=>'抢单工程师ID:'.$params['master_worker_id']]);
+                return true;
+            }else{
+                Log::info('抢单失败:'.$params['id'].'--'.$params['master_worker_id']);
+                self::setError('抢单失败');
+                return false;
+            }
+        } catch (\Exception $e) {
+            Db::rollback();
+            Log::info('抢单失败:'.$params['id'].'--'.$params['master_worker_id'].':'.$e->getMessage());
+            self::setError('抢单失败');
+            return false;
+        }
+    }
 }

+ 8 - 2
app/workerapi/controller/LoginController.php

@@ -14,6 +14,7 @@
 
 namespace app\workerapi\controller;
 
+use app\common\cache\MasterWokerTokenCache;
 use app\common\enum\notice\NoticeEnum;
 use app\common\model\master_worker\MasterWorker;
 use app\common\model\master_worker_register\MasterWorkerRegister;
@@ -22,6 +23,7 @@ use app\common\model\notice\NoticeSetting;
 use app\common\service\wechat\WeChatOaService;
 use app\workerapi\logic\DictLogic;
 use app\workerapi\logic\LoginLogic;
+use app\workerapi\logic\MasterWorkerLogic;
 use app\workerapi\logic\MasterWorkerRegisterLogic;
 use app\workerapi\validate\LoginAccountValidate;
 use app\workerapi\validate\RegisterValidate;
@@ -123,13 +125,17 @@ class LoginController extends BaseApiController
         if($worker_register->isEmpty()) {
             return $this->fail('请点击下方的工程师入驻',[],402);
         }
-
+        if(isset($params['terminal']) && $params['terminal'] == 5 && $worker_register->worker_id > 0){
+            if(MasterWorkerLogic::isReceivingOrders($worker_register->worker_id)){
+                return $this->fail('未达到接单条件');
+            }
+        }
         $result = LoginLogic::login($params);
         if (false === $result) {
             return $this->fail(LoginLogic::getError());
         }
         //if(!empty($params['wx_code']) and $params['terminal']==1){
-        if(!empty($params['wx_code'])){
+        if(isset($params['wx_code']) && !empty($params['wx_code'])){
             $params['code'] = $params['wx_code'];
             $params['user_id'] = MasterWorker::where('sn',$result['sn'])->value('id');
             $wx_result = LoginLogic::mnpAuthLogin($params);

+ 43 - 0
app/workerapi/controller/WorksController.php

@@ -11,6 +11,8 @@ use app\common\model\works\ServiceWork;
 use app\workerapi\lists\HistoryWorkLists;
 use app\workerapi\lists\ServiceAssignWorkLists;
 use app\workerapi\lists\GoodsFeeStandardsLists;
+use app\workerapi\lists\ServiceWorkGrabOrderLists;
+use app\workerapi\lists\ServiceWorkGrabOrderLogLists;
 use app\workerapi\lists\ServiceWorkLists;
 use app\workerapi\lists\ServiceWorkSparePartLists;
 use app\workerapi\lists\SparePartLists;
@@ -23,6 +25,9 @@ use Exception;
  */
 class WorksController extends BaseApiController
 {
+
+
+    public array $notNeedLogin = ['grabOrder'];
     /**
      * 首页数量统计
      * @return \think\response\Json
@@ -385,4 +390,42 @@ class WorksController extends BaseApiController
         }
         return $this->success('成功', [], 1, 1);
     }
+
+    /**
+     * 工程师抢单池
+     * @return \think\response\Json
+     * @author liugc <466014217@qq.com>
+     * @date 2025/5/7 15:08
+     */
+    public function grabOrderList()
+    {
+        return $this->dataLists(new ServiceWorkGrabOrderLists());
+    }
+    /**
+     * 工程师抢单记录列表
+     * @return \think\response\Json
+     * @author liugc <466014217@qq.com>
+     * @date 2025/5/7 15:08
+     */
+    public function grabOrderLog()
+    {
+        return $this->dataLists(new ServiceWorkGrabOrderLogLists());
+    }
+    /**
+     * 工程师抢单
+     * @return \think\response\Json
+     * @author liugc <466014217@qq.com>
+     * @date 2025/5/7 15:08
+     */
+    public function grabOrder()
+    {
+        $params = (new ServiceWorkValidate())->post()->goCheck('cancel');
+        $result = ServiceWorkLogic::grabOrder(['id'=>$params['id'],'master_worker_id'=>$this->userId]);
+        if (false === $result) {
+            return $this->fail(ServiceWorkLogic::getError());
+        }
+        return $this->success('抢单成功', [], 1, 1);
+    }
+
+
 }

+ 38 - 0
app/workerapi/lists/ServiceWorkGrabOrderLists.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace app\workerapi\lists;
+
+use app\common\model\works\ServiceWork;
+
+class ServiceWorkGrabOrderLists extends BaseWorkerDataLists
+{
+    /**
+     * 获取列表
+     * @return array
+     * @author liugc <466014217@qq.com>
+     * @date 2025/5/8 9:16
+     */
+    public function lists(): array
+    {
+        return ServiceWork::where('appointment_time','>',time())
+            ->where(['work_status'=>0,'service_status'=>0,'work_pay_status'=>1,'master_worker_id'=>0])
+            ->field(['id', 'work_sn', 'address', 'title', 'work_status', 'service_status','work_pay_status', 'appointment_time','receive_time','base_service_fee','service_fee'])
+            ->append(['work_status_text','service_status_text'])
+            ->limit($this->limitOffset, $this->limitLength)
+            ->order(['appointment_time' => 'asc'])
+            ->select()
+            ->toArray();
+    }
+
+
+    /**
+     * 获取数量
+     * @return int
+     * @author liugc <466014217@qq.com>
+     * @date 2025/5/8 9:16
+     */
+    public function count(): int
+    {
+        return ServiceWork::where('appointment_time','>',time())->where(['work_status'=>0,'service_status'=>0,'work_pay_status'=>1,'master_worker_id'=>0])->count();
+    }
+}

+ 46 - 0
app/workerapi/lists/ServiceWorkGrabOrderLogLists.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace app\workerapi\lists;
+
+use app\common\model\works\ServiceWork;
+use app\common\model\works\ServiceWorkAllocateWorkerLog;
+
+class ServiceWorkGrabOrderLogLists extends BaseWorkerDataLists
+{
+    /**
+     * 获取列表 - 15天内
+     * @return array
+     * @author liugc <466014217@qq.com>
+     * @date 2025/5/8 9:16
+     */
+    public function lists(): array
+    {
+        return ServiceWorkAllocateWorkerLog::alias("a")
+            ->join("service_work b","a.work_id = b.id AND a.master_worker_id = b.master_worker_id")
+            ->where('a.type',3)
+            ->where('a.create_time','>',(time()-15*86400))
+            ->where('a.master_worker_id',$this->userId)
+            ->field(['a.opera_log','b.id', 'b.work_sn', 'b.address', 'b.title', 'b.work_status', 'b.service_status','b.work_pay_status', 'b.appointment_time','b.receive_time','b.base_service_fee','b.service_fee'])
+            ->append(['b.work_status_text','b.service_status_text'])
+            ->limit($this->limitOffset, $this->limitLength)
+            ->order(['b.appointment_time' => 'asc'])
+            ->select()
+            ->toArray();
+    }
+
+
+    /**
+     * 获取数量
+     * @return int
+     * @author liugc <466014217@qq.com>
+     * @date 2025/5/8 9:16
+     */
+    public function count(): int
+    {
+        return ServiceWorkAllocateWorkerLog::alias("a")
+            ->join("service_work b","a.work_id = b.id AND a.master_worker_id = b.master_worker_id")
+            ->where('a.type',3)
+            ->where('a.create_time','>',(time()-15*86400))
+            ->where('a.master_worker_id',$this->userId)->count();
+    }
+}

+ 1 - 1
app/workerapi/logic/LoginLogic.php

@@ -156,7 +156,7 @@ class LoginLogic extends BaseLogic
             $user->save();
 
             //设置token
-            $userInfo = MasterWokerTokenService::setToken($user->id, 1);
+            $userInfo = MasterWokerTokenService::setToken($user->id, $params['terminal']??1);
 
             //返回登录信息
             $avatar = $user->avatar ?: Config::get('project.default_image.user_avatar');

+ 56 - 0
app/workerapi/logic/MasterWorkerLogic.php

@@ -426,5 +426,61 @@ class MasterWorkerLogic extends  BaseLogic
         $name = str_replace($specialChars,"",$user);
         return (int)MasterWorkerRegister::where('name',$name)->where('mobile',$mobile)->value('id');
     }
+
+    /**
+     * 工程师是否能接单
+     * @param $userId
+     * @return bool
+     * @author liugc <466014217@qq.com>
+     * @date 2025/5/8 10:07
+     */
+    public static function isReceivingOrders($userId)
+    {
+        try {
+            $masterWorker = MasterWorker::where(['id'=>$userId])->findOrEmpty();
+            if($masterWorker['work_status'] != 0 || $masterWorker['is_disable'] != 0){
+                throw new Exception('该账号已禁用或已长期停单');
+            }
+            if(!self::taskRequired($userId,$masterWorker['identity_source'])){
+                throw new Exception('培训中心必须任务未完成');
+            }
+            $idCard = MasterWorkerInfo::where(['worker_id'=>$userId])->findOrEmpty();
+            if ($idCard->isEmpty()) {
+                throw new Exception('请先完善身份证信息');
+            }
+            if($idCard->audit_state == 0){
+                throw new Exception('身份证信息核验中,请等待核验完成');
+            }
+            if($idCard->audit_state == 2){
+                throw new Exception('身份证信息核验不通过,请重新填写');
+            }
+            $bank = BankAccount::where(['worker_id'=>$userId])->findOrEmpty();
+            if ($bank->isEmpty()) {
+                throw new Exception('请先完善银行卡信息');
+            }
+            if($bank->audit_state == 0){
+                throw new Exception('银行卡信息核验中,请等待核验完成');
+            }
+            if($bank->audit_state == 2){
+                throw new Exception('银行卡信息核验不通过,请重新填写');
+            }
+            $agree = MasterWorkerAgree::where(['worker_id'=>$userId])->findOrEmpty();
+            if ($agree->isEmpty()) {
+                throw new Exception('请先签写协议信息');
+            }
+            if($agree->audit_state == 0){
+                throw new Exception('协议信息核验中,请等待核验完成');
+            }
+            if($agree->audit_state == 2){
+                throw new Exception('协议信息核验不通过,请重新签写');
+            }
+            return true;
+        } catch (\Exception $e) {
+            Log::info($e->getMessage());
+            return false;
+        }
+    }
+
+
     
 }