From d28b75ec84f868d38d34330e16b78b45b1b7150a Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 24 Apr 2026 11:46:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=BF=87=E9=B1=BC?= =?UTF-8?q?=E8=AE=BE=E6=96=BD=E8=8D=89=E7=A8=BF=E6=95=B0=E6=8D=AE=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=81=94=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/JacksonConfig.java | 19 ++ .../ApprovalChangeLogController.java | 11 + .../controller/ApprovalLogController.java | 12 ++ .../controller/ApprovalMainController.java | 11 + .../controller/FishDraftDataController.java | 35 ++- .../data/domain/BatchApproveRequest.java | 20 ++ .../data/domain/BatchRejectRequest.java | 18 ++ .../platform/data/domain/FishDraftData.java | 2 +- .../data/domain/vo/FishDraftDataVO.java | 2 +- .../data/service/IFishDraftDataService.java | 5 + .../impl/FishDraftDataServiceImpl.java | 203 ++++++++++++++++-- 11 files changed, 303 insertions(+), 35 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/config/JacksonConfig.java create mode 100644 backend/src/main/java/com/yfd/platform/data/domain/BatchApproveRequest.java create mode 100644 backend/src/main/java/com/yfd/platform/data/domain/BatchRejectRequest.java diff --git a/backend/src/main/java/com/yfd/platform/config/JacksonConfig.java b/backend/src/main/java/com/yfd/platform/config/JacksonConfig.java new file mode 100644 index 0000000..fdf579d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/config/JacksonConfig.java @@ -0,0 +1,19 @@ +package com.yfd.platform.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class JacksonConfig { + + @Bean + public ObjectMapper objectMapper() { + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new JavaTimeModule()); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + return mapper; + } +} diff --git a/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java index ad92308..e01f191 100644 --- a/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java +++ b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java @@ -1,8 +1,12 @@ package com.yfd.platform.data.controller; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.data.domain.ApprovalChangeLog; +import com.yfd.platform.data.domain.ApprovalLog; import com.yfd.platform.data.service.IApprovalChangeLogService; +import com.yfd.platform.utils.DataSourceRequestUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; @@ -31,6 +35,13 @@ public class ApprovalChangeLogController { return ResponseResult.successData(list); } + @PostMapping("/queryPageList") + @Operation(summary = "分页查询变更记录列表(通用)") + public ResponseResult queryPageList(@RequestBody DataSourceRequest request) { + Page approvalChangeLogPage = DataSourceRequestUtil.executeQuery(request, ApprovalChangeLog.class, approvalChangeLogService); + return ResponseResult.successData(approvalChangeLogPage); + } + @GetMapping("/getByApprovalId") @Operation(summary = "根据审批批次ID查询变更记录") public ResponseResult getByApprovalId(@RequestParam String approvalId) { diff --git a/backend/src/main/java/com/yfd/platform/data/controller/ApprovalLogController.java b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalLogController.java index d17534c..eb0ff5f 100644 --- a/backend/src/main/java/com/yfd/platform/data/controller/ApprovalLogController.java +++ b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalLogController.java @@ -1,8 +1,12 @@ package com.yfd.platform.data.controller; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.data.domain.ApprovalLog; +import com.yfd.platform.data.domain.ApprovalMain; import com.yfd.platform.data.service.IApprovalLogService; +import com.yfd.platform.utils.DataSourceRequestUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; @@ -31,6 +35,14 @@ public class ApprovalLogController { return ResponseResult.successData(list); } + @PostMapping("/queryPageList") + @Operation(summary = "分页查询审批日志列表(通用)") + public ResponseResult queryPageList(@RequestBody DataSourceRequest request) { + Page approvalLogPage = DataSourceRequestUtil.executeQuery(request, ApprovalLog.class, approvalLogService); + return ResponseResult.successData(approvalLogPage); + } + + @GetMapping("/getByApprovalId") @Operation(summary = "根据审批批次ID查询日志") public ResponseResult getByApprovalId(@RequestParam String approvalId) { diff --git a/backend/src/main/java/com/yfd/platform/data/controller/ApprovalMainController.java b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalMainController.java index 9ee0ee2..d8e8daf 100644 --- a/backend/src/main/java/com/yfd/platform/data/controller/ApprovalMainController.java +++ b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalMainController.java @@ -1,9 +1,11 @@ package com.yfd.platform.data.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.data.domain.ApprovalMain; import com.yfd.platform.data.service.IApprovalMainService; +import com.yfd.platform.utils.DataSourceRequestUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; @@ -36,6 +38,15 @@ public class ApprovalMainController { return ResponseResult.successData(result); } + @PostMapping("/queryPageList") + @Operation(summary = "分页查询审批列表(通用)") + public ResponseResult queryPageList(@RequestBody DataSourceRequest request) { + Page approvalMainPage = DataSourceRequestUtil.executeQuery(request, ApprovalMain.class, approvalMainService); + return ResponseResult.successData(approvalMainPage); + } + + + @GetMapping("/getById") @Operation(summary = "根据ID查询审批") public ResponseResult getById(@RequestParam Long id) { diff --git a/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java index da9f444..93f1d16 100644 --- a/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java +++ b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java @@ -7,11 +7,14 @@ import com.yfd.platform.data.domain.FishDraftData; import com.yfd.platform.data.domain.FishImportRequest; import com.yfd.platform.data.domain.FishImportResult; import com.yfd.platform.data.domain.ImportTask; +import com.yfd.platform.data.domain.BatchApproveRequest; +import com.yfd.platform.data.domain.BatchRejectRequest; import com.yfd.platform.data.domain.vo.FishDraftDataVO; import com.yfd.platform.data.service.IFishDraftDataService; import com.yfd.platform.data.service.IFishImportService; import com.yfd.platform.data.service.IImportTaskService; import com.yfd.platform.utils.KendoUtil; +import com.yfd.platform.utils.SecurityUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; @@ -91,6 +94,19 @@ public class FishDraftDataController { return result ? ResponseResult.success("保存成功") : ResponseResult.error("保存失败"); } + @PostMapping("/batchSaveDraft") + @Operation(summary = "批量保存草稿") + public ResponseResult saveDraft(@RequestBody List fishDraftDataList) { + + fishDraftDataList.forEach(fishDraftData -> { + fishDraftData.setStatus("DRAFT"); + fishDraftData.setDeletedFlag(0); + fishDraftData.setLockFlag(0); + }); + boolean result = fishDraftDataService.saveBatch(fishDraftDataList); + return result ? ResponseResult.success("保存成功") : ResponseResult.error("保存失败"); + } + @PostMapping("/updateDraft") @Operation(summary = "更新草稿") public ResponseResult updateDraft(@RequestBody FishDraftData fishDraftData) { @@ -130,17 +146,15 @@ public class FishDraftDataController { @PostMapping("/batchApprove") @Operation(summary = "批量审批通过") - public ResponseResult batchApprove(@RequestBody List ids, - @RequestParam(required = false) String approveComment) { - boolean result = fishDraftDataService.batchApprove(ids, approveComment); + public ResponseResult batchApprove(@RequestBody BatchApproveRequest request) { + boolean result = fishDraftDataService.batchApprove(request.getIds(), request.getApproveComment()); return result ? ResponseResult.success("审批通过") : ResponseResult.error("审批失败"); } @PostMapping("/reject") @Operation(summary = "审批驳回") - public ResponseResult batchReject(@RequestParam String id, - @RequestParam String rejectReason) { - boolean result = fishDraftDataService.batchReject(id, rejectReason); + public ResponseResult batchReject(@RequestBody BatchRejectRequest request) { + boolean result = fishDraftDataService.batchReject(request.getId(), request.getRejectReason()); return result ? ResponseResult.success("驳回成功") : ResponseResult.error("驳回失败"); } @@ -168,9 +182,9 @@ public class FishDraftDataController { } @PostMapping("/update") - @Operation(summary = "修改过鱼数据") + @Operation(summary = "审批人修改过鱼数据(记录变更日志)") public ResponseResult update(@RequestBody FishDraftData fishDraftData) { - boolean result = fishDraftDataService.updateById(fishDraftData); + boolean result = fishDraftDataService.updateByIdWithLog(fishDraftData); return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败"); } @@ -190,8 +204,7 @@ public class FishDraftDataController { @PostMapping("/importZip") @Operation(summary = "导入ZIP过鱼数据(每个用户同时只能进行一次导入)") - public ResponseResult importZip(@RequestParam("file") MultipartFile file, - @RequestParam String uploadUserId) { + public ResponseResult importZip(@RequestParam("file") MultipartFile file) { if (file == null || file.isEmpty()) { return ResponseResult.error("请上传文件"); } @@ -199,7 +212,7 @@ public class FishDraftDataController { if (fileName == null || (!fileName.endsWith(".zip"))) { return ResponseResult.error("请上传ZIP文件(.zip)"); } - + String uploadUserId = SecurityUtils.getUserId(); if (importTaskService.hasImportingTask(uploadUserId)) { return ResponseResult.error("您有正在进行的导入任务,请等待完成后重试"); } diff --git a/backend/src/main/java/com/yfd/platform/data/domain/BatchApproveRequest.java b/backend/src/main/java/com/yfd/platform/data/domain/BatchApproveRequest.java new file mode 100644 index 0000000..08c3ac3 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/data/domain/BatchApproveRequest.java @@ -0,0 +1,20 @@ +package com.yfd.platform.data.domain; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * 批量审批请求参数 + */ +@Data +@Schema(description = "批量审批请求参数") +public class BatchApproveRequest { + + @Schema(description = "草稿数据ID列表") + private List ids; + + @Schema(description = "审批意见") + private String approveComment; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/data/domain/BatchRejectRequest.java b/backend/src/main/java/com/yfd/platform/data/domain/BatchRejectRequest.java new file mode 100644 index 0000000..2b97b19 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/data/domain/BatchRejectRequest.java @@ -0,0 +1,18 @@ +package com.yfd.platform.data.domain; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 审批驳回请求参数 + */ +@Data +@Schema(description = "审批驳回请求参数") +public class BatchRejectRequest { + + @Schema(description = "草稿数据ID") + private String id; + + @Schema(description = "驳回原因") + private String rejectReason; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java b/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java index 601b934..b78bee5 100644 --- a/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java +++ b/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java @@ -106,7 +106,7 @@ public class FishDraftData implements Serializable { /** * 审批批次ID */ - private Long approvalId; + private String approvalId; /** * 状态(DRAFT未提交 / SUBMITTED已提交 / APPROVED已通过 / REJECTED已驳回) diff --git a/backend/src/main/java/com/yfd/platform/data/domain/vo/FishDraftDataVO.java b/backend/src/main/java/com/yfd/platform/data/domain/vo/FishDraftDataVO.java index d849bed..6e21b5c 100644 --- a/backend/src/main/java/com/yfd/platform/data/domain/vo/FishDraftDataVO.java +++ b/backend/src/main/java/com/yfd/platform/data/domain/vo/FishDraftDataVO.java @@ -110,7 +110,7 @@ public class FishDraftDataVO implements Serializable { /** * 审批批次ID */ - private Long approvalId; + private String approvalId; /** * 状态(DRAFT未提交 / SUBMITTED已提交 / APPROVED已通过 / REJECTED已驳回) diff --git a/backend/src/main/java/com/yfd/platform/data/service/IFishDraftDataService.java b/backend/src/main/java/com/yfd/platform/data/service/IFishDraftDataService.java index 3b8a75d..2be6536 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/IFishDraftDataService.java +++ b/backend/src/main/java/com/yfd/platform/data/service/IFishDraftDataService.java @@ -86,4 +86,9 @@ public interface IFishDraftDataService extends IService { boolean unlockDraft(String id); boolean batchRemoveDraft(List ids); + + /** + * 审批人修改数据并记录变更日志 + */ + boolean updateByIdWithLog(FishDraftData fishDraftData); } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/FishDraftDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/FishDraftDataServiceImpl.java index ba0b71a..e292482 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/impl/FishDraftDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/FishDraftDataServiceImpl.java @@ -7,22 +7,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.data.domain.ApprovalMain; import com.yfd.platform.data.domain.FishDraftData; import com.yfd.platform.data.domain.vo.FishDraftDataVO; import com.yfd.platform.data.mapper.FishDraftDataMapper; import com.yfd.platform.data.service.IApprovalChangeLogService; +import com.yfd.platform.data.service.IApprovalLogService; import com.yfd.platform.data.service.IApprovalMainService; import com.yfd.platform.data.service.IFishDraftDataService; import com.yfd.platform.utils.KendoUtil; import com.yfd.platform.utils.QgcQueryWrapperUtil; import com.yfd.platform.utils.SecurityUtils; +import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; -import java.util.Date; -import java.util.List; +import java.util.*; /** *

@@ -41,6 +43,12 @@ public class FishDraftDataServiceImpl extends ServiceImpl queryPageList(DataSourceRequest dataSourceRequest) { Page page = KendoUtil.getPage(dataSourceRequest); @@ -110,8 +118,28 @@ public class FishDraftDataServiceImpl extends ServiceImpl ids) { - for (String id : ids) { - FishDraftData fishDraftData = this.getById(id); - if (fishDraftData != null && fishDraftData.getLockFlag() == 0) { - fishDraftData.setStatus("SUBMITTED"); - fishDraftData.setSubmitTime(new Date()); - this.updateById(fishDraftData); - } + if (ids == null || ids.isEmpty()) { + return false; } + String operatorId = SecurityUtils.getUserId(); + + ApprovalMain approvalMain = new ApprovalMain(); + approvalMain.setApprovalNo("APR" + System.currentTimeMillis()); + approvalMain.setBizType("FISH"); + approvalMain.setDataCount(ids.size()); + approvalMain.setApplyUserId(operatorId); + approvalMain.setApplyTime(new Date()); + approvalMain.setStatus("PENDING"); + approvalMainService.save(approvalMain); + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.in(FishDraftData::getId, ids); + updateWrapper.eq(FishDraftData::getLockFlag, 0); + updateWrapper.set(FishDraftData::getApprovalId, approvalMain.getId()); + updateWrapper.set(FishDraftData::getStatus, "SUBMITTED"); + updateWrapper.set(FishDraftData::getSubmitTime, new Date()); + this.update(updateWrapper); + + + approvalLogService.logSubmit(approvalMain.getId(), operatorId, "批量提交草稿,共" + ids.size() + "条"); return true; } @@ -174,34 +233,73 @@ public class FishDraftDataServiceImpl extends ServiceImpl dataList = this.listByIds(ids); + Set processedApprovalIds = new HashSet<>(); + List validIds = new ArrayList<>(); + + for (FishDraftData fishDraftData : dataList) { + if ("SUBMITTED".equals(fishDraftData.getStatus())) { + validIds.add(fishDraftData.getId()); + if (fishDraftData.getApprovalId() != null) { + processedApprovalIds.add(fishDraftData.getApprovalId()); + } } } + + if (!validIds.isEmpty()) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.in(FishDraftData::getId, validIds); + updateWrapper.set(FishDraftData::getStatus, "APPROVED"); + updateWrapper.set(FishDraftData::getApproveTime, now); + updateWrapper.set(FishDraftData::getUpdatedBy, operatorId); + this.update(updateWrapper); + for (String approvalId : processedApprovalIds) { + ApprovalMain approvalMain = approvalMainService.getById(approvalId); + approvalLogService.logApprove(approvalId, SecurityUtils.getUserId(), approveComment); + if (approvalMain != null) { + approvalMain.setStatus("APPROVED"); + approvalMain.setApproverId(operatorId); + approvalMain.setApproveTime(now); + approvalMain.setRemark(approveComment); + approvalMainService.updateById(approvalMain); + } + } + } + return true; } @Override @Transactional(rollbackFor = Exception.class) public boolean batchReject(String id, String rejectReason) { - if (StrUtil.isBlank( id)) { + if (StrUtil.isBlank(id)) { return false; } if (StrUtil.isBlank(rejectReason)) { throw new IllegalArgumentException("驳回原因不能为空"); } Date now = new Date(); + String operatorId = SecurityUtils.getUserId(); FishDraftData fishDraftData = this.getById(id); if (fishDraftData != null && "SUBMITTED".equals(fishDraftData.getStatus())) { fishDraftData.setStatus("REJECTED"); fishDraftData.setApproveTime(now); - fishDraftData.setUpdatedBy(SecurityUtils.getUserId()); - this.updateById(fishDraftData); + fishDraftData.setUpdatedBy(operatorId); + boolean result = this.updateById(fishDraftData); + if (result && fishDraftData.getApprovalId() != null) { + approvalLogService.logReject(fishDraftData.getApprovalId(), operatorId, rejectReason); + ApprovalMain approvalMain = approvalMainService.getById(fishDraftData.getApprovalId()); + if (approvalMain != null) { + approvalMain.setStatus("REJECTED"); + approvalMain.setApproverId(operatorId); + approvalMain.setApproveTime(now); + approvalMain.setRemark(rejectReason); + approvalMainService.updateById(approvalMain); + } + } + return result; } return true; } @@ -228,5 +326,66 @@ public class FishDraftDataServiceImpl extends ServiceImpl changeInfo = new LinkedHashMap<>(); + changeInfo.put("before", objectMapper.readTree(beforeJson)); + changeInfo.put("after", objectMapper.readTree(afterJson)); + List changedFields = new ArrayList<>(); + if (!Objects.equals(before.getStcd(), after.getStcd())) changedFields.add("stcd"); + if (!Objects.equals(before.getTm(), after.getTm())) changedFields.add("tm"); + if (!Objects.equals(before.getFtp(), after.getFtp())) changedFields.add("ftp"); + if (!Objects.equals(before.getFsz(), after.getFsz())) changedFields.add("fsz"); + if (!Objects.equals(before.getFcnt(), after.getFcnt())) changedFields.add("fcnt"); + if (!Objects.equals(before.getFwet(), after.getFwet())) changedFields.add("fwet"); + if (!Objects.equals(before.getStrdt(), after.getStrdt())) changedFields.add("strdt"); + if (!Objects.equals(before.getEnddt(), after.getEnddt())) changedFields.add("enddt"); + if (!Objects.equals(before.getDirection(), after.getDirection())) changedFields.add("direction"); + if (!Objects.equals(before.getYr(), after.getYr())) changedFields.add("yr"); + if (!Objects.equals(before.getMouth(), after.getMouth())) changedFields.add("mouth"); + if (!Objects.equals(before.getVdpth(), after.getVdpth())) changedFields.add("vdpth"); + if (!Objects.equals(before.getPicpth(), after.getPicpth())) changedFields.add("picpth"); + if (!Objects.equals(before.getIsfs(), after.getIsfs())) changedFields.add("isfs"); + if (!Objects.equals(before.getSourceType(), after.getSourceType())) changedFields.add("sourceType"); + if (!Objects.equals(before.getStatus(), after.getStatus())) changedFields.add("status"); + changeInfo.put("changed_fields", changedFields); + return objectMapper.writeValueAsString(changeInfo); + } catch (Exception e) { + return "{}"; + } + } + } \ No newline at end of file