进度计划同步、大屏摄像头
This commit is contained in:
		| @ -34,9 +34,7 @@ import org.springframework.boot.test.context.SpringBootTest; | |||||||
|  |  | ||||||
| import java.math.BigDecimal; | import java.math.BigDecimal; | ||||||
| import java.math.RoundingMode; | import java.math.RoundingMode; | ||||||
| import java.time.DayOfWeek; |  | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
| import java.time.temporal.TemporalAdjusters; |  | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| @ -91,7 +89,7 @@ public class DemoTest { | |||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
|     void testConstructionValue() { |     void testConstructionValue() { | ||||||
|         LocalDate today = LocalDate.now(); | /*        LocalDate today = LocalDate.now(); | ||||||
|         // 找到本周一 |         // 找到本周一 | ||||||
|         LocalDate thisMonday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); |         LocalDate thisMonday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); | ||||||
|         // 上周一 = 本周一 - 1 周 |         // 上周一 = 本周一 - 1 周 | ||||||
| @ -99,7 +97,18 @@ public class DemoTest { | |||||||
|         // 上周日 = 上周一 + 6 天 |         // 上周日 = 上周一 + 6 天 | ||||||
|         LocalDate lastSunday = lastMonday.plusDays(6); |         LocalDate lastSunday = lastMonday.plusDays(6); | ||||||
|         log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", lastMonday, lastSunday); |         log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", lastMonday, lastSunday); | ||||||
|         Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(lastMonday, lastSunday, null); |         Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(lastMonday, lastSunday, null);*/ | ||||||
|  |  | ||||||
|  |         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 |     @Test | ||||||
|  | |||||||
| @ -5,15 +5,19 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||||
| import jakarta.annotation.Resource; | import jakarta.annotation.Resource; | ||||||
| import jakarta.validation.constraints.NotNull; | import jakarta.validation.constraints.NotNull; | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
|  | import org.dromara.bigscreen.domain.dto.Ys7DeviceUpdateReq; | ||||||
| import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo; | import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo; | ||||||
| import org.dromara.bigscreen.domain.vo.ProjectLandVo; | import org.dromara.bigscreen.domain.vo.ProjectLandVo; | ||||||
| import org.dromara.bigscreen.domain.vo.ProjectPeopleVo; | import org.dromara.bigscreen.domain.vo.ProjectPeopleVo; | ||||||
| import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo; | import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo; | ||||||
| import org.dromara.bigscreen.service.ProjectBigScreenService; | import org.dromara.bigscreen.service.ProjectBigScreenService; | ||||||
|  | import org.dromara.common.core.constant.HttpStatus; | ||||||
| import org.dromara.common.core.domain.R; | import org.dromara.common.core.domain.R; | ||||||
|  | import org.dromara.common.core.exception.ServiceException; | ||||||
| import org.dromara.common.idempotent.annotation.RepeatSubmit; | import org.dromara.common.idempotent.annotation.RepeatSubmit; | ||||||
| import org.dromara.common.log.annotation.Log; | import org.dromara.common.log.annotation.Log; | ||||||
| import org.dromara.common.log.enums.BusinessType; | import org.dromara.common.log.enums.BusinessType; | ||||||
|  | import org.dromara.common.web.core.BaseController; | ||||||
| import org.dromara.gps.domain.bo.GpsEquipmentBo; | import org.dromara.gps.domain.bo.GpsEquipmentBo; | ||||||
| import org.dromara.gps.domain.vo.GpsEquipmentSonVo; | import org.dromara.gps.domain.vo.GpsEquipmentSonVo; | ||||||
| import org.dromara.gps.service.IGpsEquipmentService; | import org.dromara.gps.service.IGpsEquipmentService; | ||||||
| @ -22,6 +26,7 @@ import org.dromara.land.domain.BusLandTransferLedger; | |||||||
| import org.dromara.land.service.IBusLandBlockService; | import org.dromara.land.service.IBusLandBlockService; | ||||||
| import org.dromara.land.service.IBusLandTransferLedgerService; | import org.dromara.land.service.IBusLandTransferLedgerService; | ||||||
| import org.dromara.manager.weathermanager.vo.WeatherVo; | import org.dromara.manager.weathermanager.vo.WeatherVo; | ||||||
|  | import org.dromara.manager.ys7manager.Ys7Manager; | ||||||
| import org.dromara.other.domain.OthYs7Device; | import org.dromara.other.domain.OthYs7Device; | ||||||
| import org.dromara.other.service.IOthYs7DeviceService; | import org.dromara.other.service.IOthYs7DeviceService; | ||||||
| import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; | import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; | ||||||
| @ -34,6 +39,7 @@ import org.dromara.quality.service.IQltQualityInspectionService; | |||||||
| import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionGisReq; | import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionGisReq; | ||||||
| import org.dromara.safety.domain.vo.safetyinspection.HseSafetyInspectionListGisVo; | import org.dromara.safety.domain.vo.safetyinspection.HseSafetyInspectionListGisVo; | ||||||
| import org.dromara.safety.service.IHseSafetyInspectionService; | import org.dromara.safety.service.IHseSafetyInspectionService; | ||||||
|  | import org.springframework.beans.BeanUtils; | ||||||
| import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||||
| import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||||
|  |  | ||||||
| @ -54,7 +60,7 @@ import java.util.stream.Collectors; | |||||||
| @RestController | @RestController | ||||||
| @RequiredArgsConstructor | @RequiredArgsConstructor | ||||||
| @RequestMapping("/project/big/screen") | @RequestMapping("/project/big/screen") | ||||||
| public class ProjectBigScreenController { | public class ProjectBigScreenController extends BaseController { | ||||||
|  |  | ||||||
|     @Resource |     @Resource | ||||||
|     private ProjectBigScreenService projectBigScreenService; |     private ProjectBigScreenService projectBigScreenService; | ||||||
| @ -75,6 +81,8 @@ public class ProjectBigScreenController { | |||||||
|  |  | ||||||
|     private final IHseSafetyInspectionService safetyInspectionService; |     private final IHseSafetyInspectionService safetyInspectionService; | ||||||
|  |  | ||||||
|  |     private final Ys7Manager ys7Manager; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 查询项目土地统计 |      * 查询项目土地统计 | ||||||
|      */ |      */ | ||||||
| @ -316,6 +324,7 @@ public class ProjectBigScreenController { | |||||||
|                 sxt.put("lat", item.getLatitude()); |                 sxt.put("lat", item.getLatitude()); | ||||||
|                 sxt.put("lng", item.getLongitude()); |                 sxt.put("lng", item.getLongitude()); | ||||||
|                 sxt.put("alt", item.getAltitude()); |                 sxt.put("alt", item.getAltitude()); | ||||||
|  |                 sxt.put("detail", item.getDetail()); | ||||||
|                 sxtChildrenMap.add(sxt); |                 sxtChildrenMap.add(sxt); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -341,6 +350,41 @@ public class ProjectBigScreenController { | |||||||
|         return R.ok(maps); |         return R.ok(maps); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改萤石摄像头 | ||||||
|  |      */ | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PutMapping("/device") | ||||||
|  |     public R<Void> edit(@Validated @RequestBody Ys7DeviceUpdateReq req) { | ||||||
|  |         OthYs7Device one = othYs7DeviceService.lambdaQuery() | ||||||
|  |             .eq(OthYs7Device::getDeviceSerial, req.getDeviceSerial()) | ||||||
|  |             .last("limit 1") | ||||||
|  |             .one(); | ||||||
|  |         if (one == null) { | ||||||
|  |             throw new ServiceException("萤石摄像头信息不存在", HttpStatus.NOT_FOUND); | ||||||
|  |         } | ||||||
|  |         // 将实体类和 DTO 进行转换 | ||||||
|  |         OthYs7Device ys7Device = new OthYs7Device(); | ||||||
|  |         BeanUtils.copyProperties(req, ys7Device); | ||||||
|  |         ys7Device.setId(one.getId()); | ||||||
|  |         // 判断是否更新名称 | ||||||
|  |         String deviceName = req.getDeviceName(); | ||||||
|  |         if (deviceName != null && !deviceName.equals(one.getDeviceName())) { | ||||||
|  |             Long count = othYs7DeviceService.lambdaQuery() | ||||||
|  |                 .eq(OthYs7Device::getDeviceName, req.getDeviceName()) | ||||||
|  |                 .count(); | ||||||
|  |             if (count > 0) { | ||||||
|  |                 throw new ServiceException("已存在同名萤石摄像头", HttpStatus.CONFLICT); | ||||||
|  |             } | ||||||
|  |             // todo 更新云端名称 | ||||||
|  | /*            Boolean result = ys7Manager.updateDeviceName(one.getDeviceSerial(), deviceName); | ||||||
|  |             if (!result) { | ||||||
|  |                 throw new ServiceException("更新云端萤石摄像头名称异常", HttpStatus.ERROR); | ||||||
|  |             }*/ | ||||||
|  |         } | ||||||
|  |         return toAjax(othYs7DeviceService.updateById(ys7Device)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 查询质量信息 |      * 查询质量信息 | ||||||
|      */ |      */ | ||||||
|  | |||||||
| @ -0,0 +1,40 @@ | |||||||
|  | package org.dromara.bigscreen.domain.dto; | ||||||
|  |  | ||||||
|  | import jakarta.validation.constraints.NotBlank; | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025/6/13 10:19 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | public class Ys7DeviceUpdateReq implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = -3434796275594146484L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 设备序列号 | ||||||
|  |      */ | ||||||
|  |     @NotBlank(message = "设备序列号不能为空") | ||||||
|  |     private String deviceSerial; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 设备名称 | ||||||
|  |      */ | ||||||
|  |     private String deviceName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 设备详情 | ||||||
|  |      */ | ||||||
|  |     private String detail; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -6,9 +6,7 @@ import org.dromara.progress.service.IPgsProgressPlanDetailService; | |||||||
| import org.springframework.scheduling.annotation.Scheduled; | import org.springframework.scheduling.annotation.Scheduled; | ||||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||||
|  |  | ||||||
| import java.time.DayOfWeek; |  | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
| import java.time.temporal.TemporalAdjusters; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 同步计划详情到施工产值 |  * 同步计划详情到施工产值 | ||||||
| @ -26,17 +24,18 @@ public class IncSyncPlanDetail2ConstructionValue { | |||||||
|     /** |     /** | ||||||
|      * 同步计划详情到施工产值(每天 1 点执行) |      * 同步计划详情到施工产值(每天 1 点执行) | ||||||
|      */ |      */ | ||||||
|     @Scheduled(cron = "0 0 2 ? * MON") |     @Scheduled(cron = "0 0 1 * * ?") | ||||||
|     public void run() { |     public void run() { | ||||||
|         LocalDate today = LocalDate.now(); |         LocalDate today = LocalDate.now(); | ||||||
|         // 找到本周一 |         LocalDate localDate = today.minusDays(1); | ||||||
|  | /*        // 找到本周一 | ||||||
|         LocalDate thisMonday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); |         LocalDate thisMonday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); | ||||||
|         // 上周一 = 本周一 - 1 周 |         // 上周一 = 本周一 - 1 周 | ||||||
|         LocalDate lastMonday = thisMonday.minusWeeks(1); |         LocalDate lastMonday = thisMonday.minusWeeks(1); | ||||||
|         // 上周日 = 上周一 + 6 天 |         // 上周日 = 上周一 + 6 天 | ||||||
|         LocalDate lastSunday = lastMonday.plusDays(6); |         LocalDate lastSunday = lastMonday.plusDays(6);*/ | ||||||
|         log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", lastMonday, lastSunday); |         log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", localDate, localDate); | ||||||
|         Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(lastMonday, lastSunday, null); |         Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(localDate, localDate, null); | ||||||
|         if (synced) { |         if (synced) { | ||||||
|             log.info("同步计划详情到施工产值成功"); |             log.info("同步计划详情到施工产值成功"); | ||||||
|         } else { |         } else { | ||||||
|  | |||||||
| @ -66,7 +66,9 @@ import java.io.InputStream; | |||||||
| import java.math.BigDecimal; | import java.math.BigDecimal; | ||||||
| import java.math.RoundingMode; | import java.math.RoundingMode; | ||||||
| import java.net.URISyntaxException; | import java.net.URISyntaxException; | ||||||
|  | import java.time.DayOfWeek; | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
|  | import java.time.temporal.TemporalAdjusters; | ||||||
| import java.util.*; | import java.util.*; | ||||||
| import java.util.concurrent.atomic.AtomicInteger; | import java.util.concurrent.atomic.AtomicInteger; | ||||||
| import java.util.function.Function; | import java.util.function.Function; | ||||||
| @ -893,93 +895,190 @@ public class PgsProgressPlanDetailServiceImpl extends ServiceImpl<PgsProgressPla | |||||||
|                     return project.getId(); |                     return project.getId(); | ||||||
|                 } |                 } | ||||||
|             }).distinct().toList(); |             }).distinct().toList(); | ||||||
|  |         // 判断项目是否已存在施工产值范围 | ||||||
|  |         LocalDate now = LocalDate.now(); | ||||||
|  |         // 获取本周的星期一 | ||||||
|  |         LocalDate monday = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); | ||||||
|  |         // 获取本周的星期日 | ||||||
|  |         LocalDate sunday = now.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); | ||||||
|  |         List<OutConstructionValueRange> oldRangeList = constructionValueRangeService.lambdaQuery() | ||||||
|  |             .eq(OutConstructionValueRange::getStartDate, monday) | ||||||
|  |             .eq(OutConstructionValueRange::getEndDate, sunday) | ||||||
|  |             .in(OutConstructionValueRange::getProjectId, allProjectIds) | ||||||
|  |             .list(); | ||||||
|  |         // 过滤出没有值的项目 | ||||||
|  |         List<Long> haveProjectIds = oldRangeList.stream() | ||||||
|  |             .map(OutConstructionValueRange::getProjectId) | ||||||
|  |             .toList(); | ||||||
|  |         List<Long> noValueProjectIds = allProjectIds.stream() | ||||||
|  |             .filter(p -> !haveProjectIds.contains(p)) | ||||||
|  |             .toList(); | ||||||
|         // 根据项目区分 |         // 根据项目区分 | ||||||
|         Map<Long, List<PgsProgressPlanDetail>> detailMap = planDetailList.stream() |         Map<Long, List<PgsProgressPlanDetail>> detailMap = planDetailList.stream() | ||||||
|             .collect(Collectors.groupingBy(PgsProgressPlanDetail::getProjectId)); |             .collect(Collectors.groupingBy(PgsProgressPlanDetail::getProjectId)); | ||||||
|         List<OutConstructionValue> saveList = new ArrayList<>(); |         List<OutConstructionValue> saveList = new ArrayList<>(); | ||||||
|         LocalDate now = LocalDate.now(); |  | ||||||
|         List<PgsProgressPlanDetail> allUpdateList = new ArrayList<>(); |         List<PgsProgressPlanDetail> allUpdateList = new ArrayList<>(); | ||||||
|         List<OutConstructionValueRange> ranges = allProjectIds.stream().map(id -> { |         if (CollUtil.isNotEmpty(noValueProjectIds)) { | ||||||
|             OutConstructionValueRange range = new OutConstructionValueRange(); |             List<OutConstructionValueRange> ranges = noValueProjectIds.stream().map(id -> { | ||||||
|             long rangeId = IdWorker.getId(range); |                 OutConstructionValueRange range = new OutConstructionValueRange(); | ||||||
|             range.setId(rangeId); |                 long rangeId = IdWorker.getId(range); | ||||||
|             range.setProjectId(id); |                 range.setId(rangeId); | ||||||
|             range.setStartDate(startDate); |                 range.setProjectId(id); | ||||||
|             range.setEndDate(endDate); |                 range.setStartDate(startDate); | ||||||
|             // 获取所有子项目 |                 range.setEndDate(endDate); | ||||||
|             List<Long> subProject = new ArrayList<>(projectList.stream() |                 // 获取所有子项目 | ||||||
|                 .filter(project -> Objects.equals(project.getPId(), id)) |                 List<Long> subProject = new ArrayList<>(projectList.stream() | ||||||
|                 .map(BusProject::getId) |                     .filter(project -> Objects.equals(project.getPId(), id)) | ||||||
|                 .distinct() |                     .map(BusProject::getId) | ||||||
|                 .toList()); |                     .distinct() | ||||||
|             subProject.add(id); |                     .toList()); | ||||||
|             List<PgsProgressPlanDetail> detailList = new ArrayList<>(); |                 subProject.add(id); | ||||||
|             for (Long p : subProject) { |                 List<PgsProgressPlanDetail> detailList = new ArrayList<>(); | ||||||
|                 List<PgsProgressPlanDetail> details = detailMap.getOrDefault(p, List.of()); |                 for (Long p : subProject) { | ||||||
|                 detailList.addAll(details); |                     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); |                 if (CollUtil.isEmpty(detailList)) { | ||||||
|                 value.setRangeId(rangeId); |                     return null; | ||||||
|                 value.setMatrixId(category.getMatrixId()); |                 } | ||||||
|                 value.setProgressCategoryId(progressCategoryId); |                 BigDecimal allConstructionValue = BigDecimal.ZERO; | ||||||
|                 value.setDetailId(planDetail.getId()); |                 BigDecimal allOwnerValue = BigDecimal.ZERO; | ||||||
|                 BigDecimal finishedNumber = planDetail.getFinishedNumber(); |                 List<PgsProgressPlanDetail> updateList = new ArrayList<>(); | ||||||
|                 BigDecimal aiFill = planDetail.getAiFill(); |                 for (PgsProgressPlanDetail planDetail : detailList) { | ||||||
|                 // 如果完成数量为0, 则不保存 |                     OutConstructionValue value = new OutConstructionValue(); | ||||||
|                 if (finishedNumber.compareTo(BigDecimal.ZERO) == 0) { |                     Long progressCategoryId = planDetail.getProgressCategoryId(); | ||||||
|                     continue; |                     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(now.minusDays(1)); | ||||||
|  |                     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); | ||||||
|                 } |                 } | ||||||
|                 value.setArtificialNum(finishedNumber.subtract(aiFill).intValue()); |  | ||||||
|                 value.setUavNum(aiFill.intValue()); |  | ||||||
|                 value.setPlanNum(planDetail.getPlanNumber().intValue()); |  | ||||||
|                 value.setReportDate(now); |  | ||||||
|                 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(haveProjectIds)) { | ||||||
|  |             List<OutConstructionValueRange> ranges = oldRangeList.stream().map(range -> { | ||||||
|  |                 // 获取所有子项目 | ||||||
|  |                 List<Long> subProject = new ArrayList<>(projectList.stream() | ||||||
|  |                     .filter(project -> Objects.equals(project.getPId(), range.getProjectId())) | ||||||
|  |                     .map(BusProject::getId) | ||||||
|  |                     .distinct() | ||||||
|  |                     .toList()); | ||||||
|  |                 subProject.add(range.getProjectId()); | ||||||
|  |                 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 = range.getOutValue(); | ||||||
|  |                 BigDecimal allOwnerValue = range.getOwnerValue(); | ||||||
|  |                 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(range.getProjectId()); | ||||||
|  |                     value.setRangeId(range.getId()); | ||||||
|  |                     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(now.minusDays(1)); | ||||||
|  |                     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 updateBatchById = constructionValueRangeService.updateBatchById(ranges); | ||||||
|  |                 if (!updateBatchById) { | ||||||
|  |                     throw new ServiceException("同步计划详情到施工产值失败,数据库异常", HttpStatus.ERROR); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (CollUtil.isNotEmpty(saveList)) { |         if (CollUtil.isNotEmpty(saveList)) { | ||||||
|             boolean saved = constructionValueService.saveBatch(saveList); |             boolean saved = constructionValueService.saveBatch(saveList); | ||||||
|             if (!saved) { |             if (!saved) { | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user