# 任务派发模块开发文档 ## 一、模块概述 任务派发模块是湛江人社系统中用于实现**市级向县区级、县区级向镇街级**多层级任务流转的核心功能模块。业务流程覆盖任务的创建、派发、接收、回复以及跨层级协作等场景。 ### 核心功能 1. **任务管理**:市级用户创建任务,可设置任务名称、优先级、下达时间、截止时间、任务内容,支持草稿保存与确认派发 2. **附件管理**:任务主表、县区接收、镇街接收均可上传附件,支持一键打包下载 3. **多级接收**:市级派发到县区 → 县区人员接收后,可将任务转发给镇街人员 4. **任务回复**:县区/镇街人员收到任务后可进行回复确认,上传回复附件 5. **跨层级协作**:各级人员可发起跨层级协作请求,上级可通过协作记录进行回复 6. **我的任务**:当前登录用户可查看自己所有待处理的任务 --- ## 二、数据库表结构 ### 2.1 任务派发信息表(TASK_DISPATCH) | 字段 | 类型 | 说明 | |------|------|------| | id | String | 主键ID(雪花算法生成) | | task_name | String | 任务名称(必填) | | priority | String | 任务优先级(高/中/低,字典表TaskPriority) | | issue_time | Date | 下达时间(年月日时分,必填) | | deadline | Date | 截止时间(年月日时分,必填) | | task_content | String | 任务内容(富文本,必填) | | initiator_id | String | 发起人ID(必填) | | attachment | String | 附件 | | task_status | String | 任务状态(1-草稿/2-进行中/3-已结束,字典表TaskStatus) | | create_by | String | 创建人 | | create_time | Date | 创建时间 | | update_by | String | 修改人 | | update_time | Date | 更新时间 | | sys_org_code | String | 组织机构编号 | ### 2.2 县区级接收情况表(TASK_DISTRICT_RECEIVE) | 字段 | 类型 | 说明 | |------|------|------| | id | String | 主键ID | | task_id | String | 关联任务派发信息ID(必填) | | receiver_id | String | 接收人ID(必填) | | is_received | String | 是否已经接收(0-否/1-是,必填) | | receive_time | Date | 接收时间 | | forward_time | Date | 转发下达时间(县区转发给镇街的时间) | | reply_content | String | 回复内容(富文本) | | reply_time | Date | 回复时间 | | attachment | String | 任务附件 | | create_by | String | 创建人 | | create_time | Date | 创建时间 | | update_by | String | 修改人 | | update_time | Date | 更新时间 | | sys_org_code | String | 组织机构编号 | ### 2.3 镇区接收情况表(TASK_TOWN_RECEIVE) | 字段 | 类型 | 说明 | |------|------|------| | id | String | 主键ID | | task_id | String | 关联任务派发信息ID(必填) | | parent_id | String | 上级接收记录ID(关联县区级接收情况表ID,市级直派则为空) | | receiver_id | String | 接收人ID(必填) | | is_received | String | 是否已经接收(0-否/1-是,必填) | | receive_time | Date | 接收时间 | | reply_content | String | 回复内容(富文本) | | reply_time | Date | 回复时间 | | attachment | String | 任务附件 | | create_by | String | 创建人 | | create_time | Date | 创建时间 | | update_by | String | 修改人 | | update_time | Date | 更新时间 | | sys_org_code | String | 组织机构编号 | ### 2.4 任务附件表(TASK_ATTACHMENT) | 字段 | 类型 | 说明 | |------|------|------| | id | String | 主键ID | | biz_type | String | 业务类型(DISPATCH-任务派发/DISTRICT_RECEIVE-县区级接收/TOWN_RECEIVE-镇区级接收) | | biz_id | String | 关联业务记录ID(对应上述三张表的主键) | | file_name | String | 文件名称(必填) | | file_path | String | 文件存储路径(必填) | | file_size | Integer | 文件大小(字节) | | file_type | String | 文件类型(如pdf/docx/jpg/png等) | | sort_order | Integer | 排序序号 | | upload_by | String | 上传人ID | | create_by | String | 创建人 | | create_time | Date | 创建时间 | | update_by | String | 修改人 | | update_time | Date | 更新时间 | | sys_org_code | String | 组织机构编号 | ### 2.5 跨层级协作记录表(TASK_COLLABORATION) | 字段 | 类型 | 说明 | |------|------|------| | id | String | 主键ID | | task_id | String | 关联任务派发ID(必填) | | requester_id | String | 发起人ID(必填) | | requester_type | String | 发起方类型(DISTRICT-县区级/TOWN-镇街级,必填) | | request_content | String | 协作请求内容(必填) | | target_level | String | 请求目标层级(CITY-市级/DISTRICT-县区级,必填) | | status | String | 状态(0-待处理/1-已处理/2-已关闭) | | reply_content | String | 回复内容 | | reply_time | Date | 回复时间 | | reply_by | String | 回复人ID | | create_by | String | 创建人 | | create_time | Date | 创建时间 | | update_by | String | 修改人 | | update_time | Date | 更新时间 | | sys_org_code | String | 组织机构编号 | --- ## 三、后端代码结构 ### 3.1 项目目录结构 ``` jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/task/ ├── taskDispatch/ # 任务派发模块 │ ├── controller/ │ │ └── TaskDispatchController.java # 任务派发控制器 │ ├── entity/ │ │ └── TaskDispatch.java # 任务派发实体 │ ├── mapper/ │ │ ├── TaskDispatchMapper.java # Mapper接口 │ │ └── xml/TaskDispatchMapper.xml # MyBatis XML映射 │ ├── service/ │ │ ├── ITaskDispatchService.java # Service接口 │ │ └── impl/TaskDispatchServiceImpl.java # Service实现 │ └── vo/ │ └── TaskDispatchVO.java # 视图对象(含发起人姓名、部门) ├── taskDistrictReceive/ # 县区级接收模块 │ ├── controller/ │ │ └── TaskDistrictReceiveController.java │ ├── entity/ │ │ └── TaskDistrictReceive.java │ ├── mapper/ │ │ ├── TaskDistrictReceiveMapper.java │ │ └── xml/TaskDistrictReceiveMapper.xml │ ├── service/ │ │ ├── ITaskDistrictReceiveService.java │ │ └── impl/TaskDistrictReceiveServiceImpl.java │ └── vo/ │ └── TaskDistrictReceiveVO.java ├── taskTownReceive/ # 镇区接收模块 │ ├── controller/ │ │ └── TaskTownReceiveController.java │ ├── entity/ │ │ └── TaskTownReceive.java │ ├── mapper/ │ │ ├── TaskTownReceiveMapper.java │ │ └── xml/TaskTownReceiveMapper.xml │ ├── service/ │ │ ├── ITaskTownReceiveService.java │ │ └── impl/TaskTownReceiveServiceImpl.java │ └── vo/ │ └── TaskTownReceiveVO.java ├── taskAttachment/ # 附件模块 │ ├── controller/ │ │ └── TaskAttachmentController.java │ ├── entity/ │ │ └── TaskAttachment.java │ ├── mapper/ │ │ ├── TaskAttachmentMapper.java │ │ └── xml/TaskAttachmentMapper.xml │ ├── service/ │ │ ├── ITaskAttachmentService.java │ │ └── impl/TaskAttachmentServiceImpl.java │ └── vo/ │ └── TaskAttachmentVO.java └── taskCollaboration/ # 跨层级协作模块 ├── controller/ │ └── TaskCollaborationController.java ├── entity/ │ └── TaskCollaboration.java ├── mapper/ │ ├── TaskCollaborationMapper.java │ └── xml/TaskCollaborationMapper.xml ├── service/ │ ├── ITaskCollaborationService.java │ └── impl/TaskCollaborationServiceImpl.java └── vo/ └── TaskCollaborationVO.java ``` ### 3.2 API 接口列表 #### 任务派发(TaskDispatchController) | 接口 | 方法 | 路径 | 说明 | |------|------|------|------| | queryPageList | GET | /task/taskDispatch/list | 分页列表查询(含发起人姓名和部门) | | queryMyTaskList | GET | /task/taskDispatch/myTaskList | 我的任务列表(从接收表反向查询) | | add | POST | /task/taskDispatch/add | 新增任务(返回新记录ID) | | edit | PUT/POST | /task/taskDispatch/edit | 编辑任务 | | delete | DELETE | /task/taskDispatch/delete | 单条删除 | | deleteBatch | DELETE | /task/taskDispatch/deleteBatch | 批量删除 | | queryById | GET | /task/taskDispatch/queryById | 通过ID查询(含发起人姓名和部门) | | updateStatus | PUT | /task/taskDispatch/updateStatus | 修改任务状态 | | exportXls | GET | /task/taskDispatch/exportXls | 导出Excel(字典值自动翻译) | | importExcel | POST | /task/taskDispatch/importExcel | 导入Excel | | downloadAttachmentsZip | GET | /task/taskDispatch/downloadAttachmentsZip | 一键打包下载任务所有附件 | #### 县区级接收(TaskDistrictReceiveController) | 接口 | 方法 | 路径 | 说明 | |------|------|------|------| | queryPageList | GET | /task/taskDistrictReceive/list | 分页列表查询(含接收人姓名和部门) | | add | POST | /task/taskDistrictReceive/add | 新增接收记录 | | edit | PUT/POST | /task/taskDistrictReceive/edit | 编辑接收记录 | | delete | DELETE | /task/taskDistrictReceive/delete | 单条删除 | | deleteBatch | DELETE | /task/taskDistrictReceive/deleteBatch | 批量删除 | | reply | PUT/POST | /task/taskDistrictReceive/reply | 回复确认 | | updateForwardTime | PUT/POST | /task/taskDistrictReceive/updateForwardTime | 更新转发时间 | | queryById | GET | /task/taskDistrictReceive/queryById | 通过ID查询 | #### 镇区接收(TaskTownReceiveController) | 接口 | 方法 | 路径 | 说明 | |------|------|------|------| | queryPageList | GET | /task/taskTownReceive/list | 分页列表查询 | | add | POST | /task/taskTownReceive/add | 新增 | | edit | PUT/POST | /task/taskTownReceive/edit | 编辑 | | delete | DELETE | /task/taskTownReceive/delete | 单条删除 | | deleteBatch | DELETE | /task/taskTownReceive/deleteBatch | 批量删除 | | reply | PUT/POST | /task/taskTownReceive/reply | 回复确认 | | queryById | GET | /task/taskTownReceive/queryById | 通过ID查询 | #### 附件(TaskAttachmentController) | 接口 | 方法 | 路径 | 说明 | |------|------|------|------| | queryPageList | GET | /task/taskAttachment/list | 分页列表查询(含上传人名称) | | add | POST | /task/taskAttachment/add | 添加附件 | | edit | PUT/POST | /task/taskAttachment/edit | 编辑附件 | | delete | DELETE | /task/taskAttachment/delete | 删除附件 | | deleteBatch | DELETE | /task/taskAttachment/deleteBatch | 批量删除 | | queryById | GET | /task/taskAttachment/queryById | 通过ID查询 | #### 跨层级协作(TaskCollaborationController) | 接口 | 方法 | 路径 | 说明 | |------|------|------|------| | queryPageList | GET | /task/taskCollaboration/list | 分页列表查询(含发起人姓名和回复人姓名) | | add | POST | /task/taskCollaboration/add | 新增协作 | | edit | PUT/POST | /task/taskCollaboration/edit | 编辑协作 | | delete | DELETE | /task/taskCollaboration/delete | 删除协作 | | deleteBatch | DELETE | /task/taskCollaboration/deleteBatch | 批量删除 | | reply | POST | /task/taskCollaboration/reply | 回复协作(更新状态、回复内容、回复人、回复时间) | | queryById | GET | /task/taskCollaboration/queryById | 通过ID查询 | --- ## 四、核心业务逻辑详解 ### 4.1 任务派发流程 **流程图:** ``` 市级人员创建任务 → 保存草稿(taskStatus=1) → 确认派发(taskStatus=2) → 任务进入"我的任务" ├── 可选:添加县区接收人 └── 可选:添加镇街接收人(需先有县区接收记录作为parentId) ``` **关键代码 - TaskDispatchForm.vue 保存与派发逻辑:** - **保存为草稿(submitDraft)**:将 `taskStatus` 设为 `'1'`(草稿),保存后不关闭弹窗,允许继续编辑 - **确认派发(submitAndConfirm)**:将 `taskStatus` 设为 `'2'`(进行中),保存后通过 `emit('confirm')` 通知父组件关闭弹窗 - 两者都先经过表单校验(`validate()`),校验失败则滚动到第一个错误字段 ### 4.2 我的任务列表查询逻辑 **接口:** `GET /task/taskDispatch/myTaskList` 这是模块中最复杂的查询逻辑,核心步骤: 1. **获取当前登录用户ID**:通过 Shiro 的 `SecurityUtils.getSubject().getPrincipal()` 获得当前用户 2. **反向查找任务ID**:分别查询县区接收表、镇街接收表中 `receiverId=当前用户ID` 的记录,收集对应的 `taskId`;同时查询当前用户为发起人的任务 3. **排除草稿状态**:查询条件中排除 `taskStatus='1'`(草稿),确保只展示已派发的任务 4. **排序规则**:使用自定义SQL排序 `ORDER BY CASE WHEN task_status = '2' THEN 0 ELSE 1 END, issue_time DESC`,实现"进行中优先,相同状态按发起时间最新在前" 5. **标记来源信息**:为每个任务VO设置 `sourceTable`(DISTRICT/TOWN/DISPATCH)和 `sourceId`,前端根据这两个字段决定操作权限: - `DISTRICT`:用户来自县区接收表,可进行回复、派发任务(转发镇街) - `TOWN`:用户来自镇街接收表,可进行回复 - `DISPATCH`:用户是发起人/市级人员,不显示回复操作 ### 4.3 用户信息批量查询(通用模式) 多个Service共用的设计模式,以解决N+1查询问题: 1. **分页查询实体数据** 2. **收集所有用户ID**(去重) 3. **调用Mapper批量查询**:通过 `sys_user` 左关联 `sys_user_depart` 和 `sys_depart`,一次性获取所有用户的姓名和部门信息 4. **转换为VO**:通过 `BeanUtils.copyProperties` 复制实体属性,再设置扩展字段 5. **构建VO分页结果** **用户姓名取值规则**(SQL层面实现): ```sql CASE WHEN su.REALNAME IS NOT NULL AND su.REALNAME != '' THEN su.REALNAME ELSE su.USERNAME END ``` 优先取真实姓名(realname),若无则取用户名(username) **部门取值规则**: - 通过 `sys_user_depart` 取该用户关联的最小ID记录(`SELECT MIN(t2.ID) FROM sys_user_depart t2 WHERE t2.USER_ID = su.ID`),再关联 `sys_depart` 获取 `depart_name` ### 4.4 附件管理 #### 附件上传 文件通过通用上传接口上传,返回文件路径后,在 `TASK_ATTACHMENT` 表创建记录: - **bizType** 区分业务类型:`DISPATCH`(任务主表)、`DISTRICT_RECEIVE`(县区接收)、`TOWN_RECEIVE`(镇街接收) - **bizId** 关联对应业务记录的主键 - 上传时必须先保存主记录获得 `id`(表单提示:"请先保存任务后再上传附件") #### 附件一键打包下载 **接口:** `GET /task/taskDispatch/downloadAttachmentsZip` 步骤: 1. 查询 `TASK_ATTACHMENT` 表中与任务关联的所有附件(主表 + 所有县区接收 + 所有镇街接收) 2. 从服务器文件系统按 `uploadPath + filePath` 路径读取文件 3. 以 `java.util.zip.ZipOutputStream` 打包为zip,通过 `HttpServletResponse` 输出流返回 4. 设置响应头 `Content-Disposition: attachment` 触发浏览器下载 ### 4.5 Excel导出逻辑 **接口:** `GET /task/taskDispatch/exportXls` 导出字段:任务名称、任务优先级、下达时间、截止时间、发起人、发起部门、任务状态 步骤: 1. **组装查询条件**:支持按选中行导出(`selections` 参数) 2. **字典字段翻译**:调用 `translateDictFields` 方法,将 `priority`(`TaskPriority` 字典)和 `taskStatus`(`TaskStatus` 字典)的值替换为中文标签 3. **填充用户信息**:调用 `enrichUserInfo` 方法,填充发起人姓名和部门名称 4. **AutoPoi导出**:使用 Jeecg 框架的 `JeecgEntityExcelView` 导出 Excel ### 4.6 跨层级协作 协作场景:县区/镇街人员可向上级(市级/县区级)发起协作请求,上级人员可以回复。 **发起方类型与控制逻辑:** - `sourceTable === 'TOWN'`(镇街级用户)→ `requesterType = 'TOWN'`,可选择 `CITY` 或 `DISTRICT` 作为目标层级 - `sourceTable === 'DISTRICT'`(县区级用户)→ `requesterType = 'DISTRICT'`,只能选择 `CITY` 作为目标层级 **协作回复:** - 回复接口 `/task/taskCollaboration/reply` 会更新 `status='1'`(已处理)、`replyContent`、`replyBy`、`replyTime` ### 4.7 任务回复逻辑 **接口:** `POST /task/taskDistrictReceive/reply` 或 `POST /task/taskTownReceive/reply` 回复时采用的更新策略: - 使用 MyBatis-Plus 的 `lambdaUpdate()` 链式调用,只更新指定字段(`isReceived`、`receiveTime`、`replyContent`、`replyTime`、`attachment`),不修改其他字段 - 使用 `@RequestBody` 接收参数,跳过 `@Valid` 校验,允许部分字段更新 ### 4.8 县区转发镇街逻辑 当县区人员将任务转发给镇街人员时: 1. 在 `DispatchTownModal` 中新增镇街接收记录 2. 点击"确定派发"时,调用 `/task/taskDistrictReceive/updateForwardTime` 将县区接收记录的 `forwardTime` 更新为当前时间 3. 镇街接收记录的 `parentId` 关联对应的县区接收记录ID --- ## 五、前端代码结构 ### 5.1 项目目录结构 ``` jeecgboot-vue3/src/views/task/ ├── taskDispatch/ │ ├── TaskDispatchList.vue # 市级用户任务列表页 │ ├── MyTaskList.vue # 县级/镇级用户"我的任务"列表页 │ ├── TaskDispatch.data.ts # 表格列/搜索表单/编辑表单配置 │ ├── TaskDispatch.api.ts # 所有API接口定义 │ └── components/ │ ├── TaskDispatchModal.vue # 新增/编辑/详情弹窗容器 │ ├── TaskDispatchForm.vue # 任务编辑表单(含子表) │ ├── TaskDispatchDetailModal.vue # 任务详情弹窗 │ ├── TaskReplyModal.vue # 任务回复弹窗 │ ├── DispatchTownModal.vue # 派发镇街弹窗 │ ├── DistrictReceiveEditModal.vue # 县区接收编辑弹窗 │ ├── TownReceiveEditModal.vue # 镇街接收编辑弹窗 │ ├── CollaborationAddModal.vue # 新增协作请求弹窗 │ └── CollaborationReplyModal.vue # 协作回复弹窗 ``` ### 5.2 前端页面说明 #### TaskDispatchList.vue(市级用户操作页) - 包含操作:新增、导出、批量删除、查看、修改(仅草稿状态)、结束任务、附件打包下载 - 结束任务:调用 `updateStatus` 接口将 `taskStatus` 设为 `'3'`(已结束) - 使用 `useListPage` hook 进行表格数据管理与导出 #### MyTaskList.vue(县区/镇街用户操作页) - 包含操作:查看、派发任务(仅 `sourceTable === 'DISTRICT'` 且 `taskStatus === '2'` 时显示)、回复确认(仅 `taskStatus === '2'` 时显示)、附件打包下载 - 派发任务点击后打开 `DispatchTownModal` 弹窗 - 回复确认点击后打开 `TaskReplyModal` 弹窗 #### TaskDispatchForm.vue(核心表单组件) 这是最复杂的单文件组件,包含: 1. **主表表单**:任务名称、优先级、发起人(自动填充)、发起部门(自动填充)、下达时间、截止时间、任务内容 2. **附件子表**:上传、删除附件(新增模式下需先保存任务) 3. **县区接收子表**:通过 `DistrictReceiveEditModal` 编辑,支持新增、编辑、删除 4. **镇街接收子表**:通过 `TownReceiveEditModal` 编辑,支持新增、编辑、删除 5. **操作按钮**:返回、保存(草稿)、确认派发 **自动填充逻辑**: - `initiatorId` 从 `useUserStore().getUserInfo` 获取当前登录用户ID - 发起人姓名显示 `realname || username` - 部门名称通过 `getUserDeparts()` 接口获取用户所属部门的 `departName` #### TaskReplyModal.vue(任务回复弹窗) 核心业务逻辑: 1. 展示任务基本信息和附件(只读) 2. 根据 `sourceTable` 类型控制: - `DISPATCH`:隐藏回复内容、回复附件、协作新增按钮 - `DISTRICT`/`TOWN`:显示回复内容和上传附件 3. **跨层级协作**区域独立显示,自己发起的记录和匹配当前用户层级的目标记录 4. 协作记录的回复按钮显示规则:当前用户层级匹配 `targetLevel` 时显示 ### 5.3 前端数据流 - **表格数据**:通过 `useListPage` hook 管理,`beforeFetch` 中合并查询参数 - **字典翻译**:通过 `useDict` hook 加载字典,`getDictText` 进行值→标签翻译,`getDictOptions` 生成下拉选项 - **用户信息**:通过 `useUserStore` 获取当前登录用户(id、realname、username) - **文件上传**:使用 Ant Design Vue 的 `` 组件,上传成功后调用附件保存接口 --- ## 六、涉及的文件清单 ### 后端文件(22个) | 文件 | 说明 | |------|------| | `jeecg-module-zjrs/.../task/taskDispatch/controller/TaskDispatchController.java` | 任务派发控制器,包含核心CRUD、Excel导入导出、附件打包下载、任务状态修改 | | `jeecg-module-zjrs/.../task/taskDispatch/entity/TaskDispatch.java` | 任务派发实体定义(TASK_DISPATCH表映射) | | `jeecg-module-zjrs/.../task/taskDispatch/mapper/TaskDispatchMapper.java` | 任务派发Mapper,定义批量查询用户信息方法 | | `jeecg-module-zjrs/.../task/taskDispatch/mapper/xml/TaskDispatchMapper.xml` | MyBatis SQL映射,批量查询用户姓名+部门 | | `jeecg-module-zjrs/.../task/taskDispatch/service/ITaskDispatchService.java` | 任务派发Service接口,定义分页VO查询、用户信息填充、字典翻译、状态修改、单条VO查询 | | `jeecg-module-zjrs/.../task/taskDispatch/service/impl/TaskDispatchServiceImpl.java` | 任务派发Service实现,包含完整的VO转换逻辑和批量查询 | | `jeecg-module-zjrs/.../task/taskDispatch/vo/TaskDispatchVO.java` | 任务派发VO,扩展发起人姓名、部门、来源表、来源ID字段 | | `jeecg-module-zjrs/.../task/taskDistrictReceive/controller/TaskDistrictReceiveController.java` | 县区接收控制器,支持CRUD、回复确认、更新转发时间 | | `jeecg-module-zjrs/.../task/taskDistrictReceive/entity/TaskDistrictReceive.java` | 县区接收实体定义 | | `jeecg-module-zjrs/.../task/taskDistrictReceive/mapper/TaskDistrictReceiveMapper.java` | 县区接收Mapper | | `jeecg-module-zjrs/.../task/taskDistrictReceive/mapper/xml/TaskDistrictReceiveMapper.xml` | MyBatis SQL映射 | | `jeecg-module-zjrs/.../task/taskDistrictReceive/service/ITaskDistrictReceiveService.java` | 县区接收Service接口 | | `jeecg-module-zjrs/.../task/taskDistrictReceive/service/impl/TaskDistrictReceiveServiceImpl.java` | 县区接收Service实现 | | `jeecg-module-zjrs/.../task/taskDistrictReceive/vo/TaskDistrictReceiveVO.java` | 县区接收VO | | `jeecg-module-zjrs/.../task/taskTownReceive/controller/TaskTownReceiveController.java` | 镇区接收控制器 | | `jeecg-module-zjrs/.../task/taskTownReceive/entity/TaskTownReceive.java` | 镇区接收实体定义 | | `jeecg-module-zjrs/.../task/taskTownReceive/mapper/TaskTownReceiveMapper.java` | 镇区接收Mapper | | `jeecg-module-zjrs/.../task/taskTownReceive/mapper/xml/TaskTownReceiveMapper.xml` | MyBatis SQL映射 | | `jeecg-module-zjrs/.../task/taskTownReceive/service/ITaskTownReceiveService.java` | 镇区接收Service接口 | | `jeecg-module-zjrs/.../task/taskTownReceive/service/impl/TaskTownReceiveServiceImpl.java` | 镇区接收Service实现 | | `jeecg-module-zjrs/.../task/taskTownReceive/vo/TaskTownReceiveVO.java` | 镇区接收VO | | `jeecg-module-zjrs/.../task/taskCollaboration/controller/TaskCollaborationController.java` | 跨层级协作控制器,提供CRUD和回复接口 | | `jeecg-module-zjrs/.../task/taskCollaboration/entity/TaskCollaboration.java` | 跨层级协作实体定义 | | `jeecg-module-zjrs/.../task/taskCollaboration/mapper/TaskCollaborationMapper.java` | 跨层级协作Mapper | | `jeecg-module-zjrs/.../task/taskCollaboration/mapper/xml/TaskCollaborationMapper.xml` | MyBatis SQL映射(仅查询用户姓名) | | `jeecg-module-zjrs/.../task/taskCollaboration/service/ITaskCollaborationService.java` | 跨层级协作Service接口 | | `jeecg-module-zjrs/.../task/taskCollaboration/service/impl/TaskCollaborationServiceImpl.java` | 跨层级协作Service实现 | | `jeecg-module-zjrs/.../task/taskCollaboration/vo/TaskCollaborationVO.java` | 跨层级协作VO | | `jeecg-module-zjrs/.../task/taskAttachment/controller/TaskAttachmentController.java` | 附件控制器 | | `jeecg-module-zjrs/.../task/taskAttachment/entity/TaskAttachment.java` | 附件实体定义 | | `jeecg-module-zjrs/.../task/taskAttachment/mapper/TaskAttachmentMapper.java` | 附件Mapper | | `jeecg-module-zjrs/.../task/taskAttachment/mapper/xml/TaskAttachmentMapper.xml` | MyBatis SQL映射 | | `jeecg-module-zjrs/.../task/taskAttachment/service/ITaskAttachmentService.java` | 附件Service接口 | | `jeecg-module-zjrs/.../task/taskAttachment/service/impl/TaskAttachmentServiceImpl.java` | 附件Service实现 | | `jeecg-module-zjrs/.../task/taskAttachment/vo/TaskAttachmentVO.java` | 附件VO | ### 前端文件(13个) | 文件 | 说明 | |------|------| | `jeecgboot-vue3/src/views/task/taskDispatch/TaskDispatchList.vue` | 市级用户任务列表页 | | `jeecgboot-vue3/src/views/task/taskDispatch/MyTaskList.vue` | 县区/镇街用户"我的任务"列表页 | | `jeecgboot-vue3/src/views/task/taskDispatch/TaskDispatch.data.ts` | 表格列配置、搜索表单配置、编辑表单配置 | | `jeecgboot-vue3/src/views/task/taskDispatch/TaskDispatch.api.ts` | 所有API接口定义与调用方法 | | `jeecgboot-vue3/src/views/task/taskDispatch/components/TaskDispatchModal.vue` | 任务新增/编辑/详情弹窗容器 | | `jeecgboot-vue3/src/views/task/taskDispatch/components/TaskDispatchForm.vue` | 任务编辑表单(主表+附件+县区接收+镇街接收子表) | | `jeecgboot-vue3/src/views/task/taskDispatch/components/TaskDispatchDetailModal.vue` | 任务详情浏览弹窗(含所有子表数据) | | `jeecgboot-vue3/src/views/task/taskDispatch/components/TaskReplyModal.vue` | 任务回复弹窗(含协作记录、附件上传) | | `jeecgboot-vue3/src/views/task/taskDispatch/components/DispatchTownModal.vue` | 县区派发任务到镇街弹窗 | | `jeecgboot-vue3/src/views/task/taskDispatch/components/DistrictReceiveEditModal.vue` | 县区接收记录编辑弹窗 | | `jeecgboot-vue3/src/views/task/taskDispatch/components/TownReceiveEditModal.vue` | 镇街接收记录编辑弹窗 | | `jeecgboot-vue3/src/views/task/taskDispatch/components/CollaborationAddModal.vue` | 新增跨层级协作弹窗 | | `jeecgboot-vue3/src/views/task/taskDispatch/components/CollaborationReplyModal.vue` | 跨层级协作回复弹窗 | --- ## 七、技术要点 ### 7.1 前后端使用的数据字典 | 字典编码 | 字典名称 | 使用场景 | |----------|----------|----------| | TaskPriority | 任务优先级 | 任务派发表格的 priority 字段 | | TaskStatus | 任务状态 | 任务派发表格的 taskStatus 字段 | ### 7.2 任务状态枚举 | 值 | 含义 | 说明 | |----|------|------| | 1 | 草稿 | 任务已保存但未派发,只有创建者可见 | | 2 | 进行中 | 任务已派发,接收人可见 | | 3 | 已结束 | 任务已完成/终止,不再操作 | ### 7.3 来源表枚举(sourceTable) | 值 | 含义 | 说明 | |----|------|------| | DISTRICT | 县区接收表 | 当前用户是某个县区接收记录的接收人 | | TOWN | 镇街接收表 | 当前用户是某个镇街接收记录的接收人 | | DISPATCH | 任务主表 | 当前用户是发起人或市级用户 | ### 7.4 技术栈 - **后端**:Spring Boot + MyBatis-Plus + Jeecg Boot + Shiro - **前端**:Vue 3 + TypeScript + Ant Design Vue + Jeecg Vue3 组件 - **文件上传**:Spring Boot 标准文件上传 + Ant Design Vue Upload 组件 - **Excel导出**:Jeecg AutoPoi