| 10 天以前 | liyong | ![]() |
| 10 天以前 | liyong | ![]() |
| 2026-02-03 | maven | ![]() |
| 2026-02-03 | maven | ![]() |
| 2026-02-03 | maven | ![]() |
| 2026-02-03 | liyong | ![]() |
| 2026-02-03 | maven | ![]() |
| 2026-02-03 | maven | ![]() |
| 2026-02-03 | gongchunyi | ![]() |
| 2026-02-03 | gongchunyi | ![]() |
| 2026-02-03 | zss | ![]() |
| 2026-02-03 | zss | ![]() |
| 2026-02-03 | zss | ![]() |
| 2026-02-03 | liyong | ![]() |
| 2026-02-03 | liyong | ![]() |
| 2026-02-03 | gongchunyi | ![]() |
| 2026-02-03 | maven | ![]() |
| 2026-02-03 | maven | ![]() |
| 2026-02-03 | maven | ![]() |
| 2026-02-03 | gongchunyi | ![]() |
| 2026-02-03 | maven | ![]() |
| 2026-02-03 | maven | ![]() |
| 2026-02-03 | zss | ![]() |
| 2026-02-03 | zss | ![]() |
| 2026-02-03 | maven | ![]() |
| 2026-02-03 | liyong | ![]() |
| 2026-02-03 | liyong | ![]() |
| 2026-02-02 | gongchunyi | ![]() |
| 2026-02-02 | zss | ![]() |
| 2026-02-02 | gongchunyi | ![]() |
| 2026-02-02 | gongchunyi | ![]() |
| 2026-02-02 | maven | ![]() |
| 2026-02-02 | maven | ![]() |
| 2026-02-02 | zss | ![]() |
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -123,14 +123,14 @@ LambdaQueryWrapper<ApproveNode> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ApproveNode::getApproveProcessId, id); queryWrapper.eq(ApproveNode::getDeleteFlag, 0); queryWrapper.eq(ApproveNode::getApproveNodeStatus, 0); // queryWrapper.eq(ApproveNode::getApproveNodeStatus, 0); List<ApproveNode> list = list(queryWrapper); // æç § approveNodeOrder åæ®µååºæåº list.sort(Comparator.comparingInt(ApproveNode::getApproveNodeOrder)); LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>(); approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveId, id) .eq(ApproveProcess::getApproveDelete, 0) .eq(ApproveProcess::getApproveStatus, 0) // .eq(ApproveProcess::getApproveStatus, 0) .last("limit 1"); ApproveProcess approveProcess = approveProcessMapper.selectOne(approveProcessLambdaQueryWrapper); if(approveProcess != null && approveProcess.getApproveStatus() == 3){ src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java
@@ -4,6 +4,7 @@ import com.ruoyi.approve.mapper.ApproveProcessMapper; import com.ruoyi.approve.pojo.ApproveProcess; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; @@ -26,6 +27,9 @@ public DailyRedisCounter(StringRedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } @Value("${ruoyi.approvalNumberPrefix}") private String approvalNumberPrefix; /**æ¥ç¼å * è·åæå®è®¡æ°å¨å¨ä»æ¥çæ°å¼ï¼å¹¶èªå¢1 @@ -71,7 +75,7 @@ * @return 仿¥èªå¢åç计æ°å¼ */ public long incrementAndGetByDb() { String approveId = redisTemplate.opsForValue().get("approveNum"); String approveId = redisTemplate.opsForValue().get(approvalNumberPrefix + ":approveNum"); if(approveId == null){ StartAndEndDateDto dateTime = getDateTime(); LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>(); @@ -81,16 +85,16 @@ .lt(ApproveProcess::getCreateTime,dateTime.getEndDate()); Long aLong = approveProcessMapper.selectCount(approveProcessLambdaQueryWrapper); if(aLong == null){ redisTemplate.opsForValue().set("approveNum","1",1L, TimeUnit.HOURS); redisTemplate.opsForValue().set(approvalNumberPrefix + ":approveNum","1",1L, TimeUnit.HOURS); return 1; }else{ aLong += 1; redisTemplate.opsForValue().set("approveNum",aLong.toString(),1L, TimeUnit.HOURS); redisTemplate.opsForValue().set(approvalNumberPrefix + ":approveNum",aLong.toString(),1L, TimeUnit.HOURS); return aLong; } }else{ Long num = Long.parseLong(approveId) + 1; redisTemplate.opsForValue().set("approveNum",num.toString(),1L, TimeUnit.HOURS); redisTemplate.opsForValue().set(approvalNumberPrefix + ":approveNum",num.toString(),1L, TimeUnit.HOURS); return Long.parseLong(approveId); } src/main/java/com/ruoyi/basic/controller/ProductController.java
@@ -5,14 +5,18 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.dto.ProductDto; import com.ruoyi.basic.dto.ProductModelDto; import com.ruoyi.basic.dto.ProductModelImportDto; import com.ruoyi.basic.dto.ProductTreeDto; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.basic.service.IProductModelService; import com.ruoyi.basic.service.IProductService; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.domain.R; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerProductService; import com.ruoyi.sales.service.ISalesLedgerService; @@ -23,7 +27,10 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @AllArgsConstructor @@ -129,4 +136,21 @@ public AjaxResult importProduct(MultipartFile file) { return AjaxResult.success(productModelService.importProduct(file)); } /** * ä¸è½½æ¨¡æ¿ * @return */ @PostMapping("/downloadTemplate") public void downloadTemplate(HttpServletResponse response) { ExcelUtil<ProductModelImportDto> util = new ExcelUtil<ProductModelImportDto>(ProductModelImportDto.class); util.importTemplateExcel(response, "产åè§æ ¼æ¨¡æ¿"); } @GetMapping("listProduct") public R listProduct() { List<HashMap<String, Object>> list = productModelService.listProduct(); return R.ok(list); } } src/main/java/com/ruoyi/basic/dto/ProductModelImportDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,67 @@ package com.ruoyi.basic.dto; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; /** * @author :yys * @date : 2026/2/3 15:17 */ @Data public class ProductModelImportDto { /** * å ³è产åid */ @Excel(name = "å ³è产åid") private Long productId; @TableField(exist = false) @Excel(name = "产ååç§°") private String productName; /** * è§æ ¼åå· */ @Excel(name = "è§æ ¼åå·") private String model; /** * åä½ */ @Excel(name = "åä½") private String unit; /** * 产åé«åº¦ */ @Excel(name = "产åé«åº¦") private String height; /** * æ¯ä»¶æ°é/æ¯ */ @Excel(name = "æ¯ä»¶æ°é/æ¯") private String boxNum; /** * åä»·(ç¾å )/ä»¶ */ @Excel(name = "åä»·(ç¾å )/ä»¶") private String dollarPrice; /** * åä»·(å )/ä»¶ */ @Excel(name = "åä»·(å )/ä»¶") private String taxInclusiveUnitPrice; } src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
@@ -7,6 +7,7 @@ import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import org.apache.ibatis.annotations.Param; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -26,4 +27,6 @@ ProductModel selectLatestRecord(); List<Map<String, Object>> getProductAndModelList(); List<HashMap<String, Object>> listProduct(); } src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -45,9 +45,39 @@ /** * çäº§çæº */ @Excel(name = "çäº§çæº") // @Excel(name = "çäº§çæº") private String speculativeTradingName; /** * 产åå¾ç */ // @Excel(name = "产åå¾ç") private String url; /** * 产åé«åº¦ */ @Excel(name = "产åé«åº¦") private String height; /** * æ¯ä»¶æ°é/æ¯ */ @Excel(name = "æ¯ä»¶æ°é/æ¯") private String boxNum; /** * åä»·(ç¾å )/ä»¶ */ @Excel(name = "åä»·(ç¾å )/ä»¶") private String dollarPrice; /** * åä»·(å )/ä»¶ */ @Excel(name = "åä»·(å )/ä»¶") private String taxInclusiveUnitPrice; @ApiModelProperty(value = "ç§æ·ID") @TableField(fill = FieldFill.INSERT) private Long tenantId; src/main/java/com/ruoyi/basic/service/IProductModelService.java
@@ -8,7 +8,9 @@ import com.ruoyi.basic.pojo.ProductModel; import org.springframework.web.multipart.MultipartFile; import java.util.HashMap; import java.util.List; import java.util.Map; /** @@ -34,4 +36,8 @@ IPage<ProductModel> modelListPage(Page page , ProductDto productDto); Boolean importProduct(MultipartFile file); List<HashMap<String, Object>> listProduct(); } src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -12,6 +12,7 @@ import com.ruoyi.basic.pojo.Product; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.basic.service.IProductModelService; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.uuid.IdUtils; @@ -23,9 +24,7 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.*; import java.util.stream.Collectors; /** @@ -108,4 +107,9 @@ } return false; } @Override public List<HashMap<String, Object>> listProduct() { return productModelMapper.listProduct(); } } src/main/java/com/ruoyi/common/enums/FileNameType.java
@@ -14,7 +14,8 @@ SHIP(9),//åè´§å°è´¦ INSPECTION_PRODUCTION_BEFORE(10), INSPECTION_PRODUCTION_AFTER(11), INSPECTION(12);//å·¡æ£ ç产å INSPECTION(12),//å·¡æ£ ç产å Inventory(13);//产åå¾ç private final int value; src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -69,6 +69,7 @@ return AjaxResult.success(homeSummaryDto); } /********************************************************è¥ééè´ç±»**************************************************/ @GetMapping("/supplierPurchaseRanking") @ApiOperation("ä¾åºåéè´æå") public AjaxResult supplierPurchaseRanking(@RequestParam(value = "type", defaultValue = "1") Integer type) { @@ -80,13 +81,6 @@ @ApiOperation("客æ·è¥æ¶è´¡ç®æ°å¼åæ") public AjaxResult customerRevenueAnalysis(@RequestParam("customerId") Long customerId, @RequestParam(value = "type", defaultValue = "1") Integer type) { CustomerRevenueAnalysisDto dto = homeService.customerRevenueAnalysis(customerId, type); return AjaxResult.success(dto); } @GetMapping("/productCategoryDistribution") @ApiOperation("产å大类åå¸") public AjaxResult productCategoryDistribution() { ProductCategoryDistributionDto dto = homeService.productCategoryDistribution(); return AjaxResult.success(dto); } @@ -111,27 +105,134 @@ return AjaxResult.success(list); } @GetMapping("/salesPurchaseStorageProductCount") @ApiOperation("éå®-éè´-å¨åäº§åæ°") public AjaxResult salesPurchaseStorageProductCount(){ List<MapDto> list = homeService.salesPurchaseStorageProductCount(); @GetMapping("/business") @Log(title = "éå®-éè´-åºåæ°æ®", businessType = BusinessType.OTHER) @ApiOperation("éå®-éè´-åºåæ°æ®") public AjaxResult business(HomeBusinessDto req) { HomeBusinessDto homeBusinessDto = homeService.business(); return AjaxResult.success(homeBusinessDto); } @GetMapping("/analysisCustomerContractAmounts") @Log(title = "客æ·ååéé¢åæ", businessType = BusinessType.OTHER) @ApiOperation("客æ·ååéé¢åæ") public AjaxResult analysisCustomerContractAmounts(AnalysisCustomerContractAmountsDto req) { AnalysisCustomerContractAmountsDto analysisCustomerContractAmounts = homeService.analysisCustomerContractAmounts(); return AjaxResult.success(analysisCustomerContractAmounts); } /********************************************************ç产类*****************************************************/ @GetMapping("/inputOutputAnalysis") @ApiOperation("æå ¥äº§åºåæ") public AjaxResult inputOutputAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){ List<InputOutputAnalysisDto> list = homeService.inputOutputAnalysis(type); return AjaxResult.success(list); } @GetMapping("/productInOutAnalysis") @ApiOperation("产ååºå ¥åºåæ") public AjaxResult productInOutAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){ List<Map<String, Object>> result = homeService.productInOutAnalysis(type); return AjaxResult.success(result); } @GetMapping("/productTurnoverDays") @ApiOperation("产åå¨è½¬å¤©æ°") public AjaxResult productTurnoverDays(){ List<MapDto> list = homeService.productTurnoverDays(); @GetMapping("/processOutputAnalysis") @ApiOperation("å·¥åºäº§åºåæ") public AjaxResult processOutputAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){ List<MapDto> list = homeService.processOutputAnalysis(type); return AjaxResult.success(list); } @GetMapping("/workOrderEfficiencyAnalysis") @ApiOperation("å·¥åæ§è¡æçåæ") public AjaxResult workOrderEfficiencyAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){ List<WorkOrderEfficiencyDto> list = homeService.workOrderEfficiencyAnalysis(type); return AjaxResult.success(list); } @GetMapping("/productionAccountingAnalysis") @ApiOperation("çäº§æ ¸ç®åæ") public AjaxResult productionAccountingAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){ List<ProductionAccountingDto> list = homeService.productionAccountingAnalysis(type); return AjaxResult.success(list); } @GetMapping("/orderCount") @ApiOperation("è®¢åæ°") public AjaxResult orderCount(){ return AjaxResult.success(homeService.orderCount()); } @GetMapping("/progressStatistics") @ApiOperation("åç产订åç宿è¿åº¦ç»è®¡") public AjaxResult progressStatistics(){ ProductionProgressDto productionProgressDto = homeService.productionProgress(); return AjaxResult.success(productionProgressDto); } @GetMapping("/workInProcessTurnover") @ApiOperation("å¨å¶åå¨è½¬æ åµ") public AjaxResult workInProcessTurnover(){ ProductionTurnoverDto productionTurnoverDto = homeService.workInProcessTurnover(); return AjaxResult.success(productionTurnoverDto); } /********************************************************è´¨éç±»*****************************************************/ @GetMapping("/rawMaterialDetection") @ApiOperation("åæææ£æµ") public AjaxResult rawMaterialDetection(@RequestParam(value = "type", defaultValue = "1") Integer type){ return AjaxResult.success(homeService.rawMaterialDetection(type)); } @GetMapping("/processDetection") @ApiOperation("è¿ç¨æ£æµ") public AjaxResult processDetection(@RequestParam(value = "type", defaultValue = "1") Integer type){ return AjaxResult.success(homeService.processDetection(type)); } @GetMapping("/factoryDetection") @ApiOperation("æååºåæ£æµ") public AjaxResult factoryDetection(@RequestParam(value = "type", defaultValue = "1") Integer type){ return AjaxResult.success(homeService.factoryDetection(type)); } @GetMapping("/qualityInspectionCount") @ApiOperation("è´¨éæ£éªæ°é") public AjaxResult qualityInspectionCount(){ QualityInspectionCountDto qualityInspectionCountDto = homeService.qualityInspectionCount(); return AjaxResult.success(qualityInspectionCountDto); } @GetMapping("/nonComplianceWarning") @ApiOperation("ä¸åæ ¼é¢è¦") public AjaxResult nonComplianceWarning(){ NonComplianceWarningDto nonComplianceWarningDto = homeService.nonComplianceWarning(); return AjaxResult.success(nonComplianceWarningDto); } @GetMapping("/completedInspectionCount") @ApiOperation("宿æ£éªæ°") public AjaxResult completedInspectionCount(){ List<CompletedInspectionCountDto> list = homeService.completedInspectionCount(); return AjaxResult.success(list); } @GetMapping("/unqualifiedProductRanking") @ApiOperation("ä¸åæ ¼äº§åæå") public AjaxResult unqualifiedProductRanking(){ List<UnqualifiedProductRankDto> list = homeService.unqualifiedProductRanking(); return AjaxResult.success(list); } @GetMapping("/unqualifiedProductProcessingAnalysis") @ApiOperation("ä¸åæ ¼æ£åå¤çåæ") public AjaxResult unqualifiedProductProcessingAnalysis(){ List<MapDto> list = homeService.unqualifiedProductProcessingAnalysis(); return AjaxResult.success(list); } @GetMapping("/qualityStatistics") @Log(title = "è´¨éåæ", businessType = BusinessType.OTHER) @ApiOperation("è´¨éåæ") public AjaxResult qualityStatistics(QualityStatisticsDto req) { QualityStatisticsDto qualityStatisticsDto = homeService.qualityStatistics(); return AjaxResult.success(qualityStatisticsDto); } /********************************************************è´¢å¡ç±»*****************************************************/ @GetMapping("/incomeExpenseAnalysis") @ApiOperation("æ¯æ¶å¯¹æ¯åæ") public AjaxResult incomeExpenseAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type) { @@ -160,94 +261,13 @@ return AjaxResult.success(dto); } @GetMapping("/monthlyExpenditure") @ApiOperation("æåº¦æ¯åº") public AjaxResult monthlyExpenditure(){ @GetMapping("/monthlyExpenditure") @ApiOperation("æåº¦æ¯åº") public AjaxResult monthlyExpenditure(){ MonthlyExpenditureDto dto = homeService.monthlyExpenditure(); return AjaxResult.success(dto); } @GetMapping("/inputOutputAnalysis") @ApiOperation("æå ¥äº§åºåæ") public AjaxResult inputOutputAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){ List<InputOutputAnalysisDto> list = homeService.inputOutputAnalysis(type); return AjaxResult.success(list); } @GetMapping("/processOutputAnalysis") @ApiOperation("å·¥åºäº§åºåæ") public AjaxResult processOutputAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){ List<MapDto> list = homeService.processOutputAnalysis(type); return AjaxResult.success(list); } @GetMapping("/workOrderEfficiencyAnalysis") @ApiOperation("å·¥åæ§è¡æçåæ") public AjaxResult workOrderEfficiencyAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){ List<WorkOrderEfficiencyDto> list = homeService.workOrderEfficiencyAnalysis(type); return AjaxResult.success(list); } @GetMapping("/productionAccountingAnalysis") @ApiOperation("çäº§æ ¸ç®åæ") public AjaxResult productionAccountingAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){ List<ProductionAccountingDto> list = homeService.productionAccountingAnalysis(type); return AjaxResult.success(list); } @GetMapping("/orderCount") @ApiOperation("è®¢åæ°") public AjaxResult orderCount(){ return AjaxResult.success(homeService.orderCount()); } /********************************************************è¥ééè´ç±»**************************************************/ @GetMapping("/business") @Log(title = "éå®-éè´-åºåæ°æ®", businessType = BusinessType.OTHER) @ApiOperation("éå®-éè´-åºåæ°æ®") public AjaxResult business(HomeBusinessDto req) { HomeBusinessDto homeBusinessDto = homeService.business(); return AjaxResult.success(homeBusinessDto); } @GetMapping("/analysisCustomerContractAmounts") @Log(title = "客æ·ååéé¢åæ", businessType = BusinessType.OTHER) @ApiOperation("客æ·ååéé¢åæ") public AjaxResult analysisCustomerContractAmounts(AnalysisCustomerContractAmountsDto req) { AnalysisCustomerContractAmountsDto analysisCustomerContractAmounts = homeService.analysisCustomerContractAmounts(); return AjaxResult.success(analysisCustomerContractAmounts); } /********************************************************ç产类*****************************************************/ @GetMapping("/progressStatistics") @ApiOperation("åç产订åç宿è¿åº¦ç»è®¡") public AjaxResult progressStatistics(){ ProductionProgressDto productionProgressDto = homeService.productionProgress(); return AjaxResult.success(productionProgressDto); } @GetMapping("/workInProcessTurnover") @ApiOperation("å¨å¶åå¨è½¬æ åµ") public AjaxResult workInProcessTurnover(){ ProductionTurnoverDto productionTurnoverDto = homeService.workInProcessTurnover(); return AjaxResult.success(productionTurnoverDto); } /********************************************************è´¨éç±»*****************************************************/ @GetMapping("/qualityStatistics") @Log(title = "è´¨éåæ", businessType = BusinessType.OTHER) @ApiOperation("è´¨éåæ") public AjaxResult qualityStatistics(QualityStatisticsDto req) { QualityStatisticsDto qualityStatisticsDto = homeService.qualityStatistics(); return AjaxResult.success(qualityStatisticsDto); } /********************************************************è´¢å¡ç±»*****************************************************/ @GetMapping("/statisticsReceivablePayable") @Log(title = "åºæ¶åºä»ç»è®¡", businessType = BusinessType.OTHER) @ApiOperation("åºæ¶åºä»ç»è®¡") @@ -256,17 +276,34 @@ return AjaxResult.success(statisticsReceivablePayable); } /********************************************************ä»å¨ç±»*****************************************************/ @GetMapping("/productCategoryDistribution") @ApiOperation("产å大类åå¸") public AjaxResult productCategoryDistribution() { ProductCategoryDistributionDto dto = homeService.productCategoryDistribution(); return AjaxResult.success(dto); } @GetMapping("/salesPurchaseStorageProductCount") @ApiOperation("éå®-éè´-å¨åäº§åæ°") public AjaxResult salesPurchaseStorageProductCount(){ List<MapDto> list = homeService.salesPurchaseStorageProductCount(); return AjaxResult.success(list); } @GetMapping("/productInOutAnalysis") @ApiOperation("产ååºå ¥åºåæ") public AjaxResult productInOutAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){ List<Map<String, Object>> result = homeService.productInOutAnalysis(type); return AjaxResult.success(result); } @GetMapping("/productTurnoverDays") @ApiOperation("产åå¨è½¬å¤©æ°") public AjaxResult productTurnoverDays(){ List<MapDto> list = homeService.productTurnoverDays(); return AjaxResult.success(list); } } src/main/java/com/ruoyi/home/dto/CompletedInspectionCountDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,37 @@ package com.ruoyi.home.dto; import java.math.BigDecimal; import lombok.Data; /** * <br> * 宿æ£éªæ° * </br> * * @author deslrey * @version 1.0 * @since 2026/2/2 */ @Data public class CompletedInspectionCountDto { /** * æ¥æ */ private String dateStr; /** * åæ ¼æ° */ private BigDecimal qualifiedCount; /** * ä¸åæ ¼æ° */ private BigDecimal unqualifiedCount; /** * åæ ¼ç */ private BigDecimal passRate; } src/main/java/com/ruoyi/home/dto/NonComplianceWarningDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,64 @@ package com.ruoyi.home.dto; import java.math.BigDecimal; import java.util.List; import lombok.Data; /** * <br> * ä¸åæ ¼é¢è¦ * </br> * * @author deslrey * @version 1.0 * @since 2026/2/2 */ @Data public class NonComplianceWarningDto { /** * åææå æ¯ */ private BigDecimal rawMaterialRatio; /** * åæåå æ¯ */ private BigDecimal semiFinishedProductRatio; /** * æåå æ¯ */ private BigDecimal finishedProductRatio; /** * æ°æ® */ private List<Item> children; @Data public static class Item { /** * ç¶ç±»äº§åæ é¢ */ private String parentProductTitle; /** * äº§åæ é¢ */ private String productTitle; /** * æè¿° */ private String description; /** * æ¥æ */ private String date; } } src/main/java/com/ruoyi/home/dto/QualityInspectionCountDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ package com.ruoyi.home.dto; import java.math.BigDecimal; import lombok.Data; /** * <br> * æ£éªæ°é * </br> * * @author deslrey * @version 1.0 * @since 2026/2/2 */ @Data public class QualityInspectionCountDto { /** * æ»æ£éªæ° */ private BigDecimal totalCount; /** * æ»æ£éªæ°åæ¯å¢é¿ */ private BigDecimal totalCountGrowthRate; /** * 仿¥å¾ å®ææ° */ private BigDecimal todayPendingCount; /** * 仿¥å¾ 宿æ°åæ¯å¢é¿ */ private BigDecimal todayPendingCountGrowthRate; /** * 仿¥å·²å®ææ° */ private BigDecimal todayCompletedCount; /** * 仿¥å·²å®ææ°åæ¯å¢é¿ */ private BigDecimal todayCompletedCountGrowthRate; } src/main/java/com/ruoyi/home/dto/QualityQualifiedAnalysisDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ package com.ruoyi.home.dto; import lombok.Data; import java.math.BigDecimal; /** * <br> * è´¨éææ åæ ¼åæ * </br> * * @author deslrey * @version 1.0 * @since 2026/2/2 */ @Data public class QualityQualifiedAnalysisDto { /** * åæ ¼æ° */ private int qualifiedCount; /** * ä¸åæ ¼æ° */ private int unqualifiedCount; /** * åæ ¼æ¯ä¾ */ private BigDecimal qualifiedRate; /** * ä¸åæ ¼æ¯ä¾ */ private BigDecimal unqualifiedRate; } src/main/java/com/ruoyi/home/dto/UnqualifiedProductRankDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ package com.ruoyi.home.dto; import java.math.BigDecimal; import lombok.Data; /** * <br> * ä¸åæ ¼äº§åæå * </br> * * @author deslrey * @version 1.0 * @since 2026/2/2 */ @Data public class UnqualifiedProductRankDto { /** * 产ååç§° */ private String productName; /** * æ»å®ææ°é */ private BigDecimal totalCount; /** * 已宿æ°é */ private BigDecimal completedCount; /** * åæ ¼ç */ private BigDecimal passRate; } src/main/java/com/ruoyi/home/service/HomeService.java
@@ -31,6 +31,7 @@ Long noticesCount(); ProductionProgressDto productionProgress(); ProductionTurnoverDto workInProcessTurnover(); DeptStaffDistributionDto deptStaffDistribution(); @@ -74,4 +75,20 @@ List<ProductionAccountingDto> productionAccountingAnalysis(Integer type); List<MapDto> orderCount(); QualityQualifiedAnalysisDto rawMaterialDetection(Integer type); QualityQualifiedAnalysisDto processDetection(Integer type); QualityQualifiedAnalysisDto factoryDetection(Integer type); QualityInspectionCountDto qualityInspectionCount(); NonComplianceWarningDto nonComplianceWarning(); List<CompletedInspectionCountDto> completedInspectionCount(); List<UnqualifiedProductRankDto> unqualifiedProductRanking(); List<MapDto> unqualifiedProductProcessingAnalysis(); } src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -20,6 +20,7 @@ import com.ruoyi.collaborativeApproval.pojo.Notice; import com.ruoyi.common.enums.ApproveTypeEnum; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.device.mapper.DeviceRepairMapper; import com.ruoyi.device.pojo.DeviceRepair; import com.ruoyi.dto.MapDto; @@ -48,7 +49,9 @@ import com.ruoyi.purchase.pojo.PaymentRegistration; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.mapper.QualityUnqualifiedMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityUnqualified; import com.ruoyi.sales.mapper.ReceiptPaymentMapper; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; @@ -94,9 +97,6 @@ private StockInventoryMapper stockInventoryMapper; @Autowired private ProcurementRecordMapper procurementRecordStorageMapper; @Autowired private QualityInspectMapper qualityStatisticsMapper; @Autowired @@ -113,27 +113,36 @@ @Autowired private NoticeMapper noticeMapper; @Autowired private ProductOrderMapper productOrderMapper; @Autowired private ProductWorkOrderMapper productWorkOrderMapper; @Autowired private ProductModelMapper productModelMapper; @Autowired private ProductMapper productMapper; @Autowired private StockUtils stockUtils; @Autowired private StaffOnJobMapper staffOnJobMapper; @Autowired private CustomerMapper customerMapper; @Autowired private SupplierManageMapper supplierManageMapper; @Autowired private HomeMapper homeMapper; @Autowired private ProductionProductOutputMapper productionProductOutputMapper; @Autowired private QualityInspectMapper qualityInspectMapper; @Autowired private QualityUnqualifiedMapper qualityUnqualifiedMapper; @Override public HomeBusinessDto business() { @@ -1720,8 +1729,7 @@ BigDecimal finishQty = item.getQuantity() != null ? item.getQuantity() : BigDecimal.ZERO; BigDecimal scrapQty = item.getScrapQty() != null ? item.getScrapQty() : BigDecimal.ZERO; dto.setFinishQuantity( dto.getFinishQuantity() != null ? dto.getFinishQuantity().add(finishQty) : finishQty); dto.setFinishQuantity(dto.getFinishQuantity() != null ? dto.getFinishQuantity().add(finishQty) : finishQty); } } @@ -1737,9 +1745,11 @@ .filter(i -> i.getCreateTime() != null) .collect(Collectors.groupingBy( i -> i.getCreateTime().toLocalDate().toString(), Collectors.reducing(BigDecimal.ZERO, i -> i.getQuantity() != null ? i.getQuantity() : BigDecimal.ZERO, BigDecimal::add))); Collectors.reducing(BigDecimal.ZERO, i -> { BigDecimal qty = (i.getQuantity() != null) ? i.getQuantity() : BigDecimal.ZERO; BigDecimal scrap = (i.getScrapQty() != null) ? i.getScrapQty() : BigDecimal.ZERO; return qty.subtract(scrap); }, BigDecimal::add))); finishMap.forEach((date, qty) -> { WorkOrderEfficiencyDto dto = dateMap.getOrDefault(date, new WorkOrderEfficiencyDto()); @@ -1812,7 +1822,8 @@ String endStr = endDate.plusDays(1).atStartOfDay().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); List<Map<String, Object>> wagesList = salesLedgerProductionAccountingMapper.selectDailyWagesStats(startStr, endStr); List<Map<String, Object>> wagesList = salesLedgerProductionAccountingMapper.selectDailyWagesStats(startStr, endStr); if (CollectionUtils.isEmpty(wagesList)) { return new ArrayList<>(); @@ -1882,4 +1893,522 @@ return dto; } } @Override public QualityQualifiedAnalysisDto rawMaterialDetection(Integer type) { return commonDetection(type, 0); } @Override public QualityQualifiedAnalysisDto processDetection(Integer type) { return commonDetection(type, 1); } @Override public QualityQualifiedAnalysisDto factoryDetection(Integer type) { return commonDetection(type, 2); } private QualityQualifiedAnalysisDto commonDetection(Integer type, Integer inspectType) { LocalDate[] range = calcDateRange(type); LocalDate startDate = range[0]; LocalDate endDate = range[1]; String startStr = startDate.atStartOfDay() .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); String endStr = endDate.atTime(LocalTime.MAX) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); List<QualityInspect> list = qualityInspectMapper.selectList( new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectType, inspectType) .eq(QualityInspect::getInspectState, 1) .ge(QualityInspect::getCheckTime, startStr) .le(QualityInspect::getCheckTime, endStr)); return buildQualifiedAnalysis(list); } private LocalDate[] calcDateRange(Integer type) { LocalDate today = LocalDate.now(); LocalDate startDate; LocalDate endDate; switch (type) { case 1: // å¨ startDate = today.with(DayOfWeek.MONDAY); endDate = today.with(DayOfWeek.SUNDAY); break; case 2: // æ startDate = today.with(TemporalAdjusters.firstDayOfMonth()); endDate = today.with(TemporalAdjusters.lastDayOfMonth()); break; case 3: // å£åº¦ int currentMonth = today.getMonthValue(); int startMonth = ((currentMonth - 1) / 3) * 3 + 1; startDate = LocalDate.of(today.getYear(), startMonth, 1); endDate = LocalDate.of(today.getYear(), startMonth + 2, 1) .with(TemporalAdjusters.lastDayOfMonth()); break; default: startDate = today.with(DayOfWeek.MONDAY); endDate = today.with(DayOfWeek.SUNDAY); } return new LocalDate[]{startDate, endDate}; } private QualityQualifiedAnalysisDto buildQualifiedAnalysis(List<QualityInspect> list) { List<QualityQualifiedAnalysisDto> result = new ArrayList<>(); QualityQualifiedAnalysisDto dto = new QualityQualifiedAnalysisDto(); if (CollectionUtils.isEmpty(list)) { dto.setQualifiedCount(0); dto.setUnqualifiedCount(0); dto.setQualifiedRate(BigDecimal.ZERO.setScale(2)); dto.setUnqualifiedRate(BigDecimal.ZERO.setScale(2)); return dto; } BigDecimal qualifiedCount = BigDecimal.ZERO; BigDecimal unqualifiedCount = BigDecimal.ZERO; for (QualityInspect item : list) { if ("åæ ¼".equals(item.getCheckResult())) { qualifiedCount = qualifiedCount.add(item.getQuantity()); } else { unqualifiedCount = unqualifiedCount.add(item.getQuantity()); } } BigDecimal totalCount = qualifiedCount.add(unqualifiedCount); dto.setQualifiedCount(qualifiedCount.intValue()); dto.setUnqualifiedCount(unqualifiedCount.intValue()); if (totalCount.compareTo(BigDecimal.ZERO) == 0) { dto.setQualifiedRate(BigDecimal.ZERO.setScale(2)); dto.setUnqualifiedRate(BigDecimal.ZERO.setScale(2)); return dto; } BigDecimal hundred = BigDecimal.valueOf(100); dto.setQualifiedRate(qualifiedCount.divide(totalCount, 4, RoundingMode.HALF_UP) .multiply(hundred) .setScale(2, RoundingMode.HALF_UP)); dto.setUnqualifiedRate(unqualifiedCount.divide(totalCount, 4, RoundingMode.HALF_UP) .multiply(hundred) .setScale(2, RoundingMode.HALF_UP)); return dto; } @Override public QualityInspectionCountDto qualityInspectionCount() { // è·åä»å¤©çå¼å§åç»ææ¥æ,å 嫿¶åç§ LocalDateTime todayStart = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0); LocalDateTime todayEnd = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59).withNano(0); // è·ååä¸å¤©çå¼å§åç»ææ¥æ,å 嫿¶åç§ LocalDateTime prevStart = todayStart.minusDays(1); LocalDateTime prevEnd = todayEnd.minusDays(1); // æ¥è¯¢åºæªæ¢ä»æ¥çæ»æ£éªæ° List<QualityInspect> todayList = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() // .eq(QualityInspect::getInspectState, 1) .le(QualityInspect::getCheckTime, todayEnd)); // æ¥è¯¢åºæªæ¢åä¸å¤©çæ»æ£éªæ° List<QualityInspect> prevList = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() // .eq(QualityInspect::getInspectState, 1) .le(QualityInspect::getCheckTime, prevEnd)); // 计ç®ä»æ¥çæ»æ£éªæ° BigDecimal todayCount = todayList.stream() .map(QualityInspect::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®åä¸å¤©çæ»æ£éªæ° BigDecimal prevCount = prevList.stream() .map(QualityInspect::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®ä»æ¥ç¸å¯¹æ¨å¤©çä¸ä¸ªæ»æ¯å¢é¿ BigDecimal growthRate = calcGrowthRate(todayCount, prevCount); // 计ç®ä»å¤©çå¾ å®ææ°é List<QualityInspect> todayPendingList = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectState, 0) .ge(QualityInspect::getCheckTime, todayStart) .le(QualityInspect::getCheckTime, todayEnd)); // 计ç®åä¸å¤©çå¾ å®ææ°é List<QualityInspect> prevPendingList = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectState, 0) .ge(QualityInspect::getCheckTime, prevStart) .le(QualityInspect::getCheckTime, prevEnd)); // 计ç®ä»å¤©çå¾ å®ææ°é BigDecimal todayPendingCount = todayPendingList.stream() .map(QualityInspect::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®åä¸å¤©çå¾ å®ææ°é BigDecimal prevPendingCount = prevPendingList.stream() .map(QualityInspect::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®ä»å¤©çå¾ å®ææ°éç¸å¯¹æ¨å¤©çä¸ä¸ªåæ¯å¢é¿ BigDecimal todayPendingCountGrowthRate = calcGrowthRate(todayPendingCount, prevPendingCount); // 计ç®ä»å¤©ç已宿æ°é List<QualityInspect> todayCompletedList = qualityInspectMapper .selectList(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectState, 1) .ge(QualityInspect::getCheckTime, todayStart) .le(QualityInspect::getCheckTime, todayEnd)); // 计ç®åä¸å¤©ç已宿æ°é List<QualityInspect> prevCompletedList = qualityInspectMapper .selectList(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectState, 1) .ge(QualityInspect::getCheckTime, prevStart) .le(QualityInspect::getCheckTime, prevEnd)); // 计ç®ä»å¤©ç已宿æ°é BigDecimal todayCompletedCount = todayCompletedList.stream() .map(QualityInspect::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®åä¸å¤©ç已宿æ°é BigDecimal prevCompletedCount = prevCompletedList.stream() .map(QualityInspect::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®ä»å¤©ç已宿æ°éç¸å¯¹æ¨å¤©çä¸ä¸ªåæ¯å¢é¿ BigDecimal todayCompletedCountGrowthRate = calcGrowthRate(todayCompletedCount, prevCompletedCount); QualityInspectionCountDto dto = new QualityInspectionCountDto(); dto.setTotalCount(todayCount); dto.setTotalCountGrowthRate(growthRate); dto.setTodayPendingCount(todayPendingCount); dto.setTodayPendingCountGrowthRate(todayPendingCountGrowthRate); dto.setTodayCompletedCount(todayCompletedCount); dto.setTodayCompletedCountGrowthRate(todayCompletedCountGrowthRate); return dto; } private BigDecimal calcGrowthRate(BigDecimal today, BigDecimal prev) { if (prev == null || prev.compareTo(BigDecimal.ZERO) == 0) { return BigDecimal.ZERO.setScale(2); } return today.subtract(prev) .divide(prev, 4, RoundingMode.HALF_UP) .multiply(BigDecimal.valueOf(100)) .setScale(2, RoundingMode.HALF_UP); } @Override public NonComplianceWarningDto nonComplianceWarning() { // è¿ä¸å¤©æ¶é´åºé´ LocalDateTime[] range = lastSevenDaysRange(); LocalDateTime startTime = range[0]; LocalDateTime endTime = range[1]; // æ¥è¯¢è¿ä¸å¤©å·²å¤çä¸åæ ¼æ°æ® List<QualityUnqualified> list = qualityUnqualifiedMapper.selectList( new LambdaQueryWrapper<QualityUnqualified>() .eq(QualityUnqualified::getInspectState, 1) .ge(QualityUnqualified::getCheckTime, startTime) .le(QualityUnqualified::getCheckTime, endTime)); NonComplianceWarningDto dto = new NonComplianceWarningDto(); if (CollectionUtils.isEmpty(list)) { dto.setRawMaterialRatio(BigDecimal.ZERO); dto.setSemiFinishedProductRatio(BigDecimal.ZERO); dto.setFinishedProductRatio(BigDecimal.ZERO); dto.setChildren(new ArrayList<>()); return dto; } // æ¥è¯¢ææäº§å List<Product> products = productMapper.selectList(null); Map<Long, Product> productMap = products.stream() .collect(Collectors.toMap(Product::getId, p -> p)); BigDecimal rawMaterialCount = BigDecimal.ZERO; BigDecimal semiFinishedCount = BigDecimal.ZERO; BigDecimal finishedCount = BigDecimal.ZERO; List<NonComplianceWarningDto.Item> children = new ArrayList<>(); for (QualityUnqualified item : list) { BigDecimal quantity = item.getQuantity(); Long productId = item.getProductId(); Product product = productMap.get(productId); if (product == null) { continue; } // æ¾å°äº§å大类 Product parent = product.getParentId() == null ? product : productMap.get(product.getParentId()); if (parent == null) { continue; } switch (parent.getProductName()) { case "åææ": rawMaterialCount = rawMaterialCount.add(quantity); break; case "åæå": semiFinishedCount = semiFinishedCount.add(quantity); break; case "æå": finishedCount = finishedCount.add(quantity); break; default: break; } // ç»è£ æç» NonComplianceWarningDto.Item child = new NonComplianceWarningDto.Item(); // child.setProductTitle(item.getProductName()); child.setParentProductTitle(parent.getProductName()); child.setProductTitle(item.getProductName()); child.setDescription(item.getDefectivePhenomena()); child.setDate(formatDate(item.getCheckTime())); children.add(child); } BigDecimal total = rawMaterialCount .add(semiFinishedCount) .add(finishedCount); dto.setRawMaterialRatio(calcRate(rawMaterialCount, total)); dto.setSemiFinishedProductRatio(calcRate(semiFinishedCount, total)); dto.setFinishedProductRatio(calcRate(finishedCount, total)); dto.setChildren(children); return dto; } private BigDecimal calcRate(BigDecimal part, BigDecimal total) { if (total == null || total.compareTo(BigDecimal.ZERO) == 0) { return BigDecimal.ZERO.setScale(2); } return part.divide(total, 4, RoundingMode.HALF_UP) .multiply(BigDecimal.valueOf(100)) .setScale(2, RoundingMode.HALF_UP); } public static String formatDate(Date date) { if (date == null) { return null; } return date.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate() .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); } /** * è·åè¿ä¸å¤©çæ¶é´åºé´ï¼å å«ä»å¤©ï¼ */ public static LocalDateTime[] lastSevenDaysRange() { LocalDate today = LocalDate.now(); LocalDateTime startTime = today.minusDays(6).atStartOfDay(); LocalDateTime endTime = today.atTime(23, 59, 59); return new LocalDateTime[]{startTime, endTime}; } @Override public List<CompletedInspectionCountDto> completedInspectionCount() { // è¿ä¸å¤©æ¶é´åºé´ LocalDateTime[] range = lastSevenDaysRange(); LocalDateTime startTime = range[0]; LocalDateTime endTime = range[1]; // æ¥è¯¢è¿ä¸å¤©å·²å®æçæ£éªæ°æ® List<QualityInspect> list = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectState, 1) .ge(QualityInspect::getCheckTime, startTime) .le(QualityInspect::getCheckTime, endTime)); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd"); Map<String, CompletedInspectionCountDto> resultMap = new LinkedHashMap<>(); for (int i = 6; i >= 0; i--) { LocalDate date = LocalDate.now().minusDays(i); String dateStr = date.format(formatter); CompletedInspectionCountDto dto = new CompletedInspectionCountDto(); dto.setDateStr(dateStr); dto.setQualifiedCount(BigDecimal.ZERO); dto.setUnqualifiedCount(BigDecimal.ZERO); dto.setPassRate(BigDecimal.ZERO); resultMap.put(dateStr, dto); } // ç´¯å åæ ¼ / ä¸åæ ¼æ°é for (QualityInspect item : list) { String dateStr = item.getCheckTime() .toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate() .format(formatter); CompletedInspectionCountDto dto = resultMap.get(dateStr); if (dto == null) { continue; } BigDecimal quantity = item.getQuantity(); if ("åæ ¼".equals(item.getCheckResult())) { dto.setQualifiedCount(dto.getQualifiedCount().add(quantity)); } else { dto.setUnqualifiedCount(dto.getUnqualifiedCount().add(quantity)); } } // 计ç®åæ ¼ç for (CompletedInspectionCountDto dto : resultMap.values()) { BigDecimal total = dto.getQualifiedCount().add(dto.getUnqualifiedCount()); dto.setPassRate(calcRate(dto.getQualifiedCount(), total)); } return new ArrayList<>(resultMap.values()); } @Override public List<UnqualifiedProductRankDto> unqualifiedProductRanking() { List<QualityInspect> list = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectState, 1)); if (CollectionUtils.isEmpty(list)) { return new ArrayList<>(); } Map<Long, String> productNameMap = productMapper.selectList(null) .stream() .collect(Collectors.toMap(Product::getId, Product::getProductName)); Map<Long, List<QualityInspect>> groupMap = list.stream() .collect(Collectors.groupingBy(QualityInspect::getProductId)); List<UnqualifiedProductRankDto> resultList = new ArrayList<>(); for (Map.Entry<Long, List<QualityInspect>> entry : groupMap.entrySet()) { Long productId = entry.getKey(); List<QualityInspect> items = entry.getValue(); BigDecimal totalCount = BigDecimal.ZERO; BigDecimal qualifiedCount = BigDecimal.ZERO; BigDecimal unqualifiedCount = BigDecimal.ZERO; for (QualityInspect item : items) { BigDecimal qty = item.getQuantity(); totalCount = totalCount.add(qty); if ("åæ ¼".equals(item.getCheckResult())) { qualifiedCount = qualifiedCount.add(qty); } else { unqualifiedCount = unqualifiedCount.add(qty); } } if (totalCount.compareTo(BigDecimal.ZERO) == 0) { continue; } BigDecimal passRate = qualifiedCount .divide(totalCount, 4, RoundingMode.HALF_UP) .multiply(new BigDecimal("100")) .setScale(2, RoundingMode.HALF_UP); UnqualifiedProductRankDto dto = new UnqualifiedProductRankDto(); dto.setProductName(productNameMap.get(productId)); dto.setTotalCount(totalCount); dto.setCompletedCount(qualifiedCount); dto.setPassRate(passRate); resultList.add(dto); } resultList.sort(Comparator.comparing(UnqualifiedProductRankDto::getPassRate)); return resultList.stream().limit(5).collect(Collectors.toList()); } @Override public List<MapDto> unqualifiedProductProcessingAnalysis() { List<QualityUnqualified> list = qualityUnqualifiedMapper.selectList(null); if (CollectionUtils.isEmpty(list)) { return new ArrayList<>(); } // ç»è®¡æ¯ç§å¤çç»æçæ°é Map<String, BigDecimal> countMap = new HashMap<>(); for (QualityUnqualified item : list) { if (StringUtils.isEmpty(item.getDealResult()) || item.getQuantity() == null) { continue; } countMap.merge(item.getDealResult(), item.getQuantity(), BigDecimal::add); } if (countMap.isEmpty()) { return new ArrayList<>(); } // è®¡ç®æ»æ° BigDecimal totalCount = countMap.values() .stream() .reduce(BigDecimal.ZERO, BigDecimal::add); if (totalCount.compareTo(BigDecimal.ZERO) == 0) { return new ArrayList<>(); } // ææ°éååºæåº List<Map.Entry<String, BigDecimal>> sortedList = countMap.entrySet() .stream() .sorted((a, b) -> b.getValue().compareTo(a.getValue())) .collect(Collectors.toList()); List<MapDto> result = new ArrayList<>(); int limit = Math.min(3, sortedList.size()); BigDecimal otherCount = BigDecimal.ZERO; for (int i = 0; i < sortedList.size(); i++) { Map.Entry<String, BigDecimal> entry = sortedList.get(i); if (i < limit) { MapDto dto = new MapDto(); dto.setName(entry.getKey()); dto.setValue(entry.getValue().setScale(2, RoundingMode.HALF_UP).toPlainString()); dto.setRate(calcRate(entry.getValue(), totalCount).toString()); result.add(dto); } else { otherCount = otherCount.add(entry.getValue()); } } if (otherCount.compareTo(BigDecimal.ZERO) > 0) { MapDto otherDto = new MapDto(); otherDto.setName("å ¶ä»"); otherDto.setValue(otherCount.setScale(2, RoundingMode.HALF_UP).toPlainString()); otherDto.setRate(calcRate(otherCount, totalCount).toString()); result.add(otherDto); } return result; } } src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @RequestMapping("productOrder") @@ -51,9 +52,31 @@ @Log(title = "ç产订å", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, ProductOrderDto productOrderDto) { List<ProductOrderDto> list; list = productOrderService.pageProductOrder(new Page<>(1, -1), productOrderDto).getRecords(); ExcelUtil<ProductOrderDto> util = new ExcelUtil<ProductOrderDto>(ProductOrderDto.class); List<ProductOrderDto> list = productOrderService.pageProductOrder(new Page<>(1, -1), productOrderDto).getRecords(); if (list != null && !list.isEmpty()) { list.forEach(item -> { // å¤ç©º if (item.getQuantity() == null || item.getCompleteQuantity() == null) { item.setCompletionStatus(BigDecimal.ZERO); return; } // å¤é¶ if (item.getQuantity().compareTo(BigDecimal.ZERO) == 0) { item.setCompletionStatus(BigDecimal.ZERO); return; } BigDecimal progress = item.getCompleteQuantity() .divide(item.getQuantity(), 4, BigDecimal.ROUND_HALF_UP) .multiply(new BigDecimal(100)) .setScale(2, BigDecimal.ROUND_HALF_UP); item.setCompletionStatus(progress); }); } ExcelUtil<ProductOrderDto> util = new ExcelUtil<>(ProductOrderDto.class); util.exportExcel(response, list, "çäº§è®¢åæ°æ®"); } src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java
@@ -1,93 +1,92 @@ package com.ruoyi.production.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.production.dto.ProcessSchedulingDto; import com.ruoyi.production.dto.ProductionReportDto; import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto; import com.ruoyi.production.dto.SalesLedgerWorkDto; import com.ruoyi.production.pojo.SalesLedgerWork; import com.ruoyi.production.service.SalesLedgerWorkService; import com.ruoyi.production.service.impl.SalesLedgerWorkServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.List; /** * @author :yys * @date : 2025/7/21 14:43 */ @RestController @Api(tags = "ç产æ¥å·¥(æäº§è®°å½)") @RequestMapping("/salesLedger/work") @Deprecated // æ 记该类已å¼ç¨ public class SalesLedgerWorkController extends BaseController { @Autowired private SalesLedgerWorkServiceImpl salesLedgerWorkService; @GetMapping("/listPage") @Log(title = "ç产æ¥å·¥-å页æ¥è¯¢", businessType = BusinessType.OTHER) @ApiOperation("ç产æ¥å·¥-å页æ¥è¯¢") public AjaxResult listPage(Page page, SalesLedgerWorkDto salesLedgerWorkDto) { IPage<SalesLedgerWorkDto> listPage = salesLedgerWorkService.listPage(page, salesLedgerWorkDto); return AjaxResult.success(listPage); } /** * å¯¼åº * @param response */ @PostMapping("/export") @ApiOperation("ç产管ç-ç产æ¥å·¥-导åº") public void export(HttpServletResponse response) { Page page = new Page(-1,-1); SalesLedgerWorkDto salesLedgerSchedulingDto = new SalesLedgerWorkDto(); IPage<SalesLedgerWorkDto> result = salesLedgerWorkService.listPage(page,salesLedgerSchedulingDto); result.getRecords().forEach(item -> { item.setDaiNum(item.getFinishedNum().subtract(item.getSchedulingNum())); item.setStatusName(item.getStatus().toString()); }); ExcelUtil<SalesLedgerWorkDto> util = new ExcelUtil<>(SalesLedgerWorkDto.class); util.exportExcel(response, result.getRecords(), "å·¥åºæäº§"); } @GetMapping("/list") @Log(title = "ç产æ¥å·¥-æ¥è¯¢", businessType = BusinessType.OTHER) @ApiOperation("ç产æ¥å·¥-æ¥è¯¢") public AjaxResult list(@RequestParam("id") Long id) { List<ProductionReportDto> list = salesLedgerWorkService.getList(id); return AjaxResult.success(list); } @PostMapping("/productionReport") @Log(title = "ç产管ç-ç产æ¥å·¥", businessType = BusinessType.INSERT) @ApiOperation("ç产管ç-ç产æ¥å·¥") @Transactional(rollbackFor = Exception.class) public AjaxResult productionReport(@RequestBody ProductionReportDto productionReportDto) { int result = salesLedgerWorkService.productionReport(productionReportDto); return AjaxResult.success(result); } @PostMapping("/productionReportUpdate") @Log(title = "ç产管ç-ç产æ¥å·¥-ä¿®æ¹", businessType = BusinessType.UPDATE) @ApiOperation("ç产管ç-ç产æ¥å·¥-ä¿®æ¹") @Transactional(rollbackFor = Exception.class) public AjaxResult productionReportUpdate(@RequestBody ProductionReportDto productionReportDto) { int result = salesLedgerWorkService.productionReportUpdate(productionReportDto); return AjaxResult.success(result); } } //package com.ruoyi.production.controller; // //import com.baomidou.mybatisplus.core.metadata.IPage; //import com.baomidou.mybatisplus.extension.plugins.pagination.Page; //import com.ruoyi.common.utils.poi.ExcelUtil; //import com.ruoyi.framework.aspectj.lang.annotation.Log; //import com.ruoyi.framework.aspectj.lang.enums.BusinessType; //import com.ruoyi.framework.web.controller.BaseController; //import com.ruoyi.framework.web.domain.AjaxResult; //import com.ruoyi.production.dto.ProcessSchedulingDto; //import com.ruoyi.production.dto.ProductionReportDto; //import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto; //import com.ruoyi.production.dto.SalesLedgerWorkDto; //import com.ruoyi.production.pojo.SalesLedgerWork; //import com.ruoyi.production.service.SalesLedgerWorkService; //import io.swagger.annotations.Api; //import io.swagger.annotations.ApiOperation; //import org.springframework.beans.factory.annotation.Autowired; //import org.springframework.transaction.annotation.Transactional; //import org.springframework.web.bind.annotation.*; // //import javax.servlet.http.HttpServletResponse; //import java.util.List; // ///** // * @author :yys // * @date : 2025/7/21 14:43 // */ //@RestController //@Api(tags = "ç产æ¥å·¥(æäº§è®°å½)") //@RequestMapping("/salesLedger/work") //@Deprecated // æ 记该类已å¼ç¨ //public class SalesLedgerWorkController extends BaseController { // // // @Autowired // private SalesLedgerWorkServiceImpl salesLedgerWorkService; // // @GetMapping("/listPage") // @Log(title = "ç产æ¥å·¥-å页æ¥è¯¢", businessType = BusinessType.OTHER) // @ApiOperation("ç产æ¥å·¥-å页æ¥è¯¢") // public AjaxResult listPage(Page page, SalesLedgerWorkDto salesLedgerWorkDto) { // IPage<SalesLedgerWorkDto> listPage = salesLedgerWorkService.listPage(page, salesLedgerWorkDto); // return AjaxResult.success(listPage); // } // // /** // * å¯¼åº // * @param response // */ // @PostMapping("/export") // @ApiOperation("ç产管ç-ç产æ¥å·¥-导åº") // public void export(HttpServletResponse response) { // Page page = new Page(-1,-1); // SalesLedgerWorkDto salesLedgerSchedulingDto = new SalesLedgerWorkDto(); // IPage<SalesLedgerWorkDto> result = salesLedgerWorkService.listPage(page,salesLedgerSchedulingDto); // result.getRecords().forEach(item -> { // item.setDaiNum(item.getFinishedNum().subtract(item.getSchedulingNum())); // item.setStatusName(item.getStatus().toString()); // }); // ExcelUtil<SalesLedgerWorkDto> util = new ExcelUtil<>(SalesLedgerWorkDto.class); // util.exportExcel(response, result.getRecords(), "å·¥åºæäº§"); // } // // @GetMapping("/list") // @Log(title = "ç产æ¥å·¥-æ¥è¯¢", businessType = BusinessType.OTHER) // @ApiOperation("ç产æ¥å·¥-æ¥è¯¢") // public AjaxResult list(@RequestParam("id") Long id) { // List<ProductionReportDto> list = salesLedgerWorkService.getList(id); // return AjaxResult.success(list); // } // // @PostMapping("/productionReport") // @Log(title = "ç产管ç-ç产æ¥å·¥", businessType = BusinessType.INSERT) // @ApiOperation("ç产管ç-ç产æ¥å·¥") // @Transactional(rollbackFor = Exception.class) // public AjaxResult productionReport(@RequestBody ProductionReportDto productionReportDto) { // int result = salesLedgerWorkService.productionReport(productionReportDto); // return AjaxResult.success(result); // } // // // @PostMapping("/productionReportUpdate") // @Log(title = "ç产管ç-ç产æ¥å·¥-ä¿®æ¹", businessType = BusinessType.UPDATE) // @ApiOperation("ç产管ç-ç产æ¥å·¥-ä¿®æ¹") // @Transactional(rollbackFor = Exception.class) // public AjaxResult productionReportUpdate(@RequestBody ProductionReportDto productionReportDto) { // int result = salesLedgerWorkService.productionReportUpdate(productionReportDto); // return AjaxResult.success(result); // } // //} src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
@@ -39,8 +39,8 @@ @Excel(name = "å·¥èºè·¯çº¿ç¼å·") private String processRouteCode; @ApiModelProperty(value = "å®æç¶æ") @Excel(name = "å®æç¶æ") @ApiModelProperty(value = "宿è¿åº¦") @Excel(name = "宿è¿åº¦", suffix = "%") private BigDecimal completionStatus; @ApiModelProperty(value = "BOMç¼å·") @@ -54,4 +54,7 @@ @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate deliveryDate; //æ¯å¦åè´§(å°è´¦é¡µé¢é¢è²æ§å¶) private Boolean isFh; } src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
@@ -17,10 +17,6 @@ public interface ProductOrderMapper extends BaseMapper<ProductOrder> { IPage<ProductOrderDto> pageProductOrder(Page page, @Param("c") ProductOrderDto productOrder); /** * æ ¹æ®è®¢åIDæ¥è¯¢å·¥åæ¥å·¥ */ ProductOrderDto productMainByOrderId(@Param("c") ProductOrder productOrder); List<ProcessRoute> listProcessRoute(@Param("productModelId") Long productModelId); src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java
@@ -10,6 +10,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.ArrayList; import java.util.List; @Mapper @@ -30,4 +31,6 @@ ProductOrder getOrderByMainId(@Param("productMainId") Long productMainId); IPage<ProductionProductMainDto> listProductionDetails(@Param("ew") SalesLedgerProductionAccountingDto salesLedgerProductionAccountingDto, Page page); ArrayList<Long> listMain(List<Long> idList); } src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java
@@ -38,4 +38,7 @@ private Integer dragSort; @ApiModelProperty(value ="æ¯å¦è´¨æ£") private Boolean isQuality; } src/main/java/com/ruoyi/production/pojo/ProductOrder.java
@@ -30,12 +30,13 @@ /** * éå®å°è´¦äº§åid(sales_ledger_product) */ @ApiModelProperty(value = "éå®å°è´¦äº§åid") private Long saleLedgerProductId; /** * éå®å°è´¦äº§åid(sales_ledger_product) * 产åè§æ ¼id */ @ApiModelProperty(value = "éå®å°è´¦äº§åid") @ApiModelProperty(value = "产åè§æ ¼id") private Long productModelId; /** src/main/java/com/ruoyi/production/pojo/ProductProcess.java
@@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -70,5 +71,8 @@ @TableField(fill = FieldFill.INSERT) private Long tenantId; @ApiModelProperty(value ="æ¯å¦è´¨æ£") private Boolean isQuality; } src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
@@ -38,4 +38,7 @@ @ApiModelProperty(value ="æå¨æåº") private Integer dragSort; @ApiModelProperty(value ="æ¯å¦è´¨æ£") private Boolean isQuality; } src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
@@ -24,6 +24,7 @@ private BigDecimal quantity; @ApiModelProperty(value = "å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty(value = "ç§æ·ID") src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java
@@ -20,10 +20,11 @@ @ApiModelProperty(value = "产åid") private Long productModelId; @ApiModelProperty(value = "æ¥å·¥æ°é") @ApiModelProperty(value = "æ¥å·¥æ°é(æ»æ°é)") private BigDecimal quantity; @ApiModelProperty(value = "å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty(value = "ç§æ·ID") src/main/java/com/ruoyi/production/pojo/SalesLedgerProductionAccounting.java
@@ -23,24 +23,9 @@ private Long id; /** * éå®æäº§-æ¥å·¥è¡¨id * æ¥å·¥è¡¨id */ private Long salesLedgerWorkId; /** * éå®æäº§è¡¨id */ private Long salesLedgerSchedulingId; /** * éå®å°è´¦id */ private Long salesLedgerId; /** * éå®äº§åid */ private Long salesLedgerProductId; private Long productMainId; /** * ç产人id @@ -101,6 +86,5 @@ @TableField(fill = FieldFill.INSERT) private Long tenantId; private Long ProductMainId; } src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
@@ -6,10 +6,15 @@ import com.ruoyi.production.dto.ProductionProductMainDto; import com.ruoyi.production.pojo.ProductionProductMain; import java.util.ArrayList; import java.util.List; public interface ProductionProductMainService extends IService<ProductionProductMain> { IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page page, ProductionProductMainDto productionProductMainDto); Boolean addProductMain(ProductionProductMainDto productionProductMainDto); Boolean removeProductMain(Long id); ArrayList<Long> listMain(List<Long> idList); } src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
@@ -101,14 +101,12 @@ // // å é¤è´¨æ£ // qualityInspectMapper.delete(new LambdaQueryWrapper<QualityInspect>() // .eq(QualityInspect::getProductMainId, mainId)); salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>() .eq(SalesLedgerProductionAccounting::getProductMainId, main.getId())); } } // æ¥è¯¢è®¢å + å 餿 ¸ç® ProductOrder productOrder = productOrderMapper.selectById(productOrderId); if (productOrder != null && productOrder.getSalesLedgerId() != null) { salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>() .eq(SalesLedgerProductionAccounting::getSalesLedgerId, productOrder.getSalesLedgerId())); } // å é¤å ³èå·¥å productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>() .eq(ProductWorkOrder::getProductProcessRouteItemId, routeItemId)); src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
@@ -62,11 +62,19 @@ if(CollectionUtils.isEmpty(productProcessList)){ return AjaxResult.warn("模æ¿é误æå¯¼å ¥æ°æ®ä¸ºç©º"); } productProcessList.forEach(productProcess -> { if (ObjectUtils.isEmpty(productProcess)) { throw new RuntimeException("ä½¿ç¨æ¨¡æ¿è¿è¡å¯¼å ¥"); } if (ObjectUtils.isEmpty(productProcess.getName())) { throw new RuntimeException("å·¥åºåç§°ä¸è½ä¸ºç©º"); } }); this.saveOrUpdateBatch(productProcessList); return AjaxResult.success(true); }catch (Exception e){ e.printStackTrace(); return AjaxResult.error("å¯¼å ¥å¤±è´¥"); return AjaxResult.error(e.getMessage()); } } src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -33,6 +33,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -163,41 +164,46 @@ //åªæåæ ¼æ°é>0æè½å¢å ç¸åºæ°æ® if (productQty.compareTo(BigDecimal.ZERO) > 0) { /*æ°å¢è´¨æ£*/ //对åºçè¿ç¨æ£æè åºåæ£ List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId())); int inspectType = 1; String process = productProcess.getName();//å·¥åº if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) { //æåä¸éå·¥åºçæåºåæ£ inspectType = 2; process = null; } Product product = productMapper.selectById(productModel.getProductId()); QualityInspect qualityInspect = new QualityInspect(); qualityInspect.setProductId(product.getId()); qualityInspect.setProductName(product.getProductName()); qualityInspect.setModel(productModel.getModel()); qualityInspect.setUnit(productModel.getUnit()); qualityInspect.setQuantity(productQty); qualityInspect.setProcess(process); qualityInspect.setInspectState(0); qualityInspect.setInspectType(inspectType); qualityInspect.setProductMainId(productionProductMain.getId()); qualityInspect.setProductModelId(productModel.getId()); qualityInspectMapper.insert(qualityInspect); List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process); if (qualityTestStandard.size() > 0) { qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId()); qualityInspectMapper.updateById(qualityInspect); qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery() .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId()))//é»è®¤è·åææ°ç .forEach(qualityTestStandardParam -> { QualityInspectParam param = new QualityInspectParam(); BeanUtils.copyProperties(qualityTestStandardParam, param); param.setId(null); param.setInspectId(qualityInspect.getId()); qualityInspectParamMapper.insert(param); }); if (productProcessRouteItem.getIsQuality()) { //对åºçè¿ç¨æ£æè åºåæ£ int inspectType = 1; String process = productProcess.getName();//å·¥åº if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) { //æåä¸éå·¥åºçæåºåæ£ inspectType = 2; process = null; } Product product = productMapper.selectById(productModel.getProductId()); QualityInspect qualityInspect = new QualityInspect(); qualityInspect.setProductId(product.getId()); qualityInspect.setProductName(product.getProductName()); qualityInspect.setModel(productModel.getModel()); qualityInspect.setUnit(productModel.getUnit()); qualityInspect.setQuantity(productQty); qualityInspect.setProcess(process); qualityInspect.setInspectState(0); qualityInspect.setInspectType(inspectType); qualityInspect.setProductMainId(productionProductMain.getId()); qualityInspect.setProductModelId(productModel.getId()); qualityInspectMapper.insert(qualityInspect); List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process); if (qualityTestStandard.size() > 0) { qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId()); qualityInspectMapper.updateById(qualityInspect); qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery() .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId()))//é»è®¤è·åææ°ç .forEach(qualityTestStandardParam -> { QualityInspectParam param = new QualityInspectParam(); BeanUtils.copyProperties(qualityTestStandardParam, param); param.setId(null); param.setInspectId(qualityInspect.getId()); qualityInspectParamMapper.insert(param); }); } }else { //ç´æ¥å ¥åº stockUtils.addStock(productProcessRouteItem.getProductModelId(), productionProductOutput.getQuantity(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId()); } /*æ´æ°å·¥ååç产订å*/ ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId()); @@ -224,10 +230,7 @@ productOrderMapper.updateById(productOrder); /*æ·»å çäº§æ ¸ç®*/ SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder() .salesLedgerWorkId(productionProductMain.getId()) .salesLedgerSchedulingId(0L) .salesLedgerId(productOrder.getSalesLedgerId()) .salesLedgerProductId(productOrder.getSaleLedgerProductId()) .productMainId(productionProductMain.getId()) .schedulingUserId(user.getUserId()) .schedulingUserName(user.getNickName()) .finishedNum(productQty) @@ -240,7 +243,7 @@ } //妿æ¥åºæ°é>0,éè¦è¿å ¥æ¥åºçåºå if (ObjectUtils.isNotEmpty(dto.getScrapQty())) { if (BigDecimal.ZERO.compareTo(dto.getScrapQty()) > 0) { if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) { stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId()); } } @@ -256,7 +259,7 @@ /*å 餿 ¸ç®*/ salesLedgerProductionAccountingMapper.delete( new LambdaQueryWrapper<SalesLedgerProductionAccounting>() .eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, productionProductMain.getId()) .eq(SalesLedgerProductionAccounting::getProductMainId, productionProductMain.getId()) ); /*æ´æ°å·¥ååç产订å*/ ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId()); @@ -289,10 +292,17 @@ .eq(ProductionProductInput::getProductMainId, productionProductMain.getId())); //å 餿¥åºçå ¥åºè®°å½ stockUtils.deleteStockInRecord(productionProductMain.getId(), StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode()); //å é¤ä¸éè¦è´¨æ£çåæ ¼å ¥åº stockUtils.deleteStockInRecord(productionProductMain.getId(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode()); //å é¤æå ¥å¯¹åºçåºåºè®°å½ stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode()); // å é¤ä¸»è¡¨ productionProductMainMapper.deleteById(productionProductMain.getId()); return true; } @Override public ArrayList<Long> listMain(List<Long> idList) { return productionProductMainMapper.listMain(idList); } } src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java
@@ -1,185 +1,182 @@ package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.security.LoginUser; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.procurementrecord.dto.Details; import com.ruoyi.procurementrecord.dto.ProcurementAddDto; import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd; import com.ruoyi.procurementrecord.service.impl.ProcurementRecordOutServiceImpl; import com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl; import com.ruoyi.production.dto.ProductionReportDto; import com.ruoyi.production.dto.SalesLedgerWorkDto; import com.ruoyi.production.mapper.SalesLedgerProductionAccountingMapper; import com.ruoyi.production.mapper.SalesLedgerWorkMapper; import com.ruoyi.production.pojo.SalesLedgerProductionAccounting; import com.ruoyi.production.pojo.SalesLedgerWork; import com.ruoyi.production.service.SalesLedgerProductionAccountingService; import com.ruoyi.production.service.SalesLedgerWorkService; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.sales.mapper.LossMapper; import com.ruoyi.sales.pojo.Loss; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * @author :yys * @date : 2025/7/21 14:40 */ @Service @RequiredArgsConstructor @Slf4j public class SalesLedgerWorkServiceImpl extends ServiceImpl<SalesLedgerWorkMapper, SalesLedgerWork> implements SalesLedgerWorkService { private final SalesLedgerWorkMapper salesLedgerWorkMapper; private final SysUserMapper sysUserMapper; private final LossMapper lossMapper; private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; @Override public IPage<SalesLedgerWorkDto> listPage(Page page, SalesLedgerWorkDto salesLedgerWorkDto) { IPage<SalesLedgerWorkDto> iPage = salesLedgerWorkMapper.listPage(page, salesLedgerWorkDto); List<Loss> losses = lossMapper.selectList(null); if(!CollectionUtils.isEmpty(losses)){ iPage.getRecords().forEach(item -> { String[] split = item.getSpecificationModel().split("\\*"); if(split.length == 2 && isNumeric(split[1]) && isNumeric(split[0])){ // è®¡ç®æèï¼100000代表 æèç 100 å åä½è½¬æ¢ç1000ï¼ BigDecimal divide = new BigDecimal(split[0]) .multiply(new BigDecimal(split[1])) .multiply(item.getFinishedNum()) .multiply(losses.get(0).getRate()) .divide(new BigDecimal(100000), 2, RoundingMode.HALF_UP); item.setLoss(divide.toString()); } }); } return iPage; } public static boolean isNumeric(String str) { if (str == null || str.isEmpty()) { return false; } // éååç¬¦ä¸²çæ¯ä¸ªåç¬¦ï¼æ£æ¥æ¯å¦ä¸ºæ°å for (int i = 0; i < str.length(); i++) { if (!Character.isDigit(str.charAt(i))) { return false; } } return true; } private final ProcurementRecordServiceImpl procurementRecordService; @Override public int productionReport(ProductionReportDto productionReportDto) { SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(productionReportDto.getId()); SysUser sysUser = sysUserMapper.selectUserById(productionReportDto.getSchedulingUserId()); if (salesLedgerWork == null) throw new RuntimeException("æ¥å·¥æ°æ®ä¸åå¨"); if (salesLedgerWork.getStatus() == 3) throw new RuntimeException("æ¥å·¥å·²å®æ"); if (sysUser == null) throw new RuntimeException("ç产人ä¸åå¨"); salesLedgerWork.setFinishedNum(salesLedgerWork.getFinishedNum().add(productionReportDto.getFinishedNum())); if(salesLedgerWork.getSchedulingNum().compareTo(salesLedgerWork.getFinishedNum()) <= 0){ salesLedgerWork.setStatus(3); }else{ salesLedgerWork.setStatus(2); } salesLedgerWorkMapper.updateById(salesLedgerWork); // æ°å¢æ¥å·¥æ°æ® SalesLedgerProductionAccounting.SalesLedgerProductionAccountingBuilder builder = SalesLedgerProductionAccounting.builder() .salesLedgerWorkId(salesLedgerWork.getId()) .salesLedgerSchedulingId(salesLedgerWork.getSalesLedgerSchedulingId()) .salesLedgerId(salesLedgerWork.getSalesLedgerId()) .salesLedgerProductId((long)salesLedgerWork.getSalesLedgerProductId()) .schedulingUserId(sysUser.getUserId()) .schedulingUserName(sysUser.getNickName()) .finishedNum(productionReportDto.getFinishedNum()) .workHours(salesLedgerWork.getWorkHours()) .process(salesLedgerWork.getProcess()) .schedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE)); salesLedgerProductionAccountingMapper.insert(builder.build()); // ç产æ¥å·¥æå -> å ¥åº LoginUser loginUser = SecurityUtils.getLoginUser(); ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto(); procurementRecordOutAdd.setType(2); procurementRecordOutAdd.setTypeName("çäº§å ¥åº"); procurementRecordOutAdd.setNickName(loginUser.getNickName()); List<Details> details = new ArrayList<>(); Details details1 = new Details(); details1.setInboundQuantity(productionReportDto.getFinishedNum()); details1.setId(Integer.parseInt(salesLedgerWork.getSalesLedgerProductId().toString())); details1.setUnitPrice(productionReportDto.getUnitPrice()); details1.setTotalPrice(productionReportDto.getTotalPrice()); details.add(details1); procurementRecordOutAdd.setDetails(details); procurementRecordService.add(procurementRecordOutAdd); return 0; } @Override public int productionReportUpdate(ProductionReportDto productionReportDto) { SalesLedgerProductionAccounting salesLedgerProductionAccounting = salesLedgerProductionAccountingMapper.selectById(productionReportDto.getId()); if(salesLedgerProductionAccounting == null) throw new RuntimeException("æ¥å·¥æ°æ®ä¸åå¨"); SysUser sysUser = sysUserMapper.selectUserById(productionReportDto.getSchedulingUserId()); if(sysUser == null) throw new RuntimeException("ç产人ä¸åå¨"); salesLedgerProductionAccounting.setFinishedNum(productionReportDto.getFinishedNum()); salesLedgerProductionAccounting.setSchedulingUserId(sysUser.getUserId()); salesLedgerProductionAccounting.setSchedulingUserName(sysUser.getNickName()); salesLedgerProductionAccounting.setSchedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE)); salesLedgerProductionAccountingMapper.updateById(salesLedgerProductionAccounting); // æ´æ°æ¥å·¥æ°æ® SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(salesLedgerProductionAccounting.getSalesLedgerWorkId()); if(salesLedgerWork == null) throw new RuntimeException("æ¥å·¥æ°æ®ä¸åå¨"); salesLedgerWork.setFinishedNum(productionReportDto.getFinishedNum()); if(salesLedgerWork.getSchedulingNum().compareTo(salesLedgerWork.getFinishedNum()) <= 0){ salesLedgerWork.setStatus(3); }else{ salesLedgerWork.setStatus(2); } salesLedgerWork.setSchedulingUserId(sysUser.getUserId()); salesLedgerWork.setSchedulingUserName(sysUser.getNickName()); salesLedgerWork.setSchedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE)); salesLedgerWorkMapper.updateById(salesLedgerWork); return 0; } @Override public List<ProductionReportDto> getList(Long id) { SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(id); if(salesLedgerWork == null) throw new RuntimeException("æ¥å·¥æ°æ®ä¸åå¨"); LambdaQueryWrapper<SalesLedgerProductionAccounting> salesLedgerProductionAccountingLambdaQueryWrapper = new LambdaQueryWrapper<>(); salesLedgerProductionAccountingLambdaQueryWrapper.eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, id); List<SalesLedgerProductionAccounting> salesLedgerProductionAccountingList = salesLedgerProductionAccountingMapper.selectList(salesLedgerProductionAccountingLambdaQueryWrapper); if(CollectionUtils.isEmpty(salesLedgerProductionAccountingList)) throw new RuntimeException("没æçäº§è®°å½æ°æ®"); return salesLedgerProductionAccountingList.stream().map(salesLedgerProductionAccounting -> { ProductionReportDto productionReportDto = new ProductionReportDto(); BeanUtils.copyProperties(salesLedgerProductionAccounting, productionReportDto); productionReportDto.setSchedulingDate(salesLedgerProductionAccounting.getSchedulingDate().format(DateTimeFormatter.ISO_LOCAL_DATE)); productionReportDto.setSchedulingNum(salesLedgerWork.getSchedulingNum()); return productionReportDto; }).collect(Collectors.toList()); } } //package com.ruoyi.production.service.impl; // //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; //import com.baomidou.mybatisplus.core.metadata.IPage; //import com.baomidou.mybatisplus.extension.plugins.pagination.Page; //import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; //import com.ruoyi.common.utils.SecurityUtils; //import com.ruoyi.framework.security.LoginUser; //import com.ruoyi.framework.web.domain.AjaxResult; //import com.ruoyi.procurementrecord.dto.Details; //import com.ruoyi.procurementrecord.dto.ProcurementAddDto; //import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd; //import com.ruoyi.procurementrecord.service.impl.ProcurementRecordOutServiceImpl; //import com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl; //import com.ruoyi.production.dto.ProductionReportDto; //import com.ruoyi.production.dto.SalesLedgerWorkDto; //import com.ruoyi.production.mapper.SalesLedgerProductionAccountingMapper; //import com.ruoyi.production.mapper.SalesLedgerWorkMapper; //import com.ruoyi.production.pojo.SalesLedgerProductionAccounting; //import com.ruoyi.production.pojo.SalesLedgerWork; //import com.ruoyi.production.service.SalesLedgerProductionAccountingService; //import com.ruoyi.production.service.SalesLedgerWorkService; //import com.ruoyi.project.system.domain.SysUser; //import com.ruoyi.project.system.mapper.SysUserMapper; //import com.ruoyi.sales.mapper.LossMapper; //import com.ruoyi.sales.pojo.Loss; //import lombok.RequiredArgsConstructor; //import lombok.extern.slf4j.Slf4j; //import org.springframework.beans.BeanUtils; //import org.springframework.stereotype.Service; //import org.springframework.util.CollectionUtils; // //import java.math.BigDecimal; //import java.math.RoundingMode; //import java.time.LocalDate; //import java.time.format.DateTimeFormatter; //import java.util.ArrayList; //import java.util.List; //import java.util.stream.Collectors; // ///** // * @author :yys // * @date : 2025/7/21 14:40 // */ //@Service //@RequiredArgsConstructor //@Slf4j //public class SalesLedgerWorkServiceImpl extends ServiceImpl<SalesLedgerWorkMapper, SalesLedgerWork> implements SalesLedgerWorkService { // // private final SalesLedgerWorkMapper salesLedgerWorkMapper; // // private final SysUserMapper sysUserMapper; // // private final LossMapper lossMapper; // // private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; // // @Override // public IPage<SalesLedgerWorkDto> listPage(Page page, SalesLedgerWorkDto salesLedgerWorkDto) { // IPage<SalesLedgerWorkDto> iPage = salesLedgerWorkMapper.listPage(page, salesLedgerWorkDto); // List<Loss> losses = lossMapper.selectList(null); // if(!CollectionUtils.isEmpty(losses)){ // iPage.getRecords().forEach(item -> { // String[] split = item.getSpecificationModel().split("\\*"); // if(split.length == 2 && isNumeric(split[1]) && isNumeric(split[0])){ // // è®¡ç®æèï¼100000代表 æèç 100 å åä½è½¬æ¢ç1000ï¼ // BigDecimal divide = new BigDecimal(split[0]) // .multiply(new BigDecimal(split[1])) // .multiply(item.getFinishedNum()) // .multiply(losses.get(0).getRate()) // .divide(new BigDecimal(100000), 2, RoundingMode.HALF_UP); // item.setLoss(divide.toString()); // } // // }); // } // return iPage; // } // // public static boolean isNumeric(String str) { // if (str == null || str.isEmpty()) { // return false; // } // // éååç¬¦ä¸²çæ¯ä¸ªåç¬¦ï¼æ£æ¥æ¯å¦ä¸ºæ°å // for (int i = 0; i < str.length(); i++) { // if (!Character.isDigit(str.charAt(i))) { // return false; // } // } // return true; // } // // private final ProcurementRecordServiceImpl procurementRecordService; // // @Override // public int productionReport(ProductionReportDto productionReportDto) { // SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(productionReportDto.getId()); // SysUser sysUser = sysUserMapper.selectUserById(productionReportDto.getSchedulingUserId()); // if (salesLedgerWork == null) throw new RuntimeException("æ¥å·¥æ°æ®ä¸åå¨"); // if (salesLedgerWork.getStatus() == 3) throw new RuntimeException("æ¥å·¥å·²å®æ"); // if (sysUser == null) throw new RuntimeException("ç产人ä¸åå¨"); // salesLedgerWork.setFinishedNum(salesLedgerWork.getFinishedNum().add(productionReportDto.getFinishedNum())); // if(salesLedgerWork.getSchedulingNum().compareTo(salesLedgerWork.getFinishedNum()) <= 0){ // salesLedgerWork.setStatus(3); // }else{ // salesLedgerWork.setStatus(2); // } // salesLedgerWorkMapper.updateById(salesLedgerWork); // // æ°å¢æ¥å·¥æ°æ® // SalesLedgerProductionAccounting.SalesLedgerProductionAccountingBuilder builder = SalesLedgerProductionAccounting.builder() // .productMainId(null) // .schedulingUserId(sysUser.getUserId()) // .schedulingUserName(sysUser.getNickName()) // .finishedNum(productionReportDto.getFinishedNum()) // .workHours(salesLedgerWork.getWorkHours()) // .process(salesLedgerWork.getProcess()) // .schedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE)); // salesLedgerProductionAccountingMapper.insert(builder.build()); // // ç产æ¥å·¥æå -> å ¥åº // LoginUser loginUser = SecurityUtils.getLoginUser(); // ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto(); // procurementRecordOutAdd.setType(2); // procurementRecordOutAdd.setTypeName("çäº§å ¥åº"); // procurementRecordOutAdd.setNickName(loginUser.getNickName()); // List<Details> details = new ArrayList<>(); // Details details1 = new Details(); // details1.setInboundQuantity(productionReportDto.getFinishedNum()); // details1.setId(Integer.parseInt(salesLedgerWork.getSalesLedgerProductId().toString())); // details1.setUnitPrice(productionReportDto.getUnitPrice()); // details1.setTotalPrice(productionReportDto.getTotalPrice()); // details.add(details1); // procurementRecordOutAdd.setDetails(details); // procurementRecordService.add(procurementRecordOutAdd); // // return 0; // } // // @Override // public int productionReportUpdate(ProductionReportDto productionReportDto) { // SalesLedgerProductionAccounting salesLedgerProductionAccounting = salesLedgerProductionAccountingMapper.selectById(productionReportDto.getId()); // if(salesLedgerProductionAccounting == null) throw new RuntimeException("æ¥å·¥æ°æ®ä¸åå¨"); // SysUser sysUser = sysUserMapper.selectUserById(productionReportDto.getSchedulingUserId()); // if(sysUser == null) throw new RuntimeException("ç产人ä¸åå¨"); // salesLedgerProductionAccounting.setFinishedNum(productionReportDto.getFinishedNum()); // salesLedgerProductionAccounting.setSchedulingUserId(sysUser.getUserId()); // salesLedgerProductionAccounting.setSchedulingUserName(sysUser.getNickName()); // salesLedgerProductionAccounting.setSchedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE)); // salesLedgerProductionAccountingMapper.updateById(salesLedgerProductionAccounting); // // // æ´æ°æ¥å·¥æ°æ® // SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(salesLedgerProductionAccounting.getSalesLedgerWorkId()); // if(salesLedgerWork == null) throw new RuntimeException("æ¥å·¥æ°æ®ä¸åå¨"); // salesLedgerWork.setFinishedNum(productionReportDto.getFinishedNum()); // if(salesLedgerWork.getSchedulingNum().compareTo(salesLedgerWork.getFinishedNum()) <= 0){ // salesLedgerWork.setStatus(3); // }else{ // salesLedgerWork.setStatus(2); // } // salesLedgerWork.setSchedulingUserId(sysUser.getUserId()); // salesLedgerWork.setSchedulingUserName(sysUser.getNickName()); // salesLedgerWork.setSchedulingDate(LocalDate.parse(productionReportDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE)); // salesLedgerWorkMapper.updateById(salesLedgerWork); // return 0; // } // // @Override // public List<ProductionReportDto> getList(Long id) { // SalesLedgerWork salesLedgerWork = salesLedgerWorkMapper.selectById(id); // if(salesLedgerWork == null) throw new RuntimeException("æ¥å·¥æ°æ®ä¸åå¨"); // LambdaQueryWrapper<SalesLedgerProductionAccounting> salesLedgerProductionAccountingLambdaQueryWrapper = new LambdaQueryWrapper<>(); // salesLedgerProductionAccountingLambdaQueryWrapper.eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, id); // List<SalesLedgerProductionAccounting> salesLedgerProductionAccountingList = salesLedgerProductionAccountingMapper.selectList(salesLedgerProductionAccountingLambdaQueryWrapper); // if(CollectionUtils.isEmpty(salesLedgerProductionAccountingList)) throw new RuntimeException("没æçäº§è®°å½æ°æ®"); // return salesLedgerProductionAccountingList.stream().map(salesLedgerProductionAccounting -> { // ProductionReportDto productionReportDto = new ProductionReportDto(); // BeanUtils.copyProperties(salesLedgerProductionAccounting, productionReportDto); // productionReportDto.setSchedulingDate(salesLedgerProductionAccounting.getSchedulingDate().format(DateTimeFormatter.ISO_LOCAL_DATE)); // productionReportDto.setSchedulingNum(salesLedgerWork.getSchedulingNum()); // return productionReportDto; // }).collect(Collectors.toList()); // } //} src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
@@ -40,9 +40,11 @@ */ @DeleteMapping("/del") public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) { if(CollectionUtils.isEmpty(ids)){ return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); } qualityUnqualifiedService.listByIds(ids).stream().forEach(qualityUnqualified -> { if (qualityUnqualified.getInspectState()==1){ throw new RuntimeException("该ä¸åæ ¼æ°æ®å·²ç»å¤çæ æ³å é¤!"); } }); return AjaxResult.success(qualityUnqualifiedService.removeBatchByIds(ids)); } src/main/java/com/ruoyi/safe/service/impl/SafeTrainingServiceImpl.java
@@ -67,7 +67,7 @@ @Override public int addOrUpdate(SafeTraining safeTraining) { if (ObjectUtils.isNull(safeTraining.getId())) { String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd")); String datePrefix ="KC-"+ LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd")); // æ¥è¯¢ä»æ¥å·²åå¨çæå¤§è¯¾ç¨ç¼å· QueryWrapper<SafeTraining> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("course_code", datePrefix) @@ -87,7 +87,7 @@ } } // çæå®æ´ç课ç¨ç¼å· String no = "KC-" + String.format("%s%03d", datePrefix, sequenceNumber); String no = String.format("%s%03d", datePrefix, sequenceNumber); safeTraining.setCourseCode(no); } //æ ¹æ®æ¶é´å¤æå¹è®ç¶æ src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -139,5 +139,9 @@ @TableField(exist = false) @ApiModelProperty(value = "交货天æ°å·®") private Integer deliveryDaysDiff; @TableField(exist = false) //æ¯å¦åè´§(å°è´¦é¡µé¢é¢è²æ§å¶) private Boolean isFh; } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -15,6 +15,7 @@ import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.impl.SalesLedgerProductionAccountingServiceImpl; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.quality.mapper.QualityInspectMapper; @@ -92,6 +93,8 @@ private ProductStructureMapper productStructureMapper; @Autowired private StockInventoryMapper stockInventoryMapper; @Autowired private SalesLedgerProductionAccountingServiceImpl salesLedgerProductionAccountingServiceImpl; @Override public SalesLedgerProduct selectSalesLedgerProductById(Long id) { @@ -228,9 +231,7 @@ /*å é¤å¯¹åºççäº§æ°æ®å¹¶éæ°æ°å¢*/ deleteProductionData(Arrays.asList(salesLedgerProduct.getId())); // å é¤çäº§æ ¸ç®æ°æ® LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>(); reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, salesLedgerId); salesLedgerProductionAccountingMapper.delete(reportWrapper); addProductionData(salesLedgerProduct); } @@ -407,6 +408,8 @@ } }); qualityInspectMapper.deleteByProductMainIds(productMainIds); salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>() .in(SalesLedgerProductionAccounting::getProductMainId, productMainIds)); } // å é¤çäº§ä¸»è¡¨æ°æ® src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -25,6 +25,8 @@ import com.ruoyi.other.pojo.TempFile; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductionProductMainService; import com.ruoyi.production.service.impl.ProductionProductMainServiceImpl; import com.ruoyi.project.system.domain.SysDept; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysDeptMapper; @@ -146,7 +148,9 @@ private ProductMapper productMapper; @Autowired private ProductStructureMapper productStructureMapper; ; @Autowired private ProductionProductMainService productionProductMainService; ; @Override public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) { @@ -173,6 +177,14 @@ product.setTempNoInvoiceNum(product.getNoInvoiceNum()); product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName()); product.setRegisterDate(LocalDateTime.now()); // åè´§ä¿¡æ¯ ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>() .eq(ShippingInfo::getSalesLedgerProductId, product.getId()) .orderByDesc(ShippingInfo::getCreateTime) .last("limit 1")); if (shippingInfo != null) { product.setShippingStatus(shippingInfo.getStatus()); } } // 3.æ¥è¯¢ä¸ä¼ æä»¶ @@ -342,7 +354,7 @@ // // 产åå¤§ç±»æ°æ® // List<Product> productList = productMapper.selectList(new LambdaQueryWrapper<Product>().in(Product::getProductName, // salesLedgerProductImportDtoList.stream().map(SalesLedgerImportDto::getProductCategory).collect(Collectors.toList()))); List<Map<String,Object>> list = productModelMapper.getProductAndModelList(); List<Map<String, Object>> list = productModelMapper.getProductAndModelList(); // å½å ¥äººæ°æ® List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>().in(SysUser::getNickName, salesLedgerImportDtoList.stream().map(SalesLedgerImportDto::getEntryPerson).collect(Collectors.toList()))); @@ -350,7 +362,7 @@ SalesLedger salesLedger1 = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>() .eq(SalesLedger::getSalesContractNo, salesLedgerImportDto.getSalesContractNo()) .last("LIMIT 1")); if(salesLedger1 != null){ if (salesLedger1 != null) { continue; } SalesLedger salesLedger = new SalesLedger(); @@ -383,7 +395,7 @@ throw new RuntimeException("éå®åå·:" + salesLedgerImportDto.getSalesContractNo() + ",æ 对åºäº§åæ°æ®ï¼"); salesLedger.setContractAmount(salesLedgerProductImportDtos.stream() .map(SalesLedgerProductImportDto::getTaxInclusiveTotalPrice) .reduce(BigDecimal.ZERO,BigDecimal::add)); .reduce(BigDecimal.ZERO, BigDecimal::add)); salesLedgerMapper.insert(salesLedger); @@ -418,6 +430,8 @@ salesLedgerProduct.setApproveStatus(0); salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProductImportDto.getTaxInclusiveTotalPrice()); salesLedgerProductMapper.insert(salesLedgerProduct); // æ·»å çäº§æ°æ® salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct); } } @@ -542,26 +556,21 @@ } // å é¤åè´§å°è´¦è®°å½ List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>() .eq(ShippingInfo::getSalesLedgerId, idList)); if(CollectionUtils.isNotEmpty(shippingInfos)){ .in(ShippingInfo::getSalesLedgerId, idList)); if (CollectionUtils.isNotEmpty(shippingInfos)) { shippingInfoServiceImpl.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList())); } // å é¤é件表 commonFileService.deleteByBusinessIds(idList, FileNameType.SALE.getValue()); // å é¤çäº§ç®¡æ§æ°æ® // å é¤çäº§è®¢åæ°æ® LambdaQueryWrapper<SalesLedgerScheduling> in = new LambdaQueryWrapper<SalesLedgerScheduling>() .in(SalesLedgerScheduling::getSalesLedgerId, idList); salesLedgerSchedulingMapper.delete(in); // å é¤çäº§æ´¾å·¥æ°æ® LambdaQueryWrapper<SalesLedgerWork> workOrderWrapper = new LambdaQueryWrapper<>(); workOrderWrapper.in(SalesLedgerWork::getSalesLedgerId, idList); salesLedgerWorkMapper.delete(workOrderWrapper); // å é¤çäº§æ ¸ç®æ°æ® LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>(); reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, idList); salesLedgerProductionAccountingMapper.delete(reportWrapper); //æ¥è¯¢ç产æ¥å·¥id ArrayList<Long> mainIdList = productionProductMainService.listMain(idList); if (CollectionUtils.isNotEmpty(mainIdList)) { mainIdList.stream().forEach(mainId -> { productionProductMainService.removeProductMain(mainId); }); } // 2. åå é¤ä¸»è¡¨æ°æ® return salesLedgerMapper.deleteBatchIds(idList); } src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -104,4 +104,10 @@ public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) { return R.ok(stockInventoryService.thawStock(stockInventoryDto)); } @GetMapping("/getById") @ApiOperation("éè¿idæ¥è¯¢åºå") public R getById(Long id) { return R.ok(stockInventoryService.getStcokById(id)); } } src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.stock.pojo.StockInventory; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -39,4 +40,33 @@ private BigDecimal currentStock; private BigDecimal unLockedQuantity; @ApiModelProperty("ç¶ID") private Long parentId; /** * 产åå¾ç */ // @Excel(name = "产åå¾ç") private String url; /** * é«åº¦ */ private String height; /** * æ¯ä»¶æ°é/æ¯ */ private String boxNum; /** * åä»·(ç¾å )/ä»¶ */ private String dollarPrice; /** * åä»·(å )/ä»¶ */ private String taxInclusiveUnitPrice; } src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -48,4 +48,6 @@ List<Map<String, Object>> selectDailyStockOutCounts(@Param("rootCategoryId") Long rootCategoryId, @Param("startDate") String startDate, @Param("endDate") String endDate); BigDecimal selectTotalByDate( @Param("now") LocalDate now); StockInventoryDto getStcokById(@Param("id") Long id); } src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -38,4 +38,6 @@ Boolean frozenStock(StockInventoryDto stockInventoryDto); Boolean thawStock(StockInventoryDto stockInventoryDto); StockInventoryDto getStcokById(Long id); } src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -206,4 +206,9 @@ stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity())); return this.updateById(stockInventory); } @Override public StockInventoryDto getStcokById(Long id) { return stockInventoryMapper.getStcokById( id); } } src/main/resources/application-new.yml
@@ -13,7 +13,8 @@ addressEnabled: false # éªè¯ç ç±»å math æ°åè®¡ç® char å符éªè¯ captchaType: math # åå审æ¹ç¼å·åç¼(é ç½®æä»¶åç¼å½å) approvalNumberPrefix: NEW # å¼åç¯å¢é ç½® server: # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 src/main/resources/application.yml
@@ -2,3 +2,7 @@ spring: profiles: active: dev # 项ç®ç¸å ³é ç½® ruoyi: # åå审æ¹ç¼å·åç¼(é ç½®æä»¶åç¼å½å) approvalNumberPrefix: SQD src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -106,5 +106,10 @@ left join product p on p.id = pm.product_id order by p.id,pm.id desc </select> <select id="listProduct" resultType="java.util.HashMap"> select id,product_name as name from product where parent_id is null </select> </mapper> src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -23,9 +23,21 @@ pb.bom_no, ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus, DATEDIFF(sl.delivery_date, CURDATE()) AS delivery_days_diff, sl.delivery_date sl.delivery_date, CASE WHEN shipping_status_counts.total_count = 0 THEN false WHEN shipping_status_counts.unshipped_count = 0 THEN true ELSE false END AS is_fh from product_order po left join sales_ledger sl on po.sales_ledger_id = sl.id LEFT JOIN ( SELECT sales_ledger_id, COUNT(*) as total_count, SUM(CASE WHEN status != 'å·²åè´§' THEN 1 ELSE 0 END) as unshipped_count FROM shipping_info GROUP BY sales_ledger_id ) shipping_status_counts ON sl.id = shipping_status_counts.sales_ledger_id left join sales_ledger_product slp on po.sale_ledger_product_id = slp.id left join product_process_route ppr on po.id = ppr.product_order_id left join product_bom pb on pb.id = ppr.bom_id @@ -50,23 +62,11 @@ </if> </where> </select> <select id="productMainByOrderId" resultType="com.ruoyi.production.dto.ProductOrderDto"> select po.*, pwo.work_order_no, pwo.report_work, pwo.status, pwo.quantity, pwo.plan_quantity from product_order po left join product_work_order pwo on po.id = pwo.product_order_id where po.id = #{c.id} </select> <select id="listProcessRoute" resultType="com.ruoyi.production.pojo.ProcessRoute"> select pr.* from process_route pr left join product_model pm on pr.product_model_id = pm.id left join sales_ledger_product slp on pm.id = slp.product_model_id where slp.id = #{productModelId} where pm.id = #{productModelId} </select> <select id="listProcessBom" resultType="com.ruoyi.production.dto.ProductStructureDto"> select ps.id, src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -71,7 +71,7 @@ slpa.work_hours * slpa.finished_num AS wages FROM production_product_main ppm LEFT JOIN sales_ledger_production_accounting slpa ON slpa.sales_ledger_work_id = ppm.id LEFT JOIN sales_ledger_production_accounting slpa ON slpa.product_main_id = ppm.id LEFT JOIN production_product_output ppo ON ppm.id = ppo.product_main_id LEFT JOIN product_work_order pwo ON pwo.id = ppm.work_order_id LEFT JOIN product_order po ON po.id = pwo.product_order_id @@ -93,6 +93,20 @@ </if> </where> </select> <select id="listMain" resultType="java.lang.Long"> SELECT ppm.id FROM production_product_main ppm left join product_work_order pwo on pwo.id = ppm.work_order_id left join product_order po on po.id = pwo.product_order_id left join sales_ledger sl on sl.id = po.sales_ledger_id <where> <if test="idList != null and idList.size() > 0"> and sl.id in <foreach item="id" collection="idList" open="(" separator="," close=")"> #{id} </foreach> </if> </where> </select> <delete id="deleteByWorkOrderIds" parameterType="java.util.List"> DELETE FROM production_product_main src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
@@ -68,7 +68,7 @@ '%' ) as output_rate FROM sales_ledger_production_accounting slpa LEFT JOIN production_product_main ppm ON slpa.sales_ledger_work_id = ppm.id LEFT JOIN production_product_main ppm ON slpa.product_main_id = ppm.id LEFT JOIN production_product_output ppout ON ppm.id = ppout.product_main_id <where> <if test="ew.schedulingUserName != null and ew.schedulingUserName !=''"> src/main/resources/mapper/safe/SafeTrainingMapper.xml
@@ -38,6 +38,7 @@ left join safe_training_details std on std.safe_training_id = st.id left join sys_user su on st.assessment_user_id = su.user_id where st.state = #{c.state} GROUP BY st.id <if test="c.placeTraining != null and c.placeTraining != ''"> and st.place_training like concat('%', #{c.placeTraining}, '%') </if> src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -43,8 +43,7 @@ </select> <select id="selectSalesLedgerListPage" resultType="com.ruoyi.sales.pojo.SalesLedger"> SELECT T1.id, SELECT T1.id, T1.sales_contract_no, T1.customer_contract_no, T1.project_name, @@ -57,15 +56,26 @@ T1.attachment_materials, T1.tenant_id, T1.contract_amount, T1.contract_amount as noInvoiceAmountTotal, T1.contract_amount as noInvoiceAmountTotal, T1.execution_date, T2.nick_name AS entry_person_name, T2.nick_name AS entry_person_name, T1.payment_method, T1.delivery_date, DATEDIFF(T1.delivery_date, CURDATE()) AS delivery_days_diff FROM sales_ledger T1 DATEDIFF(T1.delivery_date, CURDATE()) AS delivery_days_diff, CASE WHEN shipping_status_counts.total_count = 0 THEN false WHEN shipping_status_counts.unshipped_count = 0 THEN true ELSE false END AS is_fh FROM sales_ledger T1 LEFT JOIN sys_user T2 ON T1.entry_person = T2.user_id LEFT JOIN ( SELECT sales_ledger_id, COUNT(*) as total_count, SUM(CASE WHEN status != 'å·²åè´§' THEN 1 ELSE 0 END) as unshipped_count FROM shipping_info GROUP BY sales_ledger_id ) shipping_status_counts ON T1.id = shipping_status_counts.sales_ledger_id <where> <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' "> AND T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%') src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -64,13 +64,21 @@ pm.model, si.remark, pm.unit, p.product_name p.product_name, pm.url, pm.height, pm.box_num, pm. dollar_price, pm.tax_inclusive_unit_price from stock_inventory si left join product_model pm on si.product_model_id = pm.id left join product p on pm.product_id = p.id where 1 = 1 <if test="ew.productName != null and ew.productName !=''"> and p.product_name like concat('%',#{ew.productName},'%') </if> <if test="ew.parentId != null"> and p.parent_id = #{ew.parentId} </if> </select> <select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockInventoryExportData"> @@ -234,5 +242,30 @@ GROUP BY DATE(sor.create_time) ORDER BY DATE(sor.create_time) ASC </select> <select id="getStcokById" resultType="com.ruoyi.stock.dto.StockInventoryDto"> select si.id, si.qualitity, COALESCE(si.locked_quantity, 0) as locked_quantity, si.product_model_id, si.create_time, si.update_time, COALESCE(si.warn_num, 0) as warn_num, si.version, (si.qualitity - COALESCE(si.locked_quantity, 0)) as un_locked_quantity, pm.model, si.remark, pm.unit, p.product_name, pm.url, pm.height, pm.box_num, pm. dollar_price, pm.tax_inclusive_unit_price, si.create_by from stock_inventory si left join product_model pm on si.product_model_id = pm.id left join product p on pm.product_id = p.id where si.id = #{id} </select> </mapper>