| docs/purchase_product_location.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/purchase_product_location.sql | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/approve/service/impl/ApproveBusinessStatusService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/quality/pojo/QualityInspect.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/sales/SalesLedgerProductMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/stock/StockInventoryMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
docs/purchase_product_location.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,151 @@ # éè´å°è´¦åºä½å段ï¼è®¾å¤éæ©ï¼ ## æ¶åé¡µé¢ - éè´å°è´¦ç®¡çé¡µé¢ (`views/procurementManagement/procurementLedger/index.vue`) - éè´å°è´¦æ°å¢/ç¼è¾å¼¹çª - åºå管çé¡µé¢ (`views/inventoryManagement/stockManagement/index.vue`) - å ¥åºè®°å½é¡µé¢ (`views/inventoryManagement/stockManagement/Record.vue`) ## åæ®µæ å°å ³ç³» | 表/å®ä½ | åæ®µå | 说æ | |---------|--------|------| | device_ledger | storage_location | 设å¤çåæ¾ä½ç½®ï¼åºä½ï¼ | | sales_ledger_product | storage_location | éè´å°è´¦äº§åæç»çåºä½ï¼æ¥æºäºè®¾å¤ï¼ | | sales_ledger_product | device_id | å ³èç设å¤ID | | stock_in_record | warehouse | å ¥åºè®°å½çåºä½ï¼æ¥æºäºstorageLocationï¼ | | stock_inventory | warehouse | åºåçåºä½ï¼æ¥æºäºstorageLocationï¼ | **æ°æ®æµåï¼** ``` 设å¤å°è´¦(storage_location) â éè´äº§åæç»(storage_location) â å ¥åºè®°å½(warehouse) â åºå(warehouse) ``` ## API | æ¹æ³ | è·¯å¾ | 说æ | |------|------|------| | GET | /device/ledger/iotDeviceList | è·åIoT设å¤å表ï¼is_iot_device=1ï¼ | | POST | /purchase/purchaseLedger/addOrEditPurchase | æ°å¢/ç¼è¾éè´å°è´¦ | | GET | /purchase/purchaseLedger/getPurchaseById | æ¥è¯¢éè´å°è´¦è¯¦æ | | GET | /stock/stockInventory/pagestockInventory | åºåå页æ¥è¯¢ | | GET | /stock/stockInventory/pageListCombinedStockInventory | åºååå¹¶æ¥è¯¢ | | GET | /stock/stockInRecord/listPage | å ¥åºè®°å½å页æ¥è¯¢ | **IoT设å¤å表ååºï¼** ```json [ { "id": 1, "deviceName": "å¨ç½A", "storageLocation": "ä»åº1-Aåº" } ] ``` **请æ±åæ°ï¼äº§åæç»æ°å¢å段ï¼ï¼** | åæ° | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | deviceId | Long | å¦ | 设å¤IDï¼éæ©IoT设å¤åèªå¨è·åï¼ | | storageLocation | String | å¦ | åºä½ï¼éæ©è®¾å¤åèªå¨å¡«å 设å¤çstorageLocationï¼ | **ååºå段ï¼äº§åæç»åæ¾ï¼ï¼** | åæ° | ç±»å | 说æ | |------|------|------| | deviceId | Long | 设å¤ID | | deviceName | String | 设å¤åç§° | | storageLocation | String | åºä½ | **ååºå段ï¼åºå/å ¥åºè®°å½åæ¾ï¼ï¼** | åæ° | ç±»å | 说æ | |------|------|------| | warehouse | String | åºä½ï¼æ¥æºäºéè´å°è´¦äº§åæç»çstorageLocationï¼ | ## å端修æ¹ç¹ ### 1. éè´å°è´¦äº§åè¡¨æ ¼æ°å¢è®¾å¤éæ©å ```html <el-table-column label="éæ©è®¾å¤" prop="deviceId" min-width="150"> <template slot-scope="scope"> <el-select v-model="scope.row.deviceId" placeholder="è¯·éæ©è®¾å¤" filterable @change="handleDeviceChange(scope.row, scope.$index)"> <el-option v-for="device in iotDeviceList" :key="device.id" :label="device.deviceName" :value="device.id"> </el-option> </el-select> </template> </el-table-column> <el-table-column label="åºä½" prop="storageLocation" min-width="120"> <template slot-scope="scope"> <el-input v-model="scope.row.storageLocation" placeholder="èªå¨è·å" disabled /> </template> </el-table-column> ``` ### 2. åºå/å ¥åºè®°å½è¡¨æ ¼æ°å¢åºä½å ```html <el-table-column label="åºä½" prop="warehouse" min-width="120" /> ``` ### 3. data æ°æ® ```js data() { return { iotDeviceList: [], // IoT设å¤å表 productData: [], // 产åæç» } } ``` ### 4. methods æ¹æ³ ```js // è·åIoT设å¤å表 async getIotDeviceList() { const res = await this.$axios.get('/device/ledger/iotDeviceList'); this.iotDeviceList = res.data; }, // 设å¤éæ©åæ´æ¶ï¼èªå¨å¡«å åºä½ handleDeviceChange(row, index) { const device = this.iotDeviceList.find(d => d.id === row.deviceId); if (device) { row.storageLocation = device.storageLocation; } else { row.storageLocation = ''; } }, // ç¼è¾åæ¾æ¶ï¼æ ¹æ®deviceIdåæ¾è®¾å¤åç§° // 注æï¼å端æ¥è¯¢å·²å ³èè¿ådeviceNameï¼æ éé¢å¤å¤ç // 页é¢å è½½æ¶è·å设å¤å表 mounted() { this.getIotDeviceList(); } ``` ## 注æäºé¡¹ - 设å¤éæ©æ¥å£åªè¿å `is_iot_device=1` ç设å¤ï¼ç©è设å¤ï¼ - éæ©è®¾å¤åï¼åºä½èªå¨ä»è®¾å¤ç `storageLocation` åæ®µè·åï¼æ éæå¨è¾å ¥ - ç¼è¾éè´å°è´¦æ¶ï¼å端ä¼èªå¨åæ¾ `deviceId`ã`deviceName`ã`storageLocation` åæ®µ - åºä½åæ®µä» ç¨äºéè´å°è´¦çåææäº§åï¼éå®å°è´¦çæåä¸éè¦æ¤å段 - åºä½ä¿¡æ¯ä¼å¨éè´å ¥åºæµç¨å®¡æ¹éè¿åèªå¨å¸¦å ¥å°åºåè®°å½ç `warehouse` åæ®µ - åºå管ç页é¢åå ¥åºè®°å½é¡µé¢ç `warehouse` åæ®µå·²èªå¨åæ¾åºä½ä¿¡æ¯ - 注æå段å½åå·®å¼ï¼éè´å°è´¦ç¨ `storageLocation`ï¼åºåç¨ `warehouse`ï¼å®é åå¨çæ¯åä¸ä¸ªåºä½å¼ docs/purchase_product_location.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ -- éè´å°è´¦äº§åæ·»å åºä½å段ï¼è®¾å¤éæ©ï¼ -- æ¥æ: 2026-06-29 -- 说æ: åææéè´å ¥åºéè¦ä»IoT设å¤å°è´¦éæ©åºä½ï¼éè¿æµç¨å¸¦å ¥å°åºåè®°å½ -- 为éè´å°è´¦äº§å表添å 设å¤IDååºä½å段 ALTER TABLE sales_ledger_product ADD COLUMN device_id BIGINT DEFAULT NULL COMMENT '设å¤IDï¼å ³è设å¤å°è´¦ï¼çéis_iot_device=1ï¼'; ALTER TABLE sales_ledger_product ADD COLUMN storage_location VARCHAR(100) DEFAULT NULL COMMENT 'åºä½ï¼æ¥æºäºè®¾å¤çstorage_locationï¼'; -- 为质æ£å表添å åºä½å段ï¼éè´è´¨æ£å ¥åºæ¶ä½¿ç¨ï¼ ALTER TABLE quality_inspect ADD COLUMN warehouse VARCHAR(100) DEFAULT NULL COMMENT 'åºä½ï¼æ¥æºäºéè´äº§åæç»çstorage_locationï¼'; -- 注æäºé¡¹: -- 1. æ¤åæ®µä» ç¨äºéè´å°è´¦(type=2)çåææäº§å -- 2. éå®å°è´¦çæååºåä¸éè¦æ¤å段 -- 3. åç«¯éæ©è®¾å¤æ¶ï¼éè°ç¨ GET /device/ledger/iotDeviceList æ¥å£è·å is_iot_device=1 ç设å¤å表 -- 4. éæ©è®¾å¤åï¼èªå¨è·å设å¤ç storage_location åæ®µå¼ -- 5. åºä½ä¿¡æ¯æµè½¬è·¯å¾ï¼ -- 设å¤(storage_location) â éè´äº§åæç»(storage_location) â è´¨æ£å(warehouse) â å ¥åºè®°å½(warehouse) â åºå(warehouse) -- æï¼è®¾å¤(storage_location) â éè´äº§åæç»(storage_location) â å ¥åºè®°å½(warehouse) â åºå(warehouse)ï¼ç´æ¥å ¥åºï¼ src/main/java/com/ruoyi/approve/service/impl/ApproveBusinessStatusService.java
@@ -87,7 +87,9 @@ salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber() + "-" + salesLedgerProduct.getId()); purchaseLedger.getPurchaseContractNumber() + "-" + salesLedgerProduct.getId(), null, salesLedgerProduct.getStorageLocation()); } } } else if (status.equals(3)) { @@ -156,6 +158,7 @@ qualityInspect.setProductModelId(saleProduct.getProductModelId()); qualityInspect.setUnit(saleProduct.getUnit()); qualityInspect.setQuantity(saleProduct.getQuantity()); qualityInspect.setWarehouse(saleProduct.getStorageLocation()); qualityInspectMapper.insert(qualityInspect); List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(saleProduct.getProductId(), 0, null); if (qualityTestStandard.size() > 0) { src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
@@ -113,4 +113,13 @@ deviceLedger.setCreateTime(deviceLedger.getUpdateTime().plusMonths(1));//䏿¬¡ç»´æ¤æ¶é´ return AjaxResult.success(deviceLedger); } @GetMapping("iotDeviceList") @Operation(summary = "è·åIoT设å¤å表ï¼is_iot_device=1ï¼") public AjaxResult iotDeviceList() { return AjaxResult.success(deviceLedgerMapper.selectList( new QueryWrapper<DeviceLedger>().lambda() .eq(DeviceLedger::getIsIotDevice, 1) .select(DeviceLedger::getId, DeviceLedger::getDeviceName, DeviceLedger::getStorageLocation))); } } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -64,6 +64,8 @@ import com.ruoyi.sales.service.impl.CommonFileServiceImpl; import com.ruoyi.stock.pojo.StockInRecord; import com.ruoyi.stock.service.StockInRecordService; import com.ruoyi.device.mapper.DeviceLedgerMapper; import com.ruoyi.device.pojo.DeviceLedger; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -119,6 +121,7 @@ private final StockUtils stockUtils; private final ApprovalTemplateMapper approvalTemplateMapper; private final SparePartsMapper sparePartsMapper; private final DeviceLedgerMapper deviceLedgerMapper; @Override public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) { @@ -421,6 +424,7 @@ qualityInspect.setProductModelId(saleProduct.getProductModelId()); qualityInspect.setUnit(saleProduct.getUnit()); qualityInspect.setQuantity(saleProduct.getQuantity()); qualityInspect.setWarehouse(saleProduct.getStorageLocation()); qualityInspectMapper.insert(qualityInspect); List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(saleProduct.getProductId(), 0,null); if (qualityTestStandard.size()>0){ @@ -495,13 +499,18 @@ if (CollectionUtils.isEmpty(stockRecords) && qualityInspect.getQualifiedQuantity() != null && qualityInspect.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0) { // ä¼å 使ç¨è´¨æ£åä¸çåºä½ï¼å¦ææ²¡æå使ç¨äº§åæç»ä¸çåºä½ String warehouse = StringUtils.hasText(qualityInspect.getWarehouse()) ? qualityInspect.getWarehouse() : product.getStorageLocation(); stockUtils.addStockWithBatchNo( product.getProductModelId(), qualityInspect.getQualifiedQuantity(), StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode(), qualityInspect.getId(), null, purchaseInspectTime == null ? null : purchaseInspectTime.plusDays(1) purchaseInspectTime == null ? null : purchaseInspectTime.plusDays(1), warehouse ); stockRecords = findQualityStockRecords(qualityInspect.getId(), product.getProductModelId()); } @@ -548,7 +557,8 @@ StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber() + "-" + product.getId(), stockCreateTime stockCreateTime, product.getStorageLocation() ); stockRecords = findDirectStockRecords(purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber(), product.getProductModelId(), product.getId()); } @@ -735,6 +745,14 @@ product.setProductCategory(spareParts.getName()); } } // 妿æè®¾å¤ID使²¡æåºä½ï¼ä»è®¾å¤è¡¨èªå¨å¡«å åºä½ if (product.getDeviceId() != null && StringUtils.isEmpty(product.getStorageLocation())) { DeviceLedger device = deviceLedgerMapper.selectById(product.getDeviceId()); if (device != null && StringUtils.isNotEmpty(device.getStorageLocation())) { product.setStorageLocation(device.getStorageLocation()); } } } // åç»å¤ç src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -191,6 +191,9 @@ @Excel(name = "èªå¨å¤æç»æ") private String autoJudgeResult; @Schema(description = "åºä½ï¼æ¥æºäºéè´äº§åæç»ï¼") private String warehouse; @TableField(fill = FieldFill.INSERT) private Long deptId; } src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -188,4 +188,14 @@ @TableField(exist = false) @Schema(description = "å¾ åè´§æ°é") private BigDecimal noQuantity; @Schema(description = "设å¤IDï¼å ³è设å¤å°è´¦ï¼çéis_iot_device=1ï¼") private Long deviceId; @TableField(exist = false) @Schema(description = "设å¤åç§°") private String deviceName; @Schema(description = "åºä½ï¼æ¥æºäºè®¾å¤çstorage_locationï¼") private String storageLocation; } src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -242,6 +242,7 @@ stockInventoryDto.setBatchNo(stockInRecord.getBatchNo()); stockInventoryDto.setQualitity(stockInRecord.getStockInNum()); stockInventoryDto.setRemark(stockInRecord.getRemark()); stockInventoryDto.setWarehouse(stockInRecord.getWarehouse()); if (stockInventory == null) { stockInventoryMapper.insert(new StockInventory() {{ setProductModelId(stockInRecord.getProductModelId()); @@ -263,6 +264,7 @@ stockUninventoryDto.setBatchNo(stockInRecord.getBatchNo()); stockUninventoryDto.setQualitity(stockInRecord.getStockInNum()); stockUninventoryDto.setRemark(stockInRecord.getRemark()); stockUninventoryDto.setWarehouse(stockInRecord.getWarehouse()); if (stockUninventory == null) { stockUninventoryMapper.insert(new StockUninventory() {{ setProductModelId(stockInRecord.getProductModelId()); src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -26,9 +26,12 @@ T1.is_production, T1.create_user, T1.dept_id, T1.device_id, T1.storage_location, p.product_name as product_category, pm.model as specification_model, pm.unit as unit, dl.device_name, CASE WHEN (IFNULL(t2.qualitity, 0) - IFNULL(t2.locked_quantity, 0)) >0 THEN 1 ELSE 0 @@ -101,6 +104,7 @@ ) t4 ON t4.sales_ledger_product_id = T1.id left join product_model pm ON T1.product_model_id = pm.id left join product p ON pm.product_id = p.id left join device_ledger dl ON T1.device_id = dl.id <where> <if test="salesLedgerProduct.salesLedgerId != null"> AND T1.sales_ledger_id = #{salesLedgerProduct.salesLedgerId} src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -231,7 +231,8 @@ model, unit, product_name, product_id product_id, warehouse order by create_time desc </select>