diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/material/MaterialApi.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/material/MaterialApi.java new file mode 100644 index 0000000..dbe0244 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/material/MaterialApi.java @@ -0,0 +1,20 @@ +package com.zteits.urbanops.module.garden.api.material; + +import com.zteits.urbanops.module.garden.api.material.dto.MaterialInventoryOutDto; + +/** + * @Classname MaterialApi + * @Description 物料出库 + * @Date 2025/12/16 16:19 + * @Created by wangqian + */ +public interface MaterialApi { + + /** + * 创建物料出库 + * + * @param outDto 创建信息 + * @return 编号 + */ + Long createMaterialInventoryOut(MaterialInventoryOutDto outDto); +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/material/MaterialApiImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/material/MaterialApiImpl.java new file mode 100644 index 0000000..0de1671 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/material/MaterialApiImpl.java @@ -0,0 +1,28 @@ +package com.zteits.urbanops.module.garden.api.material; + +import cn.hutool.core.bean.BeanUtil; +import com.zteits.urbanops.module.garden.api.material.dto.MaterialInventoryOutDto; +import com.zteits.urbanops.module.garden.controller.admin.materialinventoryout.vo.MaterialInventoryOutSaveReqVO; +import com.zteits.urbanops.module.garden.service.materialinventoryout.MaterialInventoryOutService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +/** + * @Classname MaterialApiImpl + * @Description 物料接口 + * @Date 2025/12/16 16:21 + * @Created by wangqian + */ +@Service +@Validated +public class MaterialApiImpl implements MaterialApi{ + + @Resource + private MaterialInventoryOutService materialInventoryOutService; + @Override + public Long createMaterialInventoryOut(MaterialInventoryOutDto outDto) { + MaterialInventoryOutSaveReqVO createReqVO = BeanUtil.toBean(outDto, MaterialInventoryOutSaveReqVO.class); + return materialInventoryOutService.createMaterialInventoryOut(createReqVO); + } +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/material/dto/MaterialInventoryOutDto.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/material/dto/MaterialInventoryOutDto.java new file mode 100644 index 0000000..a850a97 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/material/dto/MaterialInventoryOutDto.java @@ -0,0 +1,35 @@ +package com.zteits.urbanops.module.garden.api.material.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @Classname MaterialInventoryOutDto + * @Description 物料出库 + * @Date 2025/12/16 16:22 + * @Created by wangqian + */ +@Data +public class MaterialInventoryOutDto { + @Schema(description = "入库ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18713") + private Long id; + + @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14541") + @NotNull(message = "物料ID不能为空") + private Long materialId; + + @Schema(description = "物料名称", example = "芋艿") + private String materialName; + + @Schema(description = "出库数量", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "出库数量不能为空") + private Long outInventoryNum; + + @Schema(description = "出库日期", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "出库日期不能为空") + private LocalDateTime outDate; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/AssignTasksController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/AssignTasksController.java index 8376197..7a761de 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/AssignTasksController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/AssignTasksController.java @@ -92,12 +92,10 @@ public class AssignTasksController { List assignTaskInfoList = asignTasksInfoService.getAssignTasksInfos(assignTasks.getId()); assignTasksRespVO.setAssignTaskInfoList(assignTaskInfoList); //获取单位集合 - List companyIds = CollectionUtil.isEmpty(assignTaskInfoList) + List companyIds = CollectionUtil.isEmpty(assignTaskInfoList) ? Collections.emptyList() : assignTaskInfoList.stream() .map(AssignTasksInfoDO::getCompanyId) - .map(StrUtil::toString) // Hutool 工具类:自动处理 null(转为 null 字符串,需配合过滤) - .filter(StrUtil::isNotEmpty) // 过滤 null/空字符串 .distinct() .collect(Collectors.toList()); assignTasksRespVO.setCompanyIds(companyIds); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksRespVO.java index 7950b17..5b60abf 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksRespVO.java @@ -63,7 +63,7 @@ public class AssignTasksRespVO { @Schema(description = "修改人(关联用户ID,最后修改人)") private String updater; - private List companyIds; + private List companyIds; private List assignTaskInfoList; public void setParentFinish(Integer parentFinish) { diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksSaveReqVO.java index cd6486e..a41db1e 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksSaveReqVO.java @@ -58,6 +58,6 @@ public class AssignTasksSaveReqVO { /*单位集合*/ @NotEmpty(message = "派发单位不能为空") - private List companyIds; + private List companyIds; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanController.java index 332d447..3a92196 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanController.java @@ -47,7 +47,7 @@ public class InspectionPlanController { @PreAuthorize("@ss.hasPermission('garden:inspection-plan:create')") public CommonResult createInspectionPlan(@Valid @RequestBody InspectionPlanSaveReqVO createReqVO) { if(!createReqVO.verify()){ - log.warn("次数值范围:1-10或者分数格式:1/3, rateValue={}", createReqVO.getRateValue()); + log.warn("次数值范围:1-1000或者分数格式:1/3, rateValue={}", createReqVO.getRateValue()); return error(PLAN_RATE_VALUE_ERROR); } // //临时计划 diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanCommitPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanCommitPageReqVO.java index eb5d232..8e1bdbd 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanCommitPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanCommitPageReqVO.java @@ -63,4 +63,12 @@ public class InspectionPlanCommitPageReqVO extends PageParam { private String remark; private List busiLineList; + + @Schema(description = "创建开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate createTimeStart; + + @Schema(description = "创建结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate createTimeEnd; } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanSaveReqVO.java index c1dbcbe..02f72e4 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanSaveReqVO.java @@ -46,6 +46,7 @@ public class InspectionPlanSaveReqVO { @Schema(description = "频次值", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(message = "频次值不能为空") + @Size(max = 6 , message = "频次值长度不能大于6") private String rateValue; @Schema(description = "周期ID: 0:次;1:日/次;2:周/次;3:月/次;4:季/次;5:半年/次;6:年/次", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanCommitPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanCommitPageReqVO.java index bf9669c..5106a68 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanCommitPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanCommitPageReqVO.java @@ -60,4 +60,12 @@ public class MaintainPlanCommitPageReqVO extends PageParam { @Schema(description = "提交人用户ID", example = "王五") private String userName; -} \ No newline at end of file + @Schema(description = "创建开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate createTimeStart; + + @Schema(description = "创建结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate createTimeEnd; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanDetailRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanDetailRespVO.java index 71c0d99..de1700c 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanDetailRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanDetailRespVO.java @@ -74,4 +74,4 @@ public class MaintainPlanDetailRespVO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") private LocalDateTime createTime; -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanSaveReqVO.java index 88b3701..2fe4e6d 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanSaveReqVO.java @@ -46,6 +46,7 @@ public class MaintainPlanSaveReqVO { @Schema(description = "频次值", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(message = "频次值不能为空") + @Size(max = 6 , message = "频次值长度不能大于6") private String rateValue; @Schema(description = "周期ID: 1:日/次;2:周/次;3:月/次;4:年/次;5:按次;6:季度;7:半年", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadStreetController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadStreetController.java index 3d110da..2d95edc 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadStreetController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadStreetController.java @@ -40,14 +40,14 @@ public class RoadStreetController { @PostMapping("/create") @Operation(summary = "创建街道") - @PreAuthorize("@ss.hasPermission('garden:road-street:create')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:create')") public CommonResult createRoadStreet(@Valid @RequestBody RoadStreetSaveReqVO createReqVO) { return success(roadStreetService.createRoadStreet(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新街道") - @PreAuthorize("@ss.hasPermission('garden:road-street:update')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:update')") public CommonResult updateRoadStreet(@Valid @RequestBody RoadStreetSaveReqVO updateReqVO) { roadStreetService.updateRoadStreet(updateReqVO); return success(true); @@ -56,7 +56,7 @@ public class RoadStreetController { @DeleteMapping("/delete") @Operation(summary = "删除街道") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('garden:road-street:delete')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:delete')") public CommonResult deleteRoadStreet(@RequestParam("id") Long id) { roadStreetService.deleteRoadStreet(id); return success(true); @@ -65,7 +65,7 @@ public class RoadStreetController { @DeleteMapping("/delete-list") @Parameter(name = "ids", description = "编号", required = true) @Operation(summary = "批量删除街道") - @PreAuthorize("@ss.hasPermission('garden:road-street:delete')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:delete')") public CommonResult deleteRoadStreetList(@RequestParam("ids") List ids) { roadStreetService.deleteRoadStreetListByIds(ids); return success(true); @@ -74,7 +74,7 @@ public class RoadStreetController { @GetMapping("/get") @Operation(summary = "获得街道") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('garden:road-street:query')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:query')") public CommonResult getRoadStreet(@RequestParam("id") Long id) { RoadStreetDO roadStreet = roadStreetService.getRoadStreet(id); return success(BeanUtils.toBean(roadStreet, RoadStreetRespVO.class)); @@ -90,7 +90,7 @@ public class RoadStreetController { @GetMapping("/page") @Operation(summary = "获得街道分页") - @PreAuthorize("@ss.hasPermission('garden:road-street:query')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:query')") public CommonResult> getRoadStreetPage(@Valid RoadStreetPageReqVO pageReqVO) { PageResult pageResult = roadStreetService.getRoadStreetPage(pageReqVO); return success(BeanUtils.toBean(pageResult, RoadStreetRespVO.class)); @@ -98,7 +98,7 @@ public class RoadStreetController { @GetMapping("/export-excel") @Operation(summary = "导出街道 Excel") - @PreAuthorize("@ss.hasPermission('garden:road-street:export')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:export')") @ApiAccessLog(operateType = EXPORT) public void exportRoadStreetExcel(@Valid RoadStreetPageReqVO pageReqVO, HttpServletResponse response) throws IOException { @@ -109,4 +109,4 @@ public class RoadStreetController { BeanUtils.toBean(list, RoadStreetRespVO.class)); } -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/assigntasksinfo/AssignTasksInfoDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/assigntasksinfo/AssignTasksInfoDO.java index ea1b666..c98d671 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/assigntasksinfo/AssignTasksInfoDO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/assigntasksinfo/AssignTasksInfoDO.java @@ -38,7 +38,7 @@ public class AssignTasksInfoDO extends BaseDO { /** * 单位ID(关联单位表主键) */ - private String companyId; + private Long companyId; /** * 单位ID(关联单位表主键) */ diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java index 402adb3..1d6e876 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java @@ -98,7 +98,7 @@ public interface ErrorCodeConstants { ErrorCode PLAN_RATE_DETAIL_EXISTS = new ErrorCode(1-100-007-003, "计划频次已存在"); ErrorCode PLAN_RATE_VALUE_ERROR = new ErrorCode(1-100-007-004, "次数值范围:1-10或者分数格式:1/3"); ErrorCode PLAN_RATE_VALUE_INTEGER_ERROR = new ErrorCode(1-100-007-005, "临时计划-次数值范围:1-10的整数"); - + ErrorCode PLAN_NAME_EXISTED = new ErrorCode(1-100-007-006, "计划名称已存在"); ErrorCode MATERIAL_TYPE_NOT_EXISTS = new ErrorCode(1-100-004-001, "物料类型不存在"); ErrorCode MATERIAL_TYPE_MANAGER_NOT_EXISTS = new ErrorCode(1-100-004-002, "耗材类别管理不存在"); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java index 8bc015e..3900b58 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java @@ -92,7 +92,7 @@ public class AssignTasksServiceImpl implements AssignTasksService { assignTasksMapper.updateById(updateObj); // 1. 处理关联的单位任务信息(仅当存在单位ID列表时) - List companyIds = updateReqVO.getCompanyIds(); + List companyIds = updateReqVO.getCompanyIds(); // add by wq 20251116 List assignTaskInfoList = assignTasksInfoMapper.selectList(AssignTasksInfoDO::getTaskId, updateObj.getId()); if (CollectionUtils.isEmpty(assignTaskInfoList)) { @@ -113,11 +113,11 @@ public class AssignTasksServiceImpl implements AssignTasksService { //获取已添加单位集合 - List existingCompanyIds = assignTaskInfoList.stream() - .map(info -> String.valueOf(info.getCompanyId())) + List existingCompanyIds = assignTaskInfoList.stream() + .map(info -> info.getCompanyId()) .collect(Collectors.toList()); //排除 existingCompanyIds 中的元素 作为新增的单位 - List filteredCompanyIds = companyIds.stream() + List filteredCompanyIds = companyIds.stream() .filter(Objects::nonNull) .filter(id -> !existingCompanyIds.contains(id)) // 直接用列表 contains() .collect(Collectors.toList()); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java index 1a93180..616f11b 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java @@ -70,7 +70,7 @@ public interface AssignTasksInfoService { * @param assignTasks * @Return java.lang.Long */ - public void saveAssignTasksInfos(List companyIds, AssignTasksDO assignTasks); + public void saveAssignTasksInfos(List companyIds, AssignTasksDO assignTasks); /** * @Author wangqian diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java index 51d60cf..a3dbc3f 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java @@ -126,7 +126,7 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { } @Override - public void saveAssignTasksInfos(List companyIds, AssignTasksDO assignTasks) { + public void saveAssignTasksInfos(List companyIds, AssignTasksDO assignTasks) { // 获得用户基本信息 if (companyIds != null && companyIds.size() > 0) { //1、获取单位集合 @@ -140,7 +140,7 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { dept -> dept.getName().trim(), // value 映射:取 companyName(去空格) (oldValue, newValue) -> newValue )); - for (String companyId : companyIds) { + for (Long companyId : companyIds) { AssignTasksInfoDO assignTaskInfo = new AssignTasksInfoDO(); assignTaskInfo.setCompanyId(companyId); assignTaskInfo.setCompanyName(companyIdToNameMap.get(Long.valueOf(companyId))); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanServiceImpl.java index 2085c72..7d57958 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanServiceImpl.java @@ -148,7 +148,12 @@ public class InspectionPlanServiceImpl implements InspectionPlanService { String planAttrLabel = DictFrameworkUtils.parseDictDataLabel(PlanConstants.GARDEN_PLAN_ATTR_REDIS_KEY, createReqVO.getPlanAttr()); String planTypeIdLabel = DictFrameworkUtils.parseDictDataLabel(PlanConstants.INSPECTION_MAINTAIN_TYPE, createReqVO.getPlanTypeId()); String planNameSuffix = StringUtil.isNotEmpty(createReqVO.getPlanNameSuffix()) ? createReqVO.getPlanNameSuffix() : ""; - inspectionPlan.setPlanName(roadReqVO.getRoadName() + planAttrLabel + planTypeIdLabel + planNameSuffix); + String planName = roadReqVO.getRoadName() + planAttrLabel + planTypeIdLabel + planNameSuffix; + InspectionPlanDO existInspectionPlan = inspectionPlanMapper.selectOne(new QueryWrapper().lambda().eq(InspectionPlanDO::getPlanName, planName)); + if (existInspectionPlan != null) { + throw exception(PLAN_NAME_EXISTED, planName); + } + inspectionPlan.setPlanName(planName); inspectionPlanList.add(inspectionPlan); /*2.插入角色*/ createReqVO.getRoleIds().forEach(roleId -> { @@ -244,17 +249,18 @@ public class InspectionPlanServiceImpl implements InspectionPlanService { .ge(InspectionPlanDO::getEndTime, req.getBeginTime()); // end_time >= startTime count = inspectionPlanMapper.selectCount(sql); - } else { - QueryWrapper sql = new QueryWrapper<>(); - sql.lambda().eq(InspectionPlanDO::getPlanTypeId, req.getPlanTypeId()) - .in(InspectionPlanDO::getRoadId, roadIds) - .eq(InspectionPlanDO::getDeleted, 0) - .eq(InspectionPlanDO::getPlanAttr, 2) //临时计划 - .le(InspectionPlanDO::getBeginTime, req.getEndTime()) // start_time <= endTime - .ge(InspectionPlanDO::getEndTime, req.getBeginTime()); // end_time >= startTime - - count = inspectionPlanMapper.selectCount(sql); } +// else { +// QueryWrapper sql = new QueryWrapper<>(); +// sql.lambda().eq(InspectionPlanDO::getPlanTypeId, req.getPlanTypeId()) +// .in(InspectionPlanDO::getRoadId, roadIds) +// .eq(InspectionPlanDO::getDeleted, 0) +// .eq(InspectionPlanDO::getPlanAttr, 2) //临时计划 +// .le(InspectionPlanDO::getBeginTime, req.getEndTime()) // start_time <= endTime +// .ge(InspectionPlanDO::getEndTime, req.getBeginTime()); // end_time >= startTime +// +// count = inspectionPlanMapper.selectCount(sql); +// } if (count > 0) { throw exception(INSPECTION_PLAN_EXISTS); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanServiceImpl.java index bd41119..c66da31 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanServiceImpl.java @@ -124,7 +124,7 @@ public class MaintainPlanServiceImpl implements MaintainPlanService { calculate.add(periodResult); planNum = Integer.parseInt(createReqVO.getRateValue()); }else{ - calculate= TimeIntervalFrequencyUtil.calculate(createReqVO.getBeginTime().toString(), createReqVO.getEndTime().toString(), rateValue, createReqVO.getCycleId()); + calculate= TimeIntervalFrequencyUtil.calculateNew(createReqVO.getBeginTime().toString(), createReqVO.getEndTime().toString(), rateValue, createReqVO.getCycleId()); if (CollectionUtils.isEmpty(calculate)) { log.warn("获取两个时间之间间隔天数错误"); return CommonResult.error(INSPECTION_CYCLE_ERROR); @@ -158,9 +158,15 @@ public class MaintainPlanServiceImpl implements MaintainPlanService { maintainPlan.setRoadName(roadReqVO.getRoadName()); //计划属性label String planAttrLabel = DictFrameworkUtils.parseDictDataLabel(PlanConstants.GARDEN_PLAN_ATTR_REDIS_KEY, createReqVO.getPlanAttr()); - String planTypeIdLabel = DictFrameworkUtils.parseDictDataLabel(PlanConstants.INSPECTION_MAINTAIN_TYPE, createReqVO.getPlanTypeId()); + String planTypeIdLabel = DictFrameworkUtils.parseDictDataLabel(PlanConstants.MAINTAIN_TYPE, createReqVO.getPlanTypeId()); String planNameSuffix = StringUtil.isNotEmpty(createReqVO.getPlanNameSuffix()) ? createReqVO.getPlanNameSuffix() : ""; - maintainPlan.setPlanName(roadReqVO.getRoadName() + planAttrLabel + planTypeIdLabel + planNameSuffix); + String planName = roadReqVO.getRoadName() + planAttrLabel + planTypeIdLabel + planNameSuffix; + MaintainPlanDO existMaintainPlan = maintainPlanMapper.selectOne(new QueryWrapper().lambda().eq(MaintainPlanDO::getPlanName, planName)); + if (existMaintainPlan != null) { + throw exception(PLAN_NAME_EXISTED, planName); + } + + maintainPlan.setPlanName(planName); maintainPlanList.add(maintainPlan); /*2.插入角色*/ createReqVO.getRoleIds().forEach(roleId -> { @@ -262,17 +268,18 @@ public class MaintainPlanServiceImpl implements MaintainPlanService { .ge(MaintainPlanDO::getEndTime, req.getBeginTime()); // end_time >= startTime count = maintainPlanMapper.selectCount(sql); - } else { - QueryWrapper sql = new QueryWrapper<>(); - sql.lambda().eq(MaintainPlanDO::getPlanTypeId, req.getPlanTypeId()) - .in(MaintainPlanDO::getRoadId, roadIds) - .eq(MaintainPlanDO::getDeleted, 0) - .eq(MaintainPlanDO::getPlanAttr, 2) //临时计划 - .le(MaintainPlanDO::getBeginTime, req.getEndTime()) // start_time <= endTime - .ge(MaintainPlanDO::getEndTime, req.getBeginTime()); // end_time >= startTime - - count = maintainPlanMapper.selectCount(sql); } +// else { +// QueryWrapper sql = new QueryWrapper<>(); +// sql.lambda().eq(MaintainPlanDO::getPlanTypeId, req.getPlanTypeId()) +// .in(MaintainPlanDO::getRoadId, roadIds) +// .eq(MaintainPlanDO::getDeleted, 0) +// .eq(MaintainPlanDO::getPlanAttr, 2) //临时计划 +// .le(MaintainPlanDO::getBeginTime, req.getEndTime()) // start_time <= endTime +// .ge(MaintainPlanDO::getEndTime, req.getBeginTime()); // end_time >= startTime +// +// count = maintainPlanMapper.selectCount(sql); +// } if (count > 0) { throw exception(INSPECTION_PLAN_EXISTS); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/StringValidateUtil.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/StringValidateUtil.java index aa9065a..5f4c322 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/StringValidateUtil.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/StringValidateUtil.java @@ -3,13 +3,13 @@ package com.zteits.urbanops.module.garden.util; import java.util.regex.Pattern; /** - * 字符串校验工具:校验是否为1-20的整数或合法分数(如1/3) + * 字符串校验工具:校验是否为1-1000的整数或合法分数(如1/3) */ public class StringValidateUtil { - // 正则表达式:匹配1-10的数字 或 分子/分母(分子、分母均为1-10的数字) + // 正则表达式:匹配1-1000的数字 或 分子/分母(分子、分母均为1-100的数字) private static final Pattern PATTERN = Pattern.compile( - "^(?:[1-9]|10)$|^(?:[1-9]|10)/(?:[1-9]|10)$" + "^(?:[1-9]|[1-9]\\d|1\\d{2}|1000)$|^(?:[1-9]|[1-9]\\d|100)/(?:[1-9]|[1-9]\\d|100)$" ); /** @@ -38,7 +38,7 @@ public class StringValidateUtil { // 检查是否为纯数字 if (isNumber(input)) { int num = Integer.parseInt(input); - return num >= 1 && num <= 10; + return num >= 1 && num <= 1000; } // 检查是否为分数格式 @@ -52,7 +52,7 @@ public class StringValidateUtil { return false; } int numerator = Integer.parseInt(parts[0]); - if (numerator < 1 || numerator > 10) { + if (numerator < 1 || numerator > 100) { return false; } // 校验分母 @@ -60,7 +60,7 @@ public class StringValidateUtil { return false; } int denominator = Integer.parseInt(parts[1]); - return denominator >= 1 && denominator <= 10; + return denominator >= 1 && denominator <= 100; } // 既不是数字也不是分数 @@ -107,7 +107,7 @@ public class StringValidateUtil { // 3. 转换为数字并校验范围 try { int number = Integer.parseInt(str); - return number >= 1 && number <= 10; + return number >= 1 && number <= 100; } catch (NumberFormatException e) { // 理论上不会走到这里(已通过正则校验),兜底处理 return false; diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/timeinterval/TimeIntervalFrequencyUtil.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/timeinterval/TimeIntervalFrequencyUtil.java index 88fd2f8..fdb19c2 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/timeinterval/TimeIntervalFrequencyUtil.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/timeinterval/TimeIntervalFrequencyUtil.java @@ -2,6 +2,7 @@ package com.zteits.urbanops.module.garden.util.timeinterval; import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -38,6 +39,82 @@ public class TimeIntervalFrequencyUtil { * @param cycleId 1:日/次;2:周/次;3:月/次;4:年/次;5:按次;6:季度;7:半年 * @return 划分结果列表 */ + /** + * 计算时间段划分结果(基于固定天数换算) + * + * @param startStr 开始日期 (yyyy-MM-dd) + * @param endStr 结束日期 (yyyy-MM-dd) + * @param freq 频次值,格式 "x/y",其中 x 为每周期次数,y 为周期数量 + * @param cycleId 周期类型:1:日/次;2:周/次;3:月/次;4:年/次;5:按次;6:季度;7:半年 + * @return 时间段划分结果列表,包含每个时间段的开始日期、结束日期和执行次数 + */ + public static List calculateNew(String startStr, String endStr, String freq, Integer cycleId) { + // 解析日期参数 + LocalDate startDate = LocalDate.parse(startStr, FORMATTER); + LocalDate endDate = LocalDate.parse(endStr, FORMATTER); + + // 边界条件:开始日期晚于结束日期时返回空列表 + if (startDate.isAfter(endDate)) { + return Collections.emptyList(); + } + + // 解析频次参数 (格式: "x/y") + String[] freqParts = freq.split("/", 2); + if (freqParts.length != 2) { + throw new IllegalArgumentException(String.format("频次值格式错误,应为 'x/y': %s", freq)); + } + int timesPerPeriod = Integer.parseInt(freqParts[0]); // 每周期执行次数 + int periodCount = Integer.parseInt(freqParts[1]); // 周期数量 + + // 计算周期相关天数 + long daysPerPeriod = convertToDaysNew(periodCount, cycleId); // 单个周期的天数 + long totalPeriodDays = daysPerPeriod * periodCount; // 总周期天数 + + List resultList = new ArrayList<>(); + LocalDate segmentStart = startDate; + + // 循环划分时间段 + while (!segmentStart.isAfter(endDate)) { + // 计算当前时间段的理论结束日期(segmentStart + totalPeriodDays - 1) + LocalDate segmentEnd = safePlusDays(segmentStart, totalPeriodDays - 1); + + // 如果理论结束日期超过总结束日期,则截断 + if (segmentEnd.isAfter(endDate)) { + segmentEnd = endDate; + } + + // 计算当前时间段的实际天数(包含开始和结束日期) + long daysInSegment = ChronoUnit.DAYS.between(segmentStart, segmentEnd) + 1; + + // 计算当前时间段的执行次数:(实际天数/周期天数) * 每周期次数,向上取整 + double proportion = (double) daysInSegment / daysPerPeriod; + int executionCount = (int) Math.ceil(proportion * timesPerPeriod); + + // 添加当前时间段结果 + resultList.add(new PeriodResult(segmentStart, segmentEnd, executionCount)); + + // 计算下一个时间段的开始日期(当前结束日期的次日) + LocalDate nextSegmentStart = segmentEnd.plusDays(1); + + // 如果下一个开始日期超过总结束日期,则退出循环 + if (nextSegmentStart.isAfter(endDate)) { + break; + } + + segmentStart = nextSegmentStart; + } + + return resultList; + } + /** + * 计算时间段划分结果(基于固定天数换算) + * + * @param startStr 开始日期 (yyyy-MM-dd) + * @param endStr 结束日期 (yyyy-MM-dd) + * @param freq 频次值,格式 "x/y" + * @param cycleId 1:日/次;2:周/次;3:月/次;4:年/次;5:按次;6:季度;7:半年 + * @return 划分结果列表 + */ public static List calculate(String startStr, String endStr, String freq, Integer cycleId) { LocalDate start = LocalDate.parse(startStr, FORMATTER); LocalDate end = LocalDate.parse(endStr, FORMATTER); @@ -77,10 +154,45 @@ public class TimeIntervalFrequencyUtil { return results; } - /** * 将 y 个单位转换为固定天数 - * 1:日/次;2:周/次;3:月/次;4:年/次;5:按次;6:季度;7:半年 + * TIME(0, "次"), + * DAY(1, "次/日"), + * WEEK(2, "次/周"), + * MONTH(3, "次/月"), + * QUARTER(4, "次/季"), + * SEMIANNUAL(5, "次/半年"), + * YEAR(6, "次/年"); + */ + private static long convertToDaysNew(int y, Integer cycleId) { + switch (cycleId) { + case 1: // DAY + return 1; + case 2: // WEEK + return (long) 7; + case 3: // MONTH + return (long) 30; + case 6: // YEAR + return (long) 365; + case 0: // TIME + return 9999; // 按次:将整个时间段视为1个周期 + case 4: // QUARTER + return (long) 90; // 1季度=3个月=90天 + case 5: // SEMIANNUAL + return (long) 180; // 半年=6个月=180天 + default: + throw new IllegalArgumentException("无效的周期ID: " + cycleId); + } + } + /** + * 将 y 个单位转换为固定天数 + * TIME(0, "次"), + * DAY(1, "次/日"), + * WEEK(2, "次/周"), + * MONTH(3, "次/月"), + * QUARTER(4, "次/季"), + * SEMIANNUAL(5, "次/半年"), + * YEAR(6, "次/年"); */ private static long convertToDays(int y, Integer cycleId) { switch (cycleId) { @@ -90,13 +202,13 @@ public class TimeIntervalFrequencyUtil { return (long) y * 7; case 3: // MONTH return (long) y * 30; - case 4: // YEAR + case 6: // YEAR return (long) y * 365; - case 5: // TIME + case 0: // TIME return 1; // 按次:将整个时间段视为1个周期 - case 6: // QUARTER + case 4: // QUARTER return (long) y * 90; // 1季度=3个月=90天 - case 7: // SEMIANNUAL + case 5: // SEMIANNUAL return (long) y * 180; // 半年=6个月=180天 default: throw new IllegalArgumentException("无效的周期ID: " + cycleId); @@ -117,52 +229,56 @@ public class TimeIntervalFrequencyUtil { // ====================== 测试用例 ====================== public static void main(String[] args) { - //1:日/次;2:周/次;3:月/次;4:年/次 - System.out.println("=== 示例1:每2天3次(即:3/2),按日 ===2025-12-01 2025-12-31"); - List r1 = calculate("2025-12-01", "2025-12-31", "3/2", 1); - r1.forEach(System.out::println); - // 输出: - // 2025-01-01 2025-01-03 1次 - // 2025-01-04 2025-01-06 1次 - // 2025-01-07 2025-01-07 1次 - System.out.println("\n=== 示例2:每2周3次(即:3/2)(14天),按周 ===2025-12-01 2025-12-10"); - List r2 = calculate("2025-12-01", "2025-12-10", "3/2", 2); + + List r2 = calculateNew("2026-01-01", "2026-02-15", "7/1", 2); r2.forEach(System.out::println); - // 每2周 = 14天 - // 2025-01-01 ~ 2025-01-14 - // 2025-01-15 ~ 2025-01-28 - // 2025-01-29 ~ 2025-02-08(剩余11天) - System.out.println("\n=== 示例3:每2个月4次(即:4/2)(30天),按月 === 2025-09-15 2025-12-31"); - List r3 = calculate("2025-09-15", "2025-12-31", "4/2", 3); - r3.forEach(System.out::println); - // 每1月 = 30天 - // 2025-01-01 ~ 2025-01-30 - // 2025-01-31 ~ 2025-02-28(30天?→ 实际是29天,但按30天算) - // 2025-03-01 ~ 2025-03-15(不足) - - System.out.println("\n=== 示例4:每2年1次(即:1/2)(730天),按年 ===2025-01-01 2030-01-01"); - List r4 = calculate("2025-01-01", "2030-01-01", "1/2", 4); - r4.forEach(System.out::println); - // 每2年 = 730天 - // 2025-01-01 ~ 2025-12-26(+729d) - // 2025-12-27 ~ 2027-12-21 - // 2027-12-22 ~ 2029-12-16 - // 2029-12-17 ~ 2030-01-01(最后一段) - System.out.println("\n=== 示例5:每1年4次(即:4/1),按年(测试)=== 2023-09-15 2025-01-31"); - List r5 = calculate("2023-09-15", "2025-01-31", "4/1", 4); - r5.forEach(System.out::println); - - // 新增示例:按次、季度、半年 - System.out.println("\n=== 示例6:按次单位,整个时间段算1个周期 === 2025-01-01 2025-12-31"); - List r6 = calculate("2025-01-01", "2025-12-31", "2/1", 5); - r6.forEach(System.out::println); - - System.out.println("\n=== 示例7:每1季度2次(即:2/1),按季度(90天)=== 2025-01-01 2025-12-31"); - List r7 = calculate("2025-01-01", "2025-12-31", "2/1", 6); - r7.forEach(System.out::println); - - System.out.println("\n=== 示例8:每1半年3次(即:3/1),按半年(180天)=== 2025-01-01 2025-12-31"); - List r8 = calculate("2025-01-01", "2025-12-31", "3/1", 7); - r8.forEach(System.out::println); + +// //1:日/次;2:周/次;3:月/次;4:年/次 +// System.out.println("=== 示例1:每2天3次(即:3/2),按日 ===2025-12-01 2025-12-31"); +// List r1 = calculate("2025-12-01", "2025-12-31", "3/2", 1); +// r1.forEach(System.out::println); +// // 输出: +// // 2025-01-01 2025-01-03 1次 +// // 2025-01-04 2025-01-06 1次 +// // 2025-01-07 2025-01-07 1次 +// System.out.println("\n=== 示例2:每2周3次(即:3/2)(14天),按周 ===2025-12-01 2025-12-10"); +// List r2 = calculate("2025-12-01", "2025-12-10", "3/2", 2); +// r2.forEach(System.out::println); +// // 每2周 = 14天 +// // 2025-01-01 ~ 2025-01-14 +// // 2025-01-15 ~ 2025-01-28 +// // 2025-01-29 ~ 2025-02-08(剩余11天) +// System.out.println("\n=== 示例3:每2个月4次(即:4/2)(30天),按月 === 2025-09-15 2025-12-31"); +// List r3 = calculate("2025-09-15", "2025-12-31", "4/2", 3); +// r3.forEach(System.out::println); +// // 每1月 = 30天 +// // 2025-01-01 ~ 2025-01-30 +// // 2025-01-31 ~ 2025-02-28(30天?→ 实际是29天,但按30天算) +// // 2025-03-01 ~ 2025-03-15(不足) +// +// System.out.println("\n=== 示例4:每2年1次(即:1/2)(730天),按年 ===2025-01-01 2030-01-01"); +// List r4 = calculate("2025-01-01", "2030-01-01", "1/2", 4); +// r4.forEach(System.out::println); +// // 每2年 = 730天 +// // 2025-01-01 ~ 2025-12-26(+729d) +// // 2025-12-27 ~ 2027-12-21 +// // 2027-12-22 ~ 2029-12-16 +// // 2029-12-17 ~ 2030-01-01(最后一段) +// System.out.println("\n=== 示例5:每1年4次(即:4/1),按年(测试)=== 2023-09-15 2025-01-31"); +// List r5 = calculate("2023-09-15", "2025-01-31", "4/1", 4); +// r5.forEach(System.out::println); +// +// // 新增示例:按次、季度、半年 +// System.out.println("\n=== 示例6:按次单位,整个时间段算1个周期 === 2025-01-01 2025-12-31"); +// List r6 = calculate("2025-01-01", "2025-12-31", "2/1", 5); +// r6.forEach(System.out::println); +// +// System.out.println("\n=== 示例7:每1季度2次(即:2/1),按季度(90天)=== 2025-01-01 2025-12-31"); +// List r7 = calculate("2025-01-01", "2025-12-31", "2/1", 6); +// r7.forEach(System.out::println); +// +// System.out.println("\n=== 示例8:每1半年3次(即:3/1),按半年(180天)=== 2025-01-01 2025-12-31"); +// List r8 = calculate("2025-01-01", "2025-12-31", "3/1", 7); +// r8.forEach(System.out::println); } } diff --git a/urbanops-module-garden/src/main/resources/mapper/inspectionplan/InspectionPlanCommitMapper.xml b/urbanops-module-garden/src/main/resources/mapper/inspectionplan/InspectionPlanCommitMapper.xml index 3018978..18c8ffd 100644 --- a/urbanops-module-garden/src/main/resources/mapper/inspectionplan/InspectionPlanCommitMapper.xml +++ b/urbanops-module-garden/src/main/resources/mapper/inspectionplan/InspectionPlanCommitMapper.xml @@ -85,7 +85,12 @@ AND a.remark LIKE CONCAT('%', #{req.remark} ,'%') - + + = #{req.createTimeStart}]]> + + + + order by a.id desc @@ -133,4 +138,4 @@ - \ No newline at end of file + diff --git a/urbanops-module-garden/src/main/resources/mapper/inspectionplan/InspectionPlanMapper.xml b/urbanops-module-garden/src/main/resources/mapper/inspectionplan/InspectionPlanMapper.xml index ec6795d..66033c2 100644 --- a/urbanops-module-garden/src/main/resources/mapper/inspectionplan/InspectionPlanMapper.xml +++ b/urbanops-module-garden/src/main/resources/mapper/inspectionplan/InspectionPlanMapper.xml @@ -24,8 +24,10 @@ a.finish_state, a.begin_time, a.end_time - FROM - garden_inspection_plan a + FROM garden_inspection_plan a JOIN -- 建议用显式JOIN代替隐式连接,可读性更高 + garden_inspection_plan_detail b ON + a.batch_no = b.batch_no + AND a.deleted = b.deleted WHERE a.deleted = 0 AND a.road_name LIKE CONCAT('%',#{req.roadName},'%') @@ -44,14 +46,17 @@ + and b.finish_state = #{req.finishState} - and a.finish_state = #{req.finishState} + and b.finish_state = #{req.finishState} - and a.finish_state = #{req.finishState} + and b.finish_state = #{req.finishState} = #{req.localDate}]]> + = #{req.localDate}]]> + - \ No newline at end of file + diff --git a/urbanops-module-garden/src/main/resources/mapper/maintainplan/MaintainPlanCommitMapper.xml b/urbanops-module-garden/src/main/resources/mapper/maintainplan/MaintainPlanCommitMapper.xml index 61ac704..01e3779 100644 --- a/urbanops-module-garden/src/main/resources/mapper/maintainplan/MaintainPlanCommitMapper.xml +++ b/urbanops-module-garden/src/main/resources/mapper/maintainplan/MaintainPlanCommitMapper.xml @@ -76,6 +76,12 @@ AND DATE_FORMAT(c.finish_time, '%Y-%m-%d') = #{req.finishTime} + + = #{req.createTimeStart}]]> + + + + diff --git a/urbanops-module-garden/src/main/resources/mapper/maintainplan/MaintainPlanMapper.xml b/urbanops-module-garden/src/main/resources/mapper/maintainplan/MaintainPlanMapper.xml index 139e81c..51927e9 100644 --- a/urbanops-module-garden/src/main/resources/mapper/maintainplan/MaintainPlanMapper.xml +++ b/urbanops-module-garden/src/main/resources/mapper/maintainplan/MaintainPlanMapper.xml @@ -26,8 +26,12 @@ a.end_time FROM garden_maintain_plan a - WHERE a.deleted=0 - + JOIN -- 建议用显式JOIN代替隐式连接,可读性更高 + garden_maintain_plan_detail b ON + a.batch_no = b.batch_no + AND a.deleted = b.deleted + WHERE a.deleted = 0 + AND a.road_name LIKE CONCAT('%',#{req.roadName},'%') @@ -44,15 +48,17 @@ - and a.finish_state = #{req.finishState} + and b.finish_state = #{req.finishState} - and a.finish_state = #{req.finishState} + and b.finish_state = #{req.finishState} - and a.finish_state = #{req.finishState} + and b.finish_state = #{req.finishState} = #{req.localDate}]]> + = #{req.localDate}]]> + @@ -103,6 +109,8 @@ and c.finish_state = #{req.finishState} = #{req.localDateTime}]]> + + diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/attachment/AttachmentController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/attachment/AttachmentController.java index 1c21434..874ed6e 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/attachment/AttachmentController.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/attachment/AttachmentController.java @@ -101,4 +101,11 @@ public class AttachmentController { BeanUtils.toBean(list, AttachmentRespVO.class)); } -} \ No newline at end of file + @PostMapping("/getByCondition") + @Operation(summary = "获得工单附件信息") + @PreAuthorize("@ss.hasPermission('workorder:attachment:query')") + public CommonResult> getAttachmentByCondition(@Valid @RequestBody AttachmentReqVO reqVO) { + List attachment = attachmentService.getAttachmentByCondition(reqVO); + return success(BeanUtils.toBean(attachment, AttachmentRespVO.class)); + } +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/attachment/vo/AttachmentPageReqVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/attachment/vo/AttachmentPageReqVO.java index e6090c3..d00963a 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/attachment/vo/AttachmentPageReqVO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/attachment/vo/AttachmentPageReqVO.java @@ -19,7 +19,7 @@ public class AttachmentPageReqVO extends PageParam { @Schema(description = "业务线:yl 园林,wy 物业,sz 市政 ") private String busiLine; - @Schema(description = "业务类型:01 问题图片,02 街道图片,03 选景图片", example = "1") + @Schema(description = "业务类型:01 问题图片,02 进行中图片,03 已完成图片", example = "01") private String busiType; @Schema(description = "文件名称") @@ -41,4 +41,4 @@ public class AttachmentPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; -} \ No newline at end of file +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/attachment/vo/AttachmentReqVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/attachment/vo/AttachmentReqVO.java new file mode 100644 index 0000000..5ed9651 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/attachment/vo/AttachmentReqVO.java @@ -0,0 +1,25 @@ +package com.zteits.urbanops.module.workorder.controller.admin.attachment.vo; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 工单附件信息分页 Request VO") +@Data +public class AttachmentReqVO extends PageParam { + + @Schema(description = "工单号") + private String orderNo; + + @Schema(description = "业务线:yl 园林,wy 物业,sz 市政 ") + private String busiLine; + + @Schema(description = "业务类型:01 问题图片,02 进行中图片,03 已完成图片", example = "01") + private String busiType; + +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/MainInfoHasTaskPageReqVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/MainInfoHasTaskPageReqVO.java new file mode 100644 index 0000000..28e65de --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/maininfo/vo/MainInfoHasTaskPageReqVO.java @@ -0,0 +1,52 @@ +package com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * 类描述:工单工作流分页请求 reqVO + * 创建人:yanhuiqing + * 创建时间:2025/12/15 21:41 + * 修改人:yanhuiqing + * 修改时间:2025/12/15 21:41 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Schema(description = "管理后台 - 工单工作流信息分页 Request VO") +@Data +public class MainInfoHasTaskPageReqVO extends PageParam { + @NotNull + @Schema(description = "任务指派人", example = "admin") + private Long userId; + @Schema(description = "流程定义key", example = "quik_local_test") + private String key; + @Schema(description = "开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] startTime; + @Schema(description = "结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] endTime; + @Schema(description = "业务线:yl 园林,wy 物业,sz 市政 ") + private String busiLine; + @Schema(description = "工单号") + private String orderNo; + @Schema(description = "工单名称", example = "张三") + private String orderName; + @Schema(description = "工单描述", example = "你说的对") + private String remark; + @Schema(description = "道路名称", example = "王五") + private String roadName; + @Schema(description = "街道名称", example = "芋艿") + private String streetName; + @Schema(description = "养护级别ID", example = "1") + private Integer curingLevelId; +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/MaterialDetailController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/MaterialDetailController.java index 4b2d08b..d4d92d9 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/MaterialDetailController.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/MaterialDetailController.java @@ -101,4 +101,17 @@ public class MaterialDetailController { BeanUtils.toBean(list, MaterialDetailRespVO.class)); } -} \ No newline at end of file + /** + * 批量创建物料明细 + * @param materialDetailSaveReqVOs 物料明细保存请求列表 + * @return 统一响应结果 + */ + @PostMapping("/batch-create") + @Operation(summary = "批量创建工单耗材明细") + @PreAuthorize("@ss.hasPermission('workorder:material-detail:create')") + public CommonResult batchCreateMaterialDetail( + @RequestBody @Valid List materialDetailSaveReqVOs) { + return success(materialDetailService.batchCreateMaterialDetail(materialDetailSaveReqVOs)); + } + +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/vo/MaterialDetailSaveReqVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/vo/MaterialDetailSaveReqVO.java index fd21287..add5ea8 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/vo/MaterialDetailSaveReqVO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/admin/materialdetail/vo/MaterialDetailSaveReqVO.java @@ -16,14 +16,6 @@ public class MaterialDetailSaveReqVO { @NotEmpty(message = "工单号不能为空") private String orderNo; - @Schema(description = "提交用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10300") - @NotNull(message = "提交用户ID不能为空") - private Long userId; - - @Schema(description = "提交用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") - @NotEmpty(message = "提交用户名称不能为空") - private String userName; - @Schema(description = "种类ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "27821") @NotNull(message = "种类ID不能为空") private Long classifyId; @@ -60,7 +52,17 @@ public class MaterialDetailSaveReqVO { private String status; @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对") - @NotEmpty(message = "描述不能为空") private String remark; -} \ No newline at end of file + /*耗材ID*/ + @Schema(description = "耗材ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "111") + @NotNull(message = "物料ID不能为空") + private Long materialId; + + /** + * 耗材名称 + */ + @Schema(description = "耗材名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "耗材名称") + @NotEmpty(message = "耗材名称不能为空") + private String materialName; +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderController.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderController.java index 6f47346..bc58882 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderController.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/AppGardenWorkOrderController.java @@ -104,7 +104,7 @@ public class AppGardenWorkOrderController { } @PutMapping("/return") - @Operation(summary = "退回任务", description = "用于【流程详情】的【退回】按钮") + @Operation(summary = " app - 退回任务", description = "用于【流程详情】的【退回】按钮") //@PreAuthorize("@ss.hasPermission('bpm:garden-workorder:update')") public CommonResult returnTask(@Valid @RequestBody AppGardenTaskReturnReqVO reqVO) { gardenService.returnTask(reqVO); @@ -112,7 +112,7 @@ public class AppGardenWorkOrderController { } @PutMapping("/withdraw") - @Operation(summary = "撤回任务") + @Operation(summary = "app - 撤回任务") //@PreAuthorize("@ss.hasPermission('bpm:garden-workorder:update')") public CommonResult withdrawTask(@RequestParam("taskId") String taskId) { gardenService.withdrawTask(taskId); @@ -120,7 +120,7 @@ public class AppGardenWorkOrderController { } @PutMapping("/delegate") - @Operation(summary = "委派任务", description = "用于【流程详情】的【委派】按钮") + @Operation(summary = "app - 委派任务", description = "用于【流程详情】的【委派】按钮") //@PreAuthorize("@ss.hasPermission('bpm:garden-workorder:update')") public CommonResult delegateTask(@Valid @RequestBody AppGardenTaskDelegateReqVO reqVO) { gardenService.delegateTask(reqVO); @@ -128,7 +128,7 @@ public class AppGardenWorkOrderController { } @PutMapping("/transfer") - @Operation(summary = "转派任务", description = "用于【流程详情】的【转派】按钮") + @Operation(summary = "app - 转派任务", description = "用于【流程详情】的【转派】按钮") //@PreAuthorize("@ss.hasPermission('bpm:garden-workorder:update')") public CommonResult transferTask(@Valid @RequestBody AppGardenTaskTransferReqVO reqVO) { gardenService.transferTask(reqVO); @@ -149,4 +149,19 @@ public class AppGardenWorkOrderController { PageResult pageResult = gardenService.getTaskTodoPage(pageVO); return success(pageResult); } + + @GetMapping("doneBuzSimplePage") + @Operation(summary = "app - 获取工单业务已办任务分页") + //@PreAuthorize("@ss.hasPermission('bpm:garden-workorder:query')") + public CommonResult> getTaskDoneBuzSimplePage(@Valid AppGardenWorkOrderPageReqVO pageVO) { + PageResult pageResult = gardenService.getTaskDoneBuzSimplePage(pageVO); + return success(pageResult); + } + @GetMapping("todoBuzSimplePage") + @Operation(summary = "app - 获取工单业务待办任务分页") + //@PreAuthorize("@ss.hasPermission('bpm:garden-workorder:query')") + public CommonResult> getTaskTodoBuzSimplePage(@Valid AppGardenWorkOrderPageReqVO pageVO) { + PageResult pageResult = gardenService.getTaskTodoBuzSimplePage(pageVO); + return success(pageResult); + } } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenWorkOrderRespVO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenWorkOrderRespVO.java index 90fba25..f3f0bda 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenWorkOrderRespVO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/controller/app/garden/vo/AppGardenWorkOrderRespVO.java @@ -4,6 +4,7 @@ import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.MainInf import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.time.LocalDateTime; import java.util.List; /** @@ -21,4 +22,22 @@ public class AppGardenWorkOrderRespVO extends MainInfoRespVO { @Schema(description = "处理完成照片", example = "9184") private List completeImgsList; + + @Schema(description = "任务id") + private String taskId; + + @Schema(description = "任务名称") + private String taskName; + + @Schema(description = "流程定义名称") + private String processDefinitionName; + + @Schema(description = "任务开始时间") + private LocalDateTime startTime; + + @Schema(description = "任务结束时间") + private LocalDateTime endTime; + + @Schema(description = "流程定义key") + private String key_; } diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/garden/AppGardenTaskConvert.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/garden/AppGardenTaskConvert.java index b610b39..b943b96 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/garden/AppGardenTaskConvert.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/convert/garden/AppGardenTaskConvert.java @@ -1,5 +1,6 @@ package com.zteits.urbanops.module.workorder.convert.garden; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.collection.CollectionUtils; import com.zteits.urbanops.framework.common.util.date.DateUtils; @@ -11,7 +12,12 @@ import com.zteits.urbanops.module.bpm.dal.dataobject.definition.BpmProcessDefini import com.zteits.urbanops.module.bpm.framework.flowable.core.util.FlowableUtils; import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; 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.AppGardenWorkOrderRespVO; import com.zteits.urbanops.module.workorder.controller.app.garden.vo.task.AppGardenTaskRespVO; +import com.zteits.urbanops.module.workorder.dal.dataobject.attachment.AttachmentDO; +import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoExtDO; +import com.zteits.urbanops.module.workorder.dal.mysql.attachment.AttachmentMapper; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; @@ -19,8 +25,11 @@ import org.flowable.task.api.history.HistoricTaskInstance; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import static com.zteits.urbanops.framework.common.util.collection.MapUtils.findAndThen; @@ -88,4 +97,80 @@ public interface AppGardenTaskConvert { return new PageResult<>(taskVOList, pageResult.getTotal()); } + default PageResult buildBuziTaskPage(PageResult pageResult, AttachmentMapper attachmentMapper){ + // 1. 源分页对象为空,返回空分页 + if (pageResult == null) { + return PageResult.empty(); + } + + // 2. 转换列表数据,保留分页参数(总数、页码、页大小等) + List targetList = convertList(pageResult.getList(), attachmentMapper); + return new PageResult<>(targetList, pageResult.getTotal()); + } + + default List convertList(List sourceList, AttachmentMapper attachmentMapper) { + // 1. 源列表为空,返回空列表(避免NPE) + if (sourceList == null || sourceList.isEmpty()) { + return Collections.emptyList(); + } + + // 2. 遍历源列表,调用单对象转换方法 + return sourceList.stream() + .map(source -> convert(source, attachmentMapper)) + .collect(Collectors.toList()); + } + + /** + * MainInfoExtDO → AppGardenWorkOrderRespVO + * @param source 源对象 + * @param attachmentMapper 附件Mapper,用于查询图片列表 + * @return 目标对象 + */ + default AppGardenWorkOrderRespVO convert(MainInfoExtDO source, AttachmentMapper attachmentMapper) { + // 1. 源对象为空,直接返回null + if (source == null) { + return null; + } + + AppGardenWorkOrderRespVO target = new AppGardenWorkOrderRespVO(); + org.springframework.beans.BeanUtils.copyProperties(source, target); + + // 3. 手动赋值扩展字段:查询问题图片列表和完成图片列表 + List problemImgsList = queryAttachment( + source.getBusiLine(), + BpmCommonConstant.PROBLEM_IMG_GROUP, + source.getOrderNo(), + attachmentMapper + ); + List completeImgsList = queryAttachment( + source.getBusiLine(), + BpmCommonConstant.RESULT_IMG_GROUP, + source.getOrderNo(), + attachmentMapper + ); + target.setProblemImgsList(problemImgsList); + target.setCompleteImgsList(completeImgsList); + + return target; + } + + default List queryAttachment(String busiLine, String busiType, String orderNo, AttachmentMapper attachmentMapper) { + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(AttachmentDO::getBusiLine, busiLine) + .eq(AttachmentDO::getBusiType, busiType) + .eq(AttachmentDO::getOrderNo, orderNo); + List attachments = attachmentMapper.selectList(queryWrapper); + if (attachments == null || attachments.isEmpty()) { + return List.of(); + } + return attachments.stream() + .map(AttachmentDO::getFileNames) + .filter(s -> s != null && !s.isEmpty()) + .flatMap(s -> Arrays.stream(s.split(",")).map(String::trim)) + .filter(s -> !s.isEmpty()) + .distinct() + .collect(Collectors.toList()); + } + } \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/attachment/AttachmentDO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/attachment/AttachmentDO.java index 68bd6a0..fe8e848 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/attachment/AttachmentDO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/attachment/AttachmentDO.java @@ -32,11 +32,11 @@ public class AttachmentDO extends BaseDO { */ private String orderNo; /** - * 业务线:yl 园林,wy 物业,sz 市政 + * 业务线:yl 园林,wy 物业,sz 市政 */ private String busiLine; /** - * 业务类型:01 问题图片,02 街道图片,03 选景图片 + * 业务类型:01 问题图片,02 进行中图片,03 已完成图片 */ private String busiType; /** @@ -61,4 +61,4 @@ public class AttachmentDO extends BaseDO { private String remark; -} \ No newline at end of file +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/maininfo/MainInfoExtDO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/maininfo/MainInfoExtDO.java new file mode 100644 index 0000000..613b3c4 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/maininfo/MainInfoExtDO.java @@ -0,0 +1,174 @@ +package com.zteits.urbanops.module.workorder.dal.dataobject.maininfo; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 类描述:工单扩展信息,支持工作流任务信息 DO + * 创建人:yanhuiqing + * 创建时间:2025/12/15 17:37 + * 修改人:yanhuiqing + * 修改时间:2025/12/15 17:37 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MainInfoExtDO extends BaseDO { + + /** + * ID + */ + private Long id; + /** + * 业务线:yl 园林,wy 物业,sz 市政 + */ + private String busiLine; + /** + * 工单号 + */ + private String orderNo; + /** + * 工单名称 + */ + private String orderName; + /** + * 来源ID + */ + private Integer sourceId; + /** + * 来源名称 + */ + private String sourceName; + /** + * 道路ID + */ + private Long roadId; + /** + * 道路名称 + */ + private String roadName; + /** + * 街道ID + */ + private String streetId; + /** + * 街道名称 + */ + private String streetName; + /** + * 养护级别ID + */ + private Integer curingLevelId; + /** + * 养护级别 + */ + private String curingLevelName; + /** + * 提交日期 + */ + private LocalDateTime commitDate; + + /** + * 完成时间 + */ + private LocalDateTime finishDate; + /** + * 紧急程度:1:特急;2:紧急;3:一般 + */ + private Integer pressingType; + /** + * 提交用户ID + */ + private Long userId; + /** + * 提交用户名称 + */ + private String userName; + /** + * 部门id + */ + private Long companyId; + /** + * 经纬度类型: 1:国标; 2:百度;3:高德;4:腾讯 + */ + private Integer latLonType; + /** + * 经度 + */ + private BigDecimal lat; + /** + * 维度 + */ + private BigDecimal lon; + /** + * 经纬度地址 + */ + private String lonLatAddress; + /** + * 三方工单ID + */ + private String thirdWorkNo; + /** + * 三方工单结果上报状态:1:待推送;2:推送成功;3:推送失败 + */ + private Integer thirdPushState; + /** + * 业务状态 + */ + private String buzStatus; + /** + * 审批状态 + */ + private Integer status; + /** + * 流程实例的编号 + */ + private String processInstanceId; + /** + * 工单描述 + */ + private String remark; + /** + * 工单完成结果描述 + */ + private String handleResult; + /** + * 任务id + */ + private String taskId; + /** + * 任务名称 + */ + private String taskName; + /** + * 流程定义名称 + */ + private String processDefinitionName; + /** + * 任务开始时间 + */ + private LocalDateTime startTime; + /** + * 任务结束时间 + */ + private LocalDateTime endTime; + /** + * 流程定义key + */ + private String key_; + + +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/materialdetail/MaterialDetailDO.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/materialdetail/MaterialDetailDO.java index 215fd64..9b12141 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/materialdetail/MaterialDetailDO.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/dataobject/materialdetail/MaterialDetailDO.java @@ -66,7 +66,7 @@ public class MaterialDetailDO extends BaseDO { /** * 使用数量 */ - private Double userCount; + private Long userCount; /** * 单位 */ @@ -80,5 +80,11 @@ public class MaterialDetailDO extends BaseDO { */ private String remark; + /*耗材ID*/ + private Long materialId; -} \ No newline at end of file + /** + * 耗材名称 + */ + private String materialName; +} 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 new file mode 100644 index 0000000..6f6ef8f --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/maininfo/MainInfoExtMapper.java @@ -0,0 +1,230 @@ +package com.zteits.urbanops.module.workorder.dal.mysql.maininfo; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.framework.mybatis.core.util.MyBatisUtils; +import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.MainInfoHasTaskPageReqVO; +import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.MainInfoPageReqVO; +import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoDO; +import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoExtDO; +import org.apache.ibatis.annotations.*; + +/** + * 类描述:工单工作流扩展Mapper + * 创建人:yanhuiqing + * 创建时间:2025/12/15 17:27 + * 修改人:yanhuiqing + * 修改时间:2025/12/15 17:27 + * 修改备注: + * + * @author yanhuiqing + * @version 1.0 + */ +@Mapper +public interface MainInfoExtMapper extends BaseMapperX { + @Select({ + "" + }) + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "busi_line", property = "busiLine"), + @Result(column = "order_no", property = "orderNo"), + @Result(column = "order_name", property = "orderName"), + @Result(column = "source_id", property = "sourceId"), + @Result(column = "source_name", property = "sourceName"), + @Result(column = "road_id", property = "roadId"), + @Result(column = "road_name", property = "roadName"), + @Result(column = "street_id", property = "streetId"), + @Result(column = "street_name", property = "streetName"), + @Result(column = "curing_level_id", property = "curingLevelId"), + @Result(column = "curing_level_name", property = "curingLevelName"), + @Result(column = "commit_date", property = "commitDate"), + @Result(column = "finish_date", property = "finishDate"), + @Result(column = "pressing_type", property = "pressingType"), + @Result(column = "user_id", property = "userId"), + @Result(column = "user_name", property = "userName"), + @Result(column = "company_id", property = "companyId"), + @Result(column = "lat_lon_type", property = "latLonType"), + @Result(column = "lat", property = "lat"), + @Result(column = "lon", property = "lon"), + @Result(column = "lon_lat_address", property = "lonLatAddress"), + @Result(column = "third_work_no", property = "thirdWorkNo"), + @Result(column = "third_push_state", property = "thirdPushState"), + @Result(column = "buz_status", property = "buzStatus"), + @Result(column = "status", property = "status"), + @Result(column = "process_instance_id", property = "processInstanceId"), + @Result(column = "remark", property = "remark"), + @Result(column = "handle_result", property = "handleResult"), + @Result(column = "creator", property = "creator"), + @Result(column = "create_time", property = "createTime"), + @Result(column = "updater", property = "updater"), + @Result(column = "update_time", property = "updateTime"), + @Result(column = "deleted", property = "deleted"), + + @Result(column = "task_id", property = "taskId"), + @Result(column = "task_name", property = "taskName"), + @Result(column = "process_definition_name", property = "processDefinitionName"), + @Result(column = "START_TIME_", property = "startTime"), + @Result(column = "END_TIME_", property = "endTime"), + @Result(column = "KEY_", property = "key_") + }) + IPage selectDoneExtPage(IPage page, @Param("query") MainInfoHasTaskPageReqVO reqVO); + + default PageResult selectWorkOrderDonePage(PageParam pageParam, @Param("query") MainInfoHasTaskPageReqVO reqVO) { + IPage mpPage = MyBatisUtils.buildPage(pageParam); + mpPage = selectDoneExtPage(mpPage, reqVO); + return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); + } + + @Select({ + "" + }) + @Results({ + @Result(column = "id", property = "id"), + @Result(column = "busi_line", property = "busiLine"), + @Result(column = "order_no", property = "orderNo"), + @Result(column = "order_name", property = "orderName"), + @Result(column = "source_id", property = "sourceId"), + @Result(column = "source_name", property = "sourceName"), + @Result(column = "road_id", property = "roadId"), + @Result(column = "road_name", property = "roadName"), + @Result(column = "street_id", property = "streetId"), + @Result(column = "street_name", property = "streetName"), + @Result(column = "curing_level_id", property = "curingLevelId"), + @Result(column = "curing_level_name", property = "curingLevelName"), + @Result(column = "commit_date", property = "commitDate"), + @Result(column = "finish_date", property = "finishDate"), + @Result(column = "pressing_type", property = "pressingType"), + @Result(column = "user_id", property = "userId"), + @Result(column = "user_name", property = "userName"), + @Result(column = "company_id", property = "companyId"), + @Result(column = "lat_lon_type", property = "latLonType"), + @Result(column = "lat", property = "lat"), + @Result(column = "lon", property = "lon"), + @Result(column = "lon_lat_address", property = "lonLatAddress"), + @Result(column = "third_work_no", property = "thirdWorkNo"), + @Result(column = "third_push_state", property = "thirdPushState"), + @Result(column = "buz_status", property = "buzStatus"), + @Result(column = "status", property = "status"), + @Result(column = "process_instance_id", property = "processInstanceId"), + @Result(column = "remark", property = "remark"), + @Result(column = "handle_result", property = "handleResult"), + @Result(column = "creator", property = "creator"), + @Result(column = "create_time", property = "createTime"), + @Result(column = "updater", property = "updater"), + @Result(column = "update_time", property = "updateTime"), + @Result(column = "deleted", property = "deleted"), + + @Result(column = "task_id", property = "taskId"), + @Result(column = "task_name", property = "taskName"), + @Result(column = "process_definition_name", property = "processDefinitionName"), + @Result(column = "START_TIME_", property = "startTime"), + @Result(column = "END_TIME_", property = "endTime"), + @Result(column = "KEY_", property = "key_") + }) + IPage selectTodoExtPage(IPage page, @Param("query") MainInfoHasTaskPageReqVO reqVO); + + default PageResult selectWorkOrderTodoPage(PageParam pageParam, @Param("query") MainInfoHasTaskPageReqVO reqVO) { + IPage mpPage = MyBatisUtils.buildPage(pageParam); + mpPage = selectTodoExtPage(mpPage, reqVO); + return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); + } +} \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/maininfo/MainInfoMapper.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/maininfo/MainInfoMapper.java index 7965090..04e67f9 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/maininfo/MainInfoMapper.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/dal/mysql/maininfo/MainInfoMapper.java @@ -2,12 +2,14 @@ package com.zteits.urbanops.module.workorder.dal.mysql.maininfo; import java.util.*; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoDO; import org.apache.ibatis.annotations.Mapper; import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.*; +import org.apache.poi.ss.formula.functions.T; /** * 工单信息 Mapper @@ -85,4 +87,12 @@ public interface MainInfoMapper extends BaseMapperX { .orderByDesc(MainInfoDO::getId)); } + default List selectListIn(String field, Collection values) { + // 空集合判断:避免 SQL 中出现 IN () 语法错误 + if (values == null || values.isEmpty()) { + return List.of(); // 返回空列表(JDK9+),也可以用 new ArrayList<>() + } + return selectList(new QueryWrapper().in(field, values)); + } + } \ No newline at end of file diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/attachment/AttachmentService.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/attachment/AttachmentService.java index bf01a32..bba13aa 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/attachment/AttachmentService.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/attachment/AttachmentService.java @@ -59,4 +59,12 @@ public interface AttachmentService { */ PageResult getAttachmentPage(AttachmentPageReqVO pageReqVO); -} \ No newline at end of file + /** + * 获得工单附件信息 + * + * @param reqVO 编号 + * @return 工单附件信息 + */ + List getAttachmentByCondition(AttachmentReqVO reqVO); + +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/attachment/AttachmentServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/attachment/AttachmentServiceImpl.java index 0af1491..e2194a8 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/attachment/AttachmentServiceImpl.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/attachment/AttachmentServiceImpl.java @@ -1,6 +1,8 @@ package com.zteits.urbanops.module.workorder.service.attachment; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -15,7 +17,9 @@ import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.module.workorder.dal.mysql.attachment.AttachmentMapper; +import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception0; import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; import static com.zteits.urbanops.module.workorder.enums.ErrorCodeConstants.*; @@ -60,10 +64,10 @@ public class AttachmentServiceImpl implements AttachmentService { } @Override - public void deleteAttachmentListByIds(List ids) { + public void deleteAttachmentListByIds(List ids) { // 删除 attachmentMapper.deleteByIds(ids); - } + } private void validateAttachmentExists(Long id) { @@ -82,4 +86,16 @@ public class AttachmentServiceImpl implements AttachmentService { return attachmentMapper.selectPage(pageReqVO); } -} \ No newline at end of file + @Override + public List getAttachmentByCondition(AttachmentReqVO reqVO) { + if (StringUtils.isEmpty(reqVO.getOrderNo())) { + throw exception0(BAD_REQUEST.getCode(),"工单号不能为空"); + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AttachmentDO::getOrderNo, reqVO.getOrderNo()); + if (StringUtils.isNotEmpty(reqVO.getBusiType())) { + queryWrapper.eq(AttachmentDO::getBusiType, reqVO.getBusiType()); + } + return attachmentMapper.selectList(queryWrapper); + } +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenService.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenService.java index 005a0c7..0a1d5ab 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenService.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/BpmGardenService.java @@ -119,4 +119,18 @@ public interface BpmGardenService { * @return */ AppGardenApprovalDetailRespVO getApprovalDetail(AppGardenApprovalDetailReqVO reqVO); + + /** + * 工单业务已完结 列表 -app 端 + * @param pageVO + * @return + */ + PageResult getTaskDoneBuzSimplePage(AppGardenWorkOrderPageReqVO pageVO); + + /** + * 工单业务待办 列表 -app端 + * @param pageVO + * @return + */ + PageResult getTaskTodoBuzSimplePage(AppGardenWorkOrderPageReqVO pageVO); } 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 d3a4ce0..aef1ac3 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 @@ -25,6 +25,7 @@ import com.zteits.urbanops.module.workorder.api.constant.BpmCommonConstant; import com.zteits.urbanops.module.workorder.api.workorder.WorkOrderApi; import com.zteits.urbanops.module.workorder.controller.admin.garden.vo.BpmGardenWorkOrderCreateReqVO; import com.zteits.urbanops.module.workorder.controller.admin.garden.vo.BpmGardenWorkOrderPageReqVO; +import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.MainInfoHasTaskPageReqVO; import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.MainInfoPageReqVO; import com.zteits.urbanops.module.workorder.controller.app.garden.vo.*; import com.zteits.urbanops.module.workorder.controller.app.garden.vo.process.AppGardenApprovalDetailReqVO; @@ -35,7 +36,9 @@ import com.zteits.urbanops.module.workorder.convert.garden.BpmGardenWorkOrderCon import com.zteits.urbanops.module.workorder.dal.dataobject.attachment.AttachmentDO; import com.zteits.urbanops.module.workorder.dal.dataobject.garden.BpmGardenWorkOrderDO; import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoDO; +import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoExtDO; 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 jakarta.annotation.Resource; import org.flowable.engine.RuntimeService; @@ -51,6 +54,8 @@ import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertSet; @@ -70,6 +75,9 @@ public class BpmGardenServiceImpl implements BpmGardenService{ private AttachmentMapper attachmentMapper; @Resource private MainInfoMapper workOrderMapper; + + @Resource + private MainInfoExtMapper workOrderExtMapper; @Resource private BpmProcessInstanceApi processInstanceApi; @Resource @@ -201,6 +209,71 @@ public class BpmGardenServiceImpl implements BpmGardenService{ } @Override + public PageResult getTaskDoneBuzSimplePage(AppGardenWorkOrderPageReqVO pageVO) { + MainInfoHasTaskPageReqVO taskBuzReqVO = new MainInfoHasTaskPageReqVO(); + String type = pageVO.getType(); + String content = pageVO.getSearchContent(); + if(ObjectUtils.isNotAllEmpty(type)){ + if("1".equals(type)){ + if(ObjectUtils.isNotAllEmpty(content)){taskBuzReqVO.setRoadName(content);} + } else + if("2".equals(type)){ + if(ObjectUtils.isNotAllEmpty(content)){taskBuzReqVO.setOrderName(content);} + }else + if("3".equals(type)){ + if(ObjectUtils.isNotAllEmpty(content)){taskBuzReqVO.setRemark(content);} + } else + if("4".equals(type)){ + if(ObjectUtils.isNotAllEmpty(content)){taskBuzReqVO.setOrderNo(content);} + }else { + if (ObjectUtils.isNotAllEmpty(content)) { + taskBuzReqVO.setOrderName(content); + } + } + }else {//默认是工单名称 + if (ObjectUtils.isNotAllEmpty(content)) { + taskBuzReqVO.setOrderName(content); + } + } + taskBuzReqVO.setUserId(SecurityFrameworkUtils.getLoginUserId()); + PageResult pageResult = workOrderExtMapper.selectWorkOrderDonePage(pageVO,taskBuzReqVO); + return AppGardenTaskConvert.INSTANCE.buildBuziTaskPage(pageResult,attachmentMapper); + } + + @Override + public PageResult getTaskTodoBuzSimplePage(AppGardenWorkOrderPageReqVO pageVO) { + MainInfoHasTaskPageReqVO taskBuzReqVO = new MainInfoHasTaskPageReqVO(); + String type = pageVO.getType(); + String content = pageVO.getSearchContent(); + if(ObjectUtils.isNotAllEmpty(type)){ + if("1".equals(type)){ + if(ObjectUtils.isNotAllEmpty(content)){taskBuzReqVO.setRoadName(content);} + } else + if("2".equals(type)){ + if(ObjectUtils.isNotAllEmpty(content)){taskBuzReqVO.setOrderName(content);} + }else + if("3".equals(type)){ + if(ObjectUtils.isNotAllEmpty(content)){taskBuzReqVO.setRemark(content);} + } else + if("4".equals(type)){ + if(ObjectUtils.isNotAllEmpty(content)){taskBuzReqVO.setOrderNo(content);} + }else { + if (ObjectUtils.isNotAllEmpty(content)) { + taskBuzReqVO.setOrderName(content); + } + } + }else {//默认是工单名称 + if (ObjectUtils.isNotAllEmpty(content)) { + taskBuzReqVO.setOrderName(content); + } + } + taskBuzReqVO.setUserId(SecurityFrameworkUtils.getLoginUserId()); + PageResult pageResult = workOrderExtMapper.selectWorkOrderTodoPage(pageVO,taskBuzReqVO); + + return AppGardenTaskConvert.INSTANCE.buildBuziTaskPage(pageResult,attachmentMapper); + } + + @Override public PageResult getTaskDonePage(AppGardenTaskPageReqVO pageVO) { BpmTaskPageReqVO targetVO = BeanUtils.toBean(pageVO,BpmTaskPageReqVO.class); PageResult pageResult = taskService.getTaskDonePage(SecurityFrameworkUtils.getLoginUserId(), targetVO); diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/listener/AutoCompleteExecutionListener.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/listener/AutoCompleteExecutionListener.java new file mode 100644 index 0000000..e5a9544 --- /dev/null +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/garden/listener/AutoCompleteExecutionListener.java @@ -0,0 +1,43 @@ +package com.zteits.urbanops.module.workorder.service.garden.listener; + +import org.flowable.common.engine.api.FlowableException; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.common.engine.impl.identity.Authentication; // 关键导入 +import org.springframework.stereotype.Component; + +/** + * 流程启动时的执行监听器:设置自动完成变量 + */ +@Component("autoCompleteExecutionListener") +public class AutoCompleteExecutionListener implements ExecutionListener { + + @Override + public void notify(DelegateExecution execution) { + try { + // 1. 获取发起人ID:使用Authentication工具类(适配新版本) + String initiator = null; + // 获取当前认证的用户ID(静态方法) + if (Authentication.getAuthenticatedUserId() != null) { + initiator = Authentication.getAuthenticatedUserId(); + } else { + // 备选:从流程变量中获取 + initiator = (String) execution.getVariable("initiator"); + } + + // 容错:默认用户 + if (initiator == null || initiator.isEmpty()) { + initiator = "system_admin"; + } + + // 2. 设置skipExpression需要的变量:autoComplete=true(表示跳过用户任务) + execution.setVariable("autoComplete", true); + // 3. 存储发起人ID和备注变量(用于追溯) + execution.setVariable("initiator", initiator); + execution.setVariable("completeRemark", "系统自动完成,办理人:" + initiator); + + } catch (Exception e) { + throw new FlowableException("设置自动完成变量失败:" + e.getMessage(), e); + } + } +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/maininfo/MainInfoService.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/maininfo/MainInfoService.java index 95cee14..1946551 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/maininfo/MainInfoService.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/maininfo/MainInfoService.java @@ -59,4 +59,12 @@ public interface MainInfoService { */ PageResult getMainInfoPage(MainInfoPageReqVO pageReqVO); -} \ No newline at end of file + /** + * 获得工单信息 + * + * @param orderNo 编号 + * @return 工单信息 + */ + MainInfoDO getMainInfoByOrderNo(String orderNo); + +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/maininfo/MainInfoServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/maininfo/MainInfoServiceImpl.java index 3b11d64..acd3a1f 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/maininfo/MainInfoServiceImpl.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/maininfo/MainInfoServiceImpl.java @@ -1,24 +1,19 @@ package com.zteits.urbanops.module.workorder.service.maininfo; -import cn.hutool.core.collection.CollUtil; -import org.springframework.stereotype.Service; -import jakarta.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.*; -import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoDO; import com.zteits.urbanops.framework.common.pojo.PageResult; -import com.zteits.urbanops.framework.common.pojo.PageParam; import com.zteits.urbanops.framework.common.util.object.BeanUtils; - +import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.MainInfoPageReqVO; +import com.zteits.urbanops.module.workorder.controller.admin.maininfo.vo.MainInfoSaveReqVO; +import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoDO; import com.zteits.urbanops.module.workorder.dal.mysql.maininfo.MainInfoMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; -import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; -import static com.zteits.urbanops.module.workorder.enums.ErrorCodeConstants.*; +import static com.zteits.urbanops.module.workorder.enums.ErrorCodeConstants.MAIN_INFO_NOT_EXISTS; /** * 工单信息 Service 实现类 @@ -82,4 +77,9 @@ public class MainInfoServiceImpl implements MainInfoService { return mainInfoMapper.selectPage(pageReqVO); } -} \ No newline at end of file + @Override + public MainInfoDO getMainInfoByOrderNo(String orderNo) { + return mainInfoMapper.selectOne(MainInfoDO::getOrderNo, orderNo); + } + +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/materialdetail/MaterialDetailService.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/materialdetail/MaterialDetailService.java index 812fe24..47d84fd 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/materialdetail/MaterialDetailService.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/materialdetail/MaterialDetailService.java @@ -59,4 +59,12 @@ public interface MaterialDetailService { */ PageResult getMaterialDetailPage(MaterialDetailPageReqVO pageReqVO); -} \ No newline at end of file + /** + * 创建工单耗材明细 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Boolean batchCreateMaterialDetail(@Valid List createReqVO); + +} diff --git a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/materialdetail/MaterialDetailServiceImpl.java b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/materialdetail/MaterialDetailServiceImpl.java index 1145c54..065f25f 100644 --- a/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/materialdetail/MaterialDetailServiceImpl.java +++ b/urbanops-module-workorder/src/main/java/com/zteits/urbanops/module/workorder/service/materialdetail/MaterialDetailServiceImpl.java @@ -1,24 +1,32 @@ package com.zteits.urbanops.module.workorder.service.materialdetail; -import cn.hutool.core.collection.CollUtil; -import org.springframework.stereotype.Service; -import jakarta.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import com.zteits.urbanops.module.workorder.controller.admin.materialdetail.vo.*; -import com.zteits.urbanops.module.workorder.dal.dataobject.materialdetail.MaterialDetailDO; import com.zteits.urbanops.framework.common.pojo.PageResult; -import com.zteits.urbanops.framework.common.pojo.PageParam; import com.zteits.urbanops.framework.common.util.object.BeanUtils; - +import com.zteits.urbanops.module.garden.api.material.MaterialApi; +import com.zteits.urbanops.module.garden.api.material.dto.MaterialInventoryOutDto; +import com.zteits.urbanops.module.garden.controller.admin.materialinventoryout.vo.MaterialInventoryOutSaveReqVO; +import com.zteits.urbanops.module.garden.service.materialinventoryout.MaterialInventoryOutService; +import com.zteits.urbanops.module.workorder.controller.admin.materialdetail.vo.MaterialDetailPageReqVO; +import com.zteits.urbanops.module.workorder.controller.admin.materialdetail.vo.MaterialDetailSaveReqVO; +import com.zteits.urbanops.module.workorder.dal.dataobject.maininfo.MainInfoDO; +import com.zteits.urbanops.module.workorder.dal.dataobject.materialdetail.MaterialDetailDO; import com.zteits.urbanops.module.workorder.dal.mysql.materialdetail.MaterialDetailMapper; +import com.zteits.urbanops.module.workorder.service.maininfo.MainInfoService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; +import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; -import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; -import static com.zteits.urbanops.module.workorder.enums.ErrorCodeConstants.*; +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getLoginUserNickname; +import static com.zteits.urbanops.module.workorder.enums.ErrorCodeConstants.MATERIAL_DETAIL_NOT_EXISTS; /** * 工单耗材明细 Service 实现类 @@ -32,10 +40,18 @@ public class MaterialDetailServiceImpl implements MaterialDetailService { @Resource private MaterialDetailMapper materialDetailMapper; + @Resource + private MaterialApi materialApi; + + @Resource + private MainInfoService mainInfoService; + @Override public Long createMaterialDetail(MaterialDetailSaveReqVO createReqVO) { // 插入 MaterialDetailDO materialDetail = BeanUtils.toBean(createReqVO, MaterialDetailDO.class); + materialDetail.setUserId(getLoginUserId()); + materialDetail.setUserName(getLoginUserNickname()); materialDetailMapper.insert(materialDetail); // 返回 @@ -82,4 +98,39 @@ public class MaterialDetailServiceImpl implements MaterialDetailService { return materialDetailMapper.selectPage(pageReqVO); } -} \ No newline at end of file + @Override + @Transactional + public Boolean batchCreateMaterialDetail(List createReqVO) { + + List materialDetailList = createReqVO.stream() + .map(vo -> { + MaterialDetailDO detailDO = new MaterialDetailDO(); + BeanUtils.copyProperties(vo, detailDO); // 单个对象属性拷贝 + detailDO.setUserId(getLoginUserId()); + detailDO.setUserName(getLoginUserNickname()); + return detailDO; + }) + .collect(Collectors.toList()); + + //订单号校验 + for (MaterialDetailDO materialDetailDO : materialDetailList) { + MainInfoDO mainInfoDO = mainInfoService.getMainInfoByOrderNo(materialDetailDO.getOrderNo()); + if (mainInfoDO == null) { + throw exception0(BAD_REQUEST.getCode(),"订单号"+materialDetailDO.getOrderNo()+"不存在"); + } + } + //耗材出库 + for (MaterialDetailDO materialDetailDO : materialDetailList) { + MaterialInventoryOutDto outDto = new MaterialInventoryOutDto(); + outDto.setMaterialId(materialDetailDO.getMaterialId()); + outDto.setMaterialName(materialDetailDO.getMaterialName()); + outDto.setOutInventoryNum(materialDetailDO.getUserCount()); + outDto.setOutDate(LocalDateTime.now()); + materialApi.createMaterialInventoryOut(outDto); + } + //保存耗材 + materialDetailMapper.insertBatch(materialDetailList); + return Boolean.TRUE; + } + +}