Kaynağa Gözat

Merge branch 'training-m' into 20250120_transfer_dev

# Conflicts:
#	app/common/logic/TableDataLogic.php
liugc 1 yıl önce
ebeveyn
işleme
193a55e96b
32 değiştirilmiş dosya ile 2795 ekleme ve 8 silme
  1. 1 5
      app/adminapi/controller/master_worker/MasterWorkerController.php
  2. 108 0
      app/adminapi/controller/training/TrainingCourseController.php
  3. 108 0
      app/adminapi/controller/training/TrainingQuestionsController.php
  4. 108 0
      app/adminapi/controller/training/TrainingTaskController.php
  5. 108 0
      app/adminapi/controller/training/TrainingWorkerCourseController.php
  6. 108 0
      app/adminapi/controller/training/TrainingWorkerTaskController.php
  7. 78 0
      app/adminapi/lists/training/TrainingCourseLists.php
  8. 78 0
      app/adminapi/lists/training/TrainingQuestionsLists.php
  9. 78 0
      app/adminapi/lists/training/TrainingTaskLists.php
  10. 78 0
      app/adminapi/lists/training/TrainingWorkerCourseLists.php
  11. 84 0
      app/adminapi/lists/training/TrainingWorkerTaskLists.php
  12. 3 3
      app/adminapi/logic/master_worker/MasterWorkerLogic.php
  13. 127 0
      app/adminapi/logic/training/TrainingCourseLogic.php
  14. 136 0
      app/adminapi/logic/training/TrainingQuestionsLogic.php
  15. 108 0
      app/adminapi/logic/training/TrainingTaskLogic.php
  16. 124 0
      app/adminapi/logic/training/TrainingWorkerCourseLogic.php
  17. 114 0
      app/adminapi/logic/training/TrainingWorkerTaskLogic.php
  18. 110 0
      app/adminapi/validate/training/TrainingCourseValidate.php
  19. 108 0
      app/adminapi/validate/training/TrainingQuestionsValidate.php
  20. 99 0
      app/adminapi/validate/training/TrainingTaskValidate.php
  21. 116 0
      app/adminapi/validate/training/TrainingWorkerCourseValidate.php
  22. 110 0
      app/adminapi/validate/training/TrainingWorkerTaskValidate.php
  23. 24 0
      app/common/logic/TableDataLogic.php
  24. 36 0
      app/common/model/training/TrainingCourse.php
  25. 36 0
      app/common/model/training/TrainingQuestions.php
  26. 36 0
      app/common/model/training/TrainingTask.php
  27. 37 0
      app/common/model/training/TrainingWorkerCourse.php
  28. 37 0
      app/common/model/training/TrainingWorkerQuestion.php
  29. 49 0
      app/common/model/training/TrainingWorkerTask.php
  30. 103 0
      app/workerapi/controller/TrainingController.php
  31. 262 0
      app/workerapi/logic/TrainingLogic.php
  32. 83 0
      app/workerapi/logic/TrainingWorkerTaskLogic.php

+ 1 - 5
app/adminapi/controller/master_worker/MasterWorkerController.php

@@ -128,10 +128,6 @@ class MasterWorkerController extends BaseAdminController
     public function getAllWorkers()
     {
         $params = (new MasterWorkerValidate())->get();
-        $result = MasterWorkerLogic::getAllWorkers($params);
-        if (false === $result) {
-            return $this->fail(MasterWorkerLogic::getError());
-        }
-        return $this->data($result);
+        return $this->data(MasterWorkerLogic::getAllWorkers($params));
     }
 }

+ 108 - 0
app/adminapi/controller/training/TrainingCourseController.php

@@ -0,0 +1,108 @@
+<?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\training;
+
+
+use app\adminapi\controller\BaseAdminController;
+use app\adminapi\lists\training\TrainingCourseLists;
+use app\adminapi\logic\training\TrainingCourseLogic;
+use app\adminapi\validate\training\TrainingCourseValidate;
+
+
+/**
+ * TrainingCourse控制器
+ * Class TrainingCourseController
+ * @package app\adminapi\controller
+ */
+class TrainingCourseController extends BaseAdminController
+{
+
+
+    /**
+     * @notes 获取列表
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public function lists()
+    {
+        return $this->dataLists(new TrainingCourseLists());
+    }
+
+
+    /**
+     * @notes 添加
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public function add()
+    {
+        $params = (new TrainingCourseValidate())->post()->goCheck('add');
+        $result = TrainingCourseLogic::add($params);
+        if (true === $result) {
+            return $this->success('添加成功', [], 1, 1);
+        }
+        return $this->fail(TrainingCourseLogic::getError());
+    }
+
+
+    /**
+     * @notes 编辑
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public function edit()
+    {
+        $params = (new TrainingCourseValidate())->post()->goCheck('edit');
+        $result = TrainingCourseLogic::edit($params);
+        if (true === $result) {
+            return $this->success('编辑成功', [], 1, 1);
+        }
+        return $this->fail(TrainingCourseLogic::getError());
+    }
+
+
+    /**
+     * @notes 删除
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public function delete()
+    {
+        $params = (new TrainingCourseValidate())->post()->goCheck('delete');
+        TrainingCourseLogic::delete($params);
+        return $this->success('删除成功', [], 1, 1);
+    }
+
+
+    /**
+     * @notes 获取详情
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public function detail()
+    {
+        $params = (new TrainingCourseValidate())->goCheck('detail');
+        $result = TrainingCourseLogic::detail($params);
+        return $this->data($result);
+    }
+
+
+}

+ 108 - 0
app/adminapi/controller/training/TrainingQuestionsController.php

@@ -0,0 +1,108 @@
+<?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\training;
+
+
+use app\adminapi\controller\BaseAdminController;
+use app\adminapi\lists\training\TrainingQuestionsLists;
+use app\adminapi\logic\training\TrainingQuestionsLogic;
+use app\adminapi\validate\training\TrainingQuestionsValidate;
+
+
+/**
+ * TrainingQuestions控制器
+ * Class TrainingQuestionsController
+ * @package app\adminapi\controller
+ */
+class TrainingQuestionsController extends BaseAdminController
+{
+
+
+    /**
+     * @notes 获取列表
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public function lists()
+    {
+        return $this->dataLists(new TrainingQuestionsLists());
+    }
+
+
+    /**
+     * @notes 添加
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public function add()
+    {
+        $params = (new TrainingQuestionsValidate())->post()->goCheck('add');
+        $result = TrainingQuestionsLogic::add($params);
+        if (true === $result) {
+            return $this->success('添加成功', [], 1, 1);
+        }
+        return $this->fail(TrainingQuestionsLogic::getError());
+    }
+
+
+    /**
+     * @notes 编辑
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public function edit()
+    {
+        $params = (new TrainingQuestionsValidate())->post()->goCheck('edit');
+        $result = TrainingQuestionsLogic::edit($params);
+        if (true === $result) {
+            return $this->success('编辑成功', [], 1, 1);
+        }
+        return $this->fail(TrainingQuestionsLogic::getError());
+    }
+
+
+    /**
+     * @notes 删除
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public function delete()
+    {
+        $params = (new TrainingQuestionsValidate())->post()->goCheck('delete');
+        TrainingQuestionsLogic::delete($params);
+        return $this->success('删除成功', [], 1, 1);
+    }
+
+
+    /**
+     * @notes 获取详情
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public function detail()
+    {
+        $params = (new TrainingQuestionsValidate())->goCheck('detail');
+        $result = TrainingQuestionsLogic::detail($params);
+        return $this->data($result);
+    }
+
+
+}

+ 108 - 0
app/adminapi/controller/training/TrainingTaskController.php

@@ -0,0 +1,108 @@
+<?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\training;
+
+
+use app\adminapi\controller\BaseAdminController;
+use app\adminapi\lists\training\TrainingTaskLists;
+use app\adminapi\logic\training\TrainingTaskLogic;
+use app\adminapi\validate\training\TrainingTaskValidate;
+
+
+/**
+ * TrainingTask控制器
+ * Class TrainingTaskController
+ * @package app\adminapi\controller
+ */
+class TrainingTaskController extends BaseAdminController
+{
+
+
+    /**
+     * @notes 获取列表
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public function lists()
+    {
+        return $this->dataLists(new TrainingTaskLists());
+    }
+
+
+    /**
+     * @notes 添加
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public function add()
+    {
+        $params = (new TrainingTaskValidate())->post()->goCheck('add');
+        $result = TrainingTaskLogic::add($params);
+        if (true === $result) {
+            return $this->success('添加成功', [], 1, 1);
+        }
+        return $this->fail(TrainingTaskLogic::getError());
+    }
+
+
+    /**
+     * @notes 编辑
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public function edit()
+    {
+        $params = (new TrainingTaskValidate())->post()->goCheck('edit');
+        $result = TrainingTaskLogic::edit($params);
+        if (true === $result) {
+            return $this->success('编辑成功', [], 1, 1);
+        }
+        return $this->fail(TrainingTaskLogic::getError());
+    }
+
+
+    /**
+     * @notes 删除
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public function delete()
+    {
+        $params = (new TrainingTaskValidate())->post()->goCheck('delete');
+        TrainingTaskLogic::delete($params);
+        return $this->success('删除成功', [], 1, 1);
+    }
+
+
+    /**
+     * @notes 获取详情
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public function detail()
+    {
+        $params = (new TrainingTaskValidate())->goCheck('detail');
+        $result = TrainingTaskLogic::detail($params);
+        return $this->data($result);
+    }
+
+
+}

+ 108 - 0
app/adminapi/controller/training/TrainingWorkerCourseController.php

@@ -0,0 +1,108 @@
+<?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\training;
+
+
+use app\adminapi\controller\BaseAdminController;
+use app\adminapi\lists\training\TrainingWorkerCourseLists;
+use app\adminapi\logic\training\TrainingWorkerCourseLogic;
+use app\adminapi\validate\training\TrainingWorkerCourseValidate;
+
+
+/**
+ * TrainingWorkerCourse控制器
+ * Class TrainingWorkerCourseController
+ * @package app\adminapi\controller
+ */
+class TrainingWorkerCourseController extends BaseAdminController
+{
+
+
+    /**
+     * @notes 获取列表
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public function lists()
+    {
+        return $this->dataLists(new TrainingWorkerCourseLists());
+    }
+
+
+    /**
+     * @notes 添加
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public function add()
+    {
+        $params = (new TrainingWorkerCourseValidate())->post()->goCheck('add');
+        $result = TrainingWorkerCourseLogic::add($params);
+        if (true === $result) {
+            return $this->success('添加成功', [], 1, 1);
+        }
+        return $this->fail(TrainingWorkerCourseLogic::getError());
+    }
+
+
+    /**
+     * @notes 编辑
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public function edit()
+    {
+        $params = (new TrainingWorkerCourseValidate())->post()->goCheck('edit');
+        $result = TrainingWorkerCourseLogic::edit($params);
+        if (true === $result) {
+            return $this->success('编辑成功', [], 1, 1);
+        }
+        return $this->fail(TrainingWorkerCourseLogic::getError());
+    }
+
+
+    /**
+     * @notes 删除
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public function delete()
+    {
+        $params = (new TrainingWorkerCourseValidate())->post()->goCheck('delete');
+        TrainingWorkerCourseLogic::delete($params);
+        return $this->success('删除成功', [], 1, 1);
+    }
+
+
+    /**
+     * @notes 获取详情
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public function detail()
+    {
+        $params = (new TrainingWorkerCourseValidate())->goCheck('detail');
+        $result = TrainingWorkerCourseLogic::detail($params);
+        return $this->data($result);
+    }
+
+
+}

+ 108 - 0
app/adminapi/controller/training/TrainingWorkerTaskController.php

@@ -0,0 +1,108 @@
+<?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\training;
+
+
+use app\adminapi\controller\BaseAdminController;
+use app\adminapi\lists\training\TrainingWorkerTaskLists;
+use app\adminapi\logic\training\TrainingWorkerTaskLogic;
+use app\adminapi\validate\training\TrainingWorkerTaskValidate;
+
+
+/**
+ * TrainingWorkerTask控制器
+ * Class TrainingWorkerTaskController
+ * @package app\adminapi\controller
+ */
+class TrainingWorkerTaskController extends BaseAdminController
+{
+
+
+    /**
+     * @notes 获取列表
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public function lists()
+    {
+        return $this->dataLists(new TrainingWorkerTaskLists());
+    }
+
+
+    /**
+     * @notes 添加
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public function add()
+    {
+        $params = (new TrainingWorkerTaskValidate())->post()->goCheck('add');
+        $result = TrainingWorkerTaskLogic::add($params);
+        if (true === $result) {
+            return $this->success('添加成功', [], 1, 1);
+        }
+        return $this->fail(TrainingWorkerTaskLogic::getError());
+    }
+
+
+    /**
+     * @notes 编辑
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public function edit()
+    {
+        $params = (new TrainingWorkerTaskValidate())->post()->goCheck('edit');
+        $result = TrainingWorkerTaskLogic::edit($params);
+        if (true === $result) {
+            return $this->success('编辑成功', [], 1, 1);
+        }
+        return $this->fail(TrainingWorkerTaskLogic::getError());
+    }
+
+
+    /**
+     * @notes 删除
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public function delete()
+    {
+        $params = (new TrainingWorkerTaskValidate())->post()->goCheck('delete');
+        TrainingWorkerTaskLogic::delete($params);
+        return $this->success('删除成功', [], 1, 1);
+    }
+
+
+    /**
+     * @notes 获取详情
+     * @return \think\response\Json
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public function detail()
+    {
+        $params = (new TrainingWorkerTaskValidate())->goCheck('detail');
+        $result = TrainingWorkerTaskLogic::detail($params);
+        return $this->data($result);
+    }
+
+
+}

+ 78 - 0
app/adminapi/lists/training/TrainingCourseLists.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\training;
+
+
+use app\adminapi\lists\BaseAdminDataLists;
+use app\common\model\training\TrainingCourse;
+use app\common\lists\ListsSearchInterface;
+
+
+/**
+ * TrainingCourse列表
+ * Class TrainingCourseLists
+ * @package app\adminapi\lists
+ */
+class TrainingCourseLists extends BaseAdminDataLists implements ListsSearchInterface
+{
+
+
+    /**
+     * @notes 设置搜索条件
+     * @return \string[][]
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public function setSearch(): array
+    {
+        return [
+            '=' => ['course_picture', 'course_url', 'course_lock', 'course_length', 'course_question_setting', 'course_question_score'],
+            '%like%' => ['course_name'],
+        ];
+    }
+
+
+    /**
+     * @notes 获取列表
+     * @return array
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public function lists(): array
+    {
+        return TrainingCourse::where($this->searchWhere)
+            ->field(['id', 'course_name', 'course_picture', 'course_url', 'course_lock', 'course_length', 'course_question_setting', 'course_question_score'])
+            ->limit($this->limitOffset, $this->limitLength)
+            ->order(['id' => 'desc'])
+            ->select()
+            ->toArray();
+    }
+
+
+    /**
+     * @notes 获取数量
+     * @return int
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public function count(): int
+    {
+        return TrainingCourse::where($this->searchWhere)->count();
+    }
+
+}

+ 78 - 0
app/adminapi/lists/training/TrainingQuestionsLists.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\training;
+
+
+use app\adminapi\lists\BaseAdminDataLists;
+use app\common\model\training\TrainingQuestions;
+use app\common\lists\ListsSearchInterface;
+
+
+/**
+ * TrainingQuestions列表
+ * Class TrainingQuestionsLists
+ * @package app\adminapi\lists
+ */
+class TrainingQuestionsLists extends BaseAdminDataLists implements ListsSearchInterface
+{
+
+
+    /**
+     * @notes 设置搜索条件
+     * @return \string[][]
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public function setSearch(): array
+    {
+        return [
+            '=' => ['training_course_id', 'question_type', 'question_selects', 'question_answer', 'question_analysis'],
+            '%like%' => ['title'],
+        ];
+    }
+
+
+    /**
+     * @notes 获取列表
+     * @return array
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public function lists(): array
+    {
+        return TrainingQuestions::where($this->searchWhere)
+            ->field(['id', 'training_course_id', 'title', 'question_type', 'question_selects', 'question_answer', 'question_analysis'])
+            ->limit($this->limitOffset, $this->limitLength)
+            ->order(['id' => 'desc'])
+            ->select()
+            ->toArray();
+    }
+
+
+    /**
+     * @notes 获取数量
+     * @return int
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public function count(): int
+    {
+        return TrainingQuestions::where($this->searchWhere)->count();
+    }
+
+}

+ 78 - 0
app/adminapi/lists/training/TrainingTaskLists.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\training;
+
+
+use app\adminapi\lists\BaseAdminDataLists;
+use app\common\model\training\TrainingTask;
+use app\common\lists\ListsSearchInterface;
+
+
+/**
+ * TrainingTask列表
+ * Class TrainingTaskLists
+ * @package app\adminapi\lists
+ */
+class TrainingTaskLists extends BaseAdminDataLists implements ListsSearchInterface
+{
+
+
+    /**
+     * @notes 设置搜索条件
+     * @return \string[][]
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public function setSearch(): array
+    {
+        return [
+            '=' => ['training_course_id'],
+            '%like%' => ['task_name'],
+        ];
+    }
+
+
+    /**
+     * @notes 获取列表
+     * @return array
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public function lists(): array
+    {
+        return TrainingTask::where($this->searchWhere)
+            ->field(['id', 'task_name', 'training_course_id'])
+            ->limit($this->limitOffset, $this->limitLength)
+            ->order(['id' => 'desc'])
+            ->select()
+            ->toArray();
+    }
+
+
+    /**
+     * @notes 获取数量
+     * @return int
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public function count(): int
+    {
+        return TrainingTask::where($this->searchWhere)->count();
+    }
+
+}

+ 78 - 0
app/adminapi/lists/training/TrainingWorkerCourseLists.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\training;
+
+
+use app\adminapi\lists\BaseAdminDataLists;
+use app\common\model\training\TrainingWorkerCourse;
+use app\common\lists\ListsSearchInterface;
+
+
+/**
+ * TrainingWorkerCourse列表
+ * Class TrainingWorkerCourseLists
+ * @package app\adminapi\lists
+ */
+class TrainingWorkerCourseLists extends BaseAdminDataLists implements ListsSearchInterface
+{
+
+
+    /**
+     * @notes 设置搜索条件
+     * @return \string[][]
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public function setSearch(): array
+    {
+        return [
+            '=' => ['master_worker_id', 'training_task_id', 'training_course_id', 'play_time', 'exam_start_time', 'exam_end_time', 'study_status', 'question_all_score', 'question_qualified_score', 'exam_score'],
+
+        ];
+    }
+
+
+    /**
+     * @notes 获取列表
+     * @return array
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public function lists(): array
+    {
+        return TrainingWorkerCourse::where($this->searchWhere)
+            ->field(['id', 'master_worker_id', 'training_task_id', 'training_course_id', 'play_time', 'exam_start_time', 'exam_end_time', 'study_status', 'question_all_score', 'question_qualified_score', 'exam_score'])
+            ->limit($this->limitOffset, $this->limitLength)
+            ->order(['id' => 'desc'])
+            ->select()
+            ->toArray();
+    }
+
+
+    /**
+     * @notes 获取数量
+     * @return int
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public function count(): int
+    {
+        return TrainingWorkerCourse::where($this->searchWhere)->count();
+    }
+
+}

+ 84 - 0
app/adminapi/lists/training/TrainingWorkerTaskLists.php

@@ -0,0 +1,84 @@
+<?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\training;
+
+
+use app\adminapi\lists\BaseAdminDataLists;
+use app\common\model\training\TrainingWorkerTask;
+use app\common\lists\ListsSearchInterface;
+
+
+/**
+ * TrainingWorkerTask列表
+ * Class TrainingWorkerTaskLists
+ * @package app\adminapi\lists
+ */
+class TrainingWorkerTaskLists extends BaseAdminDataLists implements ListsSearchInterface
+{
+
+
+    /**
+     * @notes 设置搜索条件
+     * @return \string[][]
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public function setSearch(): array
+    {
+        return [
+            '=' => ['master_worker_id', 'shop_goods_id', 'shop_orders_id', 'training_task_id', 'training_status', 'lead_master_worker_id', 'operate_status'],
+
+        ];
+    }
+
+
+    /**
+     * @notes 获取列表
+     * @return array
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public function lists(): array
+    {
+        return TrainingWorkerTask::with([
+                'TrainingTask',
+                'MasterWorker',
+                'LeadMasterWorker',
+                'ShopGoods',
+                'ShopOrders',
+            ])->where($this->searchWhere)
+            ->field(['id', 'master_worker_id', 'shop_goods_id', 'shop_orders_id', 'training_task_id', 'training_status', 'lead_master_worker_id', 'operate_status'])
+            ->limit($this->limitOffset, $this->limitLength)
+            ->order(['id' => 'desc'])
+            ->select()
+            ->toArray();
+    }
+
+
+    /**
+     * @notes 获取数量
+     * @return int
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public function count(): int
+    {
+        return TrainingWorkerTask::where($this->searchWhere)->count();
+    }
+
+}

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

@@ -216,14 +216,14 @@ class MasterWorkerLogic extends BaseLogic
     /**
      * 获取所有工程师选项列表
      * @param $params
-     * @return false|string
+     * @return array
      */
     public static function getAllWorkers($params){
         try{
-            return MasterWorker::where(['is_disable'=>0])->column('id,id as value,worker_number as name,account,mobile');
+            return MasterWorker::where(['is_disable'=>0])->column('id,id as value,worker_number as name,real_name,account,mobile');
         } catch (\Exception $e){
             self::setError($e->getMessage());
-            return false;
+            return [];
         }
 
     }

+ 127 - 0
app/adminapi/logic/training/TrainingCourseLogic.php

@@ -0,0 +1,127 @@
+<?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\training;
+
+
+use app\common\model\training\TrainingCourse;
+use app\common\logic\BaseLogic;
+use think\facade\Db;
+
+
+/**
+ * TrainingCourse逻辑
+ * Class TrainingCourseLogic
+ * @package app\adminapi\logic
+ */
+class TrainingCourseLogic extends BaseLogic
+{
+
+
+    /**
+     * @notes 添加
+     * @param array $params
+     * @return bool
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public static function add(array $params): bool
+    {
+        Db::startTrans();
+        try {
+            TrainingCourse::create([
+                'course_name' => $params['course_name'],
+                'course_picture' => $params['course_picture'],
+                'course_url' => $params['course_url'],
+                'course_lock' => $params['course_lock'],
+                'course_length' => $params['course_length'],
+                'course_question_setting' => self::configureReservedField($params['course_question_setting']??[]),
+                'course_question_score' => $params['course_question_score'],
+            ]);
+
+            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/02/14 17:37
+     */
+    public static function edit(array $params): bool
+    {
+        Db::startTrans();
+        try {
+            TrainingCourse::where('id', $params['id'])->update([
+                'course_name' => $params['course_name'],
+                'course_picture' => $params['course_picture'],
+                'course_url' => $params['course_url'],
+                'course_lock' => $params['course_lock'],
+                'course_length' => $params['course_length'],
+                'course_question_setting' => json_encode(self::configureReservedField($params['course_question_setting']??[])),
+                'course_question_score' => $params['course_question_score'],
+            ]);
+
+            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/02/14 17:37
+     */
+    public static function delete(array $params): bool
+    {
+        return TrainingCourse::destroy($params['id']);
+    }
+
+
+    /**
+     * @notes 获取详情
+     * @param $params
+     * @return array
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public static function detail($params): array
+    {
+        return TrainingCourse::findOrEmpty($params['id'])->toArray();
+    }
+
+    public static function configureReservedField($data): array
+    {
+        foreach ($data as $key => &$item) {
+            $data[$key]['block_key'] = $key+1;
+            $item['select_value'] = (int)$item['select_value'];
+        }
+        return $data??[];
+    }
+}

+ 136 - 0
app/adminapi/logic/training/TrainingQuestionsLogic.php

@@ -0,0 +1,136 @@
+<?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\training;
+
+
+use app\common\model\training\TrainingQuestions;
+use app\common\logic\BaseLogic;
+use think\facade\Db;
+
+
+/**
+ * TrainingQuestions逻辑
+ * Class TrainingQuestionsLogic
+ * @package app\adminapi\logic
+ */
+class TrainingQuestionsLogic extends BaseLogic
+{
+
+    public static $select_value = [];
+    /**
+     * @notes 添加
+     * @param array $params
+     * @return bool
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public static function add(array $params): bool
+    {
+        Db::startTrans();
+        try {
+            TrainingQuestions::create([
+                'training_course_id' => $params['training_course_id'],
+                'title' => $params['title'],
+                'question_type' => $params['question_type'],
+                //'question_selects' => $params['question_selects'],
+                'question_selects' => self::configureReservedField($params['question_selects']??[]),
+                'question_answer' => self::$select_value?implode(',',self::$select_value):'',
+                'question_analysis' => $params['question_analysis'],
+            ]);
+
+            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/02/14 13:49
+     */
+    public static function edit(array $params): bool
+    {
+
+        Db::startTrans();
+        try {
+            TrainingQuestions::where('id', $params['id'])->update([
+                'training_course_id' => $params['training_course_id'],
+                'title' => $params['title'],
+                'question_type' => $params['question_type'],
+                'question_selects' => json_encode(self::configureReservedField($params['question_selects']??[])),
+                'question_answer' => self::$select_value?implode(',',self::$select_value):'',
+                'question_analysis' => $params['question_analysis'],
+            ]);
+
+            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/02/14 13:49
+     */
+    public static function delete(array $params): bool
+    {
+        return TrainingQuestions::destroy($params['id']);
+    }
+
+
+    /**
+     * @notes 获取详情
+     * @param $params
+     * @return array
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public static function detail($params): array
+    {
+        return TrainingQuestions::findOrEmpty($params['id'])->toArray();
+    }
+
+    public static function configureReservedField($data): array
+    {
+        $select_value = [];
+        foreach ($data as $key => &$item) {
+            $data[$key]['block_key'] = $key+1;
+            if($item['select_value']){
+                $select_value[] = $data[$key]['block_key'];
+                $item['select_value'] = \true;
+            }else{
+                $item['select_value'] = \false;
+            }
+        }
+        self::$select_value = $select_value;
+        return $data??[];
+    }
+
+
+}

+ 108 - 0
app/adminapi/logic/training/TrainingTaskLogic.php

@@ -0,0 +1,108 @@
+<?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\training;
+
+
+use app\common\model\training\TrainingTask;
+use app\common\logic\BaseLogic;
+use think\facade\Db;
+
+
+/**
+ * TrainingTask逻辑
+ * Class TrainingTaskLogic
+ * @package app\adminapi\logic
+ */
+class TrainingTaskLogic extends BaseLogic
+{
+
+
+    /**
+     * @notes 添加
+     * @param array $params
+     * @return bool
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public static function add(array $params): bool
+    {
+        Db::startTrans();
+        try {
+            TrainingTask::create([
+                'task_name' => $params['task_name'],
+                'training_course_id' => array_map('intval', $params['training_course_id'])
+            ]);
+
+            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/02/14 17:45
+     */
+    public static function edit(array $params): bool
+    {
+        Db::startTrans();
+        try {
+            TrainingTask::where('id', $params['id'])->update([
+                'task_name' => $params['task_name'],
+                'training_course_id' => json_encode(array_map('intval', $params['training_course_id']))
+            ]);
+
+            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/02/14 17:45
+     */
+    public static function delete(array $params): bool
+    {
+        return TrainingTask::destroy($params['id']);
+    }
+
+
+    /**
+     * @notes 获取详情
+     * @param $params
+     * @return array
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public static function detail($params): array
+    {
+        return TrainingTask::findOrEmpty($params['id'])->toArray();
+    }
+}

+ 124 - 0
app/adminapi/logic/training/TrainingWorkerCourseLogic.php

@@ -0,0 +1,124 @@
+<?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\training;
+
+
+use app\common\model\training\TrainingWorkerCourse;
+use app\common\logic\BaseLogic;
+use think\facade\Db;
+
+
+/**
+ * TrainingWorkerCourse逻辑
+ * Class TrainingWorkerCourseLogic
+ * @package app\adminapi\logic
+ */
+class TrainingWorkerCourseLogic extends BaseLogic
+{
+
+
+    /**
+     * @notes 添加
+     * @param array $params
+     * @return bool
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public static function add(array $params): bool
+    {
+        Db::startTrans();
+        try {
+            TrainingWorkerCourse::create([
+                'master_worker_id' => $params['master_worker_id'],
+                'training_task_id' => $params['training_task_id'],
+                'training_course_id' => $params['training_course_id'],
+                'play_time' => $params['play_time'],
+                'exam_start_time' => $params['exam_start_time'],
+                'exam_end_time' => $params['exam_end_time'],
+                'study_status' => $params['study_status'],
+                'question_all_score' => $params['question_all_score'],
+                'question_qualified_score' => $params['question_qualified_score'],
+                'exam_score' => $params['exam_score'],
+            ]);
+
+            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/02/16 16:44
+     */
+    public static function edit(array $params): bool
+    {
+        Db::startTrans();
+        try {
+            TrainingWorkerCourse::where('id', $params['id'])->update([
+                'master_worker_id' => $params['master_worker_id'],
+                'training_task_id' => $params['training_task_id'],
+                'training_course_id' => $params['training_course_id'],
+                'play_time' => $params['play_time'],
+                'exam_start_time' => $params['exam_start_time'],
+                'exam_end_time' => $params['exam_end_time'],
+                'study_status' => $params['study_status'],
+                'question_all_score' => $params['question_all_score'],
+                'question_qualified_score' => $params['question_qualified_score'],
+                'exam_score' => $params['exam_score'],
+            ]);
+
+            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/02/16 16:44
+     */
+    public static function delete(array $params): bool
+    {
+        return TrainingWorkerCourse::destroy($params['id']);
+    }
+
+
+    /**
+     * @notes 获取详情
+     * @param $params
+     * @return array
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public static function detail($params): array
+    {
+        return TrainingWorkerCourse::findOrEmpty($params['id'])->toArray();
+    }
+}

+ 114 - 0
app/adminapi/logic/training/TrainingWorkerTaskLogic.php

@@ -0,0 +1,114 @@
+<?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\training;
+
+
+use app\common\model\training\TrainingWorkerTask;
+use app\common\logic\BaseLogic;
+use think\facade\Db;
+
+
+/**
+ * TrainingWorkerTask逻辑
+ * Class TrainingWorkerTaskLogic
+ * @package app\adminapi\logic
+ */
+class TrainingWorkerTaskLogic extends BaseLogic
+{
+
+
+    /**
+     * @notes 添加
+     * @param array $params
+     * @return bool
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public static function add(array $params): bool
+    {
+        Db::startTrans();
+        try {
+            TrainingWorkerTask::create([
+                'master_worker_id' => $params['master_worker_id'],
+                'shop_goods_id' => $params['shop_goods_id'],
+                'training_task_id' => $params['training_task_id'],
+                'lead_master_worker_id' => $params['lead_master_worker_id'],
+                'operate_status' => $params['operate_status']??0,
+            ]);
+
+            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/02/16 13:49
+     */
+    public static function edit(array $params): bool
+    {
+        Db::startTrans();
+        try {
+            TrainingWorkerTask::where('id', $params['id'])->update([
+                'master_worker_id' => $params['master_worker_id'],
+                'shop_goods_id' => $params['shop_goods_id'],
+                'training_task_id' => $params['training_task_id'],
+                'lead_master_worker_id' => $params['lead_master_worker_id'],
+                'operate_status' => $params['operate_status']??0,
+            ]);
+
+            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/02/16 13:49
+     */
+    public static function delete(array $params): bool
+    {
+        return TrainingWorkerTask::destroy($params['id']);
+    }
+
+
+    /**
+     * @notes 获取详情
+     * @param $params
+     * @return array
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public static function detail($params): array
+    {
+        return TrainingWorkerTask::findOrEmpty($params['id'])->toArray();
+    }
+}

+ 110 - 0
app/adminapi/validate/training/TrainingCourseValidate.php

@@ -0,0 +1,110 @@
+<?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\training;
+
+
+use app\common\validate\BaseValidate;
+
+
+/**
+ * TrainingCourse验证器
+ * Class TrainingCourseValidate
+ * @package app\adminapi\validate
+ */
+class TrainingCourseValidate extends BaseValidate
+{
+
+     /**
+      * 设置校验规则
+      * @var string[]
+      */
+    protected $rule = [
+        'id' => 'require',
+        'course_name' => 'require',
+        'course_picture' => 'require',
+        'course_url' => 'require',
+        'course_lock' => 'require',
+        'course_length' => 'require',
+        'course_question_setting' => 'require',
+        'course_question_score' => 'require',
+
+    ];
+
+
+    /**
+     * 参数描述
+     * @var string[]
+     */
+    protected $field = [
+        'id' => 'id',
+        'course_name' => '课程名称',
+        'course_picture' => '课程图片',
+        'course_url' => '课程链接(mp4)',
+        'course_lock' => '是否免费',
+        'course_length' => '课程时长',
+        'course_question_setting' => '试题配置 JSON',
+        'course_question_score' => '合格分',
+
+    ];
+
+
+    /**
+     * @notes 添加场景
+     * @return TrainingCourseValidate
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public function sceneAdd()
+    {
+        return $this->only(['course_name','course_picture','course_url','course_lock','course_question_setting','course_question_score']);
+    }
+
+
+    /**
+     * @notes 编辑场景
+     * @return TrainingCourseValidate
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public function sceneEdit()
+    {
+        return $this->only(['id','course_name','course_picture','course_url','course_lock','course_question_setting','course_question_score']);
+    }
+
+
+    /**
+     * @notes 删除场景
+     * @return TrainingCourseValidate
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public function sceneDelete()
+    {
+        return $this->only(['id']);
+    }
+
+
+    /**
+     * @notes 详情场景
+     * @return TrainingCourseValidate
+     * @author likeadmin
+     * @date 2025/02/14 17:37
+     */
+    public function sceneDetail()
+    {
+        return $this->only(['id']);
+    }
+
+}

+ 108 - 0
app/adminapi/validate/training/TrainingQuestionsValidate.php

@@ -0,0 +1,108 @@
+<?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\training;
+
+
+use app\common\validate\BaseValidate;
+
+
+/**
+ * TrainingQuestions验证器
+ * Class TrainingQuestionsValidate
+ * @package app\adminapi\validate
+ */
+class TrainingQuestionsValidate extends BaseValidate
+{
+
+     /**
+      * 设置校验规则
+      * @var string[]
+      */
+    protected $rule = [
+        'id' => 'require',
+        'training_course_id' => 'require',
+        'title' => 'require',
+        'question_type' => 'require',
+        'question_selects' => 'require',
+        'question_answer' => 'require',
+        'question_analysis' => 'require',
+
+    ];
+
+
+    /**
+     * 参数描述
+     * @var string[]
+     */
+    protected $field = [
+        'id' => 'id',
+        'training_course_id' => '课程 ID',
+        'title' => '试题名称',
+        'question_type' => '试题类型',
+        'question_selects' => '试题选项(含各选项内容)',
+        'question_answer' => '试题答案',
+        'question_analysis' => '试题解析',
+
+    ];
+
+
+    /**
+     * @notes 添加场景
+     * @return TrainingQuestionsValidate
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public function sceneAdd()
+    {
+        return $this->only(['title','question_type','question_selects','question_analysis']);
+    }
+
+
+    /**
+     * @notes 编辑场景
+     * @return TrainingQuestionsValidate
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public function sceneEdit()
+    {
+        return $this->only(['id','title','question_type','question_selects','question_analysis']);
+    }
+
+
+    /**
+     * @notes 删除场景
+     * @return TrainingQuestionsValidate
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public function sceneDelete()
+    {
+        return $this->only(['id']);
+    }
+
+
+    /**
+     * @notes 详情场景
+     * @return TrainingQuestionsValidate
+     * @author likeadmin
+     * @date 2025/02/14 13:49
+     */
+    public function sceneDetail()
+    {
+        return $this->only(['id']);
+    }
+
+}

+ 99 - 0
app/adminapi/validate/training/TrainingTaskValidate.php

@@ -0,0 +1,99 @@
+<?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\training;
+
+
+use app\common\validate\BaseValidate;
+
+
+/**
+ * TrainingTask验证器
+ * Class TrainingTaskValidate
+ * @package app\adminapi\validate
+ */
+class TrainingTaskValidate extends BaseValidate
+{
+
+     /**
+      * 设置校验规则
+      * @var string[]
+      */
+    protected $rule = [
+        'id' => 'require',
+        'task_name' => 'require',
+        'training_course_id' => 'require'
+    ];
+
+
+    /**
+     * 参数描述
+     * @var string[]
+     */
+    protected $field = [
+        'id' => 'id',
+        'task_name' => '名称',
+        'training_course_id' => '课程id(逗号拼接)'
+
+    ];
+
+
+    /**
+     * @notes 添加场景
+     * @return TrainingTaskValidate
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public function sceneAdd()
+    {
+        return $this->only(['task_name','training_course_id']);
+    }
+
+
+    /**
+     * @notes 编辑场景
+     * @return TrainingTaskValidate
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public function sceneEdit()
+    {
+        return $this->only(['id','task_name','training_course_id']);
+    }
+
+
+    /**
+     * @notes 删除场景
+     * @return TrainingTaskValidate
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public function sceneDelete()
+    {
+        return $this->only(['id']);
+    }
+
+
+    /**
+     * @notes 详情场景
+     * @return TrainingTaskValidate
+     * @author likeadmin
+     * @date 2025/02/14 17:45
+     */
+    public function sceneDetail()
+    {
+        return $this->only(['id']);
+    }
+
+}

+ 116 - 0
app/adminapi/validate/training/TrainingWorkerCourseValidate.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\validate\training;
+
+
+use app\common\validate\BaseValidate;
+
+
+/**
+ * TrainingWorkerCourse验证器
+ * Class TrainingWorkerCourseValidate
+ * @package app\adminapi\validate
+ */
+class TrainingWorkerCourseValidate extends BaseValidate
+{
+
+     /**
+      * 设置校验规则
+      * @var string[]
+      */
+    protected $rule = [
+        'id' => 'require',
+        'master_worker_id' => 'require',
+        'training_task_id' => 'require',
+        'training_course_id' => 'require',
+        'play_time' => 'require',
+        'exam_start_time' => 'require',
+        'exam_end_time' => 'require',
+        'study_status' => 'require',
+        'question_all_score' => 'require',
+        'question_qualified_score' => 'require',
+        'exam_score' => 'require',
+
+    ];
+
+
+    /**
+     * 参数描述
+     * @var string[]
+     */
+    protected $field = [
+        'id' => 'id',
+        'master_worker_id' => '师傅id',
+        'training_task_id' => '培训任务ID',
+        'training_course_id' => '课程ID',
+        'play_time' => '播放时间秒',
+        'exam_start_time' => '考试开始时间秒',
+        'exam_end_time' => '考试结束时间秒',
+        'study_status' => '状态 0未学习  1学习中  2待考试  3考试中  4考试不合格   5已学完',
+        'question_all_score' => '试题总分',
+        'question_qualified_score' => '合格分',
+        'exam_score' => '实际考试得分',
+
+    ];
+
+
+    /**
+     * @notes 添加场景
+     * @return TrainingWorkerCourseValidate
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public function sceneAdd()
+    {
+        return $this->only(['master_worker_id','training_task_id','training_course_id','play_time','exam_start_time','exam_end_time','study_status','question_all_score','question_qualified_score','exam_score']);
+    }
+
+
+    /**
+     * @notes 编辑场景
+     * @return TrainingWorkerCourseValidate
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public function sceneEdit()
+    {
+        return $this->only(['id','master_worker_id','training_task_id','training_course_id','play_time','exam_start_time','exam_end_time','study_status','question_all_score','question_qualified_score','exam_score']);
+    }
+
+
+    /**
+     * @notes 删除场景
+     * @return TrainingWorkerCourseValidate
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public function sceneDelete()
+    {
+        return $this->only(['id']);
+    }
+
+
+    /**
+     * @notes 详情场景
+     * @return TrainingWorkerCourseValidate
+     * @author likeadmin
+     * @date 2025/02/16 16:44
+     */
+    public function sceneDetail()
+    {
+        return $this->only(['id']);
+    }
+
+}

+ 110 - 0
app/adminapi/validate/training/TrainingWorkerTaskValidate.php

@@ -0,0 +1,110 @@
+<?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\training;
+
+
+use app\common\validate\BaseValidate;
+
+
+/**
+ * TrainingWorkerTask验证器
+ * Class TrainingWorkerTaskValidate
+ * @package app\adminapi\validate
+ */
+class TrainingWorkerTaskValidate extends BaseValidate
+{
+
+     /**
+      * 设置校验规则
+      * @var string[]
+      */
+    protected $rule = [
+        'id' => 'require',
+        'master_worker_id' => 'require',
+        'shop_goods_id' => 'require',
+        'shop_orders_id' => 'require',
+        'training_task_id' => 'require',
+        'training_status' => 'require',
+        'lead_master_worker_id' => 'require',
+        'operate_status' => 'require',
+
+    ];
+
+
+    /**
+     * 参数描述
+     * @var string[]
+     */
+    protected $field = [
+        'id' => 'id',
+        'master_worker_id' => '师傅id',
+        'shop_goods_id' => '商品id(套餐)',
+        'shop_orders_id' => '购买单号id',
+        'training_task_id' => '培训任务ID',
+        'training_status' => '培训状态',
+        'lead_master_worker_id' => '带徒师傅id',
+        'operate_status' => '实操状态',
+
+    ];
+
+
+    /**
+     * @notes 添加场景
+     * @return TrainingWorkerTaskValidate
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public function sceneAdd()
+    {
+        return $this->only(['master_worker_id','shop_goods_id','training_task_id','lead_master_worker_id']);
+    }
+
+
+    /**
+     * @notes 编辑场景
+     * @return TrainingWorkerTaskValidate
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public function sceneEdit()
+    {
+        return $this->only(['id','master_worker_id','shop_goods_id','training_task_id','lead_master_worker_id']);
+    }
+
+
+    /**
+     * @notes 删除场景
+     * @return TrainingWorkerTaskValidate
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public function sceneDelete()
+    {
+        return $this->only(['id']);
+    }
+
+
+    /**
+     * @notes 详情场景
+     * @return TrainingWorkerTaskValidate
+     * @author likeadmin
+     * @date 2025/02/16 13:49
+     */
+    public function sceneDetail()
+    {
+        return $this->only(['id']);
+    }
+
+}

+ 24 - 0
app/common/logic/TableDataLogic.php

@@ -30,6 +30,10 @@ use app\common\model\sale\Sale;
 use app\common\model\sale\SaleGroup;
 use app\common\model\setting\PostageRegion;
 use app\common\model\tenant\Tenant;
+use app\common\model\shops\ShopGoods;
+use app\common\model\training\TrainingCourse;
+use app\common\model\training\TrainingQuestions;
+use app\common\model\training\TrainingTask;
 use app\common\service\pay\AliPayService;
 use app\common\service\pay\WeChatPayService;
 
@@ -137,8 +141,28 @@ class TableDataLogic extends BaseLogic
     {
         return Admin::where('disable','=',0)->field('id,name,id as value,"data_table_admins" as type_value')->select()->toArray();
     }
+
     public static function tenant()
     {
         return Tenant::where('disable','=',0)->field('id,name,id as value,"data_table_tenant" as type_value')->select()->toArray();
     }
+
+    public static function trainingQuestions()
+    {
+        return TrainingQuestions::field('id,title as name,id as value,question_type,"data_table_trainingQuestions" as type_value')->select()->toArray();
+    }
+    public static function trainingCourse()
+    {
+        return TrainingCourse::field('id,course_name as name,id as value,"data_table_trainingCourse" as type_value')->select()->toArray();
+    }
+    public static function trainingTask()
+    {
+        return TrainingTask::field('id,task_name as name,id as value,"data_table_trainingTask" as type_value')->select()->toArray();
+    }
+    public static function shopGoods()
+    {
+        return ShopGoods::field('id,goods_name as name,id as value,"data_table_shopGoods" as type_value')->select()->toArray();
+    }
+
+
 }

+ 36 - 0
app/common/model/training/TrainingCourse.php

@@ -0,0 +1,36 @@
+<?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\training;
+
+
+use app\common\model\BaseModel;
+
+
+
+/**
+ * TrainingCourse模型
+ * Class TrainingCourse
+ * @package app\common\model
+ */
+class TrainingCourse extends BaseModel
+{
+    
+    protected $name = 'training_course';
+    protected $type = [
+        'course_question_setting' => 'array',
+    ];
+
+    
+}

+ 36 - 0
app/common/model/training/TrainingQuestions.php

@@ -0,0 +1,36 @@
+<?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\training;
+
+
+use app\common\model\BaseModel;
+
+
+
+/**
+ * TrainingQuestions模型
+ * Class TrainingQuestions
+ * @package app\common\model
+ */
+class TrainingQuestions extends BaseModel
+{
+    
+    protected $name = 'training_questions';
+    protected $type = [
+        'question_selects' => 'array',
+    ];
+
+    
+}

+ 36 - 0
app/common/model/training/TrainingTask.php

@@ -0,0 +1,36 @@
+<?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\training;
+
+
+use app\common\model\BaseModel;
+
+
+
+/**
+ * TrainingTask模型
+ * Class TrainingTask
+ * @package app\common\model
+ */
+class TrainingTask extends BaseModel
+{
+    
+    protected $name = 'training_task';
+    protected $type = [
+        'training_course_id' => 'array',
+    ];
+
+    
+}

+ 37 - 0
app/common/model/training/TrainingWorkerCourse.php

@@ -0,0 +1,37 @@
+<?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\training;
+
+
+use app\common\model\BaseModel;
+
+
+
+/**
+ * TrainingWorkerCourse模型
+ * Class TrainingWorkerCourse
+ * @package app\common\model
+ */
+class TrainingWorkerCourse extends BaseModel
+{
+    
+    protected $name = 'training_worker_course';
+
+    public function trainingCourse()
+    {
+        return $this->hasOne(TrainingCourse::class, 'id', 'training_course_id');
+    }
+    
+}

+ 37 - 0
app/common/model/training/TrainingWorkerQuestion.php

@@ -0,0 +1,37 @@
+<?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\training;
+
+
+use app\common\model\BaseModel;
+
+
+
+/**
+ * TrainingWorkerQuestion模型
+ * Class TrainingWorkerQuestion
+ * @package app\common\model
+ */
+class TrainingWorkerQuestion extends BaseModel
+{
+    
+    protected $name = 'training_worker_question';
+
+    public function trainingQuestions()
+    {
+        return $this->hasOne(TrainingQuestions::class, 'id', 'questions_id');
+    }
+    
+}

+ 49 - 0
app/common/model/training/TrainingWorkerTask.php

@@ -0,0 +1,49 @@
+<?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\training;
+
+
+use app\common\model\BaseModel;
+use app\common\model\master_worker\MasterWorker;
+use app\common\model\shops\ShopGoods;
+use app\common\model\shops\ShopOrders;
+
+
+/**
+ * TrainingWorkerTask模型
+ * Class TrainingWorkerTask
+ * @package app\common\model
+ */
+class TrainingWorkerTask extends BaseModel
+{
+    
+    protected $name = 'training_worker_task';
+    public function TrainingTask(){
+        return $this->hasOne(TrainingTask::class,'id','training_task_id');
+    }
+    public function MasterWorker(){
+        return $this->hasOne(MasterWorker::class,'id','master_worker_id');
+    }
+    public function LeadMasterWorker(){
+        return $this->hasOne(MasterWorker::class,'id','lead_master_worker_id');
+    }
+    public function ShopGoods(){
+        return $this->hasOne(ShopGoods::class,'id','shop_goods_id');
+    }
+    public function ShopOrders(){
+        return $this->hasOne(ShopOrders::class,'id','shop_orders_id');
+    }
+    
+}

+ 103 - 0
app/workerapi/controller/TrainingController.php

@@ -0,0 +1,103 @@
+<?php
+
+namespace app\workerapi\controller;
+
+use app\common\logic\MasterWorkerExamineLogic;
+use app\common\model\dict\DictData;
+use app\workerapi\lists\MasterWorkerLists;
+use app\workerapi\lists\ServiceWorkLists;
+use app\workerapi\lists\TeamServiceWorkLists;
+use app\workerapi\logic\LoginLogic;
+use app\workerapi\logic\MasterWorkerInfoLogic;
+use app\workerapi\logic\MasterWorkerLogic;
+use app\workerapi\logic\MasterWorkerTeamLogic;
+use app\workerapi\logic\TrainingLogic;
+use app\workerapi\validate\BankAccountValidate;
+use app\workerapi\validate\MasterWokerInfoValidate;
+use app\workerapi\validate\MasterWokerTeamValidate;
+use app\workerapi\validate\MasterWokerValidate;
+
+class TrainingController extends BaseApiController
+{
+    public array $notNeedLogin = ['examStatistics'];
+
+    /**
+     * 获取培训信息
+     * @return \think\response\Json
+     */
+    public function getTrainingInfo()
+    {
+        $result = TrainingLogic::getDetail($this->userId);
+        return $this->data($result);
+    }
+
+    /**
+     * 获取工程师的课程列表
+     * @return \think\response\Json
+     */
+    public function getCourseList()
+    {
+        $params  = request()->get();
+        return $this->data(TrainingLogic::getCourseList($this->userId,$params));
+    }
+
+    /**
+     * 修改学习视频记录状态
+     * @return \think\response\Json
+     */
+    public function upWorkerVideoCourse()
+    {
+        $params  = request()->post();
+        $result = TrainingLogic::upWorkerCourse($params);
+        if($result === false){
+            return $this->fail(TrainingLogic::getError());
+        }
+        return $this->success('', [], 1, 1);
+    }
+
+
+    /**
+     * 获取考试列表(即开始考试)
+     * @return \think\response\Json
+     */
+    public function getQuestionList()
+    {
+        try {
+            $params  = request()->get();
+            $result = TrainingLogic::getQuestionList($params);
+            return $this->data($result);
+        } catch (\Exception $e) {
+            return $this->fail($e->getMessage());
+        }
+    }
+
+
+    /**
+     * 提交考试(即结束考试)
+     * @return \think\response\Json
+     */
+    public function submitExam()
+    {
+        $params  = request()->post();
+        $result = TrainingLogic::submitExam($params);
+        if($result === false){
+            return $this->fail(TrainingLogic::getError());
+        }
+        return $this->success('', [], 1, 1);
+    }
+
+
+
+    /**
+     * 考试结果统计
+     * @return \think\response\Json
+     */
+    public function examStatistics()
+    {
+        $params  = request()->get();
+        $result = TrainingLogic::examStatistics($params);
+        return $this->data($result);
+    }
+
+
+}

+ 262 - 0
app/workerapi/logic/TrainingLogic.php

@@ -0,0 +1,262 @@
+<?php
+namespace app\workerapi\logic;
+use app\adminapi\logic\master_worker_register\MasterWorkerRegisterLogic;
+use app\common\enum\worker\WorkerAccountLogEnum;
+use app\common\enum\YesNoEnum;
+use app\common\logic\BaseLogic;
+use app\common\model\bank_account\BankAccount;
+use app\common\model\master_worker\MasterWorker;
+use app\common\model\master_worker\MasterWorkerAccountLog;
+use app\common\model\master_worker\MasterWorkerAgree;
+use app\common\model\master_worker\MasterWorkerInfo;
+use app\common\model\master_worker\MasterWorkerTeam;
+use app\common\model\shops\ShopOrderGoods;
+use app\common\model\shops\ShopOrders;
+use app\common\model\training\TrainingCourse;
+use app\common\model\training\TrainingQuestions;
+use app\common\model\training\TrainingWorkerCourse;
+use app\common\model\training\TrainingWorkerQuestion;
+use app\common\model\training\TrainingWorkerTask;
+use app\common\model\works\ServiceWork;
+use app\common\service\FileService;
+use app\workerapi\lists\MasterWorkerLists;
+use app\workerapi\lists\ServiceWorkLists;
+use think\Exception;
+use think\facade\Config;
+use think\facade\Db;
+use think\facade\Log;
+
+
+class TrainingLogic extends  BaseLogic
+{
+    public static function getDetail(int $masterWorkerId)
+    {
+        try {
+            TrainingWorkerTaskLogic::upTaskOrder($masterWorkerId);
+
+            $task_info = ['id'=>0];
+            $task = TrainingWorkerTask::where('master_worker_id',$masterWorkerId)->findOrEmpty();
+            if (!$task->isEmpty()) {
+                $task_info = $task->toArray();
+                // 0 不展示按钮 1 去学习 2 已学完
+                $task_info['learning_status'] = $task_info['shop_orders_id']>0?($task_info['training_status'] <2?1:2):0;
+                $task_info['bank_status'] = BankAccount::where('worker_id',$masterWorkerId)->where('audit_state',1)->value('id')?1:0;
+                $masterWorker = MasterWorker::where('id',$masterWorkerId)->find();
+                $task_info['category_status'] = empty($masterWorker['category_ids'])?0:1;
+                $task_info['service_status'] = (empty($masterWorker['lon']) || empty($masterWorker['lat']))?0:1;
+            }
+            $task_info['free_videos'] = TrainingCourse::where('course_lock',1)->select()->toArray();
+            return $task_info;
+        } catch (\Exception $e) {
+            self::setError($e->getMessage());
+            return [];
+        }
+    }
+
+
+    /**
+     * 获取工程师的课程列表
+     * @param int $masterWorkerId
+     * @param array $params
+     * @return array id => 工程师的课程id
+     */
+    public static function getCourseList(int $masterWorkerId,$params = [])
+    {
+        try {
+            $list =  TrainingWorkerCourse::with(['trainingCourse'])->where('master_worker_id',$masterWorkerId)->where('training_task_id',$params['training_task_id'])->select()->toArray();
+            foreach ($list as &$item) {
+                $item['course_name'] = $item['trainingCourse']['course_name'];
+                $item['course_picture'] = FileService::getFileUrl($item['trainingCourse']['course_picture']);
+                $item['course_url'] = FileService::getFileUrl($item['trainingCourse']['course_url']);
+            }
+            return $list;
+        } catch (\Exception $e) {
+            self::setError($e->getMessage());
+            return [];
+        }
+    }
+
+
+    /**
+     * 修改学习记录状态 播放开始 播放暂停 播放结束 考试开始 考试结束
+     * @param array $params
+     * @param int $masterWorkerId
+     * @return bool
+     */
+    public static function upWorkerCourse(array $params)
+    {
+        try {
+            $logCourse = TrainingWorkerCourse::where('id',$params['id'])->findOrEmpty();
+            if ($logCourse->isEmpty()) {
+                throw new \Exception('课程不存在');
+            }
+            // 播放开始 播放暂停 播放结束
+            switch ($params['status']) {
+                case 1:
+                    $logCourse->play_time = 1;
+                    $logCourse->study_status = 1;
+                    break;
+                case 2:
+                    $logCourse->play_time = $params['play_time']??10;
+                    break;
+                case 3:
+                    $logCourse->study_status = 2;
+                    break;
+                case 4:
+                    $logCourse->exam_start_time = time();
+                    $logCourse->study_status = 3;
+                    break;
+                case 5:
+                    $logCourse->exam_end_time = time();
+                    $logCourse->study_status = 4;
+                    break;
+                case 6:
+                    $logCourse->exam_end_time = time();
+                    $logCourse->study_status = 5;
+                    break;
+            }
+            $logCourse->save();
+            return true;
+        } catch (\Exception $e) {
+            self::setError($e->getMessage());
+            return false;
+        }
+    }
+
+    /**
+     * 获取工程师的考试试题列表(即开始考试)
+     * @param array $params  worker_course_id 工程师的课程id
+     * @return array      id 工程师的试题id
+     */
+    public static function getQuestionList(array $params)
+    {
+        try {
+            $workerCourse = TrainingWorkerCourse::where('id',$params['worker_course_id'])->findOrEmpty();
+            $study_status = 0;
+            if(isset($params['is_resit']) && $params['is_resit'] == 1 && $workerCourse['study_status'] == 4){
+                // 重置
+                TrainingWorkerCourse::update(['exam_start_time'=>0,'exam_end_time'=>0,'study_status'=>2,'exam_score'=>0],['id'=>$params['worker_course_id']]);
+                TrainingWorkerQuestion::update(['worker_answer'=>'','exam_score'=>0],['worker_course_id'=>$params['worker_course_id']]);
+                $study_status = 2;
+            }
+            $list = [];
+            if($workerCourse['study_status'] == 2 || $study_status == 2) {
+                // 开始考试
+                self::upWorkerCourse(['id'=>$params['worker_course_id'],'status'=> 4]);
+                $list = TrainingWorkerQuestion::with(['trainingQuestions'])->where('worker_course_id',$params['worker_course_id'])->select()->toArray();
+                foreach ($list as &$item) {
+                    $item['title'] = $item['trainingQuestions']['title'];
+                    $item['question_type'] = $item['trainingQuestions']['question_type'];
+                    $item['question_selects'] = $item['trainingQuestions']['question_selects'];
+                    $item['question_answer'] = $item['trainingQuestions']['question_answer'];
+                    $item['question_analysis'] = $item['trainingQuestions']['question_analysis'];
+                }
+            }
+            return $list;
+        } catch (\Exception $e) {
+            throw new \Exception($e->getMessage());
+        }
+    }
+
+
+    /**
+     * 提交考试  该工程师的课程id + 所有的工程师的试题id、答案
+     * @param array
+     * @param int $masterWorkerId
+     * @return
+     */
+    public static function submitExam($params){
+        Db::startTrans();
+        try {
+
+            // 课程试卷详情
+            $exam_paper_details = self::getExamPaperDetails(['worker_course_id'=>$params['worker_course_id']]);
+
+            // 提交的答案 [['id'=> ,'answer'=>],['id'=> ,'answer'=>]]
+            !is_array($params['worker_answer']) && $params['worker_answer'] = json_decode($params['worker_answer'],true);
+            $worker_answer = array_column($params['worker_answer'],'answer','id');
+
+            //对比答案 更新答题记录实际每题得分,总得分
+            $all_exam_score = 0;
+            $course_question_setting = $exam_paper_details['course']['course_question_setting'];
+            foreach ($course_question_setting as &$item) {
+                $exam_score = 0;
+                ($worker_answer_value = explode(',',$worker_answer[$item['select_value']])) && sort($worker_answer_value) && ($worker_answer_value = implode(',',$worker_answer_value));
+                if($worker_answer_value == $item['question_answer']){
+                    $exam_score = $item['score'];
+                }
+                $all_exam_score += $exam_score;
+                TrainingWorkerQuestion::update(
+                    ['worker_answer' => $worker_answer_value,'exam_score' => $exam_score],
+                    ['worker_course_id' => $params['worker_course_id'],'questions_id' => $item['select_value']]
+                );
+            }
+
+            // 更新课程得分、状态
+            if((float)$all_exam_score < (float)$exam_paper_details['course']['course_question_score']){
+                $study_status = 4;
+            }else{
+                $study_status = 5;
+            }
+            TrainingWorkerCourse::update(
+                ['exam_score' => $all_exam_score,'study_status'=>$study_status,'exam_start_time'=>time()],
+                ['id' => $params['worker_course_id']]
+            );
+
+            Db::commit();
+            return true;
+        }catch(\Exception $e){
+            Db::rollback();
+            self::setError($e->getMessage());
+            return false;
+        }
+    }
+
+    public static function getExamPaperDetails($params){
+        // 试卷详情
+        $workerCourse = [];
+        if(isset($params['worker_course_id'])){
+            $workerCourse = TrainingWorkerCourse::where('id',$params['worker_course_id'])->findOrEmpty()->toArray();
+            // 课程详情
+            $course = TrainingCourse::where('id',$workerCourse['training_course_id'])->findOrEmpty()->toArray();
+            // 该课程所有试题 答案、分数
+            $question_ids = array_column($course['course_question_setting'],'select_value');
+            $question_column = TrainingQuestions::where('id',$question_ids)->column('question_answer','id');
+            foreach ($course['course_question_setting'] as &$item) {
+                $item['question_answer'] = $question_column[$item['select_value']];
+            }
+            $workerCourse['course'] = $course;
+        }
+        Log::info('exam_paper_details:'.json_encode($workerCourse));
+        return $workerCourse;
+    }
+
+
+
+    /**
+     * 考试结果统计
+     * @param int $teamId
+     * @param int $masterWorkerId
+     * @return array
+     */
+    public static function examStatistics($params){
+        // 计算考试结果: 总题数 正确率(>0的题数) 总得分(每题得分累计) | 总用时   是否合格
+        // training_worker_question  training_worker_course
+        /*total_questions 总题数 correct_questions 正确题数 correct_rate_percentage 正确率  total_score 总得分
+
+        exam_time 总用时秒*/
+
+        $res = [];
+        $res['statistics'] = TrainingWorkerQuestion::where('worker_course_id',$params['worker_course_id'])
+            ->field(['worker_course_id',Db::raw('COUNT(id) AS total_questions,SUM(CASE WHEN exam_score > 0 THEN 1 ELSE 0 END) AS correct_questions,ROUND((SUM(CASE WHEN exam_score > 0 THEN 1 ELSE 0 END) / COUNT(id)) * 100, 2) AS correct_rate_percentage,SUM(exam_score) AS total_score')])
+            ->group('worker_course_id')
+            ->find();
+        $workerCourse = TrainingWorkerCourse::where('id',$params['worker_course_id'])->findOrEmpty()->toArray();
+        $res['statistics']['exam_time'] = $workerCourse['exam_end_time'] - $workerCourse['exam_start_time'];
+        $res['statistics']['study_status'] = $workerCourse['study_status'];
+        $res['statistics_list'] = TrainingWorkerQuestion::where('worker_course_id',$params['worker_course_id'])->select();
+        return $res;
+    }
+
+
+}

+ 83 - 0
app/workerapi/logic/TrainingWorkerTaskLogic.php

@@ -0,0 +1,83 @@
+<?php
+namespace app\workerapi\logic;
+
+use app\common\logic\BaseLogic;
+use app\common\model\shops\ShopOrderGoods;
+use app\common\model\shops\ShopOrders;
+use app\common\model\training\TrainingCourse;
+use app\common\model\training\TrainingTask;
+use app\common\model\training\TrainingWorkerCourse;
+use app\common\model\training\TrainingWorkerQuestion;
+use app\common\model\training\TrainingWorkerTask;
+use think\facade\Db;
+
+
+/**
+ * TrainingWorkerTaskLogic逻辑
+ * Class TrainingWorkerTaskLogic
+ * @package app\workerapi\logic\works
+ */
+class TrainingWorkerTaskLogic extends BaseLogic
+{
+
+
+
+
+    /**
+     * @notes 验证是否购买
+     * @param array $params
+     * @return bool
+     * @author whitef
+     * @date 2024/07/10 15:06
+     */
+    public static function upTaskOrder($masterWorkerId): bool
+    {
+        $taskWorker = TrainingWorkerTask::where('master_worker_id',$masterWorkerId)->findOrEmpty();
+        if (!$taskWorker->isEmpty() && $taskWorker->shop_orders_id == 0) {
+            //shop_goods_id  INT ( 10 ) DEFAULT 0  NOT NULL COMMENT '商品id(套餐)',
+            //shop_orders_id int(10) NOT NULL DEFAULT '0' COMMENT '购买单号id',
+            // 检查是否已经购买套餐
+            $sn_orders = ShopOrders::where('worker_id',$masterWorkerId)->where('pay_status',1)->where('refund_status',0)->column('id','sn');
+            if (!empty($sn_orders)) {
+                $shopOrderGoods = ShopOrderGoods::whereIn('sn',array_keys($sn_orders))->where('shop_goods_id',$taskWorker->shop_goods_id)->findOrEmpty();
+                if (!$shopOrderGoods->isEmpty()) {
+                    $taskWorker->shop_orders_id = $sn_orders[$shopOrderGoods->sn];
+                    $taskWorker->save();
+
+                    $training_course_ids  = json_decode(TrainingTask::where('id',$taskWorker->training_task_id)->value('training_course_id'),true);
+                    // 添加该工程师的所有培训课程初始化记录
+                    foreach ($training_course_ids as $course_id) {
+                        $workerCourse = TrainingWorkerCourse::create([
+                            'master_worker_id' => $masterWorkerId,
+                            'training_task_id' => $taskWorker->training_task_id,
+                            'training_course_id' => $course_id,
+                            'play_time' => 0,
+                            'exam_start_time' => 0,
+                            'exam_end_time' => 0,
+                            'study_status' => 0,
+                            'exam_score' => 0,
+                        ]);
+
+                        // 添加该工程师该课程的所有试题初始化记录
+                        //[{"block_key":1,"select_value":1,"score":"20"},{"block_key":2,"select_value":2,"score":"10"},{"block_key":3,"select_value":3,"score":"70"}]
+                        $course_question = json_decode(TrainingCourse::where('id',$course_id)->value('course_question_setting'),true);
+                        $course_question_ids = array_column($course_question,'select_value');
+                        foreach ($course_question_ids as $question_id) {
+                            $workerQuestion = TrainingWorkerQuestion::create([
+                                'worker_course_id' => $workerCourse->id,
+                                'questions_id' => $question_id,
+                                'worker_answer' => '',
+                                'exam_score' => 0
+                            ]);
+                        }
+                    }
+
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+
+}