瀏覽代碼

工单派发逻辑未完善

Memory_LG 9 月之前
父節點
當前提交
762b743f57
共有 20 個文件被更改,包括 551 次插入98 次删除
  1. 15 0
      lawenforcement-ui/src/api/lawenforcement/record.js
  2. 81 0
      lawenforcement-ui/src/views/components/DepartmentSelect.vue
  3. 58 0
      lawenforcement-ui/src/views/components/EnforcementUserSelect.vue
  4. 158 41
      lawenforcement-ui/src/views/lawenforcement/record/index.vue
  5. 2 1
      src/main/java/com/sooka/sponest/lawenforcement/device/controller/DeviceController.java
  6. 5 3
      src/main/java/com/sooka/sponest/lawenforcement/device/service/impl/DeviceServiceImpl.java
  7. 6 0
      src/main/java/com/sooka/sponest/lawenforcement/person/mapper/LawenforcementPersonMapper.java
  8. 6 1
      src/main/java/com/sooka/sponest/lawenforcement/record/controller/LawenforcementRecordController.java
  9. 15 1
      src/main/java/com/sooka/sponest/lawenforcement/record/domain/LawenforcementRecord.java
  10. 2 0
      src/main/java/com/sooka/sponest/lawenforcement/record/service/ILawenforcementRecordService.java
  11. 55 13
      src/main/java/com/sooka/sponest/lawenforcement/record/service/impl/LawenforcementRecordServiceImpl.java
  12. 6 0
      src/main/java/com/sooka/sponest/lawenforcement/user/controller/LawenforcementUserController.java
  13. 1 0
      src/main/java/com/sooka/sponest/lawenforcement/user/domain/LawenforcementUser.java
  14. 2 0
      src/main/java/com/sooka/sponest/lawenforcement/user/mapper/LawenforcementUserMapper.java
  15. 2 0
      src/main/java/com/sooka/sponest/lawenforcement/user/service/ILawenforcementUserService.java
  16. 5 0
      src/main/java/com/sooka/sponest/lawenforcement/user/service/impl/LawenforcementUserServiceImpl.java
  17. 33 33
      src/main/resources/logback.xml
  18. 28 0
      src/main/resources/mapper/lawenforcement/LawenforcementPersonMapper.xml
  19. 62 5
      src/main/resources/mapper/lawenforcement/LawenforcementRecordMapper.xml
  20. 9 0
      src/main/resources/mapper/lawenforcement/LawenforcementUserMapper.xml

+ 15 - 0
lawenforcement-ui/src/api/lawenforcement/record.js

@@ -65,3 +65,18 @@ export function addRecordLog(data){
     data: data
   })
 }
+
+export function getUserListByDeptId(deptId){
+  return request({
+    url: '/sooka-sponest-lawenforcement/user/getUserListByDeptId/' + deptId,
+    methor: 'get'
+  })
+}
+//派发事件
+export function distributeRecord(data) {
+  return request({
+    url: '/sooka-sponest-lawenforcement/record/distributeRecord',
+    method: 'post',
+    data: data
+  })
+}

+ 81 - 0
lawenforcement-ui/src/views/components/DepartmentSelect.vue

@@ -0,0 +1,81 @@
+<template>
+  <div>
+    <el-cascader
+      v-model="localedDepts"
+      :options="deptOptions"
+      :props="cascaderProps"
+      clearable
+      :show-all-levels="false"
+      @change="handleChange"
+    ></el-cascader>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    deptOptions: {
+      type: Array,
+      required: true,
+    },
+    reset: {
+      type: Boolean,
+      default: false
+    },
+    selectedDepts: {
+      type: Array,
+      default: []
+    }
+  },
+  data() {
+    return {
+      localedDepts: [],
+      cascaderProps: {
+        value: 'id',
+        label: 'label',
+        children: 'children',
+        multiple: true,
+        checkStrictly: true, // 允许选择任意一级
+      },
+    };
+  },
+  mounted() {
+    this.localedDepts = [...this.selectedDepts];
+  },
+  watch: {
+    selectedDepts: {
+      handler(newVal) {
+        this.localedDepts = [...newVal];
+        console.log("更新数据===》",this.localedDepts)
+      },
+      immediate: true // 立即调用 handler 函数
+    },
+    reset(newVal) {
+      if (newVal) {
+        // 当 reset 为 true 时,清空选中的部门
+        this.localedDepts = [];
+      }
+    }
+  },
+  methods: {
+    handleChange(selectedIds) {
+      console.log(selectedIds);
+      let pushIds = [];
+      for (let selectedId of selectedIds) {
+        pushIds.push(selectedId[selectedId.length - 1]);
+      }
+      this.$emit('selection-change', pushIds);
+    },
+    /*updateSelectedDepts(newVal) {
+      this.localedDepts = [...newVal];
+      console.log("子组件更新后的数据:", this.localedDepts);
+    }*/
+  },
+};
+</script>
+
+<style scoped>
+.el-cascader {
+  width: 100%;
+}
+</style>

+ 58 - 0
lawenforcement-ui/src/views/components/EnforcementUserSelect.vue

@@ -0,0 +1,58 @@
+<template>
+  <div>
+    <el-select v-model="localUserList" multiple placeholder="请选择">
+      <el-option
+        v-for="user in userList"
+        :key="user.userId"
+        :label="user.nickName"
+        :value="user.certificateNumber"
+      ></el-option>
+    </el-select>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    userList: {
+      type: Array,
+      required: true,
+    },
+    reset: {
+      type: Boolean,
+      default: false
+    },
+    selectedUserList:{
+      type: Array,
+      required: false,
+      default: []
+    }
+  },
+  data() {
+    return {
+      localUserList: []
+    };
+  },
+  watch: {
+    // 监听 selectedUserList 的变化,如果需要可以通知父组件
+    localUserList(newValue) {
+      console.log("变化===》",newValue)
+      this.$emit('user-selected', newValue);
+    },
+    selectedUserList(newValue){
+      this.localUserList = newValue
+      this.$emit('user-selected', newValue);
+      console.log("接受到的选中执法人为",this.localUserList)
+    },
+    userList(newValue){
+      console.log(newValue)
+    },
+    reset(newVal) {
+      if (newVal) {
+        // 当 reset 为 true 时,清空选中的部门
+        this.localUserList = [];
+      }
+    }
+  },
+};
+</script>

+ 158 - 41
lawenforcement-ui/src/views/lawenforcement/record/index.vue

@@ -97,7 +97,7 @@
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
-            v-if="scope.row.recordStatus === 'lawenforcement_type_1' || scope.row.recordStatus === 'lawenforcement_type_3'"
+            v-if="scope.row.recordStatus === 'lawenforcement_type_1' && scope.row.createMethod === 1"
             size="mini"
             type="text"
             icon="el-icon-paper-plus"
@@ -105,7 +105,7 @@
           >派发
           </el-button>
           <el-button
-            v-if="scope.row.recordStatus === 'lawenforcement_type_6'"
+            v-if="scope.row.recordStatus === 'lawenforcement_type_3'  || (scope.row.recordStatus === 'lawenforcement_type_1' && scope.row.createMethod !== 1)"
             size="mini"
             type="text"
             icon="el-icon-paper-plus"
@@ -262,25 +262,34 @@
     <el-dialog :visible.sync="dialogVisible" title="派发任务">
       <el-form :model="form">
         <el-form-item label="选择部门">
-<!--          <el-select v-model="dispatchForm.department" placeholder="请选择部门">
-            <el-option
-              v-for="item in departments"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id"
-            />
-          </el-select>-->
+          <DepartmentSelect
+            ref="departmentSelect"
+            :deptOptions="deptOptions"
+            :selectedDepts="selectedDepts"
+            :reset="reset"
+            @selection-change="handleDeptSelectionChange"
+          />
         </el-form-item>
 
         <el-form-item label="选择人员">
-<!--          <el-select v-model="dispatchForm.person" placeholder="请选择人员">
+          <EnforcementUserSelect
+            ref="enforcementUserSelect"
+            :userList="userList"
+            :selectedUserList="selectedUserList"
+            :reset="reset"
+            @user-selected="handleUserSelected"
+          />
+        </el-form-item>
+
+        <el-form-item v-if="useredList != null" label="主办人员">
+          <el-select v-model="mainPerson" placeholder="请选择" @change="seeMainPerson">
             <el-option
-              v-for="item in personnel"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id"
-            />
-          </el-select>-->
+              v-for="user in useredList"
+              :key="user.userId"
+              :label="user.nickName"
+              :value="user.certificateNumber"
+            ></el-option>
+          </el-select>
         </el-form-item>
       </el-form>
       <div slot="footer">
@@ -316,18 +325,23 @@
 
 <script>
 import {
-  addRecord, addRecordLog,
+  addRecord,
+  addRecordLog,
   delRecord,
+  distributeRecord,
   getDeivceList,
-  getPersonsList,
   getRecord,
+  getUserListByDeptId,
   listRecord,
   updateRecord
 } from "@/api/lawenforcement/record";
-import dict from "@/utils/dict";
+import {treeselect} from "@/api/system/dept";
+import DepartmentSelect from "@/views/components/DepartmentSelect.vue";
+import EnforcementUserSelect from "@/views/components/EnforcementUserSelect.vue";
 
 export default {
   name: "Record",
+  components: {EnforcementUserSelect, DepartmentSelect},
   dicts: [
     'lawenforcement_type'
   ],
@@ -335,6 +349,7 @@ export default {
     return {
       // 遮罩层
       loading: true,
+      mainPerson: null,
       // 选中数组
       ids: [],
       // 非单个禁用
@@ -353,6 +368,12 @@ export default {
       open: false,
       dialogVisible: false,
       bindDialogVisible: false,
+      // 部门树选项
+      deptOptions: [],
+      //人员集合
+      userList: [],
+      //选中的执法人员集合
+      useredList: [],
       // 查询参数
       queryParams: {
         pageNum: 1,
@@ -364,11 +385,18 @@ export default {
       // 表单校验
       rules: {},
       // 执法设备列表
-      deviceList: []
+      deviceList: [],
+      // 选中的执法人员
+      selectedUserList: [],
+      // 选中的执法部门
+      selectedDepts: [],
+      departmentMap: {},
+
     };
   },
   created() {
     this.getList();
+    this.getTreeselectToDept();
   },
   methods: {
     /** 查询任务数据列表 */
@@ -503,48 +531,137 @@ export default {
         ...this.queryParams
       }, `record_${new Date().getTime()}.xlsx`)
     },
+    /** 获取部门列表 页面初始化执行 */
+    getTreeselectToDept() {
+      treeselect().then(response => {
+        this.deptOptions = response.data;
+      });
+    },
+    findPath(targetId) {
+      // 转换为 key-value 类型的数据结构
+      this.departmentMap = this.flattenToMap(this.deptOptions);
+      let path = this.getPathFromMap(targetId).reverse();
+      this.selectedDepts.push(path) // 获取路径并反转
+    },
+    flattenToMap(data, parentId = null) {
+      return data.reduce((map, node) => {
+        map[node.id] = { ...node, parentId }; // 将节点添加到 map 中
+        if (node.children) {
+          Object.assign(map, this.flattenToMap(node.children, node.id)); // 递归处理子节点
+        }
+        return map;
+      }, {});
+    },
+    getPathFromMap(targetId) {
+      const path = [];
+      let currentId = targetId;
+      while (currentId) {
+        const node = this.departmentMap[currentId];
+        if (node) {
+          path.push(node.id); // 将部门标签加入路径
+          currentId = node.parentId; // 获取父节点 ID
+        } else {
+          break;
+        }
+      }
+      return path;
+    },
+
     /** 派发按钮事件*/
     showDispatchDialog(row) {
-      // getPersonsList(row).then(res=>{
-        console.log("派发工单")
-        // res.data
-        this.dialogVisible = true;
-      // })
+      //获取工单详情信息
+      getRecord(row.id).then(res => {
+        this.form = res.data
+        let personList = res.data.personList;
+        this.mainPerson = res.data.mainPerson
+        let path = []
+        personList.forEach(person=>{
+          this.findPath(person.deptId)
+          path.push(person.deptId)
+          this.selectedUserList.push(person.certificateNumber)
+        })
+        this.handleDeptSelectionChange(path)
+      })
+      //打开派发弹窗
+      this.dialogVisible = true;
+      this.$nextTick(() => {
+        this.$refs.departmentSelect.localedDepts = [...this.selectedDepts];
+      });
+    },
+    /** 选中执法部门回调 */
+    handleDeptSelectionChange(selectedIds) {
+      getUserListByDeptId(selectedIds).then(res => {
+        this.userList = res.data
+      })
+
+    },
+    /** 选中的执法人员回调事件 */
+    handleUserSelected(selectedUsersIds) {
+      console.log("--->",selectedUsersIds)
+      let usered = [];
+      selectedUsersIds.forEach(userId => {
+        console.log(this.userList)
+        // 在userList中查找对应的用户对象
+        const user = this.userList.find(user => user.certificateNumber === userId);
+        // 如果找到了用户对象,则将其添加到selectedUserList中
+        if (user) {
+          usered.push(user)
+        }
+      });
+      // 在这里处理选中的用户对象
+      this.useredList = usered;
+      console.log("这里处理选中的用户对象", this.useredList)
+      this.form.personList = usered;
+    },
+    /** 选中的主办人员回调 */
+    seeMainPerson(userId) {
+      this.form.mainPerson = userId
     },
     /** 派发工单提交 */
     handleDispatch() {
       // 处理派发逻辑,这里可以写你的逻辑,比如保存数据或者提交请求
-      console.log("派发信息");
-      this.dialogVisible = false;
+      distributeRecord(this.form).then(res => {
+        console.log("派发成功");
+        this.dialogVisible = false;
+      })
+
     },
 
-    /** 绑定设备事件 */
-    showBindDeviceDialog(row){
+    /** 绑定设备按钮事件 */
+    showBindDeviceDialog(row) {
       /* 根据部门id获取执法设备 */
-      getDeivceList().then(res=>{
+      getDeivceList().then(res => {
         this.deviceList = res.data
         this.form.id = row.id
         this.form.jobName = row.jobName
         this.bindDialogVisible = true;
       })
-
     },
-
     /** 选中设备事件 */
-    onDeviceChange(value){
+    onDeviceChange(value) {
       const selectedDevice = this.deviceList.find(item => item.cameraCode === value);
       this.form.deviceName = selectedDevice ? selectedDevice.cameraName : ''; // 更新设备名称
-      // this.form.deviceId = selectedDevice.cameraCode
     },
-
     /** 绑定设备提交 */
-    submitBindHandle(){
-      console.log(this.form)
-      this.bindDialogVisible = false;
-      addRecordLog(this.form).then(res=>{
-        console.log(res)
+    submitBindHandle() {
+      this.form.recordStatus = "lawenforcement_type_6"
+      addRecordLog(this.form).then(res => {
+        this.bindDialogVisible = false;
       })
     }
+  },
+  watch: {
+    dialogVisible(newVal) {
+      this.mainPerson = "";
+      // this.reset();
+      if (newVal) {
+        // 打开弹窗时重置子组件
+        this.reset = true;
+      } else {
+        // 关闭弹窗时不重置子组件
+        this.reset = false;
+      }
+    }
   }
 };
 </script>

+ 2 - 1
src/main/java/com/sooka/sponest/lawenforcement/device/controller/DeviceController.java

@@ -32,7 +32,7 @@ public class DeviceController extends BaseController {
     private final String CLOSE = "0";
 
     /**
-     * 实时接受设备开关机状态集合
+     * 实时接受设备开关机状态集合(每分钟一次全部设备状态集合)
      * @param arr
      * @return
      */
@@ -78,6 +78,7 @@ public class DeviceController extends BaseController {
      */
     @PostMapping("/close")
     public AjaxResult close(@RequestBody DeviceBO bo){
+        log.debug("{}设备关机",bo.getCode());
         //设备关机先尝试删除定时任务
         deviceService.cancelTask(bo.getCode());
         //设置任务结束时间和任务状态为完成

+ 5 - 3
src/main/java/com/sooka/sponest/lawenforcement/device/service/impl/DeviceServiceImpl.java

@@ -2,11 +2,13 @@ package com.sooka.sponest.lawenforcement.device.service.impl;
 
 import com.sooka.sponest.lawenforcement.device.domain.DeviceBO;
 import com.sooka.sponest.lawenforcement.device.service.IDeviceService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.util.concurrent.*;
 
 @Service
+@Slf4j
 public class DeviceServiceImpl implements IDeviceService {
 
     // 用于存储定时任务的Map,key为deviceCode
@@ -23,7 +25,7 @@ public class DeviceServiceImpl implements IDeviceService {
      */
     @Override
     public void open(DeviceBO bo) {
-        System.out.println("设备开启");
+        log.info("设备开启:{}",bo.getCode());
         String deviceCode = bo.getCode();
 
         ScheduledFuture<?> future = scheduledTasks.get(deviceCode);
@@ -31,7 +33,7 @@ public class DeviceServiceImpl implements IDeviceService {
         if(future == null || future.isCancelled() || openedDevice.contains(deviceCode)){
             // 创建一个新的定时任务
             Runnable task = () -> {
-                System.out.println("设备开启超过六十分钟: " + deviceCode);
+                log.debug("设备开启超过六十分钟: {}" , deviceCode);
                 /*
                  *  此处发送开机未执法告警
                  */
@@ -41,7 +43,7 @@ public class DeviceServiceImpl implements IDeviceService {
             ScheduledFuture<?> futureNew = scheduler.schedule(task, 2, TimeUnit.MINUTES);
             scheduledTasks.put(deviceCode, futureNew);
         }else{
-            System.out.println(" 设备已开启定时任务!或正在执行工单任务!不开启定时任务");
+            log.debug("{} 设备已开启定时任务!或正在执行工单任务!不开启定时任务",bo.getCode());
         }
 
     }

+ 6 - 0
src/main/java/com/sooka/sponest/lawenforcement/person/mapper/LawenforcementPersonMapper.java

@@ -58,4 +58,10 @@ public interface LawenforcementPersonMapper {
      * @return 结果
      */
     int deleteLawenforcementPersonByIds(String[] ids);
+
+    void insertLawenforcementPersonToList(List<LawenforcementPerson> personList);
+
+    void deleteLawenforcementPersonByRecordId(String id);
+
+    List<LawenforcementPerson> selectPersonByRecordId(String id);
 }

+ 6 - 1
src/main/java/com/sooka/sponest/lawenforcement/record/controller/LawenforcementRecordController.java

@@ -103,8 +103,13 @@ public class LawenforcementRecordController extends BaseController {
         return SpringUtils.getBean(RemoteDeviceService.class).selectByCameraId(visuForestCloudCameraBO);
     }
 
-    @PostMapping("addRecordLog")
+    @PostMapping("/addRecordLog")
     public AjaxResult addRecordLog(@RequestBody LawenforcementRecord record){
         return toAjax(lawenforcementRecordService.addRecordLog(record));
     }
+
+    @PostMapping("/distributeRecord")
+    public AjaxResult distributeRecord(@RequestBody LawenforcementRecord record){
+        return toAjax(lawenforcementRecordService.distributeRecord(record));
+    }
 }

+ 15 - 1
src/main/java/com/sooka/sponest/lawenforcement/record/domain/LawenforcementRecord.java

@@ -2,11 +2,15 @@ package com.sooka.sponest.lawenforcement.record.domain;
 
 import com.ruoyi.common.core.annotation.Excel;
 import com.ruoyi.common.core.web.domain.BaseEntity;
+import com.sooka.sponest.lawenforcement.user.domain.LawenforcementUser;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 任务数据对象 lawenforcement_record
  *
@@ -15,7 +19,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
  */
 @Setter
 @Getter
-public class LawenforcementRecord extends BaseEntity {
+public class LawenforcementRecord{
     private static final long serialVersionUID = 1L;
 
     /**
@@ -256,9 +260,19 @@ public class LawenforcementRecord extends BaseEntity {
      */
     @Excel(name = "设备名称")
     private String deviceName;
+    private String createTime;
+    private String createBy;
+    private String remark;
 
     private String recordStatus;
 
+    //执法主办人执法证号
+    private String mainPerson;
+
+    //执法人集合
+    private List<LawenforcementUser> personList;
+
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)

+ 2 - 0
src/main/java/com/sooka/sponest/lawenforcement/record/service/ILawenforcementRecordService.java

@@ -66,4 +66,6 @@ public interface ILawenforcementRecordService {
     int addRecordLog(LawenforcementRecord record);
 
     void updateRecordLogEndTime(DeviceBO bo);
+
+    int distributeRecord(LawenforcementRecord record);
 }

+ 55 - 13
src/main/java/com/sooka/sponest/lawenforcement/record/service/impl/LawenforcementRecordServiceImpl.java

@@ -1,13 +1,18 @@
 package com.sooka.sponest.lawenforcement.record.service.impl;
 
+import com.alibaba.nacos.common.utils.UuidUtils;
 import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.core.utils.uuid.IdUtils;
 import com.sooka.sponest.lawenforcement.device.domain.DeviceBO;
 import com.sooka.sponest.lawenforcement.device.service.IDeviceService;
+import com.sooka.sponest.lawenforcement.person.domain.LawenforcementPerson;
+import com.sooka.sponest.lawenforcement.person.mapper.LawenforcementPersonMapper;
+import com.sooka.sponest.lawenforcement.person.service.ILawenforcementPersonService;
 import com.sooka.sponest.lawenforcement.record.domain.LawenforcementRecord;
 import com.sooka.sponest.lawenforcement.record.domain.LawenforcementRecordLog;
 import com.sooka.sponest.lawenforcement.record.mapper.LawenforcementRecordMapper;
 import com.sooka.sponest.lawenforcement.record.service.ILawenforcementRecordService;
+import com.sooka.sponest.lawenforcement.user.domain.LawenforcementUser;
 import org.apache.commons.collections4.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -16,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 任务数据Service业务层处理
@@ -26,11 +32,14 @@ import java.util.Map;
 @Service
 public class LawenforcementRecordServiceImpl implements ILawenforcementRecordService {
     @Autowired
-    private LawenforcementRecordMapper lawenforcementRecordMapper;
+    private LawenforcementRecordMapper recordMapper;
 
     @Autowired
     private IDeviceService deviceService;
 
+    @Autowired
+    private LawenforcementPersonMapper personMapper;
+
     /**
      * 查询任务数据
      *
@@ -39,7 +48,14 @@ public class LawenforcementRecordServiceImpl implements ILawenforcementRecordSer
      */
     @Override
     public LawenforcementRecord selectLawenforcementRecordById(String id) {
-        return lawenforcementRecordMapper.selectLawenforcementRecordById(id);
+        LawenforcementRecord record = recordMapper.selectLawenforcementRecordById(id);
+        List<LawenforcementUser> personList = record.getPersonList();
+        personList.forEach(person->{
+            if("1".equals(person.getIsMainPerson())){
+                record.setMainPerson(person.getCertificateNumber());
+            }
+        });
+        return record;
     }
 
     /**
@@ -50,7 +66,7 @@ public class LawenforcementRecordServiceImpl implements ILawenforcementRecordSer
      */
     @Override
     public List<LawenforcementRecord> selectLawenforcementRecordList(LawenforcementRecord lawenforcementRecord) {
-        return lawenforcementRecordMapper.selectLawenforcementRecordList(lawenforcementRecord);
+        return recordMapper.selectLawenforcementRecordList(lawenforcementRecord);
     }
 
     /**
@@ -61,8 +77,7 @@ public class LawenforcementRecordServiceImpl implements ILawenforcementRecordSer
      */
     @Override
     public int insertLawenforcementRecord(LawenforcementRecord lawenforcementRecord) {
-        lawenforcementRecord.setCreateTime(DateUtils.getNowDate());
-        return lawenforcementRecordMapper.insertLawenforcementRecord(lawenforcementRecord);
+        return recordMapper.insertLawenforcementRecord(lawenforcementRecord);
     }
 
     /**
@@ -73,7 +88,7 @@ public class LawenforcementRecordServiceImpl implements ILawenforcementRecordSer
      */
     @Override
     public int updateLawenforcementRecord(LawenforcementRecord lawenforcementRecord) {
-        return lawenforcementRecordMapper.updateLawenforcementRecord(lawenforcementRecord);
+        return recordMapper.updateLawenforcementRecord(lawenforcementRecord);
     }
 
     /**
@@ -84,7 +99,7 @@ public class LawenforcementRecordServiceImpl implements ILawenforcementRecordSer
      */
     @Override
     public int deleteLawenforcementRecordByIds(String[] ids) {
-        return lawenforcementRecordMapper.deleteLawenforcementRecordByIds(ids);
+        return recordMapper.deleteLawenforcementRecordByIds(ids);
     }
 
     /**
@@ -95,7 +110,7 @@ public class LawenforcementRecordServiceImpl implements ILawenforcementRecordSer
      */
     @Override
     public int deleteLawenforcementRecordById(String id) {
-        return lawenforcementRecordMapper.deleteLawenforcementRecordById(id);
+        return recordMapper.deleteLawenforcementRecordById(id);
     }
 
     @Override
@@ -106,12 +121,12 @@ public class LawenforcementRecordServiceImpl implements ILawenforcementRecordSer
     @Override
     public int addRecordLog(LawenforcementRecord record) {
         //更新工单数据中的设备id和设备名称,以及任务开始时间
-        int i = lawenforcementRecordMapper.updateLawenforcementRecord(record);
-        Map<String, String> personCode = lawenforcementRecordMapper.getPersonCode(record.getId());
+        int i = recordMapper.updateLawenforcementRecord(record);
+        Map<String, String> personCode = recordMapper.getPersonCode(record.getId());
 
         LawenforcementRecordLog lawenforcementRecordLog = new LawenforcementRecordLog(IdUtils.fastSimpleUUID(), MapUtils.getString(personCode, "personCode"),record.getId(),record.getDeviceId(),new Date(),null);
         //将工单执行记录,写入到日志表中:数据id、任务id、执法人编号、设备编号、开始时间
-        lawenforcementRecordMapper.addRecordLog(lawenforcementRecordLog);
+        recordMapper.addRecordLog(lawenforcementRecordLog);
         //绑定设备后关闭定时任务
         deviceService.cancelTask(lawenforcementRecordLog.getDeviceId());
         deviceService.setOpenedDevice(lawenforcementRecordLog.getDeviceId());
@@ -121,11 +136,38 @@ public class LawenforcementRecordServiceImpl implements ILawenforcementRecordSer
     @Override
     public void updateRecordLogEndTime(DeviceBO bo) {
         //设置任务完成状态
-        lawenforcementRecordMapper.updateRecordStatus(bo);
+        recordMapper.updateRecordStatus(bo);
         //设置任务结束时间
-        lawenforcementRecordMapper.updateRecordLogEndTime(bo);
+        recordMapper.updateRecordLogEndTime(bo);
         //从正在执行任务的设备集合中移除信息
         deviceService.removeOpenedDevice(bo.getCode());
     }
 
+    @Override
+    public int distributeRecord(LawenforcementRecord record) {
+        List<LawenforcementUser> userList = record.getPersonList();
+        String id = record.getId();
+        // 使用 Stream API 来创建 LawenforcementPerson 列表
+        List<LawenforcementPerson> personList = userList.stream()
+                .map(user -> {
+                    LawenforcementPerson person = new LawenforcementPerson();
+                    person.setId(IdUtils.fastSimpleUUID());
+                    person.setPersonId(user.getUserId());
+                    person.setPersonName(user.getNickName());
+                    person.setPersonCode(user.getCertificateNumber());
+                    person.setPersonPhone(user.getPhonenumber());
+                    person.setDeptId(user.getDeptId());
+                    person.setDeptName(user.getDeptName());
+                    person.setPersonType("0");
+                    person.setRecordId(id);
+                    person.setMainPerson(person.getPersonCode().equals(record.getMainPerson())?"1":"0");
+                    return person;
+                })
+                .collect(Collectors.toList()); // 收集结果 into a List
+        if(!personMapper.selectPersonByRecordId(id).isEmpty()){
+            personMapper.deleteLawenforcementPersonByRecordId(id);
+        }
+        personMapper.insertLawenforcementPersonToList(personList);
+        return recordMapper.updateLawenforcementRecord(record);
+    }
 }

+ 6 - 0
src/main/java/com/sooka/sponest/lawenforcement/user/controller/LawenforcementUserController.java

@@ -88,4 +88,10 @@ public class LawenforcementUserController extends BaseController {
     public AjaxResult remove(@PathVariable String[] userIds) {
         return toAjax(lawenforcementUserService.deleteLawenforcementUserByUserIds(userIds));
     }
+
+    @GetMapping("/getUserListByDeptId/{deptId}")
+    public AjaxResult getUserListByDeptId(@PathVariable("deptId") String[] deptId){
+        System.out.println("deptId = " + deptId);
+        return AjaxResult.success(lawenforcementUserService.getUserListByDeptId(deptId));
+    }
 }

+ 1 - 0
src/main/java/com/sooka/sponest/lawenforcement/user/domain/LawenforcementUser.java

@@ -82,6 +82,7 @@ public class LawenforcementUser extends BaseEntity {
     private String sex;
     private String deptId;
     private String deptName;
+    private String isMainPerson;
 
     @Override
     public String toString() {

+ 2 - 0
src/main/java/com/sooka/sponest/lawenforcement/user/mapper/LawenforcementUserMapper.java

@@ -58,4 +58,6 @@ public interface LawenforcementUserMapper {
      * @return 结果
      */
     public int deleteLawenforcementUserByUserIds(String[] userIds);
+
+    List<LawenforcementUser> getUserListByDeptId(String[] deptId);
 }

+ 2 - 0
src/main/java/com/sooka/sponest/lawenforcement/user/service/ILawenforcementUserService.java

@@ -58,4 +58,6 @@ public interface ILawenforcementUserService {
      * @return 结果
      */
     public int deleteLawenforcementUserByUserId(String userId);
+
+    List<LawenforcementUser> getUserListByDeptId(String[] deptId);
 }

+ 5 - 0
src/main/java/com/sooka/sponest/lawenforcement/user/service/impl/LawenforcementUserServiceImpl.java

@@ -84,4 +84,9 @@ public class LawenforcementUserServiceImpl implements ILawenforcementUserService
     public int deleteLawenforcementUserByUserId(String userId) {
         return lawenforcementUserMapper.deleteLawenforcementUserByUserId(userId);
     }
+
+    @Override
+    public List<LawenforcementUser> getUserListByDeptId(String[] deptId) {
+        return lawenforcementUserMapper.getUserListByDeptId(deptId);
+    }
 }

+ 33 - 33
src/main/resources/logback.xml

@@ -1,35 +1,35 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="60 seconds" debug="false">
     <!-- 日志存放路径 -->
-	<property name="log.path" value="logs/center-lawenforcement" />
-   <!-- 日志输出格式 -->
-	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+    <property name="log.path" value="logs/center-lawenforcement"/>
+    <!-- 日志输出格式 -->
+    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
 
     <!-- 控制台输出 -->
-	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>INFO</level>
         </filter>
-		<encoder>
-			<pattern>${log.pattern}</pattern>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
             <charset>UTF-8</charset>
-		</encoder>
-	</appender>
+        </encoder>
+    </appender>
 
     <!-- 系统日志输出 -->
-	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
-	    <file>${log.path}/info.log</file>
+    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/info.log</file>
         <!-- 循环政策:基于时间创建日志文件 -->
-		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
-			<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
-		</rollingPolicy>
-		<encoder>
-			<pattern>${log.pattern}</pattern>
-		</encoder>
-		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <!-- 过滤的级别 -->
             <level>INFO</level>
             <!-- 匹配时的操作:接收(记录) -->
@@ -37,16 +37,16 @@
             <!-- 不匹配时的操作:拒绝(不记录) -->
             <onMismatch>DENY</onMismatch>
         </filter>
-	</appender>
+    </appender>
 
     <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
-	    <file>${log.path}/error.log</file>
+        <file>${log.path}/error.log</file>
         <!-- 循环政策:基于时间创建日志文件 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
             <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
@@ -54,21 +54,21 @@
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <!-- 过滤的级别 -->
             <level>ERROR</level>
-			<!-- 匹配时的操作:接收(记录) -->
+            <!-- 匹配时的操作:接收(记录) -->
             <onMatch>ACCEPT</onMatch>
-			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <!-- 不匹配时的操作:拒绝(不记录) -->
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
 
     <!-- 系统模块日志级别控制  -->
-	<logger name="com.sooka.sponest.lawenforcement" level="info" />
-	<!-- Spring日志级别控制  -->
-	<logger name="org.springframework" level="warn" />
+    <logger name="com.sooka.sponest.lawenforcement" level="info"/>
+    <!-- Spring日志级别控制  -->
+    <logger name="org.springframework" level="warn"/>
     <!--系统操作日志-->
-	<root level="info">
-		<appender-ref ref="console" />
-        <appender-ref ref="file_info" />
-        <appender-ref ref="file_error" />
-	</root>
+    <root level="info">
+        <appender-ref ref="console"/>
+        <appender-ref ref="file_info"/>
+        <appender-ref ref="file_error"/>
+    </root>
 </configuration>

+ 28 - 0
src/main/resources/mapper/lawenforcement/LawenforcementPersonMapper.xml

@@ -120,4 +120,32 @@
             #{id}
         </foreach>
     </delete>
+
+    <select id="selectPersonByRecordId" parameterType="string" resultMap="LawenforcementPersonResult">
+        select * from lawenforcement_person where record_id = #{id}
+    </select>
+
+    <delete id="deleteLawenforcementPersonByRecordId" parameterType="string">
+        delete from lawenforcement_person where record_id = #{id}
+    </delete>
+
+    <insert id="insertLawenforcementPersonToList" parameterType="list">
+        insert into lawenforcement_person
+            (id, person_id, random_id, person_name, person_code, person_phone, dept_id, dept_name, person_type, main_person, remark, record_id)
+        values
+        <foreach collection="list" open="(" separator="),(" close=")" item="item">
+            #{item.id},
+            #{item.personId},
+            #{item.randomId},
+            #{item.personName},
+            #{item.personCode},
+            #{item.personPhone},
+            #{item.deptId},
+            #{item.deptName},
+            #{item.personType},
+            #{item.mainPerson},
+            #{item.remark},
+            #{item.recordId}
+        </foreach>
+    </insert>
 </mapper>

+ 62 - 5
src/main/resources/mapper/lawenforcement/LawenforcementRecordMapper.xml

@@ -49,6 +49,14 @@
         <result property="deviceId" column="device_id"/>
         <result property="deviceName" column="device_name"/>
         <result property="recordStatus" column="record_status"/>
+        <collection property="personList" resultMap="LawenforcementUserResult"/>
+    </resultMap>
+
+    <resultMap id="LawenforcementUserResult" type="LawenforcementUser">
+        <result property="certificateNumber" column="person_code"/>
+        <result property="isMainPerson" column="main_person"/>
+        <result property="deptId" column="user_dept_id"/>
+        <result property="deptName" column="user_dept_name"/>
     </resultMap>
 
     <sql id="selectLawenforcementRecordVo">
@@ -85,7 +93,7 @@
                result_time,
                result_person_id,
                status,
-               FROM_UNIXTIME(create_time / 1000) AS create_time,
+               create_time,
                create_by,
                is_last,
                job_id,
@@ -108,8 +116,57 @@
     </select>
 
     <select id="selectLawenforcementRecordById" parameterType="String" resultMap="LawenforcementRecordResult">
-        <include refid="selectLawenforcementRecordVo"/>
-        where id = #{id}
+        select lr.id,
+               lr.job_type,
+               lr.creator_id,
+               lr.creator_name,
+               lr.dept_id,
+               lr.dept_name,
+               lr.area_id,
+               lr.job_name,
+               lr.check_type,
+               lr.check_object_type,
+               lr.check_object_id,
+               lr.check_object_code,
+               lr.check_object_name,
+               lr.check_object_phone,
+               lr.check_start_time,
+               lr.check_end_time,
+               lr.subitem_count,
+               lr.remark,
+               lr.verify,
+               lr.unable_verify_reason,
+               lr.scan_id,
+               lr.scan_name,
+               lr.scan_time,
+               lr.verify_people_id,
+               lr.verify_people_name,
+               lr.verify_time,
+               lr.evaluation,
+               lr.evaluation_content,
+               lr.evaluation_time,
+               lr.result,
+               lr.result_time,
+               lr.result_person_id,
+               lr.status,
+               lr.create_time,
+               lr.create_by,
+               lr.is_last,
+               lr.job_id,
+               lr.last_job_type,
+               lr.source,
+               lr.create_method,
+               lr.is_cross_dept,
+               lr.device_id,
+               lr.device_name,
+               lr.record_status,
+               lp.person_code,
+               lp.main_person,
+               lp.dept_id user_dept_id,
+               lp.dept_name user_dept_name
+        from lawenforcement_record lr
+        LEFT JOIN lawenforcement_person lp on lr.id = lp.record_id
+        where lr.id = #{id}
     </select>
 
     <insert id="insertLawenforcementRecord" parameterType="LawenforcementRecord">
@@ -296,7 +353,7 @@
     </select>
 
     <update id="updateRecordLogEndTime" parameterType="DeviceBO">
-        update lawenforcement_record_log set end_time = NOW() WHERE device_id = #{deviceCode} and end_time is null
+        update lawenforcement_record_log set end_time = NOW() WHERE device_id = #{code} and end_time is null
     </update>
 
     <update id="updateRecordStatus" parameterType="DeviceBO">
@@ -305,7 +362,7 @@
         where id = (
             select record_id
             from lawenforcement_record_log
-            where device_id = #{deviceCode} and end_time is null
+            where device_id = #{code} and end_time is null
         )
     </update>
 </mapper>

+ 9 - 0
src/main/resources/mapper/lawenforcement/LawenforcementUserMapper.xml

@@ -123,4 +123,13 @@
             #{userId}
         </foreach>
     </delete>
+
+    <select id="getUserListByDeptId" parameterType="string" resultMap="LawenforcementUserResult">
+        select user_id, nick_name, phonenumber, certificate_number, dept_id, dept_name
+        from lawenforcement_user
+        where dept_id in
+        <foreach item="deptId" collection="array" open="(" separator="," close=")">
+            #{deptId}
+        </foreach>
+    </select>
 </mapper>