Commit 8facf901847e55885988a3827b3d8e0388b4f7c4
Merge remote-tracking branch 'origin/dev' into dev
Showing
20 changed files
with
298 additions
and
60 deletions
urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmProcessTaskApi.java
| 1 | 1 | package com.zteits.urbanops.module.bpm.api.task; |
| 2 | 2 | |
| 3 | +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO; | |
| 4 | +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO; | |
| 5 | +import jakarta.validation.Valid; | |
| 3 | 6 | import jakarta.validation.constraints.NotEmpty; |
| 7 | +import org.springframework.web.bind.annotation.RequestBody; | |
| 4 | 8 | |
| 5 | 9 | /** |
| 6 | 10 | * 流程任务 Api 接口 |
| ... | ... | @@ -18,4 +22,18 @@ public interface BpmProcessTaskApi { |
| 18 | 22 | void triggerTask(@NotEmpty(message = "流程实例的编号不能为空") String processInstanceId, |
| 19 | 23 | @NotEmpty(message = "任务 Key 不能为空") String taskDefineKey); |
| 20 | 24 | |
| 25 | + /** | |
| 26 | + * 通过 | |
| 27 | + * | |
| 28 | + * @param reqVO 流程实例编号 | |
| 29 | + */ | |
| 30 | + void approveTask(@Valid BpmTaskApproveReqVO reqVO); | |
| 31 | + | |
| 32 | + /** | |
| 33 | + * 退回 | |
| 34 | + * | |
| 35 | + * @param reqVO 流程实例编号 | |
| 36 | + */ | |
| 37 | + void returnTask(@Valid BpmTaskReturnReqVO reqVO); | |
| 38 | + | |
| 21 | 39 | } | ... | ... |
urbanops-module-bpm/src/main/java/com/zteits/urbanops/module/bpm/api/task/BpmProcessTaskApiImpl.java
| 1 | 1 | package com.zteits.urbanops.module.bpm.api.task; |
| 2 | 2 | |
| 3 | +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO; | |
| 4 | +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO; | |
| 3 | 5 | import com.zteits.urbanops.module.bpm.service.task.BpmTaskService; |
| 4 | 6 | import jakarta.annotation.Resource; |
| 5 | 7 | import org.springframework.stereotype.Service; |
| 6 | 8 | import org.springframework.validation.annotation.Validated; |
| 7 | 9 | |
| 10 | +import static com.zteits.urbanops.framework.web.core.util.WebFrameworkUtils.getLoginUserId; | |
| 11 | + | |
| 8 | 12 | /** |
| 9 | 13 | * 流程任务 Api 实现类 |
| 10 | 14 | * |
| ... | ... | @@ -22,4 +26,14 @@ public class BpmProcessTaskApiImpl implements BpmProcessTaskApi { |
| 22 | 26 | bpmTaskService.triggerTask(processInstanceId, taskDefineKey); |
| 23 | 27 | } |
| 24 | 28 | |
| 29 | + @Override | |
| 30 | + public void approveTask(BpmTaskApproveReqVO reqVO) { | |
| 31 | + bpmTaskService.approveTask(getLoginUserId(), reqVO); | |
| 32 | + } | |
| 33 | + | |
| 34 | + @Override | |
| 35 | + public void returnTask(BpmTaskReturnReqVO reqVO) { | |
| 36 | + bpmTaskService.returnTask(getLoginUserId(), reqVO); | |
| 37 | + } | |
| 38 | + | |
| 25 | 39 | } | ... | ... |
urbanops-module-garden/pom.xml
| ... | ... | @@ -126,6 +126,12 @@ |
| 126 | 126 | <artifactId>urbanops-module-system</artifactId> |
| 127 | 127 | <version>${revision}</version> |
| 128 | 128 | </dependency> |
| 129 | + <dependency> | |
| 130 | + <groupId>com.zteits.boot</groupId> | |
| 131 | + <artifactId>urbanops-module-bpm</artifactId> | |
| 132 | + <version>2025.10-SNAPSHOT</version> | |
| 133 | + <scope>compile</scope> | |
| 134 | + </dependency> | |
| 129 | 135 | </dependencies> |
| 130 | 136 | |
| 131 | 137 | </project> | ... | ... |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java
| ... | ... | @@ -9,6 +9,7 @@ import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; |
| 9 | 9 | import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoPageReqVO; |
| 10 | 10 | import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoRespVO; |
| 11 | 11 | import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoSaveReqVO; |
| 12 | +import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoUpdReqVO; | |
| 12 | 13 | import com.zteits.urbanops.module.garden.convert.AssignTaskConvert; |
| 13 | 14 | import com.zteits.urbanops.module.garden.dal.dataobject.assigntasks.AssignTasksDO; |
| 14 | 15 | import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; |
| ... | ... | @@ -160,7 +161,7 @@ public class AssignTasksInfoController { |
| 160 | 161 | @PreAuthorize("@ss.hasPermission('garden:assign-tasks-info:update')") |
| 161 | 162 | @Operation(summary = "派单任务-驳回") |
| 162 | 163 | @PutMapping(value = "/reject") |
| 163 | - public CommonResult reject(@RequestBody AssignTasksInfoSaveReqVO assignTaskCompany) { | |
| 164 | + public CommonResult reject(@RequestBody AssignTasksInfoUpdReqVO assignTaskCompany) { | |
| 164 | 165 | return success(assignTasksInfoService.rejectAssignTaskCompany(assignTaskCompany)); |
| 165 | 166 | } |
| 166 | 167 | |
| ... | ... | @@ -168,7 +169,7 @@ public class AssignTasksInfoController { |
| 168 | 169 | @PreAuthorize("@ss.hasPermission('garden:assign-tasks-info:update')") |
| 169 | 170 | @Operation(summary = "派单任务-催交") |
| 170 | 171 | @PutMapping(value = "/submission") |
| 171 | - public CommonResult submission(@RequestBody AssignTasksInfoSaveReqVO assignTaskCompany) { | |
| 172 | + public CommonResult submission(@RequestBody AssignTasksInfoUpdReqVO assignTaskCompany) { | |
| 172 | 173 | return success(assignTasksInfoService.submissionAssignTaskCompany(assignTaskCompany)); |
| 173 | 174 | } |
| 174 | 175 | |
| ... | ... | @@ -176,7 +177,7 @@ public class AssignTasksInfoController { |
| 176 | 177 | @PreAuthorize("@ss.hasPermission('garden:assign-tasks-info:update')") |
| 177 | 178 | @Operation(summary = "派单任务-反馈") |
| 178 | 179 | @PutMapping(value = "/feedback") |
| 179 | - public CommonResult feedback(@RequestBody AssignTasksInfoSaveReqVO assignTaskCompany) { | |
| 180 | + public CommonResult feedback(@RequestBody AssignTasksInfoUpdReqVO assignTaskCompany) { | |
| 180 | 181 | return success(assignTasksInfoService.feedbackAssignTaskCompany(assignTaskCompany)); |
| 181 | 182 | } |
| 182 | 183 | } | ... | ... |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/vo/AssignTasksInfoUpdReqVO.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import jakarta.validation.constraints.NotEmpty; | |
| 5 | +import jakarta.validation.constraints.NotNull; | |
| 6 | +import lombok.Data; | |
| 7 | + | |
| 8 | +import java.time.LocalDateTime; | |
| 9 | +import java.util.List; | |
| 10 | + | |
| 11 | +@Schema(description = "管理后台 - 派单任务-单位关联表(记录单位接收派单后的执行详情)新增/修改 Request VO") | |
| 12 | +@Data | |
| 13 | +public class AssignTasksInfoUpdReqVO { | |
| 14 | + | |
| 15 | + @Schema(description = "自增ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12148") | |
| 16 | + private Long id; | |
| 17 | + @Schema(description = "驳回备注(当finish=2时,说明驳回原因)", example = "你说的对") | |
| 18 | + private String rejectRemark; | |
| 19 | + | |
| 20 | + @Schema(description = "备注", example = "你猜") | |
| 21 | + private String remark; | |
| 22 | + @Schema(description = "单位提交的任务文件路径(如:填报表格、现场照片等)") | |
| 23 | + private List<String> dataFile; | |
| 24 | + | |
| 25 | +} | ... | ... |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/assigntasks/AssignTasksDO.java
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/AssignTasksConstants.java
| ... | ... | @@ -31,4 +31,8 @@ public class AssignTasksConstants { |
| 31 | 31 | public static final int ASSIGN_TASK_SCENE = 6; |
| 32 | 32 | /*办理人角色*/ |
| 33 | 33 | public static final String ASSIGN_ROLE_KEY = "zgs_leader"; |
| 34 | + /** | |
| 35 | + * bpm流程标识 任务管理 | |
| 36 | + */ | |
| 37 | + public static final String ASSIGN_TASK_PROCESS = "common_assign_task"; | |
| 34 | 38 | } | ... | ... |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java
| ... | ... | @@ -4,6 +4,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| 4 | 4 | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| 5 | 5 | import com.zteits.urbanops.framework.common.pojo.PageResult; |
| 6 | 6 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; |
| 7 | +import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; | |
| 8 | +import com.zteits.urbanops.module.bpm.api.task.BpmProcessInstanceApi; | |
| 9 | +import com.zteits.urbanops.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; | |
| 7 | 10 | import com.zteits.urbanops.module.garden.controller.admin.assigntasks.vo.AssignTasksPageReqVO; |
| 8 | 11 | import com.zteits.urbanops.module.garden.controller.admin.assigntasks.vo.AssignTasksSaveReqVO; |
| 9 | 12 | import com.zteits.urbanops.module.garden.dal.dataobject.assigntasks.AssignTasksDO; |
| ... | ... | @@ -12,8 +15,9 @@ import com.zteits.urbanops.module.garden.dal.mysql.assigntasks.AssignTasksMapper |
| 12 | 15 | import com.zteits.urbanops.module.garden.dal.mysql.assigntasksinfo.AssignTasksInfoMapper; |
| 13 | 16 | import com.zteits.urbanops.module.garden.enums.AssignTasksConstants; |
| 14 | 17 | import com.zteits.urbanops.module.garden.service.assigntasksinfo.AssignTasksInfoService; |
| 15 | -import com.zteits.urbanops.module.system.api.dept.DeptApi; | |
| 16 | -import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; | |
| 18 | +import com.zteits.urbanops.module.system.api.permission.RoleApi; | |
| 19 | +import com.zteits.urbanops.module.system.api.user.AdminUserApi; | |
| 20 | +import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; | |
| 17 | 21 | import jakarta.annotation.Resource; |
| 18 | 22 | import lombok.extern.slf4j.Slf4j; |
| 19 | 23 | import org.springframework.stereotype.Service; |
| ... | ... | @@ -22,13 +26,14 @@ import org.springframework.util.CollectionUtils; |
| 22 | 26 | import org.springframework.validation.annotation.Validated; |
| 23 | 27 | |
| 24 | 28 | import java.time.LocalDateTime; |
| 25 | -import java.util.ArrayList; | |
| 26 | -import java.util.List; | |
| 27 | -import java.util.Objects; | |
| 29 | +import java.util.*; | |
| 30 | +import java.util.function.Function; | |
| 28 | 31 | import java.util.stream.Collectors; |
| 29 | 32 | |
| 33 | +import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; | |
| 30 | 34 | import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 31 | -import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.*; | |
| 35 | +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception0; | |
| 36 | +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getCompanyId; | |
| 32 | 37 | import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.ASSIGN_TASKS_NOT_EXISTS; |
| 33 | 38 | import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.ASSIGN_TASKS_NOT_EXISTS_002; |
| 34 | 39 | |
| ... | ... | @@ -53,9 +58,15 @@ public class AssignTasksServiceImpl implements AssignTasksService { |
| 53 | 58 | |
| 54 | 59 | @Resource |
| 55 | 60 | private AssignTasksInfoMapper assignTasksInfoMapper; |
| 61 | + //@Resource | |
| 62 | + //private DeptApi deptApi; | |
| 56 | 63 | @Resource |
| 57 | - private DeptApi deptApi; | |
| 64 | + private RoleApi roleApi; | |
| 65 | + @Resource | |
| 66 | + AdminUserApi userApi; | |
| 58 | 67 | |
| 68 | + @Resource | |
| 69 | + private BpmProcessInstanceApi processInstanceApi; | |
| 59 | 70 | |
| 60 | 71 | @Transactional(rollbackFor = Exception.class) |
| 61 | 72 | @Override |
| ... | ... | @@ -65,8 +76,8 @@ public class AssignTasksServiceImpl implements AssignTasksService { |
| 65 | 76 | assignTasksMapper.insert(assignTasks); |
| 66 | 77 | //保存单位明细 |
| 67 | 78 | assignTasksInfoService.saveAssignTasksInfos(createReqVO.getCompanyIds(), assignTasks); |
| 68 | - //保存单位明细 | |
| 69 | - | |
| 79 | + //发起工作流 | |
| 80 | + //processInstance(createReqVO, assignTasks.getId()); | |
| 70 | 81 | // 返回 |
| 71 | 82 | return assignTasks.getId(); |
| 72 | 83 | } |
| ... | ... | @@ -120,9 +131,7 @@ public class AssignTasksServiceImpl implements AssignTasksService { |
| 120 | 131 | // 删除 |
| 121 | 132 | assignTasksMapper.deleteById(id); |
| 122 | 133 | //删除关联的明细 |
| 123 | - List<Long> ids = new ArrayList<>(); | |
| 124 | - ids.add(id); | |
| 125 | - assiAssignTasksInfoMapper.deleteAssignTaskInfoByTaskId(ids); | |
| 134 | + assiAssignTasksInfoMapper.deleteAssignTaskInfoByTaskId(Arrays.asList(id)); | |
| 126 | 135 | } |
| 127 | 136 | |
| 128 | 137 | @Override |
| ... | ... | @@ -174,8 +183,6 @@ public class AssignTasksServiceImpl implements AssignTasksService { |
| 174 | 183 | if(allSubTaskFinished) { |
| 175 | 184 | assignTasks.setParentFinish(AssignTasksConstants.ASSIGN_TASK_FINISH_1); |
| 176 | 185 | assignTasks.setFinishTime(LocalDateTime.now()); |
| 177 | - assignTasks.setUpdateTime(LocalDateTime.now()); | |
| 178 | - assignTasks.setUpdater(String.valueOf(getLoginUserId())); | |
| 179 | 186 | assignTasksMapper.updateById(assignTasks); |
| 180 | 187 | } else { |
| 181 | 188 | throw exception(ASSIGN_TASKS_NOT_EXISTS_002); |
| ... | ... | @@ -242,4 +249,65 @@ public class AssignTasksServiceImpl implements AssignTasksService { |
| 242 | 249 | return updatedCount; |
| 243 | 250 | } |
| 244 | 251 | |
| 252 | + /** | |
| 253 | + * @Author wangqian | |
| 254 | + * @Description 创建工作流 | |
| 255 | + * @Date 2025/12/14 10:46 | |
| 256 | + * @Param createReqVO | |
| 257 | + * @param id | |
| 258 | + * @Return void | |
| 259 | + */ | |
| 260 | + private void processInstance(AssignTasksSaveReqVO createReqVO, Long id){ | |
| 261 | + //流程处理人 | |
| 262 | +// List<Long> userIds = roleApi.getUserIdsByRoleCode(AssignTasksConstants.ASSIGN_ROLE_KEY); | |
| 263 | +// if (userIds == null) { | |
| 264 | +// throw exception0(BAD_REQUEST.getCode(),"上报人未配置"); | |
| 265 | +// } | |
| 266 | +// List<String> companyIdStrs = createReqVO.getCompanyIds(); | |
| 267 | +// | |
| 268 | +// List<AdminUserRespDTO> users = userApi.getUserList(userIds); | |
| 269 | +// Map<Long, List<AdminUserRespDTO>> deptUserMap = users.stream() | |
| 270 | +// .filter(user -> user.getDeptId() != null) | |
| 271 | +// .collect(Collectors.groupingBy(AdminUserRespDTO::getDeptId)); | |
| 272 | +// //转换公司ID为Long并校验存在性 | |
| 273 | +// Set<Long> companyIdSet = new HashSet<>(); | |
| 274 | +// for (String companyIdStr : companyIdStrs) { | |
| 275 | +// Long companyId = Long.parseLong(companyIdStr); | |
| 276 | +// companyIdSet.add(companyId); | |
| 277 | +// if (!deptUserMap.containsKey(companyId)) { | |
| 278 | +// throw exception0(BAD_REQUEST.getCode(), "上报人未配置"); | |
| 279 | +// } | |
| 280 | +// } | |
| 281 | +// //提取每个部门的第一个用户 | |
| 282 | +// List<AdminUserRespDTO> distinctUsers = deptUserMap.entrySet().stream() | |
| 283 | +// .filter(entry -> companyIdSet.contains(entry.getKey())) // 仅保留目标公司的用户 | |
| 284 | +// .map(entry -> entry.getValue().get(0)) | |
| 285 | +// .collect(Collectors.toList()); | |
| 286 | +// | |
| 287 | +// // 5. 提取用户ID列表 | |
| 288 | +// List<Long> userIds = distinctUsers.stream().map(AdminUserRespDTO::getId).collect(Collectors.toList()); | |
| 289 | + | |
| 290 | + List<Long> userIds = new ArrayList<>(); | |
| 291 | + userIds.add(148L); | |
| 292 | + userIds.add(151L); | |
| 293 | + //发起工作流 | |
| 294 | + Map<String, List<Long>> startUserSelectAssignees = new HashMap<>(); | |
| 295 | + startUserSelectAssignees.put("Activity_1r880r6",userIds); | |
| 296 | + | |
| 297 | + // 发起 BPM 流程 | |
| 298 | + Map<String, Object> processInstanceVariables = new HashMap<>(); | |
| 299 | + processInstanceVariables.put("taskName", createReqVO.getTaskName()); | |
| 300 | + processInstanceVariables.put("taskType", createReqVO.getTaskType()); | |
| 301 | + processInstanceVariables.put("deadline", createReqVO.getDeadline()); | |
| 302 | + String processInstanceId = processInstanceApi.createProcessInstance(SecurityFrameworkUtils.getLoginUserId(), | |
| 303 | + new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(AssignTasksConstants.ASSIGN_TASK_PROCESS) | |
| 304 | + .setVariables(processInstanceVariables) | |
| 305 | + .setBusinessKey(String.valueOf(id)) | |
| 306 | + .setStartUserSelectAssignees(startUserSelectAssignees)); | |
| 307 | + | |
| 308 | + // 将工作流的编号,更新到 工单中 | |
| 309 | + assignTasksMapper.updateById(new AssignTasksDO().setId(id).setProcessInstanceId(processInstanceId)); | |
| 310 | + | |
| 311 | + } | |
| 312 | + | |
| 245 | 313 | } | ... | ... |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java
| ... | ... | @@ -3,6 +3,7 @@ package com.zteits.urbanops.module.garden.service.assigntasksinfo; |
| 3 | 3 | import com.zteits.urbanops.framework.common.pojo.PageResult; |
| 4 | 4 | import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoPageReqVO; |
| 5 | 5 | import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoSaveReqVO; |
| 6 | +import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoUpdReqVO; | |
| 6 | 7 | import com.zteits.urbanops.module.garden.dal.dataobject.assigntasks.AssignTasksDO; |
| 7 | 8 | import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; |
| 8 | 9 | import jakarta.validation.Valid; |
| ... | ... | @@ -86,19 +87,19 @@ public interface AssignTasksInfoService { |
| 86 | 87 | * @Date 2025/8/22 19:53 |
| 87 | 88 | * @Return int |
| 88 | 89 | */ |
| 89 | - public int rejectAssignTaskCompany(@Valid AssignTasksInfoSaveReqVO tdAssignTaskCompany); | |
| 90 | + public int rejectAssignTaskCompany(@Valid AssignTasksInfoUpdReqVO tdAssignTaskCompany); | |
| 90 | 91 | /** |
| 91 | 92 | * @Author wangqian |
| 92 | 93 | * @Description 派单提醒 |
| 93 | 94 | * @Date 2025/8/22 19:53 |
| 94 | 95 | * @Return int |
| 95 | 96 | */ |
| 96 | - public int submissionAssignTaskCompany(@Valid AssignTasksInfoSaveReqVO tdAssignTaskCompany); | |
| 97 | + public int submissionAssignTaskCompany(@Valid AssignTasksInfoUpdReqVO tdAssignTaskCompany); | |
| 97 | 98 | /** |
| 98 | 99 | * @Author wangqian |
| 99 | 100 | * @Description 派单反馈 |
| 100 | 101 | * @Date 2025/8/22 19:53 |
| 101 | 102 | * @Return int |
| 102 | 103 | */ |
| 103 | - public int feedbackAssignTaskCompany(@Valid AssignTasksInfoSaveReqVO tdAssignTaskCompany); | |
| 104 | + public int feedbackAssignTaskCompany(@Valid AssignTasksInfoUpdReqVO tdAssignTaskCompany); | |
| 104 | 105 | } | ... | ... |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java
| 1 | 1 | package com.zteits.urbanops.module.garden.service.assigntasksinfo; |
| 2 | 2 | |
| 3 | 3 | import com.alibaba.fastjson.JSONObject; |
| 4 | +import com.baomidou.mybatisplus.core.toolkit.StringUtils; | |
| 4 | 5 | import com.zteits.urbanops.framework.common.pojo.PageResult; |
| 5 | 6 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; |
| 6 | 7 | import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoPageReqVO; |
| 7 | 8 | import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoSaveReqVO; |
| 9 | +import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoUpdReqVO; | |
| 8 | 10 | import com.zteits.urbanops.module.garden.dal.dataobject.assigntasks.AssignTasksDO; |
| 9 | 11 | import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; |
| 10 | 12 | import com.zteits.urbanops.module.garden.dal.mysql.assigntasks.AssignTasksMapper; |
| 11 | 13 | import com.zteits.urbanops.module.garden.dal.mysql.assigntasksinfo.AssignTasksInfoMapper; |
| 12 | 14 | import com.zteits.urbanops.module.garden.enums.AssignTasksConstants; |
| 13 | -import com.zteits.urbanops.module.garden.util.http.OkHttpClientUtil; | |
| 14 | 15 | import com.zteits.urbanops.module.system.api.dept.DeptApi; |
| 15 | 16 | import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; |
| 17 | +import com.zteits.urbanops.module.system.api.permission.RoleApi; | |
| 18 | +import com.zteits.urbanops.module.system.api.sms.SmsCodeApi; | |
| 19 | +import com.zteits.urbanops.module.system.api.sms.dto.code.SmsCodeSendReqDTO; | |
| 16 | 20 | import com.zteits.urbanops.module.system.api.user.AdminUserApi; |
| 17 | 21 | import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; |
| 22 | +import com.zteits.urbanops.module.system.dal.dataobject.permission.RoleDO; | |
| 18 | 23 | import jakarta.annotation.Resource; |
| 19 | 24 | import lombok.extern.slf4j.Slf4j; |
| 20 | 25 | import org.apache.commons.collections4.CollectionUtils; |
| ... | ... | @@ -30,7 +35,10 @@ import java.util.Map; |
| 30 | 35 | import java.util.Objects; |
| 31 | 36 | import java.util.stream.Collectors; |
| 32 | 37 | |
| 38 | +import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; | |
| 33 | 39 | import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 40 | +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception0; | |
| 41 | +import static com.zteits.urbanops.framework.common.util.servlet.ServletUtils.getClientIP; | |
| 34 | 42 | import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| 35 | 43 | import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getLoginUserNickname; |
| 36 | 44 | import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; |
| ... | ... | @@ -52,10 +60,14 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { |
| 52 | 60 | |
| 53 | 61 | @Resource |
| 54 | 62 | private DeptApi deptApi; |
| 63 | + | |
| 64 | + @Resource | |
| 65 | + private RoleApi roleApi; | |
| 55 | 66 | @Resource |
| 56 | 67 | private AdminUserApi adminUserApi; |
| 57 | 68 | |
| 58 | - private String SEND_SMS_CODE_URL = ""; | |
| 69 | + @Resource | |
| 70 | + private SmsCodeApi smsCodeApi; | |
| 59 | 71 | |
| 60 | 72 | // 时间格式常量(与之前保持一致) |
| 61 | 73 | public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss"; |
| ... | ... | @@ -148,7 +160,7 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { |
| 148 | 160 | |
| 149 | 161 | //派单驳回 |
| 150 | 162 | @Override |
| 151 | - public int rejectAssignTaskCompany(AssignTasksInfoSaveReqVO tdAssignTaskCompany) { | |
| 163 | + public int rejectAssignTaskCompany(AssignTasksInfoUpdReqVO tdAssignTaskCompany) { | |
| 152 | 164 | AssignTasksInfoDO assignTaskInfo = assignTasksInfoMapper.selectById(tdAssignTaskCompany.getId()); |
| 153 | 165 | //单位任务完成状态(0:未完成,1:已完成) |
| 154 | 166 | if (assignTaskInfo != null && 1 == assignTaskInfo.getFinish()) { |
| ... | ... | @@ -166,7 +178,7 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { |
| 166 | 178 | } |
| 167 | 179 | |
| 168 | 180 | @Override |
| 169 | - public int submissionAssignTaskCompany(AssignTasksInfoSaveReqVO taskInfo) { | |
| 181 | + public int submissionAssignTaskCompany(AssignTasksInfoUpdReqVO taskInfo) { | |
| 170 | 182 | // 2. 查询任务详情(判断任务是否存在) |
| 171 | 183 | AssignTasksInfoDO existingTask = assignTasksInfoMapper.selectById(taskInfo.getId()); |
| 172 | 184 | if (existingTask == null) { |
| ... | ... | @@ -180,51 +192,53 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { |
| 180 | 192 | : ""; // 或 null |
| 181 | 193 | //填报人信息 |
| 182 | 194 | AdminUserRespDTO user = adminUserApi.getUser(getLoginUserId()); |
| 195 | + //用户角色 | |
| 196 | + List<Long> roles = roleApi.getRoleIdsByUserId(user.getId()); | |
| 197 | + RoleDO roleDO = roleApi.getRoleIdByRoleCode(AssignTasksConstants.ASSIGN_ROLE_KEY); | |
| 198 | + if (roleDO == null) { | |
| 199 | + //未配置 | |
| 200 | + throw exception0(BAD_REQUEST.getCode(),"系统未配置填报人角色"); | |
| 201 | + } | |
| 202 | + if(!roles.contains(roleDO.getId())) { | |
| 203 | + //没有权限 | |
| 204 | + throw exception0(BAD_REQUEST.getCode(),"该用户未授权"); | |
| 205 | + } | |
| 183 | 206 | String phonenumber = user.getMobile(); |
| 184 | - Map<String, Object> resultMap = new HashMap<String, Object>(); | |
| 185 | - Map<String, String> templateParams = new HashMap<String, String>(); | |
| 207 | + if (StringUtils.isEmpty(phonenumber)) { | |
| 208 | + throw exception0(BAD_REQUEST.getCode(),"该用户未配置手机号码"); | |
| 209 | + } | |
| 210 | + Map<String, Object> templateParams = new HashMap<String, Object>(); | |
| 186 | 211 | templateParams.put("companyName", existingTask.getCompanyName()); |
| 187 | 212 | templateParams.put("taskName", assignTasksDO.getTaskName()); |
| 188 | 213 | templateParams.put("deadline", formattedDeadline); |
| 189 | - resultMap.put("mobile", phonenumber);//手机号 | |
| 190 | - resultMap.put("scene", AssignTasksConstants.ASSIGN_TASK_SCENE);//短信场景 | |
| 191 | - resultMap.put("templateParams", templateParams);//短信参数 | |
| 192 | 214 | |
| 193 | 215 | // 5. 发送短信通知 |
| 194 | - log.info("派单发送短信 signMap: {}", JSONObject.toJSONString(resultMap)); | |
| 195 | - Map<String, String> headers = new HashMap<>(4); | |
| 196 | - headers.put("Content-Type","application/json"); | |
| 197 | - headers.put("Connection","keep-alive"); | |
| 198 | - headers.put("Accept","*/*"); | |
| 199 | - headers.put("Accept-Encoding","gzip, deflate, br"); | |
| 200 | - try { | |
| 201 | - String response = OkHttpClientUtil.doPostJson(SEND_SMS_CODE_URL, resultMap, headers); | |
| 202 | - log.info("派单发送短信 response: {}", JSONObject.toJSONString(response)); | |
| 203 | - | |
| 204 | - JSONObject jsonObject = JSONObject.parseObject(response); | |
| 205 | - | |
| 206 | - if (jsonObject.getString("code").equals("0")) { | |
| 207 | - log.info("提交单位任务成功,已通知填报人:手机号={},任务ID={}", phonenumber, existingTask.getId()); | |
| 208 | - | |
| 209 | - int newRushNum = (existingTask.getRushNum() == null) ? 1: existingTask.getRushNum() + 1; | |
| 210 | - //催办次数+1 | |
| 211 | - AssignTasksInfoDO assignTaskInfo = new AssignTasksInfoDO(); | |
| 212 | - assignTaskInfo.setId(existingTask.getId()); | |
| 213 | - assignTaskInfo.setRushNum(newRushNum); | |
| 214 | - assignTasksInfoMapper.updateById(assignTaskInfo); | |
| 215 | - } else { | |
| 216 | - throw exception(ASSIGN_TASKS_INFO_004); | |
| 217 | - } | |
| 218 | - } catch (Exception e) { | |
| 219 | - log.error("提交单位任务成功,但短信通知失败:手机号={},任务ID={}", | |
| 220 | - phonenumber, existingTask.getId(), e); | |
| 221 | - throw exception(ASSIGN_TASKS_INFO_005); | |
| 216 | + log.info("派单发送短信 signMap: {}", JSONObject.toJSONString(templateParams)); | |
| 217 | + SmsCodeSendReqDTO reqDTO = new SmsCodeSendReqDTO(); | |
| 218 | + reqDTO.setScene(AssignTasksConstants.ASSIGN_TASK_SCENE); | |
| 219 | + reqDTO.setMobile(phonenumber);//手机号 | |
| 220 | + reqDTO.setTemplateParams(templateParams);//短信参数 | |
| 221 | + reqDTO.setCreateIp(getClientIP()); | |
| 222 | + Long sendLogId = smsCodeApi.openSendSmsCode(reqDTO); | |
| 223 | + log.info("派单发送短信 sendLogId: {}", sendLogId); | |
| 224 | + | |
| 225 | + if (sendLogId != null) { | |
| 226 | + log.info("提交单位任务成功,已通知填报人:手机号={},任务ID={}", phonenumber, existingTask.getId()); | |
| 227 | + | |
| 228 | + int newRushNum = (existingTask.getRushNum() == null) ? 1: existingTask.getRushNum() + 1; | |
| 229 | + //催办次数+1 | |
| 230 | + AssignTasksInfoDO assignTaskInfo = new AssignTasksInfoDO(); | |
| 231 | + assignTaskInfo.setId(existingTask.getId()); | |
| 232 | + assignTaskInfo.setRushNum(newRushNum); | |
| 233 | + assignTasksInfoMapper.updateById(assignTaskInfo); | |
| 234 | + } else { | |
| 235 | + throw exception(ASSIGN_TASKS_INFO_004); | |
| 222 | 236 | } |
| 223 | 237 | return 1; |
| 224 | 238 | } |
| 225 | 239 | |
| 226 | 240 | @Override |
| 227 | - public int feedbackAssignTaskCompany(AssignTasksInfoSaveReqVO tdAssignTaskCompany) { | |
| 241 | + public int feedbackAssignTaskCompany(AssignTasksInfoUpdReqVO tdAssignTaskCompany) { | |
| 228 | 242 | AssignTasksInfoDO assignTaskInfo = assignTasksInfoMapper.selectById(tdAssignTaskCompany.getId()); |
| 229 | 243 | if (assignTaskInfo != null) { |
| 230 | 244 | AdminUserRespDTO user = adminUserApi.getUser(getLoginUserId()); | ... | ... |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/api/permission/RoleApi.java
| ... | ... | @@ -44,4 +44,21 @@ public interface RoleApi { |
| 44 | 44 | * @return 角色ID列表 |
| 45 | 45 | */ |
| 46 | 46 | List<Long> getRoleIdsByUserId(Long userId); |
| 47 | + | |
| 48 | + | |
| 49 | + /** | |
| 50 | + * 通过角色类型,获得用户编号列表 | |
| 51 | + * | |
| 52 | + * @param roleCode 角色编码 | |
| 53 | + * @return 用户ID列表 | |
| 54 | + */ | |
| 55 | + List<Long> getUserIdsByRoleCode(String roleCode); | |
| 56 | + | |
| 57 | + /** | |
| 58 | + * 通过角色类型,获得角色 | |
| 59 | + * | |
| 60 | + * @param roleCode 角色编码 | |
| 61 | + * @return 角色 | |
| 62 | + */ | |
| 63 | + RoleDO getRoleIdByRoleCode(String roleCode); | |
| 47 | 64 | } | ... | ... |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/api/permission/RoleApiImpl.java
| ... | ... | @@ -39,4 +39,14 @@ public class RoleApiImpl implements RoleApi { |
| 39 | 39 | public List<Long> getRoleIdsByUserId(Long userId) { |
| 40 | 40 | return roleService.getRoleIdsByUserId(userId); |
| 41 | 41 | } |
| 42 | + | |
| 43 | + @Override | |
| 44 | + public List<Long> getUserIdsByRoleCode(String roleCode) { | |
| 45 | + return roleService.getUserIdsByRoleCode(roleCode); | |
| 46 | + } | |
| 47 | + | |
| 48 | + @Override | |
| 49 | + public RoleDO getRoleIdByRoleCode(String roleCode) { | |
| 50 | + return roleService.getRoleIdByRoleCode(roleCode); | |
| 51 | + } | |
| 42 | 52 | } | ... | ... |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/api/sms/SmsCodeApi.java
| ... | ... | @@ -36,5 +36,10 @@ public interface SmsCodeApi { |
| 36 | 36 | * @param reqDTO 校验请求 |
| 37 | 37 | */ |
| 38 | 38 | void validateSmsCode(@Valid SmsCodeValidateReqDTO reqDTO); |
| 39 | - | |
| 39 | + /** | |
| 40 | + * 根据模板发送短信 | |
| 41 | + * | |
| 42 | + * @param reqDTO 发送请求 | |
| 43 | + */ | |
| 44 | + Long openSendSmsCode(@Valid SmsCodeSendReqDTO reqDTO); | |
| 40 | 45 | } | ... | ... |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/api/sms/SmsCodeApiImpl.java
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java
| ... | ... | @@ -8,6 +8,8 @@ import lombok.Data; |
| 8 | 8 | import jakarta.validation.constraints.NotEmpty; |
| 9 | 9 | import jakarta.validation.constraints.NotNull; |
| 10 | 10 | |
| 11 | +import java.util.Map; | |
| 12 | + | |
| 11 | 13 | /** |
| 12 | 14 | * 短信验证码的发送 Request DTO |
| 13 | 15 | * |
| ... | ... | @@ -34,4 +36,5 @@ public class SmsCodeSendReqDTO { |
| 34 | 36 | @NotEmpty(message = "发送 IP 不能为空") |
| 35 | 37 | private String createIp; |
| 36 | 38 | |
| 39 | + private Map<String, Object> templateParams; | |
| 37 | 40 | } | ... | ... |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/sms/SmsSceneEnum.java
| ... | ... | @@ -20,6 +20,8 @@ public enum SmsSceneEnum implements ArrayValuable<Integer> { |
| 20 | 20 | MEMBER_UPDATE_MOBILE(2, "user-update-mobile", "会员用户 - 修改手机"), |
| 21 | 21 | MEMBER_UPDATE_PASSWORD(3, "user-update-password", "会员用户 - 修改密码"), |
| 22 | 22 | MEMBER_RESET_PASSWORD(4, "user-reset-password", "会员用户 - 忘记密码"), |
| 23 | + USER_SMS_LOGIN(5, "SMS_319860269", "用户 - 手机号登陆"), | |
| 24 | + YL_USER_SMS_SUBMISSION(6, "SMS_493695107", "园林派单业务催交发送短信"), | |
| 23 | 25 | |
| 24 | 26 | ADMIN_MEMBER_LOGIN(21, "admin-sms-login", "后台用户 - 手机号登录"), |
| 25 | 27 | ADMIN_MEMBER_REGISTER(22, "admin-sms-register", "后台用户 - 手机号注册"), | ... | ... |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/RoleService.java
| ... | ... | @@ -140,4 +140,13 @@ public interface RoleService { |
| 140 | 140 | * 通过用户编号,获得角色列表 |
| 141 | 141 | */ |
| 142 | 142 | List<Long> getRoleIdsByUserId(Long userId); |
| 143 | + | |
| 144 | + /** | |
| 145 | + * 通过角色类型,获得用户列表 | |
| 146 | + */ | |
| 147 | + List<Long> getUserIdsByRoleCode(String roleCode); | |
| 148 | + /** | |
| 149 | + * 通过角色类型,获得角色 | |
| 150 | + */ | |
| 151 | + RoleDO getRoleIdByRoleCode(String roleCode); | |
| 143 | 152 | } | ... | ... |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/permission/RoleServiceImpl.java
| ... | ... | @@ -288,6 +288,26 @@ public class RoleServiceImpl implements RoleService { |
| 288 | 288 | return list.stream().map(UserRoleDO::getRoleId).toList(); |
| 289 | 289 | } |
| 290 | 290 | |
| 291 | + @Override | |
| 292 | + public List<Long> getUserIdsByRoleCode(String roleCode) { | |
| 293 | + RoleDO roleDO = roleMapper.selectOne(RoleDO::getCode, roleCode); | |
| 294 | + if (roleDO == null) { | |
| 295 | + return null; | |
| 296 | + } | |
| 297 | + QueryWrapper<UserRoleDO> sql = new QueryWrapper<>(); | |
| 298 | + sql.select("user_id"); | |
| 299 | + List<UserRoleDO> list = userRoleMapper.selectList(sql.lambda().eq(UserRoleDO::getRoleId, roleDO.getId())); | |
| 300 | + if (CollectionUtil.isEmpty(list)) { | |
| 301 | + return Collections.emptyList(); | |
| 302 | + } | |
| 303 | + return list.stream().map(UserRoleDO::getUserId).toList(); | |
| 304 | + } | |
| 305 | + | |
| 306 | + @Override | |
| 307 | + public RoleDO getRoleIdByRoleCode(String roleCode) { | |
| 308 | + return roleMapper.selectOne(RoleDO::getCode, roleCode); | |
| 309 | + } | |
| 310 | + | |
| 291 | 311 | /** |
| 292 | 312 | * 获得自身的代理对象,解决 AOP 生效问题 |
| 293 | 313 | * | ... | ... |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/sms/SmsCodeService.java
| ... | ... | @@ -36,5 +36,10 @@ public interface SmsCodeService { |
| 36 | 36 | * @param reqDTO 校验请求 |
| 37 | 37 | */ |
| 38 | 38 | void validateSmsCode(@Valid SmsCodeValidateReqDTO reqDTO); |
| 39 | - | |
| 39 | + /** | |
| 40 | + * 发送短信 | |
| 41 | + * | |
| 42 | + * @param reqDTO 校验请求 | |
| 43 | + */ | |
| 44 | + Long openSendSmsCode(@Valid SmsCodeSendReqDTO reqDTO); | |
| 40 | 45 | } | ... | ... |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/sms/SmsCodeServiceImpl.java
| ... | ... | @@ -109,4 +109,13 @@ public class SmsCodeServiceImpl implements SmsCodeService { |
| 109 | 109 | return lastSmsCode; |
| 110 | 110 | } |
| 111 | 111 | |
| 112 | + @Override | |
| 113 | + public Long openSendSmsCode(SmsCodeSendReqDTO reqDTO) { | |
| 114 | + SmsSceneEnum sceneEnum = SmsSceneEnum.getCodeByScene(reqDTO.getScene()); | |
| 115 | + Assert.notNull(sceneEnum, "验证码场景({}) 查找不到配置", reqDTO.getScene()); | |
| 116 | + | |
| 117 | + // 发送验证码 | |
| 118 | + return smsSendService.sendSingleSms(reqDTO.getMobile(), null, null, | |
| 119 | + sceneEnum.getTemplateCode(), reqDTO.getTemplateParams()); | |
| 120 | + } | |
| 112 | 121 | } | ... | ... |