From b96d549077ce9cf35f7ad4f930a85ce03351c887 Mon Sep 17 00:00:00 2001 From: yanhuiqing Date: Fri, 26 Dec 2025 15:38:29 +0800 Subject: [PATCH] 大区经理 流程 和业务线变动改造 --- urbanops-module-api/urbanops-module-garden-api/src/main/java/com/zteits/urbanops/module/garden/dto/road/RoadReqDTO.java | 6 +++--- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/road/RoadApiImpl.java | 4 ++-- urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/constant/BpmCommonConstant.java | 28 ++++++++++++++++++++++++++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderRegionMgrController.java | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderUniversalController.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/common/UserInfoPageReqVO.java | 6 +++++- urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineTeamLeaderRoleCodeEnum.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineWorkerRoleCodeEnum.java | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/ErrorCodeConstants.java | 4 ++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/TaskNodeEnum.java | 8 ++++---- urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java | 25 ++++++++++++++++++------- urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrService.java | 26 ++++++++++++++++++++++++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrServiceImpl.java | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalService.java | 26 ++++++++++++++++++++++++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalServiceImpl.java | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/util/RoleListUtils.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 16 files changed, 943 insertions(+), 17 deletions(-) create mode 100644 urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderRegionMgrController.java create mode 100644 urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderUniversalController.java create mode 100644 urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineTeamLeaderRoleCodeEnum.java create mode 100644 urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineWorkerRoleCodeEnum.java create mode 100644 urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrService.java create mode 100644 urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrServiceImpl.java create mode 100644 urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalService.java create mode 100644 urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalServiceImpl.java create mode 100644 urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/util/RoleListUtils.java diff --git a/urbanops-module-api/urbanops-module-garden-api/src/main/java/com/zteits/urbanops/module/garden/dto/road/RoadReqDTO.java b/urbanops-module-api/urbanops-module-garden-api/src/main/java/com/zteits/urbanops/module/garden/dto/road/RoadReqDTO.java index e7598d8..2374d35 100644 --- a/urbanops-module-api/urbanops-module-garden-api/src/main/java/com/zteits/urbanops/module/garden/dto/road/RoadReqDTO.java +++ b/urbanops-module-api/urbanops-module-garden-api/src/main/java/com/zteits/urbanops/module/garden/dto/road/RoadReqDTO.java @@ -7,14 +7,14 @@ import lombok.Data; /** * @author yanhuiqing * @version 1.0 - * @description: TODO + * @description: 通过经纬度 获取道路列表 * @date 2025/12/9 22:43 */ @Data public class RoadReqDTO { @NotNull - @Schema(description = "系统编码", example = "sls") - private String companyCode; + @Schema(description = "系统编码,业务线:对应电子围栏的companyCode", example = "yl") + private String busiLine; @NotNull @Schema(description = "经度", example = "44.962685") private String longitude; diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/road/RoadApiImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/road/RoadApiImpl.java index 4308011..a0ce625 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/road/RoadApiImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/road/RoadApiImpl.java @@ -38,12 +38,12 @@ public class RoadApiImpl implements RoadApi { @Override public List getRoadInfoBy(RoadReqDTO reqDTO) { Map param = new HashMap<>(); - param.put("companyCode", reqDTO.getCompanyCode()); + param.put("companyCode", reqDTO.getBusiLine()); param.put("longitude", reqDTO.getLongitude()); param.put("latitude", reqDTO.getLatitude()); String responseBody = HttpUtils.post(roadInfoUrl, null, JSON.toJSONString(param)); - log.info("获取道路信息接口,系统:{},经度:{},维度:{},返回结果:{}", reqDTO.getCompanyCode(), reqDTO.getLongitude(), reqDTO.getLatitude(), responseBody); + log.info("获取道路信息接口,系统:{},经度:{},维度:{},返回结果:{}", reqDTO.getBusiLine(), reqDTO.getLongitude(), reqDTO.getLatitude(), responseBody); JSONObject response = JSONUtil.parseObj(responseBody); if (response.getInt("code") != 200) { return new ArrayList<>(); diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/constant/BpmCommonConstant.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/constant/BpmCommonConstant.java index 4fbb497..49404b6 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/constant/BpmCommonConstant.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/constant/BpmCommonConstant.java @@ -34,6 +34,11 @@ public class BpmCommonConstant { public static final String BPM_UNIVERSE_WO = "universe_workorder_prod"; /** + * 大区经理 流程业务key + */ + public static final String BPM_REGION_MGR_WO = "regionmgr_workorder_prod"; + + /** * 全域工单 督察员 流程业务key */ public static final String BPM_UNIVERSE_INSPECTOR_WO = "universe_inspector_prod"; @@ -55,6 +60,10 @@ public class BpmCommonConstant { public static final String BPM_COMMON_PROD_ISREVOKE = "isRevoke"; public static final String BPM_COMMON_PROD_ISVERIFY = "isVerify"; + /** + * 是否全域的大区经理 key + */ + public static final String BPM_COMMON_PROD_GLOBAL = "isGlobal"; //----------------------------------------工单初始化流程变量key---------------------- @@ -110,6 +119,11 @@ public class BpmCommonConstant { * 全域工单流程前缀 */ public static final String WORK_ORDER_PREFFIX_UNIVERSE = "UWO"; + + /** + * 全域大区经理工单编号前缀 + */ + public static final String WORK_ORDER_PREFFIX_REGION = "RWO"; /** * 全域督察员工单流程前缀 */ @@ -137,8 +151,22 @@ public class BpmCommonConstant { * 园林巡查员 角色编码 */ public static final String YL_INSPECTOR = "yl_inspector"; + /** + * 全域巡查员 角色编码 + */ + public static final String PARTROL_GLOBAL = "patrol_global"; + /** + * 大区经理 角色编码 + */ + public static final String REGIONAL_MANAGER = "regional_manager"; /*养护级别-字典key*/ public static final String CONSERVE_LEVEL = "conserve_level"; + //--------------------------------------------------------------------------------- + + /** + * 物业班组长 角色编码 + */ + public static final String TEAM_LEADER_WY = "team_leader_wy"; } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderRegionMgrController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderRegionMgrController.java new file mode 100644 index 0000000..71f8eb6 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderRegionMgrController.java @@ -0,0 +1,216 @@ +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.AutoUpdateWorkerOrderBuzStatus; +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.dto.AppGardenWorkOrderReqVO; +import com.zteits.urbanops.module.workorder.enums.OperateTypeEnum; +import com.zteits.urbanops.module.workorder.service.garden.BpmGardenService; +import com.zteits.urbanops.module.workorder.service.garden.BpmRegionMgrService; +import com.zteits.urbanops.module.workorder.service.garden.BpmUniversalService; +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.*; + +/** + * 类描述:大区经理 app工单入口 + * 创建人:yanhuiqing + * 创建时间:2025/12/25 23:25 + * 修改人:yanhuiqing + * 修改时间:2025/12/25 23:25 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Tag(name = "APP - 大区经理工单bpm") +@RestController +@Slf4j +@RequestMapping("/bpm/regionmgr/workorder") +public class AppGardenWorkOrderRegionMgrController { + + @Resource + private BpmGardenService gardenService; + + @Resource + private BpmRegionMgrService regionMgrService; + @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-大区经理创建工单信息") + public CommonResult createMainInfo(@Valid @RequestBody AppGardenWorkOrderReqVO createReqVO) { + return success(regionMgrService.createWorkOrder(createReqVO)); + } + + @Operation(summary = "app-统一审批入口") + @PostMapping("/universalApproval") + @AutoUpdateWorkerOrderBuzStatus + @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()); + + OperateTypeEnum operateType = OperateTypeEnum.getByCode(reqVO.getOperateType()); + + switch (operateType) { + case YL_WORKER_RETURN:// 养护员退回 + log.info("当前操作:"+OperateTypeEnum.YL_WORKER_RETURN.getDesc()+"开始,操作类型:"+OperateTypeEnum.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("当前操作:"+OperateTypeEnum.YL_WORKER_RETURN.getDesc()+"<--结束"); + return success(true); + case YL_WORKER_IMPLEMENT://养护员实施 需修改更新工单数据 见切面 + log.info("当前操作:"+OperateTypeEnum.YL_WORKER_IMPLEMENT.getDesc()+"开始,操作类型:"+OperateTypeEnum.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("当前操作:"+OperateTypeEnum.YL_WORKER_IMPLEMENT.getDesc()+"<--结束"); + return success(true); + case YL_TEAM_LEADER_CONFIRM_PASS://养护组长验收通过 + log.info("当前操作:"+OperateTypeEnum.YL_TEAM_LEADER_CONFIRM_PASS.getDesc()+"开始,操作类型:"+OperateTypeEnum.YL_TEAM_LEADER_CONFIRM_PASS.getCode()+"-->"); + AppGardenTaskApproveReqVO approveReqVO = new AppGardenTaskApproveReqVO(); + approveReqVO.setReason(reqVO.getReason()); + approveReqVO.setId(reqVO.getTaskId()); + gardenService.approveTask(approveReqVO); + log.info("当前操作:"+OperateTypeEnum.YL_TEAM_LEADER_CONFIRM_PASS.getDesc()+"<--结束"); + return success(true); + case YL_TEAM_LEADER_CONFIRM_REJECT://养护组长验收不通过 需修改更新工单数据 见切面 + log.info("当前操作:"+OperateTypeEnum.YL_TEAM_LEADER_CONFIRM_REJECT.getDesc()+"开始,操作类型:"+OperateTypeEnum.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("当前操作:"+OperateTypeEnum.YL_TEAM_LEADER_CONFIRM_REJECT.getDesc()+"<--结束"); + return success(true); + case YL_TEAM_LEADER_ASSIGN: //养护组长分配 需修改更新工单数据 见切面 + log.info("当前操作:"+OperateTypeEnum.YL_TEAM_LEADER_ASSIGN.getDesc()+"开始,操作类型:"+OperateTypeEnum.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("当前操作:"+OperateTypeEnum.YL_TEAM_LEADER_ASSIGN.getDesc()+"<--结束"); + return success(true); + + case YL_TEAM_LEADER_RETURN://养护组长退回 + log.info("当前操作:"+OperateTypeEnum.YL_TEAM_LEADER_RETURN.getDesc()+"开始,操作类型:"+OperateTypeEnum.YL_TEAM_LEADER_RETURN.getCode()+"-->"); + AppGardenTaskApproveReqVO returnApproveReqVO = new AppGardenTaskApproveReqVO(); + 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()); + gardenService.approveTask(returnApproveReqVO); + log.info("当前操作:"+OperateTypeEnum.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("当前操作:"+OperateTypeEnum.YL_INSPECTOR_START_FINISH.getDesc()+"<--结束"); + return success(true); + case YL_INSPECTOR_START_RELAUNCH : //巡查员重新发起 需修改更新工单数据 见切面 + log.info("当前操作:"+OperateTypeEnum.YL_INSPECTOR_START_RELAUNCH.getDesc()+"开始,操作类型:"+OperateTypeEnum.YL_INSPECTOR_START_RELAUNCH.getCode()+"-->"); + AppGardenTaskApproveReqVO reStartReqVO = new AppGardenTaskApproveReqVO(); + 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()); + gardenService.approveTask(reStartReqVO); + log.info("当前操作:"+OperateTypeEnum.YL_INSPECTOR_START_RELAUNCH.getDesc()+"<--结束"); + return success(true); + case YL_INSPECTOR_CHECK_PASS , YL_INSPECTOR_CHECK_REJECT ://巡查员验收通过,巡查员验收不通过 + log.info("当前操作:巡查员验收通过 或巡查员验收不通过开始,是否同意:"+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("当前操作:"+OperateTypeEnum.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/AppGardenWorkOrderUniversalController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderUniversalController.java new file mode 100644 index 0000000..5b2fe90 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderUniversalController.java @@ -0,0 +1,57 @@ +package com.zteits.urbanops.module.workorder.controller.app.garden; + +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.module.garden.api.road.RoadApi; +import com.zteits.urbanops.module.workorder.dto.AppGardenWorkOrderReqVO; +import com.zteits.urbanops.module.workorder.service.garden.BpmGardenService; +import com.zteits.urbanops.module.workorder.service.garden.BpmUniversalService; +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.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 static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +/** + * 类描述:园林 全域工单管理入口 + * 创建人: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/universal/workorder") +public class AppGardenWorkOrderUniversalController { + @Resource + private BpmGardenService gardenService; + + @Resource + private BpmUniversalService universalService; + @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-创建工单信息") + public CommonResult createMainInfo(@Valid @RequestBody AppGardenWorkOrderReqVO createReqVO) { + return success(universalService.createWorkOrder(createReqVO)); + } + +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/common/UserInfoPageReqVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/common/UserInfoPageReqVO.java index d8d7911..feaf58c 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/common/UserInfoPageReqVO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/common/UserInfoPageReqVO.java @@ -19,7 +19,11 @@ import lombok.Data; @Schema(description = "APP - 园林app下拉养护员信息分页 Request VO") @Data public class UserInfoPageReqVO extends PageParam { - @NotNull + /** + * 暂时废弃 按业务线后台 路由去取 + */ + //@NotNull + @Deprecated @Schema(description = "养护员角色编码", example = "yl_worker") private String roleCode; @NotNull diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineTeamLeaderRoleCodeEnum.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineTeamLeaderRoleCodeEnum.java new file mode 100644 index 0000000..e220d9b --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineTeamLeaderRoleCodeEnum.java @@ -0,0 +1,60 @@ +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; + +/** + * 类描述:业务线对应的角色编码 + * 创建人:yanhuiqing + * 创建时间:2025/12/25 16:14 + * 修改人:yanhuiqing + * 修改时间:2025/12/25 16:14 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Schema(description = "业务线对应班组长角色编码类型枚举") +@Getter +public enum BusiLineTeamLeaderRoleCodeEnum { // 注意:枚举类必须用enum关键字(你代码里写的是class,这是致命错误!) + + /** 物业业务线-角色编码 */ + ROLECODE_WY("wy", "team_leader_wy"), + /** 市政业务线-角色编码 */ + ROLECODE_SZ("sz", "team_leader_sz"), + /** 园林业务线-角色编码 */ + ROLECODE_YL("yl", "team_leader_yl"); // 最后一个常量必须以分号结尾 + + /** 业务线标识(序列化时返回该值) */ + @JsonValue // 序列化枚举时,返回busiLine字段值(如"wy") + private final String busiLine; + /** 对应的角色编码 */ + private final String roleCode; + + // 枚举构造器必须显式声明为private(规范+强制) + private BusiLineTeamLeaderRoleCodeEnum(String busiLine, String roleCode) { + this.busiLine = busiLine; + this.roleCode = roleCode; + } + + /** + * 根据业务线标识获取枚举 + * @param busiLine 业务线标识(wy/sz/yl) + * @return 对应枚举 + * @throws IllegalArgumentException 传入无效标识/空值时抛出 + */ + public static BusiLineTeamLeaderRoleCodeEnum getByCode(String busiLine) { + // 先判空,避免后续equals空指针,且明确错误提示 + if (busiLine == null || busiLine.trim().isEmpty()) { + throw new IllegalArgumentException("业务线标识不能为空"); + } + return Arrays.stream(values()) + .filter(e -> e.getBusiLine().equals(busiLine.trim())) // 去除首尾空格,增强兼容性 + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("无效的业务线标识:" + busiLine)); + } + +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineWorkerRoleCodeEnum.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineWorkerRoleCodeEnum.java new file mode 100644 index 0000000..5f66670 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/BusiLineWorkerRoleCodeEnum.java @@ -0,0 +1,59 @@ +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; + +/** + * 类描述:养护员角色编码 enum + * 创建人:yanhuiqing + * 创建时间:2025/12/26 10:09 + * 修改人:yanhuiqing + * 修改时间:2025/12/26 10:09 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Schema(description = "业务线对应养护员角色编码类型枚举") +@Getter +public enum BusiLineWorkerRoleCodeEnum { + + /** 物业业务线-角色编码 */ + ROLECODE_WORKER_WY("wy", "wy_worker"), + /** 市政业务线-角色编码 */ + ROLECODE_WORKER_SZ("sz", "sz_worker"), + /** 园林业务线-角色编码 */ + ROLECODE_WORKER_YL("yl", "yl_worker"); // 最后一个常量必须以分号结尾 + + /** 业务线标识(序列化时返回该值) */ + @JsonValue // 序列化枚举时,返回busiLine字段值(如"wy") + private final String busiLine; + /** 对应的角色编码 */ + private final String roleCode; + + // 枚举构造器必须显式声明为private(规范+强制) + private BusiLineWorkerRoleCodeEnum(String busiLine, String roleCode) { + this.busiLine = busiLine; + this.roleCode = roleCode; + } + + /** + * 根据业务线标识获取枚举 + * @param busiLine 业务线标识(wy/sz/yl) + * @return 对应枚举 + * @throws IllegalArgumentException 传入无效标识/空值时抛出 + */ + public static BusiLineWorkerRoleCodeEnum getByCode(String busiLine) { + // 先判空,避免后续equals空指针,且明确错误提示 + if (busiLine == null || busiLine.trim().isEmpty()) { + throw new IllegalArgumentException("业务线标识不能为空"); + } + return Arrays.stream(values()) + .filter(e -> e.getBusiLine().equals(busiLine.trim())) // 去除首尾空格,增强兼容性 + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("无效的业务线标识:" + busiLine)); + } +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/ErrorCodeConstants.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/ErrorCodeConstants.java index ad8820a..e39ac75 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/ErrorCodeConstants.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/ErrorCodeConstants.java @@ -34,4 +34,8 @@ public interface ErrorCodeConstants { ErrorCode APP_WORK_ORADER_ERROR = new ErrorCode(1-900-002-002, "工单类型错误,快速工单无法走此流程 !"); ErrorCode APP_WORK_ORADER_NO_NOT_EXISTS = new ErrorCode(1-900-002-003, "工单编号不能为空!"); + + ErrorCode APP_WORK_ORADER_ROLE_ILLEGLE = new ErrorCode(1-900-002-004, "该登录人即是 大区经理 角色,又是 全域督察员,无法处理流程!"); + + ErrorCode APP_WORK_ORADER_ROLE_NOT_EXSITS = new ErrorCode(1-900-002-005, "该登录人即不是 大区经理 角色,又不是 全域督察员,无法处理流程!"); } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/TaskNodeEnum.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/TaskNodeEnum.java index 3216975..8bb6483 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/TaskNodeEnum.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/enums/TaskNodeEnum.java @@ -18,12 +18,12 @@ import java.util.concurrent.ConcurrentHashMap; public enum TaskNodeEnum { // 按业务顺序定义枚举常量:顺序值、节点名称 - YL_INSPECTOR_START(1, "ylInspectorStart"), - YL_TEAM_LEADER(2, "ylTeamLeader"), + /*YL_INSPECTOR_START(1, "ylInspectorStart"),*/ + /*YL_TEAM_LEADER(2, "ylTeamLeader"),*/ YL_WORKER(3, "ylWorker"), YL_TEAM_LEADER_CONFIRM(4, "ylTeamLeaderConfirm"), - YL_INSPECTOR(5, "ylInspector"), - YL_INSPECTOR_END(6, "ylInspectorEnd"); + YL_INSPECTOR(5, "ylInspector")/*, + YL_INSPECTOR_END(6, "ylInspectorEnd")*/; // 节点顺序(用于计算上一个节点) private final int order; diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java index 5f4f5c8..43be3cd 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenServiceImpl.java @@ -50,6 +50,8 @@ 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.AppGardenWorkOrderReqVO; import com.zteits.urbanops.module.workorder.dto.AppGardenWorkOrderRespVO; +import com.zteits.urbanops.module.workorder.enums.BusiLineTeamLeaderRoleCodeEnum; +import com.zteits.urbanops.module.workorder.enums.BusiLineWorkerRoleCodeEnum; import com.zteits.urbanops.module.workorder.util.TaskNodeUtils; import jakarta.annotation.Resource; import jodd.util.StringUtil; @@ -592,12 +594,11 @@ public class BpmGardenServiceImpl implements BpmGardenService{ } workOrder.setWoSourceId(roleList.get(0).getCode()); workOrder.setWoSourceName(roleList.get(0).getName()); - - if(StringUtil.isNotEmpty(createRequestVo.getBusiLine())){ - workOrder.setBusiLine(createRequestVo.getBusiLine()); - }else { - workOrder.setBusiLine(SecurityFrameworkUtils.getBusiLine()); + 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())){ @@ -616,7 +617,11 @@ public class BpmGardenServiceImpl implements BpmGardenService{ processInstanceVariables.put(BPM_COMMON_PROD_APPLYUSERID, userId); processInstanceVariables.put(BPM_COMMON_PROD_ISNEED,null); Map> startUserSelectAssignees = new HashMap<>(); - List userList = workOrderExtMapper.getUserByRoadIdAndRoleCode(workOrder.getRoadId(),BpmCommonConstant.TEAM_LEADER_YL,createRequestVo.getBusiLine()); + 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); } @@ -726,9 +731,15 @@ public class BpmGardenServiceImpl implements BpmGardenService{ @Override public PageResult getUserByLoginIdAndRoleCode(PageParam param, Long loginUserId, String roleCode, String busiLine, boolean notHas) { - if(org.springframework.util.ObjectUtils.isEmpty(loginUserId) || org.springframework.util.ObjectUtils.isEmpty(roleCode) || org.springframework.util.ObjectUtils.isEmpty(busiLine)){ + if(org.springframework.util.ObjectUtils.isEmpty(loginUserId) || + //org.springframework.util.ObjectUtils.isEmpty(roleCode) || + org.springframework.util.ObjectUtils.isEmpty(busiLine)){ throw exception0(BAD_REQUEST.getCode(),"param:loginUserId,roleCode,busiLine 不能为空!"); } + /** + * 根据业务线获取养护员角色 + */ + roleCode = BusiLineWorkerRoleCodeEnum.getByCode(busiLine).getRoleCode(); return workOrderExtMapper.getUserByLoginIdAndRoleCodePage(param,loginUserId,roleCode,busiLine,notHas); } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrService.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrService.java new file mode 100644 index 0000000..4d9c348 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrService.java @@ -0,0 +1,26 @@ +package com.zteits.urbanops.module.workorder.service.garden; + +import com.zteits.urbanops.module.workorder.dto.AppGardenWorkOrderReqVO; +import jakarta.validation.Valid; + +/** + * 类描述:大区经理工单service + * 创建人:yanhuiqing + * 创建时间:2025/12/25 23:27 + * 修改人:yanhuiqing + * 修改时间:2025/12/25 23:27 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +public interface BpmRegionMgrService { + + /** + * 全域工单申请 app service 接口 + * @param createRequestVo + * @return + */ + Long createWorkOrder(@Valid AppGardenWorkOrderReqVO createRequestVo); + +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrServiceImpl.java new file mode 100644 index 0000000..991bcd3 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmRegionMgrServiceImpl.java @@ -0,0 +1,183 @@ +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.enums.task.BpmTaskStatusEnum; +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.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.AppGardenWorkOrderReqVO; +import com.zteits.urbanops.module.workorder.enums.BusiLineTeamLeaderRoleCodeEnum; +import jakarta.annotation.Resource; +import jodd.util.StringUtil; +import org.flowable.engine.RuntimeService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.time.LocalDateTime; +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.api.constant.BpmCommonConstant.BPM_COMMON_PROD_LEADERID; +import static com.zteits.urbanops.module.workorder.enums.ErrorCodeConstants.*; +import static com.zteits.urbanops.module.workorder.enums.ErrorCodeConstants.TEAM_LEADER_YL_NOT_EXISTS; + +/** + * 类描述:大区经理工单入口 service实现类 + * 创建人:yanhuiqing + * 创建时间:2025/12/25 23:28 + * 修改人:yanhuiqing + * 修改时间:2025/12/25 23:28 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Service +@Validated +public class BpmRegionMgrServiceImpl implements BpmRegionMgrService{ + @Resource + private AttachmentMapper attachmentMapper; + @Resource + private MainInfoMapper workOrderMapper; + + @Resource + private MainInfoExtMapper workOrderExtMapper; + @Resource + private BpmProcessInstanceApi processInstanceApi; + @Resource + private WorkOrderApi workOrderApi; + + @Resource + private RoadApi roadApi; + + @Resource + private BpmTaskService taskService; + + @Resource + private BpmProcessDefinitionService processDefinitionService; + + @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 + @Transactional(rollbackFor = Exception.class) + public Long createWorkOrder(AppGardenWorkOrderReqVO createRequestVo) { + List problemsImgsList = createRequestVo.getProblemsImgs(); + + MainInfoDO workOrder = BeanUtils.toBean(createRequestVo, MainInfoDO.class) + .setStatus(BpmTaskStatusEnum.RUNNING.getStatus()); + RoadStreetRespDTO roadStreetRespDTO = roadApi.getRoadInfoById(createRequestVo.getRoadId()); + + 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()); + List roleList = roleApi.getRoleListByUsrId(SecurityFrameworkUtils.getLoginUserId()); + if(null == roleList || roleList.size()==0){ + throw exception(APP_USER_ROLE_NOT_EXISTS); + } + 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_REGION); + 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<>(); + processInstanceVariables.put(BPM_COMMON_PROD_ROADID, workOrder.getRoadId()); + processInstanceVariables.put(BPM_COMMON_PROD_APPLYUSERID, userId); + processInstanceVariables.put(BPM_COMMON_PROD_ISNEED,null); + Map> startUserSelectAssignees = new HashMap<>(); + 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_GARDEN_INSPECT_WO) + new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(BpmCommonConstant.BPM_REGION_MGR_WO) + .setVariables(processInstanceVariables).setBusinessKey(String.valueOf(workOrder.getId())) + .setStartUserSelectAssignees(startUserSelectAssignees)); + + // 将工作流的编号,更新到 工单中 + workOrderMapper.updateById(new MainInfoDO().setId(workOrder.getId()).setProcessInstanceId(processInstanceId)); + return workOrder.getId(); + } +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalService.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalService.java new file mode 100644 index 0000000..29dc4ee --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalService.java @@ -0,0 +1,26 @@ +package com.zteits.urbanops.module.workorder.service.garden; + +import com.zteits.urbanops.module.workorder.dto.AppGardenWorkOrderReqVO; +import jakarta.validation.Valid; + +/** + * 类描述:全域工单处理server + * 创建人:yanhuiqing + * 创建时间:2025/12/25 16:40 + * 修改人:yanhuiqing + * 修改时间:2025/12/25 16:40 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +public interface BpmUniversalService { + + /** + * 全域工单申请 app service 接口 + * @param createRequestVo + * @return + */ + Long createWorkOrder(@Valid AppGardenWorkOrderReqVO createRequestVo); + +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalServiceImpl.java new file mode 100644 index 0000000..ca765af --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmUniversalServiceImpl.java @@ -0,0 +1,198 @@ +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.enums.task.BpmTaskStatusEnum; +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.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.AppGardenWorkOrderReqVO; +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.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.time.LocalDateTime; +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.api.constant.BpmCommonConstant.BPM_COMMON_PROD_LEADERID; +import static com.zteits.urbanops.module.workorder.enums.ErrorCodeConstants.*; +import static com.zteits.urbanops.module.workorder.enums.ErrorCodeConstants.TEAM_LEADER_YL_NOT_EXISTS; + +/** + * 类描述:全域 app端工单服务实现类 + * 创建人:yanhuiqing + * 创建时间:2025/12/25 16:42 + * 修改人:yanhuiqing + * 修改时间:2025/12/25 16:42 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Service +@Validated +public class BpmUniversalServiceImpl implements BpmUniversalService{ + + @Resource + private AttachmentMapper attachmentMapper; + @Resource + private MainInfoMapper workOrderMapper; + + @Resource + private MainInfoExtMapper workOrderExtMapper; + @Resource + private BpmProcessInstanceApi processInstanceApi; + @Resource + private WorkOrderApi workOrderApi; + + @Resource + private RoadApi roadApi; + + @Resource + private BpmTaskService taskService; + + @Resource + private BpmProcessDefinitionService processDefinitionService; + + @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(AppGardenWorkOrderReqVO createRequestVo) { + List problemsImgsList = createRequestVo.getProblemsImgs(); + + MainInfoDO workOrder = BeanUtils.toBean(createRequestVo, MainInfoDO.class) + .setStatus(BpmTaskStatusEnum.RUNNING.getStatus()); + RoadStreetRespDTO roadStreetRespDTO = roadApi.getRoadInfoById(createRequestVo.getRoadId()); + + 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()); + List roleList = roleApi.getRoleListByUsrId(SecurityFrameworkUtils.getLoginUserId()); + if(null == roleList || roleList.size()==0){ + throw exception(APP_USER_ROLE_NOT_EXISTS); + } + //校验人员不能有 双重角色 + if(RoleListUtils.containsCodeOr(roleList, REGIONAL_MANAGER, PARTROL_GLOBAL)){ + throw exception(APP_WORK_ORADER_ROLE_ILLEGLE); + } + if(!(RoleListUtils.containsCode(roleList,REGIONAL_MANAGER) || RoleListUtils.containsCode(roleList,PARTROL_GLOBAL))){ + throw exception(APP_WORK_ORADER_ROLE_NOT_EXSITS); + } + 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_UNIVERSE); + 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<>(); + + String isGlobal = BPM_COMMON_PROD_GLOBAL; + if(RoleListUtils.containsCode(roleList, REGIONAL_MANAGER)){//大区经理 + processInstanceVariables.put(isGlobal,true); + }else{//全域巡查员 + processInstanceVariables.put(isGlobal,false); + } + + processInstanceVariables.put(BPM_COMMON_PROD_ROADID, workOrder.getRoadId()); + processInstanceVariables.put(BPM_COMMON_PROD_APPLYUSERID, userId); + processInstanceVariables.put(BPM_COMMON_PROD_ISNEED,null); + Map> startUserSelectAssignees = new HashMap<>(); + 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_GARDEN_INSPECT_WO) + new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(BpmCommonConstant.BPM_UNIVERSE_WO) + .setVariables(processInstanceVariables).setBusinessKey(String.valueOf(workOrder.getId())) + .setStartUserSelectAssignees(startUserSelectAssignees)); + + // 将工作流的编号,更新到 工单中 + workOrderMapper.updateById(new MainInfoDO().setId(workOrder.getId()).setProcessInstanceId(processInstanceId)); + return workOrder.getId(); + } +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/util/RoleListUtils.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/util/RoleListUtils.java new file mode 100644 index 0000000..7aeb32d --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/util/RoleListUtils.java @@ -0,0 +1,54 @@ +package com.zteits.urbanops.module.workorder.util; + +import com.zteits.urbanops.module.system.controller.admin.permission.vo.role.RoleRespVO; + +import java.util.List; +import java.util.Objects; + +/** + * 类描述:判断角色包含关系工具类 + * 创建人:yanhuiqing + * 创建时间:2025/12/25 19:22 + * 修改人:yanhuiqing + * 修改时间:2025/12/25 19:22 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +public class RoleListUtils { + + /** + * 方法:判断角色列表中是否包含 code = "code" 的元素 + * @param roleList 角色列表(允许为 null/空) + * @return true=包含,false=不包含/列表为空/列表为null + */ + public static boolean containsCode(List roleList, String code) { + // 1. 列表为null/空,直接返回false + if (roleList == null || roleList.isEmpty()) { + return false; + } + // 2. Stream 过滤:code不为null 且 等于"code" + return roleList.stream() + .map(RoleRespVO::getCode) // 提取code字段 + .filter(Objects::nonNull) // 过滤掉code为null的元素 + .anyMatch(code::equals); // 存在任意一个等于code则返回true + } + + /** + * 方法:判断角色列表中是否包含 code = "code1" 或 code = "code2" 的元素 + * @param roleList 角色列表(允许为 null/空) + * @return true=包含code1或code2,false=不包含/列表为空/列表为null + */ + public static boolean containsCodeOr(List roleList,String code1,String code2) { + // 1. 列表为null/空,直接返回false + if (roleList == null || roleList.isEmpty()) { + return false; + } + // 2. Stream 过滤:code不为null 且 等于"code1"或"code2" + return roleList.stream() + .map(RoleRespVO::getCode) + .filter(Objects::nonNull) + .anyMatch(code -> code1.equals(code) || code2.equals(code)); + } +} \ No newline at end of file -- libgit2 0.21.4