| sql/20261021_longyi_drawing_no_product_code.sql | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/basic/dto/ProductImportRowDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/basic/pojo/ProductModel.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/basic/ProductModelMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/static/产品导入模板.xlsx | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/static/销售台账导入模板.xlsx | 补丁 | 查看 | 原始文档 | blame | 历史 |
sql/20261021_longyi_drawing_no_product_code.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ -- ============================================================ -- æ±èéä¹ï¼profile: jsnygcjxï¼æ¬æ¬¡éæ± DDL -- æ§è¡åºï¼product-inventory-management-jsnygcjxkj -- éæ±1ï¼äº§åç»´æ¤-è§æ ¼åå·æ°å¢âå¾å·âï¼å¿ å¡«ãå¯ä¸ï¼ -- éæ±3ï¼éå®å°è´¦äº§åæç»æ°å¢â产åç¼ç âï¼å¯¼å ¥ååï¼ç©æç¼ç ï¼ -- ============================================================ -- 1. 产ååå·è¡¨ï¼å¾å· ALTER TABLE `product_model` ADD COLUMN `drawing_no` varchar(255) NULL COMMENT 'å¾å·' AFTER `product_code`; -- å¯éï¼ç¡®è®¤å岿°æ®æ éå¤å¾å·ï¼å½åå为 NULLï¼åï¼å建å¯ä¸ç´¢å¼ -- ALTER TABLE `product_model` ADD UNIQUE KEY `uk_product_model_drawing_no` (`drawing_no`); -- 2. éå®å°è´¦äº§åæç»ï¼äº§åç¼ç ï¼= 产åç»´æ¤ä¸ç产åç¼å· product_codeï¼ ALTER TABLE `sales_ledger_product` ADD COLUMN `product_code` varchar(255) NULL COMMENT '产åç¼ç ' AFTER `specification_model`; -- 3. åéæ°æ®åå¡«ï¼æäº§ååå·å ³èå填产åç¼ç UPDATE `sales_ledger_product` slp JOIN `product_model` pm ON pm.id = slp.product_model_id SET slp.product_code = pm.product_code WHERE slp.product_model_id IS NOT NULL AND (slp.product_code IS NULL OR slp.product_code = ''); -- 4. å¯éï¼éå®ååå·å¯ä¸ï¼ç¡®è®¤æ éå¤åå¯å¼å¯ï¼ -- ALTER TABLE `sales_ledger` ADD UNIQUE KEY `uk_sales_ledger_contract_no` (`sales_contract_no`); src/main/java/com/ruoyi/basic/dto/ProductImportRowDto.java
@@ -25,6 +25,9 @@ @Excel(name = "è§æ ¼åå·") private String model; @Excel(name = "å¾å·") private String drawingNo; @Excel(name = "åä½") private String unit; src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -41,6 +41,12 @@ private String productCode; /** * å¾å·ï¼å¿ å¡«ãå¯ä¸ï¼ */ @Excel(name = "å¾å·") private String drawingNo; /** * åä½ */ @Excel(name = "åä½") src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -58,9 +58,16 @@ public int addOrEditProductModel(ProductModelDto productModelDto) { String model = StringUtils.trim(productModelDto.getModel()); String productCode = StringUtils.trim(productModelDto.getProductCode()); String drawingNo = StringUtils.trim(productModelDto.getDrawingNo()); productModelDto.setModel(model); productModelDto.setProductCode(productCode); productModelDto.setDrawingNo(drawingNo); // å¾å·å¿ å¡« if (StringUtils.isEmpty(drawingNo)) { throw new ServiceException("å¾å·ä¸è½ä¸ºç©º"); } checkModelAndProductCodeUnique(model, productCode, productModelDto.getId()); checkDrawingNoUnique(drawingNo, productModelDto.getId()); if (productModelDto.getId() == null) { ProductModel productModel = new ProductModel(); @@ -68,6 +75,23 @@ return productModelMapper.insert(productModel); } else { return productModelMapper.updateById(productModelDto); } } /** * å¾å·å¯ä¸æ ¡éªï¼å ¨å±ï¼ç¼è¾æ¶æé¤èªèº«ï¼ */ private void checkDrawingNoUnique(String drawingNo, Long currentId) { if (StringUtils.isEmpty(drawingNo)) { return; } LambdaQueryWrapper<ProductModel> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ProductModel::getDrawingNo, drawingNo) .ne(currentId != null, ProductModel::getId, currentId) .last("limit 1"); ProductModel duplicateProductModel = productModelMapper.selectOne(queryWrapper); if (duplicateProductModel != null) { throw new ServiceException("å¾å·" + drawingNo + "å·²ç»åå¨"); } } @@ -200,10 +224,17 @@ code = generateUniqueCode(generatedCodes); } // å¾å·ï¼å¯¼å ¥æ¶å¯éï¼å¡«ååæ ¡éªå¯ä¸ String drawingNo = trimToNull(row.getDrawingNo()); if (drawingNo != null) { checkDrawingNoUnique(drawingNo, null); } ProductModel productModel = new ProductModel(); productModel.setProductId(leafId); productModel.setProductCode(code); productModel.setModel(model); productModel.setDrawingNo(drawingNo); productModel.setUnit(trimToNull(row.getUnit())); productModelMapper.insert(productModel); successCount++; src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -257,9 +257,8 @@ boolean planIssued = isFlagTrue(editFlag == null ? null : editFlag.getPlanIssued()); boolean shipped = isFlagTrue(editFlag == null ? null : editFlag.getShipped()); // éè¦ç产ç订åï¼ç产计åå·²ä¸åï¼å«é¨åä¸åï¼åä¸å 许ç¼è¾ // èµ°åºåç订åï¼å·²åè´§åä¸å 许ç¼è¾ï¼å¦åå¯ä»¥ç¼è¾ salesLedgerVo.setIsEdit(needsProduction ? !planIssued : !shipped); // å·²åè´§ç订åä¸å 许ç¼è¾ï¼éè¦ç产ä¸ç产计åå·²ä¸åï¼å«é¨åä¸åï¼ç订åå 许ç¼è¾ï¼åç«¯åªæ¾å¼æ¶é´ç±»å段 salesLedgerVo.setIsEdit(!shipped); salesLedgerVo.setHasProductionRecord(planIssued); salesLedgerVo.setStorageBlobVOs(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.FILE, RecordTypeEnum.SALES_LEDGER, ledgerId)); src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java
@@ -32,6 +32,12 @@ private String specificationModel; /** * ç©æç¼ç ï¼å¯¹åºäº§åç¼ç product_model.product_codeï¼ */ @Excel(name = "ç©æç¼ç ") private String materialCode; /** * åä½ */ @Excel(name = "åä½") @@ -74,8 +80,8 @@ private Boolean isChecked; /** * æ¯å¦ç产 * æ¯å¦ç产ï¼å¡« 1/æ¯ è¡¨ç¤ºç产ï¼0/å¦ è¡¨ç¤ºä¸çäº§ï¼ */ @Excel(name = "æ¯å¦ç产", readConverterExp = "0=å¦,1=æ¯") private Integer isProduction; @Excel(name = "æ¯å¦ç产") private String isProduction; } src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -56,6 +56,12 @@ private String specificationModel; /** * 产åç¼ç ï¼å³äº§åç»´æ¤ä¸ç产åç¼å· product_model.product_codeï¼ */ @Excel(name = "ç©æç¼ç ") private String productCode; /** * åä½ */ @Excel(name = "åä½") src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -19,6 +19,7 @@ import com.ruoyi.basic.mapper.ProductMapper; import com.ruoyi.basic.mapper.ProductModelMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.SaleEnum; @@ -361,13 +362,34 @@ // å½å ¥äººæ°æ® List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>().in(SysUser::getNickName, salesLedgerImportDtoList.stream().map(SalesLedgerImportDto::getEntryPerson).collect(Collectors.toList()))); for (SalesLedgerImportDto salesLedgerImportDto : salesLedgerImportDtoList) { SalesLedger salesLedger1 = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>() .eq(SalesLedger::getSalesContractNo, salesLedgerImportDto.getSalesContractNo()) .last("LIMIT 1")); if (salesLedger1 != null) { // éå®åå·é夿 ¡éªï¼æä»¶å é夿åºå å·²åå¨çï¼ç´æ¥å¤±è´¥å¹¶åæ¾åæéå®åå· List<String> duplicateContractNos = new ArrayList<>(); Set<String> importContractNos = new HashSet<>(); for (SalesLedgerImportDto item : salesLedgerImportDtoList) { String contractNo = StringUtils.trim(item.getSalesContractNo()); if (StringUtils.isEmpty(contractNo)) { continue; } if (!importContractNos.add(contractNo)) { duplicateContractNos.add(contractNo); } } if (CollectionUtils.isNotEmpty(duplicateContractNos)) { return AjaxResult.error("å¯¼å ¥æä»¶ä¸åå¨éå¤çéå®åå·ï¼" + String.join("ã", duplicateContractNos)); } if (CollectionUtils.isNotEmpty(importContractNos)) { List<SalesLedger> existLedgers = salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>() .in(SalesLedger::getSalesContractNo, importContractNos) .select(SalesLedger::getId, SalesLedger::getSalesContractNo)); if (CollectionUtils.isNotEmpty(existLedgers)) { String existNos = existLedgers.stream() .map(SalesLedger::getSalesContractNo) .distinct() .collect(Collectors.joining("ã")); return AjaxResult.error("以ä¸éå®åå·å·²åå¨ï¼ä¸è½é夿°å¢ï¼" + existNos); } } for (SalesLedgerImportDto salesLedgerImportDto : salesLedgerImportDtoList) { SalesLedger salesLedger = new SalesLedger(); BeanUtils.copyProperties(salesLedgerImportDto, salesLedger); salesLedger.setExecutionDate(DateUtils.toLocalDate(salesLedgerImportDto.getExecutionDate())); @@ -408,6 +430,11 @@ BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct); salesLedgerProduct.setSalesLedgerId(salesLedger.getId()); salesLedgerProduct.setType(1); // ç©æç¼ç -> 产åç¼ç String materialCode = StringUtils.trim(salesLedgerProductImportDto.getMaterialCode()); if (StringUtils.isNotEmpty(materialCode)) { salesLedgerProduct.setProductCode(materialCode); } AmountUtils.normalizeSalesLedgerProduct(salesLedgerProduct); // 计ç®ä¸å«ç¨æ»ä»· salesLedgerProduct.setTaxExclusiveTotalPrice( @@ -422,6 +449,10 @@ .ifPresent(map -> { salesLedgerProduct.setProductModelId(Long.parseLong(map.get("modelId").toString())); salesLedgerProduct.setProductId(Long.parseLong(map.get("id").toString())); // æªå¡«ç©æç¼ç æ¶ï¼æäº§ååå·å填产åç¼ç if (StringUtils.isEmpty(salesLedgerProduct.getProductCode()) && map.get("productCode") != null) { salesLedgerProduct.setProductCode(map.get("productCode").toString()); } }); // salesLedgerProduct.setProductId(productList.stream() // .filter(product -> product.getProductName().equals(salesLedgerProduct.getProductCategory())) @@ -436,7 +467,7 @@ salesLedgerProduct.setRegister(loginUser.getNickName()); salesLedgerProduct.setRegisterDate(LocalDateTime.now()); salesLedgerProduct.setApproveStatus(0); salesLedgerProduct.setIsProduction(salesLedgerProductImportDto.getIsProduction() == 1); salesLedgerProduct.setIsProduction(parseProductionFlag(salesLedgerProductImportDto.getIsProduction())); salesLedgerProductMapper.insert(salesLedgerProduct); // æ·»å çäº§æ°æ® salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct); @@ -582,9 +613,14 @@ AmountUtils.normalizeContractAmount(salesLedger); salesLedger.setCustomerName(customer.getCustomerName()); salesLedger.setTenantId(customer.getTenantId()); // 3. æ°å¢ææ´æ°ä¸»è¡¨ // 3. éå®ååå·å¯ä¸æ ¡éªï¼æ¯æåæ¯ãæ°ååç¹æ®å符ï¼ä¸åå符ééå¶ï¼ String contractNo = StringUtils.trim(salesLedger.getSalesContractNo()); if (StringUtils.isNotEmpty(contractNo)) { checkSalesContractNoUnique(contractNo, salesLedger.getId()); salesLedger.setSalesContractNo(contractNo); } // 4. æ°å¢ææ´æ°ä¸»è¡¨ if (salesLedger.getId() == null) { String contractNo = salesLedger.getSalesContractNo(); if (StringUtils.isEmpty(contractNo)) { contractNo = generateSalesContractNo(); } @@ -595,7 +631,7 @@ } // 4. å¤çåè¡¨æ°æ® // 5. å¤çåè¡¨æ°æ® List<SalesLedgerProduct> productList = salesLedgerDto.getProductData(); if (productList != null && !productList.isEmpty()) { AmountUtils.normalizeSalesLedgerProducts(productList); @@ -615,8 +651,31 @@ return 1; } /** * éå®ååå·å¯ä¸æ ¡éªï¼ç¼è¾æ¶æé¤èªèº«ï¼ */ private void checkSalesContractNoUnique(String salesContractNo, Long currentId) { LambdaQueryWrapper<SalesLedger> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SalesLedger::getSalesContractNo, salesContractNo) .ne(currentId != null, SalesLedger::getId, currentId) .last("limit 1"); SalesLedger duplicate = salesLedgerMapper.selectOne(queryWrapper); if (duplicate != null) { throw new BaseException("éå®ååå·" + salesContractNo + "å·²åå¨ï¼éå®åå·ï¼" + duplicate.getSalesContractNo() + "ï¼ï¼è¯·éæ°å¡«å"); } } @Override public void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type) { // 产åç¼ç å åºï¼å端æªä¼ æ¶æäº§ååå·åå¡« products.forEach(p -> { if (StringUtils.isEmpty(p.getProductCode()) && p.getProductModelId() != null) { ProductModel productModel = productModelMapper.selectById(p.getProductModelId()); if (productModel != null) { p.setProductCode(productModel.getProductCode()); } } }); // æIDåç»ï¼åºåæ°å¢åæ´æ°çè®°å½ Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream() .peek(p -> p.setSalesLedgerId(salesLedgerId)) @@ -645,6 +704,17 @@ } } /** * è§£æå¯¼å ¥çâæ¯å¦ç产âåï¼æ¯æ 1/0ãæ¯/å¦ */ private static boolean parseProductionFlag(String value) { if (StringUtils.isEmpty(value)) { return false; } String v = value.trim(); return "1".equals(v) || "æ¯".equals(v) || "true".equalsIgnoreCase(v) || "yes".equalsIgnoreCase(v); } private SalesLedger convertToEntity(SalesLedgerDto dto) { SalesLedger entity = new SalesLedger(); BeanUtils.copyProperties(dto, entity); src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -146,7 +146,9 @@ select p.id as id, pm.id as modelId, p.product_name as productName , pm.model as model pm.model as model, pm.product_code as productCode, pm.drawing_no as drawingNo from product_model pm left join product p on p.id = pm.product_id order by p.id,pm.id desc src/main/resources/static/²úÆ·µ¼ÈëÄ£°å.xlsxBinary files differ
src/main/resources/static/ÏúÊŲ̂Õ˵¼ÈëÄ£°å.xlsxBinary files differ