From 47a2fdefeb0b11cf27e750e870debd471be767a2 Mon Sep 17 00:00:00 2001 From: wangqian <1406304305@qq.com> Date: Mon, 24 Nov 2025 20:28:57 +0800 Subject: [PATCH] 派单及人机材功能迁移 --- urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/util/ExcelUtils.java | 6 ++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/AssignTasksController.java | 10 +++++++++- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java | 12 +++++++++--- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/CostFeeController.java | 311 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/WaterFeeBridgeController.java | 36 ------------------------------------ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/DepartmentCostImport.java | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/GardenWasteRecordImport.java | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MechanicalCostImport.java | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/PersonalCostImport.java | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/RentalMechanicalCostImport.java | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/WaterFeeImport.java | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/MechanicalCostController.java | 67 +++++++++++++++++++++---------------------------------------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostPageReqVO.java | 22 +++++++--------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostRespVO.java | 22 +++++++++------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostSaveReqVO.java | 2 -- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/PersonalCostController.java | 28 +++++++++------------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostPageReqVO.java | 13 +++++++------ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostRespVO.java | 23 +++++++++-------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostSaveReqVO.java | 5 +---- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/RentalMechanicalCostController.java | 15 ++------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostPageReqVO.java | 2 +- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostRespVO.java | 2 +- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostSaveReqVO.java | 2 +- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/TeamBizdomainRelVo.java | 25 +++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordPageReqVO.java | 18 ++++++++++-------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordRespVO.java | 20 +++++++++----------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/waterfee/WaterFeeController.java | 11 +++++++++-- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/mechanicalcost/MechanicalCostDO.java | 19 +++++++++++-------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/personalcost/PersonalCostDO.java | 142 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/rentalmechanicalcost/RentalMechanicalCostDO.java | 20 ++++++++++++-------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/wasterecord/WasteRecordDO.java | 19 ++++++++++--------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CostFeeConstants.java | 4 ++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java | 2 ++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeService.java | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java | 472 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/mechanicalcost/MechanicalCostServiceImpl.java | 28 ++++++++++++++-------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/personalcost/PersonalCostServiceImpl.java | 41 +++++++++-------------------------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/rentalmechanicalcost/RentalMechanicalCostServiceImpl.java | 17 ----------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/wasterecord/WasteRecordServiceImpl.java | 56 ++++++++++++++++++++++---------------------------------- 40 files changed, 1790 insertions(+), 387 deletions(-) create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/CostFeeController.java delete mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/WaterFeeBridgeController.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/DepartmentCostImport.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/GardenWasteRecordImport.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MechanicalCostImport.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/PersonalCostImport.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/RentalMechanicalCostImport.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/WaterFeeImport.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/TeamBizdomainRelVo.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeService.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java diff --git a/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/util/ExcelUtils.java b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/util/ExcelUtils.java index 0b139ba..2f8a19c 100644 --- a/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/util/ExcelUtils.java +++ b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/util/ExcelUtils.java @@ -49,4 +49,10 @@ public class ExcelUtils { .doReadAllSync(); } + public static List read(MultipartFile file, Class head, Integer startIndex) throws IOException { + return FastExcelFactory.read(file.getInputStream(), head, null) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .headRowNumber(startIndex) + .doReadAllSync(); + } } 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 09f53c1..8e6ad60 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 @@ -33,7 +33,7 @@ import com.zteits.urbanops.module.garden.service.assigntasks.AssignTasksService; @Tag(name = "管理后台 - 派单任务主表(记录派单任务基本信息)") @RestController -@RequestMapping("/garden/assign-tasks") +@RequestMapping("/assign/tasks") @Validated public class AssignTasksController { @@ -90,6 +90,14 @@ public class AssignTasksController { return success(BeanUtils.toBean(pageResult, AssignTasksRespVO.class)); } + @GetMapping("/list") + @Operation(summary = "获得派单任务主表(记录派单任务基本信息)分页") + @PreAuthorize("@ss.hasPermission('garden:assign-tasks:query')") + public CommonResult> list(@Valid AssignTasksPageReqVO pageReqVO) { + PageResult pageResult = assignTasksService.getAssignTasksPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, AssignTasksRespVO.class)); + } + @GetMapping("/export-excel") @Operation(summary = "导出派单任务主表(记录派单任务基本信息) Excel") @PreAuthorize("@ss.hasPermission('garden:assign-tasks:export')") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java index e50aa90..950faca 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java @@ -31,7 +31,7 @@ import com.zteits.urbanops.module.garden.service.assigntasksinfo.AssignTasksInfo @Tag(name = "管理后台 - 派单任务-单位关联表(记录单位接收派单后的执行详情)") @RestController -@RequestMapping("/garden/assign-tasks-info") +@RequestMapping("/assign/info") @Validated public class AssignTasksInfoController { @@ -87,7 +87,13 @@ public class AssignTasksInfoController { PageResult pageResult = assignTasksInfoService.getAssignTasksInfoPage(pageReqVO); return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); } - + @GetMapping("/list") + @Operation(summary = "获得派单任务-单位关联表(记录单位接收派单后的执行详情)分页") + @PreAuthorize("@ss.hasPermission('garden:assign-tasks-info:query')") + public CommonResult> list(@Valid AssignTasksInfoPageReqVO pageReqVO) { + PageResult pageResult = assignTasksInfoService.getAssignTasksInfoPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); + } @GetMapping("/export-excel") @Operation(summary = "导出派单任务-单位关联表(记录单位接收派单后的执行详情) Excel") @PreAuthorize("@ss.hasPermission('garden:assign-tasks-info:export')") @@ -101,4 +107,4 @@ public class AssignTasksInfoController { BeanUtils.toBean(list, AssignTasksInfoRespVO.class)); } -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/CostFeeController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/CostFeeController.java new file mode 100644 index 0000000..f36929b --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/CostFeeController.java @@ -0,0 +1,311 @@ +package com.zteits.urbanops.module.garden.controller.admin.costfee; + +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; +import com.zteits.urbanops.module.garden.enums.TemplateEnum; +import com.zteits.urbanops.module.garden.service.costfee.CostFeeService; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.http.HttpServletResponse; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.*; + +import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +/** + * 人机材公共处理控制器 + * 处理Excel导入预览、提交等功能 + */ +@RestController +@RequestMapping("/costfee") +@Slf4j +public class CostFeeController{ + + @Autowired + private CostFeeService costFeeService; + + // 静态资源服务器基础URL(从配置文件读取) + @Value("${static.resource.server.url}") + private String staticResourceServerUrl; + + @Value("${static.resource.server.enable}") + private Boolean staticResourceServerenable; + + // Excel文件校验相关 + private static final List ALLOWED_EXCEL_SUFFIX = Arrays.asList(".xlsx", ".xlsm"); + private static final String EXCEL_MIME_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; + private static final String EXCEL_MIME_TYPE_XLS = "application/vnd.ms-excel"; + + /** + * 导入模板下载 + */ + @GetMapping("/get-import-template") + @Operation(summary = "获得导入用户模板") + public void importTemplate(HttpServletResponse response, + @RequestParam("templateName") String templateName) throws IOException { + // 参数校验 + if (templateName == null || templateName.trim().isEmpty()) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "模板名称不能为空"); + return; + } + + // 模板类型校验 + TemplateEnum template = TemplateEnum.getByCode(templateName); + if (template == null) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "未知的模板类型: " + templateName); + return; + } + + if (staticResourceServerenable) { + // 构建完整的静态服务器URL(确保路径正确) + String serverUrl = staticResourceServerUrl; + if (serverUrl != null && !serverUrl.endsWith("/")) { + serverUrl += "/"; // 确保URL以/结尾,避免拼接错误 + } + + String encodedFileName = URLEncoder.encode(template.getName().split("\\.")[0], StandardCharsets.UTF_8.name()); + + String templateFileName = encodedFileName + "." + template.getName().split("\\.")[1]; + + String templateUrl = serverUrl + templateFileName; // 包含templates目录 + + // 方式1:重定向到静态资源服务器 + response.sendRedirect(templateUrl); + } else { + String templateFileName = templateName + "." + template.getName().split("\\.")[1]; + + // 写入模板文件到响应 + writeTemplateToResponse(response, template.getName(), templateFileName); + } + } + + + /** + * Excel文件上传预览 + */ + @PostMapping("/preview") + public CommonResult previewExcel(@RequestParam("file") MultipartFile file, + @RequestParam("templateName") String templateName) { + // 基础参数校验 + if (templateName == null || templateName.trim().isEmpty()) { + return CommonResult.error(BAD_REQUEST, "模板名称不能为空"); + + } + // 模板类型校验 + TemplateEnum template = TemplateEnum.getByCode(templateName); + if (template == null) { + return CommonResult.error(BAD_REQUEST, "未知的模板类型"); + } + String suffix = template.getName().split("\\.")[1]; + // 文件有效性校验 + if (!isValidExcelFile(file)) { + return CommonResult.error(BAD_REQUEST, "请上传有效的Excel文件"); + } + //部门信息缓存,校验正确性使用 + + + // 解析Excel并获取数据 + ImportResult result = parseExcelFile(file, template); + + // 需预览的数据存入Redis并返回批次ID + if (result.isNeedPreview()) { + if (CollectionUtils.isEmpty(result.getDataList())) { + return CommonResult.error(BAD_REQUEST, "导入的Excel文件不能为空"); + + } + String batchId = costFeeService.saveDataToRedis(result.getDataList(), templateName); + Map resultMap = new HashMap<>(2); + resultMap.put("batchId", batchId); + resultMap.put("totalCount", result.getDataList().size()); + resultMap.put("templateName",templateName); + return success(resultMap); + } + // 无需预览的直接返回数据 + return success(result.getDataList()); + } + + + /** + * 分页获取预览数据 + */ + @GetMapping("/preview-data") + public CommonResult getPreviewData(@RequestParam("batchId") String batchId, + @RequestParam("templateName") String templateName, + @RequestParam(value = "page", defaultValue = "1") int page, + @RequestParam(value = "size", defaultValue = "100000") int size) { + + + // 参数校验 + if (batchId == null || batchId.trim().isEmpty()) { + return CommonResult.error(BAD_REQUEST, "批次ID不能为空"); + } + if (templateName == null || templateName.trim().isEmpty()) { + return CommonResult.error(BAD_REQUEST, "模板名称不能为空"); + + } + if (TemplateEnum.getByCode(templateName) == null) { + return CommonResult.error(BAD_REQUEST, "未知的模板类型"); + + } + try { + //if (page < 1 || size < 1 || size > 100) { // 限制每页最大100条,避免过大 + // return AjaxResult.error("分页参数无效(page≥1,1≤size≤100)"); + //} + + // 模板类型校验 + TemplateEnum template = TemplateEnum.getByCode(templateName); + Class importClass = template.getImportClass(); // 从枚举获取导入类,避免switch + + // 从Redis获取分页数据 + PageResult pageResult = costFeeService.getPagedDataFromRedis(batchId, templateName, page, size, importClass); + return CommonResult.success(pageResult); + } catch (Exception e) { + log.error("获取预览数据失败", e); + throw new RuntimeException(e); + } + } + + + /** + * 提交导入数据到数据库 + */ + @PostMapping("/submit") + public CommonResult submitImport(@RequestParam("batchId") String batchId, + @RequestParam("templateName") String templateName, + @RequestParam("operator") String operator) { + // 参数校验 + if (batchId == null || batchId.trim().isEmpty()) { + return CommonResult.error(BAD_REQUEST, "批次ID不能为空"); + } + if (templateName == null || templateName.trim().isEmpty()) { + return CommonResult.error(BAD_REQUEST, "模板名称不能为空"); + + } + if (TemplateEnum.getByCode(templateName) == null) { + return CommonResult.error(BAD_REQUEST, "未知的模板类型"); + + } + if (operator == null || operator.trim().isEmpty()) { + return CommonResult.error(BAD_REQUEST, "操作人不能为空"); + } + int count = costFeeService.submitImport(batchId, templateName, operator); + return CommonResult.success("导入成功,共" + count + "条数据"); + } + + /** + * 写入模板文件到响应流 + */ + private void writeTemplateToResponse(HttpServletResponse response, String filename, String templatePath) throws IOException { + // 设置响应头 + response.setContentType(EXCEL_MIME_TYPE); + response.setCharacterEncoding("UTF-8"); + String encodedFileName = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20"); + response.setHeader("Content-Disposition", "attachment;filename=" + encodedFileName); + response.setHeader("Cache-Control", "no-store"); // 禁止缓存 + + // 读取模板文件并写入响应 + try (InputStream in = new ClassPathResource("template/" + templatePath).getInputStream(); + OutputStream out = response.getOutputStream()) { + + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = in.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + out.flush(); + } + } + + + /** + * 校验Excel文件有效性(后缀+MIME类型) + */ + private boolean isValidExcelFile(MultipartFile file) { + if (file == null || file.isEmpty()) { + return false; + } + String fileName = file.getOriginalFilename(); + if (fileName == null) { + return false; + } + + // 校验文件后缀 + boolean validSuffix = ALLOWED_EXCEL_SUFFIX.stream() + .anyMatch(suffix -> fileName.toLowerCase().endsWith(suffix)); + if (!validSuffix) { + return false; + } + + // 4. 校验MIME类型(兼容可能带参数的MIME类型,如charset) + String contentType = file.getContentType(); + if (contentType == null) { + return false; + } + // 处理MIME类型可能带参数的情况(如"application/xxx;charset=UTF-8") + String baseContentType = contentType.split(";")[0].trim(); + // 3. 匹配预设的Excel MIME类型(.xlsx/.xlsm或.xls) + return EXCEL_MIME_TYPE.equals(baseContentType) + || baseContentType.startsWith(EXCEL_MIME_TYPE_XLS); + } + + + /** + * 解析Excel文件并返回导入结果 + */ + @SuppressWarnings("unchecked") + private ImportResult parseExcelFile(MultipartFile file, TemplateEnum template){ + // 获取模板对应的导入类 + Class importClass = (Class) template.getImportClass(); + List dataList = null; + try { + // 解析Excel(从指定行开始读取) + dataList = ExcelUtils.read(file, importClass, template.getStartIndex()); + if (dataList == null) { + dataList = Collections.emptyList(); + } + // 基础数据校验(非空、格式等) + costFeeService.validateImportData(dataList, template); + + } catch (IOException e) { + log.error(e.getMessage()); + } + return new ImportResult<>(dataList, template.isNeedPreview()); + } + + + /** + * 导入结果封装 + */ + @Data + @AllArgsConstructor + private static class ImportResult { + private List dataList; + private boolean needPreview; + } + + /** + * 分页结果封装 + */ + @Data + @AllArgsConstructor + public static class PageResult { + private int page; + private int size; + private int total; + private List data; + } +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/WaterFeeBridgeController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/WaterFeeBridgeController.java deleted file mode 100644 index d288eed..0000000 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/WaterFeeBridgeController.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.zteits.urbanops.module.garden.controller.admin.costfee; - -import com.zteits.urbanops.framework.common.pojo.CommonResult; -import com.zteits.urbanops.framework.common.pojo.PageResult; -import com.zteits.urbanops.module.garden.controller.admin.waterfee.vo.WaterFeePageReqVO; -import com.zteits.urbanops.module.garden.dal.dataobject.waterfee.WaterFeeDO; -import com.zteits.urbanops.module.garden.service.waterfee.WaterFeeService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 水费桥接") -@RestController -@RequestMapping("/costfee/waterfee") -public class WaterFeeBridgeController { - - @Resource - private WaterFeeService waterFeeService; - - @GetMapping("/list") - @Operation(summary = "水费录入-列表") - public CommonResult> list(WaterFeePageReqVO reqVO) { - if (reqVO.getPageSize() == null || reqVO.getPageSize() <= 0) { - reqVO.setPageSize(10); - } - if (reqVO.getPageNo() == null || reqVO.getPageNo() <= 0) { - reqVO.setPageNo(1); - } - return success(waterFeeService.getWaterFeePage(reqVO)); - } -} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/DepartmentCostImport.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/DepartmentCostImport.java new file mode 100644 index 0000000..47dc664 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/DepartmentCostImport.java @@ -0,0 +1,56 @@ +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; + +import cn.idev.excel.annotation.ExcelProperty; +import jakarta.validation.constraints.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * 部门费用录入对象 td_department_cost + * + * @author wb + * @date 2025-07-14 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class DepartmentCostImport { + + /** 工资年月(如202506) */ + @ExcelProperty(index = 0) + @NotEmpty(message = "工资年月不能为空") + @Pattern(regexp = "^\\d{4}(0[1-9]|1[0-2])$", message = "工资年月格式错误,必须为yyyyMM(如202301)") + private String salaryMonth; + + @ExcelProperty(index = 1) + @NotEmpty(message = "费用名称不能为空") + @Size(max = 50, message = "费用名称长度不能超过50位") + private String expenseName; + + /** 部门总额 */ + @ExcelProperty(index = 2) + @NotNull(message = "工资金额不能为空") + @Digits(integer = 7, fraction = 2, message = "工资金额格式应为两位小数,且整数部分不超过7位") + @DecimalMax(value = "9999999.99", message = "工资金额最大值为9999999.99") + private BigDecimal deptTotalCost; + + /** 人员数量 */ + @ExcelProperty(index = 3) + @NotNull(message = "部门人数不能为空") + @Positive(message = "部门人数必须为正数") + private Long personCount; + + /** 归属公司 */ + @ExcelProperty(index = 4) + @NotEmpty(message = "所属单位不能为空") + private String companyName; + + @ExcelProperty(index = 5) + @Size(max = 200, message = "备注长度不能超过200位") + private String remark; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/GardenWasteRecordImport.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/GardenWasteRecordImport.java new file mode 100644 index 0000000..4bc508b --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/GardenWasteRecordImport.java @@ -0,0 +1,81 @@ +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; + +import cn.idev.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.Digits; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 园林废弃物录入对象 td_garden_waste_record + * + * @author wb + * @date 2025-07-14 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class GardenWasteRecordImport { + /** 运输日期 */ + @ExcelProperty(index = 0) + @JsonFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "运输日期不能为空") + private Date transportDate; + + /** 废弃物类型(如渣土、树枝等) */ + @ExcelProperty(index = 1) + @NotEmpty(message = "废弃物类型不能为空") + private String wasteType; + + /** 运输车辆(如小型渣土车等) */ + @ExcelProperty(index = 2) + @NotEmpty(message = "运输车辆不能为空") + private String transportVehicle; + + /** 车辆载重(吨) */ + @ExcelProperty(index = 3) + @NotNull(message = "车辆载重不能为空") + @Digits(integer = 3, fraction = 2, message = "车辆载重格式应为两位小数,且整数部分不超过3位") + @DecimalMin(value = "0.00", message = "车辆载重不能小于0") + @DecimalMax(value = "999.99", message = "车辆载重最大值为999.99") + private BigDecimal vehicleLoad; + + /** 运输次数 */ + @ExcelProperty(index = 4) + @NotNull(message = "运输次数不能为空") + @Positive(message = "运输次数必须为正整数") + @Max(value = 999, message = "运输次数最大值为999") + private Long transportTimes; + + /** 总费用(元) */ + @ExcelProperty(index = 5) + @NotNull(message = "总费用不能为空") + @Digits(integer = 6, fraction = 2, message = "总费用格式应为两位小数,且整数部分不超过6位") + @DecimalMin(value = "0.00", message = "总费用不能小于0") + @DecimalMax(value = "100000.00", message = "总费用最大值为100000.00") + private BigDecimal totalCost; + + @ExcelProperty(index = 6) + @NotEmpty(message = "归属公司不能为空") + private String companyName; + + @ExcelProperty(index = 7) + private String teamIds; + + @ExcelProperty(index = 8) + @Size(max = 200, message = "备注长度不能超过200位") + private String remark; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MechanicalCostImport.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MechanicalCostImport.java new file mode 100644 index 0000000..9646367 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MechanicalCostImport.java @@ -0,0 +1,136 @@ +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; + +import cn.idev.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.Digits; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Positive; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 自有机械费用录入对象 td_mechanical_cost + * + * @author ServiceManager + * @date 2025-07-14 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MechanicalCostImport { + + /** 机械编号 */ + @ExcelProperty(index = 0) + @NotEmpty(message = "机械编号不能为空") + @Pattern(regexp = "^[A-Za-z0-9_\\-.]+$", message = "机械编码格式:为字母、数字、-、_、.组合字符串") + private String mechCode; + + /** 机械名称 */ + @ExcelProperty(index = 1) + @NotEmpty(message = "机械名称不能为空") + @Size(max = 50, message = "机械名称长度不能超过50位") + private String mechName; + + /** 机械类别(如工具类) */ + @ExcelProperty(index = 2) + @NotEmpty(message = "机械类型不能为空") + private String mechType; + + /** 车牌号 */ + @ExcelProperty(index = 3) + private String licensePlate; + + /** 车辆类别(如汽油、纯电新能源等) */ + @ExcelProperty(index = 4) + private String vehicleCategory; + + /** 车辆类型(如大型客车、轻型栏板货车等) */ + @ExcelProperty(index = 5) + private String vehicleType; + + /** 单价 */ + @ExcelProperty(index = 6) + @NotNull(message = "单价不能为空") + @Digits(integer = 7, fraction = 2, message = "单价格式应为两位小数,且整数部分不超过7位") + @DecimalMax(value = "9999999.99", message = "单价最大值为9999999.99") + private BigDecimal unitPrice; + + /** 数量 */ + @ExcelProperty(index = 7) + @NotNull(message = "数量不能为空") + @Positive(message = "数量必须为正整数") + private Long quantity; + + /** 开始使用时间 */ + @ExcelProperty(index = 8) + @JsonFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "开始使用时间不能为空") + private Date startUseTime; + + /** 使用年限 */ + @ExcelProperty(index = 9) + @NotNull(message = "使用年限不能为空") + @Positive(message = "使用年限必须为正整数") + private Long serviceLife; + + /** 状态(0正常 1停用) */ + @ExcelProperty(index = 10) + @NotNull(message = "当前状态不能为空") + @Min(value = 0, message = "状态只能为0(在用)或1(报废)") + @Max(value = 1, message = "状态只能为0(在用)或1(报废)") + private Long status; + + private String statusTxt; + + /** 归属公司 */ + @ExcelProperty(index = 11) + @NotEmpty(message = "归属公司不能为空") + private String companyName; + + /** 所属班组 */ + @ExcelProperty(index = 12) + @NotEmpty(message = "所属班组不能为空") + private String teamIds; + + /** 备注 */ + @ExcelProperty(index = 13) + @Size(max = 200, message = "备注长度不能超过200位") + private String remark; + + + // 设置status时自动更新statusTxt + public void setStatus(Long status) { + this.status = status; + updateStatusTxt(); + } + + private void updateStatusTxt() { + if (status == null) { + statusTxt = null; + return; + } + + switch (status.intValue()) { + case 0: + statusTxt = "在用"; + break; + case 1: + statusTxt = "报废"; + break; + default: + statusTxt = "未知状态"; + } + } +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/PersonalCostImport.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/PersonalCostImport.java new file mode 100644 index 0000000..9fb90a2 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/PersonalCostImport.java @@ -0,0 +1,73 @@ +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; + +import cn.idev.excel.annotation.ExcelProperty; +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.Digits; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * 人员费用录入 - 个人费用对象 td_personal_cost + * + * @author wb + * @date 2025-07-14 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class PersonalCostImport +{ + + /** 工资年月(如202506) */ + @ExcelProperty(index = 0) + @NotEmpty(message = "工资年月不能为空") + @Pattern(regexp = "^\\d{4}(0[1-9]|1[0-2])$", message = "工资年月格式错误,必须为yyyyMM(如202301)") + private String salaryMonth; + + /** 姓名 */ + @ExcelProperty(index = 1) + @NotEmpty(message = "姓名不能为空") + @Size(max = 50, message = "姓名长度不能超过50位") + @Pattern(regexp = "^[\u4e00-\u9fa5·]+$", message = "姓名只能包含汉字或点号(·)") + private String name; + + /** 工资金额 */ + @ExcelProperty(index = 2) + @NotNull(message = "工资金额不能为空") + @Digits(integer = 7, fraction = 2, message = "工资金额格式应为两位小数,且整数部分不超过7位") + @DecimalMax(value = "9999999.99", message = "工资金额最大值为9999999.99") + private BigDecimal salaryAmount; + + /** 岗位名称 */ + @ExcelProperty(index = 3) + @NotEmpty(message = "岗位名称不能为空") + @Size(max = 50, message = "岗位名称长度不能超过50位") + private String postName; + + /** 岗位类别(如正式员工、外包员工等) */ + @ExcelProperty(index = 4) + @NotEmpty(message = "岗位类别不能为空") + private String postCategory; + + @ExcelProperty(index = 5) + @NotEmpty(message = "所属单位不能为空") + private String companyName; + + @ExcelProperty(index = 6) + @NotEmpty(message = "所属班组不能为空") + private String teamIds; + + /** 备注 */ + @ExcelProperty(index = 7) + @Size(max = 200, message = "备注长度不能超过200位") + private String remark; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/RentalMechanicalCostImport.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/RentalMechanicalCostImport.java new file mode 100644 index 0000000..205950a --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/RentalMechanicalCostImport.java @@ -0,0 +1,104 @@ +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; + +import cn.idev.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.Digits; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Positive; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 租赁机械费用录入对象 td_rental_mechanical_cost + * + * @author wb + * @date 2025-07-14 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RentalMechanicalCostImport { + + /** 机械名称 */ + @ExcelProperty(index = 0) + @NotEmpty(message = "机械名称不能为空") + @Size(max = 50, message = "机械名称长度不能超过50位") + private String mechName; + + /** 机械类型 */ + @ExcelProperty(index = 1) + @NotEmpty(message = "机械类别不能为空") + private String mechType; + + /** 租赁总价格 */ + @ExcelProperty(index = 2) + @NotNull(message = "租赁总价格不能为空") + @Digits(integer = 7, fraction = 2, message = "租赁总价格格式应为两位小数,且整数部分不超过7位") + @DecimalMax(value = "9999999.99", message = "租赁总价格最大值为9999999.99") + private BigDecimal rentalTotalPrice; + + /** 车牌号 */ + @ExcelProperty(index = 3) + @Size(max = 50, message = "车牌号长度不能超过50位") + private String licensePlate; + + /** 车辆类别(如汽油、纯电新能源等) */ + @ExcelProperty(index = 4) + private String vehicleCategory; + + /** 车辆类型(如大型客车、轻型栏板货车等) */ + @ExcelProperty(index = 5) + private String vehicleType; + + /** 数量 */ + @ExcelProperty(index = 6) + @NotNull(message = "数量不能为空") + @Positive(message = "数量必须为正整数") + private Long quantity; + + /** 开始使用时间 */ + @ExcelProperty(index = 7) + @JsonFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "开始使用时间不能为空") + private Date startUseTime; + + /** 使用时长(天) */ + @ExcelProperty(index = 8) + @NotNull(message = "使用时长不能为空") + @Positive(message = "使用时长必须为正整数") + @Max(value = 3650, message = "使用时长最大值为3650") + private Long useDuration; + + /** 归属公司 */ + @ExcelProperty(index = 9) + @NotEmpty(message = "归属公司不能为空") + private String companyName; + + /** 所属班组 */ + @ExcelProperty(index = 10) + @NotEmpty(message = "所属班组不能为空") + private String teamIds; + + /** 权重 */ + @ExcelProperty(index = 11) + @NotEmpty(message = "权重不能为空") + @Pattern(regexp = "^[1-9]\\d*(?:[,][1-9]\\d*)*$", message = "权重必须为正整数,多个时用逗号分隔") + private String weight; + + /** 备注 */ + @ExcelProperty(index = 12) + @Size(max = 200, message = "备注长度不能超过200位") + private String remark; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/WaterFeeImport.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/WaterFeeImport.java new file mode 100644 index 0000000..8cd9bf4 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/WaterFeeImport.java @@ -0,0 +1,65 @@ +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; + +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.Digits; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import cn.idev.excel.annotation.ExcelProperty; + +import java.math.BigDecimal; + +/** + * 水费录入信息对象 td_water_fee + * + * @author wb + * @date 2025-07-14 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class WaterFeeImport +{ + + /** 水费年月(String 类型:@NotEmpty+@Pattern 正常) */ + @ExcelProperty(index = 0) + @NotEmpty(message = "水费年月不能为空") + @Pattern(regexp = "^\\d{4}(0[1-9]|1[0-2])$", message = "水费年月格式错误,必须为yyyyMM(如202301)") + private String feeMonth; + + /** 水表编码(String 类型:@NotEmpty+@Pattern 正常) */ + @ExcelProperty(index = 1) + @NotEmpty(message = "水表编码不能为空") + @Pattern(regexp = "^\\d{9}$", message = "水表编码必须由9位数字组成") + private String meterCode; + + /** 水表地址(非必填,无注解冲突) */ + @ExcelProperty(index = 2) + private String meterAddress; + + /** 水表门牌号码(非必填,无注解冲突) */ + @ExcelProperty(index = 3) + private String meterDoorplate; + + /** + * 用水量(BigDecimal 类型:替换为数值专用注解) + * 需求:必填 + 两位小数 + 最大值9999999.99 + 总长度不超过16位(整数7位+小数2位=9位,满足≤16) + */ + @ExcelProperty(index = 4) + @NotNull(message = "用水量不能为空") // 数值类型非空用 @NotNull(替代 @NotEmpty) + @Digits(integer = 7, fraction = 2, message = "用水量格式应为两位小数,且整数部分不超过7位") // 替代 @Pattern + @DecimalMax(value = "9999999.99", message = "用水量最大值为9999999.99") // 替代 @Max(支持 BigDecimal) + private BigDecimal waterUsage; + + /** 总水费(BigDecimal 类型:同用水量注解逻辑) */ + @ExcelProperty(index = 5) + @NotNull(message = "总水费不能为空") + @Digits(integer = 7, fraction = 2, message = "总水费格式应为两位小数,且整数部分不超过7位") + @DecimalMax(value = "9999999.99", message = "总水费最大值为9999999.99") + private BigDecimal totalFee; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/MechanicalCostController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/MechanicalCostController.java index 325370c..b151e63 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/MechanicalCostController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/MechanicalCostController.java @@ -1,38 +1,31 @@ package com.zteits.urbanops.module.garden.controller.admin.mechanicalcost; -import com.zteits.urbanops.module.garden.controller.admin.personalcost.vo.PersonalCostRespVO; -import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; -import com.zteits.urbanops.module.garden.enums.CostFeeConstants; -import com.zteits.urbanops.module.garden.service.teambizdomainrel.TeamBizdomainRelService; -import org.springframework.web.bind.annotation.*; -import jakarta.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.security.access.prepost.PreAuthorize; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Operation; - -import jakarta.validation.constraints.*; -import jakarta.validation.*; -import jakarta.servlet.http.*; -import java.util.*; -import java.io.IOException; -import java.util.stream.Collectors; - +import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import com.zteits.urbanops.framework.common.pojo.CommonResult; import com.zteits.urbanops.framework.common.pojo.PageParam; import com.zteits.urbanops.framework.common.pojo.PageResult; -import com.zteits.urbanops.framework.common.pojo.CommonResult; import com.zteits.urbanops.framework.common.util.object.BeanUtils; -import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; - import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; - -import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; -import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; - -import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.*; +import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.MechanicalCostPageReqVO; +import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.MechanicalCostRespVO; +import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.MechanicalCostSaveReqVO; import com.zteits.urbanops.module.garden.dal.dataobject.mechanicalcost.MechanicalCostDO; import com.zteits.urbanops.module.garden.service.mechanicalcost.MechanicalCostService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - 自有机械费用录入") @RestController @@ -43,8 +36,6 @@ public class MechanicalCostController { @Resource private MechanicalCostService mechanicalCostService; - @Resource - TeamBizdomainRelService teamBizdomainRelService; @PostMapping("/create") @Operation(summary = "创建自有机械费用录入") @@ -85,23 +76,7 @@ public class MechanicalCostController { @PreAuthorize("@ss.hasPermission('garden:mechanical-cost:query')") public CommonResult getMechanicalCost(@RequestParam("id") Long id) { MechanicalCostDO mechanicalCost = mechanicalCostService.getMechanicalCost(id); - - //add by wq 20251119 前端返回集合 - MechanicalCostRespVO mechanicalCostRespVO = null; - if (mechanicalCost != null) { - mechanicalCostRespVO = BeanUtils.toBean(mechanicalCost, MechanicalCostRespVO.class); - - List teamBizdomainRelList = teamBizdomainRelService.getTeamBizdomainRelList(mechanicalCost.getId(), CostFeeConstants.COSTFEE_MECHANICAL); - mechanicalCostRespVO.setTeamIds(teamBizdomainRelList); - // 提取团队ID列表(使用Stream简化循环) - List teamIdList = teamBizdomainRelList.stream() - .map(TeamBizdomainRelDO::getTeamId) // 提取teamId - .filter(Objects::nonNull) // 过滤null值(可选,根据业务需要) - .collect(Collectors.toList()); - mechanicalCostRespVO.setTeamIdList(teamIdList); - } - //add by wq 20251119 前端返回集合 - return success(mechanicalCostRespVO); + return success(BeanUtils.toBean(mechanicalCost, MechanicalCostRespVO.class)); } @GetMapping("/page") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostPageReqVO.java index 95bd969..0a13d83 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostPageReqVO.java @@ -1,16 +1,14 @@ package com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo; -import cn.idev.excel.annotation.ExcelProperty; -import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; -import lombok.*; - -import java.time.LocalDate; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; import com.zteits.urbanops.framework.common.pojo.PageParam; -import java.math.BigDecimal; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.List; import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -63,7 +61,7 @@ public class MechanicalCostPageReqVO extends PageParam { private String companyId; @Schema(description = "部门id", example = "13645") - private Long deptId; + private List deptId; @Schema(description = "备注", example = "随便") private String remark; @@ -71,10 +69,4 @@ public class MechanicalCostPageReqVO extends PageParam { @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; - - @ExcelProperty("班组") - private List teamIds; - - private List teamIdList; - } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostRespVO.java index 48fe662..1d81203 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostRespVO.java @@ -1,15 +1,15 @@ package com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo; -import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; +import cn.hutool.core.annotation.Alias; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; +import lombok.Data; -import java.time.LocalDate; -import java.util.*; import java.math.BigDecimal; -import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDate; import java.time.LocalDateTime; -import cn.idev.excel.annotation.*; +import java.util.List; @Schema(description = "管理后台 - 自有机械费用录入 Response VO") @Data @@ -76,10 +76,6 @@ public class MechanicalCostRespVO { @ExcelProperty("归属公司ID") private String companyId; - @Schema(description = "部门id", example = "13645") - @ExcelProperty("部门id") - private Long deptId; - @Schema(description = "备注", example = "随便") @ExcelProperty("备注") private String remark; @@ -88,9 +84,9 @@ public class MechanicalCostRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "班组", example = "班组") @ExcelProperty("班组") - private List teamIds; - - private List teamIdList; + @Alias("deptId") + private List teamIdList; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostSaveReqVO.java index 465c029..5e08b77 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostSaveReqVO.java @@ -76,6 +76,4 @@ public class MechanicalCostSaveReqVO { @ExcelProperty("班组") private List teamIds; - private List teamIdList; - } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/PersonalCostController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/PersonalCostController.java index 4691b28..ce66744 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/PersonalCostController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/PersonalCostController.java @@ -34,14 +34,12 @@ import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - 人员费用录入 - 个人费用") @RestController -@RequestMapping("/garden/personal-cost") +@RequestMapping({"/garden/personal-cost", "/costfee/personalcost"}) @Validated public class PersonalCostController { @Resource private PersonalCostService personalCostService; - @Resource - TeamBizdomainRelService teamBizdomainRelService; @PostMapping("/create") @Operation(summary = "创建人员费用录入 - 个人费用") @@ -82,22 +80,7 @@ public class PersonalCostController { @PreAuthorize("@ss.hasPermission('garden:personal-cost:query')") public CommonResult getPersonalCost(@RequestParam("id") Long id) { PersonalCostDO personalCost = personalCostService.getPersonalCost(id); - //add by wq 20251119 前端返回集合 - PersonalCostRespVO personalCostRespVO = null; - if (personalCost != null) { - personalCostRespVO = BeanUtils.toBean(personalCost, PersonalCostRespVO.class); - - List teamBizdomainRelList = teamBizdomainRelService.getTeamBizdomainRelList(personalCost.getId(), CostFeeConstants.COSTFEE_PERSONAL); - personalCostRespVO.setTeamIds(teamBizdomainRelList); - // 提取团队ID列表(使用Stream简化循环) - List teamIdList = teamBizdomainRelList.stream() - .map(TeamBizdomainRelDO::getTeamId) // 提取teamId - .filter(Objects::nonNull) // 过滤null值(可选,根据业务需要) - .collect(Collectors.toList()); - personalCostRespVO.setTeamIdList(teamIdList); - } - //add by wq 20251119 前端返回集合 - return success(personalCostRespVO); + return success(BeanUtils.toBean(personalCost, PersonalCostRespVO.class)); } @GetMapping("/page") @@ -108,6 +91,13 @@ public class PersonalCostController { return success(BeanUtils.toBean(pageResult, PersonalCostRespVO.class)); } + @GetMapping("/list") + @Operation(summary = "获得人员费用录入 - 个人费用分页") + @PreAuthorize("@ss.hasPermission('garden:personal-cost:query')") + public CommonResult> list(@Valid PersonalCostPageReqVO pageReqVO) { + PageResult pageResult = personalCostService.getPersonalCostPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, PersonalCostRespVO.class)); + } @GetMapping("/export-excel") @Operation(summary = "导出人员费用录入 - 个人费用 Excel") @PreAuthorize("@ss.hasPermission('garden:personal-cost:export')") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostPageReqVO.java index 345bc8b..45f63a7 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostPageReqVO.java @@ -1,12 +1,13 @@ package com.zteits.urbanops.module.garden.controller.admin.personalcost.vo; -import lombok.*; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; import com.zteits.urbanops.framework.common.pojo.PageParam; -import java.math.BigDecimal; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -36,7 +37,7 @@ public class PersonalCostPageReqVO extends PageParam { private String companyId; @Schema(description = "部门id", example = "18461") - private Long deptId; + private List deptId; @Schema(description = "备注", example = "随便") private String remark; @@ -45,4 +46,4 @@ public class PersonalCostPageReqVO 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-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostRespVO.java index 58419d1..fe9f4d8 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostRespVO.java @@ -1,13 +1,14 @@ package com.zteits.urbanops.module.garden.controller.admin.personalcost.vo; -import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; +import cn.hutool.core.annotation.Alias; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; +import lombok.Data; + import java.math.BigDecimal; -import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; -import cn.idev.excel.annotation.*; +import java.util.List; @Schema(description = "管理后台 - 人员费用录入 - 个人费用 Response VO") @Data @@ -46,10 +47,6 @@ public class PersonalCostRespVO { @ExcelProperty("归属公司ID") private String companyId; - @Schema(description = "部门id", example = "18461") - @ExcelProperty("部门id") - private Long deptId; - @Schema(description = "备注", example = "随便") @ExcelProperty("备注") private String remark; @@ -58,10 +55,8 @@ public class PersonalCostRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "班组", example = "班组") @ExcelProperty("班组") - private List teamIds; - - private List teamIdList; - - + @Alias("deptId") + private List teamIdList; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostSaveReqVO.java index 1899a55..f618eaa 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostSaveReqVO.java @@ -41,12 +41,9 @@ public class PersonalCostSaveReqVO { @NotEmpty(message = "归属公司ID不能为空") private String companyId; - @Schema(description = "部门id", example = "18461") - private Long deptId; - @Schema(description = "备注", example = "随便") private String remark; - @ExcelProperty("班组") private List teamIds; + } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/RentalMechanicalCostController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/RentalMechanicalCostController.java index 43c0479..93adbfc 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/RentalMechanicalCostController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/RentalMechanicalCostController.java @@ -42,8 +42,7 @@ public class RentalMechanicalCostController { @Resource private RentalMechanicalCostService rentalMechanicalCostService; - @Resource - TeamBizdomainRelService teamBizdomainRelService; + @PostMapping("/create") @Operation(summary = "创建租赁机械费用录入") @PreAuthorize("@ss.hasPermission('garden:rental-mechanical-cost:create')") @@ -83,17 +82,7 @@ public class RentalMechanicalCostController { @PreAuthorize("@ss.hasPermission('garden:rental-mechanical-cost:query')") public CommonResult getRentalMechanicalCost(@RequestParam("id") Long id) { RentalMechanicalCostDO rentalMechanicalCost = rentalMechanicalCostService.getRentalMechanicalCost(id); - - //add by wq 20251119 前端返回集合 - RentalMechanicalCostRespVO mechanicalCostRespVO = null; - if (rentalMechanicalCost != null) { - mechanicalCostRespVO = BeanUtils.toBean(rentalMechanicalCost, RentalMechanicalCostRespVO.class); - - List teamBizdomainRelList = teamBizdomainRelService.getTeamBizdomainRelList(rentalMechanicalCost.getId(), CostFeeConstants.COSTFEE_RENTALMECHANICAL); - mechanicalCostRespVO.setTeamIds(teamBizdomainRelList); - } - //add by wq 20251119 前端返回集合 - return success(mechanicalCostRespVO); + return success(BeanUtils.toBean(rentalMechanicalCost, RentalMechanicalCostRespVO.class)); } @GetMapping("/page") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostPageReqVO.java index 74e6b38..b5ea97c 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostPageReqVO.java @@ -70,6 +70,6 @@ public class RentalMechanicalCostPageReqVO extends PageParam { private LocalDateTime[] createTime; @ExcelProperty("班组") - private List teamIds; + private List teamIds; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostRespVO.java index 3434731..3fe9f0d 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostRespVO.java @@ -85,6 +85,6 @@ public class RentalMechanicalCostRespVO { private LocalDateTime createTime; @ExcelProperty("班组") - private List teamIds; + private List teamIds; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostSaveReqVO.java index 2e05481..bcd231f 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostSaveReqVO.java @@ -69,5 +69,5 @@ public class RentalMechanicalCostSaveReqVO { @Schema(description = "备注", example = "你说的对") private String remark; @ExcelProperty("班组") - private List teamIds; + private List teamIds; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/TeamBizdomainRelVo.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/TeamBizdomainRelVo.java new file mode 100644 index 0000000..36773ba --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/TeamBizdomainRelVo.java @@ -0,0 +1,25 @@ +package com.zteits.urbanops.module.garden.controller.admin.rentalmechanicalcost.vo; + +import lombok.Data; + +/** + * @Classname TeamBizdomainRelVo + * @Description + * @Date 2025/11/24 20:04 + * @Created by wangqian + */ +@Data +public class TeamBizdomainRelVo { + /** + * 班组编码 + */ + private String teamId; + /** + * 班组名称 + */ + private String teamName; + /** + * 班组名称 + */ + private Long weight; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordPageReqVO.java index 277d21e..e9db82d 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordPageReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordPageReqVO.java @@ -1,16 +1,16 @@ package com.zteits.urbanops.module.garden.controller.admin.wasterecord.vo; +import cn.hutool.core.annotation.Alias; import cn.idev.excel.annotation.ExcelProperty; -import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; -import lombok.*; - -import java.time.LocalDate; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; import com.zteits.urbanops.framework.common.pojo.PageParam; -import java.math.BigDecimal; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.List; import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -56,7 +56,9 @@ public class WasteRecordPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + @Schema(description = "班组", example = "班组") @ExcelProperty("班组") - private List teamIds; + @Alias("deptId") + private List teamIdList; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordRespVO.java index 7230f10..5fc6d16 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordRespVO.java @@ -1,15 +1,15 @@ package com.zteits.urbanops.module.garden.controller.admin.wasterecord.vo; -import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; +import cn.hutool.core.annotation.Alias; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; +import lombok.Data; -import java.time.LocalDate; -import java.util.*; import java.math.BigDecimal; -import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDate; import java.time.LocalDateTime; -import cn.idev.excel.annotation.*; +import java.util.List; @Schema(description = "管理后台 - 园林废弃物录入 Response VO") @Data @@ -56,10 +56,6 @@ public class WasteRecordRespVO { @ExcelProperty("归属公司ID") private String companyId; - @Schema(description = "部门id", example = "26656") - @ExcelProperty("部门id") - private Long deptId; - @Schema(description = "备注", example = "你说的对") @ExcelProperty("备注") private String remark; @@ -68,7 +64,9 @@ public class WasteRecordRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "班组", example = "班组") @ExcelProperty("班组") - private List teamIds; + @Alias("deptId") + private List teamIdList; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/waterfee/WaterFeeController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/waterfee/WaterFeeController.java index 6e5ba7c..0d484ca 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/waterfee/WaterFeeController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/waterfee/WaterFeeController.java @@ -31,7 +31,7 @@ import com.zteits.urbanops.module.garden.service.waterfee.WaterFeeService; @Tag(name = "管理后台 - 水费录入信息") @RestController -@RequestMapping("/garden/water-fee") +@RequestMapping({"/costfee/waterfee", "/garden/water-fee"}) @Validated public class WaterFeeController { @@ -87,6 +87,13 @@ public class WaterFeeController { PageResult pageResult = waterFeeService.getWaterFeePage(pageReqVO); return success(BeanUtils.toBean(pageResult, WaterFeeRespVO.class)); } + @GetMapping("/list") + @Operation(summary = "获得水费录入信息分页") + @PreAuthorize("@ss.hasPermission('garden:water-fee:query')") + public CommonResult> list(@Valid WaterFeePageReqVO pageReqVO) { + PageResult pageResult = waterFeeService.getWaterFeePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, WaterFeeRespVO.class)); + } @GetMapping("/export-excel") @Operation(summary = "导出水费录入信息 Excel") @@ -101,4 +108,4 @@ public class WaterFeeController { BeanUtils.toBean(list, WaterFeeRespVO.class)); } -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/mechanicalcost/MechanicalCostDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/mechanicalcost/MechanicalCostDO.java index 77eec8a..6e0fd7b 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/mechanicalcost/MechanicalCostDO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/mechanicalcost/MechanicalCostDO.java @@ -1,21 +1,23 @@ package com.zteits.urbanops.module.garden.dal.dataobject.mechanicalcost; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; import lombok.*; -import java.time.LocalDate; -import java.util.*; import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import com.baomidou.mybatisplus.annotation.*; -import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; +import java.time.LocalDate; +import java.util.List; /** * 自有机械费用录入 DO * * @author 超级管理员 */ -@TableName("garden_mechanical_cost") +@TableName( value = "garden_mechanical_cost", autoResultMap = true) @KeySequence("garden_mechanical_cost_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @Data @EqualsAndHashCode(callSuper = true) @@ -89,7 +91,8 @@ public class MechanicalCostDO extends BaseDO { /** * 部门id */ - private Long deptId; + @TableField(typeHandler = JacksonTypeHandler.class) + private List deptId; /** * 备注 */ diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/personalcost/PersonalCostDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/personalcost/PersonalCostDO.java index a42e53e..16da4b1 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/personalcost/PersonalCostDO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/personalcost/PersonalCostDO.java @@ -1,69 +1,73 @@ -package com.zteits.urbanops.module.garden.dal.dataobject.personalcost; - -import lombok.*; -import java.util.*; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import com.baomidou.mybatisplus.annotation.*; -import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; - -/** - * 人员费用录入 - 个人费用 DO - * - * @author 超级管理员 - */ -@TableName("garden_personal_cost") -@KeySequence("garden_personal_cost_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class PersonalCostDO extends BaseDO { - - /** - * 记录ID,自增主键 - */ - @TableId - private Long id; - /** - * 工资年月(如202506) - */ - private String salaryMonth; - /** - * 姓名 - */ - private String name; - /** - * 工资金额 - */ - private BigDecimal salaryAmount; - /** - * 岗位名称 - */ - private String postName; - /** - * 岗位类别(如正式员工、外包员工等) - */ - private String postCategory; - /** - * 归属公司 - */ - private String companyName; - /** - * 归属公司ID - */ - private String companyId; - /** - * 部门id - */ - private Long deptId; - /** - * 备注 - */ - private String remark; - - -} \ No newline at end of file +package com.zteits.urbanops.module.garden.dal.dataobject.personalcost; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 人员费用录入 - 个人费用 DO + * + * @author 超级管理员 + */ +@TableName(value = "garden_personal_cost", autoResultMap = true) +@KeySequence("garden_personal_cost_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PersonalCostDO extends BaseDO { + + /** + * 记录ID,自增主键 + */ + @TableId + private Long id; + /** + * 工资年月(如202506) + */ + private String salaryMonth; + /** + * 姓名 + */ + private String name; + /** + * 工资金额 + */ + private BigDecimal salaryAmount; + /** + * 岗位名称 + */ + private String postName; + /** + * 岗位类别(如正式员工、外包员工等) + */ + private String postCategory; + /** + * 归属公司 + */ + private String companyName; + /** + * 归属公司ID + */ + private String companyId; + /** + * 部门id + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List deptId; + /** + * 备注 + */ + private String remark; + + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/rentalmechanicalcost/RentalMechanicalCostDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/rentalmechanicalcost/RentalMechanicalCostDO.java index 5d9b4da..b9820f0 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/rentalmechanicalcost/RentalMechanicalCostDO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/rentalmechanicalcost/RentalMechanicalCostDO.java @@ -1,21 +1,24 @@ package com.zteits.urbanops.module.garden.dal.dataobject.rentalmechanicalcost; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; +import com.zteits.urbanops.module.garden.controller.admin.rentalmechanicalcost.vo.TeamBizdomainRelVo; import lombok.*; -import java.time.LocalDate; -import java.util.*; import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import com.baomidou.mybatisplus.annotation.*; -import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; +import java.time.LocalDate; +import java.util.List; /** * 租赁机械费用录入 DO * * @author 超级管理员 */ -@TableName("garden_rental_mechanical_cost") +@TableName(value = "garden_rental_mechanical_cost", autoResultMap = true) @KeySequence("garden_rental_mechanical_cost_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @Data @EqualsAndHashCode(callSuper = true) @@ -85,7 +88,8 @@ public class RentalMechanicalCostDO extends BaseDO { /** * 班组ID数组(多选) */ - private String teamIds; + @TableField(typeHandler = JacksonTypeHandler.class) + private List teamIds; /** * 道路ID数组(多选) */ diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/wasterecord/WasteRecordDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/wasterecord/WasteRecordDO.java index c1b7b23..ddbe19e 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/wasterecord/WasteRecordDO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/wasterecord/WasteRecordDO.java @@ -1,16 +1,16 @@ package com.zteits.urbanops.module.garden.dal.dataobject.wasterecord; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; import lombok.*; -import java.time.LocalDate; -import java.util.*; -import java.math.BigDecimal; import java.math.BigDecimal; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import com.baomidou.mybatisplus.annotation.*; -import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; +import java.time.LocalDate; +import java.util.List; /** * 园林废弃物录入 DO @@ -71,7 +71,8 @@ public class WasteRecordDO extends BaseDO { /** * 部门id */ - private Long deptId; + @TableField(typeHandler = JacksonTypeHandler.class) + private List deptId; /** * 状态(0正常 1停用) */ diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CostFeeConstants.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CostFeeConstants.java index 7bc6aa7..23fbfc3 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CostFeeConstants.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CostFeeConstants.java @@ -19,4 +19,8 @@ public class CostFeeConstants { public static final String COSTFEE_MECHANICAL = "costFee_mechanical"; public static final String COSTFEE_RENTALMECHANICAL = "costFee_rentalmechanical"; + + + public static final String MECH_TYPE = "车类"; + } 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 20f10e1..eb09c44 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 @@ -27,6 +27,8 @@ public interface ErrorCodeConstants { ErrorCode COST_FEE_NOT_EXISTS = new ErrorCode(1-100-003-000, "费用已录入"); + ErrorCode COST_FEE_NOT_EXISTS_001 = new ErrorCode(1-100-003-001, "未找到对应的导入类"); + // ========== 部门费用费用 ========== ErrorCode DEPARTMENT_COST_NOT_EXISTS_01 = new ErrorCode(1-100-003-001, "部门费用为空"); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java new file mode 100644 index 0000000..08c01b2 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java @@ -0,0 +1,126 @@ +package com.zteits.urbanops.module.garden.enums; + +import com.zteits.urbanops.module.garden.controller.admin.costfee.vo.*; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +/** + * Excel导入模板枚举 + * 存储模板编码、名称、起始行索引及对应的数据导入类 + */ +@Getter +@AllArgsConstructor +public enum TemplateEnum { + + // 模板枚举值:编码、名称、起始行索引、导入数据类,是否需要预览 + COSTFEE_WATER( + "costFree_water", + "水表费用导入模板.xlsx", + 2, + WaterFeeImport.class, + true + ), + COSTFEE_PERSONAL( // 修正原枚举名拼写错误(PRESONAL → PERSONAL) + "costFree_presonal", + "人员费用导入模板.xlsx", + 2, + PersonalCostImport.class, + true // 新增默认值 + ); +// COSTFEE_DEPARTMENT( +// "costFee_department", +// "综合费用导入模板.xlsx", +// 1, +// DepartmentCostImport.class, +// true // 新增默认值 +// ), +// COSTFEE_GARDENWASTE( +// "costFee_gardenWaste", +// "园林废弃物费用导入模板.xlsx", +// 1, +// GardenWasteRecordImport.class, +// true // 新增默认值 +// ), +// COSTFEE_MECHANICAL( +// "costFee_mechanical", +// "自有机械费用导入模板.xlsx", +// 1, +// MechanicalCostImport.class, +// true // 新增默认值 +// ), +// COSTFEE_RENTALMECHANICAL( +// "costFee_rentalmechanical", +// "租赁机械费用导入模板.xlsx", +// 1, +// RentalMechanicalCostImport.class, +// true // 新增默认值 +// ); + + // 模板编码(前端传递的标识) + private final String code; + // 模板名称(用于下载时的文件名) + private final String name; + // 数据起始行索引(Excel中从第几行开始读取数据) + private final int startIndex; + // 导入数据对应的实体类(用于反射解析Excel) + private final Class importClass; + // 是否需要预览功能 + private final boolean needPreview; + + // 缓存:code → 枚举映射(优化查询性能) + private static final Map CODE_MAP = new HashMap<>(); + + // 静态块初始化缓存 + static { + for (TemplateEnum template : values()) { + CODE_MAP.put(template.code, template); + } + } + + /** + * 根据编码获取枚举(优化查询性能) + */ + public static TemplateEnum getByCode(String code) { + // 空值校验 + if (code == null || code.trim().isEmpty()) { + throw new RuntimeException("模板编码不能为空"); + } + // 从缓存获取,避免循环遍历 + TemplateEnum template = CODE_MAP.get(code); + if (template == null) { + throw new RuntimeException("无效的模板编码:" + code); + } + return template; + } + + /** + * 根据编码获取模板名称(简化调用) + */ + public static String getNameByCode(String code) { + return getByCode(code).name; + } + + /** + * 根据编码获取导入类(用于Controller层反射解析) + */ + public static Class getImportClassByCode(String code) { + return getByCode(code).importClass; + } + + /** + * 根据编码获取是否需要预览 + */ + public static boolean isPreviewRequired(String code) { + return getByCode(code).needPreview; + } + + /** + * 检查编码是否存在(避免直接抛出异常的场景) + */ + public static boolean containsCode(String code) { + return code != null && CODE_MAP.containsKey(code); + } +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeService.java new file mode 100644 index 0000000..f106863 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeService.java @@ -0,0 +1,64 @@ +package com.zteits.urbanops.module.garden.service.costfee; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.zteits.urbanops.module.garden.controller.admin.costfee.CostFeeController; +import com.zteits.urbanops.module.garden.enums.TemplateEnum; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * @Classname ICostFeeService + * @Description 模板导入公共接口 + * @Date 2025/7/20 15:10 + * @Created by wangqian + */ +public interface CostFeeService { + + /** + * @Author wangqian + * @Description 导入数据保存redis + * @Date 2025/7/20 15:36 + * @Param dataList + * @param templateName + * @Return java.lang.String + */ + public String saveDataToRedis(List dataList, String templateName); + + /** + * @Author wangqian + * @Description 导入数据保存到数据库 + * @Date 2025/7/20 15:36 + * @Param batchId + * @param templateName + * @param operator + * @Return int + */ + public int submitImport(String batchId, String templateName, String operator); + + /** + * @Author wangqian + * @Description 预览分页查询 + * @Date 2025/7/20 15:36 + * @Param batchId + * @param templateName + * @param page + * @param size + * @param clazz + * @Return com.servicemanager.project.costfee.controller.CostFeeController.PageResult + */ + public CostFeeController.PageResult getPagedDataFromRedis(String batchId, String templateName, + int page, int size, Class clazz) throws IOException; + + /** + * @Author wangqian + * @Description 导入内容校验 + * @Date 2025/11/24 8:40 + * @Param dataList + * @param template + * @Return void + */ + public void validateImportData(List dataList, TemplateEnum template); + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java new file mode 100644 index 0000000..f1d5098 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java @@ -0,0 +1,472 @@ +package com.zteits.urbanops.module.garden.service.costfee; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.zteits.urbanops.framework.security.core.LoginUser; +import com.zteits.urbanops.module.garden.controller.admin.costfee.CostFeeController; +import com.zteits.urbanops.module.garden.controller.admin.costfee.vo.*; +import com.zteits.urbanops.module.garden.enums.TemplateEnum; +import jakarta.annotation.Resource; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Validator; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundHashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.io.IOException; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getLoginUserDeptId; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.COST_FEE_NOT_EXISTS_001; + +/** + * @Classname CostFeeService + * @Description 模板导入公共实现 + * @Date 2025/7/20 15:12 + * @Created by wangqian + */ +@Service +@Slf4j +public class CostFeeServiceImpl implements CostFeeService { + + // Redis相关配置 + private static final String REDIS_KEY_PREFIX = "excel:import:"; + private static final long EXPIRE_TIME = 30; // 预览数据过期时间:30分钟 + private static final TimeUnit EXPIRE_UNIT = TimeUnit.MINUTES; + @Autowired + private RedisTemplate redisTemplate; + @Autowired + private ObjectMapper objectMapper; + @Resource + private Validator validator; + + + @Override + /** + * 保存数据到Redis + */ + public String saveDataToRedis(List dataList, String templateName){ + String batchId = UUID.randomUUID().toString().replace("-", ""); + String redisKey = REDIS_KEY_PREFIX + templateName + ":" + batchId; + + // 存储总记录数 + redisTemplate.opsForValue().set( + redisKey + ":total", + String.valueOf(dataList.size()), + EXPIRE_TIME, + EXPIRE_UNIT + ); + + // 使用Hash存储每条数据(key:索引,value:JSON字符串) + BoundHashOperations hashOps = redisTemplate.boundHashOps(redisKey + ":items"); + try { + for (int i = 0; i < dataList.size(); i++) { + String jsonData = objectMapper.writeValueAsString(dataList.get(i)); + hashOps.put(String.valueOf(i), jsonData); + } + } catch (JsonProcessingException e) { + log.error(e.getMessage()); + } + // 设置Hash过期时间 + hashOps.expire(EXPIRE_TIME, EXPIRE_UNIT); + + log.info("数据保存到Redis成功,批次ID:{},记录数:{}", batchId, dataList.size()); + return batchId; + } + + @Override + @Transactional + public int submitImport(String batchId, String templateName, String operator){ + // 模板类型校验 + TemplateEnum template = TemplateEnum.getByCode(templateName); + Class importClass = template.getImportClass(); + if (importClass == null) { + throw exception(COST_FEE_NOT_EXISTS_001); + } + + // 分页参数设置 + int pageNum = 1; + final int pageSize = 100000; // 每页处理条数,可根据实际情况调整 + int totalImported = 0; // 总导入数量累计 + + try { + while (true) { + // 分页从Redis获取数据 + CostFeeController.PageResult pageResult = getPagedDataFromRedis( + batchId, templateName, pageNum, pageSize, importClass); + List dataList = pageResult.getData(); + + // 如果当前页无数据,说明已处理完毕 + if (dataList == null || dataList.isEmpty()) { + // 首次分页就无数据,抛出异常 + if (pageNum == 1) { + throw new IllegalArgumentException("没有可导入的数据或数据已过期"); + } + break; + } + + // 业务校验(每页单独校验) + //validateBusinessData(dataList, template); + + // 调用业务服务执行本页数据导入 + int currentPageCount = dataList.size(); + //insertData(template, dataList, operator); + totalImported += currentPageCount; + + // 打印分页处理日志(可选) + log.info("批次[{}]第{}页导入完成,本页{}条,累计{}条", + batchId, pageNum, currentPageCount, totalImported); + + // 准备下一页 + pageNum++; + + // 如果当前页数据小于页大小,说明已到最后一页 + if (dataList.size() < pageSize) { + break; + } + } + } catch (IOException e) { + log.error(e.getMessage()); + } finally { + // 无论导入成功与否,都清理Redis临时数据 + deleteRedisTempData(batchId, templateName); + } + + return totalImported; + } + + /** + * 从Redis获取分页数据 + */ + @Override + public CostFeeController.PageResult < T > getPagedDataFromRedis(String batchId, String templateName, + int page, int size, Class clazz) throws IOException { + String redisKey = REDIS_KEY_PREFIX + templateName + ":" + batchId; + + // 获取总记录数 + String totalStr = redisTemplate.opsForValue().get(redisKey + ":total"); + int total = totalStr != null ? Integer.parseInt(totalStr) : 0; + + // 计算分页范围 + int start = (page - 1) * size; + int end = Math.min(start + size - 1, total - 1); + + // 分页查询数据 + List pageData = new ArrayList<>(); + if (start <= end && total > 0) { + BoundHashOperations hashOps = redisTemplate.boundHashOps(redisKey + ":items"); + + // 批量获取指定范围的索引对应的数据 + List indexes = IntStream.rangeClosed(start, end) + .mapToObj(String::valueOf) + .collect(Collectors.toList()); + List jsonList = hashOps.multiGet(indexes); + + // 反序列化为对象 + for (String json : jsonList) { + if (json != null) { + pageData.add(objectMapper.readValue(json, clazz)); + } + } + } + + return new CostFeeController.PageResult<>(page, size, total, pageData); + } + + + /** + * 从Redis获取全部数据 + */ + private List < T > getAllDataFromRedis(String batchId, String templateName, Class < T > clazz) throws + IOException { + String redisKey = REDIS_KEY_PREFIX + templateName + ":" + batchId; + BoundHashOperations hashOps = redisTemplate.boundHashOps(redisKey + ":items"); + + // 获取所有数据的JSON字符串 + List jsonList = hashOps.values(); + List dataList = new ArrayList<>(jsonList.size()); + + // 反序列化为对象 + for (String json : jsonList) { + if (json != null) { + dataList.add(objectMapper.readValue(json, clazz)); + } + } + + return dataList; + } + + + /** + * 删除Redis临时数据 + */ + private void deleteRedisTempData (String batchId, String templateName){ + String redisKey = REDIS_KEY_PREFIX + templateName + ":" + batchId; + redisTemplate.delete(redisKey + ":total"); + redisTemplate.delete(redisKey + ":items"); + log.info("Redis临时数据已删除,批次ID:{}", batchId); + } + /** + * @Author wangqian + * @Description 导入内容校验 + * @Date 2025/11/24 8:40 + * @Param dataList + * @param template + * @Return void + */ + public void validateImportData(List dataList, TemplateEnum template) { + if (CollectionUtils.isEmpty(dataList)) { + return; // 空列表无需校验 + } + LoginUser user = getLoginUser(); + Long deptId = getLoginUserDeptId(); + // 模板类型校验 + Class importClass = template.getImportClass(); // 从枚举获取导入类,避免switch + // 根据不同模板类型执行不同的处理逻辑 + if (WaterFeeImport.class.isAssignableFrom(importClass)) { + + List importList = (List) dataList; + // 2. 遍历,逐个创建 + for (int i = 0; i < importList.size(); i++) { + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) + WaterFeeImport importBean = importList.get(i); + + try { + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) + Set> violations = validator.validate(importBean); + if (!violations.isEmpty()) { + // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) + StringBuilder errorMsg = new StringBuilder(); + for (ConstraintViolation violation : violations) { + errorMsg.append(violation.getMessage()).append(";"); + } + // 抛出包含行号和所有错误的异常 + throw new ConstraintViolationException(errorMsg.toString().trim(), violations); + } + + + } catch (ConstraintViolationException ex) { + // 5. 包装异常,明确行号 + 真实校验错误( + throw new RuntimeException(String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); + } + } + } + else if (PersonalCostImport.class.isAssignableFrom(importClass)) { + + List importList = (List) dataList; + // 2. 遍历,逐个创建 + for (int i = 0; i < importList.size(); i++) { + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) + PersonalCostImport importBean = importList.get(i); + + try { + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) + Set> violations = validator.validate(importBean); + if (!violations.isEmpty()) { + // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) + StringBuilder errorMsg = new StringBuilder(); + for (ConstraintViolation violation : violations) { + errorMsg.append(violation.getMessage()).append(";"); + } + // 抛出包含行号和所有错误的异常 + throw new ConstraintViolationException(errorMsg.toString().trim(), violations); + } + + } catch (ConstraintViolationException ex) { + // 5. 包装异常,明确行号 + 真实校验错误( + throw new RuntimeException(String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); + } + } + } + else if (GardenWasteRecordImport.class.isAssignableFrom(importClass)) { + + List importList = (List) dataList; + // 2. 遍历,逐个创建 + for (int i = 0; i < importList.size(); i++) { + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) + GardenWasteRecordImport importBean = importList.get(i); + + try { + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) + Set> violations = validator.validate(importBean); + if (!violations.isEmpty()) { + // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) + StringBuilder errorMsg = new StringBuilder(); + for (ConstraintViolation violation : violations) { + errorMsg.append(violation.getMessage()).append(";"); + } + // 抛出包含行号和所有错误的异常 + throw new ConstraintViolationException(errorMsg.toString().trim(), violations); + } + + + } catch (ConstraintViolationException ex) { + // 5. 包装异常,明确行号 + 真实校验错误( + throw new RuntimeException(String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); + } + } + } + else if (MechanicalCostImport.class.isAssignableFrom(importClass)) { + + List importList = (List) dataList; + // 2. 遍历,逐个创建 + for (int i = 0; i < importList.size(); i++) { + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) + MechanicalCostImport importBean = importList.get(i); + + try { + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) + Set> violations = validator.validate(importBean); + if (!violations.isEmpty()) { + // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) + StringBuilder errorMsg = new StringBuilder(); + for (ConstraintViolation violation : violations) { + errorMsg.append(violation.getMessage()).append(";"); + } + // 抛出包含行号和所有错误的异常 + throw new ConstraintViolationException(errorMsg.toString().trim(), violations); + } + + + } catch (ConstraintViolationException ex) { + // 5. 包装异常,明确行号 + 真实校验错误( + throw new RuntimeException(String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); + } + } + } + else if (RentalMechanicalCostImport.class.isAssignableFrom(importClass)) { + + List importList = (List) dataList; + // 2. 遍历,逐个创建 + for (int i = 0; i < importList.size(); i++) { + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) + RentalMechanicalCostImport importBean = importList.get(i); + + try { + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) + Set> violations = validator.validate(importBean); + if (!violations.isEmpty()) { + // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) + StringBuilder errorMsg = new StringBuilder(); + for (ConstraintViolation violation : violations) { + errorMsg.append(violation.getMessage()).append(";"); + } + // 抛出包含行号和所有错误的异常 + throw new ConstraintViolationException(errorMsg.toString().trim(), violations); + } + // 处理可能的空值 + String teamIdsStr = StringUtils.defaultString(importBean.getTeamIds()); + String weightsStr = StringUtils.defaultString(importBean.getWeight()); + + // 统一替换中文逗号并分割 + String[] teamIds = teamIdsStr.replace(",", ",").split(","); + String[] weights = weightsStr.replace(",", ",").split(","); + + // 校验数组长度是否一致 + if (teamIds.length != weights.length) { + throw new IllegalArgumentException(String.format( + "第%d条数据:权重值和所选班组数量不符(班组:%d个,权重:%d个)", + rowNum, teamIds.length, weights.length + )); + } + + //单位校验 + // validatecompany(rowNum, importBean.getCompanyName(), deptId); + //部门名称校验 + //validateTeams(rowNum, depts.get(data.getCompanyName()), data.getTeamIds()); + + + + } catch (ConstraintViolationException ex) { + // 5. 包装异常,明确行号 + 真实校验错误( + throw new RuntimeException(String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); + } + } + } + else if (DepartmentCostImport.class.isAssignableFrom(importClass)) { + + List importList = (List) dataList; + // 2. 遍历,逐个创建 + for (int i = 0; i < importList.size(); i++) { + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) + DepartmentCostImport importBean = importList.get(i); + + try { + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) + Set> violations = validator.validate(importBean); + if (!violations.isEmpty()) { + // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) + StringBuilder errorMsg = new StringBuilder(); + for (ConstraintViolation violation : violations) { + errorMsg.append(violation.getMessage()).append(";"); + } + // 抛出包含行号和所有错误的异常 + throw new ConstraintViolationException(errorMsg.toString().trim(), violations); + } + + + } catch (ConstraintViolationException ex) { + // 5. 包装异常,明确行号 + 真实校验错误( + throw new RuntimeException(String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); + } + } + } + } + + private void validatecompany(int rowNum, String companyName, Long deptId){ + //根据单位名称获取单位id + Long companyId = null ; + // 校验数组长度是否一致 + if (companyId == null) { + throw new IllegalArgumentException(String.format( + "第%d条数据:单位名称不正确(%s)", + rowNum, companyName + )); + } + // 校验导入单位 + if (deptId != 100 && !companyId.equals(deptId)) { + throw new IllegalArgumentException(String.format( + "第%d条数据:导入单位%s与当前操作员单位不一致", + rowNum, companyName + )); + } + } + private void validateTeams(int rowNum, List dept, String teamIds) { + String[] teamNames = teamIds.split(","); + Set checkedTeams = new HashSet<>(); // 用于存储已校验的团队名称,检测重复 + + for (String teamName : teamNames) { + String trimmedTeamName = teamName.trim(); // 处理前后空格 + + // 重复校验:如果Set中已存在该团队名称,说明重复 + if (checkedTeams.contains(trimmedTeamName)) { + throw new IllegalArgumentException(String.format( + "第%d条数据:%s名称重复", + rowNum, teamName + )); + } + + // 存在性校验:检查团队是否在dept中存在 + if (!dept.contains(trimmedTeamName)) { + throw new IllegalArgumentException(String.format( + "第%d条数据:%s名称不正确", + rowNum, teamName + )); + } + + // 将校验通过的团队名称加入Set,用于后续重复判断 + checkedTeams.add(trimmedTeamName); + } + } +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/mechanicalcost/MechanicalCostServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/mechanicalcost/MechanicalCostServiceImpl.java index eb6d000..2c0eb85 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/mechanicalcost/MechanicalCostServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/mechanicalcost/MechanicalCostServiceImpl.java @@ -5,6 +5,7 @@ import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.MechanicalCostPageReqVO; import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.MechanicalCostSaveReqVO; import com.zteits.urbanops.module.garden.dal.dataobject.mechanicalcost.MechanicalCostDO; +import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; import com.zteits.urbanops.module.garden.dal.mysql.mechanicalcost.MechanicalCostMapper; import com.zteits.urbanops.module.garden.enums.CostFeeConstants; import com.zteits.urbanops.module.garden.service.mechanicaldepreciation.MechanicalDepreciationService; @@ -16,6 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.List; +import java.util.stream.Collectors; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.MECHANICAL_COST_NOT_EXISTS; @@ -33,19 +35,19 @@ public class MechanicalCostServiceImpl implements MechanicalCostService { @Resource private MechanicalCostMapper mechanicalCostMapper; @Resource - private TeamBizdomainRelService teamBizdomainRelService; - @Resource private MechanicalDepreciationService mechanicalDepreciationService; @Override public Long createMechanicalCost(MechanicalCostSaveReqVO createReqVO) { // 插入 MechanicalCostDO mechanicalCost = BeanUtils.toBean(createReqVO, MechanicalCostDO.class); - mechanicalCostMapper.insert(mechanicalCost); - //add by wq 保存班组信息关联表 - teamBizdomainRelService.saveTeamBizdomainRel(createReqVO.getTeamIds(), mechanicalCost.getId(), mechanicalCost.getCompanyId(), mechanicalCost.getCompanyName(), CostFeeConstants.COSTFEE_MECHANICAL); - //add by wq 保存班组信息关联表 + List deptIds = createReqVO.getTeamIds().stream() + .map(TeamBizdomainRelDO::getTeamId) + .collect(Collectors.toList()); + mechanicalCost.setDeptId(deptIds); + + mechanicalCostMapper.insert(mechanicalCost); // 返回 return mechanicalCost.getId(); } @@ -56,12 +58,13 @@ public class MechanicalCostServiceImpl implements MechanicalCostService { validateMechanicalCostExists(updateReqVO.getId()); // 更新 MechanicalCostDO updateObj = BeanUtils.toBean(updateReqVO, MechanicalCostDO.class); - mechanicalCostMapper.updateById(updateObj); - //add by wq 保存班组信息关联表 - teamBizdomainRelService.deleteTeamBizdomainRel(updateObj.getId(), CostFeeConstants.COSTFEE_MECHANICAL); - teamBizdomainRelService.saveTeamBizdomainRel(updateReqVO.getTeamIds(), updateObj.getId(), updateObj.getCompanyId(), updateObj.getCompanyName(), CostFeeConstants.COSTFEE_MECHANICAL); - //add by wq 保存班组信息关联表 + List deptIds = updateReqVO.getTeamIds().stream() + .map(TeamBizdomainRelDO::getTeamId) + .collect(Collectors.toList()); + updateObj.setDeptId(deptIds); + + mechanicalCostMapper.updateById(updateObj); } @Override @@ -73,7 +76,6 @@ public class MechanicalCostServiceImpl implements MechanicalCostService { mechanicalCostMapper.deleteById(id); //add by wq 删除班组信息关联表 - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_MECHANICAL); // //删除折旧 mechanicalDepreciationService.deleteMechanicalDepreciationByMechId(id); //add by wq 删除班组信息关联表 @@ -86,8 +88,6 @@ public class MechanicalCostServiceImpl implements MechanicalCostService { //add by wq 删除班组信息关联表 if(CollectionUtils.isNotEmpty(ids)) { for (Long id : ids) { - //批量删除 - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_MECHANICAL); //删除折旧 mechanicalDepreciationService.deleteMechanicalDepreciationByMechId(id); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/personalcost/PersonalCostServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/personalcost/PersonalCostServiceImpl.java index 284c283..77f9bc8 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/personalcost/PersonalCostServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/personalcost/PersonalCostServiceImpl.java @@ -1,30 +1,22 @@ package com.zteits.urbanops.module.garden.service.personalcost; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.module.garden.controller.admin.personalcost.vo.PersonalCostPageReqVO; import com.zteits.urbanops.module.garden.controller.admin.personalcost.vo.PersonalCostSaveReqVO; -import com.zteits.urbanops.module.garden.dal.dataobject.departmentcost.DepartmentCostDO; import com.zteits.urbanops.module.garden.dal.dataobject.personalcost.PersonalCostDO; import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; import com.zteits.urbanops.module.garden.dal.mysql.personalcost.PersonalCostMapper; -import com.zteits.urbanops.module.garden.dal.mysql.teambizdomainrel.TeamBizdomainRelMapper; -import com.zteits.urbanops.module.garden.enums.CostFeeConstants; -import com.zteits.urbanops.module.garden.service.teambizdomainrel.TeamBizdomainRelService; import jakarta.annotation.Resource; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.List; +import java.util.stream.Collectors; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.PERSONAL_COST_NOT_EXISTS; -import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.PERSONAL_COST_NOT_EXISTS_001; /** * 人员费用录入 - 个人费用 Service 实现类 @@ -37,20 +29,17 @@ public class PersonalCostServiceImpl implements PersonalCostService { @Resource private PersonalCostMapper personalCostMapper; - @Resource - TeamBizdomainRelService teamBizdomainRelService; @Override @Transactional public Long createPersonalCost(PersonalCostSaveReqVO createReqVO) { // 插入 PersonalCostDO personalCost = BeanUtils.toBean(createReqVO, PersonalCostDO.class); + List deptIds = createReqVO.getTeamIds().stream() + .map(TeamBizdomainRelDO::getTeamId) + .collect(Collectors.toList()); + personalCost.setDeptId(deptIds); personalCostMapper.insert(personalCost); - - //add by wq 保存班组信息关联表 - teamBizdomainRelService.saveTeamBizdomainRel(createReqVO.getTeamIds(), personalCost.getId(), personalCost.getCompanyId(), personalCost.getCompanyName(), CostFeeConstants.COSTFEE_PERSONAL); - //add by wq 保存班组信息关联表 - // 返回 return personalCost.getId(); } @@ -62,13 +51,11 @@ public class PersonalCostServiceImpl implements PersonalCostService { validatePersonalCostExists(updateReqVO.getId()); // 更新 PersonalCostDO updateObj = BeanUtils.toBean(updateReqVO, PersonalCostDO.class); + List deptIds = updateReqVO.getTeamIds().stream() + .map(TeamBizdomainRelDO::getTeamId) + .collect(Collectors.toList()); + updateObj.setDeptId(deptIds); personalCostMapper.updateById(updateObj); - - //add by wq 保存班组信息关联表 - teamBizdomainRelService.deleteTeamBizdomainRel(updateObj.getId(), CostFeeConstants.COSTFEE_PERSONAL); - teamBizdomainRelService.saveTeamBizdomainRel(updateReqVO.getTeamIds(), updateObj.getId(), updateObj.getCompanyId(), updateObj.getCompanyName(), CostFeeConstants.COSTFEE_PERSONAL); - - //add by wq 保存班组信息关联表 } @Override @@ -77,22 +64,12 @@ public class PersonalCostServiceImpl implements PersonalCostService { validatePersonalCostExists(id); // 删除 personalCostMapper.deleteById(id); - // add by wq 删除 - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_PERSONAL); - // add by wq 删除 } @Override public void deletePersonalCostListByIds(List ids) { // 删除 personalCostMapper.deleteByIds(ids); - // add by wq 删除 - if(ids.size() > 0) { - for (Long id : ids) { - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_PERSONAL); - } - } - // add by wq 删除 } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/rentalmechanicalcost/RentalMechanicalCostServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/rentalmechanicalcost/RentalMechanicalCostServiceImpl.java index d007d7e..806016a 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/rentalmechanicalcost/RentalMechanicalCostServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/rentalmechanicalcost/RentalMechanicalCostServiceImpl.java @@ -40,9 +40,6 @@ public class RentalMechanicalCostServiceImpl implements RentalMechanicalCostServ RentalMechanicalCostDO rentalMechanicalCost = BeanUtils.toBean(createReqVO, RentalMechanicalCostDO.class); rentalMechanicalCostMapper.insert(rentalMechanicalCost); - //add by wq 保存班组信息关联表 - teamBizdomainRelService.saveTeamBizdomainRel(createReqVO.getTeamIds(), rentalMechanicalCost.getId(), rentalMechanicalCost.getCompanyId(), rentalMechanicalCost.getCompanyName(), CostFeeConstants.COSTFEE_RENTALMECHANICAL); - //add by wq 保存班组信息关联表 // 返回 return rentalMechanicalCost.getId(); } @@ -57,7 +54,6 @@ public class RentalMechanicalCostServiceImpl implements RentalMechanicalCostServ //add by wq 保存班组信息关联表 teamBizdomainRelService.deleteTeamBizdomainRel(updateObj.getId(), CostFeeConstants.COSTFEE_RENTALMECHANICAL); - teamBizdomainRelService.saveTeamBizdomainRel(updateReqVO.getTeamIds(), updateObj.getId(), updateObj.getCompanyId(), updateObj.getCompanyName(), CostFeeConstants.COSTFEE_RENTALMECHANICAL); //add by wq 保存班组信息关联表 } @@ -67,25 +63,12 @@ public class RentalMechanicalCostServiceImpl implements RentalMechanicalCostServ validateRentalMechanicalCostExists(id); // 删除 rentalMechanicalCostMapper.deleteById(id); - - //add by wq 删除班组信息关联表 - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_RENTALMECHANICAL); - //add by wq 删除班组信息关联表 } @Override public void deleteRentalMechanicalCostListByIds(List ids) { // 删除 rentalMechanicalCostMapper.deleteByIds(ids); - - //add by wq 删除班组信息关联表 - if(CollectionUtils.isNotEmpty(ids)) { - for (Long id : ids) { - //批量删除 - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_MECHANICAL); - } - } - //add by wq 删除班组信息关联表 } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/wasterecord/WasteRecordServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/wasterecord/WasteRecordServiceImpl.java index bd8ef39..513ca6f 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/wasterecord/WasteRecordServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/wasterecord/WasteRecordServiceImpl.java @@ -1,26 +1,23 @@ package com.zteits.urbanops.module.garden.service.wasterecord; -import cn.hutool.core.collection.CollUtil; -import com.zteits.urbanops.module.garden.enums.CostFeeConstants; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.module.garden.controller.admin.wasterecord.vo.WasteRecordPageReqVO; +import com.zteits.urbanops.module.garden.controller.admin.wasterecord.vo.WasteRecordSaveReqVO; +import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; +import com.zteits.urbanops.module.garden.dal.dataobject.wasterecord.WasteRecordDO; +import com.zteits.urbanops.module.garden.dal.mysql.wasterecord.WasteRecordMapper; import com.zteits.urbanops.module.garden.service.teambizdomainrel.TeamBizdomainRelService; -import org.springframework.stereotype.Service; import jakarta.annotation.Resource; -import org.springframework.validation.annotation.Validated; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; -import java.util.*; -import com.zteits.urbanops.module.garden.controller.admin.wasterecord.vo.*; -import com.zteits.urbanops.module.garden.dal.dataobject.wasterecord.WasteRecordDO; -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.dal.mysql.wasterecord.WasteRecordMapper; +import java.util.List; +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.convertList; -import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; -import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.WASTE_RECORD_NOT_EXISTS; /** * 园林废弃物录入 Service 实现类 @@ -41,12 +38,11 @@ public class WasteRecordServiceImpl implements WasteRecordService { public Long createWasteRecord(WasteRecordSaveReqVO createReqVO) { // 插入 WasteRecordDO wasteRecord = BeanUtils.toBean(createReqVO, WasteRecordDO.class); + List deptIds = createReqVO.getTeamIds().stream() + .map(TeamBizdomainRelDO::getTeamId) + .collect(Collectors.toList()); + wasteRecord.setDeptId(deptIds); wasteRecordMapper.insert(wasteRecord); - - - //add by wq 保存班组信息关联表 - teamBizdomainRelService.saveTeamBizdomainRel(createReqVO.getTeamIds(), wasteRecord.getId(), wasteRecord.getCompanyId(), wasteRecord.getCompanyName(), CostFeeConstants.COSTFEE_GARDENWASTE); - //add by wq 保存班组信息关联表 // 返回 return wasteRecord.getId(); } @@ -58,11 +54,13 @@ public class WasteRecordServiceImpl implements WasteRecordService { validateWasteRecordExists(updateReqVO.getId()); // 更新 WasteRecordDO updateObj = BeanUtils.toBean(updateReqVO, WasteRecordDO.class); + + List deptIds = updateReqVO.getTeamIds().stream() + .map(TeamBizdomainRelDO::getTeamId) + .collect(Collectors.toList()); + updateObj.setDeptId(deptIds); + wasteRecordMapper.updateById(updateObj); - //add by wq 保存班组信息关联表 - teamBizdomainRelService.deleteTeamBizdomainRel(updateObj.getId(), CostFeeConstants.COSTFEE_GARDENWASTE); - teamBizdomainRelService.saveTeamBizdomainRel(updateReqVO.getTeamIds(), updateObj.getId(), updateObj.getCompanyId(), updateObj.getCompanyName(), CostFeeConstants.COSTFEE_GARDENWASTE); - //add by wq 保存班组信息关联表 } @Override @@ -72,22 +70,12 @@ public class WasteRecordServiceImpl implements WasteRecordService { // 删除 wasteRecordMapper.deleteById(id); - // add by wq 删除 - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_GARDENWASTE); - // add by wq 删除 } @Override public void deleteWasteRecordListByIds(List ids) { // 删除 wasteRecordMapper.deleteByIds(ids); - // add by wq 删除 - if(ids.size() > 0) { - for (Long id : ids) { - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_GARDENWASTE); - } - } - // add by wq 删除 } -- libgit2 0.21.4