修改bug

This commit is contained in:
lcj
2025-09-30 23:16:30 +08:00
parent 334ff20129
commit 3630c13f59
3 changed files with 190 additions and 9 deletions

View File

@ -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<PgsProgressPlanDetail> 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<Long> categoryIds = planDetailList.stream()
.map(PgsProgressPlanDetail::getProgressCategoryId)
.distinct()
.toList();
List<PgsProgressCategory> categoryList = progressCategoryService.lambdaQuery()
.in(CollUtil.isNotEmpty(categoryIds), PgsProgressCategory::getId, categoryIds)
.list();
Map<Long, PgsProgressCategory> categoryMap = categoryList.stream()
.collect(
Collectors.toMap(PgsProgressCategory::getId,
Function.identity(),
(v1, v2) -> v1)
);
// 为每一个项目创建一个施工产值范围
Set<Long> projectIds = planDetailList.stream()
.map(PgsProgressPlanDetail::getProjectId).collect(Collectors.toSet());
// 获取所有父级项目
List<BusProject> projectList = projectService.listByIds(projectIds);
List<Long> allProjectIds = projectList
.stream().map(project -> {
if (project.getPId() != 0L) {
return project.getPId();
} else {
return project.getId();
}
}).distinct().toList();
// 根据项目区分
Map<Long, List<PgsProgressPlanDetail>> detailMap = planDetailList.stream()
.collect(Collectors.groupingBy(PgsProgressPlanDetail::getProjectId));
List<OutConstructionValue> saveList = new ArrayList<>();
List<PgsProgressPlanDetail> allUpdateList = new ArrayList<>();
List<OutConstructionValueRange> 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<Long> subProject = new ArrayList<>(projectList.stream()
.filter(project -> Objects.equals(project.getPId(), id))
.map(BusProject::getId)
.distinct()
.toList());
subProject.add(id);
List<PgsProgressPlanDetail> detailList = new ArrayList<>();
for (Long p : subProject) {
List<PgsProgressPlanDetail> details = detailMap.getOrDefault(p, List.of());
detailList.addAll(details);
}
if (CollUtil.isEmpty(detailList)) {
return null;
}
BigDecimal allConstructionValue = BigDecimal.ZERO;
BigDecimal allOwnerValue = BigDecimal.ZERO;
List<PgsProgressPlanDetail> 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

View File

@ -175,6 +175,17 @@ public class OutConstructionValueRangeServiceImpl extends ServiceImpl<OutConstru
OutConstructionValueRange byId = this.getById(Convert.toLong(processEvent.getBusinessId()));
byId.setAuditStatus(processEvent.getStatus());
if (processEvent.getSubmit()) {
// 设置确认数量默认值
List<OutConstructionValue> valueList = constructionValueService.lambdaQuery()
.eq(OutConstructionValue::getRangeId, byId.getId())
.list();
List<OutConstructionValue> 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());
}
// 如果为完成状态,则锁定对应进度计划详情

View File

@ -965,7 +965,7 @@ public class PgsProgressPlanDetailServiceImpl extends ServiceImpl<PgsProgressPla
value.setArtificialNum(finishedNumber.subtract(aiFill).intValue());
value.setUavNum(aiFill.intValue());
value.setPlanNum(planDetail.getPlanNumber().intValue());
value.setReportDate(now.minusDays(1));
value.setReportDate(planDetail.getDate());
value.setPlanDate(planDetail.getDate());
// 计算产值
BigDecimal constructionPrice = category.getConstructionPrice();
@ -1042,7 +1042,7 @@ public class PgsProgressPlanDetailServiceImpl extends ServiceImpl<PgsProgressPla
value.setArtificialNum(finishedNumber.subtract(aiFill).intValue());
value.setUavNum(aiFill.intValue());
value.setPlanNum(planDetail.getPlanNumber().intValue());
value.setReportDate(now.minusDays(1));
value.setReportDate(planDetail.getDate());
value.setPlanDate(planDetail.getDate());
// 计算产值
BigDecimal constructionPrice = category.getConstructionPrice();