From 476c19019e54e1cc97100c2b2ff9658a30419d29 Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Fri, 22 Aug 2025 18:46:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=A9=E8=B5=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/物资采购联系单模版.docx | Bin 19654 -> 19699 bytes .../core/service/SaPermissionImpl.java | 18 +- .../controller/MoneyBigScreenController.java | 107 ++++---- .../ProjectBigScreenController.java | 26 +- .../service/MoneyBigScreenService.java | 18 ++ .../impl/MoneyBigScreenServiceImpl.java | 41 ++++ .../controller/MatMaterialsController.java | 13 +- .../MatMaterialsUseRecordController.java | 93 +++++++ .../domain/MatMaterialsInventory.java | 5 - .../domain/MatMaterialsUseRecord.java | 62 +++++ .../domain/bo/MatMaterialsUseRecordBo.java | 65 +++++ .../MatMaterialIssueCreateReq.java | 11 +- .../MatMaterialIssueItemDto.java | 14 ++ .../MatMaterialsInventoryCreateReq.java | 5 - .../MatMaterialsInventoryQueryReq.java | 6 - .../MatMaterialsInventoryUpdateReq.java | 5 - .../MatMaterialsUseRecordCreateReq.java | 50 ++++ .../MatMaterialsUseRecordQueryReq.java | 42 ++++ .../MatMaterialsUseRecordUpdateReq.java | 40 +++ .../vo/materials/MatMaterialsNumberVo.java | 43 ++++ .../MatMaterialsInventoryVo.java | 6 - .../MatMaterialsUseRecordVo.java | 70 ++++++ .../mapper/MatMaterialsInventoryMapper.java | 28 ++- .../mapper/MatMaterialsUseRecordMapper.java | 15 ++ .../IMatMaterialsInventoryService.java | 8 + .../service/IMatMaterialsService.java | 10 +- .../IMatMaterialsUseRecordService.java | 97 ++++++++ .../impl/MatMaterialIssueServiceImpl.java | 26 ++ .../MatMaterialsInventoryServiceImpl.java | 13 +- .../service/impl/MatMaterialsServiceImpl.java | 50 +++- .../MatMaterialsUseRecordServiceImpl.java | 229 ++++++++++++++++++ .../progress/domain/PgsProgressCategory.java | 5 + .../domain/PgsProgressCategoryTemplate.java | 5 + .../impl/PgsProgressCategoryServiceImpl.java | 22 ++ ...gsProgressCategoryTemplateServiceImpl.java | 22 ++ .../materials/MatMaterialsUseRecordMapper.xml | 7 + xinnengyuan/script/sql/menuInitValue.sql | 20 ++ xinnengyuan/script/sql/xinnengyuan.sql | 20 ++ 38 files changed, 1201 insertions(+), 116 deletions(-) create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/controller/MatMaterialsUseRecordController.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialsUseRecord.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/bo/MatMaterialsUseRecordBo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsuserecord/MatMaterialsUseRecordCreateReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsuserecord/MatMaterialsUseRecordQueryReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsuserecord/MatMaterialsUseRecordUpdateReq.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materials/MatMaterialsNumberVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialsuserecord/MatMaterialsUseRecordVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/mapper/MatMaterialsUseRecordMapper.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/IMatMaterialsUseRecordService.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsUseRecordServiceImpl.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/materials/MatMaterialsUseRecordMapper.xml diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/template/物资采购联系单模版.docx b/xinnengyuan/ruoyi-admin/src/main/resources/template/物资采购联系单模版.docx index f0785a2ab532a163cce6c8c38139dd5d6635637c..977246248347255cbe7609fe524e09d6b6819c6d 100644 GIT binary patch delta 12838 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 Q(7U8`8A_-)iT}j^FBXo1z5oCK delta 12743 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 getPermissionList(Object loginId, String loginType) { -// LoginUser loginUser = LoginHelper.getLoginUser(); -// UserType userType = UserType.getUserType(loginUser.getUserType()); -// if (userType == UserType.SYS_USER) { -// return new ArrayList<>(loginUser.getMenuPermission()); -// } else if (userType == UserType.APP_USER) { -// // 其他端 自行根据业务编写 -// } -// return new ArrayList<>(); - return Collections.singletonList("*"); + LoginUser loginUser = LoginHelper.getLoginUser(); + UserType userType = UserType.getUserType(loginUser.getUserType()); + if (userType == UserType.SYS_USER) { + return new ArrayList<>(loginUser.getMenuPermission()); + } else if (userType == UserType.APP_USER) { + // 其他端 自行根据业务编写 + } + return new ArrayList<>(); +// return Collections.singletonList("*"); } /** diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MoneyBigScreenController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MoneyBigScreenController.java index 6f057677..c4841859 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MoneyBigScreenController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MoneyBigScreenController.java @@ -1,14 +1,12 @@ package org.dromara.bigscreen.controller; import cn.dev33.satoken.annotation.SaCheckPermission; -import jakarta.annotation.Resource; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; import org.dromara.bigscreen.domain.vo.*; import org.dromara.bigscreen.service.MoneyBigScreenService; import org.dromara.common.core.domain.R; -import org.dromara.project.domain.vo.project.BusProjectGisVo; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; import org.dromara.ctr.domain.CtrExpensesContract; import org.dromara.ctr.domain.CtrIncomeContract; import org.dromara.ctr.service.ICtrExpensesContractService; @@ -17,18 +15,23 @@ import org.dromara.out.domain.OutSettlementValueOwner; import org.dromara.out.domain.OutSettlementValueSubcontract; import org.dromara.out.service.IOutSettlementValueOwnerService; import org.dromara.out.service.IOutSettlementValueSubcontractService; +import org.dromara.project.domain.vo.project.BusProjectGisVo; +import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; +import org.dromara.project.domain.vo.project.BusProjectWeatherVo; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.time.YearMonth; -import java.util.*; - import java.math.BigDecimal; import java.time.LocalDate; +import java.time.YearMonth; import java.time.temporal.TemporalAdjusters; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -59,7 +62,7 @@ public class MoneyBigScreenController { * 查询项目位置列表 */ @SaCheckPermission("money:bigScreen:projectGis") - @RequestMapping("/project/gis") + @GetMapping("/project/gis") public R> getProjectGis() { return R.ok(moneyBigScreenService.getProjectGis()); } @@ -103,15 +106,15 @@ public class MoneyBigScreenController { ) )); - BigDecimal actualAmount =BigDecimal.ZERO; + BigDecimal actualAmount = BigDecimal.ZERO; for (Long projectId : projectMonthlyAmountMap.keySet()) { - CtrIncomeContract contract = incomeContractService.getOne(Wrappers.lambdaQuery(CtrIncomeContract.class) + CtrIncomeContract contract = incomeContractService.getOne(Wrappers.lambdaQuery(CtrIncomeContract.class) .eq(CtrIncomeContract::getProjectId, projectId) .last("limit 1") ); - if(contract != null){ + if (contract != null) { actualAmount = actualAmount.add(projectMonthlyAmountMap.get(projectId).multiply(contract.getPayRatio()).divide(HUNDRED)); } @@ -157,16 +160,16 @@ public class MoneyBigScreenController { ) )); - BigDecimal actualAmount =BigDecimal.ZERO; + BigDecimal actualAmount = BigDecimal.ZERO; - for (String contractCode: projectAmountMap.keySet()) { + for (String contractCode : projectAmountMap.keySet()) { - CtrExpensesContract contract = expensesContractService.getOne(Wrappers.lambdaQuery(CtrExpensesContract.class) + CtrExpensesContract contract = expensesContractService.getOne(Wrappers.lambdaQuery(CtrExpensesContract.class) .eq(CtrExpensesContract::getContractCode, contractCode) .last("limit 1") ); - if(contract != null){ + if (contract != null) { actualAmount = actualAmount.add(projectAmountMap.get(contractCode).multiply(contract.getPayRatio()).divide(HUNDRED)); } @@ -176,7 +179,6 @@ public class MoneyBigScreenController { } - /** * 收入合同分析 */ @@ -187,23 +189,23 @@ public class MoneyBigScreenController { List list = incomeContractService.list(); // 按金额区间统计数量 - Integer lessThan1M = (int)list.stream() + Integer lessThan1M = (int) list.stream() .filter(contract -> contract.getAmount() != null && contract.getAmount().compareTo(FIRST_PHASE) < 0) .count(); - Integer between1MAnd5M = (int)list.stream() + Integer between1MAnd5M = (int) list.stream() .filter(contract -> contract.getAmount() != null && contract.getAmount().compareTo(FIRST_PHASE) >= 0 && contract.getAmount().compareTo(SECOND_PHASE) < 0) .count(); - Integer between5MAnd10M = (int)list.stream() + Integer between5MAnd10M = (int) list.stream() .filter(contract -> contract.getAmount() != null && contract.getAmount().compareTo(SECOND_PHASE) >= 0 && contract.getAmount().compareTo(THIRD_PHASE) < 0) .count(); - Integer greaterThanOrEqualTo10M = (int)list.stream() + Integer greaterThanOrEqualTo10M = (int) list.stream() .filter(contract -> contract.getAmount() != null && contract.getAmount().compareTo(THIRD_PHASE) >= 0) .count(); @@ -221,23 +223,23 @@ public class MoneyBigScreenController { List list = expensesContractService.list(); // 按金额区间统计数量 - Integer lessThan1M = (int)list.stream() + Integer lessThan1M = (int) list.stream() .filter(contract -> contract.getAmount() != null && contract.getAmount().compareTo(FIRST_PHASE) < 0) .count(); - Integer between1MAnd5M = (int)list.stream() + Integer between1MAnd5M = (int) list.stream() .filter(contract -> contract.getAmount() != null && contract.getAmount().compareTo(FIRST_PHASE) >= 0 && contract.getAmount().compareTo(SECOND_PHASE) < 0) .count(); - Integer between5MAnd10M = (int)list.stream() + Integer between5MAnd10M = (int) list.stream() .filter(contract -> contract.getAmount() != null && contract.getAmount().compareTo(SECOND_PHASE) >= 0 && contract.getAmount().compareTo(THIRD_PHASE) < 0) .count(); - Integer greaterThanOrEqualTo10M = (int)list.stream() + Integer greaterThanOrEqualTo10M = (int) list.stream() .filter(contract -> contract.getAmount() != null && contract.getAmount().compareTo(THIRD_PHASE) >= 0) .count(); @@ -272,7 +274,7 @@ public class MoneyBigScreenController { //todo: 工程变更计算 不清楚逻辑 给定个假值 BigDecimal changeAmount = new BigDecimal("0.236"); - return R.ok(new MoneyTotalAmountVo(incomeTotalAmount, expensesTotalAmount,profitAmount,changeAmount)); + return R.ok(new MoneyTotalAmountVo(incomeTotalAmount, expensesTotalAmount, profitAmount, changeAmount)); } @@ -295,7 +297,7 @@ public class MoneyBigScreenController { BigDecimal LaborCost = new BigDecimal("16304.89"); BigDecimal manageCost = new BigDecimal("8623.61"); - return R.ok(new MoneyCostVo(materialCost, subcontractCost,LaborCost,manageCost)); + return R.ok(new MoneyCostVo(materialCost, subcontractCost, LaborCost, manageCost)); } @@ -340,15 +342,15 @@ public class MoneyBigScreenController { ) )); - BigDecimal incomeAmount =BigDecimal.ZERO; + BigDecimal incomeAmount = BigDecimal.ZERO; for (Long projectId : incomeGroupedByProject.keySet()) { - CtrIncomeContract contract = incomeContractService.getOne(Wrappers.lambdaQuery(CtrIncomeContract.class) + CtrIncomeContract contract = incomeContractService.getOne(Wrappers.lambdaQuery(CtrIncomeContract.class) .eq(CtrIncomeContract::getProjectId, projectId) .last("limit 1") ); - if(contract != null){ + if (contract != null) { incomeAmount = incomeAmount.add(incomeGroupedByProject.get(projectId).multiply(contract.getPayRatio()).divide(HUNDRED)); } @@ -371,16 +373,16 @@ public class MoneyBigScreenController { ) )); - BigDecimal expensesAmount =BigDecimal.ZERO; + BigDecimal expensesAmount = BigDecimal.ZERO; - for (String contractCode: expenseGroupedByContract.keySet()) { + for (String contractCode : expenseGroupedByContract.keySet()) { - CtrExpensesContract contract = expensesContractService.getOne(Wrappers.lambdaQuery(CtrExpensesContract.class) + CtrExpensesContract contract = expensesContractService.getOne(Wrappers.lambdaQuery(CtrExpensesContract.class) .eq(CtrExpensesContract::getContractCode, contractCode) .last("limit 1") ); - if(contract != null){ + if (contract != null) { expensesAmount = expensesAmount.add(expenseGroupedByContract.get(contractCode).multiply(contract.getPayRatio()).divide(HUNDRED)); } @@ -442,15 +444,15 @@ public class MoneyBigScreenController { ) )); - BigDecimal incomeAmount =BigDecimal.ZERO; + BigDecimal incomeAmount = BigDecimal.ZERO; for (Long projectId : incomeGroupedByProject.keySet()) { - CtrIncomeContract contract = incomeContractService.getOne(Wrappers.lambdaQuery(CtrIncomeContract.class) + CtrIncomeContract contract = incomeContractService.getOne(Wrappers.lambdaQuery(CtrIncomeContract.class) .eq(CtrIncomeContract::getProjectId, projectId) .last("limit 1") ); - if(contract != null){ + if (contract != null) { incomeAmount = incomeAmount.add(incomeGroupedByProject.get(projectId).multiply(contract.getPayRatio()).divide(HUNDRED)); } @@ -473,16 +475,16 @@ public class MoneyBigScreenController { ) )); - BigDecimal expensesAmount =BigDecimal.ZERO; + BigDecimal expensesAmount = BigDecimal.ZERO; - for (String contractCode: expenseGroupedByContract.keySet()) { + for (String contractCode : expenseGroupedByContract.keySet()) { - CtrExpensesContract contract = expensesContractService.getOne(Wrappers.lambdaQuery(CtrExpensesContract.class) + CtrExpensesContract contract = expensesContractService.getOne(Wrappers.lambdaQuery(CtrExpensesContract.class) .eq(CtrExpensesContract::getContractCode, contractCode) .last("limit 1") ); - if(contract != null){ + if (contract != null) { expensesAmount = expensesAmount.add(expenseGroupedByContract.get(contractCode).multiply(contract.getPayRatio()).divide(HUNDRED)); } @@ -534,9 +536,10 @@ public class MoneyBigScreenController { /** * 获取当前月份的开始时间和结束时间 + * * @return */ - public Map getMonthStartAndEnd() { + public Map getMonthStartAndEnd() { LocalDate now = LocalDate.now(); LocalDate start = now.with(TemporalAdjusters.firstDayOfMonth()); LocalDate end = now.with(TemporalAdjusters.lastDayOfMonth()); @@ -545,4 +548,24 @@ public class MoneyBigScreenController { put("end", end); }}; } + + /** + * 查询项目天气 + */ + @SaCheckPermission("project:bigScreen:weather") + @GetMapping("/weather/{projectId}") + public R> getProjectWeather(@NotNull(message = "主键不能为空") + @PathVariable Long projectId) { + return R.ok(moneyBigScreenService.getProjectWeather(projectId)); + } + + /** + * 查询项目安全天数 + */ + @SaCheckPermission("project:bigScreen:safetyDay") + @GetMapping("/safetyDay/{projectId}") + public R getProjectSafetyDay(@NotNull(message = "主键不能为空") + @PathVariable Long projectId) { + return R.ok(moneyBigScreenService.getProjectSafetyDay(projectId)); + } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java index 88dec471..3b496783 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java @@ -1,33 +1,26 @@ package org.dromara.bigscreen.controller; -import cn.dev33.satoken.annotation.SaCheckPermission; -import jakarta.annotation.Resource; -import jakarta.validation.constraints.NotNull; -import org.dromara.bigscreen.service.ProjectBigScreenService; -import org.dromara.common.core.domain.R; -import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; -import org.dromara.project.domain.vo.project.BusProjectWeatherVo; -import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo; import cn.dev33.satoken.annotation.SaCheckPermission; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import jakarta.annotation.Resource; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.dromara.bigscreen.domain.vo.ProjectLandVo; +import org.dromara.bigscreen.service.ProjectBigScreenService; import org.dromara.common.core.domain.R; import org.dromara.land.domain.BusLandBlock; import org.dromara.land.domain.BusLandTransferLedger; import org.dromara.land.service.IBusLandBlockService; import org.dromara.land.service.IBusLandTransferLedgerService; -import org.dromara.message.service.IMsgNotifyTargetDetailService; -import org.dromara.tender.domain.vo.BusBiddingPlanAnnexVo; +import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; +import org.dromara.project.domain.vo.project.BusProjectWeatherVo; +import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -53,10 +46,13 @@ public class ProjectBigScreenController { private final IBusLandBlockService busLandBlockService; + /** + * 查询项目土地统计 + */ @GetMapping("/{projectId}") public R> landCount(@NotNull(message = "主键不能为空") @PathVariable Long projectId) { - List levelList = busLandTransferLedgerService.list(Wrappers.lambdaQuery(BusLandTransferLedger.class) + List levelList = busLandTransferLedgerService.list(Wrappers.lambdaQuery(BusLandTransferLedger.class) .eq(BusLandTransferLedger::getProjectId, projectId)); // 根据 landBlockId 分组,并对 designArea 和 transferAea 进行求和 @@ -86,8 +82,8 @@ public class ProjectBigScreenController { )); - List result = new ArrayList<>(); - for(Long landBlockId : groupedResult.keySet()){ + List result = new ArrayList<>(); + for (Long landBlockId : groupedResult.keySet()) { ProjectLandVo projectLandVo = new ProjectLandVo(); BusLandBlock landBlock = busLandBlockService.getById(landBlockId); projectLandVo.setLandName(landBlock.getLandName()); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/MoneyBigScreenService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/MoneyBigScreenService.java index dbf23996..48e5e017 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/MoneyBigScreenService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/MoneyBigScreenService.java @@ -1,6 +1,8 @@ package org.dromara.bigscreen.service; import org.dromara.project.domain.vo.project.BusProjectGisVo; +import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; +import org.dromara.project.domain.vo.project.BusProjectWeatherVo; import java.util.List; @@ -17,4 +19,20 @@ public interface MoneyBigScreenService { */ List getProjectGis(); + /** + * 获取项目天气 + * + * @param projectId 项目id + * @return 项目天气 + */ + List getProjectWeather(Long projectId); + + /** + * 获取项目安全天数 + * + * @param projectId 项目id + * @return 项目安全天数 + */ + BusProjectSafetyDayVo getProjectSafetyDay(Long projectId); + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/MoneyBigScreenServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/MoneyBigScreenServiceImpl.java index bd2b28a1..0fffadf4 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/MoneyBigScreenServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/MoneyBigScreenServiceImpl.java @@ -2,7 +2,12 @@ package org.dromara.bigscreen.service.impl; import jakarta.annotation.Resource; import org.dromara.bigscreen.service.MoneyBigScreenService; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.project.domain.BusProject; import org.dromara.project.domain.vo.project.BusProjectGisVo; +import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; +import org.dromara.project.domain.vo.project.BusProjectWeatherVo; import org.dromara.project.service.IBusProjectService; import org.springframework.stereotype.Service; @@ -27,4 +32,40 @@ public class MoneyBigScreenServiceImpl implements MoneyBigScreenService { public List getProjectGis() { return projectService.getGisList(); } + + /** + * 获取项目天气 + * + * @param projectId 项目id + * @return 项目天气 + */ + @Override + public List getProjectWeather(Long projectId) { + checkProject(projectId); + return projectService.getWeather(projectId); + } + + /** + * 获取项目安全天数 + * + * @param projectId 项目id + * @return 项目安全天数 + */ + @Override + public BusProjectSafetyDayVo getProjectSafetyDay(Long projectId) { + checkProject(projectId); + return projectService.getSafetyDay(projectId); + } + + /** + * 检查项目是否存在 + * + * @param projectId 项目id + */ + private void checkProject(Long projectId) { + BusProject project = projectService.getById(projectId); + if (project == null) { + throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND); + } + } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/controller/MatMaterialsController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/controller/MatMaterialsController.java index 9e1f54a8..d6d194f8 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/controller/MatMaterialsController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/controller/MatMaterialsController.java @@ -19,8 +19,9 @@ import org.dromara.materials.domain.dto.materials.MatMaterialsCreateReq; import org.dromara.materials.domain.dto.materials.MatMaterialsGisReq; import org.dromara.materials.domain.dto.materials.MatMaterialsQueryReq; import org.dromara.materials.domain.dto.materials.MatMaterialsUpdateReq; -import org.dromara.materials.domain.vo.materials.MatMaterialsVo; import org.dromara.materials.domain.vo.materials.MatMaterialsGisVo; +import org.dromara.materials.domain.vo.materials.MatMaterialsNumberVo; +import org.dromara.materials.domain.vo.materials.MatMaterialsVo; import org.dromara.materials.service.IMatMaterialsService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -70,6 +71,16 @@ public class MatMaterialsController extends BaseController { return R.ok(materialsService.queryGisList(req)); } + /** + * 查询库存数量 + */ + @SaCheckPermission("materials:materials:inventoryNumber") + @GetMapping("/inventoryNumber/{projectId}") + public R> queryInventoryList(@NotNull(message = "项目id不能为空") + @PathVariable Long projectId) { + return R.ok(materialsService.queryInventoryList(projectId)); + } + /** * 获取材料详细信息 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/controller/MatMaterialsUseRecordController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/controller/MatMaterialsUseRecordController.java new file mode 100644 index 00000000..7288c8e7 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/controller/MatMaterialsUseRecordController.java @@ -0,0 +1,93 @@ +package org.dromara.materials.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.annotation.Resource; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +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.materialsuserecord.MatMaterialsUseRecordCreateReq; +import org.dromara.materials.domain.dto.materialsuserecord.MatMaterialsUseRecordQueryReq; +import org.dromara.materials.domain.dto.materialsuserecord.MatMaterialsUseRecordUpdateReq; +import org.dromara.materials.domain.vo.materialsuserecord.MatMaterialsUseRecordVo; +import org.dromara.materials.service.IMatMaterialsUseRecordService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 材料使用登记 + * + * @author lilemy + * @date 2025-08-22 + */ +@Validated +@RestController +@RequestMapping("/materials/materialsUseRecord") +public class MatMaterialsUseRecordController extends BaseController { + + @Resource + private IMatMaterialsUseRecordService matMaterialsUseRecordService; + + /** + * 查询材料使用登记列表 + */ + @SaCheckPermission("materials:materialsUseRecord:list") + @GetMapping("/list") + public TableDataInfo list(MatMaterialsUseRecordQueryReq req, PageQuery pageQuery) { + return matMaterialsUseRecordService.queryPageList(req, pageQuery); + } + + /** + * 获取材料使用登记详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("materials:materialsUseRecord:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(matMaterialsUseRecordService.queryById(id)); + } + + /** + * 新增材料使用登记 + */ + @SaCheckPermission("materials:materialsUseRecord:add") + @Log(title = "材料使用登记", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated @RequestBody MatMaterialsUseRecordCreateReq req) { + return toAjax(matMaterialsUseRecordService.insertByBo(req)); + } + + /** + * 修改材料使用登记 + */ + @SaCheckPermission("materials:materialsUseRecord:edit") + @Log(title = "材料使用登记", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated @RequestBody MatMaterialsUseRecordUpdateReq req) { + return toAjax(matMaterialsUseRecordService.updateByBo(req)); + } + + /** + * 删除材料使用登记 + * + * @param ids 主键串 + */ + @SaCheckPermission("materials:materialsUseRecord:remove") + @Log(title = "材料使用登记", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(matMaterialsUseRecordService.deleteByIds(List.of(ids))); + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialsInventory.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialsInventory.java index b07acddd..68985d51 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialsInventory.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialsInventory.java @@ -74,11 +74,6 @@ public class MatMaterialsInventory extends BaseEntity { */ private String disposition; - /** - * 使用部位 - */ - private String usePart; - /** * 交接单位(班组) */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialsUseRecord.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialsUseRecord.java new file mode 100644 index 00000000..ea8c312c --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/MatMaterialsUseRecord.java @@ -0,0 +1,62 @@ +package org.dromara.materials.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.math.BigDecimal; + +/** + * 材料使用登记对象 mat_materials_use_record + * + * @author lilemy + * @date 2025-08-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mat_materials_use_record") +public class MatMaterialsUseRecord extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 库存ID + */ + private Long inventoryId; + + /** + * 使用部位 + */ + private String usePart; + + /** + * 使用数量 + */ + private BigDecimal useNumber; + + /** + * 剩余量 + */ + private BigDecimal residueNumber; + + /** + * 备注 + */ + private String remark; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/bo/MatMaterialsUseRecordBo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/bo/MatMaterialsUseRecordBo.java new file mode 100644 index 00000000..ac335bef --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/bo/MatMaterialsUseRecordBo.java @@ -0,0 +1,65 @@ +package org.dromara.materials.domain.bo; + +import org.dromara.materials.domain.MatMaterialsUseRecord; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 材料使用登记业务对象 mat_materials_use_record + * + * @author lilemy + * @date 2025-08-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = MatMaterialsUseRecord.class, reverseConvertGenerate = false) +public class MatMaterialsUseRecordBo extends BaseEntity { + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 项目ID + */ + @NotNull(message = "项目ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long projectId; + + /** + * 库存ID + */ + @NotNull(message = "库存ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long inventoryId; + + /** + * 使用部位 + */ + @NotBlank(message = "使用部位不能为空", groups = { AddGroup.class, EditGroup.class }) + private String usePart; + + /** + * 使用数量 + */ + @NotNull(message = "使用数量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long useNumber; + + /** + * 剩余量 + */ + @NotNull(message = "剩余量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long residueNumber; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialissue/MatMaterialIssueCreateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialissue/MatMaterialIssueCreateReq.java index ccdb0a4a..0fbe308c 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialissue/MatMaterialIssueCreateReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialissue/MatMaterialIssueCreateReq.java @@ -1,5 +1,7 @@ package org.dromara.materials.domain.dto.materialissue; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import org.dromara.materials.domain.dto.materialissueitem.MatMaterialIssueItemDto; @@ -17,24 +19,22 @@ public class MatMaterialIssueCreateReq implements Serializable { @Serial private static final long serialVersionUID = 2742974667799153892L; - /** - * 主键id - */ - private Long id; - /** * 项目id */ + @NotNull(message = "项目id不能为空") private Long projectId; /** * 材料来源(1甲供 2乙供) */ + @NotBlank(message = "材料来源不能为空") private String materialSource; /** * 表单编号 */ + @NotNull(message = "表单编号不能为空") private String formCode; /** @@ -60,6 +60,7 @@ public class MatMaterialIssueCreateReq implements Serializable { /** * 领料单位 */ + @NotBlank(message = "领料单位不能为空") private String issueUnit; /** 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 6703d6b7..891719f8 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 @@ -1,5 +1,7 @@ package org.dromara.materials.domain.dto.materialissueitem; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -20,34 +22,46 @@ public class MatMaterialIssueItemDto { */ private Long id; + /** + * 材料id + */ + @NotNull(message = "材料id不能为空") + private Long materialsId; + /** * 名称 */ + @NotBlank(message = "名称不能为空") private String name; /** * 规格 */ + @NotBlank(message = "规格不能为空") private String specification; /** * 单位 */ + @NotBlank(message = "单位不能为空") private String unit; /** * 库存 */ + @NotNull(message = "库存数量不能为空") private BigDecimal stockQuantity; /** * 领取 */ + @NotNull(message = "领取数量不能为空") private BigDecimal issuedQuantity; /** * 剩余 */ + @NotNull(message = "剩余数量不能为空") private BigDecimal remainingQuantity; /** diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsinventory/MatMaterialsInventoryCreateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsinventory/MatMaterialsInventoryCreateReq.java index 0d945024..5857a5e6 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsinventory/MatMaterialsInventoryCreateReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsinventory/MatMaterialsInventoryCreateReq.java @@ -61,11 +61,6 @@ public class MatMaterialsInventoryCreateReq implements Serializable { */ private String recipient; - /** - * 使用部位 - */ - private String usePart; - /** * 领用人 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsinventory/MatMaterialsInventoryQueryReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsinventory/MatMaterialsInventoryQueryReq.java index e99528ca..07391f84 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsinventory/MatMaterialsInventoryQueryReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsinventory/MatMaterialsInventoryQueryReq.java @@ -4,7 +4,6 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; -import java.util.Date; /** * @author lilemy @@ -61,9 +60,4 @@ public class MatMaterialsInventoryQueryReq implements Serializable { */ private String shipper; - /** - * 使用部位 - */ - private String usePart; - } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsinventory/MatMaterialsInventoryUpdateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsinventory/MatMaterialsInventoryUpdateReq.java index 21e21fd3..6f4e44ff 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsinventory/MatMaterialsInventoryUpdateReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsinventory/MatMaterialsInventoryUpdateReq.java @@ -46,11 +46,6 @@ public class MatMaterialsInventoryUpdateReq implements Serializable { */ private String path; - /** - * 使用部位 - */ - private String usePart; - /** * 处理方式 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsuserecord/MatMaterialsUseRecordCreateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsuserecord/MatMaterialsUseRecordCreateReq.java new file mode 100644 index 00000000..7dbf3208 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsuserecord/MatMaterialsUseRecordCreateReq.java @@ -0,0 +1,50 @@ +package org.dromara.materials.domain.dto.materialsuserecord; + +import com.baomidou.mybatisplus.annotation.TableId; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author lilemy + * @date 2025-08-22 15:36 + */ +@Data +public class MatMaterialsUseRecordCreateReq implements Serializable { + + @Serial + private static final long serialVersionUID = -5040208122865660213L; + + /** + * 项目ID + */ + @NotNull(message = "项目ID不能为空") + private Long projectId; + + /** + * 库存ID + */ + @NotNull(message = "库存ID不能为空") + private Long inventoryId; + + /** + * 使用部位 + */ + @NotBlank(message = "使用部位不能为空") + private String usePart; + + /** + * 使用数量 + */ + @NotNull(message = "使用数量不能为空") + private BigDecimal useNumber; + + /** + * 备注 + */ + private String remark; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsuserecord/MatMaterialsUseRecordQueryReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsuserecord/MatMaterialsUseRecordQueryReq.java new file mode 100644 index 00000000..24e6d526 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsuserecord/MatMaterialsUseRecordQueryReq.java @@ -0,0 +1,42 @@ +package org.dromara.materials.domain.dto.materialsuserecord; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author lilemy + * @date 2025-08-22 15:37 + */ +@Data +public class MatMaterialsUseRecordQueryReq implements Serializable { + @Serial + private static final long serialVersionUID = 1669916497022457066L; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 库存ID + */ + private Long inventoryId; + + /** + * 使用部位 + */ + private String usePart; + + /** + * 使用数量 + */ + private BigDecimal useNumber; + + /** + * 剩余量 + */ + private BigDecimal residueNumber; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsuserecord/MatMaterialsUseRecordUpdateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsuserecord/MatMaterialsUseRecordUpdateReq.java new file mode 100644 index 00000000..b3b6d6ec --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/dto/materialsuserecord/MatMaterialsUseRecordUpdateReq.java @@ -0,0 +1,40 @@ +package org.dromara.materials.domain.dto.materialsuserecord; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author lilemy + * @date 2025-08-22 15:36 + */ +@Data +public class MatMaterialsUseRecordUpdateReq implements Serializable { + + @Serial + private static final long serialVersionUID = 2735762010782547521L; + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空") + private Long id; + + /** + * 使用部位 + */ + private String usePart; + + /** + * 使用数量 + */ + private BigDecimal useNumber; + + /** + * 备注 + */ + private String remark; +} 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 new file mode 100644 index 00000000..eaa71060 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materials/MatMaterialsNumberVo.java @@ -0,0 +1,43 @@ +package org.dromara.materials.domain.vo.materials; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author lilemy + * @date 2025-08-22 16:54 + */ +@Data +public class MatMaterialsNumberVo implements Serializable { + + @Serial + private static final long serialVersionUID = 9174427789976252587L; + + /** + * 主键id + */ + private Long id; + + /** + * 材料名称 + */ + private String materialsName; + + /** + * 规格型号名称 + */ + private String typeSpecificationName; + + /** + * 计量单位 + */ + private String weightId; + + /** + * 库存数量 + */ + private BigDecimal inventoryNumber; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialsinventory/MatMaterialsInventoryVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialsinventory/MatMaterialsInventoryVo.java index 44ce2fc3..7c3ec221 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialsinventory/MatMaterialsInventoryVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialsinventory/MatMaterialsInventoryVo.java @@ -102,12 +102,6 @@ public class MatMaterialsInventoryVo implements Serializable { @ExcelProperty(value = "交接单位") private String recipient; - /** - * 使用部位 - */ - @ExcelProperty(value = "使用部位") - private String usePart; - /** * 领用人 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialsuserecord/MatMaterialsUseRecordVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialsuserecord/MatMaterialsUseRecordVo.java new file mode 100644 index 00000000..bdd747c7 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/domain/vo/materialsuserecord/MatMaterialsUseRecordVo.java @@ -0,0 +1,70 @@ +package org.dromara.materials.domain.vo.materialsuserecord; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.materials.domain.MatMaterialsUseRecord; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + + +/** + * 材料使用登记视图对象 mat_materials_use_record + * + * @author lilemy + * @date 2025-08-22 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = MatMaterialsUseRecord.class) +public class MatMaterialsUseRecordVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 项目ID + */ + @ExcelProperty(value = "项目ID") + private Long projectId; + + /** + * 库存ID + */ + @ExcelProperty(value = "库存ID") + private Long inventoryId; + + /** + * 使用部位 + */ + @ExcelProperty(value = "使用部位") + private String usePart; + + /** + * 使用数量 + */ + @ExcelProperty(value = "使用数量") + private BigDecimal useNumber; + + /** + * 剩余量 + */ + @ExcelProperty(value = "剩余量") + private BigDecimal residueNumber; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/mapper/MatMaterialsInventoryMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/mapper/MatMaterialsInventoryMapper.java index e9e7f8ea..b82b9552 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/mapper/MatMaterialsInventoryMapper.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/mapper/MatMaterialsInventoryMapper.java @@ -1,13 +1,12 @@ package org.dromara.materials.mapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; -import org.dromara.cailiaoshebei.domain.bo.RepertoryDetailsListReq; -import org.dromara.cailiaoshebei.domain.vo.RepertoryDetailsListRes; -import org.dromara.materials.domain.MatMaterialsInventory; -import org.dromara.materials.domain.dto.materialsinventory.MatMaterialsInventoryQueryReq; -import org.dromara.materials.domain.vo.materialsinventory.MatMaterialsInventoryVo; +import org.apache.ibatis.annotations.Select; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.materials.domain.MatMaterialsInventory; +import org.dromara.materials.domain.vo.materialsinventory.MatMaterialsInventoryVo; + +import java.util.List; /** * 材料出/入库Mapper接口 @@ -22,5 +21,22 @@ public interface MatMaterialsInventoryMapper extends BaseMapperPlus getInventoryList(@Param("bo") MatMaterialsInventoryQueryReq req, @Param("page") Page page); + /** + * 根据材料id列表查询最新一条数据 + * + * @param materialIds 材料id列表 + * @return 每个材料id的最新一条数据 + */ + @Select(""" + SELECT * + FROM ( + SELECT m.*, + ROW_NUMBER() OVER (PARTITION BY m.materials_id ORDER BY m.create_time DESC) AS rn + FROM mat_materials_inventory m + WHERE m.materials_id IN (${ids}) + ) t + WHERE t.rn = 1 + """) + List selectLatestByMaterialIds(@Param("ids") List materialIds); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/mapper/MatMaterialsUseRecordMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/mapper/MatMaterialsUseRecordMapper.java new file mode 100644 index 00000000..f355d4d1 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/mapper/MatMaterialsUseRecordMapper.java @@ -0,0 +1,15 @@ +package org.dromara.materials.mapper; + +import org.dromara.materials.domain.MatMaterialsUseRecord; +import org.dromara.materials.domain.vo.materialsuserecord.MatMaterialsUseRecordVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 材料使用登记Mapper接口 + * + * @author lilemy + * @date 2025-08-22 + */ +public interface MatMaterialsUseRecordMapper extends BaseMapperPlus { + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/IMatMaterialsInventoryService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/IMatMaterialsInventoryService.java index 9adbe4f7..e6c13b6a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/IMatMaterialsInventoryService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/IMatMaterialsInventoryService.java @@ -96,4 +96,12 @@ public interface IMatMaterialsInventoryService extends IService getVoPage(Page materialsInventoryPage); + /** + * 获取最新材料出/入库列表 + * + * @param materialIds 材料ID列表 + * @return 最新材料出/入库列表 + */ + List selectLatestByMaterialIds(List materialIds); + } 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 9c21a022..56911636 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 @@ -11,8 +11,9 @@ import org.dromara.materials.domain.dto.materials.MatMaterialsCreateReq; import org.dromara.materials.domain.dto.materials.MatMaterialsGisReq; import org.dromara.materials.domain.dto.materials.MatMaterialsQueryReq; import org.dromara.materials.domain.dto.materials.MatMaterialsUpdateReq; -import org.dromara.materials.domain.vo.materials.MatMaterialsVo; import org.dromara.materials.domain.vo.materials.MatMaterialsGisVo; +import org.dromara.materials.domain.vo.materials.MatMaterialsNumberVo; +import org.dromara.materials.domain.vo.materials.MatMaterialsVo; import java.util.Collection; import java.util.List; @@ -112,5 +113,12 @@ public interface IMatMaterialsService extends IService { */ void create(Long projectId, List itemList); + /** + * 获取材料库存数据列表 + * + * @param projectId 项目id + * @return 材料库存数据列表 + */ + List queryInventoryList(Long projectId); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/IMatMaterialsUseRecordService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/IMatMaterialsUseRecordService.java new file mode 100644 index 00000000..e09fac3e --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/IMatMaterialsUseRecordService.java @@ -0,0 +1,97 @@ +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.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.materials.domain.MatMaterialsUseRecord; +import org.dromara.materials.domain.dto.materialsuserecord.MatMaterialsUseRecordCreateReq; +import org.dromara.materials.domain.dto.materialsuserecord.MatMaterialsUseRecordQueryReq; +import org.dromara.materials.domain.dto.materialsuserecord.MatMaterialsUseRecordUpdateReq; +import org.dromara.materials.domain.vo.materialsuserecord.MatMaterialsUseRecordVo; + +import java.util.Collection; +import java.util.List; + +/** + * 材料使用登记Service接口 + * + * @author lilemy + * @date 2025-08-22 + */ +public interface IMatMaterialsUseRecordService extends IService { + + /** + * 查询材料使用登记 + * + * @param id 主键 + * @return 材料使用登记 + */ + MatMaterialsUseRecordVo queryById(Long id); + + /** + * 分页查询材料使用登记列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 材料使用登记分页列表 + */ + TableDataInfo queryPageList(MatMaterialsUseRecordQueryReq req, PageQuery pageQuery); + + /** + * 查询符合条件的材料使用登记列表 + * + * @param req 查询条件 + * @return 材料使用登记列表 + */ + List queryList(MatMaterialsUseRecordQueryReq req); + + /** + * 新增材料使用登记 + * + * @param req 材料使用登记 + * @return 是否新增成功 + */ + Boolean insertByBo(MatMaterialsUseRecordCreateReq req); + + /** + * 修改材料使用登记 + * + * @param req 材料使用登记 + * @return 是否修改成功 + */ + Boolean updateByBo(MatMaterialsUseRecordUpdateReq req); + + /** + * 批量删除材料使用登记信息 + * + * @param ids 待删除的主键集合 + * @return 是否删除成功 + */ + Boolean deleteByIds(Collection ids); + + /** + * 获取材料使用登记视图 + * + * @param materialsUseRecord 材料使用登记 + * @return 材料使用登记视图 + */ + MatMaterialsUseRecordVo getVo(MatMaterialsUseRecord materialsUseRecord); + + /** + * 构建查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + LambdaQueryWrapper buildQueryWrapper(MatMaterialsUseRecordQueryReq req); + + /** + * 获取材料使用登记分页对象视图 + * + * @param materialsUseRecordPage 材料使用登记分页对象 + * @return 材料使用登记分页对象视图 + */ + Page getVoPage(Page materialsUseRecordPage); +} 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 65a1913d..fd6c05b3 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 @@ -20,20 +20,24 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.oss.core.OssClient; import org.dromara.common.oss.exception.OssException; import org.dromara.common.oss.factory.OssFactory; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.utils.DocumentUtil; import org.dromara.materials.constants.MatMaterialsConstant; import org.dromara.materials.domain.MatMaterialIssue; import org.dromara.materials.domain.MatMaterialIssueItem; +import org.dromara.materials.domain.MatMaterialsInventory; import org.dromara.materials.domain.dto.materialissue.MatMaterialIssueCreateReq; import org.dromara.materials.domain.dto.materialissue.MatMaterialIssueQueryReq; import org.dromara.materials.domain.dto.materialissue.MatMaterialIssueUpdateReq; import org.dromara.materials.domain.dto.materialissue.MatMaterialIssueWordDto; import org.dromara.materials.domain.dto.materialissueitem.MatMaterialIssueItemDto; import org.dromara.materials.domain.dto.materialissueitem.MatMaterialIssueItemWordDto; +import org.dromara.materials.domain.enums.MatMaterialsInventoryOutPutEnum; import org.dromara.materials.domain.vo.materialissue.MatMaterialIssueVo; import org.dromara.materials.mapper.MatMaterialIssueMapper; import org.dromara.materials.service.IMatMaterialIssueItemService; import org.dromara.materials.service.IMatMaterialIssueService; +import org.dromara.materials.service.IMatMaterialsInventoryService; import org.dromara.project.service.IBusProjectService; import org.dromara.system.domain.vo.SysOssVo; import org.dromara.system.service.ISysOssService; @@ -72,6 +76,9 @@ public class MatMaterialIssueServiceImpl extends ServiceImpl inventoryList = itemList.stream().map(item -> { + MatMaterialsInventory inventory = new MatMaterialsInventory(); + inventory.setNumber(item.getIssuedQuantity().longValue()); + inventory.setOutPutTime(new Date()); + inventory.setResidue(item.getRemainingQuantity().longValue()); + inventory.setOperator(LoginHelper.getLoginUser().getNickname()); + inventory.setRecipient(materialIssue.getIssueUnit()); + inventory.setShipper(LoginHelper.getLoginUser().getNickname()); + inventory.setMaterialsId(item.getMaterialsId()); + inventory.setProjectId(materialIssue.getProjectId()); + inventory.setOutPut(MatMaterialsInventoryOutPutEnum.OUT.getValue()); + inventory.setRemark(item.getRemark()); + return inventory; + }).toList(); + boolean saved = materialsInventoryService.saveBatch(inventoryList); + if (!saved) { + throw new ServiceException("物料出库记录新增失败", HttpStatus.ERROR); + } } return true; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsInventoryServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsInventoryServiceImpl.java index 900b1a23..6ca0ad2e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsInventoryServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsInventoryServiceImpl.java @@ -259,7 +259,6 @@ public class MatMaterialsInventoryServiceImpl extends ServiceImpl materialsQueryWrapper = Wrappers.lambdaQuery(MatMaterials.class) @@ -270,7 +269,6 @@ public class MatMaterialsInventoryServiceImpl extends ServiceImpl selectLatestByMaterialIds(List materialIds) { + return baseMapper.selectLatestByMaterialIds(materialIds); + } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsServiceImpl.java index 94724d8f..53c7a817 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsServiceImpl.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import jakarta.annotation.Resource; import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.ObjectUtils; import org.dromara.common.core.utils.StringUtils; @@ -20,14 +21,14 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.materials.domain.MatMaterials; import org.dromara.materials.domain.MatMaterialsInventory; import org.dromara.materials.domain.dto.materialreceiveitem.MatMaterialReceiveItemDto; -import org.dromara.materials.domain.dto.materialsinventory.MatMaterialsInventoryCreateReq; -import org.dromara.materials.domain.dto.materialsinventory.MatMaterialsInventoryUpdateReq; -import org.dromara.materials.domain.enums.MatMaterialsInventoryOutPutEnum; import org.dromara.materials.domain.dto.materials.MatMaterialsCreateReq; import org.dromara.materials.domain.dto.materials.MatMaterialsGisReq; import org.dromara.materials.domain.dto.materials.MatMaterialsQueryReq; import org.dromara.materials.domain.dto.materials.MatMaterialsUpdateReq; +import org.dromara.materials.domain.dto.materialsinventory.MatMaterialsInventoryCreateReq; +import org.dromara.materials.domain.enums.MatMaterialsInventoryOutPutEnum; import org.dromara.materials.domain.vo.materials.MatMaterialsGisVo; +import org.dromara.materials.domain.vo.materials.MatMaterialsNumberVo; import org.dromara.materials.domain.vo.materials.MatMaterialsVo; import org.dromara.materials.mapper.MatMaterialsMapper; import org.dromara.materials.service.IMatCompanyService; @@ -42,6 +43,7 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -352,10 +354,10 @@ public class MatMaterialsServiceImpl extends ServiceImpl itemList) { + public void create(Long projectId, List itemList) { for (MatMaterialReceiveItemDto item : itemList) { - Long materialsId ; + Long materialsId; MatMaterials one = this.getOne(Wrappers.lambdaQuery() .eq(MatMaterials::getMaterialsName, item.getName()) @@ -365,7 +367,7 @@ public class MatMaterialsServiceImpl extends ServiceImpl queryInventoryList(Long projectId) { + List materials = this.lambdaQuery() + .eq(MatMaterials::getProjectId, projectId) + .eq(MatMaterials::getStatus, "0") + .list(); + List materialIds = materials.stream().map(MatMaterials::getId).distinct().toList(); + List materialsInventories = materialsInventoryService.selectLatestByMaterialIds(materialIds); + Map map = materialsInventories.stream().collect(Collectors.toMap( + MatMaterialsInventory::getMaterialsId, + Function.identity(), + (a, b) -> a)); + return materials.stream().map(material -> { + MatMaterialsNumberVo vo = new MatMaterialsNumberVo(); + BeanUtils.copyProperties(material, vo); + Long materialId = material.getId(); + if (map.containsKey(materialId)) { + vo.setInventoryNumber(BigDecimal.valueOf(map.get(materialId).getNumber())); + } + return vo; + }).toList(); + } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsUseRecordServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsUseRecordServiceImpl.java new file mode 100644 index 00000000..488bf615 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsUseRecordServiceImpl.java @@ -0,0 +1,229 @@ +package org.dromara.materials.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.annotation.Resource; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.ObjectUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.materials.domain.MatMaterialsInventory; +import org.dromara.materials.domain.MatMaterialsUseRecord; +import org.dromara.materials.domain.dto.materialsuserecord.MatMaterialsUseRecordCreateReq; +import org.dromara.materials.domain.dto.materialsuserecord.MatMaterialsUseRecordQueryReq; +import org.dromara.materials.domain.dto.materialsuserecord.MatMaterialsUseRecordUpdateReq; +import org.dromara.materials.domain.vo.materialsuserecord.MatMaterialsUseRecordVo; +import org.dromara.materials.mapper.MatMaterialsUseRecordMapper; +import org.dromara.materials.service.IMatMaterialsInventoryService; +import org.dromara.materials.service.IMatMaterialsUseRecordService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.List; +import java.util.Objects; + +/** + * 材料使用登记Service业务层处理 + * + * @author lilemy + * @date 2025-08-22 + */ +@Service +public class MatMaterialsUseRecordServiceImpl extends ServiceImpl + implements IMatMaterialsUseRecordService { + + @Resource + private IMatMaterialsInventoryService materialsInventoryService; + + /** + * 查询材料使用登记 + * + * @param id 主键 + * @return 材料使用登记 + */ + @Override + public MatMaterialsUseRecordVo queryById(Long id) { + MatMaterialsUseRecord materialsUseRecord = this.getById(id); + if (materialsUseRecord == null) { + throw new ServiceException("材料使用登记信息不存在", HttpStatus.NOT_FOUND); + } + return this.getVo(materialsUseRecord); + } + + /** + * 分页查询材料使用登记列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 材料使用登记分页列表 + */ + @Override + public TableDataInfo queryPageList(MatMaterialsUseRecordQueryReq req, PageQuery pageQuery) { + Page result = this.page(pageQuery.build(), this.buildQueryWrapper(req)); + return TableDataInfo.build(this.getVoPage(result)); + } + + /** + * 查询符合条件的材料使用登记列表 + * + * @param req 查询条件 + * @return 材料使用登记列表 + */ + @Override + public List queryList(MatMaterialsUseRecordQueryReq req) { + LambdaQueryWrapper lqw = this.buildQueryWrapper(req); + return this.list(lqw).stream().map(this::getVo).toList(); + } + + /** + * 新增材料使用登记 + * + * @param req 材料使用登记 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(MatMaterialsUseRecordCreateReq req) { + MatMaterialsUseRecord materialsUseRecord = new MatMaterialsUseRecord(); + BeanUtils.copyProperties(req, materialsUseRecord); + Long inventoryId = req.getInventoryId(); + MatMaterialsInventory inventory = materialsInventoryService.getById(inventoryId); + if (inventory == null) { + throw new ServiceException("库存信息不存在", HttpStatus.NOT_FOUND); + } + MatMaterialsUseRecord lastRecord = this.getOne(Wrappers.lambdaQuery(MatMaterialsUseRecord.class) + .eq(MatMaterialsUseRecord::getInventoryId, inventoryId) + .orderByDesc(MatMaterialsUseRecord::getCreateTime) + .last("limit 1") + ); + BigDecimal residueNumber; + if (lastRecord == null) { + residueNumber = BigDecimal.valueOf(inventory.getNumber()); + } else { + residueNumber = lastRecord.getResidueNumber(); + } + BigDecimal subtract = residueNumber.subtract(req.getUseNumber()); + if (subtract.compareTo(BigDecimal.ZERO) < 0) { + throw new ServiceException("使用数量不能大于库存数量", HttpStatus.BAD_REQUEST); + } + materialsUseRecord.setResidueNumber(subtract); + return this.save(materialsUseRecord); + } + + /** + * 修改材料使用登记 + * + * @param req 材料使用登记 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(MatMaterialsUseRecordUpdateReq req) { + MatMaterialsUseRecord oldMaterialsUseRecord = this.getById(req.getId()); + if (oldMaterialsUseRecord == null) { + throw new ServiceException("材料使用登记信息不存在", HttpStatus.NOT_FOUND); + } + MatMaterialsUseRecord materialsUseRecord = new MatMaterialsUseRecord(); + BeanUtils.copyProperties(req, materialsUseRecord); + MatMaterialsUseRecord lastRecord = this.getOne(Wrappers.lambdaQuery(MatMaterialsUseRecord.class) + .select(MatMaterialsUseRecord::getId) + .eq(MatMaterialsUseRecord::getInventoryId, oldMaterialsUseRecord.getInventoryId()) + .orderByDesc(MatMaterialsUseRecord::getCreateTime) + .last("limit 1") + ); + if (!Objects.equals(lastRecord.getId(), req.getId())) { + throw new ServiceException("只能修改最新数据", HttpStatus.CONFLICT); + } + BigDecimal useNumber = req.getUseNumber(); + if (useNumber != null && useNumber.compareTo(oldMaterialsUseRecord.getUseNumber()) != 0) { + BigDecimal subtract = oldMaterialsUseRecord.getResidueNumber().add(oldMaterialsUseRecord.getUseNumber()).subtract(useNumber); + if (subtract.compareTo(BigDecimal.ZERO) < 0) { + throw new ServiceException("使用数量不能大于库存数量", HttpStatus.BAD_REQUEST); + } + materialsUseRecord.setResidueNumber(subtract); + } + return this.updateById(materialsUseRecord); + } + + /** + * 批量删除材料使用登记信息 + * + * @param ids 待删除的主键集合 + * @return 是否删除成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteByIds(Collection ids) { + return removeBatchByIds(ids); + } + + /** + * 获取材料使用登记视图 + * + * @param materialsUseRecord 材料使用登记 + * @return 材料使用登记视图 + */ + @Override + public MatMaterialsUseRecordVo getVo(MatMaterialsUseRecord materialsUseRecord) { + MatMaterialsUseRecordVo vo = new MatMaterialsUseRecordVo(); + if (materialsUseRecord == null) { + return vo; + } + BeanUtils.copyProperties(materialsUseRecord, vo); + return vo; + } + + /** + * 构建查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + @Override + public LambdaQueryWrapper buildQueryWrapper(MatMaterialsUseRecordQueryReq req) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if (req == null) { + return lqw; + } + Long projectId = req.getProjectId(); + Long inventoryId = req.getInventoryId(); + String usePart = req.getUsePart(); + BigDecimal useNumber = req.getUseNumber(); + BigDecimal residueNumber = req.getResidueNumber(); + lqw.eq(ObjectUtils.isNotEmpty(projectId), MatMaterialsUseRecord::getProjectId, projectId); + lqw.eq(ObjectUtils.isNotEmpty(inventoryId), MatMaterialsUseRecord::getInventoryId, inventoryId); + lqw.eq(ObjectUtils.isNotEmpty(usePart), MatMaterialsUseRecord::getUsePart, usePart); + lqw.eq(ObjectUtils.isNotEmpty(useNumber), MatMaterialsUseRecord::getUseNumber, useNumber); + lqw.eq(ObjectUtils.isNotEmpty(residueNumber), MatMaterialsUseRecord::getResidueNumber, residueNumber); + lqw.orderByDesc(MatMaterialsUseRecord::getCreateTime); + return lqw; + } + + /** + * 获取材料使用登记分页对象视图 + * + * @param materialsUseRecordPage 材料使用登记分页对象 + * @return 材料使用登记分页对象视图 + */ + @Override + public Page getVoPage(Page materialsUseRecordPage) { + List materialsUseRecords = materialsUseRecordPage.getRecords(); + Page materialsUseRecordVoPage = new Page<>( + materialsUseRecordPage.getCurrent(), + materialsUseRecordPage.getSize(), + materialsUseRecordPage.getTotal() + ); + if (CollUtil.isEmpty(materialsUseRecords)) { + return materialsUseRecordVoPage; + } + List materialsUseRecordVos = materialsUseRecords.stream().map(this::getVo).toList(); + materialsUseRecordVoPage.setRecords(materialsUseRecordVos); + return materialsUseRecordVoPage; + } + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressCategory.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressCategory.java index dfe8e9f7..2a5ee265 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressCategory.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressCategory.java @@ -99,6 +99,11 @@ public class PgsProgressCategory extends BaseEntity { */ private String status; + /** + * 祖级列表 + */ + private String ancestors; + /** * 工作类型 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressCategoryTemplate.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressCategoryTemplate.java index 17f68f81..ed7b022f 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressCategoryTemplate.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/domain/PgsProgressCategoryTemplate.java @@ -57,6 +57,11 @@ public class PgsProgressCategoryTemplate implements Serializable { */ private String constructionType; + /** + * 祖级列表 + */ + private String ancestors; + /** * 备注 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryServiceImpl.java index 0073ae87..54d61d0c 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/progress/service/impl/PgsProgressCategoryServiceImpl.java @@ -187,6 +187,17 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl= 0 && total.compareTo(BigDecimal.ZERO) >= 0) { progressCategory.setOutputValue(unitPrice.multiply(total)); @@ -294,6 +305,17 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl + + + + diff --git a/xinnengyuan/script/sql/menuInitValue.sql b/xinnengyuan/script/sql/menuInitValue.sql index e8797e26..e1c09926 100644 --- a/xinnengyuan/script/sql/menuInitValue.sql +++ b/xinnengyuan/script/sql/menuInitValue.sql @@ -1994,3 +1994,23 @@ values(1952650149079576582, '通知人员配置详情删除', 195265014907957657 insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values(1952650149079576583, '通知人员配置详情导出', 1952650149079576578, '5', '#', '', 1, 0, 'F', '0', '0', 'message:notifyTargetDetail:export', '#', 103, 1, sysdate(), null, null, ''); + +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(1958793620743024641, '材料使用登记', '1953994827229114369', '1', 'materialsUseRecord', 'materials/materialsUseRecord/index', 1, 0, 'C', '0', '0', 'materials:materialsUseRecord:list', '#', 103, 1, sysdate(), null, null, '材料使用登记菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(1958793620743024642, '材料使用登记查询', 1958793620743024641, '1', '#', '', 1, 0, 'F', '0', '0', 'materials:materialsUseRecord:query', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(1958793620743024643, '材料使用登记新增', 1958793620743024641, '2', '#', '', 1, 0, 'F', '0', '0', 'materials:materialsUseRecord:add', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(1958793620743024644, '材料使用登记修改', 1958793620743024641, '3', '#', '', 1, 0, 'F', '0', '0', 'materials:materialsUseRecord:edit', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(1958793620743024645, '材料使用登记删除', 1958793620743024641, '4', '#', '', 1, 0, 'F', '0', '0', 'materials:materialsUseRecord:remove', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values(1958793620743024646, '材料使用登记导出', 1958793620743024641, '5', '#', '', 1, 0, 'F', '0', '0', 'materials:materialsUseRecord:export', '#', 103, 1, sysdate(), null, null, ''); diff --git a/xinnengyuan/script/sql/xinnengyuan.sql b/xinnengyuan/script/sql/xinnengyuan.sql index c78f3876..09fc53dc 100644 --- a/xinnengyuan/script/sql/xinnengyuan.sql +++ b/xinnengyuan/script/sql/xinnengyuan.sql @@ -1791,3 +1791,23 @@ create table msg_notify_target_detail primary key (`id`) using btree, unique index `un_idx_config_target` (`config_id`, `target_type`, `target_id`) ) comment '通知人员配置详情' collate = utf8mb4_unicode_ci; + +drop table if exists mat_materials_use_record; +create table mat_materials_use_record +( + `id` bigint not null auto_increment comment '主键ID', + `project_id` bigint default 0 not null comment '项目ID', + `inventory_id` bigint default 0 not null comment '库存ID', + `use_part` varchar(512) not null comment '使用部位', + `use_number` decimal(10) default 0 not null comment '使用数量', + `residue_number` decimal(10) default 0 not null comment '剩余量', + `remark` varchar(255) null comment '备注', + `create_by` bigint null comment '创建者', + `update_by` bigint null comment '更新者', + `create_dept` bigint null comment '创建部门', + `create_time` datetime default CURRENT_TIMESTAMP null comment '创建时间', + `update_time` datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间', + primary key (`id`) using btree, + index `idx_project_id` (`project_id` asc) using btree comment '项目ID', + index `idx_inventory_id` (`inventory_id` asc) using btree comment '库存ID' +) comment '材料使用登记' collate = utf8mb4_unicode_ci;