From 3630c13f5910cec5fa5e5fa83e0d4ff6a8c37b2e Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Tue, 30 Sep 2025 23:16:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/org/dromara/test/DemoTest.java | 184 +++++++++++++++++- .../OutConstructionValueRangeServiceImpl.java | 11 ++ .../PgsProgressPlanDetailServiceImpl.java | 4 +- 3 files changed, 190 insertions(+), 9 deletions(-) diff --git a/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/DemoTest.java b/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/DemoTest.java index 3ee8d430..42970f35 100644 --- a/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/DemoTest.java +++ b/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/DemoTest.java @@ -5,10 +5,13 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.IdcardUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.utils.IdCardEncryptorUtil; import org.dromara.contractor.domain.SubConstructionUser; import org.dromara.contractor.service.ISubConstructionUserService; @@ -19,7 +22,12 @@ import org.dromara.facility.service.IFacMatrixService; import org.dromara.facility.service.IFacPhotovoltaicPanelPartsService; import org.dromara.facility.service.IFacPhotovoltaicPanelService; import org.dromara.manager.recognizermanager.vo.RecognizeConvertCoordinateResult; +import org.dromara.out.domain.OutConstructionValue; +import org.dromara.out.domain.OutConstructionValueRange; +import org.dromara.out.service.IOutConstructionValueRangeService; +import org.dromara.out.service.IOutConstructionValueService; import org.dromara.progress.domain.PgsProgressCategory; +import org.dromara.progress.domain.PgsProgressPlanDetail; import org.dromara.progress.domain.dto.progresscategory.PgsProgressCategoryCreateReq; import org.dromara.progress.service.IPgsProgressCategoryService; import org.dromara.progress.service.IPgsProgressCategoryTemplateService; @@ -34,10 +42,10 @@ import org.springframework.boot.test.context.SpringBootTest; import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.DayOfWeek; import java.time.LocalDate; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.time.temporal.TemporalAdjusters; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -87,6 +95,13 @@ public class DemoTest { @Resource private IFacPhotovoltaicPanelService photovoltaicPanelService; + @Resource + private IOutConstructionValueRangeService constructionValueRangeService; + + @Resource + private IOutConstructionValueService constructionValueService; + + @Test void testConstructionValue() { /* LocalDate today = LocalDate.now(); @@ -98,17 +113,172 @@ public class DemoTest { LocalDate lastSunday = lastMonday.plusDays(6); log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", lastMonday, lastSunday); Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(lastMonday, lastSunday, null);*/ + LocalDate start = LocalDate.of(2024, 1, 1); // 起始时间(2024-01-01) + LocalDate end = LocalDate.of(2025, 9, 15); // 截止时间(2025-09-15) - LocalDate today = LocalDate.of(2025, 9, 16); - LocalDate localDate = today.minusDays(1); + // 如果起始不是周一,调整到当周的周一 + if (start.getDayOfWeek() != DayOfWeek.MONDAY) { + start = start.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); + } + + while (!start.isAfter(end)) { + LocalDate monday = start; + LocalDate sunday = start.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); + + // 输出本周的周一和周日 + System.out.println(monday + " ~ " + sunday); + log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", monday, sunday); +// Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(start, now, null); + // 获取范围时间内的计划详情 + List planDetailList = progressPlanDetailService.lambdaQuery() + .ge(PgsProgressPlanDetail::getDate, monday) + .le(PgsProgressPlanDetail::getDate, sunday) + .ne(PgsProgressPlanDetail::getFinishedNumber, BigDecimal.ZERO) + .eq(PgsProgressPlanDetail::getStatus, "1") + .list(); + if (CollUtil.isEmpty(planDetailList)) { + // 下一周 + start = start.plusWeeks(1); + continue; + } + // 获取进度类别 + List categoryIds = planDetailList.stream() + .map(PgsProgressPlanDetail::getProgressCategoryId) + .distinct() + .toList(); + List categoryList = progressCategoryService.lambdaQuery() + .in(CollUtil.isNotEmpty(categoryIds), PgsProgressCategory::getId, categoryIds) + .list(); + Map categoryMap = categoryList.stream() + .collect( + Collectors.toMap(PgsProgressCategory::getId, + Function.identity(), + (v1, v2) -> v1) + ); + // 为每一个项目创建一个施工产值范围 + Set projectIds = planDetailList.stream() + .map(PgsProgressPlanDetail::getProjectId).collect(Collectors.toSet()); + // 获取所有父级项目 + List projectList = projectService.listByIds(projectIds); + List allProjectIds = projectList + .stream().map(project -> { + if (project.getPId() != 0L) { + return project.getPId(); + } else { + return project.getId(); + } + }).distinct().toList(); + // 根据项目区分 + Map> detailMap = planDetailList.stream() + .collect(Collectors.groupingBy(PgsProgressPlanDetail::getProjectId)); + List saveList = new ArrayList<>(); + List allUpdateList = new ArrayList<>(); + List ranges = allProjectIds.stream().map(id -> { + OutConstructionValueRange range = new OutConstructionValueRange(); + long rangeId = IdWorker.getId(range); + range.setId(rangeId); + range.setProjectId(id); + range.setStartDate(monday); + range.setEndDate(sunday); + // 获取所有子项目 + List subProject = new ArrayList<>(projectList.stream() + .filter(project -> Objects.equals(project.getPId(), id)) + .map(BusProject::getId) + .distinct() + .toList()); + subProject.add(id); + List detailList = new ArrayList<>(); + for (Long p : subProject) { + List details = detailMap.getOrDefault(p, List.of()); + detailList.addAll(details); + } + if (CollUtil.isEmpty(detailList)) { + return null; + } + BigDecimal allConstructionValue = BigDecimal.ZERO; + BigDecimal allOwnerValue = BigDecimal.ZERO; + List updateList = new ArrayList<>(); + for (PgsProgressPlanDetail planDetail : detailList) { + OutConstructionValue value = new OutConstructionValue(); + Long progressCategoryId = planDetail.getProgressCategoryId(); + PgsProgressCategory category = categoryMap.get(progressCategoryId); + if (category == null) { + continue; + } + value.setProjectId(id); + value.setRangeId(rangeId); + value.setMatrixId(category.getMatrixId()); + value.setProgressCategoryId(progressCategoryId); + value.setDetailId(planDetail.getId()); + BigDecimal finishedNumber = planDetail.getFinishedNumber(); + BigDecimal aiFill = planDetail.getAiFill(); + // 如果完成数量为0, 则不保存 + if (finishedNumber.compareTo(BigDecimal.ZERO) == 0) { + continue; + } + value.setArtificialNum(finishedNumber.subtract(aiFill).intValue()); + value.setUavNum(aiFill.intValue()); + value.setPlanNum(planDetail.getPlanNumber().intValue()); + value.setReportDate(planDetail.getDate()); + value.setPlanDate(planDetail.getDate()); + // 计算产值 + BigDecimal constructionPrice = category.getConstructionPrice(); + BigDecimal ownerPrice = category.getOwnerPrice(); + BigDecimal constructionValue = constructionPrice.multiply(finishedNumber).setScale(4, RoundingMode.HALF_UP); + BigDecimal ownerValue = ownerPrice.multiply(finishedNumber).setScale(4, RoundingMode.HALF_UP); + value.setOutValue(constructionValue); + value.setOwnerValue(ownerValue); + // 统计总产值 + allConstructionValue = allConstructionValue.add(constructionValue).setScale(4, RoundingMode.HALF_UP); + allOwnerValue = allOwnerValue.add(ownerValue).setScale(4, RoundingMode.HALF_UP); + // 添加需要修改状态的计划详情 + PgsProgressPlanDetail update = new PgsProgressPlanDetail(); + update.setId(planDetail.getId()); + update.setStatus("2"); + updateList.add(update); + saveList.add(value); + } + range.setOutValue(allConstructionValue); + range.setOwnerValue(allOwnerValue); + // 如果产值都为0,则不保存 + if (allConstructionValue.compareTo(BigDecimal.ZERO) == 0 && allOwnerValue.compareTo(BigDecimal.ZERO) == 0) { + return null; + } + allUpdateList.addAll(updateList); + return range; + }).filter(Objects::nonNull).toList(); + // 保存数据 + if (CollUtil.isNotEmpty(ranges)) { + boolean saveBatch = constructionValueRangeService.saveBatch(ranges); + if (!saveBatch) { + throw new ServiceException("同步计划详情到施工产值失败,数据库异常", HttpStatus.ERROR); + } + } + if (CollUtil.isNotEmpty(saveList)) { + boolean saved = constructionValueService.saveBatch(saveList); + if (!saved) { + throw new ServiceException("同步计划详情到施工产值失败,数据库异常", HttpStatus.ERROR); + } + } + if (CollUtil.isNotEmpty(allUpdateList)) { + boolean updateBatch = progressPlanDetailService.updateBatchById(allUpdateList); + if (!updateBatch) { + throw new ServiceException("同步计划详情到施工产值失败,数据库异常", HttpStatus.ERROR); + } + + } + // 下一周 + start = start.plusWeeks(1); + } +/* LocalDate today = LocalDate.of(2025, 9, 16); + LocalDate localDate = today.minusDays(1);*/ /* // 找到本周一 LocalDate thisMonday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); // 上周一 = 本周一 - 1 周 LocalDate lastMonday = thisMonday.minusWeeks(1); // 上周日 = 上周一 + 6 天 LocalDate lastSunday = lastMonday.plusDays(6);*/ - log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", localDate, localDate); - Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(localDate, localDate, null); + } @Test diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/impl/OutConstructionValueRangeServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/impl/OutConstructionValueRangeServiceImpl.java index 162a0029..5598eba4 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/impl/OutConstructionValueRangeServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/out/service/impl/OutConstructionValueRangeServiceImpl.java @@ -175,6 +175,17 @@ public class OutConstructionValueRangeServiceImpl extends ServiceImpl valueList = constructionValueService.lambdaQuery() + .eq(OutConstructionValue::getRangeId, byId.getId()) + .list(); + List list = valueList.stream() + .filter(value -> value.getConfirmNum() == null || value.getConfirmNum() == 0) + .peek(value -> value.setConfirmNum(value.getArtificialNum() != null ? value.getArtificialNum() : value.getUavNum())) + .toList(); + if (CollUtil.isNotEmpty(list)) { + constructionValueService.updateBatchById(list); + } byId.setAuditStatus(BusinessStatusEnum.WAITING.getStatus()); } // 如果为完成状态,则锁定对应进度计划详情 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressPlanDetailServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressPlanDetailServiceImpl.java index b3f3b5ae..8304a35a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressPlanDetailServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressPlanDetailServiceImpl.java @@ -965,7 +965,7 @@ public class PgsProgressPlanDetailServiceImpl extends ServiceImpl