Kaynağa Gözat

Merge branch 'master' into group_0313

dongxiaoqin 1 yıl önce
ebeveyn
işleme
6261cfaa92
30 değiştirilmiş dosya ile 1022 ekleme ve 115 silme
  1. 116 0
      app/adminapi/controller/external/ExternalConsultationController.php
  2. 9 0
      app/adminapi/controller/external/ExternalPlatformGoodsController.php
  3. 13 4
      app/adminapi/controller/fault_type/FaultTypeController.php
  4. 78 0
      app/adminapi/lists/external/ExternalConsultationLists.php
  5. 19 4
      app/adminapi/lists/fault_code/FaultCodeLists.php
  6. 34 7
      app/adminapi/lists/fault_type/FaultTypeLists.php
  7. 2 2
      app/adminapi/lists/master_worker/MasterWorkerLists.php
  8. 34 13
      app/adminapi/lists/master_worker/MasterWorkerServiceOrderLists.php
  9. 184 0
      app/adminapi/logic/external/ExternalConsultationLogic.php
  10. 30 0
      app/adminapi/logic/external/ExternalPlatformGoodsLogic.php
  11. 20 6
      app/adminapi/logic/fault_code/FaultCodeLogic.php
  12. 7 17
      app/adminapi/logic/fault_type/FaultTypeLogic.php
  13. 1 1
      app/adminapi/logic/master_worker/MasterWorkerLogic.php
  14. 43 14
      app/adminapi/logic/works/ServiceWorkLogic.php
  15. 94 0
      app/adminapi/validate/external/ExternalConsultationValidate.php
  16. 6 4
      app/adminapi/validate/fault_code/FaultCodeValidate.php
  17. 4 3
      app/adminapi/validate/works/ServiceWorkValidate.php
  18. 1 1
      app/api/controller/notify/UserConfirmController.php
  19. 148 5
      app/api/logic/PerformanceLogic.php
  20. 12 4
      app/api/logic/ServiceOrderLogic.php
  21. 31 9
      app/common/controller/InternalApiController.php
  22. 4 5
      app/common/logic/ThirdOrderLogic.php
  23. 43 0
      app/common/model/external/ExternalConsultation.php
  24. 3 1
      app/common/model/fault_type/FaultType.php
  25. 58 11
      app/workerapi/controller/FaultCodeController.php
  26. 18 1
      app/workerapi/controller/WorksController.php
  27. 2 2
      app/workerapi/lists/FaultCodeLists.php
  28. 4 1
      app/workerapi/logic/MasterWorkerRegisterLogic.php
  29. 4 0
      app/workerapi/validate/ServiceWorkValidate.php
  30. BIN
      public/resource/外部商品导入--批次x模板.xlsx

+ 116 - 0
app/adminapi/controller/external/ExternalConsultationController.php

@@ -0,0 +1,116 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeadmin快速开发前后端分离管理后台(PHP版)
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | 开源版本可自由商用,可去除界面版权logo
+// | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
+// | github下载:https://github.com/likeshop-github/likeadmin
+// | 访问官网:https://www.likeadmin.cn
+// | likeadmin团队 版权所有 拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeadminTeam
+// +----------------------------------------------------------------------
+
+
+namespace app\adminapi\controller\external;
+
+
+use app\adminapi\controller\BaseAdminController;
+use app\adminapi\lists\external\ExternalConsultationLists;
+use app\adminapi\logic\external\ExternalConsultationLogic;
+use app\adminapi\validate\external\ExternalConsultationValidate;
+
+
+/**
+ * ExternalConsultation控制器
+ * Class ExternalConsultationController
+ * @package app\adminapi\controller
+ */
+class ExternalConsultationController extends BaseAdminController
+{
+
+
+    /**
+     * @notes 获取列表
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public function lists()
+    {
+        return $this->dataLists(new ExternalConsultationLists());
+    }
+
+
+    /**
+     * @notes 添加
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public function add()
+    {
+        $params = (new ExternalConsultationValidate())->post()->goCheck('add');
+        $result = ExternalConsultationLogic::add($params);
+        if (true === $result) {
+            return $this->success('添加成功', [], 1, 1);
+        }
+        return $this->fail(ExternalConsultationLogic::getError());
+    }
+
+
+    /**
+     * @notes 编辑
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public function edit()
+    {
+        $params = (new ExternalConsultationValidate())->post()->goCheck('edit');
+        $result = ExternalConsultationLogic::edit($params);
+        if (true === $result) {
+            return $this->success('编辑成功', [], 1, 1);
+        }
+        return $this->fail(ExternalConsultationLogic::getError());
+    }
+
+    public function order()
+    {
+        $params = (new ExternalConsultationValidate())->post()->goCheck('edit');
+        $result = ExternalConsultationLogic::order($params);
+        if (true === $result) {
+            return $this->success('编辑成功', [], 1, 1);
+        }
+        return $this->fail(ExternalConsultationLogic::getError());
+    }
+    /**
+     * @notes 删除
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public function delete()
+    {
+        $params = (new ExternalConsultationValidate())->post()->goCheck('delete');
+        ExternalConsultationLogic::delete($params);
+        return $this->success('删除成功', [], 1, 1);
+    }
+
+
+    /**
+     * @notes 获取详情
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public function detail()
+    {
+        $params = (new ExternalConsultationValidate())->goCheck('detail');
+        $result = ExternalConsultationLogic::detail($params);
+        return $this->data($result);
+    }
+
+
+}

+ 9 - 0
app/adminapi/controller/external/ExternalPlatformGoodsController.php

@@ -105,4 +105,13 @@ class ExternalPlatformGoodsController extends BaseAdminController
     }
     }
 
 
 
 
+    public function goodsImport()
+    {
+        $params = $this->request->post();
+        $result = ExternalPlatformGoodsLogic::goodsImport($params);
+        if (true === $result) {
+            return $this->success('导入成功', [], 1, 1);
+        }
+        return $this->fail(ExternalPlatformGoodsLogic::getError());
+    }
 }
 }

+ 13 - 4
app/adminapi/controller/fault_type/FaultTypeController.php

@@ -30,6 +30,18 @@ use app\adminapi\validate\fault_type\FaultTypeValidate;
 class FaultTypeController extends BaseAdminController
 class FaultTypeController extends BaseAdminController
 {
 {
 
 
+    /**
+     * @notes 获取列表
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2024/10/18 15:09
+     */
+    public function listsByPid()
+    {
+        $pid = $this->request->get('pid',0);
+        $result = FaultTypeLogic::listsByPid($pid);
+        return $this->success('',$result);
+    }
 
 
     /**
     /**
      * @notes 获取列表
      * @notes 获取列表
@@ -39,10 +51,7 @@ class FaultTypeController extends BaseAdminController
      */
      */
     public function lists()
     public function lists()
     {
     {
-        //return $this->dataLists(new FaultTypeLists());
-        $params = $this->request->get();
-        $result = FaultTypeLogic::lists($params);
-        return $this->success('',$result);
+        return $this->dataLists(new FaultTypeLists());
     }
     }
 
 
 
 

+ 78 - 0
app/adminapi/lists/external/ExternalConsultationLists.php

@@ -0,0 +1,78 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeadmin快速开发前后端分离管理后台(PHP版)
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | 开源版本可自由商用,可去除界面版权logo
+// | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
+// | github下载:https://github.com/likeshop-github/likeadmin
+// | 访问官网:https://www.likeadmin.cn
+// | likeadmin团队 版权所有 拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeadminTeam
+// +----------------------------------------------------------------------
+
+namespace app\adminapi\lists\external;
+
+
+use app\adminapi\lists\BaseAdminDataLists;
+use app\common\model\external\ExternalConsultation;
+use app\common\lists\ListsSearchInterface;
+
+
+/**
+ * ExternalConsultation列表
+ * Class ExternalConsultationLists
+ * @package app\adminapi\lists
+ */
+class ExternalConsultationLists extends BaseAdminDataLists implements ListsSearchInterface
+{
+
+
+    /**
+     * @notes 设置搜索条件
+     * @return \string[][]
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public function setSearch(): array
+    {
+        return [
+            '=' => ['external_platform_id'],
+            '%like%' => ['user_name', 'mobile', 'unique_code'],
+        ];
+    }
+
+
+    /**
+     * @notes 获取列表
+     * @return array
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public function lists(): array
+    {
+        return ExternalConsultation::with(['goods'])->where($this->searchWhere)
+            ->field(['*'])
+            ->limit($this->limitOffset, $this->limitLength)
+            ->order(['id' => 'desc'])
+            ->select()
+            ->toArray();
+    }
+
+
+    /**
+     * @notes 获取数量
+     * @return int
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public function count(): int
+    {
+        return ExternalConsultation::where($this->searchWhere)->count();
+    }
+
+}

+ 19 - 4
app/adminapi/lists/fault_code/FaultCodeLists.php

@@ -16,8 +16,9 @@ namespace app\adminapi\lists\fault_code;
 
 
 
 
 use app\adminapi\lists\BaseAdminDataLists;
 use app\adminapi\lists\BaseAdminDataLists;
-use app\common\model\fault_code\FaultCode;
 use app\common\lists\ListsSearchInterface;
 use app\common\lists\ListsSearchInterface;
+use app\common\model\fault_code\FaultCode;
+use app\common\model\fault_type\FaultType;
 
 
 
 
 /**
 /**
@@ -38,11 +39,24 @@ class FaultCodeLists extends BaseAdminDataLists implements ListsSearchInterface
     public function setSearch(): array
     public function setSearch(): array
     {
     {
         return [
         return [
-            '=' => ['status','type_id'],
-            '%like%' => ['codes', 'fault_name', 'detail'],
+            '=' => ['status'],
+            '%like%' => ['codes', 'name', 'detail'],
         ];
         ];
     }
     }
 
 
+    public function queryWhere()
+    {
+        $where = [];
+        if (isset($this->params['type_id']) && $this->params['type_id'] !== '') {
+            $pid = FaultType::where('id', $this->params['type_id'])->value('pid');
+            if ($pid == 0) {
+                $where[] = ['type_id', 'in', FaultType::where('pid', $this->params['type_id'])->column('id')];
+            } else {
+                $where[] = ['type_id', '=', $this->params['type_id']];
+            }
+        }
+        return $where;
+    }
 
 
     /**
     /**
      * @notes 获取列表
      * @notes 获取列表
@@ -56,6 +70,7 @@ class FaultCodeLists extends BaseAdminDataLists implements ListsSearchInterface
     public function lists(): array
     public function lists(): array
     {
     {
         return FaultCode::with(['faultType'])->where($this->searchWhere)
         return FaultCode::with(['faultType'])->where($this->searchWhere)
+            ->where($this->queryWhere())
             ->field(['*'])
             ->field(['*'])
             ->limit($this->limitOffset, $this->limitLength)
             ->limit($this->limitOffset, $this->limitLength)
             ->order(['id' => 'desc'])
             ->order(['id' => 'desc'])
@@ -72,7 +87,7 @@ class FaultCodeLists extends BaseAdminDataLists implements ListsSearchInterface
      */
      */
     public function count(): int
     public function count(): int
     {
     {
-        return FaultCode::where($this->searchWhere)->count();
+        return FaultCode::where($this->searchWhere)->where($this->queryWhere())->count();
     }
     }
 
 
 }
 }

+ 34 - 7
app/adminapi/lists/fault_type/FaultTypeLists.php

@@ -38,11 +38,29 @@ class FaultTypeLists extends BaseAdminDataLists implements ListsSearchInterface
     public function setSearch(): array
     public function setSearch(): array
     {
     {
         return [
         return [
-            '=' => ['name', 'pid', 'sort', 'level', 'status'],
-
+            '=' => ['pid', 'sort', 'level', 'goods_category_id'],
         ];
         ];
     }
     }
 
 
+    public function queryWhere()
+    {
+        $where = [];
+        if (isset($this->params['status']) && $this->params['status'] != '') {
+            $where[] = ['a.status', '=', $this->params['status']];
+        }
+        if (!empty($this->params['name'])) {
+            $where[] = ['a.name', 'like', '%' . $this->params['name'] . '%'];
+        }
+        if (!empty($this->params['category_name'])) {
+            $where[] = ['b.name', 'like', '%' . $this->params['category_name'] . '%'];
+        }
+        if (!empty($this->params['category_type'])) {
+            $where[] = ['a.category_type', '=', $this->params['category_type']];
+        }
+        $where[] = ['a.pid', '=', 0];
+        return $where;
+    }
+
 
 
     /**
     /**
      * @notes 获取列表
      * @notes 获取列表
@@ -55,15 +73,20 @@ class FaultTypeLists extends BaseAdminDataLists implements ListsSearchInterface
      */
      */
     public function lists(): array
     public function lists(): array
     {
     {
-        return FaultType::where($this->searchWhere)
-            ->field(['id', 'name', 'pid', 'sort', 'level', 'status'])
+        $lists = FaultType::alias("a")
+            ->with(['children'])
+            ->leftJoin("goods_category b", "a.goods_category_id = b.id")
+            ->where($this->searchWhere)
+            ->where($this->queryWhere())
+            ->field("a.*,b.name as category_name")
             ->limit($this->limitOffset, $this->limitLength)
             ->limit($this->limitOffset, $this->limitLength)
-            ->order(['id' => 'desc'])
+            ->append(['status_desc'])
+            ->order(['a.sort' => 'desc', 'a.id' => 'desc'])
             ->select()
             ->select()
             ->toArray();
             ->toArray();
+        return $lists;
     }
     }
 
 
-
     /**
     /**
      * @notes 获取数量
      * @notes 获取数量
      * @return int
      * @return int
@@ -72,7 +95,11 @@ class FaultTypeLists extends BaseAdminDataLists implements ListsSearchInterface
      */
      */
     public function count(): int
     public function count(): int
     {
     {
-        return FaultType::where($this->searchWhere)->count();
+        return FaultType::alias("a")
+            ->where($this->searchWhere)
+            ->where($this->queryWhere())
+            ->leftJoin("goods_category b", "a.goods_category_id = b.id")
+            ->count();
     }
     }
 
 
 }
 }

+ 2 - 2
app/adminapi/lists/master_worker/MasterWorkerLists.php

@@ -171,8 +171,8 @@ class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterfa
             $distanceWhereSql .= ' and is_disable=0  AND work_status=0  AND accept_order_status=1 and service_area_id = '.$this->service_area_id;
             $distanceWhereSql .= ' and is_disable=0  AND work_status=0  AND accept_order_status=1 and service_area_id = '.$this->service_area_id;
         }
         }
         $list = MasterWorker::alias('mw')
         $list = MasterWorker::alias('mw')
-            ->join('master_worker_register mwr', 'mwr.worker_id = mw.id')
-            ->join('master_worker_score mws', 'mws.worker_id = mw.id')
+            ->leftJoin('master_worker_register mwr', 'mwr.worker_id = mw.id')
+            ->leftJoin('master_worker_score mws', 'mws.worker_id = mw.id')
             ->where($this->searchWhere)
             ->where($this->searchWhere)
             ->where($queryWhere)
             ->where($queryWhere)
             ->where($this->queryDataWhere())
             ->where($this->queryDataWhere())

+ 34 - 13
app/adminapi/lists/master_worker/MasterWorkerServiceOrderLists.php

@@ -35,6 +35,9 @@ class MasterWorkerServiceOrderLists extends BaseAdminDataLists implements ListsS
     public function queryWhere()
     public function queryWhere()
     {
     {
         $where = [];
         $where = [];
+        if (isset($this->params['city']) && !empty($this->params['city'])) {
+            $where[] = ['a.city','=' ,$this->params['city']];
+        }
         if (isset($this->params['real_name']) && !empty($this->params['real_name'])) {
         if (isset($this->params['real_name']) && !empty($this->params['real_name'])) {
             $where[] = ['a.real_name','like' ,"%".$this->params['real_name']."%"];
             $where[] = ['a.real_name','like' ,"%".$this->params['real_name']."%"];
         }
         }
@@ -80,16 +83,26 @@ class MasterWorkerServiceOrderLists extends BaseAdminDataLists implements ListsS
         if (isset($this->params['cooperation']) && !empty($this->params['cooperation'])) {
         if (isset($this->params['cooperation']) && !empty($this->params['cooperation'])) {
             $where[] = ['a.cooperation','=' ,$this->params['cooperation']];
             $where[] = ['a.cooperation','=' ,$this->params['cooperation']];
         }
         }
+        // ( ( b.finished_time >= 1743436800  AND b.finished_time < 1746028800 ) or ( b.create_time >= 1743436800  AND b.create_time < 1746028800) )
+        if (!empty($this->params['start_time']) && !empty($this->params['end_time'])) {
+            $this->sqlJoin = ' and ( ( b.finished_time >= '.strtotime($this->params['start_time']).'  AND b.finished_time < '.strtotime($this->params['end_time']).' ) or ( b.create_time >= '.strtotime($this->params['start_time']).'  AND b.create_time < '.strtotime($this->params['end_time']).') )';
+        }
+        //dd($this->sqlJoin);
+        $where[] = ['a.audit_state','=' ,1];
+        return $where;
+    }
+    public function queryWhereLog()
+    {
+        $where = [];
         if (!empty($this->params['start_time'])) {
         if (!empty($this->params['start_time'])) {
-            $this->sqlJoin .= '    AND  b.update_time >= '.strtotime($this->params['start_time']);
+            $where[0] = strtotime($this->params['start_time']);
         }
         }
         if (!empty($this->params['end_time'])) {
         if (!empty($this->params['end_time'])) {
-            $this->sqlJoin .= '    AND  b.update_time < '.strtotime($this->params['end_time'])+86400;
+            $where[1] = strtotime($this->params['end_time'])+86400;
         }
         }
-        $where[] = ['a.audit_state','=' ,1];
+        //dd($where);
         return $where;
         return $where;
     }
     }
-
     /**
     /**
      * 获取数据权限
      * 获取数据权限
      * $this->adminInfo['data_rules']
      * $this->adminInfo['data_rules']
@@ -121,18 +134,21 @@ class MasterWorkerServiceOrderLists extends BaseAdminDataLists implements ListsS
     public function lists(): array
     public function lists(): array
     {
     {
         $queryWhere = $this->queryWhere();
         $queryWhere = $this->queryWhere();
+        $queryWhereLog = $this->queryWhereLog();
         $lists = Db::name('master_worker')->alias('a')->field([
         $lists = Db::name('master_worker')->alias('a')->field([
-                'a.id','a.real_name','a.nickname','a.worker_number','a.recruiting_behalf','a.mobile','a.cooperation','a.category_ids','a.labels','a.remark',
-                Db::raw("COUNT(b.id) AS all_count"),
+                'a.id','a.real_name','a.nickname','a.area_name','a.worker_number','a.recruiting_behalf','a.mobile','a.cooperation','a.category_ids','a.labels','a.remark',
+                Db::raw("SUM( CASE WHEN b.work_status > 1 THEN 1 ELSE 0 END ) AS accepting_count"),
                 Db::raw("SUM(CASE WHEN b.service_status = 3 THEN 1 ELSE 0 END) AS success_count"),
                 Db::raw("SUM(CASE WHEN b.service_status = 3 THEN 1 ELSE 0 END) AS success_count"),
                 Db::raw("SUM(CASE WHEN b.service_status = 4 OR b.service_status = 5 THEN 1 ELSE 0 END) AS fail_count"),
                 Db::raw("SUM(CASE WHEN b.service_status = 4 OR b.service_status = 5 THEN 1 ELSE 0 END) AS fail_count"),
-                Db::raw("SUM(CASE WHEN b.service_status = 3 THEN b.work_total ELSE 0 END) work_total"),
-                Db::raw("SUM(CASE WHEN b.service_status = 3 THEN b.worker_price ELSE 0 END) worker_price"),
+                Db::raw("SUM(CASE WHEN b.service_status = 3 THEN b.work_amount ELSE 0 END) work_amount_sum"),
+                //工程师结算金额:实际提成金额(含配件费+加单费)+质保金
+                Db::raw("SUM(CASE WHEN b.service_status = 3 THEN (b.settlement_amount+b.earnest_money) ELSE 0 END) worker_settlement_sum"),
             ])
             ])
             ->leftJoin('service_work b', 'a.id = b.master_worker_id'.$this->sqlJoin)
             ->leftJoin('service_work b', 'a.id = b.master_worker_id'.$this->sqlJoin)
             ->where($queryWhere)
             ->where($queryWhere)
             ->where($this->queryDataWhere())
             ->where($this->queryDataWhere())
             ->group('a.id')
             ->group('a.id')
+            //->having('success_count>0 OR fail_count>0 OR work_amount_sum>0 OR worker_settlement_sum>0')
             ->order('a.id desc')
             ->order('a.id desc')
             ->limit($this->limitOffset, $this->limitLength)
             ->limit($this->limitOffset, $this->limitLength)
             ->select()->toArray();
             ->select()->toArray();
@@ -142,7 +158,10 @@ class MasterWorkerServiceOrderLists extends BaseAdminDataLists implements ListsS
         foreach ($lists as &$item) {
         foreach ($lists as &$item) {
             $item['labels'] = $item['labels']?array_map(function ($item) { return intval($item); },explode(',',$item['labels'])):'';
             $item['labels'] = $item['labels']?array_map(function ($item) { return intval($item); },explode(',',$item['labels'])):'';
             $item['category_name'] = $item['category_ids']?implode('、',array_column(get_parent_info($categoryData,explode(',',$item['category_ids'])),'name')):'';
             $item['category_name'] = $item['category_ids']?implode('、',array_column(get_parent_info($categoryData,explode(',',$item['category_ids'])),'name')):'';
-            $item['allocate_num'] = ServiceWorkAllocateWorkerLog::where(['master_worker_id'=>$item['id']])->count();
+            $item['allocate_num'] = ServiceWorkAllocateWorkerLog::where(['master_worker_id'=>$item['id']])
+                                    ->where('type',0)
+                                    ->whereBetweenTime('create_time',$queryWhereLog[0],$queryWhereLog[1])
+                                    ->count();
             $item['register_info'] = $masterWorkerRegisters[$item['id']]??[];
             $item['register_info'] = $masterWorkerRegisters[$item['id']]??[];
         }
         }
         return $lists;
         return $lists;
@@ -160,15 +179,17 @@ class MasterWorkerServiceOrderLists extends BaseAdminDataLists implements ListsS
         $queryWhere = $this->queryWhere();
         $queryWhere = $this->queryWhere();
         return Db::name('master_worker')->alias('a')->field([
         return Db::name('master_worker')->alias('a')->field([
                 'a.id','a.real_name','a.nickname','a.worker_number','a.recruiting_behalf',
                 'a.id','a.real_name','a.nickname','a.worker_number','a.recruiting_behalf',
+                Db::raw("SUM( CASE WHEN b.work_status > 1 THEN 1 ELSE 0 END ) AS accepting_count"),
                 Db::raw("SUM(CASE WHEN b.service_status = 3 THEN 1 ELSE 0 END) AS success_count"),
                 Db::raw("SUM(CASE WHEN b.service_status = 3 THEN 1 ELSE 0 END) AS success_count"),
                 Db::raw("SUM(CASE WHEN b.service_status = 4 OR b.service_status = 5 THEN 1 ELSE 0 END) AS fail_count"),
                 Db::raw("SUM(CASE WHEN b.service_status = 4 OR b.service_status = 5 THEN 1 ELSE 0 END) AS fail_count"),
-                Db::raw("SUM(b.work_total) work_total"),
-                Db::raw("SUM(b.worker_price) worker_price"),
+                Db::raw("SUM(CASE WHEN b.service_status = 3 THEN b.work_amount ELSE 0 END) work_amount_sum"),
+                Db::raw("SUM(CASE WHEN b.service_status = 3 THEN (b.settlement_amount+b.earnest_money) ELSE 0 END) worker_settlement_sum"),
             ])
             ])
             ->leftJoin('service_work b', 'a.id = b.master_worker_id'.$this->sqlJoin)
             ->leftJoin('service_work b', 'a.id = b.master_worker_id'.$this->sqlJoin)
             ->where($queryWhere)
             ->where($queryWhere)
             ->where($this->queryDataWhere())
             ->where($this->queryDataWhere())
             ->group('a.id')
             ->group('a.id')
+            //->having('success_count>0 OR fail_count>0 OR work_amount_sum>0 OR worker_settlement_sum>0')
             ->count();
             ->count();
     }
     }
 
 
@@ -178,7 +199,7 @@ class MasterWorkerServiceOrderLists extends BaseAdminDataLists implements ListsS
         $zh_cn_fields = [
         $zh_cn_fields = [
             '工程师ID', '服务类别', '工程师编号', '工程师姓名', '工程师手机',
             '工程师ID', '服务类别', '工程师编号', '工程师姓名', '工程师手机',
             '工程师备注', '工程师合作形式','代招人姓名', '派单数', '工程师接单数', '标签',
             '工程师备注', '工程师合作形式','代招人姓名', '派单数', '工程师接单数', '标签',
-            '工程师成功单','工程师失败单','工程师成交金额','工程师提成金额'
+            '工程师成功单','工程师失败单','实付金额','工程师结算金额'
         ];
         ];
         $data_fields = [
         $data_fields = [
             'id', 'category_name', 'worker_number', 'real_name', 'mobile',
             'id', 'category_name', 'worker_number', 'real_name', 'mobile',
@@ -194,7 +215,7 @@ class MasterWorkerServiceOrderLists extends BaseAdminDataLists implements ListsS
                 }
                 }
                 return $row['labels']?:'';
                 return $row['labels']?:'';
             },
             },
-            'success_count', 'fail_count', 'work_total', 'worker_price'
+            'success_count', 'fail_count', 'work_amount_sum', 'worker_settlement_sum'
         ];
         ];
         return [
         return [
             'zh_cn_fields' => $zh_cn_fields,
             'zh_cn_fields' => $zh_cn_fields,

+ 184 - 0
app/adminapi/logic/external/ExternalConsultationLogic.php

@@ -0,0 +1,184 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeadmin快速开发前后端分离管理后台(PHP版)
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | 开源版本可自由商用,可去除界面版权logo
+// | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
+// | github下载:https://github.com/likeshop-github/likeadmin
+// | 访问官网:https://www.likeadmin.cn
+// | likeadmin团队 版权所有 拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeadminTeam
+// +----------------------------------------------------------------------
+
+namespace app\adminapi\logic\external;
+
+
+use app\common\logic\ThirdOrderLogic;
+use app\common\model\external\ExternalConsultation;
+use app\common\logic\BaseLogic;
+use think\facade\Db;
+
+
+/**
+ * ExternalConsultation逻辑
+ * Class ExternalConsultationLogic
+ * @package app\adminapi\logic
+ */
+class ExternalConsultationLogic extends BaseLogic
+{
+
+
+    /**
+     * @notes 添加
+     * @param array $params
+     * @return bool
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public static function add(array $params): bool
+    {
+        Db::startTrans();
+        try {
+            ExternalConsultation::create([
+                'external_platform_id' => $params['external_platform_id'],
+                'shop_code' => $params['shop_code'],
+                'shop_name' => $params['shop_name'],
+                'unique_code' => $params['unique_code'],
+                'solution_type' => $params['solution_type'],
+                'form_detail' => $params['form_detail'],
+                'user_name' => $params['user_name'],
+                'mobile' => $params['mobile'],
+                'user_address' => $params['user_address'],
+                'appointment_time' => $params['appointment_time'],
+                'goods_id' => $params['goods_id'],
+                'amount' => $params['amount'],
+                'lon' => $params['lon'],
+                'lat' => $params['lat'],
+                'remark' => $params['remark']
+            ]);
+
+            Db::commit();
+            return true;
+        } catch (\Exception $e) {
+            Db::rollback();
+            self::setError($e->getMessage());
+            return false;
+        }
+    }
+
+
+    /**
+     * @notes 编辑
+     * @param array $params
+     * @return bool
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public static function edit(array $params): bool
+    {
+        Db::startTrans();
+        try {
+            ExternalConsultation::where('id', $params['id'])->update([
+                'external_platform_id' => $params['external_platform_id'],
+                'shop_code' => $params['shop_code'],
+                'shop_name' => $params['shop_name'],
+                'unique_code' => $params['unique_code'],
+                'solution_type' => $params['solution_type'],
+                'form_detail' => $params['form_detail'],
+                'user_name' => $params['user_name'],
+                'mobile' => $params['mobile'],
+                'user_address' => $params['user_address'],
+                'appointment_time' => $params['appointment_time'],
+                'goods_id' => $params['goods_id'],
+                'amount' => $params['amount'],
+                'lon' => $params['lon'],
+                'lat' => $params['lat'],
+                'remark' => $params['remark']
+            ]);
+
+            Db::commit();
+            return true;
+        } catch (\Exception $e) {
+            Db::rollback();
+            self::setError($e->getMessage());
+            return false;
+        }
+    }
+    public static function order(array $params): bool
+    {
+        if($params['user_address']){
+            $lon_lat = get_address_lat_lng($params['user_address']);
+            $params['lon'] = $lon_lat['lon'];
+            $params['lat'] = $lon_lat['lat'];
+        }
+        Db::startTrans();
+        try {
+
+            // userName mobile goods_id userAddress amount appointment_time lon lat
+            $work_id = ThirdOrderLogic::submitOrders([
+                'userName' => $params['user_name'],
+                'mobile' => $params['mobile'],
+                'goods_id' => $params['goods_id'],
+                'userAddress' => $params['user_address'],
+                'amount' => $params['amount'],
+                'appointment_time' => $params['appointment_time'],
+                'lon' => $params['lon'],
+                'lat' => $params['lat']
+            ]);
+            if($work_id === false){
+                $work_id = 0;
+            }
+            ExternalConsultation::where('id', $params['id'])->update([
+                'external_platform_id' => $params['external_platform_id'],
+                'shop_code' => $params['shop_code'],
+                'shop_name' => $params['shop_name'],
+                'unique_code' => $params['unique_code'],
+                'solution_type' => $params['solution_type'],
+                'form_detail' => $params['form_detail'],
+                'user_name' => $params['user_name'],
+                'mobile' => $params['mobile'],
+                'user_address' => $params['user_address'],
+                'appointment_time' => $params['appointment_time'],
+                'goods_id' => $params['goods_id'],
+                'amount' => $params['amount'],
+                'lon' => $params['lon'],
+                'lat' => $params['lat'],
+                'work_id' => $work_id,
+                'remark' => $params['remark']
+            ]);
+            Db::commit();
+            return true;
+        } catch (\Exception $e) {
+            Db::rollback();
+            self::setError($e->getMessage());
+            return false;
+        }
+    }
+
+    /**
+     * @notes 删除
+     * @param array $params
+     * @return bool
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public static function delete(array $params): bool
+    {
+        return ExternalConsultation::destroy($params['id']);
+    }
+
+
+    /**
+     * @notes 获取详情
+     * @param $params
+     * @return array
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public static function detail($params): array
+    {
+        return ExternalConsultation::findOrEmpty($params['id'])->toArray();
+    }
+}

+ 30 - 0
app/adminapi/logic/external/ExternalPlatformGoodsLogic.php

@@ -111,4 +111,34 @@ class ExternalPlatformGoodsLogic extends BaseLogic
     {
     {
         return ExternalPlatformGoods::findOrEmpty($params['id'])->toArray();
         return ExternalPlatformGoods::findOrEmpty($params['id'])->toArray();
     }
     }
+
+    public static function goodsImport($datas)
+    {
+        $newArray = [];
+        $time = time();
+        foreach ($datas as $key => $data) {
+            $newArray[$key]['service_fee'] = $data['service_fee']?:0;
+            $newArray[$key]['goods_status'] = 1;
+            $newArray[$key]['create_time'] = $time;
+            $newArray[$key]['update_time'] = $time;
+            $newArray[$key]['goods_id'] = $data['goods_id'];
+            $newArray[$key]['external_goods_sn'] = $data['external_goods_sn'];
+            $newArray[$key]['external_platform_id'] = $data['external_platform_id'];
+        }
+
+        Db::startTrans();
+        try {
+
+            ExternalPlatformGoods::insertAll($newArray);
+
+            Db::commit();
+            return true;
+        } catch (\Exception $e) {
+            Db::rollback();
+            self::setError($e->getMessage());
+            return false;
+        }
+    }
+
+
 }
 }

+ 20 - 6
app/adminapi/logic/fault_code/FaultCodeLogic.php

@@ -42,9 +42,8 @@ class FaultCodeLogic extends BaseLogic
         try {
         try {
             FaultCode::create([
             FaultCode::create([
                 'type_id' => $params['type_id'],
                 'type_id' => $params['type_id'],
-                'codes' => $params['codes'],
-                'fault_name' => $params['fault_name'],
-                'detail' => $params['detail'],
+                'name' => $params['name'],
+                'price' => $params['price'],
                 'status' => $params['status'],
                 'status' => $params['status'],
             ]);
             ]);
 
 
@@ -71,9 +70,8 @@ class FaultCodeLogic extends BaseLogic
         try {
         try {
             FaultCode::where('id', $params['id'])->update([
             FaultCode::where('id', $params['id'])->update([
                 'type_id' => $params['type_id'],
                 'type_id' => $params['type_id'],
-                'codes' => $params['codes'],
-                'fault_name' => $params['fault_name'],
-                'detail' => $params['detail'],
+                'name' => $params['name'],
+                'price' => $params['price'],
                 'status' => $params['status'],
                 'status' => $params['status'],
             ]);
             ]);
 
 
@@ -111,4 +109,20 @@ class FaultCodeLogic extends BaseLogic
     {
     {
         return FaultCode::findOrEmpty($params['id'])->toArray();
         return FaultCode::findOrEmpty($params['id'])->toArray();
     }
     }
+
+    public static function lists($params)
+    {
+        $where = [];
+        if (!empty($params['type_id'])) {
+            $where[] = ['type_id', '=', $params['type_id']];
+        }
+
+        $lists = FaultCode::where('status',1)
+            ->where($where)
+            ->field('id,name,price,type_id')
+            ->limit(100)
+            ->select()
+            ->toArray();
+        return $lists;
+    }
 }
 }

+ 7 - 17
app/adminapi/logic/fault_type/FaultTypeLogic.php

@@ -27,27 +27,16 @@ use think\facade\Db;
  */
  */
 class FaultTypeLogic extends BaseLogic
 class FaultTypeLogic extends BaseLogic
 {
 {
-    public static function lists($params)
+    //获取一级分类
+    public static function listsByPid($pid = 0)
     {
     {
-        $where = [];
-        if (!empty($params['name'])) {
-            $where[] = ['name', 'like', '%' . $params['name'] . '%'];
-        }
-        if (isset($params['status']) && $params['status'] != '') {
-            $where[] = ['status', '=', $params['status']];
-        }
-        $lists = FaultType::where($where)
-            ->append(['status_desc'])
-            ->order(['sort' => 'desc', 'id' => 'desc'])
+        $lists = FaultType::where("pid", $pid)
+            ->field("id,pid,name")
             ->select()
             ->select()
             ->toArray();
             ->toArray();
-
-        $pid = 0;
-        if (!empty($lists)) {
-            $pid = min(array_column($lists, 'pid'));
-        }
-        return self::getTree($lists, $pid);
+        return $lists;
     }
     }
+
     public static function getTree($array, $pid = 0, $level = 0)
     public static function getTree($array, $pid = 0, $level = 0)
     {
     {
         $list = [];
         $list = [];
@@ -159,6 +148,7 @@ class FaultTypeLogic extends BaseLogic
     public static function getAllData($search = 'all')
     public static function getAllData($search = 'all')
     {
     {
         $data = FaultType::where('status',1)
         $data = FaultType::where('status',1)
+            ->field('id,pid,name,sort,category_type,goods_category_id')
             ->order(['sort'=> 'desc','id' => 'desc'])
             ->order(['sort'=> 'desc','id' => 'desc'])
             ->select()
             ->select()
             ->toArray();
             ->toArray();

+ 1 - 1
app/adminapi/logic/master_worker/MasterWorkerLogic.php

@@ -248,7 +248,7 @@ class MasterWorkerLogic extends BaseLogic
             $info['is_up_retention_pay'] = 1;
             $info['is_up_retention_pay'] = 1;
         }
         }
         $info['score'] = MasterWorkerScore::where(['worker_id' => $params['id']])->field('comprehensive_score,weight_score')->findOrEmpty()->toArray();
         $info['score'] = MasterWorkerScore::where(['worker_id' => $params['id']])->field('comprehensive_score,weight_score')->findOrEmpty()->toArray();
-        $images = MasterWorkerCredentialImages::where(['worker_register_id' => $info['workerRegister']['worker_register_id']])->select()->toArray();
+        $images = MasterWorkerCredentialImages::where(['worker_register_id' => $info['workerRegister']['worker_register_id']??-1])->select()->toArray();
         $info['credential_info'] = $images;
         $info['credential_info'] = $images;
         return $info;
         return $info;
     }
     }

+ 43 - 14
app/adminapi/logic/works/ServiceWorkLogic.php

@@ -14,6 +14,7 @@
 
 
 namespace app\adminapi\logic\works;
 namespace app\adminapi\logic\works;
 
 
+use app\adminapi\logic\user\UserLogic;
 use app\common\enum\ThirdTypeEnum;
 use app\common\enum\ThirdTypeEnum;
 use app\common\enum\worker\WorkerAccountLogEnum;
 use app\common\enum\worker\WorkerAccountLogEnum;
 use app\common\logic\ThirdOrderLogic;
 use app\common\logic\ThirdOrderLogic;
@@ -69,9 +70,17 @@ class ServiceWorkLogic extends BaseLogic
     {
     {
         Db::startTrans();
         Db::startTrans();
         try {
         try {
-            
+            $userId = UserLogic::getUserIdByMobile($params['mobile']);
             $service_area_id = ServiceArea::serviceAreaId(['lon' => $params['lon'], 'lat' => $params['lat']]);
             $service_area_id = ServiceArea::serviceAreaId(['lon' => $params['lon'], 'lat' => $params['lat']]);
+            if($params['address'] && (empty($params['lon']) ||  empty($params['lat']))){
+                $lon_lat = get_address_lat_lng($params['address']);
+                $params['lon'] = $lon_lat['lon'];
+                $params['lat'] = $lon_lat['lat'];
+            }
             ServiceWork::where('id', $params['id'])->update([
             ServiceWork::where('id', $params['id'])->update([
+                'real_name' => $params['real_name'],
+                'mobile' => $params['mobile'],
+                'user_id' => $userId,
                 'address' => $params['address'],
                 'address' => $params['address'],
                 'appointment_time' => strtotime($params['appointment_time']),
                 'appointment_time' => strtotime($params['appointment_time']),
                 'estimated_finish_time' => $params['estimated_finish_time'],
                 'estimated_finish_time' => $params['estimated_finish_time'],
@@ -244,14 +253,14 @@ class ServiceWorkLogic extends BaseLogic
 
 
             // 关联配件信息.计算配件总价  id  company_price original_price offering_price number
             // 关联配件信息.计算配件总价  id  company_price original_price offering_price number
             $spare_total = 0;
             $spare_total = 0;
-
+            $work->spare_total = 0;
             isset($params['spare_parts']) && $params['spare_parts'] && $params['spare_parts'] = json_decode($params['spare_parts'], true);
             isset($params['spare_parts']) && $params['spare_parts'] && $params['spare_parts'] = json_decode($params['spare_parts'], true);
             if(isset($params['spare_parts']) && $params['spare_parts']){
             if(isset($params['spare_parts']) && $params['spare_parts']){
                 $spare_parts = $params['spare_parts'];
                 $spare_parts = $params['spare_parts'];
                 foreach ($spare_parts as $spare){
                 foreach ($spare_parts as $spare){
                     $spare_total += $spare['company_price']*$spare['number'];
                     $spare_total += $spare['company_price']*$spare['number'];
                 }
                 }
-                $work->spare_total = $spare_total;
+                $work->spare_total += $spare_total;
 
 
                 $service_work_spare = ServiceWorkSpare::where(['service_work_id'=>$work['id']])->findOrEmpty();
                 $service_work_spare = ServiceWorkSpare::where(['service_work_id'=>$work['id']])->findOrEmpty();
                 if($service_work_spare->isEmpty()){
                 if($service_work_spare->isEmpty()){
@@ -267,7 +276,21 @@ class ServiceWorkLogic extends BaseLogic
                     $service_work_spare->save();
                     $service_work_spare->save();
                 }
                 }
                 $work->service_work_spare_id = $service_work_spare->id;
                 $work->service_work_spare_id = $service_work_spare->id;
+            }elseif (isset($params['spare_total']) && $params['spare_total']){
+                $work->spare_total += $params['spare_total'];
+            }
+            // 添加工单尾款报价记录 - 即配件费用
+            if(isset($params['price_content'])){
+                !is_array($params['price_content']) && $params['price_content'] = json_decode($params['price_content'], true);
+                ServiceWorkDeterminedPrice::where('work_id',$work->id)->delete();
+                ServiceWorkDeterminedPrice::create([
+                    'work_id'=>$work->id,
+                    'content'=>$params['price_content']??[],
+                ]);
+                $work->spare_total += array_sum('price');
             }
             }
+
+
             // order_amount 原 =  $params['amount'] 修改为 = 配件总价 + 服务尾款
             // order_amount 原 =  $params['amount'] 修改为 = 配件总价 + 服务尾款
             $order_amount = $params['amount'] + $spare_total;
             $order_amount = $params['amount'] + $spare_total;
 
 
@@ -326,15 +349,7 @@ class ServiceWorkLogic extends BaseLogic
             ];
             ];
             ServiceWorkLogLogic::add($work_log);
             ServiceWorkLogLogic::add($work_log);
 
 
-            // 添加工单尾款报价记录
-            if(isset($params['price_content'])){
-                !is_array($params['price_content']) && $params['price_content'] = json_decode($params['price_content'], true);
-                ServiceWorkDeterminedPrice::where('work_id',$work->id)->delete();
-                ServiceWorkDeterminedPrice::create([
-                    'work_id'=>$work->id,
-                    'content'=>$params['price_content']??[],
-                ]);
-            }
+
 
 
             Db::commit();
             Db::commit();
             // 商家报价通知外部平台 即报价
             // 商家报价通知外部平台 即报价
@@ -748,7 +763,7 @@ class ServiceWorkLogic extends BaseLogic
             }
             }
 
 
             ServiceWork::where('id', $params['id'])->update([
             ServiceWork::where('id', $params['id'])->update([
-                //'work_status' => 9,
+                'work_status' => 9,
                 'service_status' => 4,
                 'service_status' => 4,
                 'remark' => $params['remark']??''
                 'remark' => $params['remark']??''
             ]);
             ]);
@@ -1063,6 +1078,11 @@ class ServiceWorkLogic extends BaseLogic
     public static function addThirdPlatformsOrders($params)
     public static function addThirdPlatformsOrders($params)
     {
     {
         try {
         try {
+            if($params['userAddress']){
+                $lon_lat = get_address_lat_lng($params['userAddress']);
+                $params['lon'] = $lon_lat['lon'];
+                $params['lat'] = $lon_lat['lat'];
+            }
             return ThirdOrderLogic::submitOrders($params);
             return ThirdOrderLogic::submitOrders($params);
         }catch  (\Exception $e) {
         }catch  (\Exception $e) {
             self::setError($e->getMessage());
             self::setError($e->getMessage());
@@ -1083,7 +1103,14 @@ class ServiceWorkLogic extends BaseLogic
                 throw new Exception('工单不存在');
                 throw new Exception('工单不存在');
             }
             }
             $encryptedData = encrypt($params['work_sn'], \think\facade\Config::get('project.work_sn_key'));
             $encryptedData = encrypt($params['work_sn'], \think\facade\Config::get('project.work_sn_key'));
-            return ['url'=>\think\facade\Config::get('project.user_website').'?code='.$encryptedData];
+            $user_website = \think\facade\Config::get('project.user_website');
+            $type = $params['type']??1;
+            if($type == 1){
+                $user_website .= '?code='.$encryptedData;
+            }elseif($type == 2){
+                $user_website .= 'pages/quoted_price?code='.$encryptedData;
+            }
+            return ['url'=>$user_website];
         }catch  (\Exception $e) {
         }catch  (\Exception $e) {
             self::setError($e->getMessage());
             self::setError($e->getMessage());
             return false;
             return false;
@@ -1111,6 +1138,7 @@ class ServiceWorkLogic extends BaseLogic
                 $serviceWork->user_confirm_status = 5;
                 $serviceWork->user_confirm_status = 5;
                 $serviceWork->service_status = 3;
                 $serviceWork->service_status = 3;
                 $serviceWork->work_pay_status = 1;
                 $serviceWork->work_pay_status = 1;
+                $serviceWork->finished_time = time();
                 $serviceWork->remark = ($serviceWork->remark?:'')." | 终止结束服务:常规流程";
                 $serviceWork->remark = ($serviceWork->remark?:'')." | 终止结束服务:常规流程";
                 $serviceWork->save();
                 $serviceWork->save();
             }else{
             }else{
@@ -1124,6 +1152,7 @@ class ServiceWorkLogic extends BaseLogic
                     'work_status' => 7,
                     'work_status' => 7,
                     'user_confirm_status' => 5,
                     'user_confirm_status' => 5,
                     'service_status' => 3,
                     'service_status' => 3,
+                    'finished_time' => time(),
                     'work_pay_status' => 2, // 已结算则不执行 onAfterUpdate
                     'work_pay_status' => 2, // 已结算则不执行 onAfterUpdate
                     'settlement_amount' => $paid_amount??0,
                     'settlement_amount' => $paid_amount??0,
                     'worker_price' => $paid_amount??0,
                     'worker_price' => $paid_amount??0,

+ 94 - 0
app/adminapi/validate/external/ExternalConsultationValidate.php

@@ -0,0 +1,94 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeadmin快速开发前后端分离管理后台(PHP版)
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | 开源版本可自由商用,可去除界面版权logo
+// | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
+// | github下载:https://github.com/likeshop-github/likeadmin
+// | 访问官网:https://www.likeadmin.cn
+// | likeadmin团队 版权所有 拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeadminTeam
+// +----------------------------------------------------------------------
+
+namespace app\adminapi\validate\external;
+
+
+use app\common\validate\BaseValidate;
+
+
+/**
+ * ExternalConsultation验证器
+ * Class ExternalConsultationValidate
+ * @package app\adminapi\validate
+ */
+class ExternalConsultationValidate extends BaseValidate
+{
+
+     /**
+      * 设置校验规则
+      * @var string[]
+      */
+    protected $rule = [
+        'id' => 'require',
+    ];
+
+
+    /**
+     * 参数描述
+     * @var string[]
+     */
+    protected $field = [
+        'id' => 'id',
+    ];
+
+
+    /**
+     * @notes 添加场景
+     * @return ExternalConsultationValidate
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public function sceneAdd()
+    {
+        return $this->remove('id', true);
+    }
+
+
+    /**
+     * @notes 编辑场景
+     * @return ExternalConsultationValidate
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public function sceneEdit()
+    {
+        return $this->only(['id']);
+    }
+
+
+    /**
+     * @notes 删除场景
+     * @return ExternalConsultationValidate
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public function sceneDelete()
+    {
+        return $this->only(['id']);
+    }
+
+
+    /**
+     * @notes 详情场景
+     * @return ExternalConsultationValidate
+     * @author likeadmin
+     * @date 2025/04/23 17:10
+     */
+    public function sceneDetail()
+    {
+        return $this->only(['id']);
+    }
+
+}

+ 6 - 4
app/adminapi/validate/fault_code/FaultCodeValidate.php

@@ -33,7 +33,8 @@ class FaultCodeValidate extends BaseValidate
     protected $rule = [
     protected $rule = [
         'id' => 'require',
         'id' => 'require',
         'type_id' => 'require',
         'type_id' => 'require',
-        'codes' => 'require',
+        'name' => 'require',
+        'price' => 'require',
 
 
     ];
     ];
 
 
@@ -44,7 +45,8 @@ class FaultCodeValidate extends BaseValidate
      */
      */
     protected $field = [
     protected $field = [
         'id' => 'id',
         'id' => 'id',
-        'codes' => '故障码',
+        'name' => '故障名称',
+        'price' => '故障限价',
         'type_id' => '分类Id',
         'type_id' => '分类Id',
 
 
     ];
     ];
@@ -58,7 +60,7 @@ class FaultCodeValidate extends BaseValidate
      */
      */
     public function sceneAdd()
     public function sceneAdd()
     {
     {
-        return $this->only(['codes']);
+        return $this->only(['name','price']);
     }
     }
 
 
 
 
@@ -70,7 +72,7 @@ class FaultCodeValidate extends BaseValidate
      */
      */
     public function sceneEdit()
     public function sceneEdit()
     {
     {
-        return $this->only(['id','codes']);
+        return $this->only(['id','name','price']);
     }
     }
 
 
 
 

+ 4 - 3
app/adminapi/validate/works/ServiceWorkValidate.php

@@ -33,7 +33,7 @@ class ServiceWorkValidate extends BaseValidate
     protected $rule = [
     protected $rule = [
         'id' => 'require',
         'id' => 'require',
         'work_sn' => 'require',
         'work_sn' => 'require',
-        'mobile' => 'require',
+        'mobile' => 'require|mobile',
         'address' => 'require',
         'address' => 'require',
         'title' => 'require',
         'title' => 'require',
         'category_type' => 'require',
         'category_type' => 'require',
@@ -59,7 +59,8 @@ class ServiceWorkValidate extends BaseValidate
     protected $field = [
     protected $field = [
         'id' => 'id',
         'id' => 'id',
         'work_sn' => '工单编号',
         'work_sn' => '工单编号',
-        'mobile' => '手机号',
+        'mobile.require' => '手机号',
+        'mobile.mobile' => '手机号错误',
         'address' => '客户地址',
         'address' => '客户地址',
         'title' => '工单名称',
         'title' => '工单名称',
         'category_type' => '服务类别',
         'category_type' => '服务类别',
@@ -98,7 +99,7 @@ class ServiceWorkValidate extends BaseValidate
      */
      */
     public function sceneEdit()
     public function sceneEdit()
     {
     {
-        return $this->only(['id','address','appointment_time','lon','lat']);
+        return $this->only(['id','mobile','address','appointment_time']);
     }
     }
 
 
 
 

+ 1 - 1
app/api/controller/notify/UserConfirmController.php

@@ -24,7 +24,7 @@ use think\facade\Log;
 class UserConfirmController extends BaseApiController
 class UserConfirmController extends BaseApiController
 {
 {
 
 
-    public array $notNeedLogin = ['confirmDoor'];
+    public array $notNeedLogin = ['confirmDoor','confirmPriceDetail'];
 
 
     public function confirmDoor()
     public function confirmDoor()
     {
     {

+ 148 - 5
app/api/logic/PerformanceLogic.php

@@ -7,6 +7,9 @@ use app\common\logic\BaseLogic;
 use app\common\logic\EffectiveLogic;
 use app\common\logic\EffectiveLogic;
 use app\common\logic\WorkAddMoneyLogic;
 use app\common\logic\WorkAddMoneyLogic;
 use app\common\logic\WorkerAccountLogLogic;
 use app\common\logic\WorkerAccountLogLogic;
+use app\common\model\financial\MasterSettlementDetails;
+use app\common\model\master_worker\MasterWorkerAccountLog;
+use app\common\model\master_worker\MasterWorkerRetentionMoneyLog;
 use app\common\model\orders\OrderEffectiveLog;
 use app\common\model\orders\OrderEffectiveLog;
 use app\common\model\master_commission\MasterWorkerCommissionConfig;
 use app\common\model\master_commission\MasterWorkerCommissionConfig;
 use app\common\model\master_commission\MasterWorkerCommissionRatio;
 use app\common\model\master_commission\MasterWorkerCommissionRatio;
@@ -51,16 +54,18 @@ class PerformanceLogic extends BaseLogic
             $coupon_price = RechargeOrder::where('work_id',$work->id)->sum('coupon_price');
             $coupon_price = RechargeOrder::where('work_id',$work->id)->sum('coupon_price');
             switch ($rule['type']){
             switch ($rule['type']){
                 case 0://按照总金额结算
                 case 0://按照总金额结算
-                    $settlement_amount = bcmul($work->work_total, $rule['rate'],2);
+                    $settlement_amount = bcmul(bcsub($work->work_total - $work->spare_total), $rule['rate'],2);
                     break;
                     break;
                 case 1://按照结算金额结算
                 case 1://按照结算金额结算
                     $worker_price = $work->work_amount;
                     $worker_price = $work->work_amount;
-                    $settlement_amount = bcmul($worker_price, $rule['rate'],2);
+                    //$settlement_amount = bcmul($worker_price, $rule['rate'],2);
+                    // 运营新定 - 配件费不包进总工单金额扣除
+                    $settlement_amount = bcmul(bcsub($worker_price - $work->spare_total) , $rule['rate'],2);
                     break;
                     break;
                 case 2://按照服务总费用结算
                 case 2://按照服务总费用结算
                     //搜索所有优惠券
                     //搜索所有优惠券
                     $worker_price = $work->service_fee-$coupon_price;
                     $worker_price = $work->service_fee-$coupon_price;
-                    $settlement_amount = bcmul($worker_price, $rule['rate'],2);
+                    $settlement_amount = bcmul(bcsub($worker_price - $work->spare_total), $rule['rate'],2);
                     break;
                     break;
                 default://按照固定金额结算
                 default://按照固定金额结算
                     $worker_price = $work->service_fee-$coupon_price;
                     $worker_price = $work->service_fee-$coupon_price;
@@ -126,6 +131,9 @@ class PerformanceLogic extends BaseLogic
             //工程师可提现金额,汇总了加单金额
             //工程师可提现金额,汇总了加单金额
             $settlement_amount += (float)$work->add_work_amount;
             $settlement_amount += (float)$work->add_work_amount;
 
 
+            //工程师可提现金额,汇总 配件总金额
+            $settlement_amount += (float)$work->spare_total;
+
             Log::info('工单'.$work->id.',总服务费:'.$worker_price.'可提现金额:'.$settlement_amount.',加单金额:'.$work->add_work_amount.',缴纳质保金:'.$work->earnest_money.',系统回收金额:'.$work->system_amount.',门店总金额(包含工程师):'.$work->tenant_all_amount . ',门店实际金额:'.$work->tenant_amount);
             Log::info('工单'.$work->id.',总服务费:'.$worker_price.'可提现金额:'.$settlement_amount.',加单金额:'.$work->add_work_amount.',缴纳质保金:'.$work->earnest_money.',系统回收金额:'.$work->system_amount.',门店总金额(包含工程师):'.$work->tenant_all_amount . ',门店实际金额:'.$work->tenant_amount);
 
 
             WorkerAccountLogLogic::addAccountLog($work,$settlement_amount,WorkerAccountLogEnum::UM_INC_ADMIN,WorkerAccountLogEnum::INC);
             WorkerAccountLogLogic::addAccountLog($work,$settlement_amount,WorkerAccountLogEnum::UM_INC_ADMIN,WorkerAccountLogEnum::INC);
@@ -152,7 +160,9 @@ class PerformanceLogic extends BaseLogic
             //工程师金额结算
             //工程师金额结算
             //$coupon_price = RechargeOrder::where('work_id',$work->id)->sum('coupon_price');
             //$coupon_price = RechargeOrder::where('work_id',$work->id)->sum('coupon_price');
             $work->worker_price = $work->work_total;
             $work->worker_price = $work->work_total;
-            $settlement_amount = bcmul($work->work_total, $ratio,2);
+            //$settlement_amount = bcmul($work->work_total, $ratio,2);
+            // 运营新定 - 配件费不包进总工单金额扣除
+            $settlement_amount = bcmul(bcsub($work->worker_price - $work->spare_total), $ratio,2);
             // 缴纳质保金
             // 缴纳质保金
             $masterWorkerInfo = MasterWorker::where('id', $work->master_worker_id)->where('retention_money_status', 1)->findOrEmpty()->toArray();
             $masterWorkerInfo = MasterWorker::where('id', $work->master_worker_id)->where('retention_money_status', 1)->findOrEmpty()->toArray();
             Log::info('缴纳质保金工程师信息:'.json_encode($masterWorkerInfo));
             Log::info('缴纳质保金工程师信息:'.json_encode($masterWorkerInfo));
@@ -207,7 +217,8 @@ class PerformanceLogic extends BaseLogic
             }
             }
             //工程师可提现金额,汇总了加单金额
             //工程师可提现金额,汇总了加单金额
             $settlement_amount += (float)$work->add_work_amount;
             $settlement_amount += (float)$work->add_work_amount;
-
+            //工程师可提现金额,汇总 配件总金额
+            $settlement_amount += (float)$work->spare_total;
             Log::info('calculatePerformanceCommission:工单'.$work->id.',总服务费:'.$work->worker_price.'可提现金额:'.$settlement_amount.',加单金额:'.$work->add_work_amount.',缴纳质保金:'.$work->earnest_money.',系统回收金额:'.$work->system_amount.',门店总金额(包含工程师):'.$work->tenant_all_amount . ',门店实际金额:'.$work->tenant_amount);
             Log::info('calculatePerformanceCommission:工单'.$work->id.',总服务费:'.$work->worker_price.'可提现金额:'.$settlement_amount.',加单金额:'.$work->add_work_amount.',缴纳质保金:'.$work->earnest_money.',系统回收金额:'.$work->system_amount.',门店总金额(包含工程师):'.$work->tenant_all_amount . ',门店实际金额:'.$work->tenant_amount);
 
 
             WorkerAccountLogLogic::addAccountLog($work,$settlement_amount,WorkerAccountLogEnum::UM_INC_ADMIN,WorkerAccountLogEnum::INC);
             WorkerAccountLogLogic::addAccountLog($work,$settlement_amount,WorkerAccountLogEnum::UM_INC_ADMIN,WorkerAccountLogEnum::INC);
@@ -272,4 +283,136 @@ class PerformanceLogic extends BaseLogic
 
 
         return true;
         return true;
     }
     }
+
+
+    /**
+     * @notes 临时 - 计算工程师提成
+     * @param $work
+     * @return void
+     * @throws \think\Exception
+     * @author liugc <466014217@qq.com>
+     * @date 2025/4/23 10:27
+     */
+    public static function calculatePerformanceTmp($work)
+    {
+        Log::info('calculatePerformance:'.json_encode($work->toArray()));
+
+        Db::startTrans();
+        try {
+
+
+            $masterWorkerAccountLog = MasterWorkerAccountLog::where('action',1)->where('worker_id',$work->master_worker_id)->where('work_sn',$work->work_sn)->findOrEmpty();
+            $masterWorkerRetentionMoneyLog = MasterWorkerRetentionMoneyLog::where('action',1)->where('work_id',$work->id)->where('worker_id',$work->master_worker_id)->findOrEmpty();
+            $masterWorker = MasterWorker::where('id', $work->master_worker_id)->findOrEmpty();
+            if(!$masterWorkerRetentionMoneyLog->isEmpty()){
+                $masterWorker->earnest_money_usable -= $masterWorkerRetentionMoneyLog->amount;
+                $masterWorkerRetentionMoneyLog->delete();
+                //MasterWorkerRetentionMoneyLog::destroy(['id'=>$masterWorkerRetentionMoneyLog->id]);
+            }
+
+            if(!$masterWorkerAccountLog->isEmpty()){
+                $masterWorker->user_money -= $masterWorkerAccountLog->change_amount;
+                MasterSettlementDetails::where('account_log_id', $masterWorkerAccountLog->id)->delete();
+                //$masterWorkerAccountLog->delete();
+                MasterWorkerAccountLog::destroy(['id'=>$masterWorkerAccountLog->id],true);
+            }
+            $masterWorker->save();
+
+
+
+            //工单已完结,进行结算,结算完成后设置work_pay_status为2,已结算
+            //获取工单对应的商品id
+            $order_sns = RechargeOrder::where('work_id',$work->id)->column('sn');
+            $goods_id = OrderGoods::whereIn('sn',$order_sns)->value('goods_id');
+            $rule = PerformanceRules::whereFindInSet('goods_id',$goods_id)->findOrEmpty();
+            if($rule->isEmpty()){
+                $work->work_pay_status = 3;
+            }else{
+                $work->work_pay_status = 2;
+            }
+            Log::info('calculatePerformance:'.json_encode($rule->toArray()));
+            //工程师金额结算
+            if(!$rule->isEmpty()){
+                $coupon_price = RechargeOrder::where('work_id',$work->id)->sum('coupon_price');
+                switch ($rule['type']){
+                    case 0:
+                    case 1://按照结算金额结算
+                    case 2:
+                        $worker_price = $work->work_amount;
+                        $settlement_amount = bcmul($worker_price, $rule['rate'],2);
+                        break;
+                }
+                $work->worker_price = $worker_price;
+
+                // 缴纳质保金
+                $masterWorkerInfo = MasterWorker::where('id', $work->master_worker_id)->where('retention_money_status', 1)->findOrEmpty()->toArray();
+                Log::info('缴纳质保金工程师信息:'.json_encode($masterWorkerInfo));
+                if(!empty($masterWorkerInfo) && $masterWorkerInfo['retention_pay_status'] == 2 && ($masterWorkerInfo['earnest_money'] > $masterWorkerInfo['earnest_money_usable'])){
+                    $retentionData['action'] = WorkerAccountLogEnum::INC;
+                    $retentionData['worker_id'] = $work->master_worker_id;
+                    $retentionData['work_id'] = $work->id;
+                    $amount = bcmul($worker_price, bcdiv($masterWorkerInfo['installment_ratio'], 100, 4),2);
+                    //$amount = bcmul($settlement_amount, bcdiv($masterWorkerInfo['installment_ratio'], 100, 4),2);
+                    $retentionData['amount'] = $amount;
+                    //$retentionData['remark'] = "分期缴纳质保金:该单实提成--{$settlement_amount},分期每单缴纳比例--{$masterWorkerInfo['installment_ratio']}%,缴纳金额--{$amount}";
+                    $retentionData['remark'] = "分期缴纳质保金:工单提成--{$worker_price},分期每单缴纳比例--{$masterWorkerInfo['installment_ratio']}%,缴纳金额--{$amount}";
+                    $settlement_amount -= (float)$amount;
+                    $surplusMoney = RetentionMoneyLogic::retentionPayment($retentionData);
+                    Log::info('分期缴纳质保金:'.$surplusMoney,$retentionData);
+                    if($surplusMoney === false){
+                        Log::info('分期缴纳质保金支付失败-'.RetentionMoneyLogic::getError(),$retentionData);
+                        $settlement_amount += (float)$amount;
+                    }else{
+                        $settlement_amount += (float)$surplusMoney;
+
+                        $work->earnest_money = $amount - $surplusMoney;//质保金金额
+                    }
+                }
+
+                if($settlement_amount<0){
+                    //修改工单为待结算,后台处理
+                    $work->work_pay_status = 3;
+                }
+
+                //工程师可提现金额
+                $work->settlement_amount = $settlement_amount;
+
+                //工程师加单金额判定
+                //$add_work_amount = 0;测试
+                $add_work_amount = WorkAddMoneyLogic::checkAddWork($work,$worker_price);
+                $work->add_work_amount = $add_work_amount;
+
+                //系统回收金额
+                $work->system_amount = $worker_price-$settlement_amount-$work->earnest_money-$work->add_work_amount;
+                if($work->system_amount < 0){
+                    $work->system_amount = 0;
+                    Log::info('system_amount小于0重置为0:'.$work->system_amount.'='.$worker_price.'-'.$settlement_amount.'-'.$work->earnest_money.'-'.$work->add_work_amount);
+                }
+                //门店结算金额
+                if($work->tenant_id > 0){
+                    $percentage = TenantRatingCommissionLogic::getCommissionByTenantId($work->tenant_id);
+                    if($percentage > 0){
+                        $work->system_amount = bcmul($worker_price, bcdiv($percentage, 100, 4),2);
+                        $work->tenant_all_amount = $worker_price - $work->system_amount;
+                        $work->tenant_amount = $work->tenant_all_amount - $settlement_amount - $work->earnest_money - $work->add_work_amount;
+                    }
+                    Log::info('平台抽成门店的比例:'.'门店ID:'.$work->tenant_id.',平台抽成:'.$percentage);
+                }
+
+                //工程师可提现金额,汇总了加单金额
+                $settlement_amount += (float)$work->add_work_amount;
+
+                Log::info('工单'.$work->id.',总服务费:'.$worker_price.'可提现金额:'.$settlement_amount.',加单金额:'.$work->add_work_amount.',缴纳质保金:'.$work->earnest_money.',系统回收金额:'.$work->system_amount.',门店总金额(包含工程师):'.$work->tenant_all_amount . ',门店实际金额:'.$work->tenant_amount);
+
+                WorkerAccountLogLogic::addAccountLog($work,$settlement_amount,WorkerAccountLogEnum::UM_INC_ADMIN,WorkerAccountLogEnum::INC);
+            }
+            $work->save();
+
+            Db::commit();
+        } catch (\Exception $e) {
+            Db::rollback();
+            throw new \Exception($e->getMessage());
+        }
+    }
+
 }
 }

+ 12 - 4
app/api/logic/ServiceOrderLogic.php

@@ -859,10 +859,6 @@ class ServiceOrderLogic extends BaseLogic
             }
             }
 
 
             $service_work = ServiceWork::find($work_id);
             $service_work = ServiceWork::find($work_id);
-            if(!isset($params['admin_id']) && $service_work->user_confirm_status!=3){
-                throw new Exception('请勿重复操作');
-            }
-
             $orders = RechargeOrder::where(['work_id'=>$work_id,'user_id'=>$params['user_id']])->select()->toArray();
             $orders = RechargeOrder::where(['work_id'=>$work_id,'user_id'=>$params['user_id']])->select()->toArray();
 
 
             //确认所有订单总金额和结算金额
             //确认所有订单总金额和结算金额
@@ -876,6 +872,18 @@ class ServiceOrderLogic extends BaseLogic
                 $service_work->work_status = 6;
                 $service_work->work_status = 6;
                 $service_work->user_confirm_status = 4;
                 $service_work->user_confirm_status = 4;
             }
             }
+            if(isset($params['admin_id']) && $service_work->user_confirm_status!=3){
+                \app\common\model\recharge\RechargeOrder::where([
+                    'order_type' => 0,
+                    'user_id' => $params['user_id'],
+                    'pay_status' => 0,
+                    'payment_type' => 2,
+                    'sn'=>$params['sn']
+                ])->update(['pay_status'=>1]);
+                $service_work->work_status = 7;
+                $service_work->user_confirm_status = 5;
+                $service_work->service_status = 3;
+            }
             $service_work->finished_time = time();
             $service_work->finished_time = time();
             $service_work->save();
             $service_work->save();
 
 

+ 31 - 9
app/common/controller/InternalApiController.php

@@ -3,6 +3,7 @@
 namespace app\common\controller;
 namespace app\common\controller;
 
 
 
 
+use app\api\logic\PerformanceLogic;
 use app\api\logic\ServiceOrderLogic;
 use app\api\logic\ServiceOrderLogic;
 use app\common\enum\PayEnum;
 use app\common\enum\PayEnum;
 use app\common\enum\worker\WorkerAccountLogEnum;
 use app\common\enum\worker\WorkerAccountLogEnum;
@@ -123,14 +124,15 @@ class InternalApiController extends BaseLikeAdminController
                 //更新工单状态为已取消
                 //更新工单状态为已取消
                 $service_work->service_status = 4;
                 $service_work->service_status = 4;
                 // 是否存在退款
                 // 是否存在退款
-                if($service_work->work_pay_status == 1 && (int)$params['is_refund'] == 1){ //全退不分给工程师
+                if($service_work->work_pay_status == 1 && (int)$params['is_refund'] === 1){ //全退不分给工程师
+                    $service_work->work_status = 7;
                     $service_work->service_status = 5;
                     $service_work->service_status = 5;
                     $service_work->work_pay_status = 2;
                     $service_work->work_pay_status = 2;
                     //取消订单
                     //取消订单
                     RechargeOrder::where(['user_id'=>$service_work->user_id,'work_id'=>$service_work->id])->update([
                     RechargeOrder::where(['user_id'=>$service_work->user_id,'work_id'=>$service_work->id])->update([
                         'pay_status' => 2,
                         'pay_status' => 2,
                     ]);
                     ]);
-                }else if($service_work->work_pay_status == 1 && (int)$params['is_refund'] == 0){ // 上门费分给工程师
+                }else if($service_work->work_pay_status == 1 && (int)$params['is_refund'] === 0){ // 上门费分给工程师
                     $paid_amount = RechargeOrder::where('work_id', $service_work->id)->where('payment_type', 1)->value('paid_amount');
                     $paid_amount = RechargeOrder::where('work_id', $service_work->id)->where('payment_type', 1)->value('paid_amount');
                     if($paid_amount > 0){
                     if($paid_amount > 0){
                         // 存在上门费给工程师
                         // 存在上门费给工程师
@@ -146,14 +148,16 @@ class InternalApiController extends BaseLikeAdminController
                         'worker_price' => $paid_amount??0,
                         'worker_price' => $paid_amount??0,
                         'remark' => ($service_work->remark?:'')." | 内部取消并终止结束服务:上门费-{$paid_amount}"
                         'remark' => ($service_work->remark?:'')." | 内部取消并终止结束服务:上门费-{$paid_amount}"
                     ]);
                     ]);
-
-                    ServiceWorkLog::create([
-                        'work_id' => $service_work->id,
-                        'master_worker_id' => $service_work->master_worker_id,
-                        'opera_log' => "工单:{$service_work->work_sn} 内部取消并终止结束服务"
-                    ]);
+                }else{
+                    $service_work->work_status = 9;
                 }
                 }
-                $service_work->work_status = 7;
+
+                ServiceWorkLog::create([
+                    'work_id' => $service_work->id,
+                    'master_worker_id' => $service_work->master_worker_id,
+                    'opera_log' => "工单:{$service_work->work_sn} 内部取消并终止结束服务"
+                ]);
+
                 $service_work->user_confirm_status = 5;
                 $service_work->user_confirm_status = 5;
                 $service_work->save();
                 $service_work->save();
             }
             }
@@ -166,7 +170,25 @@ class InternalApiController extends BaseLikeAdminController
         }
         }
     }
     }
 
 
+    /**
+     * tmp - test
+     * @return \think\response\Json
+     * @author liugc <466014217@qq.com>
+     * @date 2025/4/23 11:52
+     */
+    public function calculatePerformanceTmp()
+    {
+        try {
+            $params = $this->request->param();
+            $work = ServiceWork::find($params['work_id']);
+            //dd($work->toArray());
+            PerformanceLogic::calculatePerformanceTmp($work);
 
 
+            return $this->success('tmp工单完成', [], 0, 1);
+        }catch(\Exception $e){
+            return $this->fail($e->getMessage(),[],$e->getCode());
+        }
+    }
 
 
 
 
 
 

+ 4 - 5
app/common/logic/ThirdOrderLogic.php

@@ -300,9 +300,8 @@ class ThirdOrderLogic extends BaseLogic
                 'lat'=>$message['lat'],
                 'lat'=>$message['lat'],
                 'property_activity_id'=>0,
                 'property_activity_id'=>0,
                 'user_equity_id'=>0,
                 'user_equity_id'=>0,
-                'third_type'=>1,
-                'work_total'=>$goods['base_service_fee'],
-                'work_amount'=>$goods['base_service_fee']
+                'work_total'=>$message['amount'],
+                'work_amount'=>$message['amount']
             ];
             ];
             $service_area_id = ServiceArea::serviceAreaId(['lon' => $work_data['lon'], 'lat' => $work_data['lat']]);
             $service_area_id = ServiceArea::serviceAreaId(['lon' => $work_data['lon'], 'lat' => $work_data['lat']]);
             $work_data['service_area_id'] = $service_area_id;
             $work_data['service_area_id'] = $service_area_id;
@@ -319,7 +318,7 @@ class ThirdOrderLogic extends BaseLogic
                 'pay_status' => PayEnum::ISPAID,
                 'pay_status' => PayEnum::ISPAID,
                 'coupon_id'=>0,
                 'coupon_id'=>0,
                 'coupon_price'=>0,
                 'coupon_price'=>0,
-                'pay_way' => 4,
+                'pay_way' => 3,
                 'order_total' => $message['amount'],
                 'order_total' => $message['amount'],
                 'order_amount' => $message['amount'],
                 'order_amount' => $message['amount'],
                 'paid_amount'=>$message['amount']
                 'paid_amount'=>$message['amount']
@@ -367,12 +366,12 @@ class ThirdOrderLogic extends BaseLogic
                 \app\common\model\recharge\RechargeOrder::create($order_weikuan_data);
                 \app\common\model\recharge\RechargeOrder::create($order_weikuan_data);
             }
             }
             Db::commit();
             Db::commit();
+            return $service_work['id'];
         } catch (\Exception $e) {
         } catch (\Exception $e) {
             Db::rollback();
             Db::rollback();
             self::setError($e->getMessage());
             self::setError($e->getMessage());
             return false;
             return false;
         }
         }
-        return true;
     }
     }
 
 
     public static function get_sign($sign_key, $data)
     public static function get_sign($sign_key, $data)

+ 43 - 0
app/common/model/external/ExternalConsultation.php

@@ -0,0 +1,43 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeadmin快速开发前后端分离管理后台(PHP版)
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | 开源版本可自由商用,可去除界面版权logo
+// | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
+// | github下载:https://github.com/likeshop-github/likeadmin
+// | 访问官网:https://www.likeadmin.cn
+// | likeadmin团队 版权所有 拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeadminTeam
+// +----------------------------------------------------------------------
+
+namespace app\common\model\external;
+
+
+use app\common\model\BaseModel;
+use app\common\model\goods\Goods;
+
+
+/**
+ * ExternalConsultation模型
+ * Class ExternalConsultation
+ * @package app\common\model
+ */
+class ExternalConsultation extends BaseModel
+{
+    
+    protected $name = 'external_consultation';
+
+    public function goods()
+    {
+        return $this->hasOne(Goods::class, 'id', 'goods_id')
+            ->field('id,goods_name,service_fee');
+    }
+    public function externalPlatform()
+    {
+        return $this->hasOne(ExternalPlatform::class, 'id', 'external_platform_id')
+            ->field('id,name,tel');
+    }
+    
+}

+ 3 - 1
app/common/model/fault_type/FaultType.php

@@ -29,6 +29,8 @@ class FaultType extends BaseModel
     
     
     protected $name = 'fault_type';
     protected $name = 'fault_type';
     
     
-
+    public function children() {
+        return $this->hasMany(FaultType::class, 'pid', 'id');
+    }
     
     
 }
 }

+ 58 - 11
app/workerapi/controller/FaultCodeController.php

@@ -2,32 +2,79 @@
 
 
 namespace app\workerapi\controller;
 namespace app\workerapi\controller;
 
 
-
 use app\adminapi\logic\fault_code\FaultCodeLogic;
 use app\adminapi\logic\fault_code\FaultCodeLogic;
 use app\adminapi\logic\fault_type\FaultTypeLogic;
 use app\adminapi\logic\fault_type\FaultTypeLogic;
 use app\adminapi\validate\fault_code\FaultCodeValidate;
 use app\adminapi\validate\fault_code\FaultCodeValidate;
-use app\workerapi\lists\FaultCodeLists;
 
 
 class FaultCodeController extends BaseApiController
 class FaultCodeController extends BaseApiController
 {
 {
     public array $notNeedLogin = ['getTreeLists','detail'];
     public array $notNeedLogin = ['getTreeLists','detail'];
     public function getTreeLists()
     public function getTreeLists()
     {
     {
-        $result = FaultTypeLogic::getAllData('api');
+        $goods_category_id = $this->request->get('goods_category_id', 0);
+        $result = FaultTypeLogic::getAllData('api',$goods_category_id);
         return $this->data($result);
         return $this->data($result);
-        //return $this->dataLists(new FaultCodeLists());
     }
     }
     /**
     /**
-     * @notes 获取详情
+     * @notes 获取列表
      * @return \think\response\Json
      * @return \think\response\Json
      * @author likeadmin
      * @author likeadmin
      * @date 2024/10/18 09:58
      * @date 2024/10/18 09:58
      */
      */
-    public function detail()
+    public function lists()
     {
     {
-        /*$params = (new FaultCodeValidate())->goCheck('detail');
-        $result = FaultCodeLogic::detail($params);
-        return $this->data($result);*/
-        return $this->dataLists(new FaultCodeLists());
+        $params = (new FaultCodeValidate())->goCheck('detail');
+        $result = FaultCodeLogic::lists($params);
+        return $this->data($result);
     }
     }
-}
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 18 - 1
app/workerapi/controller/WorksController.php

@@ -367,5 +367,22 @@ class WorksController extends BaseApiController
         return $this->success('操作成功,工程师已上门,请用户扫码确认', $result, 1, 1);
         return $this->success('操作成功,工程师已上门,请用户扫码确认', $result, 1, 1);
     }
     }
 
 
-
+    /**
+     * 工程师取消自己的分配
+     * @return \think\response\Json
+     * @author liugc <466014217@qq.com>
+     * @date 2025/4/28 15:08
+     */
+    public function cancelMasterWorker()
+    {
+        $params = (new ServiceWorkValidate())->post()->goCheck('cancel', [
+            'user_id' => $this->userId,
+            'user_info' => $this->userInfo
+        ]);
+        $result = ServiceWorkLogic::cancelAllocation(['id'=>$params['id'],'master_worker_id'=>$this->userId],['admin_id'=>$this->userId,'name'=>'工程师-'.$this->userInfo['mobile']]);
+        if (false === $result) {
+            return $this->fail(ServiceWorkLogic::getError());
+        }
+        return $this->success('成功', [], 1, 1);
+    }
 }
 }

+ 2 - 2
app/workerapi/lists/FaultCodeLists.php

@@ -37,7 +37,7 @@ class FaultCodeLists extends BaseWorkerDataLists implements ListsSearchInterface
     {
     {
         return [
         return [
             '=' => ['status','type_id'],
             '=' => ['status','type_id'],
-            '%like%' => ['codes', 'fault_name', 'detail'],
+            '%like%' => ['name'],
         ];
         ];
     }
     }
 
 
@@ -54,7 +54,7 @@ class FaultCodeLists extends BaseWorkerDataLists implements ListsSearchInterface
     public function lists(): array
     public function lists(): array
     {
     {
         return FaultCode::where($this->searchWhere)
         return FaultCode::where($this->searchWhere)
-            ->field(['id', 'codes', 'fault_name','status','detail'])
+            ->field(['id', 'name','status','type_id'])
             ->limit($this->limitOffset, $this->limitLength)
             ->limit($this->limitOffset, $this->limitLength)
             ->order(['id' => 'desc'])
             ->order(['id' => 'desc'])
             ->select()
             ->select()

+ 4 - 1
app/workerapi/logic/MasterWorkerRegisterLogic.php

@@ -11,6 +11,7 @@ use app\common\model\service_area\ServiceArea;
 use app\common\logic\BaseLogic;
 use app\common\logic\BaseLogic;
 use app\common\model\sale\Sale;
 use app\common\model\sale\Sale;
 use app\common\service\ConfigService;
 use app\common\service\ConfigService;
+use app\workerapi\lists\MasterWorkerRegisterLists;
 use think\facade\Config;
 use think\facade\Config;
 use think\facade\Db;
 use think\facade\Db;
 use think\facade\Log;
 use think\facade\Log;
@@ -28,7 +29,9 @@ class MasterWorkerRegisterLogic extends BaseLogic
      */
      */
     public static function detail($params): array
     public static function detail($params): array
     {
     {
-        return MasterWorkerRegister::findOrEmpty($params['id'])->append(['credential_images','credential_name','city_text','maintain_exp_type_text','other_exp_type_text','vehicle_type_text'])->toArray();
+        $item = MasterWorkerRegister::findOrEmpty($params['id'])->append(['credential_images','credential_name','city_text','maintain_exp_type_text','other_exp_type_text','vehicle_type_text'])->toArray();
+        $item['status'] = (new MasterWorkerRegisterLists)->requiredMasterWorker($item['worker_id'])?1:2;
+        return $item;
     }
     }
 
 
     public static function createMasterWorker(array $params)
     public static function createMasterWorker(array $params)

+ 4 - 0
app/workerapi/validate/ServiceWorkValidate.php

@@ -138,4 +138,8 @@ class ServiceWorkValidate extends BaseValidate
     {
     {
         return $this->only(['work_sn']);
         return $this->only(['work_sn']);
     }
     }
+    public function sceneCancel()
+    {
+        return $this->only(['id']);
+    }
 }
 }

BIN
public/resource/外部商品导入--批次x模板.xlsx