doc/20260601_home_business_ÉÏÔÂÊý¾Ý_ǰ¶ËÁªµ÷Îĵµ.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,101 @@ # /home/business æ¥å£æ°å¢ä¸ææ°æ® â å端èè°ææ¡£ ## åæ´æ¦è¿° `GET /home/business` æ¥å£å¨åæå段åºç¡ä¸æ°å¢ **䏿éå®éé¢** å **䏿éè´éé¢** ä¸¤ä¸ªåæ®µï¼å端å¯ç´æ¥ç¨äºå±ç¤ºç¯æ¯è¶å¿ã --- ## æ¥å£ä¿¡æ¯ | é¡¹ç® | å 容 | |------|------| | æ¥å£å°å | `/home/business` | | è¯·æ±æ¹å¼ | `GET` | | æ¯å¦è®¤è¯ | æ¯ | --- ## ååºåæ° ### æ°å¢å段 | åæ®µå | ç±»å | 说æ | |--------|------|------| | `lastMonthSaleMoney` | `String` | 䏿éå®ååéé¢ï¼å ï¼ï¼ä¿ç两ä½å°æ°ï¼å¦ `"150000.00"` | | `lastMonthPurchaseMoney` | `String` | 䏿éè´ååéé¢ï¼å ï¼ï¼ä¿ç两ä½å°æ°ï¼å¦ `"80000.00"` | ### 宿´ååº ```json { "code": 200, "msg": "æä½æå", "data": { "monthSaleMoney": "200000.00", "lastMonthSaleMoney": "150000.00", "monthSaleHaveMoney": "0.00", "monthPurchaseMoney": "100000.00", "lastMonthPurchaseMoney": "80000.00", "monthPurchaseHaveMoney": "0.00", "inventoryNum": "5000.00", "todayInventoryNum": "120.00" } } ``` ### ææå段ä¸è§ | åæ®µå | ç±»å | 说æ | |--------|------|------| | `monthSaleMoney` | `String` | æ¬æéå®éé¢ | | `lastMonthSaleMoney` | **`String`ï¼æ°å¢ï¼** | 䏿éå®éé¢ | | `monthSaleHaveMoney` | `String` | æ¬æé宿ªå¼ç¥¨éé¢ï¼å½ååºå® `0.00`ï¼ | | `monthPurchaseMoney` | `String` | æ¬æéè´éé¢ | | `lastMonthPurchaseMoney` | **`String`ï¼æ°å¢ï¼** | 䏿éè´éé¢ | | `monthPurchaseHaveMoney` | `String` | æ¬æéè´æªå¼ç¥¨éé¢ï¼å½ååºå® `0.00`ï¼ | | `inventoryNum` | `String` | å½ååºåæ»é | | `todayInventoryNum` | `String` | 仿¥å ¥åºæ°é | --- ## æ°æ®å£å¾ | åæ®µ | æ°æ®æ¥æº | ç»è®¡å£å¾ | |------|---------|---------| | `monthSaleMoney` | `sales_ledger` 表 | `entry_date` 卿¬æ1æ¥~䏿1æ¥ä¹é´ç `contract_amount` å计 | | `lastMonthSaleMoney` | `sales_ledger` 表 | `entry_date` å¨ä¸æ1æ¥~æ¬æ1æ¥ä¹é´ç `contract_amount` å计 | | `monthPurchaseMoney` | `purchase_ledger` 表 | `entry_date` 卿¬æ1æ¥~䏿1æ¥ä¹é´ç `contract_amount` å计 | | `lastMonthPurchaseMoney` | `purchase_ledger` 表 | `entry_date` å¨ä¸æ1æ¥~æ¬æ1æ¥ä¹é´ç `contract_amount` å计 | --- ## å端使ç¨å»ºè®® ### ç¯æ¯å±ç¤º ```javascript // 计ç®ç¯æ¯åå const saleGrowth = lastMonthSaleMoney > 0 ? ((monthSaleMoney - lastMonthSaleMoney) / lastMonthSaleMoney * 100).toFixed(1) : 100; const purchaseGrowth = lastMonthPurchaseMoney > 0 ? ((monthPurchaseMoney - lastMonthPurchaseMoney) / lastMonthPurchaseMoney * 100).toFixed(1) : 100; ``` ### è¶å¿ç®å¤´ - `saleGrowth > 0` â 红è²åä¸ç®å¤´ (â) - `saleGrowth < 0` â 绿è²åä¸ç®å¤´ (â) - `saleGrowth === 0` â ç°è²æå¹³ (â) --- ## 注æäºé¡¹ 1. **ç±»å为 String**ï¼éé¢å段å为å符串ï¼ä¿ç两ä½å°æ°ï¼è®¡ç®ç¯æ¯æ¶éç¨ `parseFloat()` è½¬æ¢ 2. **é»è®¤å¼**ï¼æ æ°æ®æ¶è¿å `"0.00"`ï¼ä¸ä¼è¿å `null` 3. **æªå¼ç¥¨å段**ï¼`monthSaleHaveMoney` å `monthPurchaseHaveMoney` å½ååºå®è¿å `"0.00"`ï¼åç»è¿ä»£ä¼æ¥å ¥å®é æ°æ® 4. **ååå ¼å®¹**ï¼ä» æ°å¢å段ï¼åæå段ä¸åï¼å·²æå端åè½ä¸åå½±å src/main/java/com/ruoyi/approve/bean/dto/ApprovalInstanceDto.java
@@ -2,6 +2,8 @@ import com.ruoyi.approve.pojo.ApprovalInstance; import com.ruoyi.basic.dto.StorageBlobDTO; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.util.List; @@ -18,4 +20,7 @@ private String createTimeStart; private List<StorageBlobDTO> storageBlobDTOs; @Schema(description = "åºåºæ¹å·") private String outboundBatches; } src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -690,8 +690,7 @@ private void handleShippingApprovalFinished(ApprovalInstance instance, String status) { ShippingInfo shippingInfo = shippingInfoMapper.selectOne( new LambdaQueryWrapper<ShippingInfo>() .eq(ShippingInfo::getId, instance.getTitle()) .orderByDesc(ShippingInfo::getCreateTime) .eq(ShippingInfo::getId, instance.getBusinessId()) .last("limit 1") ); if (shippingInfo == null) { src/main/java/com/ruoyi/home/dto/HomeBusinessDto.java
@@ -16,12 +16,18 @@ @Schema(description = "æ¬æéå®éé¢") private String monthSaleMoney = "0.00"; @Schema(description = "䏿éå®éé¢") private String lastMonthSaleMoney = "0.00"; @Schema(description = "æ¬æé宿ªå¼ç¥¨éé¢") private String monthSaleHaveMoney = "0.00"; @Schema(description = "æ¬æéè´éé¢") private String monthPurchaseMoney = "0.00"; @Schema(description = "䏿éè´éé¢") private String lastMonthPurchaseMoney = "0.00"; @Schema(description = "æ¬æéè´æªå¼ç¥¨éé¢") private String monthPurchaseHaveMoney = "0.00"; src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -179,6 +179,34 @@ homeBusinessDto.setMonthPurchaseMoney(receiveAmount.setScale(2, RoundingMode.HALF_UP).toString()); homeBusinessDto.setMonthPurchaseHaveMoney(BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP).toString()); } // 䏿éå®éé¢ YearMonth lastMonth = currentMonth.minusMonths(1); LambdaQueryWrapper<SalesLedger> lastMonthSalesWrapper = new LambdaQueryWrapper<>(); lastMonthSalesWrapper.ge(SalesLedger::getEntryDate, lastMonth.atDay(1).atStartOfDay()) .lt(SalesLedger::getEntryDate, lastMonth.plusMonths(1).atDay(1).atStartOfDay()); List<SalesLedger> lastMonthSalesLedgers = salesLedgerMapper.selectList(lastMonthSalesWrapper); if (!CollectionUtils.isEmpty(lastMonthSalesLedgers)) { BigDecimal lastMonthContractAmount = lastMonthSalesLedgers.stream() .map(SalesLedger::getContractAmount) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); homeBusinessDto.setLastMonthSaleMoney(lastMonthContractAmount.setScale(2, RoundingMode.HALF_UP).toString()); } // 䏿éè´éé¢ LambdaQueryWrapper<PurchaseLedger> lastMonthPurchaseWrapper = new LambdaQueryWrapper<>(); lastMonthPurchaseWrapper.ge(PurchaseLedger::getEntryDate, lastMonth.atDay(1).atStartOfDay()) .lt(PurchaseLedger::getEntryDate, lastMonth.plusMonths(1).atDay(1).atStartOfDay()); List<PurchaseLedger> lastMonthPurchaseLedgers = purchaseLedgerMapper.selectList(lastMonthPurchaseWrapper); if (!CollectionUtils.isEmpty(lastMonthPurchaseLedgers)) { BigDecimal lastMonthPurchaseAmount = lastMonthPurchaseLedgers.stream() .map(PurchaseLedger::getContractAmount) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); homeBusinessDto.setLastMonthPurchaseMoney(lastMonthPurchaseAmount.setScale(2, RoundingMode.HALF_UP).toString()); } // ç»è®¡åºå BigDecimal stockQuantityTotal = stockInventoryMapper.selectTotal(); homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString()); src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -154,12 +154,27 @@ * @param recordId */ public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) { substractStock(productModelId, quantity, recordType, recordId, batchNo, null); } /** * åæ ¼åºåºï¼å¸¦åºåºæ¹å·ï¼ * * @param productModelId * @param quantity * @param recordType * @param recordId * @param batchNo * @param outboundBatches åºåºæ¹å·ï¼å¦æä¸ºç©ºåèªå¨çæ */ public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo, String outboundBatches) { StockInventoryDto stockInventoryDto = new StockInventoryDto(); stockInventoryDto.setRecordId(recordId); stockInventoryDto.setRecordType(String.valueOf(recordType)); stockInventoryDto.setQualitity(quantity); stockInventoryDto.setProductModelId(productModelId); stockInventoryDto.setBatchNo(batchNo); stockInventoryDto.setOutboundBatches(outboundBatches); stockInventoryService.addStockOutRecordOnly(stockInventoryDto); } src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -5,6 +5,7 @@ import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.R; import com.ruoyi.quality.dto.BatchQuickInspectRequest; import com.ruoyi.quality.dto.QualityInspectDto; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectFile; @@ -143,13 +144,13 @@ } /** * æ¹éå¿«éæ£éªï¼ä¸é®éè¿å¹¶æäº¤ * æ¹éå¿«éæ£éªï¼æ¯æåæææ£éªãè¿ç¨æ£éªãåºåæ£éª */ @PostMapping("/batchQuickInspect") @Operation(summary = "æ¹éå¿«éæ£éª") @Log(title = "æ¹éå¿«éæ£éª", businessType = BusinessType.OTHER) public R<?> batchQuickInspect(@RequestBody List<Long> ids) { return qualityInspectService.batchQuickInspect(ids); public R<?> batchQuickInspect(@RequestBody BatchQuickInspectRequest request) { return qualityInspectService.batchQuickInspect(request); } /** src/main/java/com/ruoyi/quality/dto/BatchQuickInspectRequest.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,42 @@ package com.ruoyi.quality.dto; import com.ruoyi.quality.pojo.QualityInspectParam; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.math.BigDecimal; import java.util.List; @Data public class BatchQuickInspectRequest { @Schema(description = "æ£éªåIDå表") private List<Long> ids; @Schema(description = "æ£æµç»æï¼åæ ¼/ä¸åæ ¼/é¨ååæ ¼") private String checkResult; @Schema(description = "ææ æ åID") private Long testStandardId; @Schema(description = "æ»æ°é") private BigDecimal quantity; @Schema(description = "åæ ¼æ°é") private BigDecimal qualifiedQuantity; @Schema(description = "ä¸åæ ¼æ°é") private BigDecimal unqualifiedQuantity; @Schema(description = "æ£æµåä½") private String checkCompany; @Schema(description = "æ£éªåå§å") private String checkName; @Schema(description = "æ£æµæ¥æï¼æ ¼å¼ï¼YYYY-MM-DD") private String checkTime; @Schema(description = "æ£éªåæ°å表") private List<QualityInspectParam> paramList; } src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -4,11 +4,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.framework.web.domain.R; import com.ruoyi.quality.dto.BatchQuickInspectRequest; import com.ruoyi.quality.dto.QualityInspectDto; import com.ruoyi.quality.pojo.QualityInspect; import jakarta.servlet.http.HttpServletResponse; import java.util.List; public interface IQualityInspectService extends IService<QualityInspect> { @@ -28,9 +28,9 @@ R autoSubmit(Long id); /** * æ¹éå¿«éæ£éªï¼ä¸é®éè¿å¹¶æäº¤ * æ¹éå¿«éæ£éª */ R batchQuickInspect(List<Long> ids); R batchQuickInspect(BatchQuickInspectRequest request); void down(HttpServletResponse response, QualityInspect qualityInspect); } src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -17,6 +17,7 @@ import com.ruoyi.framework.web.domain.R; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.quality.dto.BatchQuickInspectRequest; import com.ruoyi.quality.dto.QualityInspectDto; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.mapper.QualityTestStandardMapper; @@ -35,14 +36,17 @@ import lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.io.InputStream; import java.io.OutputStream; import java.math.BigDecimal; import java.net.URLEncoder; import java.sql.Date; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -187,21 +191,150 @@ } @Override public R batchQuickInspect(List<Long> ids) { if (ids == null || ids.isEmpty()) { public R batchQuickInspect(BatchQuickInspectRequest request) { // 1. æ°æ®æ ¡éª if (request.getIds() == null || request.getIds().isEmpty()) { return R.fail("è¯·éæ©è³å°ä¸æ¡æ£éªå"); } int success = 0; int fail = 0; for (Long id : ids) { R result = autoSubmit(id); if (R.isSuccess(result)) { success++; List<String> validResults = Arrays.asList("åæ ¼", "ä¸åæ ¼", "é¨ååæ ¼"); if (!validResults.contains(request.getCheckResult())) { return R.fail("æ£æµç»æå¿ 须为ï¼åæ ¼ãä¸åæ ¼ãé¨ååæ ¼"); } if (request.getQuantity() == null || request.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { return R.fail("æ»æ°éå¿ é¡»å¤§äº0"); } if (request.getTestStandardId() == null) { return R.fail("ææ æ åIDä¸è½ä¸ºç©º"); } // quantity = qualifiedQuantity + unqualifiedQuantity BigDecimal qty = request.getQuantity(); BigDecimal qualified = request.getQualifiedQuantity() != null ? request.getQualifiedQuantity() : BigDecimal.ZERO; BigDecimal unqualified = request.getUnqualifiedQuantity() != null ? request.getUnqualifiedQuantity() : BigDecimal.ZERO; if (qty.compareTo(qualified.add(unqualified)) != 0) { return R.fail("æ»æ°éå¿ é¡»çäºåæ ¼æ°éå ä¸åæ ¼æ°é"); } String checkResult = request.getCheckResult(); if ("åæ ¼".equals(checkResult)) { if (qualified.compareTo(qty) != 0 || unqualified.compareTo(BigDecimal.ZERO) != 0) { return R.fail("æ£éªç»æä¸ºåæ ¼æ¶ï¼åæ ¼æ°éåºçäºæ»æ°éï¼ä¸åæ ¼æ°éåºä¸º0"); } } else if ("ä¸åæ ¼".equals(checkResult)) { if (qualified.compareTo(BigDecimal.ZERO) != 0 || unqualified.compareTo(qty) != 0) { return R.fail("æ£éªç»æä¸ºä¸åæ ¼æ¶ï¼åæ ¼æ°éåºä¸º0ï¼ä¸åæ ¼æ°éåºçäºæ»æ°é"); } } else { fail++; if (qualified.compareTo(BigDecimal.ZERO) <= 0 || unqualified.compareTo(BigDecimal.ZERO) <= 0) { return R.fail("æ£éªç»æä¸ºé¨ååæ ¼æ¶ï¼åæ ¼æ°éåä¸åæ ¼æ°éé½å¿ 须大äº0"); } } return R.ok(String.format("å¿«éæ£éªå®æï¼æå %d æ¡ï¼å¤±è´¥ %d æ¡", success, fail)); // è§£ææ£æµæ¥æ Date checkTimeDate = null; if (request.getCheckTime() != null && !request.getCheckTime().isEmpty()) { checkTimeDate = Date.valueOf(LocalDate.parse(request.getCheckTime())); } int success = 0; List<String> errors = new ArrayList<>(); for (Long id : request.getIds()) { try { // 使ç¨ç¬ç«äºå¡å¤çæ¯ä¸ªæ£éªåï¼é¿å åä¸ªå¤±è´¥å½±åæ´ä½äºå¡ processSingleInspect(id, request, checkResult, qty, qualified, unqualified, checkTimeDate); success++; } catch (Exception e) { errors.add("æ£éªå " + id + " å¤ç失败ï¼" + e.getMessage()); } } if (!errors.isEmpty()) { return R.ok(String.format("å¿«éæ£éªå®æï¼æå %d æ¡ï¼å¤±è´¥ %d æ¡ã失败åå ï¼%s", success, errors.size(), String.join("ï¼", errors))); } return R.ok(String.format("å¿«éæ£éªå®æï¼æå %d æ¡", success)); } /** * å¨ç¬ç«äºå¡ä¸å¤çå个æ£éªå */ @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) public void processSingleInspect(Long id, BatchQuickInspectRequest request, String checkResult, BigDecimal qty, BigDecimal qualified, BigDecimal unqualified, Date checkTimeDate) { QualityInspect qualityInspect = qualityInspectMapper.selectById(id); if (qualityInspect == null) { throw new RuntimeException("æ£éªåä¸åå¨"); } if (Integer.valueOf(1).equals(qualityInspect.getInspectState())) { throw new RuntimeException("æ£éªåå·²æäº¤"); } // 2. æ´æ°æ£éªååæ®µ qualityInspect.setCheckResult(checkResult); qualityInspect.setTestStandardId(request.getTestStandardId()); qualityInspect.setQuantity(qty); qualityInspect.setQualifiedQuantity(qualified); qualityInspect.setUnqualifiedQuantity(unqualified); if (request.getCheckCompany() != null) { qualityInspect.setCheckCompany(request.getCheckCompany()); } if (request.getCheckName() != null) { qualityInspect.setCheckName(request.getCheckName()); } if (checkTimeDate != null) { qualityInspect.setCheckTime(checkTimeDate); } qualityInspect.setInspectState(1); // 3. ä¿åæ£éªåæ° if (request.getParamList() != null && !request.getParamList().isEmpty()) { qualityInspectParamService.remove(Wrappers.<QualityInspectParam>lambdaQuery() .eq(QualityInspectParam::getInspectId, id)); for (QualityInspectParam param : request.getParamList()) { param.setInspectId(id); param.setId(null); } qualityInspectParamService.saveBatch(request.getParamList()); } // 4. æ´æ°æ£éªå qualityInspectMapper.updateById(qualityInspect); // 5. åæ ¼å ¥åºå¤ç if (qualified.compareTo(BigDecimal.ZERO) > 0) { StockInventoryDto stockInventoryDto = new StockInventoryDto(); stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode())); if (ObjectUtils.isNotEmpty(qualityInspect.getPurchaseLedgerId())) { stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode())); } stockInventoryDto.setRecordId(qualityInspect.getId()); stockInventoryDto.setProductModelId(qualityInspect.getProductModelId()); stockInventoryDto.setQualitity(qualified); if (qualityInspect.getCheckTime() != null) { LocalDate stockCreateDate = DateUtils.toLocalDate(qualityInspect.getCheckTime()).plusDays(1); stockInventoryDto.setCreateTime(LocalDateTime.of(stockCreateDate, java.time.LocalTime.MIDNIGHT)); } stockInventoryDto.setBatchNo(resolveProductionBatchNo( qualityInspect.getProductMainId(), qualityInspect.getId(), qualityInspect.getProductModelId())); stockInventoryService.addStockInRecordOnly(stockInventoryDto); } // 6. ä¸åæ ¼å¤ç if (unqualified.compareTo(BigDecimal.ZERO) > 0) { QualityUnqualified qualityUnqualified = new QualityUnqualified(); BeanUtils.copyProperties(qualityInspect, qualityUnqualified); qualityUnqualified.setInspectState(0); qualityUnqualified.setQuantity(unqualified); List<QualityInspectParam> inspectParams = qualityInspectParamService.list( Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, id)); String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(",")); qualityUnqualified.setDefectivePhenomena(text + "è¿äºææ ä¸åå¨ä¸åæ ¼"); qualityUnqualified.setInspectId(id); qualityUnqualifiedMapper.insert(qualityUnqualified); } } private String resolveProductionBatchNo(Long productionProductMainId, src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
@@ -71,6 +71,10 @@ @Excel(name = "å货车çå·") private String shippingCarNumber; @Schema(description = "åºåºæ¹å·") @Excel(name = "åºåºæ¹å·") private String outboundBatches; @Schema(description = "å建æ¶é´") private LocalDateTime createTime; src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -142,11 +142,19 @@ @Override public boolean add(ShippingInfoDto req) { // æ ¡éªoutboundBatcheså¯ä¸æ§ if (req.getOutboundBatches() != null && !req.getOutboundBatches().isEmpty()) { long count = this.count(new LambdaQueryWrapper<ShippingInfo>() .eq(ShippingInfo::getOutboundBatches, req.getOutboundBatches())); if (count > 0) { throw new RuntimeException("åºåºæ¹å·å·²åå¨ï¼è¯·éæ°è¾å ¥"); } } this.save(req); req.getBatchNoDetailList().forEach(item -> item.setShippingInfoId(req.getId())); shippingProductDetailMapper.insert(req.getBatchNoDetailList()); for (ShippingProductDetail shippingProductDetail : req.getBatchNoDetailList()) { stockUtils.substractStock(shippingProductDetail.getProductModelId(), shippingProductDetail.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(), shippingProductDetail.getBatchNo()); stockUtils.substractStock(shippingProductDetail.getProductModelId(), shippingProductDetail.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(), shippingProductDetail.getBatchNo(), req.getOutboundBatches()); } // ä¿åæä»¶ fileUtil.saveStorageAttachment(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, req.getId(), req.getStorageBlobDTOs()); @@ -173,7 +181,10 @@ public boolean addReq(ShippingInfoDto req) { LoginUser loginUser = SecurityUtils.getLoginUser(); String sh = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH","shipping_no",req.getCreateTime()); // 设置å建æ¶é´ä¸ºå½åæ¶é´ï¼ç¡®ä¿ç¼å·æ¥è¯¢æ£ç¡® LocalDateTime now = LocalDateTime.now(); req.setCreateTime(now); String sh = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH", "shipping_no", now); // å ä¿ååè´§åï¼åå起审æ¹ï¼æ å®¡æ ¸äººèªå¨éè¿æ¶éè¦æåè´§ç¼å·åååè´§ç¶æã req.setShippingNo(sh); req.setStatus("å¾ å®¡æ ¸"); src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -80,4 +80,7 @@ @Schema(description = "产åid") private Long productId; @Schema(description = "åºåºæ¹å·") private String outboundBatches; } src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -292,6 +292,7 @@ stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); stockOutRecordDto.setType("0"); stockOutRecordDto.setRemark(stockInventoryDto.getRemark()); stockOutRecordDto.setOutboundBatches(stockInventoryDto.getOutboundBatches()); stockOutRecordService.add(stockOutRecordDto); return true; } src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -60,8 +60,11 @@ @Override public int add(StockOutRecordDto stockOutRecordDto) { // å¦æä¼ å ¥äºoutboundBatcheså使ç¨ï¼å¦åèªå¨çæ if (stockOutRecordDto.getOutboundBatches() == null || stockOutRecordDto.getOutboundBatches().isEmpty()) { String no = OrderUtils.countTodayByCreateTime(stockOutRecordMapper, "CK","outbound_batches", stockOutRecordDto.getCreateTime() != null ? stockOutRecordDto.getCreateTime() : LocalDateTime.now()); stockOutRecordDto.setOutboundBatches(no); } if (StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode().equals(stockOutRecordDto.getRecordType())){ stockOutRecordDto.setApprovalStatus(3); } src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -5,7 +5,7 @@ SELECT qi.*, <choose> <when test="qualityInspect.inspectType == 0"> <when test="qualityInspect.inspectType != 2"> pl.purchase_contract_number as purchase_contract_no </when> <otherwise> @@ -16,7 +16,7 @@ FROM quality_inspect qi <choose> <when test="qualityInspect.inspectType == 0 "> <when test="qualityInspect.inspectType != 2 "> LEFT JOIN purchase_ledger pl ON pl.id = qi.purchase_ledger_id </when> <otherwise> src/main/resources/mapper/sales/ShippingInfoMapper.xml
@@ -19,6 +19,7 @@ s.update_user, s.tenant_id, sl.sales_contract_no, s.outbound_batches, pm.model as specification_model, pm.unit, p.product_name,