| doc/河南鹤壁天沐钢化玻璃厂.sql | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/pojo/SalesLedger.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/service/ShippingInfoService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
doc/ºÓÄϺױÚÌìãå¸Ö»¯²£Á§³§.sql
@@ -88,3 +88,6 @@ ALTER TABLE `sales_ledger` ADD COLUMN `delivery_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'åè´§ç¶æï¼0-æªåè´§ï¼1-å·²åè´§' AFTER `delivery_date`; ALTER TABLE `product-inventory-management-hbtmblc`.`sales_ledger` MODIFY COLUMN `delivery_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'åè´§ç¶æï¼1-æªåè´§ï¼2-审æ¹ä¸ï¼3-审æ¹ä¸éè¿ï¼4-审æ¹éè¿ï¼5-å·²åè´§' AFTER `delivery_date`; src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -254,12 +254,9 @@ if (salesLedger != null) { if(status.equals(2)){ // 审æ¹å®æ -> èªå¨æ£é¤åºå try { shippingInfoService.deductStockByOrder(salesLedger.getId(), null); } catch (IOException e) { throw new RuntimeException("èªå¨æ£é¤åºå失败: " + e.getMessage()); } // 审æ¹å®æ -> ä¿®æ¹ç¶æä¸ºå®¡æ ¸éè¿ï¼ä¸æ£é¤åºå (æ£é¤åºåç§»è³åè´§å°è´¦è¡¥å ä¿¡æ¯é¶æ®µ) updateSalesLedgerDeliveryStatus(salesLedger.getId(), 4); updateShippingInfoStatusByOrder(salesLedger.getId(), "å®¡æ ¸éè¿"); } else if(status.equals(3)){ updateSalesLedgerDeliveryStatus(salesLedger.getId(), 3); // æ´æ°å ³èçåè´§è®°å½ä¸ºå®¡æ ¸æç» @@ -271,6 +268,7 @@ } } } // ç»å®éä»¶ if(!CollectionUtils.isEmpty(approveNode.getTempFileIds()) && approveNode.getApproveNodeStatus() == 1){ tempFileService.migrateTempFilesToFormal(approveNode.getId(), approveNode.getTempFileIds(), FileNameType.ApproveNode.getValue()); src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java
@@ -10,7 +10,9 @@ import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; @@ -75,29 +77,41 @@ * @return 仿¥èªå¢åç计æ°å¼ */ public long incrementAndGetByDb() { String approveId = redisTemplate.opsForValue().get(approvalNumberPrefix + ":approveNum"); if(approveId == null){ String today = LocalDate.now().format(DATE_FORMAT); String key = approvalNumberPrefix + ":approveNum:" + today; String lockKey = "lock:" + key; if (Boolean.FALSE.equals(redisTemplate.hasKey(key))) { Boolean acquired = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS); if (Boolean.TRUE.equals(acquired)) { try { if (Boolean.FALSE.equals(redisTemplate.hasKey(key))) { StartAndEndDateDto dateTime = getDateTime(); LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>(); approveProcessLambdaQueryWrapper .eq(ApproveProcess::getApproveDelete,0) .gt(ApproveProcess::getCreateTime,dateTime.getStartDate()) .lt(ApproveProcess::getCreateTime,dateTime.getEndDate()); Long aLong = approveProcessMapper.selectCount(approveProcessLambdaQueryWrapper); if(aLong == null){ redisTemplate.opsForValue().set(approvalNumberPrefix + ":approveNum","1",1L, TimeUnit.HOURS); return 1; }else{ aLong += 1; redisTemplate.opsForValue().set(approvalNumberPrefix + ":approveNum",aLong.toString(),1L, TimeUnit.HOURS); return aLong; Long count = approveProcessMapper.selectCount(approveProcessLambdaQueryWrapper); long initialCount = (count == null) ? 0 : count; redisTemplate.opsForValue().set(key, String.valueOf(initialCount), 24, TimeUnit.HOURS); } } finally { // éæ¾é redisTemplate.delete(lockKey); } }else{ Long num = Long.parseLong(approveId) + 1; redisTemplate.opsForValue().set(approvalNumberPrefix + ":approveNum",num.toString(),1L, TimeUnit.HOURS); return Long.parseLong(approveId); try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } return incrementAndGetByDb(); // éå½éè¯ } } return redisTemplate.opsForValue().increment(key); } /** @@ -115,12 +129,9 @@ * 计ç®è·ç¦»æ¬¡æ¥åæ¨çç§æ° */ private long calculateSecondsUntilMidnight() { LocalDate tomorrow = LocalDate.now().plusDays(1); LocalDate midnight = tomorrow.atStartOfDay().toLocalDate(); return java.time.Duration.between( LocalDate.now().atTime(23, 59, 59), midnight.atTime(0, 0, 0) ).getSeconds() + 1; LocalDateTime now = LocalDateTime.now(); LocalDateTime midnight = now.toLocalDate().plusDays(1).atStartOfDay(); return Duration.between(now, midnight).getSeconds(); } /** src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -143,9 +143,9 @@ private LocalDate deliveryDate; /** * åè´§ç¶æï¼1-æªåè´§ï¼2-审æ¹ä¸ï¼3-审æ¹ä¸éè¿ï¼4-å·²åè´§ * åè´§ç¶æï¼1-æªåè´§ï¼2-审æ¹ä¸ï¼3-审æ¹ä¸éè¿ï¼4-审æ¹éè¿ï¼5-å·²åè´§ */ @ApiModelProperty("åè´§ç¶æï¼1-æªåè´§ï¼2-审æ¹ä¸ï¼3-审æ¹ä¸éè¿ï¼4-å·²åè´§") @ApiModelProperty("åè´§ç¶æï¼1-æªåè´§ï¼2-审æ¹ä¸ï¼3-审æ¹ä¸éè¿ï¼4-审æ¹éè¿ï¼5-å·²åè´§") private Integer deliveryStatus; @TableField(exist = false) src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
@@ -21,7 +21,6 @@ boolean deductStock(ShippingInfoDto req) throws IOException; boolean deductStockByOrder(Long salesLedgerId, ShippingInfoDto req) throws IOException; boolean delete(List<Long> ids); src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -461,7 +461,7 @@ .map(SalesLedgerProductImportDto::getTaxInclusiveTotalPrice) .reduce(BigDecimal.ZERO, BigDecimal::add)); // åè´§ç¶æ salesLedger.setDeliveryStatus(4); salesLedger.setDeliveryStatus(1); salesLedgerMapper.insert(salesLedger); for (SalesLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) { @@ -734,7 +734,7 @@ salesLedger.setDeliveryStatus(1); salesLedgerMapper.insert(salesLedger); } else { if (salesLedger.getDeliveryStatus() == 4) { if (salesLedger.getDeliveryStatus() == 5) { throw new ServiceException("订åå·²åè´§,ç¦æ¢ç¼è¾"); } salesLedgerMapper.updateById(salesLedger); src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -81,97 +81,40 @@ if (byId == null) { throw new RuntimeException("åè´§ä¿¡æ¯ä¸åå¨"); } return deductStockByOrder(byId.getSalesLedgerId(), req); //æ£ååºå if(!"å·²åè´§".equals(byId.getStatus())){ SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId()); if (salesLedgerProduct != null) { stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId()); } @Override @Transactional(rollbackFor = Exception.class) public boolean deductStockByOrder(Long salesLedgerId, ShippingInfoDto req) throws IOException { if (salesLedgerId == null) { throw new RuntimeException("å ³è订åä¸å¯ä¸ºç©º"); } byId.setExpressNumber(req.getExpressNumber()); byId.setExpressCompany(req.getExpressCompany()); byId.setStatus("å·²åè´§"); byId.setShippingCarNumber(req.getShippingCarNumber()); byId.setShippingDate(req.getShippingDate()); boolean update = this.updateById(byId); SalesLedger salesLedger = salesLedgerMapper.selectById(salesLedgerId); if (salesLedger == null) { throw new RuntimeException("å ³è订åä¸åå¨"); } // æ£æ¥è¯¥è®¢å䏿¯å¦è¿ææªåè´§çè®°å½ List<ShippingInfo> unsentShippings = this.list(new LambdaQueryWrapper<ShippingInfo>() .eq(ShippingInfo::getSalesLedgerId, salesLedgerId) // æ´æ°è®¢åç¶æä¸º 5-å·²åè´§ (妿ææåè´§è®°å½é½å·²åè´§) SalesLedger salesLedger = salesLedgerMapper.selectById(byId.getSalesLedgerId()); if (salesLedger != null && !Integer.valueOf(5).equals(salesLedger.getDeliveryStatus())) { List<ShippingInfo> unsent = this.list(new LambdaQueryWrapper<ShippingInfo>() .eq(ShippingInfo::getSalesLedgerId, byId.getSalesLedgerId()) .ne(ShippingInfo::getStatus, "å·²åè´§")); // ä» å¨å卿ªåè´§è®°å½æ¶æ§è¡åºåæ£å if (CollectionUtils.isNotEmpty(unsentShippings)) { // è·å该订å䏿æç产åä¿¡æ¯è¿è¡æ±æ»æ£å List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>() .eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId)); if (CollectionUtils.isEmpty(products)) { throw new RuntimeException("该订å䏿 产åä¿¡æ¯ï¼æ æ³æ£ååºå"); } // æ±æ»éæ±å¹¶æ ¡éªåºå Map<Long, BigDecimal> modelQtyMap = new HashMap<>(); for (SalesLedgerProduct p : products) { if (p.getProductModelId() == null) continue; modelQtyMap.put(p.getProductModelId(), modelQtyMap.getOrDefault(p.getProductModelId(), BigDecimal.ZERO).add(p.getQuantity())); } for (Map.Entry<Long, BigDecimal> entry : modelQtyMap.entrySet()) { Long modelId = entry.getKey(); BigDecimal totalNeeded = entry.getValue(); StockInventory stock = stockInventoryMapper.selectOne(new LambdaQueryWrapper<StockInventory>() .eq(StockInventory::getProductModelId, modelId)); if (stock == null) { throw new RuntimeException("产åè§æ ¼ID:" + modelId + " åºåè®°å½ä¸åå¨"); } BigDecimal locked = stock.getLockedQuantity() == null ? BigDecimal.ZERO : stock.getLockedQuantity(); BigDecimal available = stock.getQualitity().subtract(locked); if (totalNeeded.compareTo(available) > 0) { throw new RuntimeException("产åè§æ ¼ID:" + modelId + " æ»è®¡éæ± " + totalNeeded + "ï¼å¯ç¨åºå " + available + "ï¼åºåå è¶³æ ¡éªæªéè¿"); } } // æ§è¡è®¢å䏿æäº§åçåºåæ£å for (SalesLedgerProduct p : products) { if (p.getProductModelId() == null) continue; // ä½¿ç¨ businessId = salesLedgerId æå½å req.getId() stockUtils.substractStock(p.getProductModelId(), p.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), salesLedgerId); } } // æ´æ°è¯¥è®¢å䏿æçåè´§è®°å½ç¶æä¸ºå·²åè´§ LambdaUpdateWrapper<ShippingInfo> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.set(ShippingInfo::getStatus, "å·²åè´§") .eq(ShippingInfo::getSalesLedgerId, salesLedgerId); if (req != null) { if (req.getExpressNumber() != null) updateWrapper.set(ShippingInfo::getExpressNumber, req.getExpressNumber()); if (req.getExpressCompany() != null) updateWrapper.set(ShippingInfo::getExpressCompany, req.getExpressCompany()); if (req.getShippingCarNumber() != null) updateWrapper.set(ShippingInfo::getShippingCarNumber, req.getShippingCarNumber()); if (req.getShippingDate() != null) updateWrapper.set(ShippingInfo::getShippingDate, req.getShippingDate()); } this.update(updateWrapper); // æ´æ°è®¢åç¶æä¸º 4-å·²åè´§ if (!Integer.valueOf(4).equals(salesLedger.getDeliveryStatus())) { salesLedger.setDeliveryStatus(4); if (CollectionUtils.isEmpty(unsent)) { salesLedger.setDeliveryStatus(5); salesLedgerMapper.updateById(salesLedger); } } // è¿ç§»å½åè®°å½æ¶åçæä»¶ if (req != null && req.getId() != null && CollectionUtils.isNotEmpty(req.getTempFileIds())) { // è¿ç§»æä»¶ if(CollectionUtils.isNotEmpty(req.getTempFileIds())){ tempFileService.migrateTempFilesToFormal(req.getId(), req.getTempFileIds(), FileNameType.SHIP.getValue()); } return true; return update ; } @Override public boolean delete(List<Long> ids) { List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()