diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/workorder/WorkOrderApi.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/workorder/WorkOrderApi.java index 005e0c6..bbe9c1c 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/workorder/WorkOrderApi.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/workorder/WorkOrderApi.java @@ -2,6 +2,8 @@ package com.zteits.urbanops.module.workorder.api.workorder; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.AppGardenWorkOrderReqVO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.AppGardenWorkOrderRespVO; import java.util.List; @@ -33,4 +35,11 @@ public interface WorkOrderApi { * @return */ public List getUserByRoadIdAndRoleCode(Long roadId,String roleCode,String busiLine); + + /** + * 创建工单API + * @param createRequestVo + * @return + */ + public AppGardenWorkOrderRespVO createWorkOrder(AppGardenWorkOrderReqVO createRequestVo); } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/workorder/WorkOrderApiImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/workorder/WorkOrderApiImpl.java index 99262c0..477f941 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/workorder/WorkOrderApiImpl.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/api/workorder/WorkOrderApiImpl.java @@ -1,9 +1,14 @@ package com.zteits.urbanops.module.workorder.api.workorder; import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; import com.zteits.urbanops.module.workorder.api.constant.BpmCommonConstant; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.AppGardenWorkOrderReqVO; +import com.zteits.urbanops.module.workorder.controller.app.garden.vo.AppGardenWorkOrderRespVO; +import com.zteits.urbanops.module.workorder.dal.dataobject.garden.BpmGardenWorkOrderDO; import com.zteits.urbanops.module.workorder.dal.mysql.maininfo.MainInfoExtMapper; +import com.zteits.urbanops.module.workorder.service.garden.BpmGardenService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; @@ -30,6 +35,9 @@ public class WorkOrderApiImpl implements WorkOrderApi{ private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); private static final AtomicInteger counter = new AtomicInteger(1); + @Resource + private BpmGardenService gardenService; + @Override public String generateWONum(String prefix) { if (ObjectUtils.isEmpty(prefix)) { @@ -63,4 +71,10 @@ public class WorkOrderApiImpl implements WorkOrderApi{ } return workOrderExtMapper.getUserByRoadIdAndRoleCode(roadId,roleCode,busiLine); } + + @Override + public AppGardenWorkOrderRespVO createWorkOrder(AppGardenWorkOrderReqVO createRequestVo) { + BpmGardenWorkOrderDO targetVO = gardenService.getWorkOrder(gardenService.createWorkOrder(createRequestVo)); + return BeanUtils.toBean(targetVO,AppGardenWorkOrderRespVO.class); + } } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/MainInfoController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/MainInfoController.java index 0cbc896..59a951e 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/MainInfoController.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/MainInfoController.java @@ -1,13 +1,15 @@ package com.zteits.urbanops.module.workorder.controller.admin.maininfo; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; import com.zteits.urbanops.framework.common.pojo.CommonResult; import com.zteits.urbanops.framework.common.pojo.PageParam; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; -import com.zteits.urbanops.module.workorder.controller.admin.attachment.vo.AttachmentReqVO; +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.dal.dataobject.dept.DeptDO; +import com.zteits.urbanops.module.system.service.dept.DeptService; import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.MainInfoPageReqVO; import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.MainInfoRespVO; import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.MainInfoSaveReqVO; @@ -28,10 +30,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.EXPORT; @@ -50,6 +49,11 @@ public class MainInfoController { @Resource private AttachmentService attachmentService; + @Resource + private DeptService deptService; + @Resource + private AdminUserApi adminUserApi; + @PostMapping("/create") @Operation(summary = "创建工单信息") @PreAuthorize("@ss.hasPermission('workorder:main-info:create')") @@ -105,7 +109,16 @@ public class MainInfoController { )); } } - return success(MainInfoConvert.INSTANCE.buildMainInfo(mainInfo, attachmentMap)); + DeptDO dept = deptService.getDept(mainInfo.getCompanyId()); + Set userIds = new HashSet<>(); + if (mainInfo.getCoHandlers() != null) { + mainInfo.getCoHandlers().stream() + .filter(Objects::nonNull) // 过滤null ID + .forEach(userIds::add); + } + userIds.add(mainInfo.getUserId()); + Map userMap = adminUserApi.getUserMap(userIds); + return success(MainInfoConvert.INSTANCE.buildMainInfo(mainInfo, attachmentMap, dept.getName(), userMap)); } @GetMapping("/page") diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/MainInfoRespVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/MainInfoRespVO.java index 4eef52b..2e461d8 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/MainInfoRespVO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/MainInfoRespVO.java @@ -137,4 +137,14 @@ public class MainInfoRespVO { @Schema(description = "文件名称") private String fileNames; + + @Schema(description = "共同处理人") + private Set coHandlers; + @Schema(description = "共同处理人名称,多个逗号拼接") + private String coHandlersName; + + @Schema(description = "单位名称") + private String companyName; + @Schema(description = "提交人电话") + private String userMobile; } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/maininfo/MainInfoConvert.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/maininfo/MainInfoConvert.java index a409301..3825c2d 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/maininfo/MainInfoConvert.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/maininfo/MainInfoConvert.java @@ -3,6 +3,7 @@ package com.zteits.urbanops.module.workorder.convert.maininfo; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.collection.CollectionUtils; import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.MainInfoRespVO; import com.zteits.urbanops.module.workorder.dal.dataobject.attachment.AttachmentDO; import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoDO; @@ -11,6 +12,8 @@ import org.mapstruct.factory.Mappers; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; /** * @Classname MainInfoConvert @@ -26,18 +29,34 @@ public interface MainInfoConvert { default PageResult buildMainInfoPage(PageResult pageResult, Map attachmentMap) { List mainInfoVOList = CollectionUtils.convertList(pageResult.getList(), mainInfoDO -> { MainInfoRespVO mainInfoVo = BeanUtils.toBean(mainInfoDO, MainInfoRespVO.class); - AttachmentDO attachmentDO = attachmentMap.get(mainInfoDO.getOrderNo()); - mainInfoVo.setFileNames(attachmentDO.getFileNames()); + if (attachmentMap != null && !attachmentMap.isEmpty()) { + AttachmentDO attachmentDO = attachmentMap.get(mainInfoDO.getOrderNo()); + mainInfoVo.setFileNames(attachmentDO.getFileNames()); + } return mainInfoVo; }); return new PageResult<>(mainInfoVOList, pageResult.getTotal()); } - default MainInfoRespVO buildMainInfo(MainInfoDO mainInfoDO, Map attachmentMap) { + default MainInfoRespVO buildMainInfo(MainInfoDO mainInfoDO, Map attachmentMap, String deptName,Map userMap) { MainInfoRespVO mainInfoVo = BeanUtils.toBean(mainInfoDO, MainInfoRespVO.class); if (mainInfoDO != null) { - AttachmentDO attachmentDO = attachmentMap.get(mainInfoDO.getOrderNo()); - mainInfoVo.setFileNames(attachmentDO.getFileNames()); + if (attachmentMap != null && !attachmentMap.isEmpty()) { + AttachmentDO attachmentDO = attachmentMap.get(mainInfoDO.getOrderNo()); + mainInfoVo.setFileNames(attachmentDO.getFileNames()); + } + mainInfoVo.setCompanyName(deptName); + if (mainInfoVo.getCoHandlers() != null && !mainInfoVo.getCoHandlers().isEmpty()) { + String coHandlersName = mainInfoVo.getCoHandlers() == null ? "" : mainInfoVo.getCoHandlers().stream() + .filter(userId -> userId != null) + .map(userMap::get) + .filter(Objects::nonNull) + .map(AdminUserRespDTO::getNickname) + .filter(nickname -> nickname != null && !nickname.isEmpty()) + .collect(Collectors.joining(",")); + mainInfoVo.setCoHandlersName(coHandlersName); + } + mainInfoVo.setUserMobile(userMap.get(mainInfoVo.getUserId()).getMobile()); } return mainInfoVo; } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/maininfo/MainInfoDO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/maininfo/MainInfoDO.java index 745185f..be2c8ae 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/maininfo/MainInfoDO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/maininfo/MainInfoDO.java @@ -18,7 +18,7 @@ import org.hibernate.validator.constraints.Length; * * @author 超级管理员 */ -@TableName("workorder_main_info") +@TableName(value = "workorder_main_info", autoResultMap = true) @KeySequence("workorder_main_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @Data @EqualsAndHashCode(callSuper = true) @@ -34,7 +34,7 @@ public class MainInfoDO extends BaseDO { @TableId private Long id; /** - * 业务线:yl 园林,wy 物业,sz 市政 + * 业务线:yl 园林,wy 物业,sz 市政 */ private String busiLine; /** @@ -151,4 +151,4 @@ public class MainInfoDO extends BaseDO { private Set coHandlers; -} \ No newline at end of file +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/listener/FirstApprovalAutoCompleteListener.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/listener/FirstApprovalAutoCompleteListener.java new file mode 100644 index 0000000..1817060 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/listener/FirstApprovalAutoCompleteListener.java @@ -0,0 +1,53 @@ +package com.zteits.urbanops.module.workorder.service.garden.listener; + +/** + * 类描述:第一次跳过审批,第二次手动审批 + * 创建人:yanhuiqing + * 创建时间:2025/12/18 20:28 + * 修改人:yanhuiqing + * 修改时间:2025/12/18 20:28 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.TaskListener; +import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 初审节点自动通过监听器 + */ +@Component("firstApprovalAutoCompleteListener") // 组件名,供流程设计器调用 +public class FirstApprovalAutoCompleteListener implements TaskListener { + + // 注入Flowable的TaskService,用于完成任务 + @Autowired + private TaskService taskService; + + @Override + public void notify(DelegateTask delegateTask) { + // 1. 获取流程变量 + String starterId = (String) delegateTask.getVariable("starterId"); // 发起人ID + Boolean isFirstEnter = (Boolean) delegateTask.getVariable("isFirstEnterFirstApproval"); // 是否首次进入 + Boolean isReturned = (Boolean) delegateTask.getVariable("isReturnedToFirstApproval"); // 是否退回 + + // 2. 获取当前审批节点的审批人ID + String assigneeId = delegateTask.getAssignee(); + + // 3. 核心逻辑:首次进入 + 发起人=审批人 → 自动完成任务 + if (isFirstEnter != null && isFirstEnter + && !Boolean.TRUE.equals(isReturned) + && starterId != null && starterId.equals(assigneeId)) { + + // 标记:首次进入已处理,后续不再触发自动通过 + delegateTask.setVariable("isFirstEnterFirstApproval", false); + + // 自动完成任务(流程继续向下) + taskService.complete(delegateTask.getId()); + } + // 若为退回进入(isReturned=true),则不执行自动完成,等待手动处理 + } +} \ No newline at end of file