.claude/rules/error-message-precision.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,46 @@ # é误æç¤ºææ¡ç²¾ç¡®æ§è§å ## è§å - é¢åç¨æ·çæ ¡éª/å¼å¸¸æç¤ºï¼å端å¼å¸¸ messageãExcel å¯¼å ¥æ ¡éªæç¤ºãå端 toastãæ¥å£æ¥éææ¡ï¼ï¼**ç¦æ¢åææå¤ä¸ªæ¡ä»¶å å¨ä¸ä¸ªç¬¼ç»å¥é**ï¼ä¾å¦ï¼`åºåè®°å½ä¸æäº¤çç©æãæ¹æ¬¡æåºä½ä¿¡æ¯ä¸ä¸è´`ã`æ°æ®ä¸åæ³`ã`åæ°é误`ã`è®°å½ä¸ä¸è´`ã - ç¨æ·çå°æç¤ºååºè½**ä¸ç¼ç¥éæ¯åªä¸ªæ¡ä»¶ä¸æ»¡è¶³ãå·®å¨åªãæä¹æ¹**ï¼è䏿¯åªç¥é"åºéäº"ã ## 夿¡ä»¶æ ¡éªæç¤ºè¦æ± æç¤ºå¿ 须忶å å«ä¸è¦ç´ ï¼ 1. **å ·ä½ç»´åº¦**ï¼æåºæ¯åªä¸ä¸ªå段/è§å䏿»¡è¶³ï¼å¦ï¼ç©æãæ¹æ¬¡ãæ¹æ¬¡å·ãä»åºãåºåºãåºä½ãæ°éï¼ã 2. **åæ¹å®é å¼**ï¼ç»åº"åºå/忮侧"ä¸"æäº¤å¼"两侧çå¯è¯»å¼å¯¹æ¯ï¼å¹¶å°½éè§£ææä¸å¡åç§°ï¼å¦ `æåä»/2åº/A-01`ï¼ï¼**ä¸è¦ç´æ¥æ´é²çº¯æ°å ID**ï¼åç§°è§£æå¤±è´¥æ¶æåé `ID=xxx` å¹¶æç¡®æ 注ã 3. **坿§è¡å¨ä½**ï¼åè¯ç¨æ·æ¥ä¸æ¥æä¹åï¼éæ°éæ©åªä¸é¡¹ãå¦ä½å·æ°éè¯ãå é¤åéæ°æ·»å ãéååªä¸æ¥ãèç³»è°ï¼ã ### åæ³ç¤ºä¾ ```java // â 笼ç»ã夿¡ä»¶å å ãæ æ³å®ä½ throw exception(WM_MATERIAL_STOCK_SELECTION_MISMATCH); // â åªç»æ¡ä»¶ä¸ç»å¼ãä¸ç»å¨ä½ãæ´é²ç硬 ID throw new ServiceException(WM_MATERIAL_STOCK_SELECTION_MISMATCH.getCode(), "ä¸ä¸è´ï¼åºä½(åºå 8 â æäº¤ null)"); // â 维度 + 两侧å¯è¯»å¼ + å¨ä½ throw new ServiceException(WM_MATERIAL_STOCK_SELECTION_MISMATCH.getCode(), "æéåºåè®°å½ä¸åæ®ä¸ä¸è´ï¼æéåºååºä½[A-01]ï¼åæ®åºä½ä¸º[æªéæ©]ã" + "è¯·éæ°éæ©è¯¥ç©ææ£ç¡®çåºåï¼è¥ä»åº/åºåº/åºä½/æ¹æ¬¡è¢«ç¦ç¨æ æ³ä¿®æ¹ï¼è¯·å 餿¬æ¡æç»åéæ°æ·»å ã"); ``` ## å®ç°è¦ç¹ - é维度ç¬ç«æ¯è¾ï¼`itemId â batchId â batchCode â warehouseId â locationId â areaId`ï¼ï¼**æä¸å¡ä¼å 级åªè¿å/æåºç¬¬ä¸å¤ä¸æ»¡è¶³**ï¼é¿å 䏿¬¡æå¤æ¡è®©ç¨æ·æä¸ä½éç¹ã - åä¸é误ç ä½ä¸å¡ä¸ä¸æä¸åï¼å¦"æ§è¡æ£åæ¶åºå已被移åº/åå¹¶/æå" vs "æ°å¢æç»æ¶å¸¦éåæ®µ" vs "éè´§æ¥æºåºåç©æä¸ç¬¦"ï¼ï¼**åèªç»åºè´´ååºæ¯çä¸å±ææ¡**ï¼ä¸è¦é½å¤ç¨åä¸å¥ç¬¼ç»è¯ã - åç§°è§£ææ¾å¨**å¼å¸¸åæ¯**åæ§è¡ï¼ç½è§è·¯å¾ï¼ï¼é¿å æ¯æ¬¡æ£å¸¸ä¿åé½å¤æ¥è¡¨ï¼è§£æå¤±è´¥å¿ é¡»åé为å¯è¯»ç `ID=xxx` èéæäºæ¬¡å¼å¸¸ã - 妿æä¸ªå段æ¬åºç±ç³»ç»èªå¨å¸¦åºï¼å¦éåºåååå¡«çä»åº/åºåº/åºä½/æ¹æ¬¡ï¼ï¼ä¸æ¦ä¸ä¸è´åºæ¬çäºå端åå¡«ç¼ºå¤±ææ°æ®è¢«æ¹ï¼æç¤ºéè¦åæ"è¯·éæ°éæ©ä»¥èªå¨å¸¦åº"ã ## èªæ¥æ¸ å æ°å¢æä¿®æ¹ä»»ä½å¯è½ç±å¤ä¸ªåå 触åçæç¤ºåï¼éé¡¹ç¡®è®¤ï¼ - [ ] æç¤ºæ¯å¦ææäº"å ·ä½æ¯åªä¸ªæ¡ä»¶"ï¼ - [ ] æ¯å¦åæ¶ç»åºäº"ææå¼ vs å®é å¼"ï¼å°½éç¨ä¸å¡åç§°èé IDï¼ï¼ - [ ] æ¯å¦ç»åºäº"ç¨æ·ä¸ä¸æ¥è½åçå¨ä½"ï¼ - [ ] æ¯å¦é¿å äºæå¤ä¸ªæ¡ä»¶å è¿ä¸å¥"XXä¸ä¸è´"ï¼ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -486,7 +486,7 @@ ErrorCode WM_TRANSACTION_LIST_EMPTY = new ErrorCode(1_040_703_011, "åºåäºå¡å表ä¸è½ä¸ºç©º"); ErrorCode WM_TRANSACTION_BATCH_NOT_EXISTS = new ErrorCode(1_040_703_012, "æ¹æ¬¡è®°å½ä¸åå¨"); ErrorCode WM_MATERIAL_STOCK_REQUIRED = new ErrorCode(1_040_703_013, "åºåè®°å½ä¸è½ä¸ºç©º"); ErrorCode WM_MATERIAL_STOCK_SELECTION_MISMATCH = new ErrorCode(1_040_703_014, "åºåè®°å½ä¸æäº¤çç©æãæ¹æ¬¡æåºä½ä¿¡æ¯ä¸ä¸è´"); ErrorCode WM_MATERIAL_STOCK_SELECTION_MISMATCH = new ErrorCode(1_040_703_014, "æéåºåè®°å½ä¸åæ®ä¿¡æ¯ä¸ä¸è´ï¼è¯·æ ¸å¯¹åéæ°æä½"); ErrorCode WM_MATERIAL_STOCK_QUANTITY_INVALID = new ErrorCode(1_040_703_015, "è°æ´æ°éä¸è½ä¸ºç©ºæé¶"); ErrorCode WM_MATERIAL_STOCK_FROZEN = new ErrorCode(1_040_703_016, "åºåè®°å½å·²å»ç»ï¼æ æ³ç§»åº"); ErrorCode WM_MATERIAL_STOCK_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_040_703_017, "å¯¼å ¥çåºåæ°æ®ä¸è½ä¸ºç©º"); yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
@@ -278,14 +278,13 @@ throw exception(WM_MATERIAL_STOCK_REQUIRED); } MesWmMaterialStockDO stock = validateMaterialStockExists(materialStockId); // 2. æ ¡éªåºåè®°å½çç©æãæ¹æ¬¡ãä»åºãåºåºãåºä½çä¿¡æ¯ä¸åç«¯éæ©çä¸è´ï¼é¿å 串åæè¶ææäº¤ if (ObjUtil.notEqual(stock.getItemId(), itemId) || ObjUtil.notEqual(stock.getBatchId(), batchId) || (batchCode != null && ObjUtil.notEqual(stock.getBatchCode(), batchCode)) || ObjUtil.notEqual(stock.getWarehouseId(), warehouseId) || ObjUtil.notEqual(stock.getLocationId(), locationId) || ObjUtil.notEqual(stock.getAreaId(), areaId)) { throw exception(WM_MATERIAL_STOCK_SELECTION_MISMATCH); // 2. æ ¡éªåºåè®°å½çç©æãæ¹æ¬¡ãä»åºãåºåºãåºä½çä¿¡æ¯ä¸åæ®ä¸è´ï¼é¿å 串åæè¶ææäº¤ã // é个维度æ¯å¯¹ï¼å½ä¸æ¶æç¤ºå ·ä½å·®å¼ï¼åºåä¾§ vs 忮侧ï¼å¹¶ç»åºå¤çåæ³ï¼é¿å ç¬¼ç»æ¥"ä¿¡æ¯ä¸ä¸è´" String mismatch = buildSelectedStockMismatch( stock, itemId, batchId, batchCode, warehouseId, locationId, areaId); if (mismatch != null) { throw new ServiceException(WM_MATERIAL_STOCK_SELECTION_MISMATCH.getCode(), "æéåºåè®°å½ä¸åæ®ä¸ä¸è´ï¼" + mismatch + "ãè¯·éæ°éæ©è¯¥ç©ææ£ç¡®çåºåï¼è¥ä»åº/åºåº/åºä½/æ¹æ¬¡è¢«ç¦ç¨æ æ³ä¿®æ¹ï¼è¯·å 餿¬æ¡æç»åéæ°æ·»å ã"); } // 3. æ ¡éªåºåæ°éå è¶³ï¼å¦æåç«¯ä¼ äº quantityï¼åå¿ é¡»ä¿è¯åºåæ°é >= quantityï¼ if (quantity != null && stock.getQuantity() != null && stock.getQuantity().compareTo(quantity) < 0) { @@ -294,6 +293,74 @@ return stock; } /** * é维度æ¯å¯¹å¾ éåºåä¸åæ®ä¼ å ¥çä¿¡æ¯ï¼è¿å第ä¸ä¸ªä¸ä¸è´ç»´åº¦çå¯è¯»æè¿°ï¼å ¨é¨ä¸è´è¿å null */ private String buildSelectedStockMismatch(MesWmMaterialStockDO stock, Long itemId, Long batchId, String batchCode, Long warehouseId, Long locationId, Long areaId) { if (ObjUtil.notEqual(stock.getItemId(), itemId)) { return "æéåºåå½å±ç©æ[" + itemIdText(itemId) + "]ï¼åæ®ç©æä¸º[" + itemIdText(stock.getItemId()) + "]"; } if (ObjUtil.notEqual(stock.getBatchId(), batchId)) { return "æéåºåæ¹æ¬¡[" + batchText(stock.getBatchId(), stock.getBatchCode()) + "]ï¼åæ®æ¹æ¬¡ä¸º[" + batchText(batchId, batchCode) + "]"; } if (batchCode != null && ObjUtil.notEqual(stock.getBatchCode(), batchCode)) { return "æéåºåæ¹æ¬¡å·[" + stock.getBatchCode() + "]ï¼åæ®æ¹æ¬¡å·ä¸º[" + batchCode + "]"; } if (ObjUtil.notEqual(stock.getWarehouseId(), warehouseId)) { return "æéåºåä»åº[" + warehouseText(stock.getWarehouseId()) + "]ï¼åæ®ä»åºä¸º[" + warehouseText(warehouseId) + "]"; } if (ObjUtil.notEqual(stock.getLocationId(), locationId)) { return "æéåºååºåº[" + locationText(stock.getLocationId()) + "]ï¼åæ®åºåºä¸º[" + locationText(locationId) + "]"; } if (ObjUtil.notEqual(stock.getAreaId(), areaId)) { return "æéåºååºä½[" + areaText(stock.getAreaId()) + "]ï¼åæ®åºä½ä¸º[" + areaText(areaId) + "]"; } return null; } private String itemIdText(Long itemId) { return itemId == null ? "æªéæ©" : ("ç©æID=" + itemId); } private String batchText(Long batchId, String batchCode) { if (StrUtil.isNotBlank(batchCode)) { return batchCode; } return batchId == null ? "æªéæ©" : ("æ¹æ¬¡ID=" + batchId); } private String warehouseText(Long warehouseId) { if (warehouseId == null) { return "æªéæ©"; } MesWmWarehouseDO warehouse = warehouseService.getWarehouse(warehouseId); return warehouse != null && StrUtil.isNotBlank(warehouse.getName()) ? warehouse.getName() : ("ä»åºID=" + warehouseId); } private String locationText(Long locationId) { if (locationId == null) { return "æªéæ©"; } MesWmWarehouseLocationDO location = locationService.getWarehouseLocation(locationId); return location != null && StrUtil.isNotBlank(location.getName()) ? location.getName() : ("åºåºID=" + locationId); } private String areaText(Long areaId) { if (areaId == null) { return "æªéæ©"; } MesWmWarehouseAreaDO area = areaService.getWarehouseArea(areaId); return area != null && StrUtil.isNotBlank(area.getName()) ? area.getName() : ("åºä½ID=" + areaId); } @Override @Transactional(rollbackFor = Exception.class) public Long adjustMaterialStockIn(MesWmMaterialStockAdjustReqVO reqVO) { yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueDetailServiceImpl.java
@@ -18,6 +18,8 @@ import java.math.BigDecimal; import java.util.List; import cn.iocoder.yudao.framework.common.exception.ServiceException; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @@ -123,9 +125,10 @@ if (stock == null) { throw exception(WM_MATERIAL_STOCK_NOT_EXISTS); } // æ ¡éªç©æåæ¹æ¬¡ä¸è´ // æ ¡éªç©æä¸è´ï¼æ¤å¤åªæ¯å¯¹ç©æï¼å ä¸ºæ¥æºåºå(线边/èæä»)ä¸ä¸æ¶ç®æ ä»åºæ¬å°±ä¸å屿£å¸¸ if (ObjUtil.notEqual(stock.getItemId(), reqVO.getItemId())) { throw exception(WM_MATERIAL_STOCK_SELECTION_MISMATCH); throw new ServiceException(WM_MATERIAL_STOCK_SELECTION_MISMATCH.getCode(), "æéæ¥æºåºåå½å±ç©æä¸å½åéè´§ç©æä¸ä¸è´ï¼è¯·éæ°éæ©æ¥æºåºå"); } // æ ¡éªåºåæ°éå è¶³ if (reqVO.getQuantity() != null && stock.getQuantity() != null yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/MesWmTransactionServiceImpl.java
@@ -31,6 +31,8 @@ import java.time.LocalDateTime; import java.util.List; import cn.iocoder.yudao.framework.common.exception.ServiceException; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @@ -89,12 +91,14 @@ if (materialStock == null) { throw exception(WM_MATERIAL_STOCK_NOT_EXISTS); } // æ ¡éªç©æãæ¹æ¬¡ãä»åºç维度ä¸è´ï¼é²æ¢ä¼ å ¥é误ç materialStockIdï¼ // æ ¡éªç©æãæ¹æ¬¡ãä»åºç维度ä¸è´ï¼é²æ¢ä¼ å ¥é误ç materialStockIdï¼ã // è¥æ¤å¤ä¸ä¸è´ï¼é常æ¯è¯¥åºå已被移åº/åå¹¶/æåï¼ééåéæ°æ£è´§ï¼æ ç»åºéå¯¹æ§æç¤º if (ObjUtil.notEqual(materialStock.getItemId(), reqDTO.getItemId()) || ObjUtil.notEqual(materialStock.getWarehouseId(), reqDTO.getWarehouseId()) || ObjUtil.notEqual(materialStock.getLocationId(), reqDTO.getLocationId()) || ObjUtil.notEqual(materialStock.getAreaId(), reqDTO.getAreaId())) { throw exception(WM_MATERIAL_STOCK_SELECTION_MISMATCH); throw new ServiceException(WM_MATERIAL_STOCK_SELECTION_MISMATCH.getCode(), "该åºåè®°å½å·²åå¨ï¼å¯è½è¢«ç§»åº/åå¹¶/æåï¼ï¼ä¸åºåºæç»ä¸ä¸è´ï¼æ æ³æ£åï¼è¯·éåéæ°æ£è´§"); } } else if (isInbound) { // å ¥åºäºå¡ï¼æ ¹æ® forceCreateNewStock æ å¿å³å®æ¯å建æ°è®°å½è¿æ¯æ¥æ¾/å建