From 8e634c53ec61617d484410687543e4a1770b37dc Mon Sep 17 00:00:00 2001 From: wang Date: Mon, 19 Oct 2026 09:00:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BC=98=E5=8C=96=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cost/service/FirmReportsService.java | 55 +++++++++++++------ .../service/ServiceApplicationsService.java | 13 +++-- .../mapper/cost/FirmReportsMapper.xml | 7 ++- yun-base/src/main/resources/dev/yun-base.yaml | 9 +-- 4 files changed, 57 insertions(+), 27 deletions(-) diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/service/FirmReportsService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/service/FirmReportsService.java index 783371a..991d04b 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/service/FirmReportsService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/service/FirmReportsService.java @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import net.lab1024.sa.admin.common.enums.ReviewEnum; import net.lab1024.sa.admin.module.cost.dao.FirmReportsDao; @@ -27,6 +28,7 @@ import net.lab1024.sa.base.common.code.UnexpectedErrorCode; import net.lab1024.sa.base.common.code.UserErrorCode; import net.lab1024.sa.base.common.domain.ValidateList; import net.lab1024.sa.base.common.enumeration.UserTypeEnum; +import net.lab1024.sa.base.common.exception.BusinessException; import net.lab1024.sa.base.common.util.SmartBeanUtil; import net.lab1024.sa.base.common.util.SmartPageUtil; import net.lab1024.sa.base.common.domain.ResponseDTO; @@ -34,6 +36,7 @@ import net.lab1024.sa.base.common.domain.PageResult; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import net.lab1024.sa.base.module.support.dict.service.DictService; import org.apache.commons.collections4.CollectionUtils; +import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -287,27 +290,47 @@ public class FirmReportsService { /** * 批量创建缺失季度记录(空白报表) */ + @Transactional(rollbackFor = Exception.class) public ResponseDTO batchCreateMissing(Integer firmId, Integer year, List quarters) { if (firmId == null || year == null || quarters == null || quarters.isEmpty()) { return ResponseDTO.userErrorParam("参数不能为空"); } - + + List distinctQuarters = quarters.stream().distinct().collect(Collectors.toList()); + if (distinctQuarters.stream().anyMatch(quarter -> quarter == null || quarter < 1 || quarter > 4)) { + return ResponseDTO.userErrorParam("季度必须为1至4"); + } + + List existingQuarters = distinctQuarters.stream() + .filter(quarter -> firmReportsDao.selectList(String.valueOf(quarter), year, firmId) != null) + .collect(Collectors.toList()); + if (!existingQuarters.isEmpty()) { + String quarterNames = existingQuarters.stream() + .map(quarter -> "第" + quarter + "季度") + .collect(Collectors.joining("、")); + return ResponseDTO.userErrorParam(year + "年" + quarterNames + "报表已存在,请刷新列表后重试"); + } + RequestEmployee requestUser = AdminRequestUtil.getRequestUser(); - for (Integer quarter : quarters) { - FirmReportsEntity entity = new FirmReportsEntity(); - entity.setFirmId(firmId); - entity.setDeclareYear(year); - entity.setDeclareQuarter(String.valueOf(quarter)); - entity.setUserId(requestUser.getEmployeeId()); - entity.setApprovalStatus(0); - entity.setDelFlag(0); - entity.setRevenue(BigDecimal.ZERO); - entity.setTotalCost(BigDecimal.ZERO); - entity.setPublicWelfareCost(BigDecimal.ZERO); - entity.setCostIncomeRatio(BigDecimal.ZERO); - entity.setActualPublicWelfareCost(BigDecimal.ZERO); - entity.setActualCostIncomeRatio(BigDecimal.ZERO); - firmReportsDao.insert(entity); + try { + for (Integer quarter : distinctQuarters) { + FirmReportsEntity entity = new FirmReportsEntity(); + entity.setFirmId(firmId); + entity.setDeclareYear(year); + entity.setDeclareQuarter(String.valueOf(quarter)); + entity.setUserId(requestUser.getEmployeeId()); + entity.setApprovalStatus(0); + entity.setDelFlag(0); + entity.setRevenue(BigDecimal.ZERO); + entity.setTotalCost(BigDecimal.ZERO); + entity.setPublicWelfareCost(BigDecimal.ZERO); + entity.setCostIncomeRatio(BigDecimal.ZERO); + entity.setActualPublicWelfareCost(BigDecimal.ZERO); + entity.setActualCostIncomeRatio(BigDecimal.ZERO); + firmReportsDao.insert(entity); + } + } catch (DuplicateKeyException exception) { + throw new BusinessException("部分季度报表已被创建,请刷新列表后重试"); } return ResponseDTO.ok(); } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.java index c86fcda..d66897b 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.java @@ -370,7 +370,7 @@ public class ServiceApplicationsService { */ @Transactional(rollbackFor = Exception.class) public ResponseDTO add(ServiceApplicationsAddForm addForm) { - validateActivityEnd(addForm.getServiceEnd()); + validateActivityTime(addForm.getServiceStart(), addForm.getServiceEnd()); ServiceApplicationsEntity serviceApplicationsEntity = SmartBeanUtil.copy(addForm, ServiceApplicationsEntity.class); @@ -418,7 +418,7 @@ public class ServiceApplicationsService { */ @Transactional(rollbackFor = Exception.class) public ResponseDTO update(ServiceApplicationsUpdateForm updateForm) { - validateActivityEnd(updateForm.getServiceEnd()); + validateActivityTime(updateForm.getServiceStart(), updateForm.getServiceEnd()); ServiceApplicationsEntity currentEntity = serviceApplicationsDao.selectById(updateForm.getApplicationId()); if (currentEntity == null) { throw new BusinessException("申报记录不存在"); @@ -1005,7 +1005,7 @@ public class ServiceApplicationsService { } } - validateActivityEnd(addForm.getServiceEnd()); + validateActivityTime(addForm.getServiceStart(), addForm.getServiceEnd()); // 1. 强校验:主申报人必须签署承诺书 Long currentUserId = AdminRequestUtil.getRequestUser().getUserId(); @@ -1094,7 +1094,7 @@ public class ServiceApplicationsService { } } } else { - validateActivityEnd(addForm.getServiceEnd()); + validateActivityTime(addForm.getServiceStart(), addForm.getServiceEnd()); // 编辑已有记录逻辑 if ("TIME".equals(addForm.getServiceType())) { Long userId = AdminRequestUtil.getRequestUser().getEmployeeId(); @@ -1184,13 +1184,16 @@ public class ServiceApplicationsService { return ResponseDTO.ok(); } - private void validateActivityEnd(LocalDateTime serviceEnd) { + private void validateActivityTime(LocalDateTime serviceStart, LocalDateTime serviceEnd) { if (serviceEnd == null) { throw new BusinessException("活动结束时间不能为空"); } if (serviceEnd.isAfter(LocalDateTime.now())) { throw new BusinessException("活动结束时间不能晚于当前时间"); } + if (serviceStart != null && !serviceEnd.isAfter(serviceStart)) { + throw new BusinessException("活动结束时间必须晚于开始时间"); + } } private String serializeParticipantIds(List participantIds) { diff --git a/yun-admin/src/main/resources/mapper/cost/FirmReportsMapper.xml b/yun-admin/src/main/resources/mapper/cost/FirmReportsMapper.xml index a7ef49f..8809f57 100644 --- a/yun-admin/src/main/resources/mapper/cost/FirmReportsMapper.xml +++ b/yun-admin/src/main/resources/mapper/cost/FirmReportsMapper.xml @@ -25,7 +25,9 @@ UPDATE t_firm_reports - SET approval_status = 3 + SET approval_status = 3, + submission_time = NOW(), + update_time = NOW() WHERE id IN #{item} @@ -74,7 +76,8 @@ AND t_firm_reports.approval_status = #{queryForm.approvalStatus} - ORDER BY t_firm_reports.update_time DESC + ORDER BY t_firm_reports.submission_time DESC, + t_firm_reports.update_time DESC diff --git a/yun-base/src/main/resources/dev/yun-base.yaml b/yun-base/src/main/resources/dev/yun-base.yaml index 600fe65..974e2b1 100644 --- a/yun-base/src/main/resources/dev/yun-base.yaml +++ b/yun-base/src/main/resources/dev/yun-base.yaml @@ -1,10 +1,10 @@ spring: # 数据库连接信息 datasource: - url: jdbc:p6spy:mysql://8.148.67.92:3306/lawyer_welfare?autoReconnect=true&useServerPreparedStmts=false&rewriteBatchedStatements=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai + url: jdbc:mysql://8.148.67.92:3306/lawyer_welfare?autoReconnect=true&useServerPreparedStmts=false&rewriteBatchedStatements=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai username: root password: sdy@2025# - driver-class-name: com.p6spy.engine.spy.P6SpyDriver + driver-class-name: com.mysql.cj.jdbc.Driver initial-size: 2 min-idle: 2 max-active: 10 @@ -106,7 +106,8 @@ file: bucket-name: file access-key: minioadmin secret-key: 12345678 - url-prefix: http://${file.storage.cloud.endpoint}/${file.storage.cloud.bucket-name}/ + # Java SDK 仍通过 endpoint:9000 连接 MinIO;返回浏览器的地址统一走 Nginx HTTPS 代理。 + url-prefix: https://8.148.67.92/minio/file/ private-url-expire-seconds: 3600 # open api配置 @@ -183,4 +184,4 @@ smart: # 数据库配置检测-开关 默认开启 可选(作用是固定间隔读取数据库配置更新任务,关闭后只能重启服务或通过接口修改定时任务,建议开启) db-refresh-enabled: true # 数据库配置检测-执行间隔 默认120秒 可选 - db-refresh-interval: 60 \ No newline at end of file + db-refresh-interval: 60