From fa2734ca894a6fec9dc2e973519f41f9f1f74634 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Mon, 25 Aug 2025 17:17:55 +0800 Subject: [PATCH] =?UTF-8?q?pd=E5=AF=BC=E5=85=A5,excel=E6=A8=A1=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SmErpSpuController.java | 55 ++++++ .../service/impl/SmErpSpuImportPDNewDto.java | 1 + .../service/impl/SmErpSpuServiceImpl.java | 162 ++++++++++++------ .../resources/file/supermarketImport.xlsx | Bin 0 -> 10314 bytes .../resources/file/supermarketPDImport.xlsx | Bin 0 -> 10381 bytes 5 files changed, 161 insertions(+), 57 deletions(-) create mode 100644 pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/supermarketImport.xlsx create mode 100644 pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/supermarketPDImport.xlsx diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java index 0cef2c881..37937a2ba 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java @@ -44,6 +44,8 @@ import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @@ -73,6 +75,8 @@ public class SmErpSpuController { private final SmErpInventoryRecordsService smErpInventoryRecordsService; + private final SmErpTasteStockService smErpTasteStockService; + /** * 分页查询 @@ -419,4 +423,55 @@ public class SmErpSpuController { return R.ok(); } + /** + * 更新迁移脚本 + * @return + */ + @GetMapping("/123456789") + @Transactional + public R qy() { + + List list = smErpUnitService.list(); + List erpUnitEntities = list.stream().filter(supermarketUnitEntity -> supermarketUnitEntity.getTasteId() == null).collect(Collectors.toList()); + + for (SmErpUnitEntity item:erpUnitEntities + ) { + String tasteName = item.getTasteName(); + if (StringUtils.isNotBlank(tasteName)){ + //需要查询当前item下面有多少口味商品,然后在查询商品的当前库存/口味数量,平均赋予口味库存数量 + LambdaQueryWrapper smErpUnitEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + smErpUnitEntityLambdaQueryWrapper.eq(SmErpUnitEntity::getSpuId,item.getSpuId()); + List list1 = smErpUnitService.list(smErpUnitEntityLambdaQueryWrapper); + int tasteCount = list1.size(); + LambdaQueryWrapper smErpStockEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + smErpStockEntityLambdaQueryWrapper.eq(SmErpStockEntity::getErpSpuId,item.getSpuId()); + SmErpStockEntity one = smErpStockService.getOne(smErpStockEntityLambdaQueryWrapper); + double tasteStock = one.getCurrentStock()/tasteCount; + tasteStock = BigDecimal.valueOf(tasteStock).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); + + SmErpTasteStockEntity smErpTasteEntity = new SmErpTasteStockEntity(); + smErpTasteEntity.setStock(tasteStock); + smErpTasteEntity.setTasteName(tasteName); + //查询口味是否存在,存在就用存在的id,不存在就创建 + LambdaQueryWrapper smErpTasteEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + smErpTasteEntityLambdaQueryWrapper.eq(SmErpTasteStockEntity::getTasteName, tasteName); + smErpTasteEntityLambdaQueryWrapper.eq(SmErpTasteStockEntity::getSpuId, item.getSpuId()); + SmErpTasteStockEntity smErpTasteStockEntity = smErpTasteStockService.getOne(smErpTasteEntityLambdaQueryWrapper); + if (smErpTasteStockEntity == null) { + smErpTasteEntity.setSpuId(item.getSpuId()); + smErpTasteStockService.save(smErpTasteEntity); + //不存在使用创建的id + item.setTasteId(smErpTasteEntity.getId()); + smErpUnitService.updateById(item); + } else { + //存在,就更新item的tasteId + item.setTasteId(smErpTasteStockEntity.getId()); + smErpUnitService.updateById(item); + } + } + + } + return R.ok(); + } + } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuImportPDNewDto.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuImportPDNewDto.java index 76876a926..aa011b4dd 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuImportPDNewDto.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuImportPDNewDto.java @@ -92,3 +92,4 @@ public class SmErpSpuImportPDNewDto { // @ExcelProperty("品牌") // private String brand; // 品牌 } + diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java index d6f79a808..023ec5c64 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java @@ -119,6 +119,32 @@ public class SmErpSpuServiceImpl extends ServiceImpl> spuGroupMap = smErpSpuImportPDNewDtos.stream() .collect(Collectors.groupingBy(SmErpSpuImportPDNewDto::getProductCode)); - // 计算从盘点日期到当前的零售销量,用于计算实际剩余库存 - Map spuSalesMap = new HashMap<>(); + // 计算从最早盘点日期到当前的所有零售出库记录,供逐条过滤(包含今天) LocalDate currentDate = LocalDate.now(); - - // 收集所有盘点日期,用于计算销量 - Set allPdDates = smErpSpuImportPDNewDtos.stream() + LocalDate minPdDate = smErpSpuImportPDNewDtos.stream() .map(SmErpSpuImportPDNewDto::getPdDate) .filter(StringUtils::isNotBlank) - .collect(Collectors.toSet()); - - for (String pdDateStr : allPdDates) { - try { - LocalDate pdDate = LocalDate.parse(pdDateStr); - - // 查询从盘点日期到当前日期的零售出库记录 - LambdaQueryWrapper retailWrapper = new LambdaQueryWrapper<>(); - retailWrapper.eq(SmErpInventoryRecordsEntity::getInventoryType, "5"); // LSCK 零售出库 - retailWrapper.ge(SmErpInventoryRecordsEntity::getInventoryDate, pdDate); - retailWrapper.le(SmErpInventoryRecordsEntity::getInventoryDate, currentDate); - - List retailRecords = smErpInventoryRecordsService.list(retailWrapper); - - // 收集所有零售记录的ID - List retailRecordIds = retailRecords.stream() - .map(SmErpInventoryRecordsEntity::getId) - .collect(Collectors.toList()); - - // 查询零售出库明细 - if (!retailRecordIds.isEmpty()) { - LambdaQueryWrapper itemWrapper = new LambdaQueryWrapper<>(); - itemWrapper.in(SmErpInventoryRecordsItemEntity::getInventoryId, retailRecordIds); - List retailItems = smErpInventoryRecordsItemService.list(itemWrapper); - - // 按商品ID汇总销量 - for (SmErpInventoryRecordsItemEntity item : retailItems) { - Long spuId = item.getErpSpuId(); - Double quantity = item.getQuantity(); - spuSalesMap.merge(spuId, quantity, Double::sum); - } - } - } catch (Exception e) { - // 日期解析失败,跳过该条记录 - continue; - } + .map(SmErpSpuServiceImpl::parseFlexibleLocalDate) + .filter(Objects::nonNull) + .min(LocalDate::compareTo) + .orElse(currentDate); + + LambdaQueryWrapper retailWrapperAll = new LambdaQueryWrapper<>(); + retailWrapperAll.eq(SmErpInventoryRecordsEntity::getInventoryType, "5"); + retailWrapperAll.ge(SmErpInventoryRecordsEntity::getInventoryDate, minPdDate); + retailWrapperAll.le(SmErpInventoryRecordsEntity::getInventoryDate, currentDate); + List allRetailRecords = smErpInventoryRecordsService.list(retailWrapperAll); + + Map recordIdToDate = allRetailRecords.stream() + .collect(Collectors.toMap(SmErpInventoryRecordsEntity::getId, SmErpInventoryRecordsEntity::getInventoryDate)); + + Map> spuToItemsMap = new HashMap<>(); + if (!allRetailRecords.isEmpty()) { + List allRetailRecordIds = allRetailRecords.stream().map(SmErpInventoryRecordsEntity::getId).collect(Collectors.toList()); + LambdaQueryWrapper allItemsWrapper = new LambdaQueryWrapper<>(); + allItemsWrapper.in(SmErpInventoryRecordsItemEntity::getInventoryId, allRetailRecordIds); + List allRetailItems = smErpInventoryRecordsItemService.list(allItemsWrapper); + spuToItemsMap = allRetailItems.stream().collect(Collectors.groupingBy(SmErpInventoryRecordsItemEntity::getErpSpuId)); } // 按商品分组处理 @@ -2217,7 +2225,8 @@ public class SmErpSpuServiceImpl extends ServiceImpl units = new ArrayList<>(); Map tasteStockMap = new HashMap<>(); // 口味库存映射 - Double totalSpuStock = 0.0; // 商品总库存 + Double totalSpuAccount = 0.0; // 账面合计 + Double totalSpuReal = 0.0; // 真实合计(扣销量) // 第一轮:处理商品主数据和包装单位 for (SmErpSpuImportPDNewDto dto : spuDtos) { @@ -2428,17 +2437,56 @@ public class SmErpSpuServiceImpl extends ServiceImpl spuItems = spuToItemsMap.getOrDefault(spu.getId(), Collections.emptyList()); + for (SmErpInventoryRecordsItemEntity it : spuItems) { + LocalDate d = recordIdToDate.get(it.getInventoryId()); + if (d != null && (d.isEqual(pdDate) || d.isAfter(pdDate))) { + salesQuantity += (it.getQuantity() == null ? 0.0 : it.getQuantity()); + } + } + } catch (Exception ignore) {} } - - // 8. 累加到商品总库存 - totalSpuStock += unitActualStock; + + // 8. 真实库存 = 账面 - 销量 + Double realRemainingStock = accountNumber - salesQuantity; + + // 9. 累计 + if (tasteId != null) { + tasteStockMap.merge(dto.getTaste(), realRemainingStock, Double::sum); + } + totalSpuAccount += accountNumber; + totalSpuReal += realRemainingStock; + + // 10. 盘点明细 + PDItemSaveDTO item = new PDItemSaveDTO(); + item.setErpSpuId(spu.getId()); + item.setUnitId(unit.getId()); + item.setAccountNumber(accountNumber); + item.setRealNumber(realRemainingStock); + Double purchasePrice = dto.getPurchasePrice() != null ? dto.getPurchasePrice() : 0.0; + Double retailPrice = dto.getRetailPrice() != null ? dto.getRetailPrice() : purchasePrice; + item.setUnitPrice((int) Math.round(purchasePrice * 100)); + item.setRealPrice((int) Math.round(retailPrice * 100)); + Double diff = realRemainingStock - accountNumber; + if (diff > 0) { item.setProfit(diff); item.setLoss(0.0); item.setOrderType(OrderTypeEnum.RK.getType()); } + else if (diff < 0) { item.setProfit(0.0); item.setLoss(Math.abs(diff)); item.setOrderType(OrderTypeEnum.CK.getType()); } + else { item.setProfit(0.0); item.setLoss(0.0); item.setOrderType(OrderTypeEnum.No.getType()); } + item.setQuantity(Math.abs(diff)); + // 备注:盘点日期与销量扣减说明 + String remark = "盘点日期:" + (dto.getPdDate() == null ? "" : dto.getPdDate()) + + ", 销量合计:" + BigDecimal.valueOf(salesQuantity).setScale(2, RoundingMode.HALF_UP); + item.setRemark(remark); + pdItemList.add(item); } catch (Exception e) { errorList.add(createErrorInfo(spuDtos.indexOf(dto) + 1, dto.getProductCode(), @@ -2466,7 +2514,7 @@ public class SmErpSpuServiceImpl extends ServiceImpl existingStockWrapper = new LambdaQueryWrapper<>(); existingStockWrapper.eq(SmErpStockEntity::getErpSpuId, spu.getId()); SmErpStockEntity existingStock = smErpStockService.getOne(existingStockWrapper); @@ -2474,16 +2522,16 @@ public class SmErpSpuServiceImpl extends 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 U%#&vUZcjspfCJ+(Qa=6qf7TEMvj6}9 literal 0 HcmV?d00001 diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/supermarketPDImport.xlsx b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/supermarketPDImport.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2786df93f85fbb740be1b7644a2d178092eb4b60 GIT binary patch literal 10381 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