diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MaterialsManagementController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MaterialsManagementController.java new file mode 100644 index 00000000..2ba79053 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MaterialsManagementController.java @@ -0,0 +1,105 @@ +package org.dromara.bigscreen.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.bigscreen.domain.vo.InventoryStructureAnalysisVo; +import org.dromara.bigscreen.domain.vo.designAndArrivalComparisonVo; +import org.dromara.bigscreen.domain.vo.wzxqysjdhdbVo; +import org.dromara.bigscreen.service.IMaterialsManagementService; +import org.dromara.cailiaoshebei.domain.bo.BusPurchaseDocBo; +import org.dromara.cailiaoshebei.domain.vo.BusPurchaseDocVo; +import org.dromara.cailiaoshebei.service.IBusMrpBaseService; +import org.dromara.cailiaoshebei.service.IBusPurchaseDocService; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.materials.domain.dto.materials.MatMaterialsQueryReq; +import org.dromara.materials.domain.vo.materials.MatMaterialsUseDetailVo; +import org.dromara.materials.service.IMatMaterialsService; +import org.dromara.project.domain.vo.project.BusProjectGisVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + + +/** + * 物资管理 + */ +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping("/materialsManagement") +public class MaterialsManagementController extends BaseController { + + @Autowired + private IMaterialsManagementService materialsManagementService; + @Autowired + private IBusPurchaseDocService busPurchaseDocService; + @Autowired + private IBusMrpBaseService busMrpBaseService; + @Autowired + private IMatMaterialsService materialsService; + + /** + * 库存结构分析 + * @return + */ + @GetMapping("/inventoryStructureAnalysis") + public R inventoryStructureAnalysis(Long projectId) { + return R.ok(materialsManagementService.inventoryStructureAnalysis(projectId)); + } + + /** + * 采购单 + * @return + */ + @GetMapping("/purchaseNote") + public R> purchaseNote(Long projectId) { + return R.ok(busPurchaseDocService.purchaseNote(projectId)); + } + /** + * 获取采购单详情 + * @return + */ + @GetMapping("/purchaseNoteDetail") + public R purchaseNoteDetail(Long id) { + return R.ok(busPurchaseDocService.queryById(id)); + } + + /** + * 获取采购单详情PDF + */ + @GetMapping("/purchaseNoteDetailPdf") + public R purchaseNoteDetailPdf(Long id) { + return R.ok(busPurchaseDocService.queryPicBase64ById(id)); + } + + /** + * 设计量与到货量对比 + */ + @GetMapping("/designAndArrivalComparison") + public R> designAndArrivalComparison(Long projectId) { + return R.ok(busMrpBaseService.designAndArrivalComparison(projectId)); + } + /** + * 物资需求与实际到货对比 + */ + @GetMapping("/wzxqysjdhdb") + public R> wzxqysjdhdb(Long projectId) { + return R.ok(busMrpBaseService.wzxqysjdhdb(projectId)); + } + + /** + * 获取材料使用详情列表 + */ + @GetMapping("/listUseDetail") + public R> listUseDetail(Long projectId) { + return R.ok(materialsService.listUseDetail(projectId)); + } + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/InventoryStructureAnalysisVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/InventoryStructureAnalysisVo.java new file mode 100644 index 00000000..ca98bdb1 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/InventoryStructureAnalysisVo.java @@ -0,0 +1,68 @@ +package org.dromara.bigscreen.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class InventoryStructureAnalysisVo implements Serializable { + + /** + * 本月入库总价 + */ + public BigDecimal enterTotalPrices; + + /** + * 上月入库总价 + */ + public BigDecimal oldEnterTotalPrices; + + + /** + * 本月出库总价 + */ + public BigDecimal leaveTotalPrices; + + /** + * 上月出库总价 + */ + public BigDecimal oldLeaveTotalPrices; + + /** + * 库存总价 + */ + public BigDecimal inventoryTotalPrices; + + /** + * 出库总价 + */ + public BigDecimal outTotalPrices; + + /** + * 库存逆变器总价 + */ + public BigDecimal inventoryInverterTotalPrices; + + /** + * 库存箱变总价 + */ + public BigDecimal inventoryBoxTransformerTotalPrices; + + /** + * 库存光伏支架总价 + */ + public BigDecimal inventoryPhotovoltaicSupportTotalPrices; + + /** + * 库存环网柜总价 + */ + public BigDecimal inventoryCircuitBreakerTotalPrices; + + /** + * 当前库存总价 + */ + public BigDecimal nowInventoryTotalPrices; + + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/designAndArrivalComparisonVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/designAndArrivalComparisonVo.java new file mode 100644 index 00000000..3a26c5d9 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/designAndArrivalComparisonVo.java @@ -0,0 +1,40 @@ +package org.dromara.bigscreen.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 设计量与到货量对比 + */ +@Data +public class designAndArrivalComparisonVo implements Serializable { + + /** + * 名称 + */ + public String name; + + /** + * 规格 + */ + public String specification; + + + /** + * 单位 + */ + public String unit; + + /** + * 设计量 + */ + public BigDecimal designTotalPrices; + + /** + * 到货量 + */ + public BigDecimal arrivalTotalPrices; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/wzxqysjdhdbVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/wzxqysjdhdbVo.java new file mode 100644 index 00000000..44e776ad --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/wzxqysjdhdbVo.java @@ -0,0 +1,35 @@ +package org.dromara.bigscreen.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 物资需求与实际到货对比vo + */ +@Data +public class wzxqysjdhdbVo implements Serializable { + + /** + * 名称 + */ + public String name; + + /** + * 规格 + */ + public String specification; + + + /** + * 设计量 + */ + public BigDecimal designTotalPrices; + + /** + * 到货量 + */ + public BigDecimal arrivalTotalPrices; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/enums/WuZhiEnum.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/enums/WuZhiEnum.java new file mode 100644 index 00000000..3aee50d8 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/enums/WuZhiEnum.java @@ -0,0 +1,22 @@ +package org.dromara.bigscreen.enums; + +public enum WuZhiEnum { + + LBQ("逆变器"), + GFZJ("光伏支架"), + XB("箱变"), + HWG("环网柜"); + + + private final String TypeName; + + + + public String getTypeName() { + return TypeName; + } + + WuZhiEnum(String TypeName) { + this.TypeName = TypeName; + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/IMaterialsManagementService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/IMaterialsManagementService.java new file mode 100644 index 00000000..226d317c --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/IMaterialsManagementService.java @@ -0,0 +1,20 @@ +package org.dromara.bigscreen.service; + + +import org.dromara.bigscreen.domain.vo.InventoryStructureAnalysisVo; +import org.dromara.project.domain.vo.project.BusProjectGisVo; + +import java.util.List; + +/** + * 物资管理大屏Service接口 + */ +public interface IMaterialsManagementService { + + /** + * 库存结构分析 + * @param projectId + * @return + */ + InventoryStructureAnalysisVo inventoryStructureAnalysis(Long projectId); +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/MaterialsManagementServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/MaterialsManagementServiceImpl.java new file mode 100644 index 00000000..713106b9 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/MaterialsManagementServiceImpl.java @@ -0,0 +1,203 @@ +package org.dromara.bigscreen.service.impl; + + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import jakarta.annotation.Resource; +import org.dromara.bigscreen.domain.vo.InventoryStructureAnalysisVo; +import org.dromara.bigscreen.enums.WuZhiEnum; +import org.dromara.bigscreen.service.IMaterialsManagementService; +import org.dromara.materials.domain.MatMaterialIssueItem; +import org.dromara.materials.domain.MatMaterialReceiveItem; +import org.dromara.materials.service.IMatMaterialIssueItemService; +import org.dromara.materials.service.IMatMaterialReceiveItemService; +import org.dromara.materials.service.IMatMaterialsInventoryService; +import org.dromara.materials.service.IMatMaterialsService; +import org.dromara.project.domain.vo.project.BusProjectGisVo; +import org.dromara.tender.domain.BusBillofquantitiesLimitList; +import org.dromara.tender.service.IBusBillofquantitiesLimitListService; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.temporal.TemporalAdjusters; +import java.util.ArrayList; +import java.util.List; + +@Service +public class MaterialsManagementServiceImpl implements IMaterialsManagementService { + + @Lazy + @Resource + private IMatMaterialReceiveItemService materialReceiveItemService; + + @Lazy + @Resource + private IMatMaterialIssueItemService materialIssueItemService; + + @Lazy + @Resource + private IMatMaterialsService materialsService; + @Lazy + @Resource + private IBusBillofquantitiesLimitListService billofquantitiesLimitListService; + + + @Override + public InventoryStructureAnalysisVo inventoryStructureAnalysis(Long projectId) { + InventoryStructureAnalysisVo vo = new InventoryStructureAnalysisVo(); + // 获取当月第一天 + LocalDateTime monthStart = LocalDateTime.now() + // 调整到当月第一天 + .with(TemporalAdjusters.firstDayOfMonth()) + // 重置时分秒毫秒为0 + .withHour(0) + .withMinute(0) + .withSecond(0) + .withNano(0); + // 获取当前时间 + LocalDateTime currentTime = LocalDateTime.now(); + // 获取上月第一天 + LocalDateTime lastMonthFirstDay = LocalDateTime.now() + // 先回退一个月 + .minusMonths(1) + // 调整到当月第一天 + .with(TemporalAdjusters.firstDayOfMonth()) + // 重置时间为 00:00:00.000000000 + .withHour(0) + .withMinute(0) + .withSecond(0); + // 获取上月最后一天 + LocalDateTime lastMonthLastDay = LocalDateTime.now() + // 先回退一个月 + .minusMonths(1) + // 调整到当月最后一天 + .with(TemporalAdjusters.lastDayOfMonth()) + // 设置时间为 23:59:59.999999999(纳秒最大值,对应毫秒级的999) + .withHour(23) + .withMinute(59) + .withSecond(59); + // 获取当月入库数据 + List matMaterialReceiveItems = materialReceiveItemService.getBaseMapper().selectList(new LambdaQueryWrapper() + .eq(MatMaterialReceiveItem::getProjectId, projectId) + .ne(MatMaterialReceiveItem::getAcceptedQuantity, BigDecimal.ZERO) + .between(MatMaterialReceiveItem::getCreateTime, monthStart, currentTime)); + if (CollUtil.isEmpty(matMaterialReceiveItems)){ + vo.setEnterTotalPrices(BigDecimal.ZERO); + } + // 计算本月入库金额 + matMaterialReceiveItems.forEach(item -> { + vo.setEnterTotalPrices(vo.getEnterTotalPrices().add(item.getAcceptedQuantity().multiply(item.getUnitPrice()))); + }); + vo.setEnterTotalPrices(vo.getEnterTotalPrices().setScale(4, BigDecimal.ROUND_HALF_UP)); + // 获取上月入库数据 + List oldMatMaterialReceiveItems = materialReceiveItemService.getBaseMapper().selectList(new LambdaQueryWrapper() + .eq(MatMaterialReceiveItem::getProjectId, projectId) + .ne(MatMaterialReceiveItem::getAcceptedQuantity, BigDecimal.ZERO) + .between(MatMaterialReceiveItem::getCreateTime, lastMonthFirstDay, lastMonthLastDay)); + if (CollUtil.isEmpty(oldMatMaterialReceiveItems)){ + vo.setOldEnterTotalPrices(BigDecimal.ZERO); + } + // 计算上月入库金额 + oldMatMaterialReceiveItems.forEach(item -> { + vo.setOldEnterTotalPrices(vo.getOldEnterTotalPrices().add(item.getAcceptedQuantity().multiply(item.getUnitPrice()))); + }); + vo.setOldEnterTotalPrices(vo.getOldEnterTotalPrices().setScale(4, BigDecimal.ROUND_HALF_UP)); + // 获取当月出库数据 + List matMaterialIssueItems = materialIssueItemService.getBaseMapper() + .selectList(new LambdaQueryWrapper() + .eq(MatMaterialIssueItem::getProjectId, projectId) + .ne(MatMaterialIssueItem::getIssuedQuantity, BigDecimal.ZERO) + .between(MatMaterialIssueItem::getCreateTime, monthStart, currentTime)); + + //计算本月出库金额 + if (CollUtil.isEmpty(matMaterialIssueItems)){ + vo.setLeaveTotalPrices(BigDecimal.ZERO); + } + matMaterialIssueItems.forEach(item -> { + vo.setLeaveTotalPrices(vo.getLeaveTotalPrices().add(item.getIssuedQuantity().multiply(item.getUnitPrice()))); + }); + vo.setLeaveTotalPrices(vo.getLeaveTotalPrices().setScale(4, BigDecimal.ROUND_HALF_UP)); + // 获取上月出库数据 + List oldMatMaterialIssueItems = materialIssueItemService.getBaseMapper() + .selectList(new LambdaQueryWrapper() + .eq(MatMaterialIssueItem::getProjectId, projectId) + .ne(MatMaterialIssueItem::getIssuedQuantity, BigDecimal.ZERO) + .between(MatMaterialIssueItem::getCreateTime, lastMonthFirstDay, lastMonthLastDay)); + //计算上月出库金额 + if (CollUtil.isEmpty(oldMatMaterialIssueItems)){ + vo.setOldLeaveTotalPrices(BigDecimal.ZERO); + } + oldMatMaterialIssueItems.forEach(item -> { + vo.setOldLeaveTotalPrices(vo.getOldLeaveTotalPrices().add(item.getIssuedQuantity().multiply(item.getUnitPrice()))); + }); + vo.setOldLeaveTotalPrices(vo.getOldLeaveTotalPrices().setScale(4, BigDecimal.ROUND_HALF_UP)); + //获取总入库存金额 入库 * 单价 + List totalMatMaterialReceiveItems = materialReceiveItemService.getBaseMapper().selectList(new LambdaQueryWrapper().eq(MatMaterialReceiveItem::getProjectId, projectId)); + if (CollUtil.isEmpty(totalMatMaterialReceiveItems)){ + vo.setInventoryTotalPrices(BigDecimal.ZERO); + } + totalMatMaterialReceiveItems.forEach(item -> { + vo.setInventoryTotalPrices(vo.getInventoryTotalPrices().add(item.getAcceptedQuantity().multiply(item.getUnitPrice()))); + }); + vo.setInventoryTotalPrices(vo.getInventoryTotalPrices().setScale(4, BigDecimal.ROUND_HALF_UP)); + // 获取总出库金额 出库 * 单价 + List totalMatMaterialIssueItems = materialIssueItemService.getBaseMapper().selectList(new LambdaQueryWrapper().eq(MatMaterialIssueItem::getProjectId, projectId)); + if (CollUtil.isEmpty(totalMatMaterialIssueItems)){ + vo.setOutTotalPrices(BigDecimal.ZERO); + } + totalMatMaterialIssueItems.forEach(item -> { + vo.setOutTotalPrices(vo.getOutTotalPrices().add(item.getIssuedQuantity().multiply(item.getUnitPrice()))); + }); + vo.setOutTotalPrices(vo.getOutTotalPrices().setScale(4, BigDecimal.ROUND_HALF_UP)); + + // 获取施工图一览大类名下所有小类名 + List limitLists = billofquantitiesLimitListService.getBaseMapper().selectList(new LambdaQueryWrapper() + .eq(BusBillofquantitiesLimitList::getProjectId, projectId) + .eq(BusBillofquantitiesLimitList::getPid, "0") + .eq(BusBillofquantitiesLimitList::getType, "3") + .eq(BusBillofquantitiesLimitList::getName, WuZhiEnum.LBQ.getTypeName()).or() + .eq(BusBillofquantitiesLimitList::getName, WuZhiEnum.GFZJ.getTypeName()).or() + .eq(BusBillofquantitiesLimitList::getName, WuZhiEnum.XB.getTypeName()).or() + .eq(BusBillofquantitiesLimitList::getName, WuZhiEnum.HWG.getTypeName()) + ); + List lBQNames = new ArrayList<>(); + List sFZJNames = new ArrayList<>(); + List xBNames = new ArrayList<>(); + List hWGNames = new ArrayList<>(); + for (BusBillofquantitiesLimitList item : limitLists) { + if (item.getName().equals(WuZhiEnum.LBQ.getTypeName())) { + lBQNames.add(item.getName()); + continue; + } + if (item.getName().equals(WuZhiEnum.GFZJ.getTypeName())) { + sFZJNames.add(item.getName()); + continue; + } + if (item.getName().equals(WuZhiEnum.XB.getTypeName())) { + xBNames.add(item.getName()); + continue; + } + if (item.getName().equals(WuZhiEnum.HWG.getTypeName())) { + hWGNames.add(item.getName()); + } + } + //获取库存逆变器总价 + BigDecimal inventoryInverterTotalPrices = materialsService.selectTotalPricesByNames(projectId,lBQNames); + vo.setInventoryInverterTotalPrices(inventoryInverterTotalPrices); + //获取库存箱变总价 + BigDecimal inventoryBoxTransformerTotalPrices = materialsService.selectTotalPricesByNames(projectId,xBNames); + vo.setInventoryBoxTransformerTotalPrices(inventoryBoxTransformerTotalPrices); + //获取库存光伏支架总价 + BigDecimal inventoryPhotovoltaicSupportTotalPrices = materialsService.selectTotalPricesByNames(projectId,sFZJNames); + vo.setInventoryPhotovoltaicSupportTotalPrices(inventoryPhotovoltaicSupportTotalPrices); + //获取库存环网柜总价 + BigDecimal inventoryCircuitBreakerTotalPrices = materialsService.selectTotalPricesByNames(projectId,hWGNames); + vo.setInventoryCircuitBreakerTotalPrices(inventoryCircuitBreakerTotalPrices); + //获取当前库存总价 + BigDecimal nowInventoryTotalPrices = materialsService.selectTotalPrices(projectId); + vo.setNowInventoryTotalPrices(nowInventoryTotalPrices); + return vo; + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/BusMaterialbatchdemandplan.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/BusMaterialbatchdemandplan.java index 8c33e469..41c86c36 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/BusMaterialbatchdemandplan.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/BusMaterialbatchdemandplan.java @@ -94,6 +94,12 @@ public class BusMaterialbatchdemandplan extends BaseEntity { */ private BigDecimal demandQuantity; + + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 计划到场时间 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/bo/BusMaterialbatchdemandplanBo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/bo/BusMaterialbatchdemandplanBo.java index 90bf40fa..ea5b474e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/bo/BusMaterialbatchdemandplanBo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/bo/BusMaterialbatchdemandplanBo.java @@ -93,6 +93,11 @@ public class BusMaterialbatchdemandplanBo extends BaseEntity { */ private BigDecimal demandQuantity; + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 计划到场时间 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/vo/BusMaterialbatchdemandplanVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/vo/BusMaterialbatchdemandplanVo.java index 32443c22..dbdd4c4b 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/vo/BusMaterialbatchdemandplanVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/domain/vo/BusMaterialbatchdemandplanVo.java @@ -118,6 +118,11 @@ public class BusMaterialbatchdemandplanVo implements Serializable { @ExcelProperty(value = "需求数量") private BigDecimal demandQuantity; + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 计划到场时间 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/IBusMrpBaseService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/IBusMrpBaseService.java index f2bf59e0..3506622e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/IBusMrpBaseService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/IBusMrpBaseService.java @@ -1,5 +1,7 @@ package org.dromara.cailiaoshebei.service; +import org.dromara.bigscreen.domain.vo.designAndArrivalComparisonVo; +import org.dromara.bigscreen.domain.vo.wzxqysjdhdbVo; import org.dromara.cailiaoshebei.domain.bo.BusMrpBaseReq; import org.dromara.cailiaoshebei.domain.dto.BusMrpDto; import org.dromara.cailiaoshebei.domain.dto.BusMrpExportDto; @@ -90,4 +92,14 @@ public interface IBusMrpBaseService extends IService{ Map remaining(Long projectId,Long limitListId,Long mrpBaseId); List getListByName(BusMrpBaseReq req); + + /** + * 设计量与到货量对比 + */ + List designAndArrivalComparison(Long projectId); + + /** + * 物资需求与实际到货对比 + */ + List wzxqysjdhdb(Long projectId); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/IBusPurchaseDocService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/IBusPurchaseDocService.java index e0568498..4263c891 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/IBusPurchaseDocService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/IBusPurchaseDocService.java @@ -105,4 +105,6 @@ public interface IBusPurchaseDocService extends IService { * @return 是否修改成功 */ Boolean updateFeedback(FeedbackDto dto); + + List purchaseNote(Long projectId); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusMrpBaseServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusMrpBaseServiceImpl.java index b2ae9a83..57f291b8 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusMrpBaseServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusMrpBaseServiceImpl.java @@ -4,7 +4,10 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.dromara.bigscreen.domain.vo.designAndArrivalComparisonVo; +import org.dromara.bigscreen.domain.vo.wzxqysjdhdbVo; import org.dromara.cailiaoshebei.domain.BusMaterialbatchdemandplan; import org.dromara.cailiaoshebei.domain.BusPlanDocAssociation; import org.dromara.cailiaoshebei.domain.bo.BusMaterialbatchdemandplanBo; @@ -32,10 +35,15 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.utils.excel.ExcelDynamicReader; import org.dromara.design.domain.BusBillofquantities; import org.dromara.design.service.IBusBillofquantitiesService; +import org.dromara.materials.domain.MatMaterialReceiveItem; +import org.dromara.materials.service.IMatMaterialReceiveItemService; import org.dromara.tender.domain.BusBillofquantitiesLimitList; import org.dromara.tender.domain.BusTenderPlanningLimitList; +import org.dromara.tender.enums.LimitListTypeEnum; import org.dromara.tender.service.IBusBillofquantitiesLimitListService; import org.dromara.tender.service.IBusTenderPlanningLimitListService; +import org.jetbrains.annotations.NotNull; +import org.springframework.context.annotation.Lazy; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.dromara.cailiaoshebei.domain.bo.BusMrpBaseBo; @@ -70,6 +78,10 @@ public class BusMrpBaseServiceImpl extends ServiceImpl designAndArrivalComparison(Long projectId) { + // 获取施工图一览的所有材料数据 + List limitLists = busBillofquantitiesService.getBaseMapper().selectList(new LambdaQueryWrapper() + .eq(BusBillofquantitiesLimitList::getProjectId, projectId) + .eq(BusBillofquantitiesLimitList::getType, LimitListTypeEnum.SPECIAL.getCode()) + .isNotNull(BusBillofquantitiesLimitList::getQuantity)); + Map wuZiMap = getWuZiMap(projectId); + // 根据批次需求计划的物资id获取到施工图一览对应数据 + List list = new ArrayList<>(); + limitLists.forEach(limitList -> { + designAndArrivalComparisonVo vo = new designAndArrivalComparisonVo(); + vo.setName(limitList.getName()); + vo.setSpecification(limitList.getSpecification()); + vo.setUnit(limitList.getUnit()); + vo.setDesignTotalPrices(limitList.getQuantity()); + vo.setArrivalTotalPrices(wuZiMap.getOrDefault(limitList.getId(), BigDecimal.ZERO)); + list.add(vo); + }); + return list; + } + + @NotNull + private Map getWuZiMap(Long projectId) { + // 获取所有入库数据 mat_material_receive_item + List matMaterialReceiveItems = matMaterialReceiveItemService.getBaseMapper() + .selectList(new LambdaQueryWrapper() + .eq(MatMaterialReceiveItem::getProjectId, projectId)); + //将相同计划批次数据进行分组合并 + Set planIds = matMaterialReceiveItems.stream() + .map(MatMaterialReceiveItem::getPlanId) + .collect(Collectors.toSet()); + Map planMap = matMaterialReceiveItems.stream() + .collect(Collectors.groupingBy( + MatMaterialReceiveItem::getPlanId, + Collectors.reducing(BigDecimal.ZERO, MatMaterialReceiveItem::getQuantity, BigDecimal::add) + )); + // 根据入库数据反查批次需求计划数据 bus_materialbatchdemandplan + List materialbatchdemandplans = planservice.getBaseMapper().selectList(new LambdaQueryWrapper() + .eq(BusMaterialbatchdemandplan::getProjectId, projectId) + .in(BusMaterialbatchdemandplan::getId, planIds)); + Map wuZiMap = new HashMap<>(); + materialbatchdemandplans.forEach(materialbatchdemandplan -> { + //merge()方法如果键存在则合并值,否则直接放入 + wuZiMap.merge( + materialbatchdemandplan.getSuppliespriceId(), + planMap.get(materialbatchdemandplan.getId()), + BigDecimal::add + ); + }); + return wuZiMap; + } + + @Override + public List wzxqysjdhdb(Long projectId) { + // 获取施工图一览的所有材料数据 + List limitLists = busBillofquantitiesService.getBaseMapper().selectList(new LambdaQueryWrapper() + .eq(BusBillofquantitiesLimitList::getProjectId, projectId) + .eq(BusBillofquantitiesLimitList::getType, LimitListTypeEnum.SPECIAL.getCode()) + .isNotNull(BusBillofquantitiesLimitList::getQuantity)); + Map wuZiMap = getWuZiMap(projectId); + // 根据批次需求计划的物资id获取到施工图一览对应数据 + List list = new ArrayList<>(); + limitLists.forEach(limitList -> { + wzxqysjdhdbVo vo = new wzxqysjdhdbVo(); + vo.setName(limitList.getName()); + vo.setSpecification(limitList.getSpecification()); + vo.setDesignTotalPrices(limitList.getQuantity()); + vo.setArrivalTotalPrices(wuZiMap.getOrDefault(limitList.getId(), BigDecimal.ZERO)); + list.add(vo); + }); + return list; + } + /** * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等) * 正常使用只需#processEvent.flowCode=='leave1' diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusPurchaseDocServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusPurchaseDocServiceImpl.java index 00f3eef6..8d347e46 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusPurchaseDocServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/cailiaoshebei/service/impl/BusPurchaseDocServiceImpl.java @@ -575,6 +575,15 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl purchaseNote(Long projectId) { + return baseMapper.selectVoList(new LambdaQueryWrapper() + .eq(BusPurchaseDoc::getProjectId, projectId) + .eq(BusPurchaseDoc::getDocType, "1") + .eq(BusPurchaseDoc::getStatus, BusinessStatusEnum.FINISH.getStatus()) + .orderByDesc(BusPurchaseDoc::getCreateTime)); + } + /** * 根据实体获取替换数据 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialIssueItem.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialIssueItem.java index b25fd8cc..feef1847 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialIssueItem.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialIssueItem.java @@ -54,6 +54,11 @@ public class MatMaterialIssueItem extends BaseEntity { */ private String unit; + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 库存 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialReceiveItem.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialReceiveItem.java index 0062099b..a904fac3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialReceiveItem.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialReceiveItem.java @@ -59,6 +59,11 @@ public class MatMaterialReceiveItem extends BaseEntity { */ private BigDecimal quantity; + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 验收 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterials.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterials.java index 8cd58fa9..0d619716 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterials.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterials.java @@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode; import org.dromara.common.mybatis.core.domain.BaseEntity; import java.io.Serial; +import java.math.BigDecimal; /** * 材料名称对象 mat_materials @@ -68,6 +69,11 @@ public class MatMaterials extends BaseEntity { */ private String weightId; + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialissueitem/MatMaterialIssueItemDto.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialissueitem/MatMaterialIssueItemDto.java index 36c77066..4fc59f56 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialissueitem/MatMaterialIssueItemDto.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialissueitem/MatMaterialIssueItemDto.java @@ -45,6 +45,11 @@ public class MatMaterialIssueItemDto { @NotBlank(message = "单位不能为空") private String unit; + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 库存 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialissueitem/MatMaterialIssueItemWordDto.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialissueitem/MatMaterialIssueItemWordDto.java index d47d7602..4cb744b3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialissueitem/MatMaterialIssueItemWordDto.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialissueitem/MatMaterialIssueItemWordDto.java @@ -4,6 +4,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.math.BigDecimal; + @Data @NoArgsConstructor @AllArgsConstructor @@ -13,6 +15,7 @@ public class MatMaterialIssueItemWordDto { private String name; // 名称 private String specification; // 规格 private String unit; // 单位 + private BigDecimal unitPrice; //单价 private Integer stockQuantity; // 库存数量 private Integer issuedQuantity; // 领取数量 private Integer remainingQuantity;// 剩余数量 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialreceiveitem/MatMaterialReceiveItemDto.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialreceiveitem/MatMaterialReceiveItemDto.java index 052bcceb..b356e076 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialreceiveitem/MatMaterialReceiveItemDto.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialreceiveitem/MatMaterialReceiveItemDto.java @@ -50,6 +50,11 @@ public class MatMaterialReceiveItemDto { */ private BigDecimal shortageQuantity; + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialreceiveitem/MatMaterialReceiveItemWordDto.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialreceiveitem/MatMaterialReceiveItemWordDto.java index 3509b27a..3eb45e7c 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialreceiveitem/MatMaterialReceiveItemWordDto.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialreceiveitem/MatMaterialReceiveItemWordDto.java @@ -4,6 +4,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.math.BigDecimal; + /** * @author lilemy * @date 2025/7/6 14:04 @@ -38,6 +40,11 @@ public class MatMaterialReceiveItemWordDto { */ private Integer quantity; + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 验收 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materials/MatMaterialsCreateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materials/MatMaterialsCreateReq.java index eacea168..922ec9f5 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materials/MatMaterialsCreateReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materials/MatMaterialsCreateReq.java @@ -4,6 +4,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Map; /** @@ -61,6 +62,11 @@ public class MatMaterialsCreateReq implements Serializable { */ private String weightId; + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materials/MatMaterialsQueryReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materials/MatMaterialsQueryReq.java index b861e7de..1e688ca8 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materials/MatMaterialsQueryReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materials/MatMaterialsQueryReq.java @@ -4,6 +4,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; /** * @author lilemy @@ -50,6 +51,11 @@ public class MatMaterialsQueryReq implements Serializable { */ private String weightId; + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 预计材料数量 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materials/MatMaterialsUpdateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materials/MatMaterialsUpdateReq.java index faf70848..90958f0f 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materials/MatMaterialsUpdateReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materials/MatMaterialsUpdateReq.java @@ -4,6 +4,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Map; /** @@ -61,6 +62,12 @@ public class MatMaterialsUpdateReq implements Serializable { */ private String weightId; + + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialissueitem/MatMaterialIssueItemVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialissueitem/MatMaterialIssueItemVo.java index 35274c99..9112b656 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialissueitem/MatMaterialIssueItemVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialissueitem/MatMaterialIssueItemVo.java @@ -52,6 +52,12 @@ public class MatMaterialIssueItemVo implements Serializable { */ private String unit; + + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 库存 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialreceiveitem/MatMaterialReceiveItemVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialreceiveitem/MatMaterialReceiveItemVo.java index 340d8448..d9b2f75e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialreceiveitem/MatMaterialReceiveItemVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialreceiveitem/MatMaterialReceiveItemVo.java @@ -52,6 +52,11 @@ public class MatMaterialReceiveItemVo implements Serializable { */ private String unit; + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 数量 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materials/MatMaterialsNumberVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materials/MatMaterialsNumberVo.java index 0456be65..da13ff0a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materials/MatMaterialsNumberVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materials/MatMaterialsNumberVo.java @@ -37,6 +37,11 @@ public class MatMaterialsNumberVo implements Serializable { */ private String weightId; + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 库存数量 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materials/MatMaterialsVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materials/MatMaterialsVo.java index 82557233..88b17429 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materials/MatMaterialsVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materials/MatMaterialsVo.java @@ -11,6 +11,7 @@ import org.dromara.tender.domain.vo.TenderSupplierInputVo; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; import java.util.Map; @@ -93,6 +94,11 @@ public class MatMaterialsVo implements Serializable { @ExcelProperty(value = "备注") private String remark; + /** + * 单价 + */ + private BigDecimal unitPrice; + /** * 预计材料数量 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/IMatMaterialsService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/IMatMaterialsService.java index 29358d15..284e4b18 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/IMatMaterialsService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/IMatMaterialsService.java @@ -3,6 +3,7 @@ package org.dromara.materials.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import org.dromara.common.core.domain.R; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.materials.domain.MatMaterials; @@ -16,6 +17,7 @@ import org.dromara.materials.domain.dto.materials.MatMaterialsQueryReq; import org.dromara.materials.domain.dto.materials.MatMaterialsUpdateReq; import org.dromara.materials.domain.vo.materials.*; +import java.math.BigDecimal; import java.util.Collection; import java.util.List; @@ -187,4 +189,26 @@ public interface IMatMaterialsService extends IService { * @return 材料库存数据列表 */ List queryExcelList(MatMaterialsQueryReq req); + + /** + * 根据项目id和材料名称获取当前库存总价 + * @param projectId + * @param lBQNames + * @return + */ + BigDecimal selectTotalPricesByNames(Long projectId, List lBQNames); + + /** + * 根据项目id获取当前库存总价 + * @param projectId + * @return + */ + BigDecimal selectTotalPrices(Long projectId); + + /** + * 大屏获取物资跟踪管理台账 + * @param projectId + * @return + */ + List listUseDetail(Long projectId); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialIssueServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialIssueServiceImpl.java index b27faa28..f800b99c 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialIssueServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialIssueServiceImpl.java @@ -565,6 +565,7 @@ public class MatMaterialIssueServiceImpl extends ServiceImpl lBQNames) { + if (CollUtil.isEmpty(lBQNames)) { + return BigDecimal.ZERO; + } + // 根据材料名称获取材料列表数据 + List matMaterials = baseMapper.selectList(new LambdaQueryWrapper().eq(MatMaterials::getProjectId, projectId).in(MatMaterials::getMaterialsName, lBQNames)); + if (CollUtil.isEmpty(matMaterials)) { + return BigDecimal.ZERO; + } + // 获取材料id和单价 + Map map = matMaterials.stream() + .collect(Collectors.toMap( + MatMaterials::getId, + MatMaterials::getUnitPrice + )); + // 获取材料id + List ids = matMaterials.stream().map(MatMaterials::getId).toList(); + // 获取材料库存数据 + List inventories = materialsInventoryService.selectLatestByMaterialIds(ids); + if (CollUtil.isEmpty(inventories)){ + return BigDecimal.ZERO; + } + // 计算材料总价 + return inventories.stream() + .map(inventory -> map.getOrDefault(inventory.getMaterialsId(), BigDecimal.ZERO) + .multiply(BigDecimal.valueOf(inventory.getNumber()))) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + @Override + public BigDecimal selectTotalPrices(Long projectId) { + // 根据材料名称获取材料列表数据 + List matMaterials = baseMapper.selectList(new LambdaQueryWrapper().eq(MatMaterials::getProjectId, projectId)); + if (CollUtil.isEmpty(matMaterials)) { + return BigDecimal.ZERO; + } + // 获取材料id和单价 + Map map = matMaterials.stream() + .collect(Collectors.toMap( + MatMaterials::getId, + MatMaterials::getUnitPrice + )); + // 获取材料id + List ids = matMaterials.stream().map(MatMaterials::getId).toList(); + // 获取材料库存数据 + List inventories = materialsInventoryService.selectLatestByMaterialIds(ids); + if (CollUtil.isEmpty(inventories)){ + return BigDecimal.ZERO; + } + // 计算材料总价 + return inventories.stream() + .map(inventory -> map.getOrDefault(inventory.getMaterialsId(), BigDecimal.ZERO) + .multiply(BigDecimal.valueOf(inventory.getNumber()))) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + @Override + public List listUseDetail(Long projectId) { + // 查询数据库 + + List matMaterials = baseMapper.selectList(new LambdaQueryWrapper().eq(MatMaterials::getProjectId, projectId)); + if (CollUtil.isEmpty(matMaterials)) { + return List.of(); + } + // 查询材料出入库列表 + List ids = matMaterials.stream().map(MatMaterials::getId).toList(); + List materialsInventoryList = materialsInventoryService.lambdaQuery() + .in(MatMaterialsInventory::getMaterialsId, ids) + .list(); + List putList = materialsInventoryList.stream() + .filter(inventory -> inventory.getOutPut().equals(MatMaterialsInventoryOutPutEnum.PUT.getValue())) + .toList(); + // 查询使用列表 + List outList = materialsInventoryList.stream() + .filter(inventory -> inventory.getOutPut().equals(MatMaterialsInventoryOutPutEnum.OUT.getValue())) + .toList(); + List useList = new ArrayList<>(); + if (CollUtil.isNotEmpty(outList)) { + List outIds = outList.stream().map(MatMaterialsInventory::getId).toList(); + useList = materialsUseRecordService.lambdaQuery() + .in(MatMaterialsUseRecord::getInventoryId, outIds) + .list(); + } + // 查询仓库列表 + Set warehouseIds = matMaterials.stream().map(MatMaterials::getWarehouseId).collect(Collectors.toSet()); + List warehouseList = new ArrayList<>(); + if (CollUtil.isNotEmpty(warehouseIds)) { + warehouseList = warehouseService.lambdaQuery() + .in(MatWarehouse::getId, warehouseIds) + .list(); + } + List useDetailList = this.getUseDetailList(matMaterials, putList, outList, useList, warehouseList); + return useDetailList; + + } + /** * 构建一行导出数据 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/websocket/websocket/service/BigScreenWebSocketServer.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/websocket/websocket/service/BigScreenWebSocketServer.java index 7ad43336..ab35926a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/websocket/websocket/service/BigScreenWebSocketServer.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/websocket/websocket/service/BigScreenWebSocketServer.java @@ -4,20 +4,32 @@ import cn.hutool.json.JSONUtil; import jakarta.websocket.*; import jakarta.websocket.server.ServerEndpoint; import lombok.extern.slf4j.Slf4j; +import org.dromara.bigscreen.domain.vo.InventoryStructureAnalysisVo; +import org.dromara.bigscreen.domain.vo.designAndArrivalComparisonVo; +import org.dromara.bigscreen.domain.vo.wzxqysjdhdbVo; +import org.dromara.bigscreen.service.IMaterialsManagementService; +import org.dromara.cailiaoshebei.domain.vo.BusPurchaseDocVo; +import org.dromara.cailiaoshebei.service.IBusMrpBaseService; +import org.dromara.cailiaoshebei.service.IBusPurchaseDocService; import org.dromara.common.core.utils.SpringUtils; import org.dromara.gps.domain.bo.GpsEquipmentSonBo; import org.dromara.gps.domain.vo.GpsEquipmentSonVo; import org.dromara.gps.service.IGpsEquipmentSonService; +import org.dromara.materials.domain.vo.materials.MatMaterialsUseDetailVo; +import org.dromara.materials.service.IMatMaterialsService; import org.dromara.websocket.websocket.domain.vo.VehicleVo; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; +import static kotlin.reflect.jvm.internal.impl.builtins.StandardNames.FqNames.list; + /** * 大屏 WebSocket 服务端(支持订阅消息) * 端点路径:/websocket/bigScreen @@ -72,25 +84,81 @@ public class BigScreenWebSocketServer { try { String[] split = currentSubscriptionId.split("-"); //todo 填充不同类型大屏获取基础数据的方法判断 - IGpsEquipmentSonService service = SpringUtils.getBean(IGpsEquipmentSonService.class); - GpsEquipmentSonBo bo = new GpsEquipmentSonBo(); - bo.setUserId(Long.parseLong(split[0])); - bo.setTripId(Long.parseLong(split[1])); - List list = service.getNewVehicleList(bo); - if (list == null || list.isEmpty()) { + IMaterialsManagementService managementService = SpringUtils.getBean(IMaterialsManagementService.class); + IBusPurchaseDocService purchaseDocService = SpringUtils.getBean(IBusPurchaseDocService.class); + IBusMrpBaseService mrpBaseService = SpringUtils.getBean(IBusMrpBaseService.class); + IMatMaterialsService materialsService = SpringUtils.getBean(IMatMaterialsService.class); + Long projectId = Long.parseLong(split[0]); + long type = Long.parseLong(split[1]); + List> maps = new ArrayList<>(); + switch ((int) type){ + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 5: + if (materialsService != null){ + InventoryStructureAnalysisVo vo = managementService.inventoryStructureAnalysis(projectId); + if (vo != null){ + Map map = new HashMap<>(); + map.put("type","inventoryStructureAnalysis"); + map.put("data", JSONUtil.toJsonStr(vo)); + maps.add(map); + } + } + if (purchaseDocService != null){ + List purchaseDocVos = purchaseDocService.purchaseNote(projectId); + if (purchaseDocVos != null && !purchaseDocVos.isEmpty()){ + Map map = new HashMap<>(); + map.put("type","purchaseNote"); + map.put("data", JSONUtil.toJsonStr(purchaseDocVos)); + maps.add(map); + } + } + if (mrpBaseService != null){ + List designAndArrivalComparisonVos = mrpBaseService.designAndArrivalComparison(projectId); + if (designAndArrivalComparisonVos != null && !designAndArrivalComparisonVos.isEmpty()){ + Map map = new HashMap<>(); + map.put("type","designAndArrivalComparison"); + map.put("data", JSONUtil.toJsonStr(designAndArrivalComparisonVos)); + maps.add(map); + } + List wzxqysjdhdbVos = mrpBaseService.wzxqysjdhdb(projectId); + if (wzxqysjdhdbVos != null && !wzxqysjdhdbVos.isEmpty()){ + Map map = new HashMap<>(); + map.put("type","wzxqysjdhdb"); + map.put("data", JSONUtil.toJsonStr(wzxqysjdhdbVos)); + maps.add(map); + } + } + if (materialsService != null){ + List useDetailVos = materialsService.listUseDetail(projectId); + if (useDetailVos != null && !useDetailVos.isEmpty()){ + Map map = new HashMap<>(); + map.put("type","listUseDetail"); + map.put("data", JSONUtil.toJsonStr(useDetailVos)); + maps.add(map); + } + } + break; + case 6: + break; + case 7: + break; + default: + break; + } + if (maps.isEmpty()) { session.getBasicRemote().sendText("初始化数据为空"); log.warn("会话[{}]未获取到初始化数据", session.getId()); return; } - List vehicleVos = new ArrayList<>(); - for (GpsEquipmentSonVo ueClient : list) { - VehicleVo vo = new VehicleVo(); - vo.setLocLatitude(ueClient.getLocLatitude()); - vo.setLocLongitude(ueClient.getLocLongitude()); - vehicleVos.add(vo); - } - session.getBasicRemote().sendText(JSONUtil.toJsonStr(vehicleVos)); - log.info("📤 已向会话[{}]推送初始化数据,长度:{}字节", session.getId(), vehicleVos.size()); + session.getBasicRemote().sendText(JSONUtil.toJsonStr(maps)); + log.info("📤 已向会话[{}]推送初始化数据,长度:{}字节", session.getId(), maps.size()); } catch (Exception e) { log.error("会话[{}]初始化数据处理失败", session.getId(), e); try {