src/main/java/com/ruoyi/account/controller/AccountingController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,46 @@ package com.ruoyi.account.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.service.impl.AccountingServiceImpl; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * @author :yys * @date : 2026/1/17 10:40 */ @Api(tags = "ä¼è®¡æ ¸ç®") @RestController @RequestMapping("/accounting") public class AccountingController extends BaseController { @Autowired private AccountingServiceImpl accountingService; @ApiOperation("æ»è®¡") @GetMapping("/total") public AjaxResult total(@RequestParam Integer year) { return accountingService.total(year); } @ApiOperation("设å¤ç±»ååå¸") @GetMapping("/deviceTypeDistribution") public AjaxResult deviceTypeDistribution(@RequestParam Integer year) { return accountingService.deviceTypeDistribution(year); } @ApiOperation("设å¤å页æ¥è¯¢è®¡ç®ææ§") @GetMapping("/calculateDepreciation") public AjaxResult calculateDepreciation(Page page, @RequestParam Integer year) { return accountingService.calculateDepreciation(page,year); } } src/main/java/com/ruoyi/account/dto/DeviceTypeDetail.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package com.ruoyi.account.dto; import lombok.Data; import java.math.BigDecimal; /** * @author :yys * @date : 2026/1/17 13:42 */ @Data public class DeviceTypeDetail { private String type; // 设å¤ç±»å private BigDecimal count; // æ°é private BigDecimal amount; // ä»·æ ¼ } src/main/java/com/ruoyi/account/dto/DeviceTypeDistributionVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ package com.ruoyi.account.dto; import com.mchange.v1.util.ListUtils; import lombok.Data; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; /** * @author :yys * @date : 2026/1/17 13:19 */ @Data public class DeviceTypeDistributionVO { private Integer totalCount = 0; // 设å¤ç±»åæ»æ° // 饼å¾åæçº¿å¾çåç±»ï¼è®¾å¤ç±»åï¼ private List<String> categories = new ArrayList<>(); // åç±»å设å¤çæ°é private List<BigDecimal> countData = new ArrayList<>(); // åç±»å设å¤çæ»éé¢ private List<BigDecimal> amountData = new ArrayList<>(); // æç»å表ï¼å å«ç±»åãæ°éãéé¢ private List<DeviceTypeDetail> details = new ArrayList<>(); } src/main/java/com/ruoyi/account/service/impl/AccountingServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,292 @@ package com.ruoyi.account.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.dto.DeviceTypeDetail; import com.ruoyi.account.dto.DeviceTypeDistributionVO; import com.ruoyi.account.mapper.BorrowInfoMapper; import com.ruoyi.account.pojo.BorrowInfo; import com.ruoyi.device.mapper.DeviceLedgerMapper; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.procurementrecord.mapper.CustomStorageMapper; import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper; import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper; import com.ruoyi.procurementrecord.pojo.CustomStorage; import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.procurementrecord.service.impl.ProcurementRecordOutServiceImpl; import com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.Year; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; /** * @author :yys * @date : 2026/1/17 10:41 */ @Service @Slf4j public class AccountingServiceImpl { @Autowired private DeviceLedgerMapper deviceLedgerMapper; @Autowired private BorrowInfoMapper borrowInfoMapper; @Autowired private CustomStorageMapper customStorageMapper; @Autowired private ProcurementRecordMapper procurementRecordMapper; @Autowired private ProcurementRecordOutMapper procurementRecordOutMapper; public AjaxResult total(Integer year) { Map<String,Object> map = new HashMap<>(); map.put("deprAmount",0); // ææ§éé¢ map.put("deviceTotal",0); // è®¾å¤æ»æ° map.put("deviceAmount",0); // 设å¤èµäº§åå¼ map.put("netValue",0); // åå¼ map.put("debt",0); // è´åº map.put("inventoryValue",0); // åºåèµäº§ LambdaQueryWrapper<DeviceLedger> deviceLedgerLambdaQueryWrapper = new LambdaQueryWrapper<>(); deviceLedgerLambdaQueryWrapper.like(DeviceLedger::getCreateTime,year); List<DeviceLedger> deviceLedgers = deviceLedgerMapper.selectList(deviceLedgerLambdaQueryWrapper); if(CollectionUtils.isNotEmpty(deviceLedgers)){ map.put("deviceTotal",deviceLedgers.size()); BigDecimal reduce = deviceLedgers.stream() .map(DeviceLedger::getTaxIncludingPriceTotal) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); map.put("deviceAmount",reduce); List<DeviceLedger> collect = deviceLedgers.stream().filter(deviceLedger -> deviceLedger.getIsDepr() != null && deviceLedger.getIsDepr() == 1).collect(Collectors.toList()); // æ ¹æ®å½å年份å设å¤å½å ¥æ¶é´å¹´ä»½æ¯è¾ * æ¯å¹´ææ§éé¢ = è®¾å¤ææ§éé¢ BigDecimal total = new BigDecimal(0); if(CollectionUtils.isNotEmpty(collect)){ for (DeviceLedger deviceLedger : collect) { BigDecimal totalDepreciation = calculatePreciseDepreciation(deviceLedger); total = total.add(totalDepreciation); } map.put("deprAmount",total); } // åå¼ = 设å¤èµäº§åå¼ - 设å¤ç´¯è®¡ææ§éé¢ map.put("netValue",reduce.subtract(total)); } // è´åº LambdaQueryWrapper<BorrowInfo> borrowInfoLambdaQueryWrapper = new LambdaQueryWrapper<>(); borrowInfoLambdaQueryWrapper.like(BorrowInfo::getCreateTime,year) .eq(BorrowInfo::getStatus,1); List<BorrowInfo> borrowInfos = borrowInfoMapper.selectList(borrowInfoLambdaQueryWrapper); if(CollectionUtils.isNotEmpty(borrowInfos)){ BigDecimal reduce = borrowInfos.stream() .map(BorrowInfo::getBorrowAmount) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); map.put("debt",reduce); } // åºåèµäº§ LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>(); procurementRecordStorageLambdaQueryWrapper.like(ProcurementRecordStorage::getCreateTime,year); List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordMapper.selectList(procurementRecordStorageLambdaQueryWrapper); BigDecimal procurementRecordTotal = new BigDecimal(0); if(CollectionUtils.isNotEmpty(procurementRecordStorages)){ // è·ååºåºæ°æ® LambdaQueryWrapper<ProcurementRecordOut> procurementRecordOutLambdaQueryWrapper = new LambdaQueryWrapper<>(); procurementRecordOutLambdaQueryWrapper.like(ProcurementRecordOut::getCreateTime,year) .in(ProcurementRecordOut::getProcurementRecordStorageId, procurementRecordStorages .stream() .map(ProcurementRecordStorage::getId) .collect(Collectors.toList())) .in(ProcurementRecordOut::getType,Arrays.asList(1,2)); List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(procurementRecordOutLambdaQueryWrapper); for (ProcurementRecordStorage procurementRecordStorage : procurementRecordStorages) { // éè´ï¼çäº§å ¥åºæ»ä»·å¼ procurementRecordTotal.add(procurementRecordStorage.getUnitPrice().multiply(procurementRecordStorage.getInboundNum())); // éè¿å ¥åºidï¼ç±»åè·ååºåºæ°æ® List<ProcurementRecordOut> procurementRecordOutsByStorageId = procurementRecordOuts.stream() .filter(procurementRecordOut -> procurementRecordOut.getProcurementRecordStorageId().equals(procurementRecordStorage.getId()) && procurementRecordOut.getType().equals(procurementRecordStorage.getType())) .collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(procurementRecordOutsByStorageId)){ for (ProcurementRecordOut procurementRecordOut : procurementRecordOutsByStorageId) { // éè´ï¼ç产åºåºæ»ä»·å¼ procurementRecordTotal.subtract(procurementRecordStorage.getUnitPrice().multiply(procurementRecordOut.getInboundNum())); } } } } LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>(); customStorageLambdaQueryWrapper.like(CustomStorage::getInboundDate,year); List<CustomStorage> customStorages = customStorageMapper.selectList(customStorageLambdaQueryWrapper); BigDecimal customStorageTotal = new BigDecimal(0); if(CollectionUtils.isNotEmpty(customStorages)){ // è·ååºåºæ°æ® LambdaQueryWrapper<ProcurementRecordOut> procurementRecordOutLambdaQueryWrapper = new LambdaQueryWrapper<>(); procurementRecordOutLambdaQueryWrapper.like(ProcurementRecordOut::getCreateTime,year) .in(ProcurementRecordOut::getProcurementRecordStorageId, customStorages .stream() .map(CustomStorage::getId) .collect(Collectors.toList())) .eq(ProcurementRecordOut::getType,3); List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(procurementRecordOutLambdaQueryWrapper); customStorages.forEach(customStorage -> { // èªå®ä¹å ¥åºæ»ä»·å¼ customStorageTotal.add(customStorage.getTaxInclusiveUnitPrice().multiply(customStorage.getInboundNum())); // éè¿å ¥åºidï¼ç±»åè·ååºåºæ°æ® List<ProcurementRecordOut> procurementRecordOutsByStorageId = procurementRecordOuts.stream() .filter(procurementRecordOut -> procurementRecordOut.getProcurementRecordStorageId().equals(customStorage.getId())) .collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(procurementRecordOutsByStorageId)){ for (ProcurementRecordOut procurementRecordOut : procurementRecordOutsByStorageId) { // èªå®ä¹åºåºæ»ä»·å¼ customStorageTotal.subtract(procurementRecordOut.getInboundNum().multiply(customStorage.getTaxInclusiveUnitPrice())); } } }); } map.put("inventoryValue",procurementRecordTotal.add(customStorageTotal)); return AjaxResult.success( map); } /** * 计ç®è®¾å¤ç´¯è®¡ææ§éé¢ * @param deviceLedger 设å¤å°è´¦å®ä½ * @return ç´¯è®¡ææ§éé¢ï¼BigDecimalï¼ä¿ç2ä½å°æ°ï¼ */ public static BigDecimal calculateTotalDepreciation(DeviceLedger deviceLedger) { // 1. ç©ºå¼æ ¡éª if (deviceLedger == null) { return BigDecimal.ZERO; } // 2. 夿æ¯å¦å¼å¯ææ§ï¼æªå¼å¯åææ§éé¢ä¸º0 Integer isDepr = deviceLedger.getIsDepr(); if (isDepr == null || isDepr != 1) { // 1-æ¯ 2-å¦ return BigDecimal.ZERO; } // 3. è·åæ¯å¹´ææ§éé¢ï¼ä¸ºç©ºåè¿å0 BigDecimal annualDepreciation = deviceLedger.getAnnualDepreciationAmount(); if (annualDepreciation == null || annualDepreciation.compareTo(BigDecimal.ZERO) <= 0) { return BigDecimal.ZERO; } // 4. è·å设å¤å½å ¥æ¶é´ï¼ä¸ºç©ºåè¿å0 LocalDateTime createTime = deviceLedger.getCreateTime(); if (createTime == null) { return BigDecimal.ZERO; } // 5. 计ç®å¹´ä»½å·®å¼ int currentYear = Year.now().getValue(); // å½å年份 int createYear = createTime.getYear(); // 设å¤å½å ¥å¹´ä»½ int yearDiff = currentYear - createYear; // 6. å¤ç年份差å¼ä¸ºè´æ°çæ åµï¼å½å ¥æ¶é´å¨æªæ¥ï¼ if (yearDiff < 0) { return BigDecimal.ZERO; } // 7. è®¡ç®æ»ææ§éé¢ = å¹´ä»½å·®å¼ * æ¯å¹´ææ§éé¢ BigDecimal totalDepreciation = annualDepreciation.multiply(BigDecimal.valueOf(yearDiff)); // 8. è¿åä¿ç2ä½å°æ°çç»æï¼éé¢è§èï¼ return totalDepreciation.setScale(2, BigDecimal.ROUND_HALF_UP); } /** * ãè¿é¶çãæå®é 天æ°è®¡ç®ææ§ï¼æ´ç²¾åï¼ * @param deviceLedger 设å¤å°è´¦å®ä½ * @return ç´¯è®¡ææ§éé¢ */ public static BigDecimal calculatePreciseDepreciation(DeviceLedger deviceLedger) { if (deviceLedger == null) { return BigDecimal.ZERO; } // 夿æ¯å¦å¼å¯ææ§ Integer isDepr = deviceLedger.getIsDepr(); if (isDepr == null || isDepr != 1) { return BigDecimal.ZERO; } // è·åæ¯å¹´ææ§éé¢ BigDecimal annualDepreciation = deviceLedger.getAnnualDepreciationAmount(); if (annualDepreciation == null || annualDepreciation.compareTo(BigDecimal.ZERO) <= 0) { return BigDecimal.ZERO; } // è·å设å¤å½å ¥æ¶é´ LocalDateTime createTime = deviceLedger.getCreateTime(); if (createTime == null) { return BigDecimal.ZERO; } // å½åæ¶é´ LocalDateTime now = LocalDateTime.now(); // 妿å½å ¥æ¶é´å¨æªæ¥ï¼è¿å0 if (createTime.isAfter(now)) { return BigDecimal.ZERO; } // è®¡ç®æ»å¤©æ° long days = ChronoUnit.DAYS.between(createTime, now); // ææ¯å¹´365å¤©è®¡ç®ææ§éé¢ BigDecimal dailyDepreciation = annualDepreciation.divide(BigDecimal.valueOf(365), 6, BigDecimal.ROUND_HALF_UP); BigDecimal totalDepreciation = dailyDepreciation.multiply(BigDecimal.valueOf(days)); return totalDepreciation.setScale(2, BigDecimal.ROUND_HALF_UP); } public AjaxResult deviceTypeDistribution(Integer year) { // 2. ç»è£ è¿åVO DeviceTypeDistributionVO vo = new DeviceTypeDistributionVO(); List<DeviceTypeDetail> details = deviceLedgerMapper.getDeviceTypeDistributionByYear( year); vo.setDetails(details); if(CollectionUtils.isNotEmpty(details)){ // 3. æåå¾è¡¨æéçåç±»åæ°æ® vo.setCategories(details.stream() .map(DeviceTypeDetail::getType) .collect(Collectors.toList())); vo.setCountData(details.stream() .map(DeviceTypeDetail::getCount) .collect(Collectors.toList())); vo.setAmountData(details.stream() .map(DeviceTypeDetail::getAmount) .collect(Collectors.toList())); vo.setTotalCount(vo.getCategories().size()); } return AjaxResult.success(vo); } public AjaxResult calculateDepreciation(Page page, Integer year) { LambdaQueryWrapper<DeviceLedger> deviceLedgerLambdaQueryWrapper = new LambdaQueryWrapper<>(); deviceLedgerLambdaQueryWrapper.like(DeviceLedger::getCreateTime,year) .eq(DeviceLedger::getIsDepr,1); IPage<DeviceLedger> deviceLedgerIPage = deviceLedgerMapper.selectPage(page, deviceLedgerLambdaQueryWrapper); for (DeviceLedger record : deviceLedgerIPage.getRecords()) { record.setDeprAmount(calculatePreciseDepreciation(record)); record.setNetValue(record.getTaxIncludingPriceTotal().subtract(record.getDeprAmount())); } return AjaxResult.success(deviceLedgerIPage); } } src/main/java/com/ruoyi/device/dto/DeviceLedgerDto.java
@@ -135,4 +135,14 @@ @ApiModelProperty("è¿è¡æ¶é¿") private String runtimeDuration; @ApiModelProperty("æ¯å¦ææ§ 1-æ¯ 2-å¦") private Integer isDepr; @ApiModelProperty("æ¯å¹´ææ§éé¢") private BigDecimal annualDepreciationAmount; @ApiModelProperty("设å¤ç±»å") private String type; } src/main/java/com/ruoyi/device/mapper/DeviceLedgerMapper.java
@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.dto.DeviceTypeDetail; import com.ruoyi.account.dto.DeviceTypeDistributionVO; import com.ruoyi.device.dto.DeviceLedgerDto; import com.ruoyi.device.execl.DeviceLedgerExeclDto; import com.ruoyi.device.pojo.DeviceLedger; @@ -21,4 +23,11 @@ @InterceptorIgnore(tenantLine = "true") DeviceLedger selectById1(Long id); /** * æå¹´ä»½ç»è®¡è®¾å¤ç±»ååå¸ * @param year ä¼ å ¥ç年份ï¼å¦2026ï¼ * @return åç±»åçæ°éåéé¢ */ List<DeviceTypeDetail> getDeviceTypeDistributionByYear(@Param("year") Integer year); } src/main/java/com/ruoyi/device/pojo/DeviceLedger.java
@@ -142,4 +142,21 @@ @ApiModelProperty("è¿è¡æ¶é¿") private String runtimeDuration; @ApiModelProperty("æ¯å¦ææ§ 1-æ¯ 2-å¦") private Integer isDepr; @ApiModelProperty("æ¯å¹´ææ§éé¢") private BigDecimal annualDepreciationAmount; @TableField(exist = false) @ApiModelProperty("ç´¯è®¡ææ§") private BigDecimal deprAmount; @TableField(exist = false) @ApiModelProperty("åå¼") private BigDecimal netValue; @ApiModelProperty("设å¤ç±»å") private String type; } src/main/java/com/ruoyi/production/controller/ProcessRouteController.java
@@ -23,9 +23,6 @@ @Autowired private ProcessRouteService processRouteService; @Autowired private ProcessRouteItemService processRouteItemService; @GetMapping("page") @ApiOperation("å页æ¥è¯¢") public R page(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto) { @@ -45,8 +42,6 @@ @ApiOperation("å é¤å·¥èºè·¯çº¿") @DeleteMapping("/{ids}") public R delete(@PathVariable("ids") Long[] ids) { //å é¤å·¥èºè·¯çº¿è¯¦æ processRouteItemService.remove(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getRouteId,Arrays.asList(ids))); return R.ok(processRouteService.removeBatchByIds(Arrays.asList(ids))); return R.ok(processRouteService.batchDelete(Arrays.asList(ids))); } } src/main/java/com/ruoyi/production/controller/ProductBomController.java
@@ -11,8 +11,10 @@ import com.ruoyi.production.pojo.ProcessRoute; import com.ruoyi.production.pojo.ProductBom; import com.ruoyi.production.pojo.ProductProcess; import com.ruoyi.production.pojo.ProductProcessRoute; import com.ruoyi.production.service.ProcessRouteService; import com.ruoyi.production.service.ProductBomService; import com.ruoyi.production.service.ProductProcessRouteService; import com.ruoyi.production.service.ProductProcessService; import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; @@ -39,6 +41,9 @@ @Autowired private ProcessRouteService processRouteService; @Autowired private ProductProcessRouteService productProcessRouteService; @GetMapping("/listPage") @Log(title = "BOM-å页æ¥è¯¢", businessType = BusinessType.OTHER) @@ -67,7 +72,8 @@ @Log(title = "å é¤", businessType = BusinessType.DELETE) public AjaxResult batchDelete(@RequestBody List<Integer> ids) { List<ProcessRoute> list = processRouteService.list(Wrappers.<ProcessRoute>lambdaQuery().in(ProcessRoute::getBomId, ids)); if (list.size()>0){ List<ProductProcessRoute> list2 = productProcessRouteService.list(Wrappers.<ProductProcessRoute>lambdaQuery().in(ProductProcessRoute::getBomId, ids)); if (list.size()>0 || list2.size()>0){ return AjaxResult.error("该BOMå·²ç»åå¨å¯¹åºçå·¥èºè·¯çº¿,æ æ³è¿è¡å é¤"); } if(CollectionUtils.isEmpty(ids)){ src/main/java/com/ruoyi/production/controller/ProductProcessController.java
@@ -59,10 +59,7 @@ @DeleteMapping("/batchDelete") @Log(title = "å é¤", businessType = BusinessType.DELETE) public AjaxResult batchDelete(@RequestBody List<Integer> ids) { if(CollectionUtils.isEmpty(ids)){ return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); } return AjaxResult.success(productProcessService.removeBatchByIds(ids)); return AjaxResult.success(productProcessService.batchDelete(ids)); } @ApiOperation("æ¥è¯¢ææå·¥åº") src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -1,9 +1,11 @@ package com.ruoyi.production.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.domain.R; import com.ruoyi.production.dto.ProductProcessRouteItemDto; import com.ruoyi.production.dto.ProductionProductMainDto; import com.ruoyi.production.dto.SalesLedgerProductionAccountingDto; import com.ruoyi.production.service.ProductionProductMainService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -11,6 +13,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.List; @@ -49,4 +52,16 @@ public R delete(@RequestBody ProductionProductMainDto productionProductMainDto) { return R.ok(productionProductMainService.removeProductMain(productionProductMainDto)); } /** * å¯¼åº */ @PostMapping("/export") public void export(HttpServletResponse response, ProductionProductMainDto productionProductMainDto) { List<ProductionProductMainDto> list; list = productionProductMainService.listPageProductionProductMainDto(new Page<>(1, -1), productionProductMainDto).getRecords(); ExcelUtil<ProductionProductMainDto> util = new ExcelUtil<ProductionProductMainDto>(ProductionProductMainDto.class); util.exportExcel(response, list, "ç产æ¥å·¥æ°æ®"); } } src/main/java/com/ruoyi/production/controller/SalesLedgerProductionAccountingController.java
@@ -2,10 +2,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.pojo.AccountExpense; 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.ProductOrderDto; import com.ruoyi.production.dto.SalesLedgerProductionAccountingDto; import com.ruoyi.production.pojo.SalesLedgerProductionAccounting; import com.ruoyi.production.service.impl.SalesLedgerProductionAccountingServiceImpl; @@ -13,8 +16,12 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.util.List; /** * @author :yys @@ -36,4 +43,15 @@ return AjaxResult.success(list); } /** * å¯¼åº */ @PostMapping("/export") public void export(HttpServletResponse response, SalesLedgerProductionAccountingDto salesLedgerProductionAccountingDto) { List<SalesLedgerProductionAccountingDto> list; list = salesLedgerProductionAccountingService.listPage(new Page<>(1, -1), salesLedgerProductionAccountingDto).getRecords(); ExcelUtil<SalesLedgerProductionAccountingDto> util = new ExcelUtil<SalesLedgerProductionAccountingDto>(SalesLedgerProductionAccountingDto.class); util.exportExcel(response, list, "çäº§æ ¸ç®æ°æ®"); } } src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
@@ -1,5 +1,7 @@ package com.ruoyi.production.dto; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.production.pojo.ProductionProductMain; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -8,28 +10,36 @@ import java.time.LocalDateTime; @Data @ExcelIgnoreUnannotated public class ProductionProductMainDto extends ProductionProductMain { @ApiModelProperty(value = "å·¥åç¼å·") @Excel(name = "å·¥åç¼å·") private String workOrderNo; @ApiModelProperty(value = "å·¥åç¶æ") private String workOrderStatus; @ApiModelProperty(value = "æ¥å·¥äººåæµç§°") @Excel(name = "æ¥å·¥äºº") private String nickName; @ApiModelProperty(value = "æ¥å·¥æ°é") @Excel(name = "æ¥å·¥æ°é") private BigDecimal quantity; //产ååç§° @Excel(name = "产ååç§°") private String productName; //产åè§æ ¼åå· @Excel(name = "产åè§æ ¼åå·") private String productModelName; //åä½ @Excel(name = "åä½") private String unit; //éå®ååå· @Excel(name = "éå®ååå·") private String salesContractNo; } src/main/java/com/ruoyi/production/dto/SalesLedgerProductionAccountingDto.java
@@ -1,5 +1,7 @@ package com.ruoyi.production.dto; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -12,6 +14,7 @@ */ @Data @ApiModel @ExcelIgnoreUnannotated public class SalesLedgerProductionAccountingDto extends SalesLedgerProductDto{ /** @@ -24,6 +27,7 @@ * æäº§äººåç§° */ @ApiModelProperty(value = "ç产人åç§°") @Excel(name = "ç产人") private String schedulingUserName; @@ -31,29 +35,34 @@ * å·¥èµ */ @ApiModelProperty(value = "å·¥èµ") @Excel(name = "å·¥èµ") private BigDecimal wages; /** * ç产æ°é */ @ApiModelProperty(value = "ç产æ°é") @Excel(name = "ç产æ°é") private BigDecimal finishedNum; /** * å·¥æ¶å®é¢ */ @ApiModelProperty(value = "å·¥æ¶å®é¢") @Excel(name = "å·¥æ¶å®é¢") private BigDecimal workHours; /** * å·¥åº */ @ApiModelProperty(value = "å·¥åº") @Excel(name = "å·¥åº") private String process; /** * æäº§æ¥æ */ @ApiModelProperty(value = "æäº§æ¥æ") @Excel(name = "çäº§æ¥æ") private String schedulingDate; @ApiModelProperty(value = "å¼å§æ¶é´") src/main/java/com/ruoyi/production/pojo/ProductOrder.java
@@ -34,7 +34,7 @@ private Long productModelId; /** * å·¥èºè·¯çº¿id * 模ççå·¥èºè·¯çº¿id */ @ApiModelProperty(value = "å·¥èºè·¯çº¿id") private Long routeId; src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -16,6 +17,7 @@ private Long id; @ApiModelProperty(value = "æ¥å·¥åå·") @Excel(name = "æ¥å·¥åå·") private String productNo; @ApiModelProperty(value = "æ¥å·¥äººåid") @@ -37,6 +39,7 @@ @TableField(fill = FieldFill.INSERT) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Excel(name = "å建æ¶é´") private LocalDateTime createTime; @ApiModelProperty(value = "æ´æ°æ¶é´") src/main/java/com/ruoyi/production/service/ProcessRouteService.java
@@ -7,9 +7,13 @@ import com.ruoyi.production.pojo.ProcessRoute; import io.swagger.models.auth.In; import java.util.List; public interface ProcessRouteService extends IService<ProcessRoute> { IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto); Integer saveProcessRoute(ProcessRoute processRoute); int batchDelete(List<Long> ids); } src/main/java/com/ruoyi/production/service/ProductProcessService.java
@@ -23,4 +23,6 @@ AjaxResult add(ProductProcessDto productProcessDto); AjaxResult importData(MultipartFile file); String batchDelete(List<Integer> ids); } src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -1,11 +1,18 @@ package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; 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.production.dto.ProcessRouteDto; import com.ruoyi.production.mapper.ProcessRouteItemMapper; import com.ruoyi.production.mapper.ProcessRouteMapper; import com.ruoyi.production.mapper.ProductOrderMapper; import com.ruoyi.production.mapper.ProductProcessRouteMapper; import com.ruoyi.production.pojo.ProcessRoute; import com.ruoyi.production.pojo.ProcessRouteItem; import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.pojo.ProductProcessRoute; import com.ruoyi.production.service.ProcessRouteService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -15,6 +22,8 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; @Service @AllArgsConstructor @@ -23,6 +32,12 @@ @Autowired private ProcessRouteMapper processRouteMapper; @Autowired private ProcessRouteItemMapper processRouteItemMapper; @Autowired private ProductOrderMapper productOrderMapper; @Override public IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto) { @@ -40,4 +55,16 @@ processRoute.setProcessRouteCode(newProductCode); return processRouteMapper.updateById(processRoute); } @Override public int batchDelete(List<Long> ids) { //å 夿æ¯å¦å·²ç»å¼ç¨äº List<ProductOrder> productOrders = productOrderMapper.selectList(Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getRouteId, ids)); if (productOrders.size()>0){ throw new RuntimeException("该工èºè·¯çº¿ç产已å¼ç¨ï¼ä¸è½å é¤"); } //å é¤å·¥èºè·¯çº¿è¯¦æ processRouteItemMapper.delete(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getRouteId, ids)); return processRouteMapper.deleteBatchIds(ids); } } src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
@@ -2,14 +2,19 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; 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.basic.pojo.Customer; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.production.dto.ProductProcessDto; import com.ruoyi.production.mapper.ProcessRouteItemMapper; import com.ruoyi.production.mapper.ProductProcessMapper; import com.ruoyi.production.mapper.ProductProcessRouteItemMapper; import com.ruoyi.production.pojo.ProcessRouteItem; import com.ruoyi.production.pojo.ProductProcess; import com.ruoyi.production.pojo.ProductProcessRouteItem; import com.ruoyi.production.service.ProductProcessService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -23,6 +28,10 @@ public class ProductProcessServiceImpl extends ServiceImpl<ProductProcessMapper, ProductProcess> implements ProductProcessService { @Autowired private ProductProcessMapper productProcessMapper; @Autowired private ProcessRouteItemMapper processRouteItemMapper; @Autowired private ProductProcessRouteItemMapper productProcessRouteItemMapper; @Override public IPage<ProductProcessDto> listPage(Page page, ProductProcessDto productProcessDto) { @@ -34,7 +43,7 @@ ProductProcess productProcess = new ProductProcess(); BeanUtils.copyProperties(productProcessDto,productProcess); boolean save = productProcessMapper.insert(productProcess) > 0; if (save && ObjectUtils.isNotNull(productProcessDto.getNo())) { if (save && ObjectUtils.isNull(productProcessDto.getNo())) { // æ ¹æ®idçænoåæ®µï¼GX + 8使°åï¼ä¸è¶³8ä½åé¢è¡¥0ï¼ String no = "GX" + String.format("%08d", productProcess.getId()); productProcess.setNo(no); @@ -42,7 +51,7 @@ productProcessMapper.updateById(productProcess); return AjaxResult.success(); } return AjaxResult.error(); return AjaxResult.success(); } @Override @@ -60,4 +69,16 @@ return AjaxResult.error("å¯¼å ¥å¤±è´¥"); } } @Override public String batchDelete(List<Integer> ids) { //æ¥è¯¢æ¯å¦ç产ä¸å·²ç»å¼ç¨äºè¿äºå·¥åº List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getProcessId, ids)); List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().in(ProductProcessRouteItem::getProcessId, ids)); if (!CollectionUtils.isEmpty(processRouteItems) || !CollectionUtils.isEmpty(productProcessRouteItems)){ throw new RuntimeException("该工åºå·²ç»è¢«ä½¿ç¨ï¼æ æ³å é¤"); } productProcessMapper.deleteBatchIds(ids); return null; } } src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -157,10 +157,10 @@ Product product = productMapper.selectById(productModel1.getProductId()); BigDecimal stockQuantity = stockUtils.getStockQuantity(productModel1.getId()).get("stockQuantity"); if (!(stockQuantity.compareTo(BigDecimal.ZERO) > 0)) { throw new RuntimeException(product.getProductName() + "åºå为0"); throw new RuntimeException(product.getProductName()+"产åç"+productModel1.getModel() + "çè§æ ¼åºå为0"); } if (stockQuantity.compareTo(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())) < 0) { throw new RuntimeException(product.getProductName() + "åºåä¸è¶³"); throw new RuntimeException(product.getProductName()+"产åç"+productModel1.getModel() + "çè§æ ¼åºåä¸è¶³"); } ProductionProductInput productionProductInput = new ProductionProductInput(); productionProductInput.setProductModelId(productStructureDto.getProductModelId()); src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -5,12 +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.utils.StringUtils; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.sales.dto.InvoiceRegistrationProductDto; import com.ruoyi.sales.dto.SalesLedgerProductDto; import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper; @@ -45,6 +48,7 @@ public class SalesLedgerProductServiceImpl extends ServiceImpl<SalesLedgerProductMapper, SalesLedgerProduct> implements ISalesLedgerProductService { private SalesLedgerProductMapper salesLedgerProductMapper; private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; private SalesLedgerMapper salesLedgerMapper; @@ -62,6 +66,10 @@ private ProductProcessRouteMapper productProcessRouteMapper; private ProductWorkOrderMapper productWorkOrderMapper; private ProductionProductMainMapper productionProductMainMapper; private ProductionProductOutputMapper productionProductOutputMapper; private ProductionProductInputMapper productionProductInputMapper; private QualityInspectMapper qualityInspectMapper; @Override public SalesLedgerProduct selectSalesLedgerProductById(Long id) { @@ -205,76 +213,18 @@ Long salesLedgerId = salesLedgerProduct.getSalesLedgerId(); if (salesLedgerProduct.getId() == null) { result = salesLedgerProductMapper.insert(salesLedgerProduct); ProductOrder productOrder = new ProductOrder(); productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId()); productOrder.setProductModelId(salesLedgerProduct.getId()); productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId())); productOrder.setQuantity(salesLedgerProduct.getQuantity());//éæ±æ°é productOrder.setCompleteQuantity(BigDecimal.ZERO);//宿æ°é productOrderMapper.insert(productOrder); ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId())); if (processRoute != null) { //æ°å¢ç产订åå·¥èºè·¯çº¿ä¸»è¡¨ ProductProcessRoute productProcessRoute = new ProductProcessRoute(); productProcessRoute.setProductModelId(processRoute.getProductModelId()); productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode()); productProcessRoute.setProductOrderId(productOrder.getId()); productProcessRoute.setBomId(processRoute.getBomId()); productProcessRouteMapper.insert(productProcessRoute); //æ°å¢ç产订åå·¥èºè·¯çº¿å表 List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId())); // çæå½åæ¥æçåç¼ï¼å¹´ææ¥ String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); for (ProcessRouteItem processRouteItem : processRouteItems) { ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem(); productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId()); productProcessRouteItem.setProcessId(processRouteItem.getProcessId()); productProcessRouteItem.setProductOrderId(productOrder.getId()); productProcessRouteItem.setProductRouteId(productProcessRoute.getId()); 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); int sequenceNumber = 1; // é»è®¤åºå· if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) { String lastNo = lastWorkOrder.getWorkOrderNo().toString(); if (lastNo.startsWith(datePrefix)) { String seqStr = lastNo.substring(datePrefix.length()); try { sequenceNumber = Integer.parseInt(seqStr) + 1; } catch (NumberFormatException e) { sequenceNumber = 1; } } } // çæå®æ´çå·¥åå· String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber); ProductWorkOrder productWorkOrder = new ProductWorkOrder(); productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); productWorkOrder.setProductOrderId(productOrder.getId()); productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity()); productWorkOrder.setWorkOrderNo(workOrderNoStr); productWorkOrder.setStatus(1); productWorkOrderMapper.insert(productWorkOrder); } } productOrder.setRouteId(processRoute.getId()); productOrderMapper.updateById(productOrder); } addProductionData(salesLedgerProduct); } else { //æ¥è¯¢åæ¬ç产ååå·id salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity()); result = salesLedgerProductMapper.updateById(salesLedgerProduct); /*å é¤å¯¹åºççäº§æ°æ®å¹¶éæ°æ°å¢*/ deleteProductionData(Arrays.asList(salesLedgerProduct.getId())); // å é¤çäº§æ ¸ç®æ°æ® LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>(); reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, salesLedgerId); salesLedgerProductionAccountingMapper.delete(reportWrapper); addProductionData(salesLedgerProduct); } // 妿æå ¥ææ´æ°æåï¼å¹¶ä¸æ salesLedgerIdï¼æç»§ç»æ´æ°ä¸»è¡¨éé¢ @@ -307,6 +257,164 @@ return result; } /** * æ°å¢çäº§æ°æ® */ public void addProductionData(SalesLedgerProduct salesLedgerProduct) { ProductOrder productOrder = new ProductOrder(); productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId()); productOrder.setProductModelId(salesLedgerProduct.getId()); productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId())); productOrder.setQuantity(salesLedgerProduct.getQuantity());//éæ±æ°é productOrder.setCompleteQuantity(BigDecimal.ZERO);//宿æ°é productOrderMapper.insert(productOrder); List<ProcessRoute> processRoutes = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda() .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()) .orderByDesc(ProcessRoute::getCreateTime)); if (processRoutes.size()>0){ ProcessRoute processRoute = processRoutes.get(0); //æ°å¢ç产订åå·¥èºè·¯çº¿ä¸»è¡¨ ProductProcessRoute productProcessRoute = new ProductProcessRoute(); productProcessRoute.setProductModelId(processRoute.getProductModelId()); productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode()); productProcessRoute.setProductOrderId(productOrder.getId()); productProcessRoute.setBomId(processRoute.getBomId()); productProcessRouteMapper.insert(productProcessRoute); //æ°å¢ç产订åå·¥èºè·¯çº¿å表 List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId())); // çæå½åæ¥æçåç¼ï¼å¹´ææ¥ String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); for (ProcessRouteItem processRouteItem : processRouteItems) { ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem(); productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId()); productProcessRouteItem.setProcessId(processRouteItem.getProcessId()); productProcessRouteItem.setProductOrderId(productOrder.getId()); productProcessRouteItem.setProductRouteId(productProcessRoute.getId()); 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); int sequenceNumber = 1; // é»è®¤åºå· if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) { String lastNo = lastWorkOrder.getWorkOrderNo().toString(); if (lastNo.startsWith(datePrefix)) { String seqStr = lastNo.substring(datePrefix.length()); try { sequenceNumber = Integer.parseInt(seqStr) + 1; } catch (NumberFormatException e) { sequenceNumber = 1; } } } // çæå®æ´çå·¥åå· String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber); ProductWorkOrder productWorkOrder = new ProductWorkOrder(); productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); productWorkOrder.setProductOrderId(productOrder.getId()); productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity()); productWorkOrder.setWorkOrderNo(workOrderNoStr); productWorkOrder.setStatus(1); productWorkOrderMapper.insert(productWorkOrder); } } productOrder.setRouteId(processRoute.getId()); productOrderMapper.updateById(productOrder); } } /** * å é¤çäº§æ°æ® */ public void deleteProductionData(List<Long> productIds) { //æ¹éæ¥è¯¢productOrder List<ProductOrder> productOrders = productOrderMapper.selectList( new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getProductModelId, productIds) ); if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) { List<Long> orderIds = productOrders.stream() .map(ProductOrder::getId) .collect(Collectors.toList()); // æ¹éæ¥è¯¢processRouteItems List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList( new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, orderIds) ); 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) ); qualityInspects.forEach(qualityInspect -> { //inspectState=1 å·²æäº¤ ä¸è½å é¤ if (qualityInspect.getInspectState() == 1) { throw new RuntimeException("å·²æäº¤çæ£éªåä¸è½å é¤"); } }); qualityInspectMapper.deleteByProductMainIds(productMainIds); } // å é¤çäº§ä¸»è¡¨æ°æ® productionProductMainMapper.deleteByWorkOrderIds(workOrderIds); // å é¤å·¥åæ°æ® productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>() .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)); } } // æ¹éå é¤processRouteItem productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, orderIds)); // æ¹éå é¤productProcessRoute productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>() .in(ProductProcessRoute::getProductOrderId, orderIds)); // æ¹éå é¤productOrder productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getProductModelId, productIds)); } } @Override public IPage<SalesLedgerProductDto> listPage(Page page, SalesLedgerProductDto salesLedgerProduct) { IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPage(page, salesLedgerProduct); src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -32,6 +32,7 @@ import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.mapper.*; import com.ruoyi.sales.pojo.*; import com.ruoyi.sales.service.ISalesLedgerProductService; import com.ruoyi.sales.service.ISalesLedgerService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -77,6 +78,7 @@ private final CustomerMapper customerMapper; private final SalesLedgerProductMapper salesLedgerProductMapper; private final SalesLedgerProductServiceImpl salesLedgerProductServiceImpl; private final CommonFileMapper commonFileMapper; @@ -90,7 +92,7 @@ private final SalesLedgerWorkMapper salesLedgerWorkMapper; private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper; @@ -217,8 +219,8 @@ // æ¥è¯¢åå§æ°æ® LambdaQueryWrapper<SalesLedger> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.select(SalesLedger::getCustomerId, SalesLedger::getCustomerName, SalesLedger::getContractAmount) SalesLedger::getCustomerName, SalesLedger::getContractAmount) .orderByDesc(SalesLedger::getContractAmount); List<SalesLedger> records = salesLedgerMapper.selectList(queryWrapper); @@ -226,7 +228,7 @@ Map<Long, GroupedCustomer> groupedMap = new LinkedHashMap<>(); // 使ç¨LinkedHashMapä¿ææåº for (SalesLedger record : records) { groupedMap.computeIfAbsent(record.getCustomerId(), k -> new GroupedCustomer(record.getCustomerId(), record.getCustomerName())) k -> new GroupedCustomer(record.getCustomerId(), record.getCustomerName())) .addAmount(record.getContractAmount()); } @@ -393,86 +395,8 @@ List<Long> productIds = products.stream() .map(SalesLedgerProduct::getId) .collect(Collectors.toList()); //æ¹éæ¥è¯¢productOrder List<ProductOrder> productOrders = productOrderMapper.selectList( new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getProductModelId, productIds) ); if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) { List<Long> orderIds = productOrders.stream() .map(ProductOrder::getId) .collect(Collectors.toList()); // æ¹éæ¥è¯¢processRouteItems List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList( new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, orderIds) ); if (!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 (!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 (!CollectionUtils.isEmpty(productMainIds)) { productionProductOutputMapper.deleteByProductMainIds(productMainIds); productionProductInputMapper.deleteByProductMainIds(productMainIds); List<QualityInspect> qualityInspects = qualityInspectMapper.selectList( new LambdaQueryWrapper<QualityInspect>() .in(QualityInspect::getProductMainId, productMainIds) ); qualityInspects.forEach(qualityInspect -> { //inspectState=1 å·²æäº¤ ä¸è½å é¤ if(qualityInspect.getInspectState() == 1){ throw new RuntimeException("å·²æäº¤çæ£éªåä¸è½å é¤"); } }); qualityInspectMapper.deleteByProductMainIds(productMainIds); } // å é¤çäº§ä¸»è¡¨æ°æ® productionProductMainMapper.deleteByWorkOrderIds(workOrderIds); // å é¤å·¥åæ°æ® productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>() .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)); } } // æ¹éå é¤processRouteItem productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, orderIds)); // æ¹éå é¤productProcessRoute productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>() .in(ProductProcessRoute::getProductOrderId, orderIds)); // æ¹éå é¤productOrder productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getProductModelId, productIds)); } //å é¤çäº§æ°æ® salesLedgerProductServiceImpl.deleteProductionData(productIds); // æ¹éå é¤äº§åå表 if (!productIds.isEmpty()) { @@ -483,11 +407,11 @@ wrapper.in(InvoiceRegistrationProduct::getSalesLedgerId, idList); List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(wrapper); List<Integer> invoiceLedgerIds = new ArrayList<>(); if(CollectionUtils.isNotEmpty(invoiceRegistrationProducts)){ if (CollectionUtils.isNotEmpty(invoiceRegistrationProducts)) { LambdaQueryWrapper<InvoiceLedger> wrapperOne = new LambdaQueryWrapper<>(); wrapperOne.in(InvoiceLedger::getInvoiceRegistrationProductId, invoiceRegistrationProducts.stream().map(InvoiceRegistrationProduct::getId).collect(Collectors.toList())); List<InvoiceLedger> invoiceLedgers = invoiceLedgerMapper.selectList(wrapperOne); if(CollectionUtils.isNotEmpty(invoiceLedgers)){ if (CollectionUtils.isNotEmpty(invoiceLedgers)) { invoiceLedgerIds = invoiceLedgers.stream().map(InvoiceLedger::getId).collect(Collectors.toList()); } invoiceLedgerMapper.delete(wrapperOne); @@ -497,7 +421,7 @@ wrapperTwo.in(InvoiceRegistration::getSalesLedgerId, idList); invoiceRegistrationMapper.delete(wrapperTwo); if(CollectionUtils.isNotEmpty(invoiceLedgerIds)){ if (CollectionUtils.isNotEmpty(invoiceLedgerIds)) { LambdaQueryWrapper<ReceiptPayment> wrapperTree = new LambdaQueryWrapper<>(); wrapperTree.in(ReceiptPayment::getInvoiceLedgerId, invoiceLedgerIds); receiptPaymentMapper.delete(wrapperTree); @@ -512,7 +436,7 @@ 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); @@ -668,79 +592,8 @@ salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProductMapper.insert(salesLedgerProduct); ProductOrder productOrder = new ProductOrder(); productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId()); productOrder.setProductModelId(salesLedgerProduct.getId()); productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId())); productOrder.setQuantity(salesLedgerProduct.getQuantity());//éæ±æ°é productOrder.setCompleteQuantity(BigDecimal.ZERO);//宿æ°é productOrderMapper.insert(productOrder); ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId())); List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomId(processRoute.getBomId()); if (processRoute != null) { //æ°å¢ç产订åå·¥èºè·¯çº¿ä¸»è¡¨ ProductProcessRoute productProcessRoute = new ProductProcessRoute(); productProcessRoute.setProductModelId(processRoute.getProductModelId()); productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode()); productProcessRoute.setProductOrderId(productOrder.getId()); productProcessRoute.setBomId(processRoute.getBomId()); productProcessRouteMapper.insert(productProcessRoute); //æ°å¢ç产订åå·¥èºè·¯çº¿å表 List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId())); // çæå½åæ¥æçåç¼ï¼å¹´ææ¥ String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); for (ProcessRouteItem processRouteItem : processRouteItems) { ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem(); productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId()); productProcessRouteItem.setProcessId(processRouteItem.getProcessId()); productProcessRouteItem.setProductOrderId(productOrder.getId()); productProcessRouteItem.setProductRouteId(productProcessRoute.getId()); productProcessRouteItem.setDragSort(processRouteItem.getDragSort()); 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); int sequenceNumber = 1; // é»è®¤åºå· if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) { String lastNo = lastWorkOrder.getWorkOrderNo().toString(); if (lastNo.startsWith(datePrefix)) { String seqStr = lastNo.substring(datePrefix.length()); try { sequenceNumber = Integer.parseInt(seqStr) + 1; } catch (NumberFormatException e) { sequenceNumber = 1; } } } // çæå®æ´çå·¥åå· String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber); ProductWorkOrder productWorkOrder = new ProductWorkOrder(); productStructureDtos.stream().forEach(productStructureDto -> { if (productStructureDto.getProductModelId().equals(productProcessRouteItem.getProductModelId())){ productWorkOrder.setPlanQuantity(productWorkOrder.getPlanQuantity()); } }); if (Objects.equals(productProcessRouteItem.getProductModelId(), salesLedgerProduct.getProductModelId())) { productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity()); } productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); productWorkOrder.setProductOrderId(productOrder.getId()); productWorkOrder.setWorkOrderNo(workOrderNoStr); productWorkOrder.setStatus(1); productWorkOrderMapper.insert(productWorkOrder); } } productOrder.setRouteId(processRoute.getId()); productOrderMapper.updateById(productOrder); } // æ·»å çäº§æ°æ® salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct); } } } src/main/resources/mapper/device/DeviceLedgerMapper.xml
@@ -28,7 +28,10 @@ dl.update_time , su.nick_name AS createUser, dl.update_user, dl.tenant_id dl.tenant_id, dl.is_depr, dl.annual_depreciation_amount, dl.type FROM device_ledger dl left join sys_user su on dl.create_user = su.user_id <where> @@ -84,5 +87,18 @@ from device_ledger where id = #{id} </select> <select id="getDeviceTypeDistributionByYear" resultType="com.ruoyi.account.dto.DeviceTypeDetail" parameterType="java.lang.Integer"> SELECT `type`, SUM(`number`) AS `count`, SUM(tax_including_price_unit) AS amount FROM device_ledger WHERE YEAR(create_time) = #{year} AND type IS NOT NULL GROUP BY type </select> </mapper> src/main/resources/mapper/purchase/InvoicePurchaseMapper.xml
@@ -7,49 +7,27 @@ <select id="selectPurchaseReport" resultType="com.ruoyi.purchase.dto.InvoicePurchaseReportDto"> SELECT A.*, FORMAT(A.sales_tax_amount - A.purchase_tax_amount, 2) AS balance_amount FROM ( SELECT sl.customer_contract_no, sl.id, pl.id AS pl_id, sl.sales_contract_no AS customerContractNo, sl.customer_name, sl.project_name, slp.tax_inclusive_total_price - slp.tax_exclusive_total_price AS contract_amount, SUM(slp1.tax_inclusive_total_price - slp1.tax_exclusive_total_price) AS purchase_amount, (slp.tax_exclusive_total_price) / COUNT(slp.id) AS sale_tax_exclusive_total_price, SUM(slp1.tax_exclusive_total_price) AS tax_exclusive_total_price, (slp.tax_inclusive_total_price - slp.tax_exclusive_total_price) - SUM(slp1.tax_inclusive_total_price - slp1.tax_exclusive_total_price) AS balance, CONCAT( FORMAT( ((slp.tax_inclusive_total_price - slp.tax_exclusive_total_price) - SUM(slp1.tax_inclusive_total_price - slp1.tax_exclusive_total_price)) / (slp.tax_inclusive_total_price - slp.tax_exclusive_total_price) * 100, 2), '%' ) AS balance_ratio, (slp.tax_inclusive_total_price - slp.tax_exclusive_total_price) AS sales_tax_amount, SUM(slp1.tax_inclusive_total_price - slp1.tax_exclusive_total_price) AS purchase_tax_amount sl.contract_amount AS contract_amount, SUM( pl.contract_amount ) AS purchase_amount, ( sl.contract_amount - SUM( pl.contract_amount )) AS balance, CONCAT( ROUND( ( sl.contract_amount - SUM( pl.contract_amount )) / sl.contract_amount * 100, 1 ), '%' ) AS balance_ratio FROM purchase_ledger pl LEFT JOIN sales_ledger sl ON pl.sales_ledger_id = sl.id LEFT JOIN sales_ledger_product slp ON slp.sales_ledger_id = sl.id AND slp.type = 1 LEFT JOIN sales_ledger_product slp1 ON slp1.sales_ledger_id = pl.id AND slp1.type = 2 GROUP BY sl.customer_contract_no, sl.customer_name, sl.project_name, sl.id, pl.id HAVING sl.customer_contract_no IS NOT NULL ) A sales_ledger sl INNER JOIN purchase_ledger pl ON sl.sales_contract_no = pl.sales_contract_no <where> <if test="c.customerName != null and c.customerName != ''"> AND A.customer_name LIKE CONCAT('%', #{c.customerName}, '%') AND sl.customer_name LIKE CONCAT('%', #{c.customerName}, '%') </if> </where> GROUP BY sl.sales_contract_no, sl.customer_name, sl.contract_amount ORDER BY sl.sales_contract_no; </select> <select id="listVat" resultType="com.ruoyi.purchase.dto.VatDto"> select *