diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderAIController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderAIController.java new file mode 100644 index 0000000..3d41961 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderAIController.java @@ -0,0 +1,250 @@ +package com.zteits.urbanops.module.workorder.controller.app.garden; + +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.common.util.object.ObjectUtils; +import com.zteits.urbanops.module.garden.api.road.RoadApi; +import com.zteits.urbanops.module.workorder.annotation.AutoUpdateWorkerOrderInspectorBuzStatus; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.common.AppUniversalApprovalReqVO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.operator.AppGardenTaskReturnExtReqVO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.operator.AppGardenTaskTeamLeaderAssignReqVO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.operator.AppGardenTaskWorkerExcuteReqVO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.task.AppGardenTaskApproveReqVO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.task.AppGardenTaskInspectorApproveReqVO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.task.AppGardenTaskRegionMgrApproveReqVO; +import com.zteits.urbanops.module.workorder.dto.AppGardenWorkOrderInspectorReqVO; +import com.zteits.urbanops.module.workorder.dto.AppGardenWorkOrderReqVO; +import com.zteits.urbanops.module.workorder.enums.AIOperateTypeEnum; +import com.zteits.urbanops.module.workorder.service.garden.BpmAIService; +import com.zteits.urbanops.module.workorder.service.garden.BpmGardenService; +import com.zteits.urbanops.module.workorder.service.garden.BpmInspectorService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; +import static com.zteits.urbanops.module.workorder.enums.ErrorCodeConstants.*; + +/** + * 类描述:园林 AI工单管理督察员入口 + * 创建人:yanhuiqing + * 创建时间:2025/12/25 15:30 + * 修改人:yanhuiqing + * 修改时间:2025/12/25 15:30 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Tag(name = "APP - 全域工单bpm") +@RestController +@Slf4j +@RequestMapping("/bpm/ai/workorder") +public class AppGardenWorkOrderAIController { + @Resource + private BpmGardenService gardenService; + + @Resource + private BpmAIService aiService; + @Resource + private RoadApi roadApi; + @PostMapping("/createQuick") + //@PreAuthorize("@ss.hasPermission('bpm:garden-workorder:create')") + @Operation(summary = "app-创建快速工单信息") + public CommonResult createMainInfoQuick(@Valid @RequestBody AppGardenWorkOrderReqVO createReqVO) { + return success(gardenService.createWorkOrderQuick(createReqVO)); + } + + @PostMapping("/create") + //@PreAuthorize("@ss.hasPermission('bpm:garden-workorder:create')") + @Operation(summary = "app-AI工单派发人员创建工单信息") + public CommonResult createMainInfo(@Valid @RequestBody AppGardenWorkOrderInspectorReqVO createReqVO) { + return success(aiService.createWorkOrder(createReqVO)); + } + + @Operation(summary = "app-统一审批入口") + @PostMapping("/universalApproval") + @AutoUpdateWorkerOrderInspectorBuzStatus + @Transactional(rollbackFor = Exception.class) + //@PreAuthorize("@ss.hasPermission('bpm:garden-workorder:update')") + public CommonResult universalApproval(@Valid @RequestBody AppUniversalApprovalReqVO reqVO) { + + log.info("【全域督察员审批】接收前端请求,入参:curTaskKey={}, taskId={}, operateType={}, agree={}, reason={}", + reqVO.getTaskKey(), reqVO.getTaskId(), reqVO.getOperateType(), reqVO.getAgree(), reqVO.getReason()); + + AIOperateTypeEnum operateType = AIOperateTypeEnum.getByCode(reqVO.getOperateType()); + + switch (operateType) { + case AI_REGION_MANAGER_ASSIGN://大区经理分配 + log.info("当前操作:"+AIOperateTypeEnum.AI_REGION_MANAGER_ASSIGN.getDesc()+"开始,操作类型:"+AIOperateTypeEnum.AI_REGION_MANAGER_ASSIGN.getCode()+"-->"); + AppGardenTaskRegionMgrApproveReqVO regionPassReqVO = new AppGardenTaskRegionMgrApproveReqVO(); + Integer passStatus = reqVO.getAgree(); + if (passStatus == null || (passStatus != 0 && passStatus != 1)) { + throw exception(APP_AGREE_CHOOSE); + } + regionPassReqVO.setBusiLine(reqVO.getBusiLine()); + regionPassReqVO.setRoadId(reqVO.getRoadId()); + regionPassReqVO.setAgree(passStatus); + regionPassReqVO.setReason(reqVO.getReason()); + regionPassReqVO.setId(reqVO.getTaskId()); + regionPassReqVO.setReturnImgs(reqVO.getReturnImgs()); + aiService.approveTask2TeamLeader(regionPassReqVO); + log.info("当前操作:"+AIOperateTypeEnum.AI_REGION_MANAGER_ASSIGN.getDesc()+"<--结束"); + return success(true); + case AI_REGION_MANAGER_RETURN://大区经理退回 + log.info("当前操作:"+AIOperateTypeEnum.AI_REGION_MANAGER_RETURN.getDesc()+"开始,操作类型:"+AIOperateTypeEnum.AI_REGION_MANAGER_RETURN.getCode()+"-->"); + AppGardenTaskRegionMgrApproveReqVO regionArroveReqVO = new AppGardenTaskRegionMgrApproveReqVO(); + Integer regionStatus = reqVO.getAgree(); + if (regionStatus == null || (regionStatus != 0 && regionStatus != 1)) { + throw exception(APP_AGREE_CHOOSE); + } + regionArroveReqVO.setAgree(regionStatus); + regionArroveReqVO.setReason(reqVO.getReason()); + regionArroveReqVO.setId(reqVO.getTaskId()); + regionArroveReqVO.setReturnImgs(reqVO.getReturnImgs()); + aiService.approveTask2TeamLeader(regionArroveReqVO); + log.info("当前操作:"+AIOperateTypeEnum.AI_REGION_MANAGER_RETURN.getDesc()+"<--结束"); + return success(true); + case YL_WORKER_RETURN:// 养护员退回 + log.info("当前操作:"+AIOperateTypeEnum.YL_WORKER_RETURN.getDesc()+"开始,操作类型:"+AIOperateTypeEnum.YL_WORKER_RETURN.getCode()+"-->"); + AppGardenTaskReturnExtReqVO retReqVO = new AppGardenTaskReturnExtReqVO(); + retReqVO.setId(reqVO.getTaskId()); + retReqVO.setCurTaskKey(reqVO.getTaskKey()); + retReqVO.setReason(reqVO.getReason()); + retReqVO.setWorkerDataId(reqVO.getWorkerDataId()); + retReqVO.setReturnImgs(reqVO.getReturnImgs()); + gardenService.returnPreviousNode(retReqVO); + log.info("当前操作:"+AIOperateTypeEnum.YL_WORKER_RETURN.getDesc()+"<--结束"); + return success(true); + case YL_WORKER_IMPLEMENT://养护员实施 需修改更新工单数据 见切面 + log.info("当前操作:"+AIOperateTypeEnum.YL_WORKER_IMPLEMENT.getDesc()+"开始,操作类型:"+AIOperateTypeEnum.YL_WORKER_IMPLEMENT.getCode()+"-->"); + AppGardenTaskWorkerExcuteReqVO workerExcuteReqVO = new AppGardenTaskWorkerExcuteReqVO(); + workerExcuteReqVO.setWorkerDataId(reqVO.getWorkerDataId()); + workerExcuteReqVO.setId(reqVO.getTaskId()); + workerExcuteReqVO.setCoHandlers(reqVO.getCoHandlers()); + workerExcuteReqVO.setHandleResult(reqVO.getHandleResult()); + workerExcuteReqVO.setProblemsImgs(reqVO.getProblemsImgs()); + workerExcuteReqVO.setStartImgs(reqVO.getStartImgs()); + workerExcuteReqVO.setProcessingImgs(reqVO.getProcessingImgs()); + workerExcuteReqVO.setEndImgs(reqVO.getEndImgs()); + workerExcuteReqVO.setPersonImgs(reqVO.getPersonImgs()); + workerExcuteReqVO.setMaterialImgs(reqVO.getMaterialImgs()); + gardenService.ylWorkerExcuteWOrder(workerExcuteReqVO); + log.info("当前操作:"+AIOperateTypeEnum.YL_WORKER_IMPLEMENT.getDesc()+"<--结束"); + return success(true); + case YL_TEAM_LEADER_CONFIRM_PASS://养护组长验收通过 + log.info("当前操作:"+AIOperateTypeEnum.YL_TEAM_LEADER_CONFIRM_PASS.getDesc()+"开始,操作类型:"+AIOperateTypeEnum.YL_TEAM_LEADER_CONFIRM_PASS.getCode()+"-->"); + AppGardenTaskApproveReqVO approveReqVO = new AppGardenTaskApproveReqVO(); + approveReqVO.setReason(reqVO.getReason()); + approveReqVO.setId(reqVO.getTaskId()); + gardenService.approveTask(approveReqVO); + log.info("当前操作:"+AIOperateTypeEnum.YL_TEAM_LEADER_CONFIRM_PASS.getDesc()+"<--结束"); + return success(true); + case YL_TEAM_LEADER_CONFIRM_REJECT://养护组长验收不通过 需修改更新工单数据 见切面 + log.info("当前操作:"+AIOperateTypeEnum.YL_TEAM_LEADER_CONFIRM_REJECT.getDesc()+"开始,操作类型:"+AIOperateTypeEnum.YL_TEAM_LEADER_CONFIRM_REJECT.getCode()+"-->"); + AppGardenTaskReturnExtReqVO rejReqVO = new AppGardenTaskReturnExtReqVO(); + rejReqVO.setId(reqVO.getTaskId()); + rejReqVO.setCurTaskKey(reqVO.getTaskKey()); + rejReqVO.setReason(reqVO.getReason()); + rejReqVO.setWorkerDataId(reqVO.getWorkerDataId()); + List returnImgs = reqVO.getReturnImgs(); + rejReqVO.setReturnImgs(returnImgs); + gardenService.returnPreviousNode(rejReqVO); + log.info("当前操作:"+AIOperateTypeEnum.YL_TEAM_LEADER_CONFIRM_REJECT.getDesc()+"<--结束"); + return success(true); + case YL_TEAM_LEADER_ASSIGN: //养护组长分配 需修改更新工单数据 见切面 + log.info("当前操作:"+AIOperateTypeEnum.YL_TEAM_LEADER_ASSIGN.getDesc()+"开始,操作类型:"+AIOperateTypeEnum.YL_TEAM_LEADER_ASSIGN.getCode()+"-->"); + AppGardenTaskTeamLeaderAssignReqVO assignReqVO = new AppGardenTaskTeamLeaderAssignReqVO(); + assignReqVO.setId(reqVO.getTaskId()); + assignReqVO.setReason(reqVO.getReason()); + Long userId = reqVO.getNextAssignee(); + if(!ObjectUtils.isNotAllEmpty(userId)){ + throw exception(APP_WORKER_NOT_EXISTS); + } + assignReqVO.setNextAssignee(reqVO.getNextAssignee()); + Integer status = reqVO.getAgree(); + if (status == null || (status != 0 && status != 1)) { + throw exception(APP_AGREE_CHOOSE); + } + assignReqVO.setAgree(status); + gardenService.ylTeamLeaderAssignWOrder(assignReqVO); + log.info("当前操作:"+AIOperateTypeEnum.YL_TEAM_LEADER_ASSIGN.getDesc()+"<--结束"); + return success(true); + + case YL_TEAM_LEADER_RETURN://养护组长退回 + log.info("当前操作:"+AIOperateTypeEnum.YL_TEAM_LEADER_RETURN.getDesc()+"开始,操作类型:"+AIOperateTypeEnum.YL_TEAM_LEADER_RETURN.getCode()+"-->"); + AppGardenTaskInspectorApproveReqVO returnApproveReqVO = new AppGardenTaskInspectorApproveReqVO(); + Integer approveStatus = reqVO.getAgree(); + if (approveStatus == null || (approveStatus != 0 && approveStatus != 1)) { + throw exception(APP_AGREE_CHOOSE); + } + returnApproveReqVO.setAgree(approveStatus); + returnApproveReqVO.setReason(reqVO.getReason()); + returnApproveReqVO.setId(reqVO.getTaskId()); + returnApproveReqVO.setReturnImgs(reqVO.getReturnImgs()); + returnApproveReqVO.setRoadId(reqVO.getRoadId()); + aiService.approveTask(returnApproveReqVO); + log.info("当前操作:"+AIOperateTypeEnum.YL_TEAM_LEADER_RETURN.getDesc()+"<--结束"); + return success(true); + case YL_INSPECTOR_START_FINISH : //督察员结束工单 + log.info("当前操作:督察员结束工单(不同意)开始,是否同意:"+reqVO.getAgree()+"-->"); + AppGardenTaskApproveReqVO inspectStartReqVO = new AppGardenTaskApproveReqVO(); + Integer revokeStatus = reqVO.getAgree(); + if (revokeStatus == null || (revokeStatus != 0 && revokeStatus != 1)) { + throw exception(APP_AGREE_CHOOSE); + } + inspectStartReqVO.setAgree(revokeStatus); + inspectStartReqVO.setReason(reqVO.getReason()); + inspectStartReqVO.setId(reqVO.getTaskId()); + inspectStartReqVO.setReturnImgs(reqVO.getReturnImgs()); + gardenService.approveTask(inspectStartReqVO); + log.info("当前操作:"+AIOperateTypeEnum.YL_INSPECTOR_START_FINISH.getDesc()+"<--结束"); + return success(true); + case YL_INSPECTOR_START_RELAUNCH : //全域督察员重新发起 需修改更新工单数据 见切面 + log.info("当前操作:"+AIOperateTypeEnum.YL_INSPECTOR_START_RELAUNCH.getDesc()+"开始,操作类型:"+AIOperateTypeEnum.YL_INSPECTOR_START_RELAUNCH.getCode()+"-->"); + AppGardenTaskInspectorApproveReqVO reStartReqVO = new AppGardenTaskInspectorApproveReqVO(); + Integer reStatus = reqVO.getAgree(); + if (reStatus == null || (reStatus != 0 && reStatus != 1)) { + throw exception(APP_AGREE_CHOOSE); + } + Long id = reqVO.getWorkerDataId(); + if (id == null) { + throw exception(APP_WORKER_ID_NOT_EMPTY); + } + reStartReqVO.setWorkerDataId(id); + reStartReqVO.setAgree(reStatus); + reStartReqVO.setReason(reqVO.getReason()); + reStartReqVO.setId(reqVO.getTaskId()); + reStartReqVO.setRoadId(reqVO.getRoadId()); + aiService.approveTask(reStartReqVO); + log.info("当前操作:"+AIOperateTypeEnum.YL_INSPECTOR_START_RELAUNCH.getDesc()+"<--结束"); + return success(true); + case YL_INSPECTOR_CHECK_PASS , YL_INSPECTOR_CHECK_REJECT ://督察员验收通过,督察员验收不通过 + log.info("当前操作:AI工单派发人员验收通过 或AI工单派发人员验收不通过开始,是否同意:"+reqVO.getAgree()+"-->"); + AppGardenTaskApproveReqVO inspectReqVO = new AppGardenTaskApproveReqVO(); + Integer verifyStatus = reqVO.getAgree(); + if (verifyStatus == null || (verifyStatus != 0 && verifyStatus != 1)) { + throw exception(APP_AGREE_CHOOSE); + } + inspectReqVO.setAgree(verifyStatus); + inspectReqVO.setReason(reqVO.getReason()); + inspectReqVO.setId(reqVO.getTaskId()); + inspectReqVO.setReturnImgs(reqVO.getReturnImgs()); + gardenService.approveTask(inspectReqVO); + log.info("当前操作:"+AIOperateTypeEnum.YL_INSPECTOR_START_FINISH.getDesc()+"<--结束"); + return success(true); + default: + throw exception(APP_OPERATOR_NOT_EXISTS); + } + } + +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderInspectorController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderInspectorController.java index 2c924a0..82ee1de 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderInspectorController.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderInspectorController.java @@ -38,7 +38,7 @@ import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; import static com.zteits.urbanops.module.workorder.enums.ErrorCodeConstants.*; /** - * 类描述:园林 全域工单管理督察员入口 + * 类描述:园林 督察员工单管理督察员入口 * 创建人:yanhuiqing * 创建时间:2025/12/25 15:30 * 修改人:yanhuiqing diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/maininfo/MainInfoExtMapper.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/maininfo/MainInfoExtMapper.java index d39fbdd..ccab62a 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/maininfo/MainInfoExtMapper.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/maininfo/MainInfoExtMapper.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zteits.urbanops.framework.common.pojo.PageParam; import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.datapermission.core.annotation.DataPermission; import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; import com.zteits.urbanops.framework.mybatis.core.util.MyBatisUtils; import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; @@ -150,8 +151,9 @@ public interface MainInfoExtMapper extends BaseMapperX { @Result(column = "END_TIME_", property = "endTime"), @Result(column = "KEY_", property = "key_") }) + @DataPermission(enable = false) IPage selectDoneExtUniquePage(IPage page, @Param("query") MainInfoHasTaskPageReqVO reqVO); - + @DataPermission(enable = false) default PageResult selectWorkOrderDoneUniquePage(PageParam pageParam, @Param("query") MainInfoHasTaskPageReqVO reqVO) { IPage mpPage = MyBatisUtils.buildPage(pageParam); mpPage = selectDoneExtUniquePage(mpPage, reqVO); @@ -267,8 +269,9 @@ public interface MainInfoExtMapper extends BaseMapperX { @Result(column = "END_TIME_", property = "endTime"), @Result(column = "KEY_", property = "key_") }) + @DataPermission(enable = false) IPage selectDoneExtPage(IPage page, @Param("query") MainInfoHasTaskPageReqVO reqVO); - + @DataPermission(enable = false) default PageResult selectWorkOrderDonePage(PageParam pageParam, @Param("query") MainInfoHasTaskPageReqVO reqVO) { IPage mpPage = MyBatisUtils.buildPage(pageParam); mpPage = selectDoneExtPage(mpPage, reqVO); @@ -378,8 +381,9 @@ public interface MainInfoExtMapper extends BaseMapperX { @Result(column = "END_TIME_", property = "endTime"), @Result(column = "KEY_", property = "key_") }) + @DataPermission(enable = false) IPage selectTodoExtPage(IPage page, @Param("query") MainInfoHasTaskPageReqVO reqVO); - + @DataPermission(enable = false) default PageResult selectWorkOrderTodoPage(PageParam pageParam, @Param("query") MainInfoHasTaskPageReqVO reqVO) { IPage mpPage = MyBatisUtils.buildPage(pageParam); mpPage = selectTodoExtPage(mpPage, reqVO); @@ -499,8 +503,9 @@ public interface MainInfoExtMapper extends BaseMapperX { @Result(column = "END_TIME_", property = "endTime"), @Result(column = "KEY_", property = "key_") }) + @DataPermission(enable = false) IPage selectMyStartUniquePage(IPage page, @Param("query") MainInfoHasTaskPageReqVO reqVO); - + @DataPermission(enable = false) default PageResult selectWorkOrderUniqueMyPage(PageParam pageParam, @Param("query") MainInfoHasTaskPageReqVO reqVO) { IPage mpPage = MyBatisUtils.buildPage(pageParam); mpPage = selectMyStartUniquePage(mpPage, reqVO); @@ -611,8 +616,9 @@ public interface MainInfoExtMapper extends BaseMapperX { @Result(column = "END_TIME_", property = "endTime"), @Result(column = "KEY_", property = "key_") }) + @DataPermission(enable = false) IPage selectMyStartPage(IPage page, @Param("query") MainInfoHasTaskPageReqVO reqVO); - + @DataPermission(enable = false) default PageResult selectWorkOrderMyPage(PageParam pageParam, @Param("query") MainInfoHasTaskPageReqVO reqVO) { IPage mpPage = MyBatisUtils.buildPage(pageParam); mpPage = selectMyStartPage(mpPage, reqVO); @@ -627,6 +633,7 @@ public interface MainInfoExtMapper extends BaseMapperX { * @param notHas * @return */ + @DataPermission(enable = false) default List getUserByLoginIdAndRoleCode( @NonNull Long loginUserId, @NonNull String roleCode, @@ -670,11 +677,13 @@ public interface MainInfoExtMapper extends BaseMapperX { @Result(column = "mobile", property = "mobile"), @Result(column = "avatar", property = "avatar") }) + @DataPermission(enable = false) IPage getUserByLoginIdAndRoleCodeIPage(IPage page, @NonNull @Param("loginUserId") Long loginUserId, @NonNull @Param("roleCode") String roleCode, @NonNull @Param("busiLine") String busiLines, @NonNull @Param("notHas") boolean notHas); + @DataPermission(enable = false) default PageResult getUserByLoginIdAndRoleCodePage(PageParam pageParam,@NonNull @Param("loginUserId") Long loginUserId, @NonNull @Param("roleCode") String roleCode, @NonNull @Param("busiLine") String busiLines, @@ -715,9 +724,11 @@ public interface MainInfoExtMapper extends BaseMapperX { @Result(column = "mobile", property = "mobile"), @Result(column = "avatar", property = "avatar") }) + @DataPermission(enable = false) IPage getUserByRoadIdAndRoleCodeIPage(IPage page,@NonNull @Param("roadId") Long roadId, @NonNull @Param("roleCode") String roleCode, @NonNull @Param("busiLine") String busiLine); + @DataPermission(enable = false) default PageResult getUserByRoadIdAndRoleCodePage(PageParam pageParam,@NonNull @Param("roadId") Long roadId, @NonNull @Param("roleCode") String roleCode, @NonNull @Param("busiLine") String busiLine){ @@ -727,7 +738,7 @@ public interface MainInfoExtMapper extends BaseMapperX { } - + @DataPermission(enable = false) default List getUserByRoadIdAndRoleCode(@NonNull @Param("roadId") Long roadId, @NonNull @Param("roleCode") String roleCode, @NonNull @Param("busiLine") String busiLine){ diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/AIOperateTypeEnum.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/AIOperateTypeEnum.java new file mode 100644 index 0000000..db0e7e9 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/AIOperateTypeEnum.java @@ -0,0 +1,52 @@ +package com.zteits.urbanops.module.workorder.enums; + +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 类描述:AI工单派发人员审批操作类型枚举 + * 创建人:yanhuiqing + * 创建时间:2025/12/29 9:56 + * 修改人:yanhuiqing + * 修改时间:2025/12/29 9:56 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Schema(description = "AI工单派发人员操作类型枚举") +@Getter +public enum AIOperateTypeEnum { + AI_REGION_MANAGER_ASSIGN(40,"大区经理分配"), + AI_REGION_MANAGER_RETURN(50,"大区经理退回"), + YL_TEAM_LEADER_ASSIGN(110, "养护组长分配"), + YL_TEAM_LEADER_RETURN(210, "养护组长退回"), + YL_WORKER_IMPLEMENT(120, "养护员实施"), + YL_WORKER_RETURN(220, "养护员退回"), + YL_TEAM_LEADER_CONFIRM_PASS(130, "养护组长验收通过"), + YL_TEAM_LEADER_CONFIRM_REJECT(230, "养护组长验收不通过"), + YL_INSPECTOR_CHECK_PASS(140, "AI工单派发人员验收通过"), + YL_INSPECTOR_CHECK_REJECT(240, "AI工单派发人员验收不通过"), + YL_INSPECTOR_START_FINISH(200, "AI工单派发人员结束工单(不同意)"), + YL_INSPECTOR_START_RELAUNCH(100, "AI工单派发人员重新发起(同意)"); + + @JsonValue // 序列化时返回code(前端接收数字) + private final Integer code; + private final String desc; + + AIOperateTypeEnum(Integer code, String desc) { + this.code = code; + this.desc = desc; + } + + // 根据code获取枚举(业务层转换用) + public static AIOperateTypeEnum getByCode(Integer code) { + return Arrays.stream(values()) + .filter(e -> e.getCode().equals(code)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("无效的操作类型:" + code)); + } +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/framework/datapermission/config/OrderDataPermissionConfiguration.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/framework/datapermission/config/OrderDataPermissionConfiguration.java index d2c0242..acd7b3e 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/framework/datapermission/config/OrderDataPermissionConfiguration.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/framework/datapermission/config/OrderDataPermissionConfiguration.java @@ -9,7 +9,7 @@ import org.springframework.context.annotation.Configuration; * 订单模块的数据权限配置 * 每个模块独立配置,互不影响 */ -//@Configuration(proxyBeanMethods = false) +@Configuration(proxyBeanMethods = false) public class OrderDataPermissionConfiguration { /** @@ -21,7 +21,7 @@ public class OrderDataPermissionConfiguration { // 入参rule是全局的DeptDataPermissionRule实例,添加本模块的配置 return rule -> { // 1. 工单表:MainInfoDO,部门字段默认dept_id - //rule.addDeptColumn(MainInfoDO.class); // 默认映射表的dept_id字段 + rule.addDeptColumn(MainInfoDO.class); // 默认映射表的dept_id字段 }; } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmAIService.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmAIService.java new file mode 100644 index 0000000..a6f6473 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmAIService.java @@ -0,0 +1,53 @@ +package com.zteits.urbanops.module.workorder.service.garden; + +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.task.AppGardenTaskInspectorApproveReqVO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.task.AppGardenTaskRegionMgrApproveReqVO; +import com.zteits.urbanops.module.workorder.dto.AppGardenWorkOrderInspectorReqVO; +import jakarta.validation.Valid; + +/** + * 类描述:AI工单处理server + * 创建人:yanhuiqing + * 创建时间:2025/12/25 16:40 + * 修改人:yanhuiqing + * 修改时间:2025/12/25 16:40 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +public interface BpmAIService { + + /** + * 全域督察员工单申请 app service 接口 + * @param createRequestVo + * @return + */ + Long createWorkOrder(@Valid AppGardenWorkOrderInspectorReqVO createRequestVo); + + /** + * 全域督察员工单分配 + * @param regionPassReqVO + */ + void approveTask2TeamLeader(AppGardenTaskRegionMgrApproveReqVO regionPassReqVO); + + /** + * 养护组长退回 分情况 + * @param returnApproveReqVO + */ + void approveTask(AppGardenTaskInspectorApproveReqVO returnApproveReqVO); + + /** + * 判定是否三海地区 通过公司id + * @param companyId + * @return + */ + boolean isSanhai(Long companyId); + + /** + * 判断是否三海地区通过 道路id + * @param roadId + * @return + */ + boolean isSanhaiByRoadId(Long roadId); +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmAIServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmAIServiceImpl.java new file mode 100644 index 0000000..25ff975 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmAIServiceImpl.java @@ -0,0 +1,300 @@ +package com.zteits.urbanops.module.workorder.service.garden; + +import com.zteits.urbanops.framework.common.biz.system.dict.DictDataCommonApi; +import com.zteits.urbanops.framework.common.biz.system.dict.dto.DictDataRespDTO; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.framework.common.util.object.ObjectUtils; +import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; +import com.zteits.urbanops.module.bpm.api.task.BpmProcessInstanceApi; +import com.zteits.urbanops.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import com.zteits.urbanops.module.bpm.controller.admin.task.vo.task.BpmTaskApproveReqVO; +import com.zteits.urbanops.module.bpm.enums.task.BpmTaskStatusEnum; +import com.zteits.urbanops.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; +import com.zteits.urbanops.module.bpm.service.definition.BpmProcessDefinitionService; +import com.zteits.urbanops.module.bpm.service.task.BpmProcessInstanceService; +import com.zteits.urbanops.module.bpm.service.task.BpmTaskService; +import com.zteits.urbanops.module.garden.api.road.RoadApi; +import com.zteits.urbanops.module.garden.dto.road.RoadStreetRespDTO; +import com.zteits.urbanops.module.system.api.permission.RoleApi; +import com.zteits.urbanops.module.system.api.user.AdminUserApi; +import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; +import com.zteits.urbanops.module.system.controller.admin.permission.vo.role.RoleRespVO; +import com.zteits.urbanops.module.workorder.api.WorkOrderApi; +import com.zteits.urbanops.module.workorder.api.constant.BpmCommonConstant; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.task.AppGardenTaskInspectorApproveReqVO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.task.AppGardenTaskRegionMgrApproveReqVO; +import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoDO; +import com.zteits.urbanops.module.workorder.dal.mysql.attachment.AttachmentMapper; +import com.zteits.urbanops.module.workorder.dal.mysql.maininfo.MainInfoExtMapper; +import com.zteits.urbanops.module.workorder.dal.mysql.maininfo.MainInfoMapper; +import com.zteits.urbanops.module.workorder.dto.AppGardenWorkOrderInspectorReqVO; +import com.zteits.urbanops.module.workorder.enums.BusiLineTeamLeaderRoleCodeEnum; +import com.zteits.urbanops.module.workorder.util.RoleListUtils; +import jakarta.annotation.Resource; +import jodd.util.StringUtil; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.runtime.ProcessInstance; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.module.workorder.api.constant.BpmCommonConstant.*; +import static com.zteits.urbanops.module.workorder.enums.ErrorCodeConstants.*; + +/** + * 类描述:AI 工单 app端工单服务实现类 + * 创建人:yanhuiqing + * 创建时间:2025/12/25 16:42 + * 修改人:yanhuiqing + * 修改时间:2025/12/25 16:42 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Service +@Validated +public class BpmAIServiceImpl implements BpmAIService{ + + @Resource + private AttachmentMapper attachmentMapper; + @Resource + private MainInfoMapper workOrderMapper; + + @Resource + private MainInfoExtMapper workOrderExtMapper; + @Resource + private BpmProcessInstanceApi processInstanceApi; + + @Resource + private BpmProcessDefinitionService processDefinitionService; + @Resource + private WorkOrderApi workOrderApi; + + @Resource + private RoadApi roadApi; + + @Resource + private BpmTaskService taskService; + + @Resource + private AdminUserApi adminUserApi; + + @Resource + private RoleApi roleApi; + + @Resource + private BpmGardenService bpmGardenService; + + @Resource + private BpmProcessInstanceService processInstanceService; + + @Resource + private RuntimeService runtimeService; + + @Resource + private DictDataCommonApi dictDataCommonApi; + @Override + public Long createWorkOrder(AppGardenWorkOrderInspectorReqVO createRequestVo) { + List roleList = roleApi.getRoleListByUsrId(SecurityFrameworkUtils.getLoginUserId()); + if(null == roleList || roleList.size()==0){ + throw exception(APP_USER_ROLE_NOT_EXISTS); + } + + if(!RoleListUtils.containsCode(roleList,INSPECTOR_GLOBAL)){ + throw exception(APP_INSPECTOR_USER_ROLE_ERROR); + } + //校验人员不能有 双重角色 + if(RoleListUtils.containsBothCodes(roleList, REGIONAL_MANAGER, INSPECTOR_GLOBAL)){ + throw exception(APP_WORK_INSPECTOR_ROLE_ILLEGLE); + } + + List problemsImgsList = createRequestVo.getProblemsImgs(); + MainInfoDO workOrder = BeanUtils.toBean(createRequestVo, MainInfoDO.class) + .setStatus(BpmTaskStatusEnum.RUNNING.getStatus()); + RoadStreetRespDTO roadStreetRespDTO = roadApi.getRoadInfoById(createRequestVo.getRoadId()); + if(null == roadStreetRespDTO){ + throw exception(APP_WORK_ROAD_NOT_EXISTS); + } + workOrder.setStreetId(roadStreetRespDTO.getStreetId()); + workOrder.setStreetName(roadStreetRespDTO.getStreetName()); + workOrder.setBuzStatus(ORDER_STATUS_INIT);//工单业务初始化状态 后续操作状态 见 OperateTypeEnum + if(StringUtil.isEmpty(createRequestVo.getOrderType())){ + workOrder.setOrderType(BpmCommonConstant.ORDER_TYPE_C); + }else{ + if(createRequestVo.getOrderType().equals(BpmCommonConstant.ORDER_TYPE_Q)){ + throw exception(APP_WORK_ORADER_ERROR); + } + workOrder.setOrderType(createRequestVo.getOrderType()); + } + DictDataRespDTO dictData = dictDataCommonApi.getDictData(CONSERVE_LEVEL, roadStreetRespDTO.getLevelId().toString()); + if(null == dictData){ + throw exception(APP_WORKER_LEVEL_ID_NOT_EXISTS); + } + workOrder.setCuringLevelId(Integer.valueOf(dictData.getValue())); + workOrder.setCuringLevelName(dictData.getLabel()); + workOrder.setCommitDate(LocalDateTime.now()); + workOrder.setCompanyId(SecurityFrameworkUtils.getCompanyId()); + + workOrder.setDeptId(SecurityFrameworkUtils.getDeptId()); + workOrder.setWoSourceId(roleList.get(0).getCode()); + workOrder.setWoSourceName(roleList.get(0).getName()); + String busiLine = createRequestVo.getBusiLine(); + if(StringUtil.isEmpty(busiLine)){ + busiLine = SecurityFrameworkUtils.getBusiLine(); + } + workOrder.setBusiLine(busiLine); + workOrder.setUserId(SecurityFrameworkUtils.getLoginUserId()); + workOrder.setUserName(SecurityFrameworkUtils.getLoginUserNickname()); + if(ObjectUtils.isNotAllEmpty(createRequestVo.getExpectedFinishDate())){ + workOrder.setExpectedFinishDate(createRequestVo.getExpectedFinishDate()); + } + String workOrderNum = workOrderApi.generateWONum(BpmCommonConstant.WORK_ORDER_PREFFIX_AI); + workOrder.setOrderNo(workOrderNum); + + workOrderMapper.insert(workOrder); + if(ObjectUtils.isNotAllEmpty(problemsImgsList) && problemsImgsList.size()>0){ + bpmGardenService.attachmentInsertOrUpdate(problemsImgsList,BpmCommonConstant.PROBLEM_IMG_GROUP,workOrder); + } + // 发起 BPM 流程 + Long userId = SecurityFrameworkUtils.getLoginUserId(); + Map processInstanceVariables = new HashMap<>(); + //是否三海路段 + boolean isSanhai = this.isSanhai(roadStreetRespDTO.getCompanyId()); + processInstanceVariables.put(BPM_COMMON_PROD_ROADID, workOrder.getRoadId()); + processInstanceVariables.put(BPM_COMMON_PROD_APPLYUSERID, userId); + processInstanceVariables.put(BPM_COMMON_PROD_ISSANHAI,isSanhai); + processInstanceVariables.put(BPM_COMMON_PROD_ISNEED,null); + processInstanceVariables.put(BMP_COMMON_PROD_ISPASS,null); + + if(!isSanhai){//非三海初始化 业务线班组长信息 + String roleCode = BusiLineTeamLeaderRoleCodeEnum.getByCode(busiLine).getRoleCode(); + if(StringUtil.isEmpty(roleCode)){// 找不到 默认为园林组长的角色 + roleCode = BpmCommonConstant.TEAM_LEADER_YL; + } + List userList = workOrderExtMapper.getUserByRoadIdAndRoleCode(workOrder.getRoadId(),roleCode,createRequestVo.getBusiLine()); + if(org.springframework.util.ObjectUtils.isEmpty(userList)){ + throw exception(TEAM_LEADER_YL_NOT_EXISTS); + } + // 提取id到List + List idList = userList.stream() + // 映射:将AdminUserRespDTO对象转为其id属性 + .map(AdminUserRespDTO::getId) + // 收集结果到List + .collect(Collectors.toList()); + processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0)); + } + + String processInstanceId = processInstanceApi.createProcessInstance(userId, + new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(BpmCommonConstant.BPM_AI_WO) + .setVariables(processInstanceVariables).setBusinessKey(String.valueOf(workOrder.getId()))); + + // 将工作流的编号,更新到 工单中 + workOrderMapper.updateById(new MainInfoDO().setId(workOrder.getId()).setProcessInstanceId(processInstanceId)); + return workOrder.getId(); + } + + @Override + public void approveTask2TeamLeader(AppGardenTaskRegionMgrApproveReqVO reqVO) { + BpmTaskApproveReqVO targetVO = BeanUtils.toBean(reqVO,BpmTaskApproveReqVO.class); + Map variables = new HashMap<>(); + //审批通过 + variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS,BpmTaskStatusEnum.APPROVE.getStatus()); + Integer status = reqVO.getAgree(); + if(status == null || status == 1){//status == null 此处是为了兼容老接口,防止前段少改造 + variables.put(BMP_COMMON_PROD_ISPASS,false); + variables.put(BPM_COMMON_PROD_ISREVOKE,null);//不通过后 初始化重新发起变量 + }else { + variables.put(BMP_COMMON_PROD_ISPASS,true); + variables.put(BPM_COMMON_PROD_ISNEED,null); + String instanceId = taskService.getTask(reqVO.getId()).getProcessInstanceId(); + ProcessInstance processInstance = processInstanceService.getProcessInstance(instanceId); + Map processInstanceVariables = processInstance.getProcessVariables(); + //String busiLine = (String)processInstanceVariables.get(BPM_COMMON_PROD_BUSILINE); + //Long roadId = (Long) processInstanceVariables.get(BPM_COMMON_PROD_ROADID); + String busiLine = reqVO.getBusiLine(); + Long roadId = reqVO.getRoadId(); + String roleCode = BusiLineTeamLeaderRoleCodeEnum.getByCode(busiLine).getRoleCode(); + + if(StringUtil.isEmpty(roleCode)){// 找不到 默认为园林组长的角色 + roleCode = BpmCommonConstant.TEAM_LEADER_YL; + } + List userList = workOrderExtMapper.getUserByRoadIdAndRoleCode(roadId,roleCode,busiLine); + if(org.springframework.util.ObjectUtils.isEmpty(userList)){ + throw exception(TEAM_LEADER_YL_NOT_EXISTS); + } + // 提取id到List + List idList = userList.stream() + // 映射:将AdminUserRespDTO对象转为其id属性 + .map(AdminUserRespDTO::getId) + // 收集结果到List + .collect(Collectors.toList()); + processInstanceVariables.put(BPM_COMMON_PROD_LEADERID, idList.get(0));//养护组长分配 + //流程变量重新赋值 + runtimeService.setVariables(instanceId,processInstanceVariables); + + } + + targetVO.setVariables(variables); + //TODO 审批候选人需要赋值 + Map> nextAssignees = new HashMap<>(); + targetVO.setNextAssignees(nextAssignees); + targetVO.setAttattmentUrls(reqVO.getReturnImgs()); + taskService.approveTask(SecurityFrameworkUtils.getLoginUserId(),targetVO); + } + + @Override + public void approveTask(AppGardenTaskInspectorApproveReqVO reqVO) { + BpmTaskApproveReqVO targetVO = BeanUtils.toBean(reqVO,BpmTaskApproveReqVO.class); + Map variables = new HashMap<>(); + //审批通过 + variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS,BpmTaskStatusEnum.APPROVE.getStatus()); + Integer status = reqVO.getAgree(); + if(status == null || status == 1){//status == null 此处是为了兼容老接口,防止前段少改造 + variables.put(BPM_COMMON_PROD_ISNEED,false); + variables.put(BPM_COMMON_PROD_ISREVOKE,false); + variables.put(BPM_COMMON_PROD_ISVERIFY,false); + //退回时判断 三海区域 + boolean isSanhai = isSanhaiByRoadId(reqVO.getRoadId()); + variables.put(BPM_COMMON_PROD_ISSANHAI,isSanhai); + }else { + variables.put(BPM_COMMON_PROD_ISNEED,true); + variables.put(BPM_COMMON_PROD_ISREVOKE,true); + variables.put(BPM_COMMON_PROD_ISVERIFY,true); + } + //TODO 重新发起需更新工单数据库 + + targetVO.setVariables(variables); + //TODO 审批候选人需要赋值 + Map> nextAssignees = new HashMap<>(); + targetVO.setNextAssignees(nextAssignees); + targetVO.setAttattmentUrls(reqVO.getReturnImgs()); + taskService.approveTask(SecurityFrameworkUtils.getLoginUserId(),targetVO); + } + + @Override + public boolean isSanhai(Long companyId) { + List sanHaiRoadId = new ArrayList<>(); + sanHaiRoadId.add(115L); // TODO 目前写死 + //是否三海路段 + boolean isSanhai = sanHaiRoadId.contains(companyId); + return isSanhai; + } + + @Override + public boolean isSanhaiByRoadId(Long roadId) { + RoadStreetRespDTO roadStreetRespDTO = roadApi.getRoadInfoById(roadId); + if(null == roadStreetRespDTO){ + throw exception(APP_WORK_ROAD_NOT_EXISTS); + } + return isSanhai(roadStreetRespDTO.getCompanyId()); + } + +} \ No newline at end of file