Commit 47a2fdefeb0b11cf27e750e870debd471be767a2
1 parent
535b6f62
派单及人机材功能迁移
Showing
40 changed files
with
1790 additions
and
387 deletions
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 { | @@ -49,4 +49,10 @@ public class ExcelUtils { | ||
| 49 | .doReadAllSync(); | 49 | .doReadAllSync(); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | + public static <T> List<T> read(MultipartFile file, Class<T> head, Integer startIndex) throws IOException { | ||
| 53 | + return FastExcelFactory.read(file.getInputStream(), head, null) | ||
| 54 | + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 | ||
| 55 | + .headRowNumber(startIndex) | ||
| 56 | + .doReadAllSync(); | ||
| 57 | + } | ||
| 52 | } | 58 | } |
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; | @@ -33,7 +33,7 @@ import com.zteits.urbanops.module.garden.service.assigntasks.AssignTasksService; | ||
| 33 | 33 | ||
| 34 | @Tag(name = "管理后台 - 派单任务主表(记录派单任务基本信息)") | 34 | @Tag(name = "管理后台 - 派单任务主表(记录派单任务基本信息)") |
| 35 | @RestController | 35 | @RestController |
| 36 | -@RequestMapping("/garden/assign-tasks") | 36 | +@RequestMapping("/assign/tasks") |
| 37 | @Validated | 37 | @Validated |
| 38 | public class AssignTasksController { | 38 | public class AssignTasksController { |
| 39 | 39 | ||
| @@ -90,6 +90,14 @@ public class AssignTasksController { | @@ -90,6 +90,14 @@ public class AssignTasksController { | ||
| 90 | return success(BeanUtils.toBean(pageResult, AssignTasksRespVO.class)); | 90 | return success(BeanUtils.toBean(pageResult, AssignTasksRespVO.class)); |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | + @GetMapping("/list") | ||
| 94 | + @Operation(summary = "获得派单任务主表(记录派单任务基本信息)分页") | ||
| 95 | + @PreAuthorize("@ss.hasPermission('garden:assign-tasks:query')") | ||
| 96 | + public CommonResult<PageResult<AssignTasksRespVO>> list(@Valid AssignTasksPageReqVO pageReqVO) { | ||
| 97 | + PageResult<AssignTasksDO> pageResult = assignTasksService.getAssignTasksPage(pageReqVO); | ||
| 98 | + return success(BeanUtils.toBean(pageResult, AssignTasksRespVO.class)); | ||
| 99 | + } | ||
| 100 | + | ||
| 93 | @GetMapping("/export-excel") | 101 | @GetMapping("/export-excel") |
| 94 | @Operation(summary = "导出派单任务主表(记录派单任务基本信息) Excel") | 102 | @Operation(summary = "导出派单任务主表(记录派单任务基本信息) Excel") |
| 95 | @PreAuthorize("@ss.hasPermission('garden:assign-tasks:export')") | 103 | @PreAuthorize("@ss.hasPermission('garden:assign-tasks:export')") |
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 | @@ -31,7 +31,7 @@ import com.zteits.urbanops.module.garden.service.assigntasksinfo.AssignTasksInfo | ||
| 31 | 31 | ||
| 32 | @Tag(name = "管理后台 - 派单任务-单位关联表(记录单位接收派单后的执行详情)") | 32 | @Tag(name = "管理后台 - 派单任务-单位关联表(记录单位接收派单后的执行详情)") |
| 33 | @RestController | 33 | @RestController |
| 34 | -@RequestMapping("/garden/assign-tasks-info") | 34 | +@RequestMapping("/assign/info") |
| 35 | @Validated | 35 | @Validated |
| 36 | public class AssignTasksInfoController { | 36 | public class AssignTasksInfoController { |
| 37 | 37 | ||
| @@ -87,7 +87,13 @@ public class AssignTasksInfoController { | @@ -87,7 +87,13 @@ public class AssignTasksInfoController { | ||
| 87 | PageResult<AssignTasksInfoDO> pageResult = assignTasksInfoService.getAssignTasksInfoPage(pageReqVO); | 87 | PageResult<AssignTasksInfoDO> pageResult = assignTasksInfoService.getAssignTasksInfoPage(pageReqVO); |
| 88 | return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); | 88 | return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); |
| 89 | } | 89 | } |
| 90 | - | 90 | + @GetMapping("/list") |
| 91 | + @Operation(summary = "获得派单任务-单位关联表(记录单位接收派单后的执行详情)分页") | ||
| 92 | + @PreAuthorize("@ss.hasPermission('garden:assign-tasks-info:query')") | ||
| 93 | + public CommonResult<PageResult<AssignTasksInfoRespVO>> list(@Valid AssignTasksInfoPageReqVO pageReqVO) { | ||
| 94 | + PageResult<AssignTasksInfoDO> pageResult = assignTasksInfoService.getAssignTasksInfoPage(pageReqVO); | ||
| 95 | + return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); | ||
| 96 | + } | ||
| 91 | @GetMapping("/export-excel") | 97 | @GetMapping("/export-excel") |
| 92 | @Operation(summary = "导出派单任务-单位关联表(记录单位接收派单后的执行详情) Excel") | 98 | @Operation(summary = "导出派单任务-单位关联表(记录单位接收派单后的执行详情) Excel") |
| 93 | @PreAuthorize("@ss.hasPermission('garden:assign-tasks-info:export')") | 99 | @PreAuthorize("@ss.hasPermission('garden:assign-tasks-info:export')") |
| @@ -101,4 +107,4 @@ public class AssignTasksInfoController { | @@ -101,4 +107,4 @@ public class AssignTasksInfoController { | ||
| 101 | BeanUtils.toBean(list, AssignTasksInfoRespVO.class)); | 107 | BeanUtils.toBean(list, AssignTasksInfoRespVO.class)); |
| 102 | } | 108 | } |
| 103 | 109 | ||
| 104 | -} | ||
| 105 | \ No newline at end of file | 110 | \ No newline at end of file |
| 111 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/CostFeeController.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.garden.controller.admin.costfee; | ||
| 2 | + | ||
| 3 | +import com.zteits.urbanops.framework.common.pojo.CommonResult; | ||
| 4 | +import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; | ||
| 5 | +import com.zteits.urbanops.module.garden.enums.TemplateEnum; | ||
| 6 | +import com.zteits.urbanops.module.garden.service.costfee.CostFeeService; | ||
| 7 | +import io.swagger.v3.oas.annotations.Operation; | ||
| 8 | +import jakarta.servlet.http.HttpServletResponse; | ||
| 9 | +import lombok.AllArgsConstructor; | ||
| 10 | +import lombok.Data; | ||
| 11 | +import lombok.extern.slf4j.Slf4j; | ||
| 12 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 13 | +import org.springframework.beans.factory.annotation.Value; | ||
| 14 | +import org.springframework.core.io.ClassPathResource; | ||
| 15 | +import org.springframework.util.CollectionUtils; | ||
| 16 | +import org.springframework.web.bind.annotation.*; | ||
| 17 | +import org.springframework.web.multipart.MultipartFile; | ||
| 18 | + | ||
| 19 | +import java.io.IOException; | ||
| 20 | +import java.io.InputStream; | ||
| 21 | +import java.io.OutputStream; | ||
| 22 | +import java.net.URLEncoder; | ||
| 23 | +import java.nio.charset.StandardCharsets; | ||
| 24 | +import java.util.*; | ||
| 25 | + | ||
| 26 | +import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; | ||
| 27 | +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; | ||
| 28 | + | ||
| 29 | +/** | ||
| 30 | + * 人机材公共处理控制器 | ||
| 31 | + * 处理Excel导入预览、提交等功能 | ||
| 32 | + */ | ||
| 33 | +@RestController | ||
| 34 | +@RequestMapping("/costfee") | ||
| 35 | +@Slf4j | ||
| 36 | +public class CostFeeController{ | ||
| 37 | + | ||
| 38 | + @Autowired | ||
| 39 | + private CostFeeService costFeeService; | ||
| 40 | + | ||
| 41 | + // 静态资源服务器基础URL(从配置文件读取) | ||
| 42 | + @Value("${static.resource.server.url}") | ||
| 43 | + private String staticResourceServerUrl; | ||
| 44 | + | ||
| 45 | + @Value("${static.resource.server.enable}") | ||
| 46 | + private Boolean staticResourceServerenable; | ||
| 47 | + | ||
| 48 | + // Excel文件校验相关 | ||
| 49 | + private static final List<String> ALLOWED_EXCEL_SUFFIX = Arrays.asList(".xlsx", ".xlsm"); | ||
| 50 | + private static final String EXCEL_MIME_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; | ||
| 51 | + private static final String EXCEL_MIME_TYPE_XLS = "application/vnd.ms-excel"; | ||
| 52 | + | ||
| 53 | + /** | ||
| 54 | + * 导入模板下载 | ||
| 55 | + */ | ||
| 56 | + @GetMapping("/get-import-template") | ||
| 57 | + @Operation(summary = "获得导入用户模板") | ||
| 58 | + public void importTemplate(HttpServletResponse response, | ||
| 59 | + @RequestParam("templateName") String templateName) throws IOException { | ||
| 60 | + // 参数校验 | ||
| 61 | + if (templateName == null || templateName.trim().isEmpty()) { | ||
| 62 | + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "模板名称不能为空"); | ||
| 63 | + return; | ||
| 64 | + } | ||
| 65 | + | ||
| 66 | + // 模板类型校验 | ||
| 67 | + TemplateEnum template = TemplateEnum.getByCode(templateName); | ||
| 68 | + if (template == null) { | ||
| 69 | + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "未知的模板类型: " + templateName); | ||
| 70 | + return; | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + if (staticResourceServerenable) { | ||
| 74 | + // 构建完整的静态服务器URL(确保路径正确) | ||
| 75 | + String serverUrl = staticResourceServerUrl; | ||
| 76 | + if (serverUrl != null && !serverUrl.endsWith("/")) { | ||
| 77 | + serverUrl += "/"; // 确保URL以/结尾,避免拼接错误 | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | + String encodedFileName = URLEncoder.encode(template.getName().split("\\.")[0], StandardCharsets.UTF_8.name()); | ||
| 81 | + | ||
| 82 | + String templateFileName = encodedFileName + "." + template.getName().split("\\.")[1]; | ||
| 83 | + | ||
| 84 | + String templateUrl = serverUrl + templateFileName; // 包含templates目录 | ||
| 85 | + | ||
| 86 | + // 方式1:重定向到静态资源服务器 | ||
| 87 | + response.sendRedirect(templateUrl); | ||
| 88 | + } else { | ||
| 89 | + String templateFileName = templateName + "." + template.getName().split("\\.")[1]; | ||
| 90 | + | ||
| 91 | + // 写入模板文件到响应 | ||
| 92 | + writeTemplateToResponse(response, template.getName(), templateFileName); | ||
| 93 | + } | ||
| 94 | + } | ||
| 95 | + | ||
| 96 | + | ||
| 97 | + /** | ||
| 98 | + * Excel文件上传预览 | ||
| 99 | + */ | ||
| 100 | + @PostMapping("/preview") | ||
| 101 | + public CommonResult previewExcel(@RequestParam("file") MultipartFile file, | ||
| 102 | + @RequestParam("templateName") String templateName) { | ||
| 103 | + // 基础参数校验 | ||
| 104 | + if (templateName == null || templateName.trim().isEmpty()) { | ||
| 105 | + return CommonResult.error(BAD_REQUEST, "模板名称不能为空"); | ||
| 106 | + | ||
| 107 | + } | ||
| 108 | + // 模板类型校验 | ||
| 109 | + TemplateEnum template = TemplateEnum.getByCode(templateName); | ||
| 110 | + if (template == null) { | ||
| 111 | + return CommonResult.error(BAD_REQUEST, "未知的模板类型"); | ||
| 112 | + } | ||
| 113 | + String suffix = template.getName().split("\\.")[1]; | ||
| 114 | + // 文件有效性校验 | ||
| 115 | + if (!isValidExcelFile(file)) { | ||
| 116 | + return CommonResult.error(BAD_REQUEST, "请上传有效的Excel文件"); | ||
| 117 | + } | ||
| 118 | + //部门信息缓存,校验正确性使用 | ||
| 119 | + | ||
| 120 | + | ||
| 121 | + // 解析Excel并获取数据 | ||
| 122 | + ImportResult<?> result = parseExcelFile(file, template); | ||
| 123 | + | ||
| 124 | + // 需预览的数据存入Redis并返回批次ID | ||
| 125 | + if (result.isNeedPreview()) { | ||
| 126 | + if (CollectionUtils.isEmpty(result.getDataList())) { | ||
| 127 | + return CommonResult.error(BAD_REQUEST, "导入的Excel文件不能为空"); | ||
| 128 | + | ||
| 129 | + } | ||
| 130 | + String batchId = costFeeService.saveDataToRedis(result.getDataList(), templateName); | ||
| 131 | + Map<String, Object> resultMap = new HashMap<>(2); | ||
| 132 | + resultMap.put("batchId", batchId); | ||
| 133 | + resultMap.put("totalCount", result.getDataList().size()); | ||
| 134 | + resultMap.put("templateName",templateName); | ||
| 135 | + return success(resultMap); | ||
| 136 | + } | ||
| 137 | + // 无需预览的直接返回数据 | ||
| 138 | + return success(result.getDataList()); | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + | ||
| 142 | + /** | ||
| 143 | + * 分页获取预览数据 | ||
| 144 | + */ | ||
| 145 | + @GetMapping("/preview-data") | ||
| 146 | + public CommonResult getPreviewData(@RequestParam("batchId") String batchId, | ||
| 147 | + @RequestParam("templateName") String templateName, | ||
| 148 | + @RequestParam(value = "page", defaultValue = "1") int page, | ||
| 149 | + @RequestParam(value = "size", defaultValue = "100000") int size) { | ||
| 150 | + | ||
| 151 | + | ||
| 152 | + // 参数校验 | ||
| 153 | + if (batchId == null || batchId.trim().isEmpty()) { | ||
| 154 | + return CommonResult.error(BAD_REQUEST, "批次ID不能为空"); | ||
| 155 | + } | ||
| 156 | + if (templateName == null || templateName.trim().isEmpty()) { | ||
| 157 | + return CommonResult.error(BAD_REQUEST, "模板名称不能为空"); | ||
| 158 | + | ||
| 159 | + } | ||
| 160 | + if (TemplateEnum.getByCode(templateName) == null) { | ||
| 161 | + return CommonResult.error(BAD_REQUEST, "未知的模板类型"); | ||
| 162 | + | ||
| 163 | + } | ||
| 164 | + try { | ||
| 165 | + //if (page < 1 || size < 1 || size > 100) { // 限制每页最大100条,避免过大 | ||
| 166 | + // return AjaxResult.error("分页参数无效(page≥1,1≤size≤100)"); | ||
| 167 | + //} | ||
| 168 | + | ||
| 169 | + // 模板类型校验 | ||
| 170 | + TemplateEnum template = TemplateEnum.getByCode(templateName); | ||
| 171 | + Class<?> importClass = template.getImportClass(); // 从枚举获取导入类,避免switch | ||
| 172 | + | ||
| 173 | + // 从Redis获取分页数据 | ||
| 174 | + PageResult<?> pageResult = costFeeService.getPagedDataFromRedis(batchId, templateName, page, size, importClass); | ||
| 175 | + return CommonResult.success(pageResult); | ||
| 176 | + } catch (Exception e) { | ||
| 177 | + log.error("获取预览数据失败", e); | ||
| 178 | + throw new RuntimeException(e); | ||
| 179 | + } | ||
| 180 | + } | ||
| 181 | + | ||
| 182 | + | ||
| 183 | + /** | ||
| 184 | + * 提交导入数据到数据库 | ||
| 185 | + */ | ||
| 186 | + @PostMapping("/submit") | ||
| 187 | + public CommonResult submitImport(@RequestParam("batchId") String batchId, | ||
| 188 | + @RequestParam("templateName") String templateName, | ||
| 189 | + @RequestParam("operator") String operator) { | ||
| 190 | + // 参数校验 | ||
| 191 | + if (batchId == null || batchId.trim().isEmpty()) { | ||
| 192 | + return CommonResult.error(BAD_REQUEST, "批次ID不能为空"); | ||
| 193 | + } | ||
| 194 | + if (templateName == null || templateName.trim().isEmpty()) { | ||
| 195 | + return CommonResult.error(BAD_REQUEST, "模板名称不能为空"); | ||
| 196 | + | ||
| 197 | + } | ||
| 198 | + if (TemplateEnum.getByCode(templateName) == null) { | ||
| 199 | + return CommonResult.error(BAD_REQUEST, "未知的模板类型"); | ||
| 200 | + | ||
| 201 | + } | ||
| 202 | + if (operator == null || operator.trim().isEmpty()) { | ||
| 203 | + return CommonResult.error(BAD_REQUEST, "操作人不能为空"); | ||
| 204 | + } | ||
| 205 | + int count = costFeeService.submitImport(batchId, templateName, operator); | ||
| 206 | + return CommonResult.success("导入成功,共" + count + "条数据"); | ||
| 207 | + } | ||
| 208 | + | ||
| 209 | + /** | ||
| 210 | + * 写入模板文件到响应流 | ||
| 211 | + */ | ||
| 212 | + private void writeTemplateToResponse(HttpServletResponse response, String filename, String templatePath) throws IOException { | ||
| 213 | + // 设置响应头 | ||
| 214 | + response.setContentType(EXCEL_MIME_TYPE); | ||
| 215 | + response.setCharacterEncoding("UTF-8"); | ||
| 216 | + String encodedFileName = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20"); | ||
| 217 | + response.setHeader("Content-Disposition", "attachment;filename=" + encodedFileName); | ||
| 218 | + response.setHeader("Cache-Control", "no-store"); // 禁止缓存 | ||
| 219 | + | ||
| 220 | + // 读取模板文件并写入响应 | ||
| 221 | + try (InputStream in = new ClassPathResource("template/" + templatePath).getInputStream(); | ||
| 222 | + OutputStream out = response.getOutputStream()) { | ||
| 223 | + | ||
| 224 | + byte[] buffer = new byte[4096]; | ||
| 225 | + int bytesRead; | ||
| 226 | + while ((bytesRead = in.read(buffer)) != -1) { | ||
| 227 | + out.write(buffer, 0, bytesRead); | ||
| 228 | + } | ||
| 229 | + out.flush(); | ||
| 230 | + } | ||
| 231 | + } | ||
| 232 | + | ||
| 233 | + | ||
| 234 | + /** | ||
| 235 | + * 校验Excel文件有效性(后缀+MIME类型) | ||
| 236 | + */ | ||
| 237 | + private boolean isValidExcelFile(MultipartFile file) { | ||
| 238 | + if (file == null || file.isEmpty()) { | ||
| 239 | + return false; | ||
| 240 | + } | ||
| 241 | + String fileName = file.getOriginalFilename(); | ||
| 242 | + if (fileName == null) { | ||
| 243 | + return false; | ||
| 244 | + } | ||
| 245 | + | ||
| 246 | + // 校验文件后缀 | ||
| 247 | + boolean validSuffix = ALLOWED_EXCEL_SUFFIX.stream() | ||
| 248 | + .anyMatch(suffix -> fileName.toLowerCase().endsWith(suffix)); | ||
| 249 | + if (!validSuffix) { | ||
| 250 | + return false; | ||
| 251 | + } | ||
| 252 | + | ||
| 253 | + // 4. 校验MIME类型(兼容可能带参数的MIME类型,如charset) | ||
| 254 | + String contentType = file.getContentType(); | ||
| 255 | + if (contentType == null) { | ||
| 256 | + return false; | ||
| 257 | + } | ||
| 258 | + // 处理MIME类型可能带参数的情况(如"application/xxx;charset=UTF-8") | ||
| 259 | + String baseContentType = contentType.split(";")[0].trim(); | ||
| 260 | + // 3. 匹配预设的Excel MIME类型(.xlsx/.xlsm或.xls) | ||
| 261 | + return EXCEL_MIME_TYPE.equals(baseContentType) | ||
| 262 | + || baseContentType.startsWith(EXCEL_MIME_TYPE_XLS); | ||
| 263 | + } | ||
| 264 | + | ||
| 265 | + | ||
| 266 | + /** | ||
| 267 | + * 解析Excel文件并返回导入结果 | ||
| 268 | + */ | ||
| 269 | + @SuppressWarnings("unchecked") | ||
| 270 | + private <T> ImportResult<T> parseExcelFile(MultipartFile file, TemplateEnum template){ | ||
| 271 | + // 获取模板对应的导入类 | ||
| 272 | + Class<T> importClass = (Class<T>) template.getImportClass(); | ||
| 273 | + List<T> dataList = null; | ||
| 274 | + try { | ||
| 275 | + // 解析Excel(从指定行开始读取) | ||
| 276 | + dataList = ExcelUtils.read(file, importClass, template.getStartIndex()); | ||
| 277 | + if (dataList == null) { | ||
| 278 | + dataList = Collections.emptyList(); | ||
| 279 | + } | ||
| 280 | + // 基础数据校验(非空、格式等) | ||
| 281 | + costFeeService.validateImportData(dataList, template); | ||
| 282 | + | ||
| 283 | + } catch (IOException e) { | ||
| 284 | + log.error(e.getMessage()); | ||
| 285 | + } | ||
| 286 | + return new ImportResult<>(dataList, template.isNeedPreview()); | ||
| 287 | + } | ||
| 288 | + | ||
| 289 | + | ||
| 290 | + /** | ||
| 291 | + * 导入结果封装 | ||
| 292 | + */ | ||
| 293 | + @Data | ||
| 294 | + @AllArgsConstructor | ||
| 295 | + private static class ImportResult<T> { | ||
| 296 | + private List<T> dataList; | ||
| 297 | + private boolean needPreview; | ||
| 298 | + } | ||
| 299 | + | ||
| 300 | + /** | ||
| 301 | + * 分页结果封装 | ||
| 302 | + */ | ||
| 303 | + @Data | ||
| 304 | + @AllArgsConstructor | ||
| 305 | + public static class PageResult<T> { | ||
| 306 | + private int page; | ||
| 307 | + private int size; | ||
| 308 | + private int total; | ||
| 309 | + private List<T> data; | ||
| 310 | + } | ||
| 311 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/WaterFeeBridgeController.java deleted
| 1 | -package com.zteits.urbanops.module.garden.controller.admin.costfee; | ||
| 2 | - | ||
| 3 | -import com.zteits.urbanops.framework.common.pojo.CommonResult; | ||
| 4 | -import com.zteits.urbanops.framework.common.pojo.PageResult; | ||
| 5 | -import com.zteits.urbanops.module.garden.controller.admin.waterfee.vo.WaterFeePageReqVO; | ||
| 6 | -import com.zteits.urbanops.module.garden.dal.dataobject.waterfee.WaterFeeDO; | ||
| 7 | -import com.zteits.urbanops.module.garden.service.waterfee.WaterFeeService; | ||
| 8 | -import io.swagger.v3.oas.annotations.Operation; | ||
| 9 | -import io.swagger.v3.oas.annotations.tags.Tag; | ||
| 10 | -import jakarta.annotation.Resource; | ||
| 11 | -import org.springframework.web.bind.annotation.GetMapping; | ||
| 12 | -import org.springframework.web.bind.annotation.RequestMapping; | ||
| 13 | -import org.springframework.web.bind.annotation.RestController; | ||
| 14 | - | ||
| 15 | -import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; | ||
| 16 | - | ||
| 17 | -@Tag(name = "管理后台 - 水费桥接") | ||
| 18 | -@RestController | ||
| 19 | -@RequestMapping("/costfee/waterfee") | ||
| 20 | -public class WaterFeeBridgeController { | ||
| 21 | - | ||
| 22 | - @Resource | ||
| 23 | - private WaterFeeService waterFeeService; | ||
| 24 | - | ||
| 25 | - @GetMapping("/list") | ||
| 26 | - @Operation(summary = "水费录入-列表") | ||
| 27 | - public CommonResult<PageResult<WaterFeeDO>> list(WaterFeePageReqVO reqVO) { | ||
| 28 | - if (reqVO.getPageSize() == null || reqVO.getPageSize() <= 0) { | ||
| 29 | - reqVO.setPageSize(10); | ||
| 30 | - } | ||
| 31 | - if (reqVO.getPageNo() == null || reqVO.getPageNo() <= 0) { | ||
| 32 | - reqVO.setPageNo(1); | ||
| 33 | - } | ||
| 34 | - return success(waterFeeService.getWaterFeePage(reqVO)); | ||
| 35 | - } | ||
| 36 | -} | ||
| 37 | \ No newline at end of file | 0 | \ No newline at end of file |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/DepartmentCostImport.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; | ||
| 2 | + | ||
| 3 | +import cn.idev.excel.annotation.ExcelProperty; | ||
| 4 | +import jakarta.validation.constraints.*; | ||
| 5 | +import lombok.AllArgsConstructor; | ||
| 6 | +import lombok.Builder; | ||
| 7 | +import lombok.Data; | ||
| 8 | +import lombok.NoArgsConstructor; | ||
| 9 | + | ||
| 10 | +import java.math.BigDecimal; | ||
| 11 | + | ||
| 12 | +/** | ||
| 13 | + * 部门费用录入对象 td_department_cost | ||
| 14 | + * | ||
| 15 | + * @author wb | ||
| 16 | + * @date 2025-07-14 | ||
| 17 | + */ | ||
| 18 | +@Data | ||
| 19 | +@Builder | ||
| 20 | +@AllArgsConstructor | ||
| 21 | +@NoArgsConstructor | ||
| 22 | +public class DepartmentCostImport { | ||
| 23 | + | ||
| 24 | + /** 工资年月(如202506) */ | ||
| 25 | + @ExcelProperty(index = 0) | ||
| 26 | + @NotEmpty(message = "工资年月不能为空") | ||
| 27 | + @Pattern(regexp = "^\\d{4}(0[1-9]|1[0-2])$", message = "工资年月格式错误,必须为yyyyMM(如202301)") | ||
| 28 | + private String salaryMonth; | ||
| 29 | + | ||
| 30 | + @ExcelProperty(index = 1) | ||
| 31 | + @NotEmpty(message = "费用名称不能为空") | ||
| 32 | + @Size(max = 50, message = "费用名称长度不能超过50位") | ||
| 33 | + private String expenseName; | ||
| 34 | + | ||
| 35 | + /** 部门总额 */ | ||
| 36 | + @ExcelProperty(index = 2) | ||
| 37 | + @NotNull(message = "工资金额不能为空") | ||
| 38 | + @Digits(integer = 7, fraction = 2, message = "工资金额格式应为两位小数,且整数部分不超过7位") | ||
| 39 | + @DecimalMax(value = "9999999.99", message = "工资金额最大值为9999999.99") | ||
| 40 | + private BigDecimal deptTotalCost; | ||
| 41 | + | ||
| 42 | + /** 人员数量 */ | ||
| 43 | + @ExcelProperty(index = 3) | ||
| 44 | + @NotNull(message = "部门人数不能为空") | ||
| 45 | + @Positive(message = "部门人数必须为正数") | ||
| 46 | + private Long personCount; | ||
| 47 | + | ||
| 48 | + /** 归属公司 */ | ||
| 49 | + @ExcelProperty(index = 4) | ||
| 50 | + @NotEmpty(message = "所属单位不能为空") | ||
| 51 | + private String companyName; | ||
| 52 | + | ||
| 53 | + @ExcelProperty(index = 5) | ||
| 54 | + @Size(max = 200, message = "备注长度不能超过200位") | ||
| 55 | + private String remark; | ||
| 56 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/GardenWasteRecordImport.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; | ||
| 2 | + | ||
| 3 | +import cn.idev.excel.annotation.ExcelProperty; | ||
| 4 | +import com.fasterxml.jackson.annotation.JsonFormat; | ||
| 5 | +import jakarta.validation.constraints.DecimalMax; | ||
| 6 | +import jakarta.validation.constraints.DecimalMin; | ||
| 7 | +import jakarta.validation.constraints.Digits; | ||
| 8 | +import jakarta.validation.constraints.Max; | ||
| 9 | +import jakarta.validation.constraints.NotEmpty; | ||
| 10 | +import jakarta.validation.constraints.NotNull; | ||
| 11 | +import jakarta.validation.constraints.Positive; | ||
| 12 | +import jakarta.validation.constraints.Size; | ||
| 13 | +import lombok.AllArgsConstructor; | ||
| 14 | +import lombok.Builder; | ||
| 15 | +import lombok.Data; | ||
| 16 | +import lombok.NoArgsConstructor; | ||
| 17 | + | ||
| 18 | +import java.math.BigDecimal; | ||
| 19 | +import java.util.Date; | ||
| 20 | + | ||
| 21 | +/** | ||
| 22 | + * 园林废弃物录入对象 td_garden_waste_record | ||
| 23 | + * | ||
| 24 | + * @author wb | ||
| 25 | + * @date 2025-07-14 | ||
| 26 | + */ | ||
| 27 | +@Data | ||
| 28 | +@Builder | ||
| 29 | +@AllArgsConstructor | ||
| 30 | +@NoArgsConstructor | ||
| 31 | +public class GardenWasteRecordImport { | ||
| 32 | + /** 运输日期 */ | ||
| 33 | + @ExcelProperty(index = 0) | ||
| 34 | + @JsonFormat(pattern = "yyyy-MM-dd") | ||
| 35 | + @NotNull(message = "运输日期不能为空") | ||
| 36 | + private Date transportDate; | ||
| 37 | + | ||
| 38 | + /** 废弃物类型(如渣土、树枝等) */ | ||
| 39 | + @ExcelProperty(index = 1) | ||
| 40 | + @NotEmpty(message = "废弃物类型不能为空") | ||
| 41 | + private String wasteType; | ||
| 42 | + | ||
| 43 | + /** 运输车辆(如小型渣土车等) */ | ||
| 44 | + @ExcelProperty(index = 2) | ||
| 45 | + @NotEmpty(message = "运输车辆不能为空") | ||
| 46 | + private String transportVehicle; | ||
| 47 | + | ||
| 48 | + /** 车辆载重(吨) */ | ||
| 49 | + @ExcelProperty(index = 3) | ||
| 50 | + @NotNull(message = "车辆载重不能为空") | ||
| 51 | + @Digits(integer = 3, fraction = 2, message = "车辆载重格式应为两位小数,且整数部分不超过3位") | ||
| 52 | + @DecimalMin(value = "0.00", message = "车辆载重不能小于0") | ||
| 53 | + @DecimalMax(value = "999.99", message = "车辆载重最大值为999.99") | ||
| 54 | + private BigDecimal vehicleLoad; | ||
| 55 | + | ||
| 56 | + /** 运输次数 */ | ||
| 57 | + @ExcelProperty(index = 4) | ||
| 58 | + @NotNull(message = "运输次数不能为空") | ||
| 59 | + @Positive(message = "运输次数必须为正整数") | ||
| 60 | + @Max(value = 999, message = "运输次数最大值为999") | ||
| 61 | + private Long transportTimes; | ||
| 62 | + | ||
| 63 | + /** 总费用(元) */ | ||
| 64 | + @ExcelProperty(index = 5) | ||
| 65 | + @NotNull(message = "总费用不能为空") | ||
| 66 | + @Digits(integer = 6, fraction = 2, message = "总费用格式应为两位小数,且整数部分不超过6位") | ||
| 67 | + @DecimalMin(value = "0.00", message = "总费用不能小于0") | ||
| 68 | + @DecimalMax(value = "100000.00", message = "总费用最大值为100000.00") | ||
| 69 | + private BigDecimal totalCost; | ||
| 70 | + | ||
| 71 | + @ExcelProperty(index = 6) | ||
| 72 | + @NotEmpty(message = "归属公司不能为空") | ||
| 73 | + private String companyName; | ||
| 74 | + | ||
| 75 | + @ExcelProperty(index = 7) | ||
| 76 | + private String teamIds; | ||
| 77 | + | ||
| 78 | + @ExcelProperty(index = 8) | ||
| 79 | + @Size(max = 200, message = "备注长度不能超过200位") | ||
| 80 | + private String remark; | ||
| 81 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MechanicalCostImport.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; | ||
| 2 | + | ||
| 3 | +import cn.idev.excel.annotation.ExcelProperty; | ||
| 4 | +import com.fasterxml.jackson.annotation.JsonFormat; | ||
| 5 | +import jakarta.validation.constraints.DecimalMax; | ||
| 6 | +import jakarta.validation.constraints.Digits; | ||
| 7 | +import jakarta.validation.constraints.Max; | ||
| 8 | +import jakarta.validation.constraints.Min; | ||
| 9 | +import jakarta.validation.constraints.NotEmpty; | ||
| 10 | +import jakarta.validation.constraints.NotNull; | ||
| 11 | +import jakarta.validation.constraints.Pattern; | ||
| 12 | +import jakarta.validation.constraints.Positive; | ||
| 13 | +import jakarta.validation.constraints.Size; | ||
| 14 | +import lombok.AllArgsConstructor; | ||
| 15 | +import lombok.Builder; | ||
| 16 | +import lombok.Data; | ||
| 17 | +import lombok.NoArgsConstructor; | ||
| 18 | + | ||
| 19 | +import java.math.BigDecimal; | ||
| 20 | +import java.util.Date; | ||
| 21 | + | ||
| 22 | +/** | ||
| 23 | + * 自有机械费用录入对象 td_mechanical_cost | ||
| 24 | + * | ||
| 25 | + * @author ServiceManager | ||
| 26 | + * @date 2025-07-14 | ||
| 27 | + */ | ||
| 28 | +@Data | ||
| 29 | +@Builder | ||
| 30 | +@AllArgsConstructor | ||
| 31 | +@NoArgsConstructor | ||
| 32 | +public class MechanicalCostImport { | ||
| 33 | + | ||
| 34 | + /** 机械编号 */ | ||
| 35 | + @ExcelProperty(index = 0) | ||
| 36 | + @NotEmpty(message = "机械编号不能为空") | ||
| 37 | + @Pattern(regexp = "^[A-Za-z0-9_\\-.]+$", message = "机械编码格式:为字母、数字、-、_、.组合字符串") | ||
| 38 | + private String mechCode; | ||
| 39 | + | ||
| 40 | + /** 机械名称 */ | ||
| 41 | + @ExcelProperty(index = 1) | ||
| 42 | + @NotEmpty(message = "机械名称不能为空") | ||
| 43 | + @Size(max = 50, message = "机械名称长度不能超过50位") | ||
| 44 | + private String mechName; | ||
| 45 | + | ||
| 46 | + /** 机械类别(如工具类) */ | ||
| 47 | + @ExcelProperty(index = 2) | ||
| 48 | + @NotEmpty(message = "机械类型不能为空") | ||
| 49 | + private String mechType; | ||
| 50 | + | ||
| 51 | + /** 车牌号 */ | ||
| 52 | + @ExcelProperty(index = 3) | ||
| 53 | + private String licensePlate; | ||
| 54 | + | ||
| 55 | + /** 车辆类别(如汽油、纯电新能源等) */ | ||
| 56 | + @ExcelProperty(index = 4) | ||
| 57 | + private String vehicleCategory; | ||
| 58 | + | ||
| 59 | + /** 车辆类型(如大型客车、轻型栏板货车等) */ | ||
| 60 | + @ExcelProperty(index = 5) | ||
| 61 | + private String vehicleType; | ||
| 62 | + | ||
| 63 | + /** 单价 */ | ||
| 64 | + @ExcelProperty(index = 6) | ||
| 65 | + @NotNull(message = "单价不能为空") | ||
| 66 | + @Digits(integer = 7, fraction = 2, message = "单价格式应为两位小数,且整数部分不超过7位") | ||
| 67 | + @DecimalMax(value = "9999999.99", message = "单价最大值为9999999.99") | ||
| 68 | + private BigDecimal unitPrice; | ||
| 69 | + | ||
| 70 | + /** 数量 */ | ||
| 71 | + @ExcelProperty(index = 7) | ||
| 72 | + @NotNull(message = "数量不能为空") | ||
| 73 | + @Positive(message = "数量必须为正整数") | ||
| 74 | + private Long quantity; | ||
| 75 | + | ||
| 76 | + /** 开始使用时间 */ | ||
| 77 | + @ExcelProperty(index = 8) | ||
| 78 | + @JsonFormat(pattern = "yyyy-MM-dd") | ||
| 79 | + @NotNull(message = "开始使用时间不能为空") | ||
| 80 | + private Date startUseTime; | ||
| 81 | + | ||
| 82 | + /** 使用年限 */ | ||
| 83 | + @ExcelProperty(index = 9) | ||
| 84 | + @NotNull(message = "使用年限不能为空") | ||
| 85 | + @Positive(message = "使用年限必须为正整数") | ||
| 86 | + private Long serviceLife; | ||
| 87 | + | ||
| 88 | + /** 状态(0正常 1停用) */ | ||
| 89 | + @ExcelProperty(index = 10) | ||
| 90 | + @NotNull(message = "当前状态不能为空") | ||
| 91 | + @Min(value = 0, message = "状态只能为0(在用)或1(报废)") | ||
| 92 | + @Max(value = 1, message = "状态只能为0(在用)或1(报废)") | ||
| 93 | + private Long status; | ||
| 94 | + | ||
| 95 | + private String statusTxt; | ||
| 96 | + | ||
| 97 | + /** 归属公司 */ | ||
| 98 | + @ExcelProperty(index = 11) | ||
| 99 | + @NotEmpty(message = "归属公司不能为空") | ||
| 100 | + private String companyName; | ||
| 101 | + | ||
| 102 | + /** 所属班组 */ | ||
| 103 | + @ExcelProperty(index = 12) | ||
| 104 | + @NotEmpty(message = "所属班组不能为空") | ||
| 105 | + private String teamIds; | ||
| 106 | + | ||
| 107 | + /** 备注 */ | ||
| 108 | + @ExcelProperty(index = 13) | ||
| 109 | + @Size(max = 200, message = "备注长度不能超过200位") | ||
| 110 | + private String remark; | ||
| 111 | + | ||
| 112 | + | ||
| 113 | + // 设置status时自动更新statusTxt | ||
| 114 | + public void setStatus(Long status) { | ||
| 115 | + this.status = status; | ||
| 116 | + updateStatusTxt(); | ||
| 117 | + } | ||
| 118 | + | ||
| 119 | + private void updateStatusTxt() { | ||
| 120 | + if (status == null) { | ||
| 121 | + statusTxt = null; | ||
| 122 | + return; | ||
| 123 | + } | ||
| 124 | + | ||
| 125 | + switch (status.intValue()) { | ||
| 126 | + case 0: | ||
| 127 | + statusTxt = "在用"; | ||
| 128 | + break; | ||
| 129 | + case 1: | ||
| 130 | + statusTxt = "报废"; | ||
| 131 | + break; | ||
| 132 | + default: | ||
| 133 | + statusTxt = "未知状态"; | ||
| 134 | + } | ||
| 135 | + } | ||
| 136 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/PersonalCostImport.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; | ||
| 2 | + | ||
| 3 | +import cn.idev.excel.annotation.ExcelProperty; | ||
| 4 | +import jakarta.validation.constraints.DecimalMax; | ||
| 5 | +import jakarta.validation.constraints.Digits; | ||
| 6 | +import jakarta.validation.constraints.NotEmpty; | ||
| 7 | +import jakarta.validation.constraints.NotNull; | ||
| 8 | +import jakarta.validation.constraints.Pattern; | ||
| 9 | +import jakarta.validation.constraints.Size; | ||
| 10 | +import lombok.AllArgsConstructor; | ||
| 11 | +import lombok.Builder; | ||
| 12 | +import lombok.Data; | ||
| 13 | +import lombok.NoArgsConstructor; | ||
| 14 | + | ||
| 15 | +import java.math.BigDecimal; | ||
| 16 | + | ||
| 17 | +/** | ||
| 18 | + * 人员费用录入 - 个人费用对象 td_personal_cost | ||
| 19 | + * | ||
| 20 | + * @author wb | ||
| 21 | + * @date 2025-07-14 | ||
| 22 | + */ | ||
| 23 | +@Data | ||
| 24 | +@Builder | ||
| 25 | +@AllArgsConstructor | ||
| 26 | +@NoArgsConstructor | ||
| 27 | +public class PersonalCostImport | ||
| 28 | +{ | ||
| 29 | + | ||
| 30 | + /** 工资年月(如202506) */ | ||
| 31 | + @ExcelProperty(index = 0) | ||
| 32 | + @NotEmpty(message = "工资年月不能为空") | ||
| 33 | + @Pattern(regexp = "^\\d{4}(0[1-9]|1[0-2])$", message = "工资年月格式错误,必须为yyyyMM(如202301)") | ||
| 34 | + private String salaryMonth; | ||
| 35 | + | ||
| 36 | + /** 姓名 */ | ||
| 37 | + @ExcelProperty(index = 1) | ||
| 38 | + @NotEmpty(message = "姓名不能为空") | ||
| 39 | + @Size(max = 50, message = "姓名长度不能超过50位") | ||
| 40 | + @Pattern(regexp = "^[\u4e00-\u9fa5·]+$", message = "姓名只能包含汉字或点号(·)") | ||
| 41 | + private String name; | ||
| 42 | + | ||
| 43 | + /** 工资金额 */ | ||
| 44 | + @ExcelProperty(index = 2) | ||
| 45 | + @NotNull(message = "工资金额不能为空") | ||
| 46 | + @Digits(integer = 7, fraction = 2, message = "工资金额格式应为两位小数,且整数部分不超过7位") | ||
| 47 | + @DecimalMax(value = "9999999.99", message = "工资金额最大值为9999999.99") | ||
| 48 | + private BigDecimal salaryAmount; | ||
| 49 | + | ||
| 50 | + /** 岗位名称 */ | ||
| 51 | + @ExcelProperty(index = 3) | ||
| 52 | + @NotEmpty(message = "岗位名称不能为空") | ||
| 53 | + @Size(max = 50, message = "岗位名称长度不能超过50位") | ||
| 54 | + private String postName; | ||
| 55 | + | ||
| 56 | + /** 岗位类别(如正式员工、外包员工等) */ | ||
| 57 | + @ExcelProperty(index = 4) | ||
| 58 | + @NotEmpty(message = "岗位类别不能为空") | ||
| 59 | + private String postCategory; | ||
| 60 | + | ||
| 61 | + @ExcelProperty(index = 5) | ||
| 62 | + @NotEmpty(message = "所属单位不能为空") | ||
| 63 | + private String companyName; | ||
| 64 | + | ||
| 65 | + @ExcelProperty(index = 6) | ||
| 66 | + @NotEmpty(message = "所属班组不能为空") | ||
| 67 | + private String teamIds; | ||
| 68 | + | ||
| 69 | + /** 备注 */ | ||
| 70 | + @ExcelProperty(index = 7) | ||
| 71 | + @Size(max = 200, message = "备注长度不能超过200位") | ||
| 72 | + private String remark; | ||
| 73 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/RentalMechanicalCostImport.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; | ||
| 2 | + | ||
| 3 | +import cn.idev.excel.annotation.ExcelProperty; | ||
| 4 | +import com.fasterxml.jackson.annotation.JsonFormat; | ||
| 5 | +import jakarta.validation.constraints.DecimalMax; | ||
| 6 | +import jakarta.validation.constraints.Digits; | ||
| 7 | +import jakarta.validation.constraints.Max; | ||
| 8 | +import jakarta.validation.constraints.NotEmpty; | ||
| 9 | +import jakarta.validation.constraints.NotNull; | ||
| 10 | +import jakarta.validation.constraints.Pattern; | ||
| 11 | +import jakarta.validation.constraints.Positive; | ||
| 12 | +import jakarta.validation.constraints.Size; | ||
| 13 | +import lombok.AllArgsConstructor; | ||
| 14 | +import lombok.Builder; | ||
| 15 | +import lombok.Data; | ||
| 16 | +import lombok.NoArgsConstructor; | ||
| 17 | + | ||
| 18 | +import java.math.BigDecimal; | ||
| 19 | +import java.util.Date; | ||
| 20 | + | ||
| 21 | +/** | ||
| 22 | + * 租赁机械费用录入对象 td_rental_mechanical_cost | ||
| 23 | + * | ||
| 24 | + * @author wb | ||
| 25 | + * @date 2025-07-14 | ||
| 26 | + */ | ||
| 27 | +@Data | ||
| 28 | +@Builder | ||
| 29 | +@AllArgsConstructor | ||
| 30 | +@NoArgsConstructor | ||
| 31 | +public class RentalMechanicalCostImport { | ||
| 32 | + | ||
| 33 | + /** 机械名称 */ | ||
| 34 | + @ExcelProperty(index = 0) | ||
| 35 | + @NotEmpty(message = "机械名称不能为空") | ||
| 36 | + @Size(max = 50, message = "机械名称长度不能超过50位") | ||
| 37 | + private String mechName; | ||
| 38 | + | ||
| 39 | + /** 机械类型 */ | ||
| 40 | + @ExcelProperty(index = 1) | ||
| 41 | + @NotEmpty(message = "机械类别不能为空") | ||
| 42 | + private String mechType; | ||
| 43 | + | ||
| 44 | + /** 租赁总价格 */ | ||
| 45 | + @ExcelProperty(index = 2) | ||
| 46 | + @NotNull(message = "租赁总价格不能为空") | ||
| 47 | + @Digits(integer = 7, fraction = 2, message = "租赁总价格格式应为两位小数,且整数部分不超过7位") | ||
| 48 | + @DecimalMax(value = "9999999.99", message = "租赁总价格最大值为9999999.99") | ||
| 49 | + private BigDecimal rentalTotalPrice; | ||
| 50 | + | ||
| 51 | + /** 车牌号 */ | ||
| 52 | + @ExcelProperty(index = 3) | ||
| 53 | + @Size(max = 50, message = "车牌号长度不能超过50位") | ||
| 54 | + private String licensePlate; | ||
| 55 | + | ||
| 56 | + /** 车辆类别(如汽油、纯电新能源等) */ | ||
| 57 | + @ExcelProperty(index = 4) | ||
| 58 | + private String vehicleCategory; | ||
| 59 | + | ||
| 60 | + /** 车辆类型(如大型客车、轻型栏板货车等) */ | ||
| 61 | + @ExcelProperty(index = 5) | ||
| 62 | + private String vehicleType; | ||
| 63 | + | ||
| 64 | + /** 数量 */ | ||
| 65 | + @ExcelProperty(index = 6) | ||
| 66 | + @NotNull(message = "数量不能为空") | ||
| 67 | + @Positive(message = "数量必须为正整数") | ||
| 68 | + private Long quantity; | ||
| 69 | + | ||
| 70 | + /** 开始使用时间 */ | ||
| 71 | + @ExcelProperty(index = 7) | ||
| 72 | + @JsonFormat(pattern = "yyyy-MM-dd") | ||
| 73 | + @NotNull(message = "开始使用时间不能为空") | ||
| 74 | + private Date startUseTime; | ||
| 75 | + | ||
| 76 | + /** 使用时长(天) */ | ||
| 77 | + @ExcelProperty(index = 8) | ||
| 78 | + @NotNull(message = "使用时长不能为空") | ||
| 79 | + @Positive(message = "使用时长必须为正整数") | ||
| 80 | + @Max(value = 3650, message = "使用时长最大值为3650") | ||
| 81 | + private Long useDuration; | ||
| 82 | + | ||
| 83 | + /** 归属公司 */ | ||
| 84 | + @ExcelProperty(index = 9) | ||
| 85 | + @NotEmpty(message = "归属公司不能为空") | ||
| 86 | + private String companyName; | ||
| 87 | + | ||
| 88 | + /** 所属班组 */ | ||
| 89 | + @ExcelProperty(index = 10) | ||
| 90 | + @NotEmpty(message = "所属班组不能为空") | ||
| 91 | + private String teamIds; | ||
| 92 | + | ||
| 93 | + /** 权重 */ | ||
| 94 | + @ExcelProperty(index = 11) | ||
| 95 | + @NotEmpty(message = "权重不能为空") | ||
| 96 | + @Pattern(regexp = "^[1-9]\\d*(?:[,][1-9]\\d*)*$", message = "权重必须为正整数,多个时用逗号分隔") | ||
| 97 | + private String weight; | ||
| 98 | + | ||
| 99 | + /** 备注 */ | ||
| 100 | + @ExcelProperty(index = 12) | ||
| 101 | + @Size(max = 200, message = "备注长度不能超过200位") | ||
| 102 | + private String remark; | ||
| 103 | + | ||
| 104 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/WaterFeeImport.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; | ||
| 2 | + | ||
| 3 | +import jakarta.validation.constraints.DecimalMax; | ||
| 4 | +import jakarta.validation.constraints.Digits; | ||
| 5 | +import jakarta.validation.constraints.NotEmpty; | ||
| 6 | +import jakarta.validation.constraints.NotNull; | ||
| 7 | +import jakarta.validation.constraints.Pattern; | ||
| 8 | +import lombok.AllArgsConstructor; | ||
| 9 | +import lombok.Builder; | ||
| 10 | +import lombok.Data; | ||
| 11 | +import lombok.NoArgsConstructor; | ||
| 12 | +import cn.idev.excel.annotation.ExcelProperty; | ||
| 13 | + | ||
| 14 | +import java.math.BigDecimal; | ||
| 15 | + | ||
| 16 | +/** | ||
| 17 | + * 水费录入信息对象 td_water_fee | ||
| 18 | + * | ||
| 19 | + * @author wb | ||
| 20 | + * @date 2025-07-14 | ||
| 21 | + */ | ||
| 22 | +@Data | ||
| 23 | +@Builder | ||
| 24 | +@AllArgsConstructor | ||
| 25 | +@NoArgsConstructor | ||
| 26 | +public class WaterFeeImport | ||
| 27 | +{ | ||
| 28 | + | ||
| 29 | + /** 水费年月(String 类型:@NotEmpty+@Pattern 正常) */ | ||
| 30 | + @ExcelProperty(index = 0) | ||
| 31 | + @NotEmpty(message = "水费年月不能为空") | ||
| 32 | + @Pattern(regexp = "^\\d{4}(0[1-9]|1[0-2])$", message = "水费年月格式错误,必须为yyyyMM(如202301)") | ||
| 33 | + private String feeMonth; | ||
| 34 | + | ||
| 35 | + /** 水表编码(String 类型:@NotEmpty+@Pattern 正常) */ | ||
| 36 | + @ExcelProperty(index = 1) | ||
| 37 | + @NotEmpty(message = "水表编码不能为空") | ||
| 38 | + @Pattern(regexp = "^\\d{9}$", message = "水表编码必须由9位数字组成") | ||
| 39 | + private String meterCode; | ||
| 40 | + | ||
| 41 | + /** 水表地址(非必填,无注解冲突) */ | ||
| 42 | + @ExcelProperty(index = 2) | ||
| 43 | + private String meterAddress; | ||
| 44 | + | ||
| 45 | + /** 水表门牌号码(非必填,无注解冲突) */ | ||
| 46 | + @ExcelProperty(index = 3) | ||
| 47 | + private String meterDoorplate; | ||
| 48 | + | ||
| 49 | + /** | ||
| 50 | + * 用水量(BigDecimal 类型:替换为数值专用注解) | ||
| 51 | + * 需求:必填 + 两位小数 + 最大值9999999.99 + 总长度不超过16位(整数7位+小数2位=9位,满足≤16) | ||
| 52 | + */ | ||
| 53 | + @ExcelProperty(index = 4) | ||
| 54 | + @NotNull(message = "用水量不能为空") // 数值类型非空用 @NotNull(替代 @NotEmpty) | ||
| 55 | + @Digits(integer = 7, fraction = 2, message = "用水量格式应为两位小数,且整数部分不超过7位") // 替代 @Pattern | ||
| 56 | + @DecimalMax(value = "9999999.99", message = "用水量最大值为9999999.99") // 替代 @Max(支持 BigDecimal) | ||
| 57 | + private BigDecimal waterUsage; | ||
| 58 | + | ||
| 59 | + /** 总水费(BigDecimal 类型:同用水量注解逻辑) */ | ||
| 60 | + @ExcelProperty(index = 5) | ||
| 61 | + @NotNull(message = "总水费不能为空") | ||
| 62 | + @Digits(integer = 7, fraction = 2, message = "总水费格式应为两位小数,且整数部分不超过7位") | ||
| 63 | + @DecimalMax(value = "9999999.99", message = "总水费最大值为9999999.99") | ||
| 64 | + private BigDecimal totalFee; | ||
| 65 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/MechanicalCostController.java
| 1 | package com.zteits.urbanops.module.garden.controller.admin.mechanicalcost; | 1 | package com.zteits.urbanops.module.garden.controller.admin.mechanicalcost; |
| 2 | 2 | ||
| 3 | -import com.zteits.urbanops.module.garden.controller.admin.personalcost.vo.PersonalCostRespVO; | ||
| 4 | -import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; | ||
| 5 | -import com.zteits.urbanops.module.garden.enums.CostFeeConstants; | ||
| 6 | -import com.zteits.urbanops.module.garden.service.teambizdomainrel.TeamBizdomainRelService; | ||
| 7 | -import org.springframework.web.bind.annotation.*; | ||
| 8 | -import jakarta.annotation.Resource; | ||
| 9 | -import org.springframework.validation.annotation.Validated; | ||
| 10 | -import org.springframework.security.access.prepost.PreAuthorize; | ||
| 11 | -import io.swagger.v3.oas.annotations.tags.Tag; | ||
| 12 | -import io.swagger.v3.oas.annotations.Parameter; | ||
| 13 | -import io.swagger.v3.oas.annotations.Operation; | ||
| 14 | - | ||
| 15 | -import jakarta.validation.constraints.*; | ||
| 16 | -import jakarta.validation.*; | ||
| 17 | -import jakarta.servlet.http.*; | ||
| 18 | -import java.util.*; | ||
| 19 | -import java.io.IOException; | ||
| 20 | -import java.util.stream.Collectors; | ||
| 21 | - | 3 | +import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; |
| 4 | +import com.zteits.urbanops.framework.common.pojo.CommonResult; | ||
| 22 | import com.zteits.urbanops.framework.common.pojo.PageParam; | 5 | import com.zteits.urbanops.framework.common.pojo.PageParam; |
| 23 | import com.zteits.urbanops.framework.common.pojo.PageResult; | 6 | import com.zteits.urbanops.framework.common.pojo.PageResult; |
| 24 | -import com.zteits.urbanops.framework.common.pojo.CommonResult; | ||
| 25 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; | 7 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; |
| 26 | -import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; | ||
| 27 | - | ||
| 28 | import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; | 8 | import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; |
| 29 | - | ||
| 30 | -import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; | ||
| 31 | -import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; | ||
| 32 | - | ||
| 33 | -import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.*; | 9 | +import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.MechanicalCostPageReqVO; |
| 10 | +import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.MechanicalCostRespVO; | ||
| 11 | +import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.MechanicalCostSaveReqVO; | ||
| 34 | import com.zteits.urbanops.module.garden.dal.dataobject.mechanicalcost.MechanicalCostDO; | 12 | import com.zteits.urbanops.module.garden.dal.dataobject.mechanicalcost.MechanicalCostDO; |
| 35 | import com.zteits.urbanops.module.garden.service.mechanicalcost.MechanicalCostService; | 13 | import com.zteits.urbanops.module.garden.service.mechanicalcost.MechanicalCostService; |
| 14 | +import io.swagger.v3.oas.annotations.Operation; | ||
| 15 | +import io.swagger.v3.oas.annotations.Parameter; | ||
| 16 | +import io.swagger.v3.oas.annotations.tags.Tag; | ||
| 17 | +import jakarta.annotation.Resource; | ||
| 18 | +import jakarta.servlet.http.HttpServletResponse; | ||
| 19 | +import jakarta.validation.Valid; | ||
| 20 | +import org.springframework.security.access.prepost.PreAuthorize; | ||
| 21 | +import org.springframework.validation.annotation.Validated; | ||
| 22 | +import org.springframework.web.bind.annotation.*; | ||
| 23 | + | ||
| 24 | +import java.io.IOException; | ||
| 25 | +import java.util.List; | ||
| 26 | + | ||
| 27 | +import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.EXPORT; | ||
| 28 | +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; | ||
| 36 | 29 | ||
| 37 | @Tag(name = "管理后台 - 自有机械费用录入") | 30 | @Tag(name = "管理后台 - 自有机械费用录入") |
| 38 | @RestController | 31 | @RestController |
| @@ -43,8 +36,6 @@ public class MechanicalCostController { | @@ -43,8 +36,6 @@ public class MechanicalCostController { | ||
| 43 | @Resource | 36 | @Resource |
| 44 | private MechanicalCostService mechanicalCostService; | 37 | private MechanicalCostService mechanicalCostService; |
| 45 | 38 | ||
| 46 | - @Resource | ||
| 47 | - TeamBizdomainRelService teamBizdomainRelService; | ||
| 48 | 39 | ||
| 49 | @PostMapping("/create") | 40 | @PostMapping("/create") |
| 50 | @Operation(summary = "创建自有机械费用录入") | 41 | @Operation(summary = "创建自有机械费用录入") |
| @@ -85,23 +76,7 @@ public class MechanicalCostController { | @@ -85,23 +76,7 @@ public class MechanicalCostController { | ||
| 85 | @PreAuthorize("@ss.hasPermission('garden:mechanical-cost:query')") | 76 | @PreAuthorize("@ss.hasPermission('garden:mechanical-cost:query')") |
| 86 | public CommonResult<MechanicalCostRespVO> getMechanicalCost(@RequestParam("id") Long id) { | 77 | public CommonResult<MechanicalCostRespVO> getMechanicalCost(@RequestParam("id") Long id) { |
| 87 | MechanicalCostDO mechanicalCost = mechanicalCostService.getMechanicalCost(id); | 78 | MechanicalCostDO mechanicalCost = mechanicalCostService.getMechanicalCost(id); |
| 88 | - | ||
| 89 | - //add by wq 20251119 前端返回集合 | ||
| 90 | - MechanicalCostRespVO mechanicalCostRespVO = null; | ||
| 91 | - if (mechanicalCost != null) { | ||
| 92 | - mechanicalCostRespVO = BeanUtils.toBean(mechanicalCost, MechanicalCostRespVO.class); | ||
| 93 | - | ||
| 94 | - List<TeamBizdomainRelDO> teamBizdomainRelList = teamBizdomainRelService.getTeamBizdomainRelList(mechanicalCost.getId(), CostFeeConstants.COSTFEE_MECHANICAL); | ||
| 95 | - mechanicalCostRespVO.setTeamIds(teamBizdomainRelList); | ||
| 96 | - // 提取团队ID列表(使用Stream简化循环) | ||
| 97 | - List<String> teamIdList = teamBizdomainRelList.stream() | ||
| 98 | - .map(TeamBizdomainRelDO::getTeamId) // 提取teamId | ||
| 99 | - .filter(Objects::nonNull) // 过滤null值(可选,根据业务需要) | ||
| 100 | - .collect(Collectors.toList()); | ||
| 101 | - mechanicalCostRespVO.setTeamIdList(teamIdList); | ||
| 102 | - } | ||
| 103 | - //add by wq 20251119 前端返回集合 | ||
| 104 | - return success(mechanicalCostRespVO); | 79 | + return success(BeanUtils.toBean(mechanicalCost, MechanicalCostRespVO.class)); |
| 105 | } | 80 | } |
| 106 | 81 | ||
| 107 | @GetMapping("/page") | 82 | @GetMapping("/page") |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostPageReqVO.java
| 1 | package com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo; | 1 | package com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo; |
| 2 | 2 | ||
| 3 | -import cn.idev.excel.annotation.ExcelProperty; | ||
| 4 | -import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; | ||
| 5 | -import lombok.*; | ||
| 6 | - | ||
| 7 | -import java.time.LocalDate; | ||
| 8 | -import java.util.*; | ||
| 9 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 10 | import com.zteits.urbanops.framework.common.pojo.PageParam; | 3 | import com.zteits.urbanops.framework.common.pojo.PageParam; |
| 11 | -import java.math.BigDecimal; | 4 | +import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | +import lombok.Data; | ||
| 12 | import org.springframework.format.annotation.DateTimeFormat; | 6 | import org.springframework.format.annotation.DateTimeFormat; |
| 7 | + | ||
| 8 | +import java.math.BigDecimal; | ||
| 9 | +import java.time.LocalDate; | ||
| 13 | import java.time.LocalDateTime; | 10 | import java.time.LocalDateTime; |
| 11 | +import java.util.List; | ||
| 14 | 12 | ||
| 15 | import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | 13 | import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| 16 | 14 | ||
| @@ -63,7 +61,7 @@ public class MechanicalCostPageReqVO extends PageParam { | @@ -63,7 +61,7 @@ public class MechanicalCostPageReqVO extends PageParam { | ||
| 63 | private String companyId; | 61 | private String companyId; |
| 64 | 62 | ||
| 65 | @Schema(description = "部门id", example = "13645") | 63 | @Schema(description = "部门id", example = "13645") |
| 66 | - private Long deptId; | 64 | + private List<String> deptId; |
| 67 | 65 | ||
| 68 | @Schema(description = "备注", example = "随便") | 66 | @Schema(description = "备注", example = "随便") |
| 69 | private String remark; | 67 | private String remark; |
| @@ -71,10 +69,4 @@ public class MechanicalCostPageReqVO extends PageParam { | @@ -71,10 +69,4 @@ public class MechanicalCostPageReqVO extends PageParam { | ||
| 71 | @Schema(description = "创建时间") | 69 | @Schema(description = "创建时间") |
| 72 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | 70 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| 73 | private LocalDateTime[] createTime; | 71 | private LocalDateTime[] createTime; |
| 74 | - | ||
| 75 | - @ExcelProperty("班组") | ||
| 76 | - private List<TeamBizdomainRelDO> teamIds; | ||
| 77 | - | ||
| 78 | - private List teamIdList; | ||
| 79 | - | ||
| 80 | } | 72 | } |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostRespVO.java
| 1 | package com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo; | 1 | package com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo; |
| 2 | 2 | ||
| 3 | -import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; | 3 | +import cn.hutool.core.annotation.Alias; |
| 4 | +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; | ||
| 5 | +import cn.idev.excel.annotation.ExcelProperty; | ||
| 4 | import io.swagger.v3.oas.annotations.media.Schema; | 6 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | -import lombok.*; | 7 | +import lombok.Data; |
| 6 | 8 | ||
| 7 | -import java.time.LocalDate; | ||
| 8 | -import java.util.*; | ||
| 9 | import java.math.BigDecimal; | 9 | import java.math.BigDecimal; |
| 10 | -import org.springframework.format.annotation.DateTimeFormat; | 10 | +import java.time.LocalDate; |
| 11 | import java.time.LocalDateTime; | 11 | import java.time.LocalDateTime; |
| 12 | -import cn.idev.excel.annotation.*; | 12 | +import java.util.List; |
| 13 | 13 | ||
| 14 | @Schema(description = "管理后台 - 自有机械费用录入 Response VO") | 14 | @Schema(description = "管理后台 - 自有机械费用录入 Response VO") |
| 15 | @Data | 15 | @Data |
| @@ -76,10 +76,6 @@ public class MechanicalCostRespVO { | @@ -76,10 +76,6 @@ public class MechanicalCostRespVO { | ||
| 76 | @ExcelProperty("归属公司ID") | 76 | @ExcelProperty("归属公司ID") |
| 77 | private String companyId; | 77 | private String companyId; |
| 78 | 78 | ||
| 79 | - @Schema(description = "部门id", example = "13645") | ||
| 80 | - @ExcelProperty("部门id") | ||
| 81 | - private Long deptId; | ||
| 82 | - | ||
| 83 | @Schema(description = "备注", example = "随便") | 79 | @Schema(description = "备注", example = "随便") |
| 84 | @ExcelProperty("备注") | 80 | @ExcelProperty("备注") |
| 85 | private String remark; | 81 | private String remark; |
| @@ -88,9 +84,9 @@ public class MechanicalCostRespVO { | @@ -88,9 +84,9 @@ public class MechanicalCostRespVO { | ||
| 88 | @ExcelProperty("创建时间") | 84 | @ExcelProperty("创建时间") |
| 89 | private LocalDateTime createTime; | 85 | private LocalDateTime createTime; |
| 90 | 86 | ||
| 87 | + @Schema(description = "班组", example = "班组") | ||
| 91 | @ExcelProperty("班组") | 88 | @ExcelProperty("班组") |
| 92 | - private List<TeamBizdomainRelDO> teamIds; | ||
| 93 | - | ||
| 94 | - private List teamIdList; | 89 | + @Alias("deptId") |
| 90 | + private List<String> teamIdList; | ||
| 95 | 91 | ||
| 96 | } | 92 | } |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/mechanicalcost/vo/MechanicalCostSaveReqVO.java
| @@ -76,6 +76,4 @@ public class MechanicalCostSaveReqVO { | @@ -76,6 +76,4 @@ public class MechanicalCostSaveReqVO { | ||
| 76 | @ExcelProperty("班组") | 76 | @ExcelProperty("班组") |
| 77 | private List<TeamBizdomainRelDO> teamIds; | 77 | private List<TeamBizdomainRelDO> teamIds; |
| 78 | 78 | ||
| 79 | - private List teamIdList; | ||
| 80 | - | ||
| 81 | } | 79 | } |
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; | @@ -34,14 +34,12 @@ import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; | ||
| 34 | 34 | ||
| 35 | @Tag(name = "管理后台 - 人员费用录入 - 个人费用") | 35 | @Tag(name = "管理后台 - 人员费用录入 - 个人费用") |
| 36 | @RestController | 36 | @RestController |
| 37 | -@RequestMapping("/garden/personal-cost") | 37 | +@RequestMapping({"/garden/personal-cost", "/costfee/personalcost"}) |
| 38 | @Validated | 38 | @Validated |
| 39 | public class PersonalCostController { | 39 | public class PersonalCostController { |
| 40 | 40 | ||
| 41 | @Resource | 41 | @Resource |
| 42 | private PersonalCostService personalCostService; | 42 | private PersonalCostService personalCostService; |
| 43 | - @Resource | ||
| 44 | - TeamBizdomainRelService teamBizdomainRelService; | ||
| 45 | 43 | ||
| 46 | @PostMapping("/create") | 44 | @PostMapping("/create") |
| 47 | @Operation(summary = "创建人员费用录入 - 个人费用") | 45 | @Operation(summary = "创建人员费用录入 - 个人费用") |
| @@ -82,22 +80,7 @@ public class PersonalCostController { | @@ -82,22 +80,7 @@ public class PersonalCostController { | ||
| 82 | @PreAuthorize("@ss.hasPermission('garden:personal-cost:query')") | 80 | @PreAuthorize("@ss.hasPermission('garden:personal-cost:query')") |
| 83 | public CommonResult<PersonalCostRespVO> getPersonalCost(@RequestParam("id") Long id) { | 81 | public CommonResult<PersonalCostRespVO> getPersonalCost(@RequestParam("id") Long id) { |
| 84 | PersonalCostDO personalCost = personalCostService.getPersonalCost(id); | 82 | PersonalCostDO personalCost = personalCostService.getPersonalCost(id); |
| 85 | - //add by wq 20251119 前端返回集合 | ||
| 86 | - PersonalCostRespVO personalCostRespVO = null; | ||
| 87 | - if (personalCost != null) { | ||
| 88 | - personalCostRespVO = BeanUtils.toBean(personalCost, PersonalCostRespVO.class); | ||
| 89 | - | ||
| 90 | - List<TeamBizdomainRelDO> teamBizdomainRelList = teamBizdomainRelService.getTeamBizdomainRelList(personalCost.getId(), CostFeeConstants.COSTFEE_PERSONAL); | ||
| 91 | - personalCostRespVO.setTeamIds(teamBizdomainRelList); | ||
| 92 | - // 提取团队ID列表(使用Stream简化循环) | ||
| 93 | - List<String> teamIdList = teamBizdomainRelList.stream() | ||
| 94 | - .map(TeamBizdomainRelDO::getTeamId) // 提取teamId | ||
| 95 | - .filter(Objects::nonNull) // 过滤null值(可选,根据业务需要) | ||
| 96 | - .collect(Collectors.toList()); | ||
| 97 | - personalCostRespVO.setTeamIdList(teamIdList); | ||
| 98 | - } | ||
| 99 | - //add by wq 20251119 前端返回集合 | ||
| 100 | - return success(personalCostRespVO); | 83 | + return success(BeanUtils.toBean(personalCost, PersonalCostRespVO.class)); |
| 101 | } | 84 | } |
| 102 | 85 | ||
| 103 | @GetMapping("/page") | 86 | @GetMapping("/page") |
| @@ -108,6 +91,13 @@ public class PersonalCostController { | @@ -108,6 +91,13 @@ public class PersonalCostController { | ||
| 108 | return success(BeanUtils.toBean(pageResult, PersonalCostRespVO.class)); | 91 | return success(BeanUtils.toBean(pageResult, PersonalCostRespVO.class)); |
| 109 | } | 92 | } |
| 110 | 93 | ||
| 94 | + @GetMapping("/list") | ||
| 95 | + @Operation(summary = "获得人员费用录入 - 个人费用分页") | ||
| 96 | + @PreAuthorize("@ss.hasPermission('garden:personal-cost:query')") | ||
| 97 | + public CommonResult<PageResult<PersonalCostRespVO>> list(@Valid PersonalCostPageReqVO pageReqVO) { | ||
| 98 | + PageResult<PersonalCostDO> pageResult = personalCostService.getPersonalCostPage(pageReqVO); | ||
| 99 | + return success(BeanUtils.toBean(pageResult, PersonalCostRespVO.class)); | ||
| 100 | + } | ||
| 111 | @GetMapping("/export-excel") | 101 | @GetMapping("/export-excel") |
| 112 | @Operation(summary = "导出人员费用录入 - 个人费用 Excel") | 102 | @Operation(summary = "导出人员费用录入 - 个人费用 Excel") |
| 113 | @PreAuthorize("@ss.hasPermission('garden:personal-cost:export')") | 103 | @PreAuthorize("@ss.hasPermission('garden:personal-cost:export')") |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostPageReqVO.java
| 1 | package com.zteits.urbanops.module.garden.controller.admin.personalcost.vo; | 1 | package com.zteits.urbanops.module.garden.controller.admin.personalcost.vo; |
| 2 | 2 | ||
| 3 | -import lombok.*; | ||
| 4 | -import java.util.*; | ||
| 5 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 6 | import com.zteits.urbanops.framework.common.pojo.PageParam; | 3 | import com.zteits.urbanops.framework.common.pojo.PageParam; |
| 7 | -import java.math.BigDecimal; | 4 | +import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | +import lombok.Data; | ||
| 8 | import org.springframework.format.annotation.DateTimeFormat; | 6 | import org.springframework.format.annotation.DateTimeFormat; |
| 7 | + | ||
| 8 | +import java.math.BigDecimal; | ||
| 9 | import java.time.LocalDateTime; | 9 | import java.time.LocalDateTime; |
| 10 | +import java.util.List; | ||
| 10 | 11 | ||
| 11 | import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | 12 | import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| 12 | 13 | ||
| @@ -36,7 +37,7 @@ public class PersonalCostPageReqVO extends PageParam { | @@ -36,7 +37,7 @@ public class PersonalCostPageReqVO extends PageParam { | ||
| 36 | private String companyId; | 37 | private String companyId; |
| 37 | 38 | ||
| 38 | @Schema(description = "部门id", example = "18461") | 39 | @Schema(description = "部门id", example = "18461") |
| 39 | - private Long deptId; | 40 | + private List<String> deptId; |
| 40 | 41 | ||
| 41 | @Schema(description = "备注", example = "随便") | 42 | @Schema(description = "备注", example = "随便") |
| 42 | private String remark; | 43 | private String remark; |
| @@ -45,4 +46,4 @@ public class PersonalCostPageReqVO extends PageParam { | @@ -45,4 +46,4 @@ public class PersonalCostPageReqVO extends PageParam { | ||
| 45 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | 46 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| 46 | private LocalDateTime[] createTime; | 47 | private LocalDateTime[] createTime; |
| 47 | 48 | ||
| 48 | -} | ||
| 49 | \ No newline at end of file | 49 | \ No newline at end of file |
| 50 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostRespVO.java
| 1 | package com.zteits.urbanops.module.garden.controller.admin.personalcost.vo; | 1 | package com.zteits.urbanops.module.garden.controller.admin.personalcost.vo; |
| 2 | 2 | ||
| 3 | -import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; | 3 | +import cn.hutool.core.annotation.Alias; |
| 4 | +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; | ||
| 5 | +import cn.idev.excel.annotation.ExcelProperty; | ||
| 4 | import io.swagger.v3.oas.annotations.media.Schema; | 6 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | -import lombok.*; | ||
| 6 | -import java.util.*; | 7 | +import lombok.Data; |
| 8 | + | ||
| 7 | import java.math.BigDecimal; | 9 | import java.math.BigDecimal; |
| 8 | -import org.springframework.format.annotation.DateTimeFormat; | ||
| 9 | import java.time.LocalDateTime; | 10 | import java.time.LocalDateTime; |
| 10 | -import cn.idev.excel.annotation.*; | 11 | +import java.util.List; |
| 11 | 12 | ||
| 12 | @Schema(description = "管理后台 - 人员费用录入 - 个人费用 Response VO") | 13 | @Schema(description = "管理后台 - 人员费用录入 - 个人费用 Response VO") |
| 13 | @Data | 14 | @Data |
| @@ -46,10 +47,6 @@ public class PersonalCostRespVO { | @@ -46,10 +47,6 @@ public class PersonalCostRespVO { | ||
| 46 | @ExcelProperty("归属公司ID") | 47 | @ExcelProperty("归属公司ID") |
| 47 | private String companyId; | 48 | private String companyId; |
| 48 | 49 | ||
| 49 | - @Schema(description = "部门id", example = "18461") | ||
| 50 | - @ExcelProperty("部门id") | ||
| 51 | - private Long deptId; | ||
| 52 | - | ||
| 53 | @Schema(description = "备注", example = "随便") | 50 | @Schema(description = "备注", example = "随便") |
| 54 | @ExcelProperty("备注") | 51 | @ExcelProperty("备注") |
| 55 | private String remark; | 52 | private String remark; |
| @@ -58,10 +55,8 @@ public class PersonalCostRespVO { | @@ -58,10 +55,8 @@ public class PersonalCostRespVO { | ||
| 58 | @ExcelProperty("创建时间") | 55 | @ExcelProperty("创建时间") |
| 59 | private LocalDateTime createTime; | 56 | private LocalDateTime createTime; |
| 60 | 57 | ||
| 58 | + @Schema(description = "班组", example = "班组") | ||
| 61 | @ExcelProperty("班组") | 59 | @ExcelProperty("班组") |
| 62 | - private List<TeamBizdomainRelDO> teamIds; | ||
| 63 | - | ||
| 64 | - private List teamIdList; | ||
| 65 | - | ||
| 66 | - | 60 | + @Alias("deptId") |
| 61 | + private List<String> teamIdList; | ||
| 67 | } | 62 | } |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/personalcost/vo/PersonalCostSaveReqVO.java
| @@ -41,12 +41,9 @@ public class PersonalCostSaveReqVO { | @@ -41,12 +41,9 @@ public class PersonalCostSaveReqVO { | ||
| 41 | @NotEmpty(message = "归属公司ID不能为空") | 41 | @NotEmpty(message = "归属公司ID不能为空") |
| 42 | private String companyId; | 42 | private String companyId; |
| 43 | 43 | ||
| 44 | - @Schema(description = "部门id", example = "18461") | ||
| 45 | - private Long deptId; | ||
| 46 | - | ||
| 47 | @Schema(description = "备注", example = "随便") | 44 | @Schema(description = "备注", example = "随便") |
| 48 | private String remark; | 45 | private String remark; |
| 49 | - | ||
| 50 | @ExcelProperty("班组") | 46 | @ExcelProperty("班组") |
| 51 | private List<TeamBizdomainRelDO> teamIds; | 47 | private List<TeamBizdomainRelDO> teamIds; |
| 48 | + | ||
| 52 | } | 49 | } |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/RentalMechanicalCostController.java
| @@ -42,8 +42,7 @@ public class RentalMechanicalCostController { | @@ -42,8 +42,7 @@ public class RentalMechanicalCostController { | ||
| 42 | 42 | ||
| 43 | @Resource | 43 | @Resource |
| 44 | private RentalMechanicalCostService rentalMechanicalCostService; | 44 | private RentalMechanicalCostService rentalMechanicalCostService; |
| 45 | - @Resource | ||
| 46 | - TeamBizdomainRelService teamBizdomainRelService; | 45 | + |
| 47 | @PostMapping("/create") | 46 | @PostMapping("/create") |
| 48 | @Operation(summary = "创建租赁机械费用录入") | 47 | @Operation(summary = "创建租赁机械费用录入") |
| 49 | @PreAuthorize("@ss.hasPermission('garden:rental-mechanical-cost:create')") | 48 | @PreAuthorize("@ss.hasPermission('garden:rental-mechanical-cost:create')") |
| @@ -83,17 +82,7 @@ public class RentalMechanicalCostController { | @@ -83,17 +82,7 @@ public class RentalMechanicalCostController { | ||
| 83 | @PreAuthorize("@ss.hasPermission('garden:rental-mechanical-cost:query')") | 82 | @PreAuthorize("@ss.hasPermission('garden:rental-mechanical-cost:query')") |
| 84 | public CommonResult<RentalMechanicalCostRespVO> getRentalMechanicalCost(@RequestParam("id") Long id) { | 83 | public CommonResult<RentalMechanicalCostRespVO> getRentalMechanicalCost(@RequestParam("id") Long id) { |
| 85 | RentalMechanicalCostDO rentalMechanicalCost = rentalMechanicalCostService.getRentalMechanicalCost(id); | 84 | RentalMechanicalCostDO rentalMechanicalCost = rentalMechanicalCostService.getRentalMechanicalCost(id); |
| 86 | - | ||
| 87 | - //add by wq 20251119 前端返回集合 | ||
| 88 | - RentalMechanicalCostRespVO mechanicalCostRespVO = null; | ||
| 89 | - if (rentalMechanicalCost != null) { | ||
| 90 | - mechanicalCostRespVO = BeanUtils.toBean(rentalMechanicalCost, RentalMechanicalCostRespVO.class); | ||
| 91 | - | ||
| 92 | - List<TeamBizdomainRelDO> teamBizdomainRelList = teamBizdomainRelService.getTeamBizdomainRelList(rentalMechanicalCost.getId(), CostFeeConstants.COSTFEE_RENTALMECHANICAL); | ||
| 93 | - mechanicalCostRespVO.setTeamIds(teamBizdomainRelList); | ||
| 94 | - } | ||
| 95 | - //add by wq 20251119 前端返回集合 | ||
| 96 | - return success(mechanicalCostRespVO); | 85 | + return success(BeanUtils.toBean(rentalMechanicalCost, RentalMechanicalCostRespVO.class)); |
| 97 | } | 86 | } |
| 98 | 87 | ||
| 99 | @GetMapping("/page") | 88 | @GetMapping("/page") |
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 { | @@ -70,6 +70,6 @@ public class RentalMechanicalCostPageReqVO extends PageParam { | ||
| 70 | private LocalDateTime[] createTime; | 70 | private LocalDateTime[] createTime; |
| 71 | 71 | ||
| 72 | @ExcelProperty("班组") | 72 | @ExcelProperty("班组") |
| 73 | - private List<TeamBizdomainRelDO> teamIds; | 73 | + private List<TeamBizdomainRelVo> teamIds; |
| 74 | 74 | ||
| 75 | } | 75 | } |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostRespVO.java
| @@ -85,6 +85,6 @@ public class RentalMechanicalCostRespVO { | @@ -85,6 +85,6 @@ public class RentalMechanicalCostRespVO { | ||
| 85 | private LocalDateTime createTime; | 85 | private LocalDateTime createTime; |
| 86 | 86 | ||
| 87 | @ExcelProperty("班组") | 87 | @ExcelProperty("班组") |
| 88 | - private List<TeamBizdomainRelDO> teamIds; | 88 | + private List<TeamBizdomainRelVo> teamIds; |
| 89 | 89 | ||
| 90 | } | 90 | } |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/RentalMechanicalCostSaveReqVO.java
| @@ -69,5 +69,5 @@ public class RentalMechanicalCostSaveReqVO { | @@ -69,5 +69,5 @@ public class RentalMechanicalCostSaveReqVO { | ||
| 69 | @Schema(description = "备注", example = "你说的对") | 69 | @Schema(description = "备注", example = "你说的对") |
| 70 | private String remark; | 70 | private String remark; |
| 71 | @ExcelProperty("班组") | 71 | @ExcelProperty("班组") |
| 72 | - private List<TeamBizdomainRelDO> teamIds; | 72 | + private List<TeamBizdomainRelVo> teamIds; |
| 73 | } | 73 | } |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/rentalmechanicalcost/vo/TeamBizdomainRelVo.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.garden.controller.admin.rentalmechanicalcost.vo; | ||
| 2 | + | ||
| 3 | +import lombok.Data; | ||
| 4 | + | ||
| 5 | +/** | ||
| 6 | + * @Classname TeamBizdomainRelVo | ||
| 7 | + * @Description | ||
| 8 | + * @Date 2025/11/24 20:04 | ||
| 9 | + * @Created by wangqian | ||
| 10 | + */ | ||
| 11 | +@Data | ||
| 12 | +public class TeamBizdomainRelVo { | ||
| 13 | + /** | ||
| 14 | + * 班组编码 | ||
| 15 | + */ | ||
| 16 | + private String teamId; | ||
| 17 | + /** | ||
| 18 | + * 班组名称 | ||
| 19 | + */ | ||
| 20 | + private String teamName; | ||
| 21 | + /** | ||
| 22 | + * 班组名称 | ||
| 23 | + */ | ||
| 24 | + private Long weight; | ||
| 25 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordPageReqVO.java
| 1 | package com.zteits.urbanops.module.garden.controller.admin.wasterecord.vo; | 1 | package com.zteits.urbanops.module.garden.controller.admin.wasterecord.vo; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.annotation.Alias; | ||
| 3 | import cn.idev.excel.annotation.ExcelProperty; | 4 | import cn.idev.excel.annotation.ExcelProperty; |
| 4 | -import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; | ||
| 5 | -import lombok.*; | ||
| 6 | - | ||
| 7 | -import java.time.LocalDate; | ||
| 8 | -import java.util.*; | ||
| 9 | -import io.swagger.v3.oas.annotations.media.Schema; | ||
| 10 | import com.zteits.urbanops.framework.common.pojo.PageParam; | 5 | import com.zteits.urbanops.framework.common.pojo.PageParam; |
| 11 | -import java.math.BigDecimal; | 6 | +import io.swagger.v3.oas.annotations.media.Schema; |
| 7 | +import lombok.Data; | ||
| 12 | import org.springframework.format.annotation.DateTimeFormat; | 8 | import org.springframework.format.annotation.DateTimeFormat; |
| 9 | + | ||
| 10 | +import java.math.BigDecimal; | ||
| 11 | +import java.time.LocalDate; | ||
| 13 | import java.time.LocalDateTime; | 12 | import java.time.LocalDateTime; |
| 13 | +import java.util.List; | ||
| 14 | 14 | ||
| 15 | import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | 15 | import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| 16 | 16 | ||
| @@ -56,7 +56,9 @@ public class WasteRecordPageReqVO extends PageParam { | @@ -56,7 +56,9 @@ public class WasteRecordPageReqVO extends PageParam { | ||
| 56 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | 56 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| 57 | private LocalDateTime[] createTime; | 57 | private LocalDateTime[] createTime; |
| 58 | 58 | ||
| 59 | + @Schema(description = "班组", example = "班组") | ||
| 59 | @ExcelProperty("班组") | 60 | @ExcelProperty("班组") |
| 60 | - private List<TeamBizdomainRelDO> teamIds; | 61 | + @Alias("deptId") |
| 62 | + private List<String> teamIdList; | ||
| 61 | 63 | ||
| 62 | } | 64 | } |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/wasterecord/vo/WasteRecordRespVO.java
| 1 | package com.zteits.urbanops.module.garden.controller.admin.wasterecord.vo; | 1 | package com.zteits.urbanops.module.garden.controller.admin.wasterecord.vo; |
| 2 | 2 | ||
| 3 | -import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; | 3 | +import cn.hutool.core.annotation.Alias; |
| 4 | +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; | ||
| 5 | +import cn.idev.excel.annotation.ExcelProperty; | ||
| 4 | import io.swagger.v3.oas.annotations.media.Schema; | 6 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | -import lombok.*; | 7 | +import lombok.Data; |
| 6 | 8 | ||
| 7 | -import java.time.LocalDate; | ||
| 8 | -import java.util.*; | ||
| 9 | import java.math.BigDecimal; | 9 | import java.math.BigDecimal; |
| 10 | -import org.springframework.format.annotation.DateTimeFormat; | 10 | +import java.time.LocalDate; |
| 11 | import java.time.LocalDateTime; | 11 | import java.time.LocalDateTime; |
| 12 | -import cn.idev.excel.annotation.*; | 12 | +import java.util.List; |
| 13 | 13 | ||
| 14 | @Schema(description = "管理后台 - 园林废弃物录入 Response VO") | 14 | @Schema(description = "管理后台 - 园林废弃物录入 Response VO") |
| 15 | @Data | 15 | @Data |
| @@ -56,10 +56,6 @@ public class WasteRecordRespVO { | @@ -56,10 +56,6 @@ public class WasteRecordRespVO { | ||
| 56 | @ExcelProperty("归属公司ID") | 56 | @ExcelProperty("归属公司ID") |
| 57 | private String companyId; | 57 | private String companyId; |
| 58 | 58 | ||
| 59 | - @Schema(description = "部门id", example = "26656") | ||
| 60 | - @ExcelProperty("部门id") | ||
| 61 | - private Long deptId; | ||
| 62 | - | ||
| 63 | @Schema(description = "备注", example = "你说的对") | 59 | @Schema(description = "备注", example = "你说的对") |
| 64 | @ExcelProperty("备注") | 60 | @ExcelProperty("备注") |
| 65 | private String remark; | 61 | private String remark; |
| @@ -68,7 +64,9 @@ public class WasteRecordRespVO { | @@ -68,7 +64,9 @@ public class WasteRecordRespVO { | ||
| 68 | @ExcelProperty("创建时间") | 64 | @ExcelProperty("创建时间") |
| 69 | private LocalDateTime createTime; | 65 | private LocalDateTime createTime; |
| 70 | 66 | ||
| 67 | + @Schema(description = "班组", example = "班组") | ||
| 71 | @ExcelProperty("班组") | 68 | @ExcelProperty("班组") |
| 72 | - private List<TeamBizdomainRelDO> teamIds; | 69 | + @Alias("deptId") |
| 70 | + private List<String> teamIdList; | ||
| 73 | 71 | ||
| 74 | } | 72 | } |
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; | @@ -31,7 +31,7 @@ import com.zteits.urbanops.module.garden.service.waterfee.WaterFeeService; | ||
| 31 | 31 | ||
| 32 | @Tag(name = "管理后台 - 水费录入信息") | 32 | @Tag(name = "管理后台 - 水费录入信息") |
| 33 | @RestController | 33 | @RestController |
| 34 | -@RequestMapping("/garden/water-fee") | 34 | +@RequestMapping({"/costfee/waterfee", "/garden/water-fee"}) |
| 35 | @Validated | 35 | @Validated |
| 36 | public class WaterFeeController { | 36 | public class WaterFeeController { |
| 37 | 37 | ||
| @@ -87,6 +87,13 @@ public class WaterFeeController { | @@ -87,6 +87,13 @@ public class WaterFeeController { | ||
| 87 | PageResult<WaterFeeDO> pageResult = waterFeeService.getWaterFeePage(pageReqVO); | 87 | PageResult<WaterFeeDO> pageResult = waterFeeService.getWaterFeePage(pageReqVO); |
| 88 | return success(BeanUtils.toBean(pageResult, WaterFeeRespVO.class)); | 88 | return success(BeanUtils.toBean(pageResult, WaterFeeRespVO.class)); |
| 89 | } | 89 | } |
| 90 | + @GetMapping("/list") | ||
| 91 | + @Operation(summary = "获得水费录入信息分页") | ||
| 92 | + @PreAuthorize("@ss.hasPermission('garden:water-fee:query')") | ||
| 93 | + public CommonResult<PageResult<WaterFeeRespVO>> list(@Valid WaterFeePageReqVO pageReqVO) { | ||
| 94 | + PageResult<WaterFeeDO> pageResult = waterFeeService.getWaterFeePage(pageReqVO); | ||
| 95 | + return success(BeanUtils.toBean(pageResult, WaterFeeRespVO.class)); | ||
| 96 | + } | ||
| 90 | 97 | ||
| 91 | @GetMapping("/export-excel") | 98 | @GetMapping("/export-excel") |
| 92 | @Operation(summary = "导出水费录入信息 Excel") | 99 | @Operation(summary = "导出水费录入信息 Excel") |
| @@ -101,4 +108,4 @@ public class WaterFeeController { | @@ -101,4 +108,4 @@ public class WaterFeeController { | ||
| 101 | BeanUtils.toBean(list, WaterFeeRespVO.class)); | 108 | BeanUtils.toBean(list, WaterFeeRespVO.class)); |
| 102 | } | 109 | } |
| 103 | 110 | ||
| 104 | -} | ||
| 105 | \ No newline at end of file | 111 | \ No newline at end of file |
| 112 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/mechanicalcost/MechanicalCostDO.java
| 1 | package com.zteits.urbanops.module.garden.dal.dataobject.mechanicalcost; | 1 | package com.zteits.urbanops.module.garden.dal.dataobject.mechanicalcost; |
| 2 | 2 | ||
| 3 | +import com.baomidou.mybatisplus.annotation.KeySequence; | ||
| 4 | +import com.baomidou.mybatisplus.annotation.TableField; | ||
| 5 | +import com.baomidou.mybatisplus.annotation.TableId; | ||
| 6 | +import com.baomidou.mybatisplus.annotation.TableName; | ||
| 7 | +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | ||
| 8 | +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; | ||
| 3 | import lombok.*; | 9 | import lombok.*; |
| 4 | 10 | ||
| 5 | -import java.time.LocalDate; | ||
| 6 | -import java.util.*; | ||
| 7 | import java.math.BigDecimal; | 11 | import java.math.BigDecimal; |
| 8 | -import java.time.LocalDateTime; | ||
| 9 | -import java.time.LocalDateTime; | ||
| 10 | -import com.baomidou.mybatisplus.annotation.*; | ||
| 11 | -import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; | 12 | +import java.time.LocalDate; |
| 13 | +import java.util.List; | ||
| 12 | 14 | ||
| 13 | /** | 15 | /** |
| 14 | * 自有机械费用录入 DO | 16 | * 自有机械费用录入 DO |
| 15 | * | 17 | * |
| 16 | * @author 超级管理员 | 18 | * @author 超级管理员 |
| 17 | */ | 19 | */ |
| 18 | -@TableName("garden_mechanical_cost") | 20 | +@TableName( value = "garden_mechanical_cost", autoResultMap = true) |
| 19 | @KeySequence("garden_mechanical_cost_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | 21 | @KeySequence("garden_mechanical_cost_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 |
| 20 | @Data | 22 | @Data |
| 21 | @EqualsAndHashCode(callSuper = true) | 23 | @EqualsAndHashCode(callSuper = true) |
| @@ -89,7 +91,8 @@ public class MechanicalCostDO extends BaseDO { | @@ -89,7 +91,8 @@ public class MechanicalCostDO extends BaseDO { | ||
| 89 | /** | 91 | /** |
| 90 | * 部门id | 92 | * 部门id |
| 91 | */ | 93 | */ |
| 92 | - private Long deptId; | 94 | + @TableField(typeHandler = JacksonTypeHandler.class) |
| 95 | + private List<String> deptId; | ||
| 93 | /** | 96 | /** |
| 94 | * 备注 | 97 | * 备注 |
| 95 | */ | 98 | */ |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/personalcost/PersonalCostDO.java
| 1 | -package com.zteits.urbanops.module.garden.dal.dataobject.personalcost; | ||
| 2 | - | ||
| 3 | -import lombok.*; | ||
| 4 | -import java.util.*; | ||
| 5 | -import java.math.BigDecimal; | ||
| 6 | -import java.time.LocalDateTime; | ||
| 7 | -import java.time.LocalDateTime; | ||
| 8 | -import com.baomidou.mybatisplus.annotation.*; | ||
| 9 | -import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; | ||
| 10 | - | ||
| 11 | -/** | ||
| 12 | - * 人员费用录入 - 个人费用 DO | ||
| 13 | - * | ||
| 14 | - * @author 超级管理员 | ||
| 15 | - */ | ||
| 16 | -@TableName("garden_personal_cost") | ||
| 17 | -@KeySequence("garden_personal_cost_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | ||
| 18 | -@Data | ||
| 19 | -@EqualsAndHashCode(callSuper = true) | ||
| 20 | -@ToString(callSuper = true) | ||
| 21 | -@Builder | ||
| 22 | -@NoArgsConstructor | ||
| 23 | -@AllArgsConstructor | ||
| 24 | -public class PersonalCostDO extends BaseDO { | ||
| 25 | - | ||
| 26 | - /** | ||
| 27 | - * 记录ID,自增主键 | ||
| 28 | - */ | ||
| 29 | - @TableId | ||
| 30 | - private Long id; | ||
| 31 | - /** | ||
| 32 | - * 工资年月(如202506) | ||
| 33 | - */ | ||
| 34 | - private String salaryMonth; | ||
| 35 | - /** | ||
| 36 | - * 姓名 | ||
| 37 | - */ | ||
| 38 | - private String name; | ||
| 39 | - /** | ||
| 40 | - * 工资金额 | ||
| 41 | - */ | ||
| 42 | - private BigDecimal salaryAmount; | ||
| 43 | - /** | ||
| 44 | - * 岗位名称 | ||
| 45 | - */ | ||
| 46 | - private String postName; | ||
| 47 | - /** | ||
| 48 | - * 岗位类别(如正式员工、外包员工等) | ||
| 49 | - */ | ||
| 50 | - private String postCategory; | ||
| 51 | - /** | ||
| 52 | - * 归属公司 | ||
| 53 | - */ | ||
| 54 | - private String companyName; | ||
| 55 | - /** | ||
| 56 | - * 归属公司ID | ||
| 57 | - */ | ||
| 58 | - private String companyId; | ||
| 59 | - /** | ||
| 60 | - * 部门id | ||
| 61 | - */ | ||
| 62 | - private Long deptId; | ||
| 63 | - /** | ||
| 64 | - * 备注 | ||
| 65 | - */ | ||
| 66 | - private String remark; | ||
| 67 | - | ||
| 68 | - | ||
| 69 | -} | ||
| 70 | \ No newline at end of file | 1 | \ No newline at end of file |
| 2 | +package com.zteits.urbanops.module.garden.dal.dataobject.personalcost; | ||
| 3 | + | ||
| 4 | +import com.baomidou.mybatisplus.annotation.KeySequence; | ||
| 5 | +import com.baomidou.mybatisplus.annotation.TableField; | ||
| 6 | +import com.baomidou.mybatisplus.annotation.TableId; | ||
| 7 | +import com.baomidou.mybatisplus.annotation.TableName; | ||
| 8 | +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | ||
| 9 | +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; | ||
| 10 | +import lombok.*; | ||
| 11 | + | ||
| 12 | +import java.math.BigDecimal; | ||
| 13 | +import java.util.List; | ||
| 14 | + | ||
| 15 | +/** | ||
| 16 | + * 人员费用录入 - 个人费用 DO | ||
| 17 | + * | ||
| 18 | + * @author 超级管理员 | ||
| 19 | + */ | ||
| 20 | +@TableName(value = "garden_personal_cost", autoResultMap = true) | ||
| 21 | +@KeySequence("garden_personal_cost_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | ||
| 22 | +@Data | ||
| 23 | +@EqualsAndHashCode(callSuper = true) | ||
| 24 | +@ToString(callSuper = true) | ||
| 25 | +@Builder | ||
| 26 | +@NoArgsConstructor | ||
| 27 | +@AllArgsConstructor | ||
| 28 | +public class PersonalCostDO extends BaseDO { | ||
| 29 | + | ||
| 30 | + /** | ||
| 31 | + * 记录ID,自增主键 | ||
| 32 | + */ | ||
| 33 | + @TableId | ||
| 34 | + private Long id; | ||
| 35 | + /** | ||
| 36 | + * 工资年月(如202506) | ||
| 37 | + */ | ||
| 38 | + private String salaryMonth; | ||
| 39 | + /** | ||
| 40 | + * 姓名 | ||
| 41 | + */ | ||
| 42 | + private String name; | ||
| 43 | + /** | ||
| 44 | + * 工资金额 | ||
| 45 | + */ | ||
| 46 | + private BigDecimal salaryAmount; | ||
| 47 | + /** | ||
| 48 | + * 岗位名称 | ||
| 49 | + */ | ||
| 50 | + private String postName; | ||
| 51 | + /** | ||
| 52 | + * 岗位类别(如正式员工、外包员工等) | ||
| 53 | + */ | ||
| 54 | + private String postCategory; | ||
| 55 | + /** | ||
| 56 | + * 归属公司 | ||
| 57 | + */ | ||
| 58 | + private String companyName; | ||
| 59 | + /** | ||
| 60 | + * 归属公司ID | ||
| 61 | + */ | ||
| 62 | + private String companyId; | ||
| 63 | + /** | ||
| 64 | + * 部门id | ||
| 65 | + */ | ||
| 66 | + @TableField(typeHandler = JacksonTypeHandler.class) | ||
| 67 | + private List<String> deptId; | ||
| 68 | + /** | ||
| 69 | + * 备注 | ||
| 70 | + */ | ||
| 71 | + private String remark; | ||
| 72 | + | ||
| 73 | + | ||
| 74 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/rentalmechanicalcost/RentalMechanicalCostDO.java
| 1 | package com.zteits.urbanops.module.garden.dal.dataobject.rentalmechanicalcost; | 1 | package com.zteits.urbanops.module.garden.dal.dataobject.rentalmechanicalcost; |
| 2 | 2 | ||
| 3 | +import com.baomidou.mybatisplus.annotation.KeySequence; | ||
| 4 | +import com.baomidou.mybatisplus.annotation.TableField; | ||
| 5 | +import com.baomidou.mybatisplus.annotation.TableId; | ||
| 6 | +import com.baomidou.mybatisplus.annotation.TableName; | ||
| 7 | +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | ||
| 8 | +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; | ||
| 9 | +import com.zteits.urbanops.module.garden.controller.admin.rentalmechanicalcost.vo.TeamBizdomainRelVo; | ||
| 3 | import lombok.*; | 10 | import lombok.*; |
| 4 | 11 | ||
| 5 | -import java.time.LocalDate; | ||
| 6 | -import java.util.*; | ||
| 7 | import java.math.BigDecimal; | 12 | import java.math.BigDecimal; |
| 8 | -import java.time.LocalDateTime; | ||
| 9 | -import java.time.LocalDateTime; | ||
| 10 | -import com.baomidou.mybatisplus.annotation.*; | ||
| 11 | -import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; | 13 | +import java.time.LocalDate; |
| 14 | +import java.util.List; | ||
| 12 | 15 | ||
| 13 | /** | 16 | /** |
| 14 | * 租赁机械费用录入 DO | 17 | * 租赁机械费用录入 DO |
| 15 | * | 18 | * |
| 16 | * @author 超级管理员 | 19 | * @author 超级管理员 |
| 17 | */ | 20 | */ |
| 18 | -@TableName("garden_rental_mechanical_cost") | 21 | +@TableName(value = "garden_rental_mechanical_cost", autoResultMap = true) |
| 19 | @KeySequence("garden_rental_mechanical_cost_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | 22 | @KeySequence("garden_rental_mechanical_cost_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 |
| 20 | @Data | 23 | @Data |
| 21 | @EqualsAndHashCode(callSuper = true) | 24 | @EqualsAndHashCode(callSuper = true) |
| @@ -85,7 +88,8 @@ public class RentalMechanicalCostDO extends BaseDO { | @@ -85,7 +88,8 @@ public class RentalMechanicalCostDO extends BaseDO { | ||
| 85 | /** | 88 | /** |
| 86 | * 班组ID数组(多选) | 89 | * 班组ID数组(多选) |
| 87 | */ | 90 | */ |
| 88 | - private String teamIds; | 91 | + @TableField(typeHandler = JacksonTypeHandler.class) |
| 92 | + private List<TeamBizdomainRelVo> teamIds; | ||
| 89 | /** | 93 | /** |
| 90 | * 道路ID数组(多选) | 94 | * 道路ID数组(多选) |
| 91 | */ | 95 | */ |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/wasterecord/WasteRecordDO.java
| 1 | package com.zteits.urbanops.module.garden.dal.dataobject.wasterecord; | 1 | package com.zteits.urbanops.module.garden.dal.dataobject.wasterecord; |
| 2 | 2 | ||
| 3 | +import com.baomidou.mybatisplus.annotation.KeySequence; | ||
| 4 | +import com.baomidou.mybatisplus.annotation.TableField; | ||
| 5 | +import com.baomidou.mybatisplus.annotation.TableId; | ||
| 6 | +import com.baomidou.mybatisplus.annotation.TableName; | ||
| 7 | +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | ||
| 8 | +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; | ||
| 3 | import lombok.*; | 9 | import lombok.*; |
| 4 | 10 | ||
| 5 | -import java.time.LocalDate; | ||
| 6 | -import java.util.*; | ||
| 7 | -import java.math.BigDecimal; | ||
| 8 | import java.math.BigDecimal; | 11 | import java.math.BigDecimal; |
| 9 | -import java.math.BigDecimal; | ||
| 10 | -import java.time.LocalDateTime; | ||
| 11 | -import java.time.LocalDateTime; | ||
| 12 | -import com.baomidou.mybatisplus.annotation.*; | ||
| 13 | -import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; | 12 | +import java.time.LocalDate; |
| 13 | +import java.util.List; | ||
| 14 | 14 | ||
| 15 | /** | 15 | /** |
| 16 | * 园林废弃物录入 DO | 16 | * 园林废弃物录入 DO |
| @@ -71,7 +71,8 @@ public class WasteRecordDO extends BaseDO { | @@ -71,7 +71,8 @@ public class WasteRecordDO extends BaseDO { | ||
| 71 | /** | 71 | /** |
| 72 | * 部门id | 72 | * 部门id |
| 73 | */ | 73 | */ |
| 74 | - private Long deptId; | 74 | + @TableField(typeHandler = JacksonTypeHandler.class) |
| 75 | + private List<String> deptId; | ||
| 75 | /** | 76 | /** |
| 76 | * 状态(0正常 1停用) | 77 | * 状态(0正常 1停用) |
| 77 | */ | 78 | */ |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CostFeeConstants.java
| @@ -19,4 +19,8 @@ public class CostFeeConstants { | @@ -19,4 +19,8 @@ public class CostFeeConstants { | ||
| 19 | public static final String COSTFEE_MECHANICAL = "costFee_mechanical"; | 19 | public static final String COSTFEE_MECHANICAL = "costFee_mechanical"; |
| 20 | 20 | ||
| 21 | public static final String COSTFEE_RENTALMECHANICAL = "costFee_rentalmechanical"; | 21 | public static final String COSTFEE_RENTALMECHANICAL = "costFee_rentalmechanical"; |
| 22 | + | ||
| 23 | + | ||
| 24 | + public static final String MECH_TYPE = "车类"; | ||
| 25 | + | ||
| 22 | } | 26 | } |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java
| @@ -27,6 +27,8 @@ public interface ErrorCodeConstants { | @@ -27,6 +27,8 @@ public interface ErrorCodeConstants { | ||
| 27 | 27 | ||
| 28 | ErrorCode COST_FEE_NOT_EXISTS = new ErrorCode(1-100-003-000, "费用已录入"); | 28 | ErrorCode COST_FEE_NOT_EXISTS = new ErrorCode(1-100-003-000, "费用已录入"); |
| 29 | 29 | ||
| 30 | + ErrorCode COST_FEE_NOT_EXISTS_001 = new ErrorCode(1-100-003-001, "未找到对应的导入类"); | ||
| 31 | + | ||
| 30 | // ========== 部门费用费用 ========== | 32 | // ========== 部门费用费用 ========== |
| 31 | ErrorCode DEPARTMENT_COST_NOT_EXISTS_01 = new ErrorCode(1-100-003-001, "部门费用为空"); | 33 | ErrorCode DEPARTMENT_COST_NOT_EXISTS_01 = new ErrorCode(1-100-003-001, "部门费用为空"); |
| 32 | 34 |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.garden.enums; | ||
| 2 | + | ||
| 3 | +import com.zteits.urbanops.module.garden.controller.admin.costfee.vo.*; | ||
| 4 | +import lombok.AllArgsConstructor; | ||
| 5 | +import lombok.Getter; | ||
| 6 | + | ||
| 7 | +import java.util.HashMap; | ||
| 8 | +import java.util.Map; | ||
| 9 | + | ||
| 10 | +/** | ||
| 11 | + * Excel导入模板枚举 | ||
| 12 | + * 存储模板编码、名称、起始行索引及对应的数据导入类 | ||
| 13 | + */ | ||
| 14 | +@Getter | ||
| 15 | +@AllArgsConstructor | ||
| 16 | +public enum TemplateEnum { | ||
| 17 | + | ||
| 18 | + // 模板枚举值:编码、名称、起始行索引、导入数据类,是否需要预览 | ||
| 19 | + COSTFEE_WATER( | ||
| 20 | + "costFree_water", | ||
| 21 | + "水表费用导入模板.xlsx", | ||
| 22 | + 2, | ||
| 23 | + WaterFeeImport.class, | ||
| 24 | + true | ||
| 25 | + ), | ||
| 26 | + COSTFEE_PERSONAL( // 修正原枚举名拼写错误(PRESONAL → PERSONAL) | ||
| 27 | + "costFree_presonal", | ||
| 28 | + "人员费用导入模板.xlsx", | ||
| 29 | + 2, | ||
| 30 | + PersonalCostImport.class, | ||
| 31 | + true // 新增默认值 | ||
| 32 | + ); | ||
| 33 | +// COSTFEE_DEPARTMENT( | ||
| 34 | +// "costFee_department", | ||
| 35 | +// "综合费用导入模板.xlsx", | ||
| 36 | +// 1, | ||
| 37 | +// DepartmentCostImport.class, | ||
| 38 | +// true // 新增默认值 | ||
| 39 | +// ), | ||
| 40 | +// COSTFEE_GARDENWASTE( | ||
| 41 | +// "costFee_gardenWaste", | ||
| 42 | +// "园林废弃物费用导入模板.xlsx", | ||
| 43 | +// 1, | ||
| 44 | +// GardenWasteRecordImport.class, | ||
| 45 | +// true // 新增默认值 | ||
| 46 | +// ), | ||
| 47 | +// COSTFEE_MECHANICAL( | ||
| 48 | +// "costFee_mechanical", | ||
| 49 | +// "自有机械费用导入模板.xlsx", | ||
| 50 | +// 1, | ||
| 51 | +// MechanicalCostImport.class, | ||
| 52 | +// true // 新增默认值 | ||
| 53 | +// ), | ||
| 54 | +// COSTFEE_RENTALMECHANICAL( | ||
| 55 | +// "costFee_rentalmechanical", | ||
| 56 | +// "租赁机械费用导入模板.xlsx", | ||
| 57 | +// 1, | ||
| 58 | +// RentalMechanicalCostImport.class, | ||
| 59 | +// true // 新增默认值 | ||
| 60 | +// ); | ||
| 61 | + | ||
| 62 | + // 模板编码(前端传递的标识) | ||
| 63 | + private final String code; | ||
| 64 | + // 模板名称(用于下载时的文件名) | ||
| 65 | + private final String name; | ||
| 66 | + // 数据起始行索引(Excel中从第几行开始读取数据) | ||
| 67 | + private final int startIndex; | ||
| 68 | + // 导入数据对应的实体类(用于反射解析Excel) | ||
| 69 | + private final Class<?> importClass; | ||
| 70 | + // 是否需要预览功能 | ||
| 71 | + private final boolean needPreview; | ||
| 72 | + | ||
| 73 | + // 缓存:code → 枚举映射(优化查询性能) | ||
| 74 | + private static final Map<String, TemplateEnum> CODE_MAP = new HashMap<>(); | ||
| 75 | + | ||
| 76 | + // 静态块初始化缓存 | ||
| 77 | + static { | ||
| 78 | + for (TemplateEnum template : values()) { | ||
| 79 | + CODE_MAP.put(template.code, template); | ||
| 80 | + } | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + /** | ||
| 84 | + * 根据编码获取枚举(优化查询性能) | ||
| 85 | + */ | ||
| 86 | + public static TemplateEnum getByCode(String code) { | ||
| 87 | + // 空值校验 | ||
| 88 | + if (code == null || code.trim().isEmpty()) { | ||
| 89 | + throw new RuntimeException("模板编码不能为空"); | ||
| 90 | + } | ||
| 91 | + // 从缓存获取,避免循环遍历 | ||
| 92 | + TemplateEnum template = CODE_MAP.get(code); | ||
| 93 | + if (template == null) { | ||
| 94 | + throw new RuntimeException("无效的模板编码:" + code); | ||
| 95 | + } | ||
| 96 | + return template; | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + /** | ||
| 100 | + * 根据编码获取模板名称(简化调用) | ||
| 101 | + */ | ||
| 102 | + public static String getNameByCode(String code) { | ||
| 103 | + return getByCode(code).name; | ||
| 104 | + } | ||
| 105 | + | ||
| 106 | + /** | ||
| 107 | + * 根据编码获取导入类(用于Controller层反射解析) | ||
| 108 | + */ | ||
| 109 | + public static Class<?> getImportClassByCode(String code) { | ||
| 110 | + return getByCode(code).importClass; | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + /** | ||
| 114 | + * 根据编码获取是否需要预览 | ||
| 115 | + */ | ||
| 116 | + public static boolean isPreviewRequired(String code) { | ||
| 117 | + return getByCode(code).needPreview; | ||
| 118 | + } | ||
| 119 | + | ||
| 120 | + /** | ||
| 121 | + * 检查编码是否存在(避免直接抛出异常的场景) | ||
| 122 | + */ | ||
| 123 | + public static boolean containsCode(String code) { | ||
| 124 | + return code != null && CODE_MAP.containsKey(code); | ||
| 125 | + } | ||
| 126 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeService.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.garden.service.costfee; | ||
| 2 | + | ||
| 3 | +import com.fasterxml.jackson.core.JsonProcessingException; | ||
| 4 | +import com.zteits.urbanops.module.garden.controller.admin.costfee.CostFeeController; | ||
| 5 | +import com.zteits.urbanops.module.garden.enums.TemplateEnum; | ||
| 6 | + | ||
| 7 | +import java.io.IOException; | ||
| 8 | +import java.util.List; | ||
| 9 | +import java.util.Map; | ||
| 10 | + | ||
| 11 | +/** | ||
| 12 | + * @Classname ICostFeeService | ||
| 13 | + * @Description 模板导入公共接口 | ||
| 14 | + * @Date 2025/7/20 15:10 | ||
| 15 | + * @Created by wangqian | ||
| 16 | + */ | ||
| 17 | +public interface CostFeeService { | ||
| 18 | + | ||
| 19 | + /** | ||
| 20 | + * @Author wangqian | ||
| 21 | + * @Description 导入数据保存redis | ||
| 22 | + * @Date 2025/7/20 15:36 | ||
| 23 | + * @Param dataList | ||
| 24 | + * @param templateName | ||
| 25 | + * @Return java.lang.String | ||
| 26 | + */ | ||
| 27 | + public String saveDataToRedis(List<?> dataList, String templateName); | ||
| 28 | + | ||
| 29 | + /** | ||
| 30 | + * @Author wangqian | ||
| 31 | + * @Description 导入数据保存到数据库 | ||
| 32 | + * @Date 2025/7/20 15:36 | ||
| 33 | + * @Param batchId | ||
| 34 | + * @param templateName | ||
| 35 | + * @param operator | ||
| 36 | + * @Return int | ||
| 37 | + */ | ||
| 38 | + public int submitImport(String batchId, String templateName, String operator); | ||
| 39 | + | ||
| 40 | + /** | ||
| 41 | + * @Author wangqian | ||
| 42 | + * @Description 预览分页查询 | ||
| 43 | + * @Date 2025/7/20 15:36 | ||
| 44 | + * @Param batchId | ||
| 45 | + * @param templateName | ||
| 46 | + * @param page | ||
| 47 | + * @param size | ||
| 48 | + * @param clazz | ||
| 49 | + * @Return com.servicemanager.project.costfee.controller.CostFeeController.PageResult<T> | ||
| 50 | + */ | ||
| 51 | + public <T> CostFeeController.PageResult<T> getPagedDataFromRedis(String batchId, String templateName, | ||
| 52 | + int page, int size, Class<T> clazz) throws IOException; | ||
| 53 | + | ||
| 54 | + /** | ||
| 55 | + * @Author wangqian | ||
| 56 | + * @Description 导入内容校验 | ||
| 57 | + * @Date 2025/11/24 8:40 | ||
| 58 | + * @Param dataList | ||
| 59 | + * @param template | ||
| 60 | + * @Return void | ||
| 61 | + */ | ||
| 62 | + public void validateImportData(List dataList, TemplateEnum template); | ||
| 63 | + | ||
| 64 | +} |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java
0 → 100644
| 1 | +package com.zteits.urbanops.module.garden.service.costfee; | ||
| 2 | + | ||
| 3 | +import com.fasterxml.jackson.core.JsonProcessingException; | ||
| 4 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 5 | +import com.zteits.urbanops.framework.security.core.LoginUser; | ||
| 6 | +import com.zteits.urbanops.module.garden.controller.admin.costfee.CostFeeController; | ||
| 7 | +import com.zteits.urbanops.module.garden.controller.admin.costfee.vo.*; | ||
| 8 | +import com.zteits.urbanops.module.garden.enums.TemplateEnum; | ||
| 9 | +import jakarta.annotation.Resource; | ||
| 10 | +import jakarta.validation.ConstraintViolation; | ||
| 11 | +import jakarta.validation.ConstraintViolationException; | ||
| 12 | +import jakarta.validation.Validator; | ||
| 13 | +import lombok.extern.slf4j.Slf4j; | ||
| 14 | +import org.apache.commons.lang3.StringUtils; | ||
| 15 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 16 | +import org.springframework.data.redis.core.BoundHashOperations; | ||
| 17 | +import org.springframework.data.redis.core.RedisTemplate; | ||
| 18 | +import org.springframework.stereotype.Service; | ||
| 19 | +import org.springframework.transaction.annotation.Transactional; | ||
| 20 | +import org.springframework.util.CollectionUtils; | ||
| 21 | + | ||
| 22 | +import java.io.IOException; | ||
| 23 | +import java.util.*; | ||
| 24 | +import java.util.concurrent.TimeUnit; | ||
| 25 | +import java.util.stream.Collectors; | ||
| 26 | +import java.util.stream.IntStream; | ||
| 27 | + | ||
| 28 | +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 29 | +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; | ||
| 30 | +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getLoginUserDeptId; | ||
| 31 | +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.COST_FEE_NOT_EXISTS_001; | ||
| 32 | + | ||
| 33 | +/** | ||
| 34 | + * @Classname CostFeeService | ||
| 35 | + * @Description 模板导入公共实现 | ||
| 36 | + * @Date 2025/7/20 15:12 | ||
| 37 | + * @Created by wangqian | ||
| 38 | + */ | ||
| 39 | +@Service | ||
| 40 | +@Slf4j | ||
| 41 | +public class CostFeeServiceImpl implements CostFeeService { | ||
| 42 | + | ||
| 43 | + // Redis相关配置 | ||
| 44 | + private static final String REDIS_KEY_PREFIX = "excel:import:"; | ||
| 45 | + private static final long EXPIRE_TIME = 30; // 预览数据过期时间:30分钟 | ||
| 46 | + private static final TimeUnit EXPIRE_UNIT = TimeUnit.MINUTES; | ||
| 47 | + @Autowired | ||
| 48 | + private RedisTemplate<String, String> redisTemplate; | ||
| 49 | + @Autowired | ||
| 50 | + private ObjectMapper objectMapper; | ||
| 51 | + @Resource | ||
| 52 | + private Validator validator; | ||
| 53 | + | ||
| 54 | + | ||
| 55 | + @Override | ||
| 56 | + /** | ||
| 57 | + * 保存数据到Redis | ||
| 58 | + */ | ||
| 59 | + public String saveDataToRedis(List<?> dataList, String templateName){ | ||
| 60 | + String batchId = UUID.randomUUID().toString().replace("-", ""); | ||
| 61 | + String redisKey = REDIS_KEY_PREFIX + templateName + ":" + batchId; | ||
| 62 | + | ||
| 63 | + // 存储总记录数 | ||
| 64 | + redisTemplate.opsForValue().set( | ||
| 65 | + redisKey + ":total", | ||
| 66 | + String.valueOf(dataList.size()), | ||
| 67 | + EXPIRE_TIME, | ||
| 68 | + EXPIRE_UNIT | ||
| 69 | + ); | ||
| 70 | + | ||
| 71 | + // 使用Hash存储每条数据(key:索引,value:JSON字符串) | ||
| 72 | + BoundHashOperations<String, String, String> hashOps = redisTemplate.boundHashOps(redisKey + ":items"); | ||
| 73 | + try { | ||
| 74 | + for (int i = 0; i < dataList.size(); i++) { | ||
| 75 | + String jsonData = objectMapper.writeValueAsString(dataList.get(i)); | ||
| 76 | + hashOps.put(String.valueOf(i), jsonData); | ||
| 77 | + } | ||
| 78 | + } catch (JsonProcessingException e) { | ||
| 79 | + log.error(e.getMessage()); | ||
| 80 | + } | ||
| 81 | + // 设置Hash过期时间 | ||
| 82 | + hashOps.expire(EXPIRE_TIME, EXPIRE_UNIT); | ||
| 83 | + | ||
| 84 | + log.info("数据保存到Redis成功,批次ID:{},记录数:{}", batchId, dataList.size()); | ||
| 85 | + return batchId; | ||
| 86 | + } | ||
| 87 | + | ||
| 88 | + @Override | ||
| 89 | + @Transactional | ||
| 90 | + public int submitImport(String batchId, String templateName, String operator){ | ||
| 91 | + // 模板类型校验 | ||
| 92 | + TemplateEnum template = TemplateEnum.getByCode(templateName); | ||
| 93 | + Class<?> importClass = template.getImportClass(); | ||
| 94 | + if (importClass == null) { | ||
| 95 | + throw exception(COST_FEE_NOT_EXISTS_001); | ||
| 96 | + } | ||
| 97 | + | ||
| 98 | + // 分页参数设置 | ||
| 99 | + int pageNum = 1; | ||
| 100 | + final int pageSize = 100000; // 每页处理条数,可根据实际情况调整 | ||
| 101 | + int totalImported = 0; // 总导入数量累计 | ||
| 102 | + | ||
| 103 | + try { | ||
| 104 | + while (true) { | ||
| 105 | + // 分页从Redis获取数据 | ||
| 106 | + CostFeeController.PageResult<?> pageResult = getPagedDataFromRedis( | ||
| 107 | + batchId, templateName, pageNum, pageSize, importClass); | ||
| 108 | + List<?> dataList = pageResult.getData(); | ||
| 109 | + | ||
| 110 | + // 如果当前页无数据,说明已处理完毕 | ||
| 111 | + if (dataList == null || dataList.isEmpty()) { | ||
| 112 | + // 首次分页就无数据,抛出异常 | ||
| 113 | + if (pageNum == 1) { | ||
| 114 | + throw new IllegalArgumentException("没有可导入的数据或数据已过期"); | ||
| 115 | + } | ||
| 116 | + break; | ||
| 117 | + } | ||
| 118 | + | ||
| 119 | + // 业务校验(每页单独校验) | ||
| 120 | + //validateBusinessData(dataList, template); | ||
| 121 | + | ||
| 122 | + // 调用业务服务执行本页数据导入 | ||
| 123 | + int currentPageCount = dataList.size(); | ||
| 124 | + //insertData(template, dataList, operator); | ||
| 125 | + totalImported += currentPageCount; | ||
| 126 | + | ||
| 127 | + // 打印分页处理日志(可选) | ||
| 128 | + log.info("批次[{}]第{}页导入完成,本页{}条,累计{}条", | ||
| 129 | + batchId, pageNum, currentPageCount, totalImported); | ||
| 130 | + | ||
| 131 | + // 准备下一页 | ||
| 132 | + pageNum++; | ||
| 133 | + | ||
| 134 | + // 如果当前页数据小于页大小,说明已到最后一页 | ||
| 135 | + if (dataList.size() < pageSize) { | ||
| 136 | + break; | ||
| 137 | + } | ||
| 138 | + } | ||
| 139 | + } catch (IOException e) { | ||
| 140 | + log.error(e.getMessage()); | ||
| 141 | + } finally { | ||
| 142 | + // 无论导入成功与否,都清理Redis临时数据 | ||
| 143 | + deleteRedisTempData(batchId, templateName); | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + return totalImported; | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + /** | ||
| 150 | + * 从Redis获取分页数据 | ||
| 151 | + */ | ||
| 152 | + @Override | ||
| 153 | + public <T > CostFeeController.PageResult < T > getPagedDataFromRedis(String batchId, String templateName, | ||
| 154 | + int page, int size, Class<T > clazz) throws IOException { | ||
| 155 | + String redisKey = REDIS_KEY_PREFIX + templateName + ":" + batchId; | ||
| 156 | + | ||
| 157 | + // 获取总记录数 | ||
| 158 | + String totalStr = redisTemplate.opsForValue().get(redisKey + ":total"); | ||
| 159 | + int total = totalStr != null ? Integer.parseInt(totalStr) : 0; | ||
| 160 | + | ||
| 161 | + // 计算分页范围 | ||
| 162 | + int start = (page - 1) * size; | ||
| 163 | + int end = Math.min(start + size - 1, total - 1); | ||
| 164 | + | ||
| 165 | + // 分页查询数据 | ||
| 166 | + List<T> pageData = new ArrayList<>(); | ||
| 167 | + if (start <= end && total > 0) { | ||
| 168 | + BoundHashOperations<String, String, String> hashOps = redisTemplate.boundHashOps(redisKey + ":items"); | ||
| 169 | + | ||
| 170 | + // 批量获取指定范围的索引对应的数据 | ||
| 171 | + List<String> indexes = IntStream.rangeClosed(start, end) | ||
| 172 | + .mapToObj(String::valueOf) | ||
| 173 | + .collect(Collectors.toList()); | ||
| 174 | + List<String> jsonList = hashOps.multiGet(indexes); | ||
| 175 | + | ||
| 176 | + // 反序列化为对象 | ||
| 177 | + for (String json : jsonList) { | ||
| 178 | + if (json != null) { | ||
| 179 | + pageData.add(objectMapper.readValue(json, clazz)); | ||
| 180 | + } | ||
| 181 | + } | ||
| 182 | + } | ||
| 183 | + | ||
| 184 | + return new CostFeeController.PageResult<>(page, size, total, pageData); | ||
| 185 | + } | ||
| 186 | + | ||
| 187 | + | ||
| 188 | + /** | ||
| 189 | + * 从Redis获取全部数据 | ||
| 190 | + */ | ||
| 191 | + private <T > List < T > getAllDataFromRedis(String batchId, String templateName, Class < T > clazz) throws | ||
| 192 | + IOException { | ||
| 193 | + String redisKey = REDIS_KEY_PREFIX + templateName + ":" + batchId; | ||
| 194 | + BoundHashOperations<String, String, String> hashOps = redisTemplate.boundHashOps(redisKey + ":items"); | ||
| 195 | + | ||
| 196 | + // 获取所有数据的JSON字符串 | ||
| 197 | + List<String> jsonList = hashOps.values(); | ||
| 198 | + List<T> dataList = new ArrayList<>(jsonList.size()); | ||
| 199 | + | ||
| 200 | + // 反序列化为对象 | ||
| 201 | + for (String json : jsonList) { | ||
| 202 | + if (json != null) { | ||
| 203 | + dataList.add(objectMapper.readValue(json, clazz)); | ||
| 204 | + } | ||
| 205 | + } | ||
| 206 | + | ||
| 207 | + return dataList; | ||
| 208 | + } | ||
| 209 | + | ||
| 210 | + | ||
| 211 | + /** | ||
| 212 | + * 删除Redis临时数据 | ||
| 213 | + */ | ||
| 214 | + private void deleteRedisTempData (String batchId, String templateName){ | ||
| 215 | + String redisKey = REDIS_KEY_PREFIX + templateName + ":" + batchId; | ||
| 216 | + redisTemplate.delete(redisKey + ":total"); | ||
| 217 | + redisTemplate.delete(redisKey + ":items"); | ||
| 218 | + log.info("Redis临时数据已删除,批次ID:{}", batchId); | ||
| 219 | + } | ||
| 220 | + /** | ||
| 221 | + * @Author wangqian | ||
| 222 | + * @Description 导入内容校验 | ||
| 223 | + * @Date 2025/11/24 8:40 | ||
| 224 | + * @Param dataList | ||
| 225 | + * @param template | ||
| 226 | + * @Return void | ||
| 227 | + */ | ||
| 228 | + public void validateImportData(List dataList, TemplateEnum template) { | ||
| 229 | + if (CollectionUtils.isEmpty(dataList)) { | ||
| 230 | + return; // 空列表无需校验 | ||
| 231 | + } | ||
| 232 | + LoginUser user = getLoginUser(); | ||
| 233 | + Long deptId = getLoginUserDeptId(); | ||
| 234 | + // 模板类型校验 | ||
| 235 | + Class<?> importClass = template.getImportClass(); // 从枚举获取导入类,避免switch | ||
| 236 | + // 根据不同模板类型执行不同的处理逻辑 | ||
| 237 | + if (WaterFeeImport.class.isAssignableFrom(importClass)) { | ||
| 238 | + | ||
| 239 | + List<WaterFeeImport> importList = (List<WaterFeeImport>) dataList; | ||
| 240 | + // 2. 遍历,逐个创建 | ||
| 241 | + for (int i = 0; i < importList.size(); i++) { | ||
| 242 | + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) | ||
| 243 | + WaterFeeImport importBean = importList.get(i); | ||
| 244 | + | ||
| 245 | + try { | ||
| 246 | + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) | ||
| 247 | + Set<ConstraintViolation<WaterFeeImport>> violations = validator.validate(importBean); | ||
| 248 | + if (!violations.isEmpty()) { | ||
| 249 | + // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) | ||
| 250 | + StringBuilder errorMsg = new StringBuilder(); | ||
| 251 | + for (ConstraintViolation<WaterFeeImport> violation : violations) { | ||
| 252 | + errorMsg.append(violation.getMessage()).append(";"); | ||
| 253 | + } | ||
| 254 | + // 抛出包含行号和所有错误的异常 | ||
| 255 | + throw new ConstraintViolationException(errorMsg.toString().trim(), violations); | ||
| 256 | + } | ||
| 257 | + | ||
| 258 | + | ||
| 259 | + } catch (ConstraintViolationException ex) { | ||
| 260 | + // 5. 包装异常,明确行号 + 真实校验错误( | ||
| 261 | + throw new RuntimeException(String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); | ||
| 262 | + } | ||
| 263 | + } | ||
| 264 | + } | ||
| 265 | + else if (PersonalCostImport.class.isAssignableFrom(importClass)) { | ||
| 266 | + | ||
| 267 | + List<PersonalCostImport> importList = (List<PersonalCostImport>) dataList; | ||
| 268 | + // 2. 遍历,逐个创建 | ||
| 269 | + for (int i = 0; i < importList.size(); i++) { | ||
| 270 | + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) | ||
| 271 | + PersonalCostImport importBean = importList.get(i); | ||
| 272 | + | ||
| 273 | + try { | ||
| 274 | + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) | ||
| 275 | + Set<ConstraintViolation<PersonalCostImport>> violations = validator.validate(importBean); | ||
| 276 | + if (!violations.isEmpty()) { | ||
| 277 | + // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) | ||
| 278 | + StringBuilder errorMsg = new StringBuilder(); | ||
| 279 | + for (ConstraintViolation<PersonalCostImport> violation : violations) { | ||
| 280 | + errorMsg.append(violation.getMessage()).append(";"); | ||
| 281 | + } | ||
| 282 | + // 抛出包含行号和所有错误的异常 | ||
| 283 | + throw new ConstraintViolationException(errorMsg.toString().trim(), violations); | ||
| 284 | + } | ||
| 285 | + | ||
| 286 | + } catch (ConstraintViolationException ex) { | ||
| 287 | + // 5. 包装异常,明确行号 + 真实校验错误( | ||
| 288 | + throw new RuntimeException(String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); | ||
| 289 | + } | ||
| 290 | + } | ||
| 291 | + } | ||
| 292 | + else if (GardenWasteRecordImport.class.isAssignableFrom(importClass)) { | ||
| 293 | + | ||
| 294 | + List<GardenWasteRecordImport> importList = (List<GardenWasteRecordImport>) dataList; | ||
| 295 | + // 2. 遍历,逐个创建 | ||
| 296 | + for (int i = 0; i < importList.size(); i++) { | ||
| 297 | + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) | ||
| 298 | + GardenWasteRecordImport importBean = importList.get(i); | ||
| 299 | + | ||
| 300 | + try { | ||
| 301 | + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) | ||
| 302 | + Set<ConstraintViolation<GardenWasteRecordImport>> violations = validator.validate(importBean); | ||
| 303 | + if (!violations.isEmpty()) { | ||
| 304 | + // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) | ||
| 305 | + StringBuilder errorMsg = new StringBuilder(); | ||
| 306 | + for (ConstraintViolation<GardenWasteRecordImport> violation : violations) { | ||
| 307 | + errorMsg.append(violation.getMessage()).append(";"); | ||
| 308 | + } | ||
| 309 | + // 抛出包含行号和所有错误的异常 | ||
| 310 | + throw new ConstraintViolationException(errorMsg.toString().trim(), violations); | ||
| 311 | + } | ||
| 312 | + | ||
| 313 | + | ||
| 314 | + } catch (ConstraintViolationException ex) { | ||
| 315 | + // 5. 包装异常,明确行号 + 真实校验错误( | ||
| 316 | + throw new RuntimeException(String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); | ||
| 317 | + } | ||
| 318 | + } | ||
| 319 | + } | ||
| 320 | + else if (MechanicalCostImport.class.isAssignableFrom(importClass)) { | ||
| 321 | + | ||
| 322 | + List<MechanicalCostImport> importList = (List<MechanicalCostImport>) dataList; | ||
| 323 | + // 2. 遍历,逐个创建 | ||
| 324 | + for (int i = 0; i < importList.size(); i++) { | ||
| 325 | + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) | ||
| 326 | + MechanicalCostImport importBean = importList.get(i); | ||
| 327 | + | ||
| 328 | + try { | ||
| 329 | + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) | ||
| 330 | + Set<ConstraintViolation<MechanicalCostImport>> violations = validator.validate(importBean); | ||
| 331 | + if (!violations.isEmpty()) { | ||
| 332 | + // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) | ||
| 333 | + StringBuilder errorMsg = new StringBuilder(); | ||
| 334 | + for (ConstraintViolation<MechanicalCostImport> violation : violations) { | ||
| 335 | + errorMsg.append(violation.getMessage()).append(";"); | ||
| 336 | + } | ||
| 337 | + // 抛出包含行号和所有错误的异常 | ||
| 338 | + throw new ConstraintViolationException(errorMsg.toString().trim(), violations); | ||
| 339 | + } | ||
| 340 | + | ||
| 341 | + | ||
| 342 | + } catch (ConstraintViolationException ex) { | ||
| 343 | + // 5. 包装异常,明确行号 + 真实校验错误( | ||
| 344 | + throw new RuntimeException(String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); | ||
| 345 | + } | ||
| 346 | + } | ||
| 347 | + } | ||
| 348 | + else if (RentalMechanicalCostImport.class.isAssignableFrom(importClass)) { | ||
| 349 | + | ||
| 350 | + List<RentalMechanicalCostImport> importList = (List<RentalMechanicalCostImport>) dataList; | ||
| 351 | + // 2. 遍历,逐个创建 | ||
| 352 | + for (int i = 0; i < importList.size(); i++) { | ||
| 353 | + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) | ||
| 354 | + RentalMechanicalCostImport importBean = importList.get(i); | ||
| 355 | + | ||
| 356 | + try { | ||
| 357 | + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) | ||
| 358 | + Set<ConstraintViolation<RentalMechanicalCostImport>> violations = validator.validate(importBean); | ||
| 359 | + if (!violations.isEmpty()) { | ||
| 360 | + // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) | ||
| 361 | + StringBuilder errorMsg = new StringBuilder(); | ||
| 362 | + for (ConstraintViolation<RentalMechanicalCostImport> violation : violations) { | ||
| 363 | + errorMsg.append(violation.getMessage()).append(";"); | ||
| 364 | + } | ||
| 365 | + // 抛出包含行号和所有错误的异常 | ||
| 366 | + throw new ConstraintViolationException(errorMsg.toString().trim(), violations); | ||
| 367 | + } | ||
| 368 | + // 处理可能的空值 | ||
| 369 | + String teamIdsStr = StringUtils.defaultString(importBean.getTeamIds()); | ||
| 370 | + String weightsStr = StringUtils.defaultString(importBean.getWeight()); | ||
| 371 | + | ||
| 372 | + // 统一替换中文逗号并分割 | ||
| 373 | + String[] teamIds = teamIdsStr.replace(",", ",").split(","); | ||
| 374 | + String[] weights = weightsStr.replace(",", ",").split(","); | ||
| 375 | + | ||
| 376 | + // 校验数组长度是否一致 | ||
| 377 | + if (teamIds.length != weights.length) { | ||
| 378 | + throw new IllegalArgumentException(String.format( | ||
| 379 | + "第%d条数据:权重值和所选班组数量不符(班组:%d个,权重:%d个)", | ||
| 380 | + rowNum, teamIds.length, weights.length | ||
| 381 | + )); | ||
| 382 | + } | ||
| 383 | + | ||
| 384 | + //单位校验 | ||
| 385 | + // validatecompany(rowNum, importBean.getCompanyName(), deptId); | ||
| 386 | + //部门名称校验 | ||
| 387 | + //validateTeams(rowNum, depts.get(data.getCompanyName()), data.getTeamIds()); | ||
| 388 | + | ||
| 389 | + | ||
| 390 | + | ||
| 391 | + } catch (ConstraintViolationException ex) { | ||
| 392 | + // 5. 包装异常,明确行号 + 真实校验错误( | ||
| 393 | + throw new RuntimeException(String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); | ||
| 394 | + } | ||
| 395 | + } | ||
| 396 | + } | ||
| 397 | + else if (DepartmentCostImport.class.isAssignableFrom(importClass)) { | ||
| 398 | + | ||
| 399 | + List<DepartmentCostImport> importList = (List<DepartmentCostImport>) dataList; | ||
| 400 | + // 2. 遍历,逐个创建 | ||
| 401 | + for (int i = 0; i < importList.size(); i++) { | ||
| 402 | + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) | ||
| 403 | + DepartmentCostImport importBean = importList.get(i); | ||
| 404 | + | ||
| 405 | + try { | ||
| 406 | + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) | ||
| 407 | + Set<ConstraintViolation<DepartmentCostImport>> violations = validator.validate(importBean); | ||
| 408 | + if (!violations.isEmpty()) { | ||
| 409 | + // 收集所有校验错误信息(比如“用水量不能为空”“格式应为两位小数”) | ||
| 410 | + StringBuilder errorMsg = new StringBuilder(); | ||
| 411 | + for (ConstraintViolation<DepartmentCostImport> violation : violations) { | ||
| 412 | + errorMsg.append(violation.getMessage()).append(";"); | ||
| 413 | + } | ||
| 414 | + // 抛出包含行号和所有错误的异常 | ||
| 415 | + throw new ConstraintViolationException(errorMsg.toString().trim(), violations); | ||
| 416 | + } | ||
| 417 | + | ||
| 418 | + | ||
| 419 | + } catch (ConstraintViolationException ex) { | ||
| 420 | + // 5. 包装异常,明确行号 + 真实校验错误( | ||
| 421 | + throw new RuntimeException(String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); | ||
| 422 | + } | ||
| 423 | + } | ||
| 424 | + } | ||
| 425 | + } | ||
| 426 | + | ||
| 427 | + private void validatecompany(int rowNum, String companyName, Long deptId){ | ||
| 428 | + //根据单位名称获取单位id | ||
| 429 | + Long companyId = null ; | ||
| 430 | + // 校验数组长度是否一致 | ||
| 431 | + if (companyId == null) { | ||
| 432 | + throw new IllegalArgumentException(String.format( | ||
| 433 | + "第%d条数据:单位名称不正确(%s)", | ||
| 434 | + rowNum, companyName | ||
| 435 | + )); | ||
| 436 | + } | ||
| 437 | + // 校验导入单位 | ||
| 438 | + if (deptId != 100 && !companyId.equals(deptId)) { | ||
| 439 | + throw new IllegalArgumentException(String.format( | ||
| 440 | + "第%d条数据:导入单位%s与当前操作员单位不一致", | ||
| 441 | + rowNum, companyName | ||
| 442 | + )); | ||
| 443 | + } | ||
| 444 | + } | ||
| 445 | + private void validateTeams(int rowNum, List<String> dept, String teamIds) { | ||
| 446 | + String[] teamNames = teamIds.split(","); | ||
| 447 | + Set<String> checkedTeams = new HashSet<>(); // 用于存储已校验的团队名称,检测重复 | ||
| 448 | + | ||
| 449 | + for (String teamName : teamNames) { | ||
| 450 | + String trimmedTeamName = teamName.trim(); // 处理前后空格 | ||
| 451 | + | ||
| 452 | + // 重复校验:如果Set中已存在该团队名称,说明重复 | ||
| 453 | + if (checkedTeams.contains(trimmedTeamName)) { | ||
| 454 | + throw new IllegalArgumentException(String.format( | ||
| 455 | + "第%d条数据:%s名称重复", | ||
| 456 | + rowNum, teamName | ||
| 457 | + )); | ||
| 458 | + } | ||
| 459 | + | ||
| 460 | + // 存在性校验:检查团队是否在dept中存在 | ||
| 461 | + if (!dept.contains(trimmedTeamName)) { | ||
| 462 | + throw new IllegalArgumentException(String.format( | ||
| 463 | + "第%d条数据:%s名称不正确", | ||
| 464 | + rowNum, teamName | ||
| 465 | + )); | ||
| 466 | + } | ||
| 467 | + | ||
| 468 | + // 将校验通过的团队名称加入Set,用于后续重复判断 | ||
| 469 | + checkedTeams.add(trimmedTeamName); | ||
| 470 | + } | ||
| 471 | + } | ||
| 472 | +} |
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; | @@ -5,6 +5,7 @@ import com.zteits.urbanops.framework.common.util.object.BeanUtils; | ||
| 5 | import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.MechanicalCostPageReqVO; | 5 | import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.MechanicalCostPageReqVO; |
| 6 | import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.MechanicalCostSaveReqVO; | 6 | import com.zteits.urbanops.module.garden.controller.admin.mechanicalcost.vo.MechanicalCostSaveReqVO; |
| 7 | import com.zteits.urbanops.module.garden.dal.dataobject.mechanicalcost.MechanicalCostDO; | 7 | import com.zteits.urbanops.module.garden.dal.dataobject.mechanicalcost.MechanicalCostDO; |
| 8 | +import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; | ||
| 8 | import com.zteits.urbanops.module.garden.dal.mysql.mechanicalcost.MechanicalCostMapper; | 9 | import com.zteits.urbanops.module.garden.dal.mysql.mechanicalcost.MechanicalCostMapper; |
| 9 | import com.zteits.urbanops.module.garden.enums.CostFeeConstants; | 10 | import com.zteits.urbanops.module.garden.enums.CostFeeConstants; |
| 10 | import com.zteits.urbanops.module.garden.service.mechanicaldepreciation.MechanicalDepreciationService; | 11 | import com.zteits.urbanops.module.garden.service.mechanicaldepreciation.MechanicalDepreciationService; |
| @@ -16,6 +17,7 @@ import org.springframework.transaction.annotation.Transactional; | @@ -16,6 +17,7 @@ import org.springframework.transaction.annotation.Transactional; | ||
| 16 | import org.springframework.validation.annotation.Validated; | 17 | import org.springframework.validation.annotation.Validated; |
| 17 | 18 | ||
| 18 | import java.util.List; | 19 | import java.util.List; |
| 20 | +import java.util.stream.Collectors; | ||
| 19 | 21 | ||
| 20 | import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; | 22 | import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 21 | import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.MECHANICAL_COST_NOT_EXISTS; | 23 | import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.MECHANICAL_COST_NOT_EXISTS; |
| @@ -33,19 +35,19 @@ public class MechanicalCostServiceImpl implements MechanicalCostService { | @@ -33,19 +35,19 @@ public class MechanicalCostServiceImpl implements MechanicalCostService { | ||
| 33 | @Resource | 35 | @Resource |
| 34 | private MechanicalCostMapper mechanicalCostMapper; | 36 | private MechanicalCostMapper mechanicalCostMapper; |
| 35 | @Resource | 37 | @Resource |
| 36 | - private TeamBizdomainRelService teamBizdomainRelService; | ||
| 37 | - @Resource | ||
| 38 | private MechanicalDepreciationService mechanicalDepreciationService; | 38 | private MechanicalDepreciationService mechanicalDepreciationService; |
| 39 | 39 | ||
| 40 | @Override | 40 | @Override |
| 41 | public Long createMechanicalCost(MechanicalCostSaveReqVO createReqVO) { | 41 | public Long createMechanicalCost(MechanicalCostSaveReqVO createReqVO) { |
| 42 | // 插入 | 42 | // 插入 |
| 43 | MechanicalCostDO mechanicalCost = BeanUtils.toBean(createReqVO, MechanicalCostDO.class); | 43 | MechanicalCostDO mechanicalCost = BeanUtils.toBean(createReqVO, MechanicalCostDO.class); |
| 44 | - mechanicalCostMapper.insert(mechanicalCost); | ||
| 45 | - //add by wq 保存班组信息关联表 | ||
| 46 | - teamBizdomainRelService.saveTeamBizdomainRel(createReqVO.getTeamIds(), mechanicalCost.getId(), mechanicalCost.getCompanyId(), mechanicalCost.getCompanyName(), CostFeeConstants.COSTFEE_MECHANICAL); | ||
| 47 | - //add by wq 保存班组信息关联表 | ||
| 48 | 44 | ||
| 45 | + List<String> deptIds = createReqVO.getTeamIds().stream() | ||
| 46 | + .map(TeamBizdomainRelDO::getTeamId) | ||
| 47 | + .collect(Collectors.toList()); | ||
| 48 | + mechanicalCost.setDeptId(deptIds); | ||
| 49 | + | ||
| 50 | + mechanicalCostMapper.insert(mechanicalCost); | ||
| 49 | // 返回 | 51 | // 返回 |
| 50 | return mechanicalCost.getId(); | 52 | return mechanicalCost.getId(); |
| 51 | } | 53 | } |
| @@ -56,12 +58,13 @@ public class MechanicalCostServiceImpl implements MechanicalCostService { | @@ -56,12 +58,13 @@ public class MechanicalCostServiceImpl implements MechanicalCostService { | ||
| 56 | validateMechanicalCostExists(updateReqVO.getId()); | 58 | validateMechanicalCostExists(updateReqVO.getId()); |
| 57 | // 更新 | 59 | // 更新 |
| 58 | MechanicalCostDO updateObj = BeanUtils.toBean(updateReqVO, MechanicalCostDO.class); | 60 | MechanicalCostDO updateObj = BeanUtils.toBean(updateReqVO, MechanicalCostDO.class); |
| 59 | - mechanicalCostMapper.updateById(updateObj); | ||
| 60 | 61 | ||
| 61 | - //add by wq 保存班组信息关联表 | ||
| 62 | - teamBizdomainRelService.deleteTeamBizdomainRel(updateObj.getId(), CostFeeConstants.COSTFEE_MECHANICAL); | ||
| 63 | - teamBizdomainRelService.saveTeamBizdomainRel(updateReqVO.getTeamIds(), updateObj.getId(), updateObj.getCompanyId(), updateObj.getCompanyName(), CostFeeConstants.COSTFEE_MECHANICAL); | ||
| 64 | - //add by wq 保存班组信息关联表 | 62 | + List<String> deptIds = updateReqVO.getTeamIds().stream() |
| 63 | + .map(TeamBizdomainRelDO::getTeamId) | ||
| 64 | + .collect(Collectors.toList()); | ||
| 65 | + updateObj.setDeptId(deptIds); | ||
| 66 | + | ||
| 67 | + mechanicalCostMapper.updateById(updateObj); | ||
| 65 | } | 68 | } |
| 66 | 69 | ||
| 67 | @Override | 70 | @Override |
| @@ -73,7 +76,6 @@ public class MechanicalCostServiceImpl implements MechanicalCostService { | @@ -73,7 +76,6 @@ public class MechanicalCostServiceImpl implements MechanicalCostService { | ||
| 73 | mechanicalCostMapper.deleteById(id); | 76 | mechanicalCostMapper.deleteById(id); |
| 74 | 77 | ||
| 75 | //add by wq 删除班组信息关联表 | 78 | //add by wq 删除班组信息关联表 |
| 76 | - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_MECHANICAL); | ||
| 77 | // //删除折旧 | 79 | // //删除折旧 |
| 78 | mechanicalDepreciationService.deleteMechanicalDepreciationByMechId(id); | 80 | mechanicalDepreciationService.deleteMechanicalDepreciationByMechId(id); |
| 79 | //add by wq 删除班组信息关联表 | 81 | //add by wq 删除班组信息关联表 |
| @@ -86,8 +88,6 @@ public class MechanicalCostServiceImpl implements MechanicalCostService { | @@ -86,8 +88,6 @@ public class MechanicalCostServiceImpl implements MechanicalCostService { | ||
| 86 | //add by wq 删除班组信息关联表 | 88 | //add by wq 删除班组信息关联表 |
| 87 | if(CollectionUtils.isNotEmpty(ids)) { | 89 | if(CollectionUtils.isNotEmpty(ids)) { |
| 88 | for (Long id : ids) { | 90 | for (Long id : ids) { |
| 89 | - //批量删除 | ||
| 90 | - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_MECHANICAL); | ||
| 91 | //删除折旧 | 91 | //删除折旧 |
| 92 | mechanicalDepreciationService.deleteMechanicalDepreciationByMechId(id); | 92 | mechanicalDepreciationService.deleteMechanicalDepreciationByMechId(id); |
| 93 | } | 93 | } |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/personalcost/PersonalCostServiceImpl.java
| 1 | package com.zteits.urbanops.module.garden.service.personalcost; | 1 | package com.zteits.urbanops.module.garden.service.personalcost; |
| 2 | 2 | ||
| 3 | -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||
| 4 | -import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||
| 5 | import com.zteits.urbanops.framework.common.pojo.PageResult; | 3 | import com.zteits.urbanops.framework.common.pojo.PageResult; |
| 6 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; | 4 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; |
| 7 | import com.zteits.urbanops.module.garden.controller.admin.personalcost.vo.PersonalCostPageReqVO; | 5 | import com.zteits.urbanops.module.garden.controller.admin.personalcost.vo.PersonalCostPageReqVO; |
| 8 | import com.zteits.urbanops.module.garden.controller.admin.personalcost.vo.PersonalCostSaveReqVO; | 6 | import com.zteits.urbanops.module.garden.controller.admin.personalcost.vo.PersonalCostSaveReqVO; |
| 9 | -import com.zteits.urbanops.module.garden.dal.dataobject.departmentcost.DepartmentCostDO; | ||
| 10 | import com.zteits.urbanops.module.garden.dal.dataobject.personalcost.PersonalCostDO; | 7 | import com.zteits.urbanops.module.garden.dal.dataobject.personalcost.PersonalCostDO; |
| 11 | import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; | 8 | import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; |
| 12 | import com.zteits.urbanops.module.garden.dal.mysql.personalcost.PersonalCostMapper; | 9 | import com.zteits.urbanops.module.garden.dal.mysql.personalcost.PersonalCostMapper; |
| 13 | -import com.zteits.urbanops.module.garden.dal.mysql.teambizdomainrel.TeamBizdomainRelMapper; | ||
| 14 | -import com.zteits.urbanops.module.garden.enums.CostFeeConstants; | ||
| 15 | -import com.zteits.urbanops.module.garden.service.teambizdomainrel.TeamBizdomainRelService; | ||
| 16 | import jakarta.annotation.Resource; | 10 | import jakarta.annotation.Resource; |
| 17 | -import org.apache.commons.collections4.CollectionUtils; | ||
| 18 | -import org.apache.commons.lang3.StringUtils; | ||
| 19 | import org.springframework.stereotype.Service; | 11 | import org.springframework.stereotype.Service; |
| 20 | import org.springframework.transaction.annotation.Transactional; | 12 | import org.springframework.transaction.annotation.Transactional; |
| 21 | import org.springframework.validation.annotation.Validated; | 13 | import org.springframework.validation.annotation.Validated; |
| 22 | 14 | ||
| 23 | import java.util.List; | 15 | import java.util.List; |
| 16 | +import java.util.stream.Collectors; | ||
| 24 | 17 | ||
| 25 | import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; | 18 | import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 26 | import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.PERSONAL_COST_NOT_EXISTS; | 19 | import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.PERSONAL_COST_NOT_EXISTS; |
| 27 | -import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.PERSONAL_COST_NOT_EXISTS_001; | ||
| 28 | 20 | ||
| 29 | /** | 21 | /** |
| 30 | * 人员费用录入 - 个人费用 Service 实现类 | 22 | * 人员费用录入 - 个人费用 Service 实现类 |
| @@ -37,20 +29,17 @@ public class PersonalCostServiceImpl implements PersonalCostService { | @@ -37,20 +29,17 @@ public class PersonalCostServiceImpl implements PersonalCostService { | ||
| 37 | 29 | ||
| 38 | @Resource | 30 | @Resource |
| 39 | private PersonalCostMapper personalCostMapper; | 31 | private PersonalCostMapper personalCostMapper; |
| 40 | - @Resource | ||
| 41 | - TeamBizdomainRelService teamBizdomainRelService; | ||
| 42 | 32 | ||
| 43 | @Override | 33 | @Override |
| 44 | @Transactional | 34 | @Transactional |
| 45 | public Long createPersonalCost(PersonalCostSaveReqVO createReqVO) { | 35 | public Long createPersonalCost(PersonalCostSaveReqVO createReqVO) { |
| 46 | // 插入 | 36 | // 插入 |
| 47 | PersonalCostDO personalCost = BeanUtils.toBean(createReqVO, PersonalCostDO.class); | 37 | PersonalCostDO personalCost = BeanUtils.toBean(createReqVO, PersonalCostDO.class); |
| 38 | + List<String> deptIds = createReqVO.getTeamIds().stream() | ||
| 39 | + .map(TeamBizdomainRelDO::getTeamId) | ||
| 40 | + .collect(Collectors.toList()); | ||
| 41 | + personalCost.setDeptId(deptIds); | ||
| 48 | personalCostMapper.insert(personalCost); | 42 | personalCostMapper.insert(personalCost); |
| 49 | - | ||
| 50 | - //add by wq 保存班组信息关联表 | ||
| 51 | - teamBizdomainRelService.saveTeamBizdomainRel(createReqVO.getTeamIds(), personalCost.getId(), personalCost.getCompanyId(), personalCost.getCompanyName(), CostFeeConstants.COSTFEE_PERSONAL); | ||
| 52 | - //add by wq 保存班组信息关联表 | ||
| 53 | - | ||
| 54 | // 返回 | 43 | // 返回 |
| 55 | return personalCost.getId(); | 44 | return personalCost.getId(); |
| 56 | } | 45 | } |
| @@ -62,13 +51,11 @@ public class PersonalCostServiceImpl implements PersonalCostService { | @@ -62,13 +51,11 @@ public class PersonalCostServiceImpl implements PersonalCostService { | ||
| 62 | validatePersonalCostExists(updateReqVO.getId()); | 51 | validatePersonalCostExists(updateReqVO.getId()); |
| 63 | // 更新 | 52 | // 更新 |
| 64 | PersonalCostDO updateObj = BeanUtils.toBean(updateReqVO, PersonalCostDO.class); | 53 | PersonalCostDO updateObj = BeanUtils.toBean(updateReqVO, PersonalCostDO.class); |
| 54 | + List<String> deptIds = updateReqVO.getTeamIds().stream() | ||
| 55 | + .map(TeamBizdomainRelDO::getTeamId) | ||
| 56 | + .collect(Collectors.toList()); | ||
| 57 | + updateObj.setDeptId(deptIds); | ||
| 65 | personalCostMapper.updateById(updateObj); | 58 | personalCostMapper.updateById(updateObj); |
| 66 | - | ||
| 67 | - //add by wq 保存班组信息关联表 | ||
| 68 | - teamBizdomainRelService.deleteTeamBizdomainRel(updateObj.getId(), CostFeeConstants.COSTFEE_PERSONAL); | ||
| 69 | - teamBizdomainRelService.saveTeamBizdomainRel(updateReqVO.getTeamIds(), updateObj.getId(), updateObj.getCompanyId(), updateObj.getCompanyName(), CostFeeConstants.COSTFEE_PERSONAL); | ||
| 70 | - | ||
| 71 | - //add by wq 保存班组信息关联表 | ||
| 72 | } | 59 | } |
| 73 | 60 | ||
| 74 | @Override | 61 | @Override |
| @@ -77,22 +64,12 @@ public class PersonalCostServiceImpl implements PersonalCostService { | @@ -77,22 +64,12 @@ public class PersonalCostServiceImpl implements PersonalCostService { | ||
| 77 | validatePersonalCostExists(id); | 64 | validatePersonalCostExists(id); |
| 78 | // 删除 | 65 | // 删除 |
| 79 | personalCostMapper.deleteById(id); | 66 | personalCostMapper.deleteById(id); |
| 80 | - // add by wq 删除 | ||
| 81 | - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_PERSONAL); | ||
| 82 | - // add by wq 删除 | ||
| 83 | } | 67 | } |
| 84 | 68 | ||
| 85 | @Override | 69 | @Override |
| 86 | public void deletePersonalCostListByIds(List<Long> ids) { | 70 | public void deletePersonalCostListByIds(List<Long> ids) { |
| 87 | // 删除 | 71 | // 删除 |
| 88 | personalCostMapper.deleteByIds(ids); | 72 | personalCostMapper.deleteByIds(ids); |
| 89 | - // add by wq 删除 | ||
| 90 | - if(ids.size() > 0) { | ||
| 91 | - for (Long id : ids) { | ||
| 92 | - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_PERSONAL); | ||
| 93 | - } | ||
| 94 | - } | ||
| 95 | - // add by wq 删除 | ||
| 96 | } | 73 | } |
| 97 | 74 | ||
| 98 | 75 |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/rentalmechanicalcost/RentalMechanicalCostServiceImpl.java
| @@ -40,9 +40,6 @@ public class RentalMechanicalCostServiceImpl implements RentalMechanicalCostServ | @@ -40,9 +40,6 @@ public class RentalMechanicalCostServiceImpl implements RentalMechanicalCostServ | ||
| 40 | RentalMechanicalCostDO rentalMechanicalCost = BeanUtils.toBean(createReqVO, RentalMechanicalCostDO.class); | 40 | RentalMechanicalCostDO rentalMechanicalCost = BeanUtils.toBean(createReqVO, RentalMechanicalCostDO.class); |
| 41 | rentalMechanicalCostMapper.insert(rentalMechanicalCost); | 41 | rentalMechanicalCostMapper.insert(rentalMechanicalCost); |
| 42 | 42 | ||
| 43 | - //add by wq 保存班组信息关联表 | ||
| 44 | - teamBizdomainRelService.saveTeamBizdomainRel(createReqVO.getTeamIds(), rentalMechanicalCost.getId(), rentalMechanicalCost.getCompanyId(), rentalMechanicalCost.getCompanyName(), CostFeeConstants.COSTFEE_RENTALMECHANICAL); | ||
| 45 | - //add by wq 保存班组信息关联表 | ||
| 46 | // 返回 | 43 | // 返回 |
| 47 | return rentalMechanicalCost.getId(); | 44 | return rentalMechanicalCost.getId(); |
| 48 | } | 45 | } |
| @@ -57,7 +54,6 @@ public class RentalMechanicalCostServiceImpl implements RentalMechanicalCostServ | @@ -57,7 +54,6 @@ public class RentalMechanicalCostServiceImpl implements RentalMechanicalCostServ | ||
| 57 | 54 | ||
| 58 | //add by wq 保存班组信息关联表 | 55 | //add by wq 保存班组信息关联表 |
| 59 | teamBizdomainRelService.deleteTeamBizdomainRel(updateObj.getId(), CostFeeConstants.COSTFEE_RENTALMECHANICAL); | 56 | teamBizdomainRelService.deleteTeamBizdomainRel(updateObj.getId(), CostFeeConstants.COSTFEE_RENTALMECHANICAL); |
| 60 | - teamBizdomainRelService.saveTeamBizdomainRel(updateReqVO.getTeamIds(), updateObj.getId(), updateObj.getCompanyId(), updateObj.getCompanyName(), CostFeeConstants.COSTFEE_RENTALMECHANICAL); | ||
| 61 | //add by wq 保存班组信息关联表 | 57 | //add by wq 保存班组信息关联表 |
| 62 | } | 58 | } |
| 63 | 59 | ||
| @@ -67,25 +63,12 @@ public class RentalMechanicalCostServiceImpl implements RentalMechanicalCostServ | @@ -67,25 +63,12 @@ public class RentalMechanicalCostServiceImpl implements RentalMechanicalCostServ | ||
| 67 | validateRentalMechanicalCostExists(id); | 63 | validateRentalMechanicalCostExists(id); |
| 68 | // 删除 | 64 | // 删除 |
| 69 | rentalMechanicalCostMapper.deleteById(id); | 65 | rentalMechanicalCostMapper.deleteById(id); |
| 70 | - | ||
| 71 | - //add by wq 删除班组信息关联表 | ||
| 72 | - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_RENTALMECHANICAL); | ||
| 73 | - //add by wq 删除班组信息关联表 | ||
| 74 | } | 66 | } |
| 75 | 67 | ||
| 76 | @Override | 68 | @Override |
| 77 | public void deleteRentalMechanicalCostListByIds(List<Long> ids) { | 69 | public void deleteRentalMechanicalCostListByIds(List<Long> ids) { |
| 78 | // 删除 | 70 | // 删除 |
| 79 | rentalMechanicalCostMapper.deleteByIds(ids); | 71 | rentalMechanicalCostMapper.deleteByIds(ids); |
| 80 | - | ||
| 81 | - //add by wq 删除班组信息关联表 | ||
| 82 | - if(CollectionUtils.isNotEmpty(ids)) { | ||
| 83 | - for (Long id : ids) { | ||
| 84 | - //批量删除 | ||
| 85 | - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_MECHANICAL); | ||
| 86 | - } | ||
| 87 | - } | ||
| 88 | - //add by wq 删除班组信息关联表 | ||
| 89 | } | 72 | } |
| 90 | 73 | ||
| 91 | 74 |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/wasterecord/WasteRecordServiceImpl.java
| 1 | package com.zteits.urbanops.module.garden.service.wasterecord; | 1 | package com.zteits.urbanops.module.garden.service.wasterecord; |
| 2 | 2 | ||
| 3 | -import cn.hutool.core.collection.CollUtil; | ||
| 4 | -import com.zteits.urbanops.module.garden.enums.CostFeeConstants; | 3 | +import com.zteits.urbanops.framework.common.pojo.PageResult; |
| 4 | +import com.zteits.urbanops.framework.common.util.object.BeanUtils; | ||
| 5 | +import com.zteits.urbanops.module.garden.controller.admin.wasterecord.vo.WasteRecordPageReqVO; | ||
| 6 | +import com.zteits.urbanops.module.garden.controller.admin.wasterecord.vo.WasteRecordSaveReqVO; | ||
| 7 | +import com.zteits.urbanops.module.garden.dal.dataobject.teambizdomainrel.TeamBizdomainRelDO; | ||
| 8 | +import com.zteits.urbanops.module.garden.dal.dataobject.wasterecord.WasteRecordDO; | ||
| 9 | +import com.zteits.urbanops.module.garden.dal.mysql.wasterecord.WasteRecordMapper; | ||
| 5 | import com.zteits.urbanops.module.garden.service.teambizdomainrel.TeamBizdomainRelService; | 10 | import com.zteits.urbanops.module.garden.service.teambizdomainrel.TeamBizdomainRelService; |
| 6 | -import org.springframework.stereotype.Service; | ||
| 7 | import jakarta.annotation.Resource; | 11 | import jakarta.annotation.Resource; |
| 8 | -import org.springframework.validation.annotation.Validated; | 12 | +import org.springframework.stereotype.Service; |
| 9 | import org.springframework.transaction.annotation.Transactional; | 13 | import org.springframework.transaction.annotation.Transactional; |
| 14 | +import org.springframework.validation.annotation.Validated; | ||
| 10 | 15 | ||
| 11 | -import java.util.*; | ||
| 12 | -import com.zteits.urbanops.module.garden.controller.admin.wasterecord.vo.*; | ||
| 13 | -import com.zteits.urbanops.module.garden.dal.dataobject.wasterecord.WasteRecordDO; | ||
| 14 | -import com.zteits.urbanops.framework.common.pojo.PageResult; | ||
| 15 | -import com.zteits.urbanops.framework.common.pojo.PageParam; | ||
| 16 | -import com.zteits.urbanops.framework.common.util.object.BeanUtils; | ||
| 17 | - | ||
| 18 | -import com.zteits.urbanops.module.garden.dal.mysql.wasterecord.WasteRecordMapper; | 16 | +import java.util.List; |
| 17 | +import java.util.stream.Collectors; | ||
| 19 | 18 | ||
| 20 | import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; | 19 | import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 21 | -import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; | ||
| 22 | -import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; | ||
| 23 | -import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; | 20 | +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.WASTE_RECORD_NOT_EXISTS; |
| 24 | 21 | ||
| 25 | /** | 22 | /** |
| 26 | * 园林废弃物录入 Service 实现类 | 23 | * 园林废弃物录入 Service 实现类 |
| @@ -41,12 +38,11 @@ public class WasteRecordServiceImpl implements WasteRecordService { | @@ -41,12 +38,11 @@ public class WasteRecordServiceImpl implements WasteRecordService { | ||
| 41 | public Long createWasteRecord(WasteRecordSaveReqVO createReqVO) { | 38 | public Long createWasteRecord(WasteRecordSaveReqVO createReqVO) { |
| 42 | // 插入 | 39 | // 插入 |
| 43 | WasteRecordDO wasteRecord = BeanUtils.toBean(createReqVO, WasteRecordDO.class); | 40 | WasteRecordDO wasteRecord = BeanUtils.toBean(createReqVO, WasteRecordDO.class); |
| 41 | + List<String> deptIds = createReqVO.getTeamIds().stream() | ||
| 42 | + .map(TeamBizdomainRelDO::getTeamId) | ||
| 43 | + .collect(Collectors.toList()); | ||
| 44 | + wasteRecord.setDeptId(deptIds); | ||
| 44 | wasteRecordMapper.insert(wasteRecord); | 45 | wasteRecordMapper.insert(wasteRecord); |
| 45 | - | ||
| 46 | - | ||
| 47 | - //add by wq 保存班组信息关联表 | ||
| 48 | - teamBizdomainRelService.saveTeamBizdomainRel(createReqVO.getTeamIds(), wasteRecord.getId(), wasteRecord.getCompanyId(), wasteRecord.getCompanyName(), CostFeeConstants.COSTFEE_GARDENWASTE); | ||
| 49 | - //add by wq 保存班组信息关联表 | ||
| 50 | // 返回 | 46 | // 返回 |
| 51 | return wasteRecord.getId(); | 47 | return wasteRecord.getId(); |
| 52 | } | 48 | } |
| @@ -58,11 +54,13 @@ public class WasteRecordServiceImpl implements WasteRecordService { | @@ -58,11 +54,13 @@ public class WasteRecordServiceImpl implements WasteRecordService { | ||
| 58 | validateWasteRecordExists(updateReqVO.getId()); | 54 | validateWasteRecordExists(updateReqVO.getId()); |
| 59 | // 更新 | 55 | // 更新 |
| 60 | WasteRecordDO updateObj = BeanUtils.toBean(updateReqVO, WasteRecordDO.class); | 56 | WasteRecordDO updateObj = BeanUtils.toBean(updateReqVO, WasteRecordDO.class); |
| 57 | + | ||
| 58 | + List<String> deptIds = updateReqVO.getTeamIds().stream() | ||
| 59 | + .map(TeamBizdomainRelDO::getTeamId) | ||
| 60 | + .collect(Collectors.toList()); | ||
| 61 | + updateObj.setDeptId(deptIds); | ||
| 62 | + | ||
| 61 | wasteRecordMapper.updateById(updateObj); | 63 | wasteRecordMapper.updateById(updateObj); |
| 62 | - //add by wq 保存班组信息关联表 | ||
| 63 | - teamBizdomainRelService.deleteTeamBizdomainRel(updateObj.getId(), CostFeeConstants.COSTFEE_GARDENWASTE); | ||
| 64 | - teamBizdomainRelService.saveTeamBizdomainRel(updateReqVO.getTeamIds(), updateObj.getId(), updateObj.getCompanyId(), updateObj.getCompanyName(), CostFeeConstants.COSTFEE_GARDENWASTE); | ||
| 65 | - //add by wq 保存班组信息关联表 | ||
| 66 | } | 64 | } |
| 67 | 65 | ||
| 68 | @Override | 66 | @Override |
| @@ -72,22 +70,12 @@ public class WasteRecordServiceImpl implements WasteRecordService { | @@ -72,22 +70,12 @@ public class WasteRecordServiceImpl implements WasteRecordService { | ||
| 72 | // 删除 | 70 | // 删除 |
| 73 | wasteRecordMapper.deleteById(id); | 71 | wasteRecordMapper.deleteById(id); |
| 74 | 72 | ||
| 75 | - // add by wq 删除 | ||
| 76 | - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_GARDENWASTE); | ||
| 77 | - // add by wq 删除 | ||
| 78 | } | 73 | } |
| 79 | 74 | ||
| 80 | @Override | 75 | @Override |
| 81 | public void deleteWasteRecordListByIds(List<Long> ids) { | 76 | public void deleteWasteRecordListByIds(List<Long> ids) { |
| 82 | // 删除 | 77 | // 删除 |
| 83 | wasteRecordMapper.deleteByIds(ids); | 78 | wasteRecordMapper.deleteByIds(ids); |
| 84 | - // add by wq 删除 | ||
| 85 | - if(ids.size() > 0) { | ||
| 86 | - for (Long id : ids) { | ||
| 87 | - teamBizdomainRelService.deleteTeamBizdomainRel(id, CostFeeConstants.COSTFEE_GARDENWASTE); | ||
| 88 | - } | ||
| 89 | - } | ||
| 90 | - // add by wq 删除 | ||
| 91 | } | 79 | } |
| 92 | 80 | ||
| 93 | 81 |