src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -11,9 +11,9 @@ import com.ruoyi.approve.pojo.ApproveNode; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.IApproveNodeService; import com.ruoyi.approve.vo.ApproveProcessVO; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.device.mapper.DeviceRepairMapper; import com.ruoyi.device.pojo.DeviceRepair; @@ -31,7 +31,6 @@ import com.ruoyi.sales.pojo.SalesQuotation; import com.ruoyi.sales.pojo.ShippingInfo; import com.ruoyi.sales.service.impl.CommonFileServiceImpl; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -206,7 +205,7 @@ purchaseLedgerServiceImpl.addQualityInspect(purchaseLedger, salesLedgerProduct); }else { //ç´æ¥å ¥åº stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId()); stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId()); } } } else if (status.equals(3)) { src/main/java/com/ruoyi/basic/controller/EnumController.java
@@ -1,7 +1,7 @@ package com.ruoyi.basic.controller; import com.ruoyi.basic.utils.EnumUtils; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.utils.EnumUtil; import com.ruoyi.framework.aspectj.lang.annotation.Anonymous; import com.ruoyi.framework.web.domain.R; @@ -24,13 +24,13 @@ @GetMapping("/stockRecordType") @Anonymous public R getStockRecordTypeEnum(){ List<Map<String, Object>> list = EnumUtil.toList(StockQualifiedRecordTypeEnum.class); List<Map<String, Object>> list = EnumUtil.toList(StockOutQualifiedRecordTypeEnum.class); return R.ok(list); } @GetMapping("/{className}") @Anonymous public R test(@PathVariable String className){ public R stockRecordTypeByClassName(@PathVariable("className") String className){ return R.ok(EnumUtils.getOptions("com.ruoyi.common.enums." + className)); } } src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
@@ -25,6 +25,7 @@ import com.ruoyi.collaborativeApproval.vo.SearchMeetingDraftVo; import com.ruoyi.collaborativeApproval.vo.SearchMeetingRoomVo; import com.ruoyi.collaborativeApproval.vo.SearchMeetingUseVo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.web.domain.R; import com.ruoyi.project.system.domain.SysUser; @@ -34,7 +35,9 @@ import com.ruoyi.staff.pojo.StaffOnJob; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -83,7 +86,22 @@ } @Override @Transactional(rollbackFor = Exception.class) public void deleteMeetingRoom(Long id) { if (id == null){ throw new ServiceException("å é¤ä¼è®®å®¤å¤±è´¥,ä¼è®®å®¤IDä¸è½ä¸ºç©º"); } LocalDateTime now = LocalDateTime.now(); List<MeetApplication> meetApplicationList = meetApplicationMapper.selectList(Wrappers.<MeetApplication>lambdaQuery() .eq(MeetApplication::getRoomId, id) .gt(MeetApplication::getEndTime, now) .in(MeetApplication::getStatus, Arrays.asList(0, 1))); if (!meetApplicationList.isEmpty()){ throw new ServiceException("å é¤ä¼è®®å®¤å¤±è´¥,该ä¼è®®å®¤å°ææªå¼å§æè¿è¡ä¸çææä¼è®®é¢çº¦"); } meetingRoomMapper.deleteById(id); } src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ package com.ruoyi.common.enums; import lombok.Getter; @Getter public enum StockInQualifiedRecordTypeEnum implements BaseEnum<String> { CUSTOMIZATION_STOCK_IN("0", "åæ ¼èªå®ä¹å ¥åº"), PRODUCTION_REPORT_STOCK_IN("2", "ç产æ¥å·¥-å ¥åº"), PURCHASE_STOCK_IN("7", "éè´-å ¥åº"), QUALITYINSPECT_STOCK_IN("11", "è´¨æ£-åæ ¼å ¥åº"), DEFECTIVE_PASS("11", "ä¸åæ ¼-è®©æ¥æ¾è¡"); private final String code; private final String value; StockInQualifiedRecordTypeEnum(String code, String value) { this.code = code; this.value = value; } } src/main/java/com/ruoyi/common/enums/StockInUnQualifiedRecordTypeEnum.java
ÎļþÃû´Ó src/main/java/com/ruoyi/common/enums/StockUnQualifiedRecordTypeEnum.java ÐÞ¸Ä @@ -4,20 +4,19 @@ @Getter public enum StockUnQualifiedRecordTypeEnum implements BaseEnum<String> { public enum StockInUnQualifiedRecordTypeEnum implements BaseEnum<String> { PRODUCTION_SCRAP("4", "ç产æ¥å·¥-æ¥åº"), DEFECTIVE_SCRAP("5", "ä¸åæ ¼å¤ç-æ¥åº"), PRODUCTION_SCRAP("5", "ç产æ¥å·¥-æ¥åº"), CUSTOMIZATION_UNSTOCK_IN("9", "ä¸åæ ¼èªå®ä¹å ¥åº"), CUSTOMIZATION_UNSTOCK_OUT("10", "ä¸åæ ¼èªå®ä¹åºåº"), QUALITYINSPECT_UNSTOCK_IN("12", "è´¨æ£-ä¸åæ ¼å ¥åº"); private final String code; private final String value; StockUnQualifiedRecordTypeEnum(String code, String value) { StockInUnQualifiedRecordTypeEnum(String code, String value) { this.code = code; this.value = value; } src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package com.ruoyi.common.enums; import lombok.Getter; @Getter public enum StockOutQualifiedRecordTypeEnum implements BaseEnum<String> { CUSTOMIZATION_STOCK_OUT("1", "åæ ¼èªå®ä¹åºåº"), PRODUCTION_REPORT_STOCK_OUT("3", "ç产æ¥å·¥-åºåº"), SALE_STOCK_OUT("8", "éå®-åºåº"), SALE_SHIP_STOCK_OUT("13", "éå®-åè´§åºåº"); private final String code; private final String value; StockOutQualifiedRecordTypeEnum(String code, String value) { this.code = code; this.value = value; } } src/main/java/com/ruoyi/common/enums/StockOutUnQualifiedRecordTypeEnum.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package com.ruoyi.common.enums; import lombok.Getter; @Getter public enum StockOutUnQualifiedRecordTypeEnum implements BaseEnum<String> { CUSTOMIZATION_UNSTOCK_OUT("10", "ä¸åæ ¼èªå®ä¹åºåº"); private final String code; private final String value; StockOutUnQualifiedRecordTypeEnum(String code, String value) { this.code = code; this.value = value; } } src/main/java/com/ruoyi/common/enums/StockQualifiedRecordTypeEnum.java
ÎļþÒÑɾ³ý 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,63 +105,23 @@ return AjaxResult.success(list); } @GetMapping("/salesPurchaseStorageProductCount") @ApiOperation("éå®-éè´-å¨åäº§åæ°") public AjaxResult salesPurchaseStorageProductCount(){ List<MapDto> list = homeService.salesPurchaseStorageProductCount(); return AjaxResult.success(list); @GetMapping("/business") @Log(title = "éå®-éè´-åºåæ°æ®", businessType = BusinessType.OTHER) @ApiOperation("éå®-éè´-åºåæ°æ®") public AjaxResult business(HomeBusinessDto req) { HomeBusinessDto homeBusinessDto = homeService.business(); return AjaxResult.success(homeBusinessDto); } @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("/analysisCustomerContractAmounts") @Log(title = "客æ·ååéé¢åæ", businessType = BusinessType.OTHER) @ApiOperation("客æ·ååéé¢åæ") public AjaxResult analysisCustomerContractAmounts(AnalysisCustomerContractAmountsDto req) { AnalysisCustomerContractAmountsDto analysisCustomerContractAmounts = homeService.analysisCustomerContractAmounts(); return AjaxResult.success(analysisCustomerContractAmounts); } @GetMapping("/productTurnoverDays") @ApiOperation("产åå¨è½¬å¤©æ°") public AjaxResult productTurnoverDays(){ List<MapDto> list = homeService.productTurnoverDays(); return AjaxResult.success(list); } @GetMapping("/incomeExpenseAnalysis") @ApiOperation("æ¯æ¶å¯¹æ¯åæ") public AjaxResult incomeExpenseAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type) { List<Map<String, Object>> result = homeService.incomeExpenseAnalysis(type); return AjaxResult.success(result); } @GetMapping("/profitTrendAnalysis") @ApiOperation("婿¶¦è¶å¿åæ") public AjaxResult profitTrendAnalysis(){ List<MapDto> list = homeService.profitTrendAnalysis(); return AjaxResult.success(list); } @GetMapping("/expenseCompositionAnalysis") @ApiOperation("ææåæ") public AjaxResult expenseCompositionAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type) { List<MapDto> list = homeService.expenseCompositionAnalysis(type); return AjaxResult.success(list); } @GetMapping("/monthlyIncome") @ApiOperation("æåº¦æ¶å ¥") public AjaxResult monthlyIncome(){ MonthlyIncomeDto dto = homeService.monthlyIncome(); return AjaxResult.success(dto); } @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){ @@ -176,7 +130,7 @@ } @GetMapping("/processOutputAnalysis") @ApiOperation("å·¥åºäº§åºåæ") @ApiOperation("å·¥åºäº§åºåæ") public AjaxResult processOutputAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){ List<MapDto> list = homeService.processOutputAnalysis(type); return AjaxResult.success(list); @@ -202,6 +156,21 @@ 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){ @@ -255,42 +224,6 @@ return AjaxResult.success(list); } /********************************************************è¥ééè´ç±»**************************************************/ @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("è´¨éåæ") @@ -299,8 +232,42 @@ return AjaxResult.success(qualityStatisticsDto); } /********************************************************è´¢å¡ç±»*****************************************************/ @GetMapping("/incomeExpenseAnalysis") @ApiOperation("æ¯æ¶å¯¹æ¯åæ") public AjaxResult incomeExpenseAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type) { List<Map<String, Object>> result = homeService.incomeExpenseAnalysis(type); return AjaxResult.success(result); } @GetMapping("/profitTrendAnalysis") @ApiOperation("婿¶¦è¶å¿åæ") public AjaxResult profitTrendAnalysis(){ List<MapDto> list = homeService.profitTrendAnalysis(); return AjaxResult.success(list); } @GetMapping("/expenseCompositionAnalysis") @ApiOperation("ææåæ") public AjaxResult expenseCompositionAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type) { List<MapDto> list = homeService.expenseCompositionAnalysis(type); return AjaxResult.success(list); } @GetMapping("/monthlyIncome") @ApiOperation("æåº¦æ¶å ¥") public AjaxResult monthlyIncome(){ MonthlyIncomeDto dto = homeService.monthlyIncome(); return AjaxResult.success(dto); } @GetMapping("/monthlyExpenditure") @ApiOperation("æåº¦æ¯åº") public AjaxResult monthlyExpenditure(){ MonthlyExpenditureDto dto = homeService.monthlyExpenditure(); return AjaxResult.success(dto); } @GetMapping("/statisticsReceivablePayable") @Log(title = "åºæ¶åºä»ç»è®¡", businessType = BusinessType.OTHER) @ApiOperation("åºæ¶åºä»ç»è®¡") @@ -309,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/service/impl/HomeServiceImpl.java
@@ -1729,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); } } @@ -1746,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()); src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -87,4 +87,15 @@ } @ApiOperation("æ°å¢ç产订å") @PostMapping("addProductOrder") public R addProductOrder(@RequestBody ProductOrder productOrder) { return R.ok(productOrderService.addProductOrder(productOrder)); } @ApiOperation("å é¤ç产订å") @DeleteMapping("/{ids}") public R delete(@PathVariable("ids") Long[] ids) { return R.ok(productOrderService.delete(ids)); } } 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/mapper/ProductWorkOrderMapper.java
@@ -20,4 +20,6 @@ ProductWorkOrderDto getProductWorkOrderFlowCard(@Param("id") Long id); List<ProductWorkOrderDto> selectWorkOrderStartStats(@Param("startDate") String startDate, @Param("endDate") String endDate); ProductWorkOrder selectMax(@Param("datePrefix") String datePrefix); } 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/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/ProductOrderService.java
@@ -21,4 +21,8 @@ List<ProcessRoute> listProcessRoute(Long productModelId); List<ProductStructureDto> listProcessBom(Long orderId); Boolean addProductOrder(ProductOrder productOrder); Boolean delete(Long[] id); } 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/ProductOrderServiceImpl.java
@@ -1,22 +1,29 @@ package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.production.dto.ProductBomDto; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProcessRouteService; import com.ruoyi.production.service.ProductOrderService; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.pojo.QualityInspect; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.stream.Collectors; @Service public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, ProductOrder> implements ProductOrderService { @@ -39,6 +46,23 @@ @Autowired private ProductWorkOrderMapper productWorkOrderMapper; @Autowired private ProductionProductMainMapper productionProductMainMapper; @Autowired private ProductionProductOutputMapper productionProductOutputMapper; @Autowired private ProductionProductInputMapper productionProductInputMapper; @Autowired private QualityInspectMapper qualityInspectMapper; @Autowired private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; @Autowired private StockUtils stockUtils; @Override public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) { @@ -69,11 +93,7 @@ int insert = productProcessRouteItemMapper.insert(productProcessRouteItem); if (insert > 0) { // æ¥è¯¢ä»æ¥å·²åå¨çæå¤§å·¥åå· QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("work_order_no", datePrefix) .orderByDesc("work_order_no") .last("LIMIT 1"); ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper); ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix); int sequenceNumber = 1; // é»è®¤åºå· if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) { String lastNo = lastWorkOrder.getWorkOrderNo().toString(); @@ -87,7 +107,7 @@ } } // çæå®æ´çå·¥åå· String workOrderNoStr ="GD"+ String.format("%s%03d", datePrefix, sequenceNumber); String workOrderNoStr = "GD" + String.format("%s%03d", datePrefix, sequenceNumber); ProductWorkOrder productWorkOrder = new ProductWorkOrder(); productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); productWorkOrder.setProductOrderId(productOrder.getId()); @@ -110,4 +130,139 @@ public List<ProductStructureDto> listProcessBom(Long orderId) { return productOrderMapper.listProcessBom(orderId); } @Override public Boolean addProductOrder(ProductOrder productOrder) { String string = generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))); productOrder.setNpsNo(string); productOrder.setCompleteQuantity(BigDecimal.ZERO); this.save(productOrder); if (ObjectUtils.isNotEmpty(productOrder.getRouteId())) { this.bindingRoute(productOrder); } return true; } @Override public Boolean delete(Long[] ids) { //æ¹éæ¥è¯¢productOrder List<ProductOrder> productOrders = productOrderMapper.selectList( new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getId, ids) ); if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) { // æ¹éæ¥è¯¢processRouteItems List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList( new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, ids) ); if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(allRouteItems)) { // è·åè¦å é¤çå·¥åºé¡¹ID List<Long> routeItemIds = allRouteItems.stream() .map(ProductProcessRouteItem::getId) .collect(Collectors.toList()); // æ¥è¯¢å ³èçå·¥åID List<ProductWorkOrder> workOrders = productWorkOrderMapper.selectList( new LambdaQueryWrapper<ProductWorkOrder>() .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds) ); if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(workOrders)) { List<Long> workOrderIds = workOrders.stream() .map(ProductWorkOrder::getId) .collect(Collectors.toList()); // æ¥è¯¢å ³èçç产主表ID List<ProductionProductMain> productMains = productionProductMainMapper.selectList( new LambdaQueryWrapper<ProductionProductMain>() .in(ProductionProductMain::getWorkOrderId, workOrderIds) ); List<Long> productMainIds = productMains.stream() .map(ProductionProductMain::getId) .collect(Collectors.toList()); // å é¤äº§åºè¡¨ãæå ¥è¡¨æ°æ® if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(productMainIds)) { productionProductOutputMapper.deleteByProductMainIds(productMainIds); productionProductInputMapper.deleteByProductMainIds(productMainIds); List<QualityInspect> qualityInspects = qualityInspectMapper.selectList( new LambdaQueryWrapper<QualityInspect>() .in(QualityInspect::getProductMainId, productMainIds) ); //å é¤åºåºè®°å½ for (Long productMainId : productMainIds) { //å é¤ç产åºåºè®°å½ stockUtils.deleteStockOutRecord(productMainId, StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode()); //å 餿¥åºçå ¥åºè®°å½ stockUtils.deleteStockInRecord(productMainId, StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode()); } qualityInspects.forEach(qualityInspect -> { //inspectState=1 å·²æäº¤ ä¸è½å é¤ if (qualityInspect.getInspectState() == 1) { throw new RuntimeException("å·²æäº¤çæ£éªåä¸è½å é¤"); } }); qualityInspectMapper.deleteByProductMainIds(productMainIds); salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>() .in(SalesLedgerProductionAccounting::getProductMainId, productMainIds)); } // å é¤çäº§ä¸»è¡¨æ°æ® productionProductMainMapper.deleteByWorkOrderIds(workOrderIds); // å é¤å·¥åæ°æ® productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>() .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)); } } // æ¹éå é¤processRouteItem productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, ids)); // æ¹éå é¤productProcessRoute productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>() .in(ProductProcessRoute::getProductOrderId, ids)); // æ¹éå é¤productOrder productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getId, ids)); } return true; } //è·åå½åç产订åå· public String getMaxOrderNoByDate(String datePrefix) { QueryWrapper<ProductOrder> queryWrapper = new QueryWrapper<>(); // å¹é 以 SC + æ¥æå¼å¤´ç订åå· queryWrapper.likeRight("nps_no", "SC" + datePrefix); // æè®¢åå·ååºæå queryWrapper.orderByDesc("nps_no"); queryWrapper.last("LIMIT 1"); ProductOrder latestOrder = this.getOne(queryWrapper); return latestOrder != null ? latestOrder.getNpsNo() : null; } public String generateNextOrderNo(String datePrefix) { String maxOrderNo = getMaxOrderNoByDate(datePrefix); int sequence = 1; // é»è®¤èµ·å§åºå· if (maxOrderNo != null && !maxOrderNo.isEmpty()) { // æåæµæ°´å·é¨åï¼åè®¾æ ¼å¼ä¸º SC + æ¥æ + æµæ°´å·ï¼ String sequenceStr = maxOrderNo.substring(("SC" + datePrefix).length()); try { sequence = Integer.parseInt(sequenceStr) + 1; } catch (NumberFormatException e) { // å¼å¸¸æ åµä¸é置为1 sequence = 1; } } // çææ°è®¢åå· return "SC" + datePrefix + String.format("%04d", sequence); } } 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)); @@ -144,11 +142,7 @@ String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); if (insert > 0) { // æ¥è¯¢ä»æ¥å·²åå¨çæå¤§å·¥åå· QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("work_order_no", datePrefix) .orderByDesc("work_order_no") .last("LIMIT 1"); ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper); ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix); int sequenceNumber = 1; // é»è®¤åºå· if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) { String lastNo = lastWorkOrder.getWorkOrderNo().toString(); src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -11,8 +11,10 @@ import com.ruoyi.basic.mapper.ProductModelMapper; import com.ruoyi.basic.pojo.Product; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.dto.ProductStructureDto; @@ -24,6 +26,7 @@ import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.quality.mapper.*; import com.ruoyi.quality.pojo.*; import com.ruoyi.quality.service.IQualityInspectService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -33,6 +36,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; @@ -41,6 +45,7 @@ @Transactional(rollbackFor = Exception.class) public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService { private IQualityInspectService qualityInspectService; private ProductionProductMainMapper productionProductMainMapper; @@ -148,7 +153,7 @@ productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())); productionProductInput.setProductMainId(productionProductMain.getId()); productionProductInputMapper.insert(productionProductInput); stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId()); stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId()); } /*æ°å¢æ¥å·¥äº§åºè¡¨*/ @@ -202,7 +207,7 @@ } }else { //ç´æ¥å ¥åº stockUtils.addStock(productProcessRouteItem.getProductModelId(), productionProductOutput.getQuantity(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId()); stockUtils.addStock(productProcessRouteItem.getProductModelId(), productionProductOutput.getQuantity(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId()); } /*æ´æ°å·¥ååç产订å*/ ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId()); @@ -229,10 +234,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) @@ -246,13 +248,14 @@ //妿æ¥åºæ°é>0,éè¦è¿å ¥æ¥åºçåºå if (ObjectUtils.isNotEmpty(dto.getScrapQty())) { if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) { stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId()); stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId()); } } return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean removeProductMain(Long id) { ProductionProductMain productionProductMain = productionProductMainMapper.selectById(id); //该æ¥å·¥å¯¹åºçå·¥èºè·¯çº¿è¯¦æ @@ -261,20 +264,39 @@ /*å 餿 ¸ç®*/ salesLedgerProductionAccountingMapper.delete( new LambdaQueryWrapper<SalesLedgerProductionAccounting>() .eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, productionProductMain.getId()) .eq(SalesLedgerProductionAccounting::getProductMainId, productionProductMain.getId()) ); /*æ´æ°å·¥ååç产订å*/ ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId()); productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().subtract(productionProductOutput.getQuantity())); productWorkOrder.setActualEndTime(null); productWorkOrderMapper.updateById(productWorkOrder); if (productWorkOrder != null && productionProductOutput != null) { BigDecimal outputQty = productionProductOutput.getQuantity() == null ? BigDecimal.ZERO : productionProductOutput.getQuantity(); BigDecimal scrapQty = productionProductOutput.getScrapQty() == null ? BigDecimal.ZERO : productionProductOutput.getScrapQty(); BigDecimal completeQty = productWorkOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productWorkOrder.getCompleteQuantity(); BigDecimal validQuantity = outputQty.subtract(scrapQty); productWorkOrder.setCompleteQuantity(completeQty.subtract(validQuantity)); productWorkOrder.setActualEndTime(null); productWorkOrderMapper.updateById(productWorkOrder); } else { throw new ServiceException("æä½å¤±è´¥ï¼å·¥åä¿¡æ¯æäº§åºè®°å½ä¸åå¨"); } //夿æ¯å¦æ¯æåä¸éå·¥åº List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId())); if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) { if (productProcessRouteItem.getDragSort() != null && productProcessRouteItems != null && productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) { ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId()); productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().subtract(productionProductOutput.getQuantity())); productOrder.setEndTime(null); productOrderMapper.updateById(productOrder); if (productOrder != null) { BigDecimal orderCompleteQty = productOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productOrder.getCompleteQuantity(); BigDecimal outputQty = productionProductOutput.getQuantity() != null ? productionProductOutput.getQuantity() : BigDecimal.ZERO; productOrder.setCompleteQuantity(orderCompleteQty.subtract(outputQty)); productOrder.setEndTime(null); productOrderMapper.updateById(productOrder); } else { throw new ServiceException("å ³èçç产订åä¸åå¨"); } } //å é¤è´¨æ£ qualityInspectMapper.selectList( @@ -285,7 +307,9 @@ new LambdaQueryWrapper<QualityInspectParam>() .eq(QualityInspectParam::getInspectId, q.getId())); qualityInspectMapper.deleteById(q.getId()); stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()); }); // å é¤äº§åºè®°å½ productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>() .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId())); @@ -293,13 +317,18 @@ productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>() .eq(ProductionProductInput::getProductMainId, productionProductMain.getId())); //å 餿¥åºçå ¥åºè®°å½ stockUtils.deleteStockInRecord(productionProductMain.getId(), StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode()); stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode()); //å é¤ä¸éè¦è´¨æ£çåæ ¼å ¥åº stockUtils.deleteStockInRecord(productionProductMain.getId(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode()); stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode()); //å é¤æå ¥å¯¹åºçåºåºè®°å½ stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode()); stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockOutQualifiedRecordTypeEnum.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/QualityInspectController.java
@@ -2,21 +2,18 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.quality.dto.QualityInspectDto; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectFile; import com.ruoyi.quality.pojo.QualityInspectParam; import com.ruoyi.quality.pojo.QualityUnqualified; import com.ruoyi.quality.service.IQualityInspectFileService; import com.ruoyi.quality.service.IQualityInspectParamService; import com.ruoyi.quality.service.IQualityInspectService; import com.ruoyi.quality.service.IQualityUnqualifiedService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -74,7 +71,7 @@ .in(QualityInspectFile::getInspectId,ids)); //å é¤å ¥åºè®°å½ for (Integer id : ids) { stockUtils.deleteStockInRecord(Long.valueOf(id), StockQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()); stockUtils.deleteStockInRecord(Long.valueOf(id), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()); } //å 餿£éªå return AjaxResult.success(qualityInspectService.removeBatchByIds(ids)); src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -152,4 +152,9 @@ @ApiModelProperty("å ³èæ£æµæ å主表id") private Long testStandardId; @TableField(exist = false) private String workOrderNo; @TableField(exist = false) private String purchaseContractNo; } src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -8,7 +8,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.utils.HackLoopTableRenderPolicy; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.procurementrecord.service.ProcurementRecordService; @@ -93,7 +94,7 @@ qualityUnqualifiedMapper.insert(qualityUnqualified); } else { //åæ ¼ç´æ¥å ¥åº stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId()); stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId()); } qualityInspect.setInspectState(1);//å·²æäº¤ return qualityInspectMapper.updateById(qualityInspect); src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -7,8 +7,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.procurementrecord.utils.StockUtils; @@ -98,11 +99,7 @@ int insert = productProcessRouteItemMapper.insert(productProcessRouteItem); if (insert > 0) { // æ¥è¯¢ä»æ¥å·²åå¨çæå¤§å·¥åå· QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("work_order_no", datePrefix) .orderByDesc("work_order_no") .last("LIMIT 1"); ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper); ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix); int sequenceNumber = 1; // é»è®¤åºå· if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) { String lastNo = lastWorkOrder.getWorkOrderNo().toString(); @@ -130,11 +127,11 @@ break; case "æ¥åº": //è°ç¨ä¸åæ ¼åºåæ¥å£ å ¥ä¸åæ ¼åº stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId()); stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId()); break; case "è®©æ¥æ¾è¡": //è°ç¨æäº¤åæ ¼çæ¥å£ stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId()); stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId()); qualityInspect.setCheckResult("åæ ¼"); qualityInspectService.submit(qualityInspect); break; src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -1,29 +1,18 @@ package com.ruoyi.sales.controller; 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.google.common.math.LongMath; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.procurementrecord.dto.ProcurementAddDto; import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd; import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.procurementrecord.service.ProcurementRecordOutService; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.sales.mapper.ShipmentApprovalMapper; import com.ruoyi.sales.mapper.ShippingInfoMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.pojo.ShipmentApproval; import com.ruoyi.sales.pojo.ShippingInfo; import com.ruoyi.sales.service.ISalesLedgerProductService; import com.ruoyi.sales.service.ShipmentApprovalService; import com.ruoyi.sales.service.ShippingInfoService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -31,9 +20,6 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @RestController @@ -101,7 +87,7 @@ //åºåº stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId()); stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId()); } return AjaxResult.success(); src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -37,7 +37,7 @@ /** * 客æ·ååå· */ @Excel(name = "客æ·ååå·") @Excel(name = "客æ·ååå·", type = Excel.Type.IMPORT) private String customerContractNo; src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -5,16 +5,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.framework.web.domain.R; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.impl.ProductOrderServiceImpl; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.quality.mapper.QualityInspectMapper; @@ -25,7 +24,6 @@ import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.mapper.ShippingInfoMapper; import com.ruoyi.sales.pojo.InvoiceRegistrationProduct; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.pojo.ShippingInfo; @@ -92,6 +90,8 @@ private ProductStructureMapper productStructureMapper; @Autowired private StockInventoryMapper stockInventoryMapper; @Autowired private ProductOrderServiceImpl productOrderServiceImpl; @Override public SalesLedgerProduct selectSalesLedgerProductById(Long id) { @@ -228,9 +228,7 @@ /*å é¤å¯¹åºççäº§æ°æ®å¹¶éæ°æ°å¢*/ deleteProductionData(Arrays.asList(salesLedgerProduct.getId())); // å é¤çäº§æ ¸ç®æ°æ® LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>(); reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, salesLedgerId); salesLedgerProductionAccountingMapper.delete(reportWrapper); addProductionData(salesLedgerProduct); } @@ -272,7 +270,8 @@ productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId()); productOrder.setProductModelId(salesLedgerProduct.getProductModelId()); productOrder.setSaleLedgerProductId(salesLedgerProduct.getId()); productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId())); String string = productOrderServiceImpl.generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))); productOrder.setNpsNo(string); productOrder.setQuantity(salesLedgerProduct.getQuantity());//éæ±æ°é productOrder.setCompleteQuantity(BigDecimal.ZERO);//宿æ°é productOrderMapper.insert(productOrder); @@ -303,13 +302,7 @@ int insert = productProcessRouteItemMapper.insert(productProcessRouteItem); if (insert > 0) { // æ¥è¯¢ä»æ¥å·²åå¨çæå¤§å·¥åå· QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("work_order_no", datePrefix) .orderByDesc("work_order_no") .last("LIMIT 1"); ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper); ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix); int sequenceNumber = 1; // é»è®¤åºå· if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) { String lastNo = lastWorkOrder.getWorkOrderNo().toString(); @@ -396,9 +389,9 @@ //å é¤åºåºè®°å½ for (Long productMainId : productMainIds) { //å é¤ç产åºåºè®°å½ stockUtils.deleteStockOutRecord(productMainId, StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode()); stockUtils.deleteStockOutRecord(productMainId, StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode()); //å 餿¥åºçå ¥åºè®°å½ stockUtils.deleteStockInRecord(productMainId, StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode()); stockUtils.deleteStockInRecord(productMainId, StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode()); } qualityInspects.forEach(qualityInspect -> { //inspectState=1 å·²æäº¤ ä¸è½å é¤ @@ -407,6 +400,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) { @@ -178,7 +182,7 @@ .eq(ShippingInfo::getSalesLedgerProductId, product.getId()) .orderByDesc(ShippingInfo::getCreateTime) .last("limit 1")); if(shippingInfo != null){ if (shippingInfo != null) { product.setShippingStatus(shippingInfo.getStatus()); } } @@ -350,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()))); @@ -358,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(); @@ -391,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); @@ -553,25 +557,20 @@ // å é¤åè´§å°è´¦è®°å½ List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>() .in(ShippingInfo::getSalesLedgerId, idList)); if(CollectionUtils.isNotEmpty(shippingInfos)){ 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/sales/service/impl/ShippingInfoServiceImpl.java
@@ -7,7 +7,7 @@ import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.other.service.impl.TempFileServiceImpl; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.sales.dto.ShippingInfoDto; @@ -66,7 +66,7 @@ //æ£ååºå if(!"å·²åè´§".equals(byId.getStatus())){ SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId()); stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId()); stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId()); } byId.setExpressNumber(req.getExpressNumber()); byId.setExpressCompany(req.getExpressCompany()); @@ -90,7 +90,7 @@ // æ£å·²åè´§åºå for (ShippingInfo shippingInfo : shippingInfos) { if("å·²åè´§".equals(shippingInfo.getStatus())) { stockUtils.deleteStockOutRecord(shippingInfo.getId(), StockQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode()); stockUtils.deleteStockOutRecord(shippingInfo.getId(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode()); } } // å é¤åè´§å®¡æ¹ src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -2,7 +2,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; @@ -46,7 +47,7 @@ @PostMapping("/addstockInventory") @ApiOperation("æ°å¢åºå") public R addstockInventory(@RequestBody StockInventoryDto stockInventoryDto) { stockInventoryDto.setRecordType(String.valueOf(StockQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode())); stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode())); stockInventoryDto.setRecordId(0L); return R.ok(stockInventoryService.addstockInventory(stockInventoryDto)); } @@ -55,7 +56,7 @@ @PostMapping("/subtractStockInventory") @ApiOperation("æ£ååºå") public R subtractStockInventory(@RequestBody StockInventoryDto stockInventoryDto) { stockInventoryDto.setRecordType(String.valueOf(StockQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_OUT.getCode())); stockInventoryDto.setRecordType(String.valueOf(StockOutQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_OUT.getCode())); stockInventoryDto.setRecordId(0L); return R.ok(stockInventoryService.subtractStockInventory(stockInventoryDto)); } src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
@@ -2,7 +2,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutUnQualifiedRecordTypeEnum; import com.ruoyi.framework.web.domain.R; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockUninventoryDto; @@ -37,7 +38,7 @@ @PostMapping("/addstockUninventory") @ApiOperation("æ°å¢åºå") public R addstockUninventory(@RequestBody StockUninventoryDto stockUninventoryDto) { stockUninventoryDto.setRecordType(String.valueOf(StockUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode())); stockUninventoryDto.setRecordType(String.valueOf(StockInUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode())); stockUninventoryDto.setRecordId(0L); return R.ok(stockUninventoryService.addStockUninventory(stockUninventoryDto)); } @@ -46,7 +47,7 @@ @PostMapping("/subtractstockUninventory") @ApiOperation("æ£ååºå") public R subtractstockUninventory(@RequestBody StockUninventoryDto stockUninventoryDto) { stockUninventoryDto.setRecordType(String.valueOf(StockUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode())); stockUninventoryDto.setRecordType(String.valueOf(StockOutUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode())); stockUninventoryDto.setRecordId(0L); return R.ok(stockUninventoryService.subtractStockUninventory(stockUninventoryDto)); } src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -4,8 +4,8 @@ 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.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.EnumUtil; import com.ruoyi.common.utils.OrderUtils; @@ -102,9 +102,9 @@ List<StockInRecordExportData> list = stockInRecordMapper.listStockInRecordExportData(stockInRecordDto); for (StockInRecordExportData stockInRecordExportData : list) { if (stockInRecordExportData.getType().equals("0")) { stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue()); stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockOutQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue()); }else { stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockUnQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue()); stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockInUnQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue()); } } ExcelUtil<StockInRecordExportData> util = new ExcelUtil<>(StockInRecordExportData.class); src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -5,7 +5,8 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.domain.R; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; @@ -127,7 +128,7 @@ item.getSpecificationModel().equals(dto.getModel())) { StockInventoryDto stockInventoryDto = new StockInventoryDto(); stockInventoryDto.setRecordId(0L); stockInventoryDto.setRecordType(StockQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode()); stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode()); stockInventoryDto.setQualitity(dto.getQualitity()); stockInventoryDto.setRemark(dto.getRemark()); stockInventoryDto.setWarnNum(dto.getWarnNum()); src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -4,8 +4,8 @@ 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.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.EnumUtil; import com.ruoyi.common.utils.OrderUtils; @@ -105,9 +105,9 @@ List<StockOutRecordExportData> list = stockOutRecordMapper.listStockOutRecordExportData(stockOutRecordDto); for (StockOutRecordExportData stockInRecordExportData : list) { if (stockInRecordExportData.getType().equals("0")) { stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue()); stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockOutQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue()); }else { stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockUnQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue()); stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockInUnQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue()); } } ExcelUtil<StockOutRecordExportData> util = new ExcelUtil<>(StockOutRecordExportData.class); src/main/resources/application-zxsq.yml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,245 @@ # 项ç®ç¸å ³é ç½® ruoyi: # åç§° name: RuoYi # çæ¬ version: 3.8.9 # çæå¹´ä»½ copyrightYear: 2025 # æä»¶è·¯å¾ 示ä¾ï¼ Windowsé ç½®D:/ruoyi/uploadPathï¼Linuxé ç½® /home/ruoyi/uploadPathï¼ profile: /javaWork/product-inventory-management/file # è·åipå°åå¼å ³ addressEnabled: false # éªè¯ç ç±»å math æ°åè®¡ç® char å符éªè¯ captchaType: math # åå审æ¹ç¼å·åç¼(é ç½®æä»¶åç¼å½å) approvalNumberPrefix: NEW # å¼åç¯å¢é ç½® server: # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 port: 9005 servlet: # åºç¨ç访é®è·¯å¾ context-path: / tomcat: # tomcatçURIç¼ç uri-encoding: UTF-8 # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 accept-count: 1000 threads: # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 max: 800 # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 min-spare: 100 # æ¥å¿é ç½® logging: level: com.ruoyi: warn org.springframework: warn minio: endpoint: http://114.132.189.42/ port: 7019 secure: false accessKey: admin secretKey: 12345678 preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ default-bucket: jxc # ç¨æ·é ç½® user: password: # å¯ç æå¤§éè¯¯æ¬¡æ° maxRetryCount: 5 # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ lockTime: 10 # Springé ç½® spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: # ä¸»åºæ°æ®æº master: url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-zxsq?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: xd@123456.. # ä»åºæ°æ®æº slave: # 仿°æ®æºå¼å ³/é»è®¤å ³é enabled: false url: username: password: # åå§è¿æ¥æ° initialSize: 5 # æå°è¿æ¥æ± æ°é minIdle: 10 # æå¤§è¿æ¥æ± æ°é maxActive: 20 # é ç½®è·åè¿æ¥çå¾ è¶ æ¶çæ¶é´ maxWait: 60000 # é ç½®è¿æ¥è¶ æ¶æ¶é´ connectTimeout: 30000 # é ç½®ç½ç»è¶ æ¶æ¶é´ socketTimeout: 60000 # é ç½®é´éå¤ä¹ æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å ³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ timeBetweenEvictionRunsMillis: 60000 # é ç½®ä¸ä¸ªè¿æ¥å¨æ± 䏿å°çåçæ¶é´ï¼å使¯æ¯«ç§ minEvictableIdleTimeMillis: 300000 # é ç½®ä¸ä¸ªè¿æ¥å¨æ± 䏿大çåçæ¶é´ï¼å使¯æ¯«ç§ maxEvictableIdleTimeMillis: 900000 # é ç½®æ£æµè¿æ¥æ¯å¦ææ validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true statViewServlet: enabled: true # 设置ç½ååï¼ä¸å¡«åå 许ææè®¿é® allow: url-pattern: /druid/* # æ§å¶å°ç®¡çç¨æ·ååå¯ç login-username: ruoyi login-password: 123456 filter: stat: enabled: true # æ ¢SQLè®°å½ log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config: multi-statement-allow: true # èµæºä¿¡æ¯ messages: # å½é åèµæºæä»¶è·¯å¾ basename: i18n/messages # æä»¶ä¸ä¼ servlet: multipart: # å个æä»¶å¤§å° max-file-size: 1GB # 设置æ»ä¸ä¼ çæä»¶å¤§å° max-request-size: 2GB # æå¡æ¨¡å devtools: restart: # çé¨ç½²å¼å ³ enabled: false # redis é ç½® redis: # å°å # host: 127.0.0.1 host: 172.17.0.1 # 端å£ï¼é»è®¤ä¸º6379 port: 6379 # æ°æ®åºç´¢å¼ database: 1 # å¯ç # password: root2022! password: # è¿æ¥è¶ æ¶æ¶é´ timeout: 10s lettuce: pool: # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ min-idle: 0 # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ max-idle: 8 # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° max-active: 8 # #è¿æ¥æ± æå¤§é»å¡çå¾ æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ max-wait: -1ms # Quartz宿¶ä»»å¡é ç½®ï¼æ°å¢é¨åï¼ quartz: job-store-type: jdbc # ä½¿ç¨æ°æ®åºåå¨ jdbc: initialize-schema: never # 馿¬¡è¿è¡æ¶èªå¨åå»ºè¡¨ç»æï¼æååæ¹ä¸ºnever schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql # MySQLè¡¨ç»æèæ¬ properties: org: quartz: scheduler: instanceName: RuoYiScheduler instanceId: AUTO jobStore: class: org.quartz.impl.jdbcjobstore.JobStoreTX driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate # MySQLéé tablePrefix: qrtz_ # 表ååç¼ï¼ä¸èæ¬ä¸è´ isClustered: false # åèç¹æ¨¡å¼ï¼éç¾¤éæ¹ä¸ºtrueï¼ clusterCheckinInterval: 10000 txIsolationLevelSerializable: true threadPool: class: org.quartz.simpl.SimpleThreadPool threadCount: 10 # çº¿ç¨æ± å¤§å° threadPriority: 5 makeThreadsDaemons: true updateCheck: false # å ³éçæ¬æ£æ¥ # tokené ç½® token: # 令çèªå®ä¹æ è¯ header: Authorization # 令çå¯é¥ secret: abcdefghijklmnopqrstuvwxyz # ä»¤çæææï¼é»è®¤30åéï¼ expireTime: 450 # MyBatis Plusé ç½® mybatis-plus: # æç´¢æå®å å«å æ ¹æ®èªå·±çé¡¹ç®æ¥ typeAliasesPackage: com.ruoyi.**.pojo # é ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ mapperLocations: classpath*:mapper/**/*Mapper.xml # å è½½å ¨å±çé ç½®æä»¶ configLocation: classpath:mybatis/mybatis-config.xml global-config: enable-sql-runner: true db-config: id-type: auto # PageHelperå页æä»¶ pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swaggeré ç½® swagger: # æ¯å¦å¼å¯swagger enabled: true # 请æ±åç¼ pathMapping: /dev-api # 鲿¢XSSæ»å» xss: # è¿æ»¤å¼å ³ enabled: true # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ excludes: /system/notice # å¹é 龿¥ urlPatterns: /system/*,/monitor/*,/tool/* # 代ç çæ gen: # ä½è author: ruoyi # é»è®¤çæå è·¯å¾ system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool packageName: com.ruoyi.project.system # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true autoRemovePre: false # 表åç¼ï¼çæç±»åä¸ä¼å å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ tablePrefix: sys_ # æ¯å¦å è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å 许 allowOverwrite: false file: temp-dir: /javaWork/product-inventory-management/file/temp/uploads upload-dir: /javaWork/product-inventory-management/file/prod/uploads src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -17,8 +17,9 @@ select po.*, sl.sales_contract_no, sl.customer_name, slp.product_category, slp.specification_model, p.product_name as product_category, pm.model as specification_model, pm.unit, ppr.process_route_code, pb.bom_no, ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus, @@ -38,6 +39,8 @@ FROM shipping_info GROUP BY sales_ledger_id ) shipping_status_counts ON sl.id = shipping_status_counts.sales_ledger_id left join product_model pm on po.product_model_id = pm.id left join product p on pm.product_id = p.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 @@ -66,8 +69,7 @@ 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/ProductWorkOrderMapper.xml
@@ -87,4 +87,12 @@ actual_start_time >= #{startDate} AND actual_start_time <= #{endDate} </select> <select id="selectMax" resultType="com.ruoyi.production.pojo.ProductWorkOrder"> SELECT SUBSTRING(work_order_no, 3) as work_order_no FROM product_work_order WHERE SUBSTRING(work_order_no, 3) like concat(#{datePrefix},'%') order by work_order_no desc limit 1 ; </select> </mapper> 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/purchase/PaymentRegistrationMapper.xml
@@ -199,6 +199,7 @@ </where> GROUP BY T1.supplier_name </select> <select id="supplierNameListPageDetails" resultType="com.ruoyi.purchase.dto.PaymentRegistrationDto"> SELECT T1.supplier_id, @@ -209,7 +210,7 @@ T1.purchase_contract_number, T2.payment_date FROM purchase_ledger T1 LEFT JOIN payment_registration T2 ON T1.id = T2.purchase_ledger_id INNER JOIN payment_registration T2 ON T1.id = T2.purchase_ledger_id <where> T1.supplier_id = #{req.supplierId} <if test="req.supplierName != null and req.supplierName != '' "> src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -28,7 +28,8 @@ pl.approve_user_ids, sm.is_white, pl.approval_status, pl.payment_method pl.payment_method, pl.remarks from purchase_ledger pl left join sales_ledger_product slp on slp.sales_ledger_id = pl.id and slp.type=2 left join product_record pr on pl.id = pr.purchase_ledger_id src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -3,30 +3,49 @@ <mapper namespace="com.ruoyi.quality.mapper.QualityInspectMapper"> <select id="qualityInspectListPage" resultType="com.ruoyi.quality.pojo.QualityInspect"> SELECT * FROM quality_inspect where qi.*, <choose> <when test="qualityInspect.inspectType == 0"> pl.purchase_contract_number as purchase_contract_no </when> <otherwise> pwo.work_order_no </otherwise> </choose> FROM quality_inspect qi <choose> <when test="qualityInspect.inspectType == 0 "> LEFT JOIN purchase_ledger pl ON pl.id = qi.purchase_ledger_id </when> <otherwise> LEFT JOIN production_product_main ppm ON qi.product_main_id = ppm.id LEFT JOIN product_work_order pwo ON ppm.work_order_id = pwo.id </otherwise> </choose> WHERE inspect_type=#{qualityInspect.inspectType} <if test="qualityInspect.supplier != null and qualityInspect.supplier != '' "> AND supplier like concat('%',#{qualityInspect.supplier},'%') AND qi.supplier like concat('%',#{qualityInspect.supplier},'%') </if> <if test="qualityInspect.customer != null and qualityInspect.customer != '' "> AND customer like concat('%',#{qualityInspect.customer},'%') AND qi.customer like concat('%',#{qualityInspect.customer},'%') </if> <if test="qualityInspect.process != null and qualityInspect.process != '' "> AND process like concat('%',#{qualityInspect.process},'%') AND qi.process like concat('%',#{qualityInspect.process},'%') </if> <if test="qualityInspect.productName != null and qualityInspect.productName != '' "> AND product_name like concat('%',#{qualityInspect.productName},'%') AND qi.product_name like concat('%',#{qualityInspect.productName},'%') </if> <if test="qualityInspect.entryDateStart != null and qualityInspect.entryDateStart != '' "> AND check_time >= DATE_FORMAT(#{qualityInspect.entryDateStart},'%Y-%m-%d') AND qi.check_time >= DATE_FORMAT(#{qualityInspect.entryDateStart},'%Y-%m-%d') </if> <if test="qualityInspect.entryDateEnd != null and qualityInspect.entryDateEnd != '' "> AND check_time <= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-%d') AND qi.check_time <= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-%d') </if> ORDER BY check_time DESC ORDER BY qi.check_time DESC </select> <select id="qualityInspectExport" resultType="com.ruoyi.quality.pojo.QualityInspect"> SELECT * src/main/resources/mapper/sales/ReceiptPaymentMapper.xml
@@ -432,22 +432,23 @@ </where> </select> <select id="invoiceLedgerSalesAccount" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto"> SELECT T1.sales_contract_no, SUM(contract_amount) AS invoice_total, IFNULL( SUM(T2.receipt_payment_amount) , 0 ) AS receipt_payment_amount, IFNULL((IFNULL(SUM(contract_amount),0) - IFNULL(SUM(T2.receipt_payment_amount),0)),0) AS unReceipt_payment_amount, T1.contract_amount AS invoice_total, IFNULL(SUM(T2.receipt_payment_amount), 0) AS receipt_payment_amount, IFNULL((T1.contract_amount - IFNULL(SUM(T2.receipt_payment_amount), 0)), 0) AS unReceipt_payment_amount, T2.receipt_payment_date FROM sales_ledger T1 LEFT JOIN receipt_payment T2 ON T1.id = T2.sales_ledger_id INNER JOIN receipt_payment T2 ON T1.id = T2.sales_ledger_id <where> T1.customer_id = #{invoiceLedgerDto.customerId} <if test="invoiceLedgerDto.searchText != null and invoiceLedgerDto.searchText != '' "> T1.customer_name LIKE CONCAT ('%',#{invoiceLedgerDto.searchText},'%') AND T1.customer_name LIKE CONCAT ('%', #{invoiceLedgerDto.searchText}, '%') </if> </where> GROUP BY T1.sales_contract_no,T2.receipt_payment_date GROUP BY T1.id, T1.sales_contract_no, T1.contract_amount, T2.receipt_payment_date </select> </mapper>