docs/mdm_item_aux_unit_warehouse.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,158 @@ # ç©æä¸»æ°æ®æ°å¢è¾ åä½ä¸é»è®¤ä»åºå段 ## æ¶åé¡µé¢ - ç©æä¸»æ°æ®æ°å¢/ç¼è¾é¡µé¢ - ç©æä¸»æ°æ®åè¡¨é¡µé¢ - ç©æè¯¦æ é¡µé¢ ## API | æ¹æ³ | è·¯å¾ | 说æ | |------|------|------| | POST | /mdm/item/create | åå»ºç©æï¼æ°å¢è¾ åä½ãä»åºåæ®µï¼ | | PUT | /mdm/item/update | æ´æ°ç©æï¼æ°å¢è¾ åä½ãä»åºåæ®µï¼ | | GET | /mdm/item/get | è·åç©æè¯¦æ ï¼æ°å¢è¾ åä½åç§°ãä»åºåç§°ï¼ | | GET | /mdm/item/page | è·åç©æåé¡µï¼æ°å¢è¾ åä½åç§°ãä»åºåç§°ï¼ | **请æ±åæ°ï¼æ°å¢å段ï¼ï¼** | åæ° | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | unitMeasureId2 | Long | å¦ | è¾ åä½1ç¼å·ï¼å ³è计éåä½è¡¨ | | unitMeasureRate1 | BigDecimal | å¦ | è¾ åä½1æ¢ç®æ¯çï¼ä¸»åä½ä¸è¾ åä½1çæ¢ç®æ¯çï¼å¦1ç®±=12个ï¼åæ¯ç为12ï¼ | | unitMeasureId3 | Long | å¦ | è¾ åä½2ç¼å·ï¼å ³è计éåä½è¡¨ | | unitMeasureRate2 | BigDecimal | å¦ | è¾ åä½2æ¢ç®æ¯ç | | warehouseId | Long | å¦ | é»è®¤ä»åºç¼å·ï¼å ³èä»åºè¡¨ | | warehouseCode | String | å¦ | é»è®¤ä»åºç¼ç | **ååºï¼æ°å¢å段ï¼ï¼** | åæ° | ç±»å | 说æ | |------|------|------| | unitMeasureId2 | Long | è¾ åä½1ç¼å· | | unitMeasureName2 | String | è¾ åä½1åç§° | | unitMeasureRate1 | BigDecimal | è¾ åä½1æ¢ç®æ¯ç | | unitMeasureId3 | Long | è¾ åä½2ç¼å· | | unitMeasureName3 | String | è¾ åä½2åç§° | | unitMeasureRate2 | BigDecimal | è¾ åä½2æ¢ç®æ¯ç | | warehouseId | Long | é»è®¤ä»åºç¼å· | | warehouseCode | String | é»è®¤ä»åºç¼ç | | warehouseName | String | é»è®¤ä»åºåç§° | ## å端修æ¹ç¹ ### 1. æ°å¢/ç¼è¾è¡¨å - æ·»å è¾ åä½åä»åºå段 ```html <!-- è¾ åä½1 --> <el-form-item label="è¾ åä½1" prop="unitMeasureId2"> <el-select v-model="form.unitMeasureId2" placeholder="è¯·éæ©è¾ åä½1" clearable> <el-option v-for="item in unitMeasureList" :key="item.id" :label="item.name" :value="item.id" /> </el-select> </el-form-item> <el-form-item label="è¾ åä½1æ¢ç®æ¯ç" prop="unitMeasureRate1"> <el-input-number v-model="form.unitMeasureRate1" :precision="6" :min="0" placeholder="请è¾å ¥æ¢ç®æ¯ç" /> </el-form-item> <!-- è¾ åä½2 --> <el-form-item label="è¾ åä½2" prop="unitMeasureId3"> <el-select v-model="form.unitMeasureId3" placeholder="è¯·éæ©è¾ åä½2" clearable> <el-option v-for="item in unitMeasureList" :key="item.id" :label="item.name" :value="item.id" /> </el-select> </el-form-item> <el-form-item label="è¾ åä½2æ¢ç®æ¯ç" prop="unitMeasureRate2"> <el-input-number v-model="form.unitMeasureRate2" :precision="6" :min="0" placeholder="请è¾å ¥æ¢ç®æ¯ç" /> </el-form-item> <!-- é»è®¤ä»åº --> <el-form-item label="é»è®¤ä»åº" prop="warehouseId"> <el-select v-model="form.warehouseId" placeholder="è¯·éæ©é»è®¤ä»åº" clearable @change="handleWarehouseChange"> <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" /> </el-select> </el-form-item> ``` ### 2. data æ°æ® ```js data() { return { // ... åææ°æ® form: { // ... åæå段 unitMeasureId2: undefined, unitMeasureRate1: undefined, unitMeasureId3: undefined, unitMeasureRate2: undefined, warehouseId: undefined, warehouseCode: undefined, }, warehouseList: [], // ä»åºä¸æå表 } } ``` ### 3. åè¡¨è¡¨æ ¼ - æ·»å å ```html <el-table-column label="è¾ åä½1" align="center" prop="unitMeasureName2" /> <el-table-column label="è¾ åä½1æ¢ç®æ¯ç" align="center" prop="unitMeasureRate1" width="140" /> <el-table-column label="è¾ åä½2" align="center" prop="unitMeasureName3" /> <el-table-column label="è¾ åä½2æ¢ç®æ¯ç" align="center" prop="unitMeasureRate2" width="140" /> <el-table-column label="é»è®¤ä»åº" align="center" prop="warehouseName" /> ``` ### 4. æ¹æ³ ```js // ä»åºéæ©åæ´æ¶ï¼åæ¥è®¾ç½®ä»åºç¼ç handleWarehouseChange(warehouseId) { const warehouse = this.warehouseList.find(w => w.id === warehouseId); this.form.warehouseCode = warehouse ? warehouse.code : undefined; }, // æå¼æ°å¢/ç¼è¾å¼¹çªæ¶ï¼å è½½ä»åºä¸æå表 async openForm(id) { // ... åæé»è¾ this.warehouseList = await getWarehouseSimpleList(); // ... } ``` ### 5. API æ¥å£è°ç¨ ```js // éè¦å¼å ¥ä»åº API import { getWarehouseSimpleList } from '@/api/mdm/warehouse'; // æå¨ç©æ API æä»¶ä¸æ°å¢ä»åºç®åå表æ¥å£ // api/mdm/warehouse.js export function getWarehouseSimpleList() { return request({ url: '/mdm/warehouse/simple-list', method: 'get' }); } ``` ## 注æäºé¡¹ - è¾ åä½1åè¾ åä½2åå ³è计éåä½è¡¨ï¼mdm_unit_measureï¼ï¼ä¸æé项ä¸ä¸»åä½å ±ç¨å䏿°æ®æº - æ¢ç®æ¯ç为 BigDecimal(24,6)ï¼åç«¯ä½¿ç¨ `el-input-number` ç»ä»¶æ¶é设置 `:precision="6"` ä¿æç²¾åº¦ä¸è´ - é»è®¤ä»åºç¼ç ï¼warehouseCodeï¼ä¸ºåä½å段ï¼éæ©ä»åºåèªå¨å¡«å ï¼æ éç¨æ·æå¨è¾å ¥ - è¾ åä½åé»è®¤ä»åºå为éå¿ å¡«åæ®µ - å表页å¦å段è¾å¤ï¼å¯èèå°è¾ åä½ä¿¡æ¯æå å±ç¤ºæä» å¨è¯¦æ 页æ¾ç¤º docs/sql/mdm_migration_05_item_aux_unit_warehouse.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ -- ===================================================== -- mdm_item 表æ°å¢å段ï¼è¾ åä½ãé»è®¤ä»åº -- æ§è¡æ¶é´ï¼2026-07-01 -- ===================================================== ALTER TABLE `mdm_item` ADD COLUMN `unit_measure_id2` bigint DEFAULT NULL COMMENT 'è¾ åä½1ç¼å·' AFTER `unit_measure_id`, ADD COLUMN `unit_measure_rate1` decimal(24,6) DEFAULT NULL COMMENT 'è¾ åä½1æ¢ç®æ¯ç' AFTER `unit_measure_id2`, ADD COLUMN `unit_measure_id3` bigint DEFAULT NULL COMMENT 'è¾ åä½2ç¼å·' AFTER `unit_measure_rate1`, ADD COLUMN `unit_measure_rate2` decimal(24,6) DEFAULT NULL COMMENT 'è¾ åä½2æ¢ç®æ¯ç' AFTER `unit_measure_id3`, ADD COLUMN `warehouse_id` bigint DEFAULT NULL COMMENT 'é»è®¤ä»åºç¼å·' AFTER `unit_measure_rate2`, ADD COLUMN `warehouse_code` varchar(50) DEFAULT NULL COMMENT 'é»è®¤ä»åºç¼ç ' AFTER `warehouse_id`; docs/sql/mdm_schema.sql
@@ -80,6 +80,12 @@ `specification` varchar(200) DEFAULT NULL COMMENT 'è§æ ¼åå·', `category_id` bigint DEFAULT NULL COMMENT 'ç©æåç±»ç¼å·', `unit_measure_id` bigint DEFAULT NULL COMMENT '计éåä½ç¼å·', `unit_measure_id2` bigint DEFAULT NULL COMMENT 'è¾ åä½1ç¼å·', `unit_measure_rate1` decimal(24,6) DEFAULT NULL COMMENT 'è¾ åä½1æ¢ç®æ¯ç', `unit_measure_id3` bigint DEFAULT NULL COMMENT 'è¾ åä½2ç¼å·', `unit_measure_rate2` decimal(24,6) DEFAULT NULL COMMENT 'è¾ åä½2æ¢ç®æ¯ç', `warehouse_id` bigint DEFAULT NULL COMMENT 'é»è®¤ä»åºç¼å·', `warehouse_code` varchar(50) DEFAULT NULL COMMENT 'é»è®¤ä»åºç¼ç ', `item_type` tinyint NOT NULL DEFAULT 1 COMMENT 'ç©æç±»åï¼1:ç©æ 2:产å 3:åæåï¼', `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0æ£å¸¸ 1åç¨ï¼', `purchase_price` decimal(24,2) DEFAULT NULL COMMENT 'éè´ä»·', yudao-module-infra/pom.xml
@@ -7,6 +7,18 @@ <artifactId>yudao</artifactId> <version>${revision}</version> </parent> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>9</source> <target>9</target> </configuration> </plugin> </plugins> </build> <modelVersion>4.0.0</modelVersion> <artifactId>yudao-module-infra</artifactId> <packaging>jar</packaging> yudao-module-mdm-api/src/main/java/cn/iocoder/yudao/module/mdm/api/item/dto/MdmItemCreateReqDTO.java
@@ -27,6 +27,24 @@ @Schema(description = "计éåä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long unitMeasureId; @Schema(description = "è¾ åä½1ç¼å·", example = "2") private Long unitMeasureId2; @Schema(description = "è¾ åä½1æ¢ç®æ¯ç", example = "12") private BigDecimal unitMeasureRate1; @Schema(description = "è¾ åä½2ç¼å·", example = "3") private Long unitMeasureId3; @Schema(description = "è¾ åä½2æ¢ç®æ¯ç", example = "100") private BigDecimal unitMeasureRate2; @Schema(description = "é»è®¤ä»åºç¼å·", example = "1") private Long warehouseId; @Schema(description = "é»è®¤ä»åºç¼ç ", example = "WH001") private String warehouseCode; @Schema(description = "åçç¼å·", example = "1") private Long brandId; yudao-module-mdm-api/src/main/java/cn/iocoder/yudao/module/mdm/api/item/dto/MdmItemRespDTO.java
@@ -30,6 +30,24 @@ @Schema(description = "计éåä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long unitMeasureId; @Schema(description = "è¾ åä½1ç¼å·", example = "2") private Long unitMeasureId2; @Schema(description = "è¾ åä½1æ¢ç®æ¯ç", example = "12") private BigDecimal unitMeasureRate1; @Schema(description = "è¾ åä½2ç¼å·", example = "3") private Long unitMeasureId3; @Schema(description = "è¾ åä½2æ¢ç®æ¯ç", example = "100") private BigDecimal unitMeasureRate2; @Schema(description = "é»è®¤ä»åºç¼å·", example = "1") private Long warehouseId; @Schema(description = "é»è®¤ä»åºç¼ç ", example = "WH001") private String warehouseCode; @Schema(description = "åçç¼å·", example = "1") private Long brandId; yudao-module-mdm-api/src/main/java/cn/iocoder/yudao/module/mdm/api/item/dto/MdmItemUpdateReqDTO.java
@@ -30,6 +30,24 @@ @Schema(description = "计éåä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long unitMeasureId; @Schema(description = "è¾ åä½1ç¼å·", example = "2") private Long unitMeasureId2; @Schema(description = "è¾ åä½1æ¢ç®æ¯ç", example = "12") private BigDecimal unitMeasureRate1; @Schema(description = "è¾ åä½2ç¼å·", example = "3") private Long unitMeasureId3; @Schema(description = "è¾ åä½2æ¢ç®æ¯ç", example = "100") private BigDecimal unitMeasureRate2; @Schema(description = "é»è®¤ä»åºç¼å·", example = "1") private Long warehouseId; @Schema(description = "é»è®¤ä»åºç¼ç ", example = "WH001") private String warehouseCode; @Schema(description = "åçç¼å·", example = "1") private Long brandId; yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/item/MdmItemController.java
@@ -9,8 +9,10 @@ import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemStatusUpdateReqVO; import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; import cn.iocoder.yudao.module.mdm.dal.dataobject.warehouse.MdmWarehouseDO; import cn.iocoder.yudao.module.mdm.service.item.MdmItemService; import cn.iocoder.yudao.module.mdm.service.unit.MdmUnitMeasureService; import cn.iocoder.yudao.module.mdm.service.warehouse.MdmWarehouseService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -20,8 +22,8 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @@ -37,6 +39,9 @@ @Resource private MdmUnitMeasureService unitMeasureService; @Resource private MdmWarehouseService warehouseService; @PostMapping("/create") @Operation(summary = "åå»ºç©æ") @@ -76,7 +81,11 @@ @PreAuthorize("@ss.hasPermission('mdm:item:query')") public CommonResult<MdmItemRespVO> getItem(@RequestParam("id") Long id) { MdmItemDO item = itemService.getItem(id); return success(BeanUtils.toBean(item, MdmItemRespVO.class)); MdmItemRespVO resp = BeanUtils.toBean(item, MdmItemRespVO.class); if (resp != null) { enrichItemRespVO(resp); } return success(resp); } @GetMapping("/page") @@ -89,10 +98,39 @@ convertSet(pageResult.getList(), MdmItemDO::getUnitMeasureId)); // è½¬æ¢ List<MdmItemRespVO> respList = BeanUtils.toBean(pageResult.getList(), MdmItemRespVO.class); // æ¹éå ³èæ¥è¯¢è¾ åä½åç§° Set<Long> unitIds = new HashSet<>(); respList.forEach(resp -> { if (resp.getUnitMeasureId2() != null) unitIds.add(resp.getUnitMeasureId2()); if (resp.getUnitMeasureId3() != null) unitIds.add(resp.getUnitMeasureId3()); }); Map<Long, MdmUnitMeasureDO> auxUnitMap = unitIds.isEmpty() ? Collections.emptyMap() : unitMeasureService.getUnitMeasureMap(unitIds); // æ¹éå ³èæ¥è¯¢ä»åºåç§° Set<Long> warehouseIds = new HashSet<>(); respList.forEach(resp -> { if (resp.getWarehouseId() != null) warehouseIds.add(resp.getWarehouseId()); }); Map<Long, MdmWarehouseDO> warehouseMap = warehouseIds.isEmpty() ? Collections.emptyMap() : warehouseService.getWarehouseList(warehouseIds).stream() .collect(Collectors.toMap(MdmWarehouseDO::getId, w -> w)); // èµå¼ respList.forEach(resp -> { MdmUnitMeasureDO unit = unitMap.get(resp.getUnitMeasureId()); if (unit != null) { resp.setUnitMeasureName(unit.getName()); } MdmUnitMeasureDO auxUnit1 = auxUnitMap.get(resp.getUnitMeasureId2()); if (auxUnit1 != null) { resp.setUnitMeasureName2(auxUnit1.getName()); } MdmUnitMeasureDO auxUnit2 = auxUnitMap.get(resp.getUnitMeasureId3()); if (auxUnit2 != null) { resp.setUnitMeasureName3(auxUnit2.getName()); } MdmWarehouseDO warehouse = warehouseMap.get(resp.getWarehouseId()); if (warehouse != null) { resp.setWarehouseName(warehouse.getName()); } }); return success(new PageResult<>(respList, pageResult.getTotal())); @@ -107,4 +145,38 @@ return success(BeanUtils.toBean(list, MdmItemRespVO.class)); } /** * å¡«å ç©æååº VO çå ³èåç§°ï¼ä¸»åä½ãè¾ åä½ãä»åºåç§°ï¼ */ private void enrichItemRespVO(MdmItemRespVO resp) { // 主åä½åç§° if (resp.getUnitMeasureId() != null) { MdmUnitMeasureDO unit = unitMeasureService.getUnitMeasure(resp.getUnitMeasureId()); if (unit != null) { resp.setUnitMeasureName(unit.getName()); } } // è¾ åä½1åç§° if (resp.getUnitMeasureId2() != null) { MdmUnitMeasureDO unit2 = unitMeasureService.getUnitMeasure(resp.getUnitMeasureId2()); if (unit2 != null) { resp.setUnitMeasureName2(unit2.getName()); } } // è¾ åä½2åç§° if (resp.getUnitMeasureId3() != null) { MdmUnitMeasureDO unit3 = unitMeasureService.getUnitMeasure(resp.getUnitMeasureId3()); if (unit3 != null) { resp.setUnitMeasureName3(unit3.getName()); } } // é»è®¤ä»åºåç§° if (resp.getWarehouseId() != null) { MdmWarehouseDO warehouse = warehouseService.getWarehouse(resp.getWarehouseId()); if (warehouse != null) { resp.setWarehouseName(warehouse.getName()); } } } } yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/item/vo/MdmItemRespVO.java
@@ -37,6 +37,33 @@ @Schema(description = "计éåä½åç§°", example = "个") private String unitMeasureName; @Schema(description = "è¾ åä½1ç¼å·", example = "2") private Long unitMeasureId2; @Schema(description = "è¾ åä½1åç§°") private String unitMeasureName2; @Schema(description = "è¾ åä½1æ¢ç®æ¯ç", example = "12") private BigDecimal unitMeasureRate1; @Schema(description = "è¾ åä½2ç¼å·", example = "3") private Long unitMeasureId3; @Schema(description = "è¾ åä½2åç§°") private String unitMeasureName3; @Schema(description = "è¾ åä½2æ¢ç®æ¯ç", example = "100") private BigDecimal unitMeasureRate2; @Schema(description = "é»è®¤ä»åºç¼å·", example = "1") private Long warehouseId; @Schema(description = "é»è®¤ä»åºç¼ç ", example = "WH001") private String warehouseCode; @Schema(description = "é»è®¤ä»åºåç§°", example = "åæä»") private String warehouseName; @Schema(description = "åçç¼å·", example = "1") private Long brandId; yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/controller/admin/item/vo/MdmItemSaveReqVO.java
@@ -30,6 +30,24 @@ @Schema(description = "计éåä½ç¼å·", example = "1") private Long unitMeasureId; @Schema(description = "è¾ åä½1ç¼å·", example = "2") private Long unitMeasureId2; @Schema(description = "è¾ åä½1æ¢ç®æ¯ç", example = "12") private BigDecimal unitMeasureRate1; @Schema(description = "è¾ åä½2ç¼å·", example = "3") private Long unitMeasureId3; @Schema(description = "è¾ åä½2æ¢ç®æ¯ç", example = "100") private BigDecimal unitMeasureRate2; @Schema(description = "é»è®¤ä»åºç¼å·", example = "1") private Long warehouseId; @Schema(description = "é»è®¤ä»åºç¼ç ", example = "WH001") private String warehouseCode; @Schema(description = "ç©æç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer itemType; yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/dal/dataobject/item/MdmItemDO.java
@@ -164,6 +164,46 @@ private Boolean highValue; /** * è¾ åä½1ç¼å· * * å ³è {@link MdmUnitMeasureDO#getId()} */ private Long unitMeasureId2; /** * è¾ åä½1æ¢ç®æ¯ç * * 主åä½ä¸è¾ åä½1çæ¢ç®æ¯çï¼ä¾å¦ 1ç®±=12个ï¼åæ¯ç为12 */ private BigDecimal unitMeasureRate1; /** * è¾ åä½2ç¼å· * * å ³è {@link MdmUnitMeasureDO#getId()} */ private Long unitMeasureId3; /** * è¾ åä½2æ¢ç®æ¯ç * * 主åä½ä¸è¾ åä½2çæ¢ç®æ¯ç */ private BigDecimal unitMeasureRate2; /** * é»è®¤ä»åºç¼å· * * å ³è {@link cn.iocoder.yudao.module.mdm.dal.dataobject.warehouse.MdmWarehouseDO#getId()} */ private Long warehouseId; /** * é»è®¤ä»åºç¼ç */ private String warehouseCode; /** * éé(kg) */ private BigDecimal weight; yudao-module-member/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java
@@ -38,7 +38,7 @@ @RestController @RequestMapping("/member/user") @Validated public class MemberUserController { public class MemberUserController { @Resource private MemberUserService memberUserService;