| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- Batch 1: WMS API 模å建设 - æ°æ®åºåæ´èæ¬ |
| | | -- çæ¬: v1.0 |
| | | -- æ¥æ: 2026-06-26 |
| | | -- 说æ: æ°å¢åºåé¢çç¸å
³è¡¨ï¼æ©å±åºååæ®µ |
| | | -- ===================================================== |
| | | |
| | | -- ===================================================== |
| | | -- 1. æ°å¢åºåé¢ç表 |
| | | -- ===================================================== |
| | | |
| | | -- åºåé¢ç表ï¼ç¨äºéå®è®¢åçä¸å¡é¢çåºåï¼ |
| | | CREATE TABLE IF NOT EXISTS `wms_inventory_reserve` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `reserve_no` VARCHAR(64) NOT NULL COMMENT 'é¢çåå·', |
| | | `biz_type` INT NOT NULL COMMENT 'ä¸å¡ç±»åï¼10=éå®é¢ç 20=ç产é¢çï¼', |
| | | `biz_id` BIGINT NOT NULL COMMENT 'ä¸å¡åæ®ID', |
| | | `biz_no` VARCHAR(64) DEFAULT NULL COMMENT 'ä¸å¡åæ®å·', |
| | | `sku_id` BIGINT NOT NULL COMMENT 'SKUç¼å·', |
| | | `warehouse_id` BIGINT NOT NULL COMMENT 'ä»åºç¼å·', |
| | | `reserve_quantity` DECIMAL(24,6) NOT NULL COMMENT 'é¢çæ°é', |
| | | `used_quantity` DECIMAL(24,6) DEFAULT 0 COMMENT 'å·²ä½¿ç¨æ°é', |
| | | `status` INT NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0=é¢çä¸ 1=é¨åä½¿ç¨ 2=å·²ä½¿ç¨ 3=已鿾ï¼', |
| | | `expire_time` DATETIME DEFAULT NULL COMMENT 'è¿ææ¶é´', |
| | | `remark` VARCHAR(255) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` VARCHAR(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` VARCHAR(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_reserve_no` (`reserve_no`), |
| | | KEY `idx_biz` (`biz_type`, `biz_id`), |
| | | KEY `idx_sku_warehouse` (`sku_id`, `warehouse_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='åºåé¢ç表'; |
| | | |
| | | -- ===================================================== |
| | | -- 2. æ°å¢åºåäºå¡æµæ°´è¡¨ |
| | | -- ===================================================== |
| | | |
| | | CREATE TABLE IF NOT EXISTS `wms_inventory_transaction` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `transaction_no` VARCHAR(64) NOT NULL COMMENT 'äºå¡æµæ°´å·', |
| | | `transaction_type` INT NOT NULL COMMENT 'äºå¡ç±»åï¼10=å
¥åº 20=åºåº 30=é¢ç 40=éæ¾ 50=çç¹ 60=è°æ¨ï¼', |
| | | `biz_type` INT NOT NULL COMMENT 'ä¸å¡ç±»å', |
| | | `biz_id` BIGINT NOT NULL COMMENT 'ä¸å¡åæ®ID', |
| | | `biz_no` VARCHAR(64) DEFAULT NULL COMMENT 'ä¸å¡åæ®å·', |
| | | `sku_id` BIGINT NOT NULL COMMENT 'SKUç¼å·', |
| | | `warehouse_id` BIGINT NOT NULL COMMENT 'ä»åºç¼å·', |
| | | `quantity` DECIMAL(24,6) NOT NULL COMMENT 'å卿°éï¼æ£æ°å
¥åºï¼è´æ°åºåºï¼', |
| | | `before_quantity` DECIMAL(24,6) DEFAULT NULL COMMENT 'åå¨åæ°é', |
| | | `after_quantity` DECIMAL(24,6) DEFAULT NULL COMMENT 'åå¨åæ°é', |
| | | `reserve_id` BIGINT DEFAULT NULL COMMENT 'å
³èé¢çID', |
| | | `reserve_no` VARCHAR(64) DEFAULT NULL COMMENT 'å
³èé¢çåå·', |
| | | `transaction_time` DATETIME NOT NULL COMMENT 'äºå¡æ¶é´', |
| | | `remark` VARCHAR(255) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` VARCHAR(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` VARCHAR(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_transaction_no` (`transaction_no`), |
| | | KEY `idx_biz` (`biz_type`, `biz_id`), |
| | | KEY `idx_sku` (`sku_id`), |
| | | KEY `idx_transaction_time` (`transaction_time`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='åºåäºå¡æµæ°´è¡¨'; |
| | | |
| | | -- ===================================================== |
| | | -- 3. æ°æ®åå
¸æ°å¢ |
| | | -- ===================================================== |
| | | |
| | | -- åºåé¢çä¸å¡ç±»å |
| | | INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES ('WMS åºåé¢çä¸å¡ç±»å', 'wms_reserve_biz_type', 0, 'åºåé¢ççä¸å¡æ¥æºç±»å', '1', NOW(), '1', NOW(), b'0') |
| | | ON DUPLICATE KEY UPDATE `name` = 'WMS åºåé¢çä¸å¡ç±»å'; |
| | | |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES |
| | | (10, 'éå®é¢ç', '10', 'wms_reserve_biz_type', 0, 'primary', '', 'éå®è®¢åé¢çåºå', '1', NOW(), '1', NOW(), b'0'), |
| | | (20, 'ç产é¢ç', '20', 'wms_reserve_biz_type', 0, 'success', '', 'ç产工åé¢çåºå', '1', NOW(), '1', NOW(), b'0') |
| | | ON DUPLICATE KEY UPDATE `label` = VALUES(`label`); |
| | | |
| | | -- åºåäºå¡ç±»å |
| | | INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES ('WMS åºåäºå¡ç±»å', 'wms_transaction_type', 0, 'åºåäºå¡æµæ°´ç±»å', '1', NOW(), '1', NOW(), b'0') |
| | | ON DUPLICATE KEY UPDATE `name` = 'WMS åºåäºå¡ç±»å'; |
| | | |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES |
| | | (10, 'å
¥åº', '10', 'wms_transaction_type', 0, 'success', '', 'åºåå
¥åº', '1', NOW(), '1', NOW(), b'0'), |
| | | (20, 'åºåº', '20', 'wms_transaction_type', 0, 'warning', '', 'åºååºåº', '1', NOW(), '1', NOW(), b'0'), |
| | | (30, 'é¢ç', '30', 'wms_transaction_type', 0, 'primary', '', 'åºåé¢ç', '1', NOW(), '1', NOW(), b'0'), |
| | | (40, 'éæ¾', '40', 'wms_transaction_type', 0, 'info', '', 'é¢çéæ¾', '1', NOW(), '1', NOW(), b'0'), |
| | | (50, 'çç¹', '50', 'wms_transaction_type', 0, 'default', '', 'åºåçç¹', '1', NOW(), '1', NOW(), b'0'), |
| | | (60, 'è°æ¨', '60', 'wms_transaction_type', 0, 'default', '', 'åºåè°æ¨', '1', NOW(), '1', NOW(), b'0') |
| | | ON DUPLICATE KEY UPDATE `label` = VALUES(`label`); |
| | | |
| | | -- åºåé¢çç¶æ |
| | | INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES ('WMS åºåé¢çç¶æ', 'wms_reserve_status', 0, 'åºåé¢çç¶æ', '1', NOW(), '1', NOW(), b'0') |
| | | ON DUPLICATE KEY UPDATE `name` = 'WMS åºåé¢çç¶æ'; |
| | | |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES |
| | | (0, 'é¢çä¸', '0', 'wms_reserve_status', 0, 'primary', '', 'åºåé¢çä¸', '1', NOW(), '1', NOW(), b'0'), |
| | | (1, 'é¨å使ç¨', '1', 'wms_reserve_status', 0, 'warning', '', 'é¨å已使ç¨', '1', NOW(), '1', NOW(), b'0'), |
| | | (2, '已使ç¨', '2', 'wms_reserve_status', 0, 'success', '', 'å·²å
¨é¨ä½¿ç¨', '1', NOW(), '1', NOW(), b'0'), |
| | | (3, '已鿾', '3', 'wms_reserve_status', 0, 'info', '', 'é¢ç已鿾', '1', NOW(), '1', NOW(), b'0') |
| | | ON DUPLICATE KEY UPDATE `label` = VALUES(`label`); |
| | | |
| | | -- ===================================================== |
| | | -- 4. èåæ°å¢ï¼åºåé¢ç管çï¼ |
| | | -- ===================================================== |
| | | |
| | | -- åºåé¢çæ¾å¨"åºå管ç"èåä¸ï¼ID: 6440ï¼ |
| | | -- 妿åºå管çèåä¸åå¨ï¼åæ¾å¨ WMS ç³»ç»èåä¸ï¼ID: 6400ï¼ |
| | | |
| | | -- æ¹æ¡ä¸ï¼ä½¿ç¨åºå®çåºå管çèåIDï¼æ¨èï¼å¦ææ°æ®åºç»æä¸è´ï¼ |
| | | -- SET @inventory_menu_id = 6440; |
| | | |
| | | -- æ¹æ¡äºï¼å¨ææ¥è¯¢åºå管çèåIDï¼æ´å®å
¨ï¼ |
| | | SET @inventory_menu_id = (SELECT `id` FROM `system_menu` WHERE `name` = 'åºå管ç' AND `parent_id` = 6400 AND `deleted` = b'0' LIMIT 1); |
| | | |
| | | -- 妿åºå管çèåä¸åå¨ï¼ä½¿ç¨ WMS ç³»ç»èåID |
| | | SET @inventory_menu_id = IFNULL(@inventory_menu_id, 6400); |
| | | |
| | | -- æ°å¢åºåé¢çèå |
| | | INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES ('åºåé¢ç', '', 2, 30, @inventory_menu_id, 'reserve', 'ep:lock', 'wms/inventory/reserve/index', 'WmsInventoryReserve', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0') |
| | | ON DUPLICATE KEY UPDATE `name` = 'åºåé¢ç'; |
| | | |
| | | -- è·åèåID |
| | | SET @reserve_menu_id = (SELECT `id` FROM `system_menu` WHERE `path` = 'reserve' AND `parent_id` = @inventory_menu_id AND `deleted` = b'0'); |
| | | |
| | | -- æ¥è¯¢æé® |
| | | INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES ('åºåé¢çæ¥è¯¢', 'wms:inventory-reserve:query', 3, 1, @reserve_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0') |
| | | ON DUPLICATE KEY UPDATE `permission` = 'wms:inventory-reserve:query'; |
| | | |
| | | -- éæ¾æé® |
| | | INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES ('åºåé¢çéæ¾', 'wms:inventory-reserve:release', 3, 2, @reserve_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0') |
| | | ON DUPLICATE KEY UPDATE `permission` = 'wms:inventory-reserve:release'; |
| | | |
| | | -- ===================================================== |
| | | -- åæ»èæ¬ï¼å¦éåæ»ï¼æ§è¡ä»¥ä¸è¯å¥ï¼ |
| | | -- ===================================================== |
| | | |
| | | /* |
| | | -- å 餿°å¢è¡¨ |
| | | DROP TABLE IF EXISTS `wms_inventory_reserve`; |
| | | DROP TABLE IF EXISTS `wms_inventory_transaction`; |
| | | |
| | | -- å é¤åå
¸ |
| | | DELETE FROM `system_dict_type` WHERE `type` = 'wms_reserve_biz_type'; |
| | | DELETE FROM `system_dict_data` WHERE `dict_type` = 'wms_reserve_biz_type'; |
| | | DELETE FROM `system_dict_type` WHERE `type` = 'wms_transaction_type'; |
| | | DELETE FROM `system_dict_data` WHERE `dict_type` = 'wms_transaction_type'; |
| | | DELETE FROM `system_dict_type` WHERE `type` = 'wms_reserve_status'; |
| | | DELETE FROM `system_dict_data` WHERE `dict_type` = 'wms_reserve_status'; |
| | | |
| | | -- å é¤èå |
| | | DELETE FROM `system_menu` WHERE `path` = 'reserve' AND `name` = 'åºåé¢ç'; |
| | | DELETE FROM `system_menu` WHERE `permission` LIKE 'wms:inventory-reserve:%'; |
| | | */ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # Batch 1: WMS API 模å建设 - åç«¯ä¿®æ¹ææ¡£ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - æ°å¢é¡µé¢ï¼åºåé¢ç管çé¡µé¢ |
| | | - ä¿®æ¹é¡µé¢ï¼åºåæ¥è¯¢é¡µé¢ï¼æ°å¢é¢çæ°éæ¾ç¤ºï¼ |
| | | |
| | | --- |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /wms/inventory-reserve/page | åºåé¢çå页æ¥è¯¢ | |
| | | | POST | /wms/inventory-reserve/release | éæ¾åºåé¢ç | |
| | | | GET | /wms/inventory-reserve/get | è·åé¢ç详æ
| |
| | | |
| | | **请æ±åæ°ï¼å页æ¥è¯¢ï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | pageNo | Integer | æ¯ | 页ç | |
| | | | pageSize | Integer | æ¯ | æ¯é¡µæ°é | |
| | | | reserveNo | String | å¦ | é¢çåå· | |
| | | | bizType | Integer | å¦ | ä¸å¡ç±»å | |
| | | | bizNo | String | å¦ | ä¸å¡åæ®å· | |
| | | | status | Integer | å¦ | ç¶æ | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "list": [ |
| | | { |
| | | "id": 1, |
| | | "reserveNo": "RES202606260001", |
| | | "bizType": 10, |
| | | "bizTypeName": "éå®é¢ç", |
| | | "bizId": 100, |
| | | "bizNo": "SO202606260001", |
| | | "skuId": 1, |
| | | "skuName": "ååA-红è²-L", |
| | | "warehouseId": 1, |
| | | "warehouseName": "主ä»åº", |
| | | "reserveQuantity": 100.00, |
| | | "usedQuantity": 0.00, |
| | | "status": 0, |
| | | "statusName": "é¢çä¸", |
| | | "expireTime": "2026-06-30 00:00:00", |
| | | "createTime": "2026-06-26 10:00:00" |
| | | } |
| | | ], |
| | | "total": 1 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. æ°å¢åºåé¢ç管çé¡µé¢ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `src/views/wms/inventory/reserve/index.vue` |
| | | |
| | | ```vue |
| | | <template> |
| | | <ContentWrap> |
| | | <!-- æç´¢ --> |
| | | <el-form |
| | | class="-mb-15px" |
| | | :model="queryParams" |
| | | :inline="true" |
| | | label-width="68px" |
| | | > |
| | | <el-form-item label="é¢çåå·" prop="reserveNo"> |
| | | <el-input |
| | | v-model="queryParams.reserveNo" |
| | | placeholder="请è¾å
¥é¢çåå·" |
| | | clearable |
| | | @keyup.enter="handleQuery" |
| | | class="!w-240px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¸å¡ç±»å" prop="bizType"> |
| | | <el-select |
| | | v-model="queryParams.bizType" |
| | | placeholder="è¯·éæ©ä¸å¡ç±»å" |
| | | clearable |
| | | class="!w-240px" |
| | | > |
| | | <el-option |
| | | v-for="dict in getIntDictOptions(DICT_TYPE.WMS_RESERVE_BIZ_TYPE)" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-select |
| | | v-model="queryParams.status" |
| | | placeholder="è¯·éæ©ç¶æ" |
| | | clearable |
| | | class="!w-240px" |
| | | > |
| | | <el-option |
| | | v-for="dict in getIntDictOptions(DICT_TYPE.WMS_RESERVE_STATUS)" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" />æç´¢</el-button> |
| | | <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" />éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </ContentWrap> |
| | | |
| | | <!-- å表 --> |
| | | <ContentWrap class="mt-10px"> |
| | | <el-table v-loading="loading" :data="list" :stripe="true"> |
| | | <el-table-column label="é¢çåå·" align="center" prop="reserveNo" width="180" /> |
| | | <el-table-column label="ä¸å¡ç±»å" align="center" prop="bizTypeName" width="100" /> |
| | | <el-table-column label="ä¸å¡åæ®å·" align="center" prop="bizNo" width="180" /> |
| | | <el-table-column label="ååSKU" align="center" prop="skuName" width="200" /> |
| | | <el-table-column label="ä»åº" align="center" prop="warehouseName" width="120" /> |
| | | <el-table-column label="é¢çæ°é" align="center" prop="reserveQuantity" width="100" /> |
| | | <el-table-column label="å·²ä½¿ç¨æ°é" align="center" prop="usedQuantity" width="100" /> |
| | | <el-table-column label="ç¶æ" align="center" prop="statusName" width="100"> |
| | | <template #default="scope"> |
| | | <dict-tag :type="DICT_TYPE.WMS_RESERVE_STATUS" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="è¿ææ¶é´" |
| | | align="center" |
| | | prop="expireTime" |
| | | :formatter="dateFormatter" |
| | | width="180" |
| | | /> |
| | | <el-table-column label="æä½" align="center" fixed="right" width="100"> |
| | | <template #default="scope"> |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | @click="handleRelease(scope.row)" |
| | | v-hasPermi="['wms:inventory-reserve:release']" |
| | | v-if="scope.row.status === 0 || scope.row.status === 1" |
| | | > |
| | | éæ¾ |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <!-- å页 --> |
| | | <Pagination |
| | | :total="total" |
| | | v-model:page="queryParams.pageNo" |
| | | v-model:limit="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | </ContentWrap> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { dateFormatter } from '@/utils/formatTime' |
| | | import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' |
| | | import * as ReserveApi from '@/api/wms/inventory/reserve' |
| | | |
| | | defineOptions({ name: 'WmsInventoryReserve' }) |
| | | |
| | | const loading = ref(true) |
| | | const list = ref([]) |
| | | const total = ref(0) |
| | | const queryParams = reactive({ |
| | | pageNo: 1, |
| | | pageSize: 10, |
| | | reserveNo: undefined, |
| | | bizType: undefined, |
| | | bizNo: undefined, |
| | | status: undefined |
| | | }) |
| | | |
| | | /** æ¥è¯¢å表 */ |
| | | const getList = async () => { |
| | | loading.value = true |
| | | try { |
| | | const data = await ReserveApi.getInventoryReservePage(queryParams) |
| | | list.value = data.list |
| | | total.value = data.total |
| | | } finally { |
| | | loading.value = false |
| | | } |
| | | } |
| | | |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | | queryParams.pageNo = 1 |
| | | getList() |
| | | } |
| | | |
| | | /** éç½®æé®æä½ */ |
| | | const resetQuery = () => { |
| | | queryParams.reserveNo = undefined |
| | | queryParams.bizType = undefined |
| | | queryParams.bizNo = undefined |
| | | queryParams.status = undefined |
| | | handleQuery() |
| | | } |
| | | |
| | | /** éæ¾é¢ç */ |
| | | const handleRelease = async (row: any) => { |
| | | try { |
| | | await message.delConfirm(`ç¡®è®¤éæ¾é¢çåå·ã${row.reserveNo}ãçåºåé¢çï¼`) |
| | | await ReserveApi.releaseInventoryReserve(row.id) |
| | | message.success('éæ¾æå') |
| | | await getList() |
| | | } catch {} |
| | | } |
| | | |
| | | /** åå§å */ |
| | | onMounted(() => { |
| | | getList() |
| | | }) |
| | | </script> |
| | | ``` |
| | | |
| | | ### 2. æ°å¢ API æ¥å£æä»¶ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `src/api/wms/inventory/reserve/index.ts` |
| | | |
| | | ```typescript |
| | | import request from '@/config/axios' |
| | | |
| | | // åºåé¢çå页æ¥è¯¢ |
| | | export const getInventoryReservePage = async (params: any) => { |
| | | return await request.get({ url: '/wms/inventory-reserve/page', params }) |
| | | } |
| | | |
| | | // è·ååºåé¢ç详æ
|
| | | export const getInventoryReserve = async (id: number) => { |
| | | return await request.get({ url: '/wms/inventory-reserve/get?id=' + id }) |
| | | } |
| | | |
| | | // éæ¾åºåé¢ç |
| | | export const releaseInventoryReserve = async (id: number) => { |
| | | return await request.post({ url: '/wms/inventory-reserve/release?id=' + id }) |
| | | } |
| | | ``` |
| | | |
| | | ### 3. åå
¸ç±»åæ°å¢ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `src/utils/dict.ts` |
| | | |
| | | å¨ `DICT_TYPE` 䏿°å¢ï¼ |
| | | |
| | | ```typescript |
| | | WMS_RESERVE_BIZ_TYPE = 'wms_reserve_biz_type', |
| | | WMS_RESERVE_STATUS = 'wms_reserve_status', |
| | | WMS_TRANSACTION_TYPE = 'wms_transaction_type' |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. æ¬æ¹æ¬¡ä¸»è¦æ°å¢åºåé¢çåè½ï¼å端æ¹å¨è¾å° |
| | | 2. åºåé¢ç页颿ä¾é¢çæ¥è¯¢åæå¨éæ¾åè½ |
| | | 3. åç»æ¹æ¬¡ï¼ERP/MES éæï¼ä¼èªå¨è°ç¨é¢ç APIï¼æ éåç«¯å¹²é¢ |
| | | 4. 建议å
æ§è¡æ°æ®åºèæ¬ï¼åé¨ç½²å端代ç ï¼æåæ´æ°å端 |
| | | |
| | | --- |
| | | |
| | | ## å端æ°å¢æä»¶æ¸
å |
| | | |
| | | ``` |
| | | yudao-module-wms/src/main/java/cn/iocoder/yudao/module/wms/ |
| | | âââ api/inventory/ |
| | | â âââ WmsInventoryApi.java |
| | | â âââ WmsInventoryApiImpl.java |
| | | â âââ dto/ |
| | | â âââ WmsInventoryQueryReqDTO.java |
| | | â âââ WmsInventoryRespDTO.java |
| | | â âââ WmsReceiptReqDTO.java |
| | | â âââ WmsReceiptResultDTO.java |
| | | â âââ WmsReserveReqDTO.java |
| | | â âââ WmsShipmentReqDTO.java |
| | | â âââ WmsShipmentResultDTO.java |
| | | â âââ WmsUseReserveReqDTO.java |
| | | âââ controller/admin/inventory/ |
| | | â âââ WmsInventoryReserveController.java |
| | | â âââ vo/ |
| | | â âââ WmsInventoryReservePageReqVO.java |
| | | â âââ WmsInventoryReserveRespVO.java |
| | | âââ dal/dataobject/inventory/ |
| | | â âââ WmsInventoryReserveDO.java |
| | | â âââ WmsInventoryTransactionDO.java |
| | | âââ dal/mysql/inventory/ |
| | | â âââ WmsInventoryReserveMapper.java |
| | | â âââ WmsInventoryTransactionMapper.java |
| | | âââ enums/inventory/ |
| | | â âââ WmsInventoryBizTypeEnum.java |
| | | â âââ WmsReserveBizTypeEnum.java |
| | | â âââ WmsReserveStatusEnum.java |
| | | â âââ WmsTransactionTypeEnum.java |
| | | âââ service/inventory/ |
| | | âââ WmsInventoryReserveService.java |
| | | âââ WmsInventoryReserveServiceImpl.java |
| | | âââ WmsInventoryTransactionService.java |
| | | âââ WmsInventoryTransactionServiceImpl.java |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | **ææ¡£çæ¬**: v1.0 |
| | | **åå»ºæ¥æ**: 2026-06-26 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- Batch 2: ERP éè´è®¢å审æ¹éæ - æ°æ®åºåæ´èæ¬ |
| | | -- çæ¬: v1.0 |
| | | -- æ¥æ: 2026-06-26 |
| | | -- 说æ: 为 ERP éè´è®¢åæ·»å BPM æµç¨å®¡æ¹éæ |
| | | -- ===================================================== |
| | | |
| | | -- ===================================================== |
| | | -- 1. ä¿®æ¹éè´è®¢åè¡¨ï¼æ°å¢æµç¨å®ä¾å段 |
| | | -- ===================================================== |
| | | |
| | | -- æ°å¢æµç¨å®ä¾ç¼å·å段 |
| | | ALTER TABLE `erp_purchase_order` |
| | | ADD COLUMN `process_instance_id` VARCHAR(64) DEFAULT NULL COMMENT 'BPM æµç¨å®ä¾ç¼å·' AFTER `remark`; |
| | | |
| | | -- ===================================================== |
| | | -- 2. æ°æ®åå
¸ä¿®æ¹ï¼å®¡æ ¸ç¶æï¼ |
| | | -- ===================================================== |
| | | |
| | | -- 注æï¼ERP å®¡æ ¸ç¶æå·²æåå
¸æ°æ®ï¼è¿éä»
è¡¥å
æ°å¢ç¶æ |
| | | -- å PROCESS(10) ä»"æªå®¡æ ¸"æ¹ä¸º"审æ¹ä¸" |
| | | -- å APPROVE(20) ä»"å·²å®¡æ ¸"æ¹ä¸º"审æ¹éè¿" |
| | | -- æ°å¢ DRAFT(0) èç¨¿ç¶æ |
| | | -- æ°å¢ REJECT(30) 审æ¹ä¸éè¿ç¶æ |
| | | |
| | | -- æ´æ°ç°æåå
¸æ°æ®çæ ç¾ |
| | | UPDATE `system_dict_data` |
| | | SET `label` = '审æ¹ä¸' |
| | | WHERE `dict_type` = 'erp_audit_status' AND `value` = '10'; |
| | | |
| | | UPDATE `system_dict_data` |
| | | SET `label` = '审æ¹éè¿' |
| | | WHERE `dict_type` = 'erp_audit_status' AND `value` = '20'; |
| | | |
| | | -- æ°å¢èç¨¿ç¶æï¼å¦æä¸åå¨ï¼ |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 0, 'è稿', '0', 'erp_audit_status', 0, 'info', '', '订åèç¨¿ç¶æ', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'erp_audit_status' AND `value` = '0'); |
| | | |
| | | -- æ°å¢å®¡æ¹ä¸éè¿ç¶æï¼å¦æä¸åå¨ï¼ |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 30, '审æ¹ä¸éè¿', '30', 'erp_audit_status', 0, 'danger', '', '审æ¹ä¸éè¿', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'erp_audit_status' AND `value` = '30'); |
| | | |
| | | -- ===================================================== |
| | | -- 3. èåæ°å¢ï¼æäº¤å®¡æ¹æé®ï¼ |
| | | -- ===================================================== |
| | | |
| | | -- è·åéè´è®¢åèåID |
| | | SET @purchase_order_menu_id = (SELECT `id` FROM `system_menu` WHERE `path` = 'purchase-order' AND `deleted` = b'0' LIMIT 1); |
| | | |
| | | -- 妿éè´è®¢åèåä¸åå¨ï¼å°è¯éè¿åç§°æ¥æ¾ |
| | | SET @purchase_order_menu_id = IFNULL(@purchase_order_menu_id, |
| | | (SELECT `id` FROM `system_menu` WHERE `name` = 'éè´è®¢å' AND `deleted` = b'0' LIMIT 1)); |
| | | |
| | | -- æ°å¢æäº¤å®¡æ¹æé® |
| | | INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 'éè´è®¢åæäº¤å®¡æ¹', 'erp:purchase-order:submit', 3, 10, @purchase_order_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE @purchase_order_menu_id IS NOT NULL |
| | | ON DUPLICATE KEY UPDATE `permission` = 'erp:purchase-order:submit'; |
| | | |
| | | -- ===================================================== |
| | | -- 4. BPM æµç¨å®ä¹ï¼éè¦å¨å端å建æµç¨æ¨¡åï¼ |
| | | -- ===================================================== |
| | | |
| | | -- æç¤ºï¼è¯·å¨ BPM 管çåå°å建æµç¨æ¨¡å |
| | | -- æµç¨æ è¯ï¼Keyï¼ï¼erp-purchase-order-audit |
| | | -- æµç¨åç§°ï¼ERP éè´è®¢åå®¡æ¹æµç¨ |
| | | -- ä¸å¡å
³èï¼éè´è®¢å ID |
| | | |
| | | -- ===================================================== |
| | | -- åæ»èæ¬ï¼å¦éåæ»ï¼æ§è¡ä»¥ä¸è¯å¥ï¼ |
| | | -- ===================================================== |
| | | |
| | | /* |
| | | -- å 餿°å¢å段 |
| | | ALTER TABLE `erp_purchase_order` DROP COLUMN `process_instance_id`; |
| | | |
| | | -- æ¢å¤åå
¸æ°æ®æ ç¾ |
| | | UPDATE `system_dict_data` SET `label` = 'æªå®¡æ ¸' WHERE `dict_type` = 'erp_audit_status' AND `value` = '10'; |
| | | UPDATE `system_dict_data` SET `label` = 'å·²å®¡æ ¸' WHERE `dict_type` = 'erp_audit_status' AND `value` = '20'; |
| | | |
| | | -- å 餿°å¢åå
¸æ°æ® |
| | | DELETE FROM `system_dict_data` WHERE `dict_type` = 'erp_audit_status' AND `value` = '0'; |
| | | DELETE FROM `system_dict_data` WHERE `dict_type` = 'erp_audit_status' AND `value` = '30'; |
| | | |
| | | -- å 餿°å¢èå |
| | | DELETE FROM `system_menu` WHERE `permission` = 'erp:purchase-order:submit'; |
| | | */ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # Batch 2: ERP éè´è®¢å审æ¹éæ - åç«¯ä¿®æ¹ææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬æ¹æ¬¡ä¸º ERP éè´è®¢å模åéæ BPM æµç¨å®¡æ¹åè½ï¼å®ç°éè´è®¢åçå®¡æ¹æµç¨å管çã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ä¿®æ¹é¡µé¢ï¼éè´è®¢å管ç页é¢ï¼æ°å¢æäº¤å®¡æ¹ã审æ¹ç¶æå±ç¤ºï¼ |
| | | - æ°å¢é
ç½®ï¼BPM æµç¨æ¨¡åé
ç½® |
| | | |
| | | --- |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /erp/purchase-order/submit | æäº¤éè´è®¢åå®¡æ¹ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | éè´è®¢åç¼å· | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": true, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. éè´è®¢åå表页é¢ä¿®æ¹ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `src/views/erp/purchase/order/index.vue` |
| | | |
| | | #### 1.1 æ°å¢æäº¤å®¡æ¹æé® |
| | | |
| | | 卿ä½åæ°å¢"æäº¤å®¡æ¹"æé®ï¼ä»
èç¨¿ç¶æå¯è§ï¼ |
| | | |
| | | ```vue |
| | | <el-table-column label="æä½" align="center" fixed="right" width="200"> |
| | | <template #default="scope"> |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | @click="handleUpdate(scope.row.id)" |
| | | v-hasPermi="['erp:purchase-order:update']" |
| | | v-if="scope.row.status === 0" |
| | | > |
| | | ç¼è¾ |
| | | </el-button> |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | @click="handleSubmit(scope.row.id)" |
| | | v-hasPermi="['erp:purchase-order:update']" |
| | | v-if="scope.row.status === 0" |
| | | > |
| | | æäº¤å®¡æ¹ |
| | | </el-button> |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | @click="handleApprove(scope.row.id)" |
| | | v-hasPermi="['erp:purchase-order:update-status']" |
| | | v-if="scope.row.status === 10" |
| | | > |
| | | 审æ¹éè¿ |
| | | </el-button> |
| | | <el-button |
| | | link |
| | | type="danger" |
| | | @click="handleDelete(scope.row.id)" |
| | | v-hasPermi="['erp:purchase-order:delete']" |
| | | v-if="scope.row.status === 0 || scope.row.status === 30" |
| | | > |
| | | å é¤ |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | ``` |
| | | |
| | | #### 1.2 æ°å¢æäº¤å®¡æ¹æ¹æ³ |
| | | |
| | | ```typescript |
| | | /** æäº¤å®¡æ¹ */ |
| | | const handleSubmit = async (id: number) => { |
| | | try { |
| | | await message.confirm('确认æäº¤è¯¥éè´è®¢åè¿è¡å®¡æ¹ï¼') |
| | | await PurchaseOrderApi.submitPurchaseOrder(id) |
| | | message.success('æäº¤æå') |
| | | await getList() |
| | | } catch {} |
| | | } |
| | | ``` |
| | | |
| | | #### 1.3 ä¿®æ¹ç¶æåæ¾ç¤º |
| | | |
| | | ```vue |
| | | <el-table-column label="ç¶æ" align="center" prop="status" width="100"> |
| | | <template #default="scope"> |
| | | <dict-tag :type="DICT_TYPE.ERP_AUDIT_STATUS" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | ``` |
| | | |
| | | ### 2. API æ¥å£æä»¶ä¿®æ¹ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `src/api/erp/purchase/order/index.ts` |
| | | |
| | | æ°å¢æäº¤å®¡æ¹æ¥å£ï¼ |
| | | |
| | | ```typescript |
| | | // æäº¤éè´è®¢åå®¡æ¹ |
| | | export const submitPurchaseOrder = async (id: number) => { |
| | | return await request.post({ url: '/erp/purchase-order/submit?id=' + id }) |
| | | } |
| | | ``` |
| | | |
| | | ### 3. åå
¸ç±»å确认 |
| | | |
| | | **æä»¶è·¯å¾ï¼** `src/utils/dict.ts` |
| | | |
| | | ç¡®ä¿ `DICT_TYPE` ä¸å·²å
å«ï¼ |
| | | |
| | | ```typescript |
| | | ERP_AUDIT_STATUS = 'erp_audit_status' |
| | | ``` |
| | | |
| | | åå
¸æ°æ®éè¦å
å«ä»¥ä¸å¼ï¼ |
| | | - 0: è稿ï¼info é¢è²ï¼ |
| | | - 10: 审æ¹ä¸ï¼warning é¢è²ï¼ |
| | | - 20: 审æ¹éè¿ï¼success é¢è²ï¼ |
| | | - 30: 审æ¹ä¸éè¿ï¼danger é¢è²ï¼ |
| | | |
| | | --- |
| | | |
| | | ## BPM æµç¨æ¨¡åé
ç½® |
| | | |
| | | ### æµç¨æ¨¡åä¿¡æ¯ |
| | | |
| | | å¨ BPM 管çåå°å建æµç¨æ¨¡åï¼ |
| | | |
| | | | é
置项 | å¼ | |
| | | |--------|-----| |
| | | | æµç¨æ è¯ï¼Keyï¼ | erp-purchase-order-audit | |
| | | | æµç¨åç§° | ERP éè´è®¢åå®¡æ¹æµç¨ | |
| | | | æµç¨åç±» | ä¸å¡æµç¨ | |
| | | |
| | | ### æµç¨è®¾è®¡å»ºè®® |
| | | |
| | | ``` |
| | | å¼å§èç¹ â é¨é¨ä¸»ç®¡å®¡æ¹ â éè´ç»çå®¡æ¹ â ç»æèç¹ |
| | | ``` |
| | | |
| | | 审æ¹ç»æï¼ |
| | | - éè¿ï¼ç¶æå为 20ï¼å®¡æ¹éè¿ï¼ |
| | | - ä¸éè¿ï¼ç¶æå为 30ï¼å®¡æ¹ä¸éè¿ï¼ |
| | | - åæ¶ï¼ç¶æå为 0ï¼èç¨¿ï¼ |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. å建éè´è®¢åæ¶ï¼é»è®¤ç¶æä»"æªå®¡æ ¸"æ¹ä¸º"è稿" |
| | | 2. åªæèç¨¿ç¶æç订åæè½æäº¤å®¡æ¹ |
| | | 3. 审æ¹ä¸ç订åä¸è½ç¼è¾åå é¤ |
| | | 4. 审æ¹ä¸éè¿ç订åå¯ä»¥éæ°ç¼è¾å忬¡æäº¤ |
| | | 5. éè¦å
æ§è¡æ°æ®åºèæ¬ï¼åé¨ç½²å端代ç |
| | | 6. éè¦å¨ BPM 管çåå°å建æµç¨æ¨¡åï¼Key: erp-purchase-order-auditï¼ |
| | | |
| | | --- |
| | | |
| | | ## å端æ°å¢/ä¿®æ¹æä»¶æ¸
å |
| | | |
| | | ``` |
| | | yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/ |
| | | âââ enums/ |
| | | â âââ ErpAuditStatus.java (ä¿®æ¹ï¼æ°å¢ DRAFTãREJECT ç¶æ) |
| | | â âââ ErrorCodeConstants.java (ä¿®æ¹ï¼æ°å¢é误ç ) |
| | | âââ dal/dataobject/purchase/ |
| | | â â ErpPurchaseOrderDO.java (ä¿®æ¹ï¼æ°å¢ processInstanceId åæ®µ) |
| | | âââ service/purchase/ |
| | | â âââ ErpPurchaseOrderService.java (ä¿®æ¹ï¼æ°å¢æ¥å£æ¹æ³) |
| | | â âââ ErpPurchaseOrderServiceImpl.java (ä¿®æ¹ï¼å®ç° BPM éæ) |
| | | â âââ listener/ |
| | | â âââ ErpPurchaseOrderStatusListener.java (æ°å¢ï¼å®¡æ¹ç¶æçå¬å¨) |
| | | âââ controller/admin/purchase/ |
| | | â ErpPurchaseOrderController.java (ä¿®æ¹ï¼æ°å¢æäº¤å®¡æ¹æ¥å£) |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ç¶ææµè½¬å¾ |
| | | |
| | | ``` |
| | | âââââââââââââââ |
| | | â è稿 â |
| | | â (status=0)â |
| | | ââââââââ¬âââââââ |
| | | â æäº¤å®¡æ¹ |
| | | â |
| | | âââââââââââââââ |
| | | â 审æ¹ä¸ â |
| | | â (status=10)â |
| | | ââââââââ¬âââââââ |
| | | â 审æ¹ç»æ |
| | | ââââââââââââââââ¬âââââââââââââââ |
| | | â â â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â 审æ¹éè¿ â â 审æ¹ä¸éè¿ â â åæ¶ â |
| | | â (status=20) â â (status=30) â â (status=0) â |
| | | âââââââââââââââ ââââââââ¬âââââââ âââââââââââââââ |
| | | â éæ°ç¼è¾ |
| | | ââââââââââââââââ |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | **ææ¡£çæ¬**: v1.0 |
| | | **åå»ºæ¥æ**: 2026-06-26 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- Batch 3: ERP éå®è®¢å审æ¹éæ - æ°æ®åºåæ´èæ¬ |
| | | -- çæ¬: v1.0 |
| | | -- æ¥æ: 2026-06-26 |
| | | -- 说æ: 为 ERP éå®è®¢åæ·»å BPM æµç¨å®¡æ¹éæ |
| | | -- ===================================================== |
| | | |
| | | -- ===================================================== |
| | | -- 1. ä¿®æ¹éå®è®¢åè¡¨ï¼æ°å¢æµç¨å®ä¾å段 |
| | | -- ===================================================== |
| | | |
| | | -- æ°å¢æµç¨å®ä¾ç¼å·å段 |
| | | ALTER TABLE `erp_sale_order` |
| | | ADD COLUMN `process_instance_id` VARCHAR(64) DEFAULT NULL COMMENT 'BPM æµç¨å®ä¾ç¼å·' AFTER `remark`; |
| | | |
| | | -- ===================================================== |
| | | -- 2. èåæ°å¢ï¼æäº¤å®¡æ¹æé®ï¼ |
| | | -- ===================================================== |
| | | |
| | | -- è·åéå®è®¢åèåID |
| | | SET @sale_order_menu_id = (SELECT `id` FROM `system_menu` WHERE `path` = 'sale-order' AND `deleted` = b'0' LIMIT 1); |
| | | |
| | | -- 妿éå®è®¢åèåä¸åå¨ï¼å°è¯éè¿åç§°æ¥æ¾ |
| | | SET @sale_order_menu_id = IFNULL(@sale_order_menu_id, |
| | | (SELECT `id` FROM `system_menu` WHERE `name` = 'éå®è®¢å' AND `deleted` = b'0' LIMIT 1)); |
| | | |
| | | -- æ°å¢æäº¤å®¡æ¹æé® |
| | | INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 'éå®è®¢åæäº¤å®¡æ¹', 'erp:sale-order:submit', 3, 10, @sale_order_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE @sale_order_menu_id IS NOT NULL |
| | | ON DUPLICATE KEY UPDATE `permission` = 'erp:sale-order:submit'; |
| | | |
| | | -- ===================================================== |
| | | -- 3. BPM æµç¨å®ä¹ï¼éè¦å¨å端å建æµç¨æ¨¡åï¼ |
| | | -- ===================================================== |
| | | |
| | | -- æç¤ºï¼è¯·å¨ BPM 管çåå°å建æµç¨æ¨¡å |
| | | -- æµç¨æ è¯ï¼Keyï¼ï¼erp-sale-order-audit |
| | | -- æµç¨åç§°ï¼ERP éå®è®¢åå®¡æ¹æµç¨ |
| | | -- ä¸å¡å
³èï¼éå®è®¢å ID |
| | | |
| | | -- ===================================================== |
| | | -- åæ»èæ¬ï¼å¦éåæ»ï¼æ§è¡ä»¥ä¸è¯å¥ï¼ |
| | | -- ===================================================== |
| | | |
| | | /* |
| | | -- å 餿°å¢å段 |
| | | ALTER TABLE `erp_sale_order` DROP COLUMN `process_instance_id`; |
| | | |
| | | -- å 餿°å¢èå |
| | | DELETE FROM `system_menu` WHERE `permission` = 'erp:sale-order:submit'; |
| | | */ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # Batch 3: ERP éå®è®¢å审æ¹éæ - åç«¯ä¿®æ¹ææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬æ¹æ¬¡ä¸º ERP éå®è®¢å模åéæ BPM æµç¨å®¡æ¹åè½ï¼å®ç°éå®è®¢åçå®¡æ¹æµç¨å管çãä¸ Batch 2 éè´è®¢å审æ¹éæç±»ä¼¼ã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ä¿®æ¹é¡µé¢ï¼éå®è®¢å管ç页é¢ï¼æ°å¢æäº¤å®¡æ¹ã审æ¹ç¶æå±ç¤ºï¼ |
| | | - æ°å¢é
ç½®ï¼BPM æµç¨æ¨¡åé
ç½® |
| | | |
| | | --- |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /erp/sale-order/submit | æäº¤éå®è®¢åå®¡æ¹ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | éå®è®¢åç¼å· | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": true, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. éå®è®¢åå表页é¢ä¿®æ¹ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `src/views/erp/sale/order/index.vue` |
| | | |
| | | #### 1.1 æ°å¢æäº¤å®¡æ¹æé® |
| | | |
| | | 卿ä½åæ°å¢"æäº¤å®¡æ¹"æé®ï¼ä»
èç¨¿ç¶æå¯è§ï¼ |
| | | |
| | | ```vue |
| | | <el-table-column label="æä½" align="center" fixed="right" width="200"> |
| | | <template #default="scope"> |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | @click="handleUpdate(scope.row.id)" |
| | | v-hasPermi="['erp:sale-order:update']" |
| | | v-if="scope.row.status === 0" |
| | | > |
| | | ç¼è¾ |
| | | </el-button> |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | @click="handleSubmit(scope.row.id)" |
| | | v-hasPermi="['erp:sale-order:update']" |
| | | v-if="scope.row.status === 0" |
| | | > |
| | | æäº¤å®¡æ¹ |
| | | </el-button> |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | @click="handleApprove(scope.row.id)" |
| | | v-hasPermi="['erp:sale-order:update-status']" |
| | | v-if="scope.row.status === 10" |
| | | > |
| | | 审æ¹éè¿ |
| | | </el-button> |
| | | <el-button |
| | | link |
| | | type="danger" |
| | | @click="handleDelete(scope.row.id)" |
| | | v-hasPermi="['erp:sale-order:delete']" |
| | | v-if="scope.row.status === 0 || scope.row.status === 30" |
| | | > |
| | | å é¤ |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | ``` |
| | | |
| | | #### 1.2 æ°å¢æäº¤å®¡æ¹æ¹æ³ |
| | | |
| | | ```typescript |
| | | /** æäº¤å®¡æ¹ */ |
| | | const handleSubmit = async (id: number) => { |
| | | try { |
| | | await message.confirm('确认æäº¤è¯¥éå®è®¢åè¿è¡å®¡æ¹ï¼') |
| | | await SaleOrderApi.submitSaleOrder(id) |
| | | message.success('æäº¤æå') |
| | | await getList() |
| | | } catch {} |
| | | } |
| | | ``` |
| | | |
| | | #### 1.3 ä¿®æ¹ç¶æåæ¾ç¤º |
| | | |
| | | ```vue |
| | | <el-table-column label="ç¶æ" align="center" prop="status" width="100"> |
| | | <template #default="scope"> |
| | | <dict-tag :type="DICT_TYPE.ERP_AUDIT_STATUS" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | ``` |
| | | |
| | | ### 2. API æ¥å£æä»¶ä¿®æ¹ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `src/api/erp/sale/order/index.ts` |
| | | |
| | | æ°å¢æäº¤å®¡æ¹æ¥å£ï¼ |
| | | |
| | | ```typescript |
| | | // æäº¤éå®è®¢åå®¡æ¹ |
| | | export const submitSaleOrder = async (id: number) => { |
| | | return await request.post({ url: '/erp/sale-order/submit?id=' + id }) |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## BPM æµç¨æ¨¡åé
ç½® |
| | | |
| | | ### æµç¨æ¨¡åä¿¡æ¯ |
| | | |
| | | å¨ BPM 管çåå°å建æµç¨æ¨¡åï¼ |
| | | |
| | | | é
置项 | å¼ | |
| | | |--------|-----| |
| | | | æµç¨æ è¯ï¼Keyï¼ | erp-sale-order-audit | |
| | | | æµç¨åç§° | ERP éå®è®¢åå®¡æ¹æµç¨ | |
| | | | æµç¨åç±» | ä¸å¡æµç¨ | |
| | | |
| | | ### æµç¨è®¾è®¡å»ºè®® |
| | | |
| | | ``` |
| | | å¼å§èç¹ â éå®ä¸»ç®¡å®¡æ¹ â è´¢å¡å®¡æ¹ â ç»æèç¹ |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. å建éå®è®¢åæ¶ï¼é»è®¤ç¶æä»"æªå®¡æ ¸"æ¹ä¸º"è稿" |
| | | 2. åªæèç¨¿ç¶æç订åæè½æäº¤å®¡æ¹ |
| | | 3. 审æ¹ä¸ç订åä¸è½ç¼è¾åå é¤ |
| | | 4. 审æ¹ä¸éè¿ç订åå¯ä»¥éæ°ç¼è¾å忬¡æäº¤ |
| | | 5. éè¦å
æ§è¡æ°æ®åºèæ¬ï¼åé¨ç½²å端代ç |
| | | 6. éè¦å¨ BPM 管çåå°å建æµç¨æ¨¡åï¼Key: erp-sale-order-auditï¼ |
| | | |
| | | --- |
| | | |
| | | ## å端æ°å¢/ä¿®æ¹æä»¶æ¸
å |
| | | |
| | | ``` |
| | | yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/ |
| | | âââ enums/ |
| | | â âââ ErrorCodeConstants.java (ä¿®æ¹ï¼æ°å¢é误ç ) |
| | | âââ dal/dataobject/sale/ |
| | | â âââ ErpSaleOrderDO.java (ä¿®æ¹ï¼æ°å¢ processInstanceId åæ®µ) |
| | | âââ service/sale/ |
| | | â âââ ErpSaleOrderService.java (ä¿®æ¹ï¼æ°å¢æ¥å£æ¹æ³) |
| | | â âââ ErpSaleOrderServiceImpl.java (ä¿®æ¹ï¼å®ç° BPM éæ) |
| | | â âââ listener/ |
| | | â âââ ErpSaleOrderStatusListener.java (æ°å¢ï¼å®¡æ¹ç¶æçå¬å¨) |
| | | âââ controller/admin/sale/ |
| | | âââ ErpSaleOrderController.java (ä¿®æ¹ï¼æ°å¢æäº¤å®¡æ¹æ¥å£) |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | **ææ¡£çæ¬**: v1.0 |
| | | **åå»ºæ¥æ**: 2026-06-26 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- Batch 4: ERP éè´å
¥åºå审æ¹éæ - æ°æ®åºåæ´èæ¬ |
| | | -- çæ¬: v1.0 |
| | | -- æ¥æ: 2026-06-26 |
| | | -- 说æ: 为 ERP éè´å
¥åºåæ·»å BPM æµç¨å®¡æ¹éæ |
| | | -- ===================================================== |
| | | |
| | | -- ===================================================== |
| | | -- 1. ä¿®æ¹éè´å
¥åºè¡¨ï¼æ°å¢æµç¨å®ä¾å段 |
| | | -- ===================================================== |
| | | |
| | | -- æ°å¢æµç¨å®ä¾ç¼å·å段 |
| | | ALTER TABLE `erp_purchase_in` |
| | | ADD COLUMN `process_instance_id` VARCHAR(64) DEFAULT NULL COMMENT 'BPM æµç¨å®ä¾ç¼å·' AFTER `remark`; |
| | | |
| | | -- ===================================================== |
| | | -- 2. èåæ°å¢ï¼æäº¤å®¡æ¹æé®ï¼ |
| | | -- ===================================================== |
| | | |
| | | -- è·åéè´å
¥åºèåID |
| | | SET @purchase_in_menu_id = (SELECT `id` FROM `system_menu` WHERE `path` = 'purchase-in' AND `deleted` = b'0' LIMIT 1); |
| | | |
| | | -- 妿éè´å
¥åºèåä¸åå¨ï¼å°è¯éè¿åç§°æ¥æ¾ |
| | | SET @purchase_in_menu_id = IFNULL(@purchase_in_menu_id, |
| | | (SELECT `id` FROM `system_menu` WHERE `name` = 'éè´å
¥åº' AND `deleted` = b'0' LIMIT 1)); |
| | | |
| | | -- æ°å¢æäº¤å®¡æ¹æé® |
| | | INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 'éè´å
¥åºæäº¤å®¡æ¹', 'erp:purchase-in:submit', 3, 10, @purchase_in_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE @purchase_in_menu_id IS NOT NULL |
| | | ON DUPLICATE KEY UPDATE `permission` = 'erp:purchase-in:submit'; |
| | | |
| | | -- ===================================================== |
| | | -- 3. BPM æµç¨å®ä¹ï¼éè¦å¨å端å建æµç¨æ¨¡åï¼ |
| | | -- ===================================================== |
| | | |
| | | -- æç¤ºï¼è¯·å¨ BPM 管çåå°å建æµç¨æ¨¡å |
| | | -- æµç¨æ è¯ï¼Keyï¼ï¼erp-purchase-in-audit |
| | | -- æµç¨åç§°ï¼ERP éè´å
¥åºå®¡æ¹æµç¨ |
| | | -- ä¸å¡å
³èï¼éè´å
¥åºå ID |
| | | |
| | | -- ===================================================== |
| | | -- åæ»èæ¬ï¼å¦éåæ»ï¼æ§è¡ä»¥ä¸è¯å¥ï¼ |
| | | -- ===================================================== |
| | | |
| | | /* |
| | | -- å 餿°å¢å段 |
| | | ALTER TABLE `erp_purchase_in` DROP COLUMN `process_instance_id`; |
| | | |
| | | -- å 餿°å¢èå |
| | | DELETE FROM `system_menu` WHERE `permission` = 'erp:purchase-in:submit'; |
| | | */ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # Batch 4: ERP éè´å
¥åºå审æ¹éæ - åç«¯ä¿®æ¹ææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬æ¹æ¬¡ä¸º ERP éè´å
¥åºå模åéæ BPM æµç¨å®¡æ¹åè½ãéè´å
¥åºå审æ¹éè¿åä¼èªå¨å¢å åºåã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ä¿®æ¹é¡µé¢ï¼éè´å
¥åºç®¡ç页é¢ï¼æ°å¢æäº¤å®¡æ¹ã审æ¹ç¶æå±ç¤ºï¼ |
| | | |
| | | --- |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /erp/purchase-in/submit | æäº¤éè´å
¥åºå®¡æ¹ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | éè´å
¥åºåç¼å· | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": true, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. éè´å
¥åºå表页é¢ä¿®æ¹ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `src/views/erp/purchase/in/index.vue` |
| | | |
| | | #### 1.1 æ°å¢æäº¤å®¡æ¹æé® |
| | | |
| | | ```vue |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | @click="handleSubmit(scope.row.id)" |
| | | v-hasPermi="['erp:purchase-in:update']" |
| | | v-if="scope.row.status === 0" |
| | | > |
| | | æäº¤å®¡æ¹ |
| | | </el-button> |
| | | ``` |
| | | |
| | | #### 1.2 æ°å¢æäº¤å®¡æ¹æ¹æ³ |
| | | |
| | | ```typescript |
| | | /** æäº¤å®¡æ¹ */ |
| | | const handleSubmit = async (id: number) => { |
| | | try { |
| | | await message.confirm('确认æäº¤è¯¥éè´å
¥åºåè¿è¡å®¡æ¹ï¼å®¡æ¹éè¿åå°å¢å åºå') |
| | | await PurchaseInApi.submitPurchaseIn(id) |
| | | message.success('æäº¤æå') |
| | | await getList() |
| | | } catch {} |
| | | } |
| | | ``` |
| | | |
| | | ### 2. API æ¥å£æä»¶ä¿®æ¹ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `src/api/erp/purchase/in/index.ts` |
| | | |
| | | ```typescript |
| | | // æäº¤éè´å
¥åºå®¡æ¹ |
| | | export const submitPurchaseIn = async (id: number) => { |
| | | return await request.post({ url: '/erp/purchase-in/submit?id=' + id }) |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. éè´å
¥åºå审æ¹éè¿åä¼èªå¨å¢å åºå |
| | | 2. 审æ¹ä¸éè¿æåæ¶ä¸ä¼åæ´åºå |
| | | 3. BPM æµç¨ Keyï¼`erp-purchase-in-audit` |
| | | |
| | | --- |
| | | |
| | | **ææ¡£çæ¬**: v1.0 |
| | | **åå»ºæ¥æ**: 2026-06-26 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- Batch 5: ERP éå®åºåºå审æ¹éæ - æ°æ®åºåæ´èæ¬ |
| | | -- çæ¬: v1.0 |
| | | -- æ¥æ: 2026-06-26 |
| | | -- 说æ: 为 ERP éå®åºåºåæ·»å BPM æµç¨å®¡æ¹éæ |
| | | -- ===================================================== |
| | | |
| | | -- ===================================================== |
| | | -- 1. ä¿®æ¹éå®åºåºè¡¨ï¼æ°å¢æµç¨å®ä¾å段 |
| | | -- ===================================================== |
| | | |
| | | -- æ°å¢æµç¨å®ä¾ç¼å·å段 |
| | | ALTER TABLE `erp_sale_out` |
| | | ADD COLUMN `process_instance_id` VARCHAR(64) DEFAULT NULL COMMENT 'BPM æµç¨å®ä¾ç¼å·' AFTER `remark`; |
| | | |
| | | -- ===================================================== |
| | | -- 2. èåæ°å¢ï¼æäº¤å®¡æ¹æé®ï¼ |
| | | -- ===================================================== |
| | | |
| | | -- è·åéå®åºåºèåID |
| | | SET @sale_out_menu_id = (SELECT `id` FROM `system_menu` WHERE `path` = 'sale-out' AND `deleted` = b'0' LIMIT 1); |
| | | |
| | | -- 妿éå®åºåºèåä¸åå¨ï¼å°è¯éè¿åç§°æ¥æ¾ |
| | | SET @sale_out_menu_id = IFNULL(@sale_out_menu_id, |
| | | (SELECT `id` FROM `system_menu` WHERE `name` = 'éå®åºåº' AND `deleted` = b'0' LIMIT 1)); |
| | | |
| | | -- æ°å¢æäº¤å®¡æ¹æé® |
| | | INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 'éå®åºåºæäº¤å®¡æ¹', 'erp:sale-out:submit', 3, 10, @sale_out_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE @sale_out_menu_id IS NOT NULL |
| | | ON DUPLICATE KEY UPDATE `permission` = 'erp:sale-out:submit'; |
| | | |
| | | -- ===================================================== |
| | | -- 3. BPM æµç¨å®ä¹ï¼éè¦å¨å端å建æµç¨æ¨¡åï¼ |
| | | -- ===================================================== |
| | | |
| | | -- æç¤ºï¼è¯·å¨ BPM 管çåå°å建æµç¨æ¨¡å |
| | | -- æµç¨æ è¯ï¼Keyï¼ï¼erp-sale-out-audit |
| | | -- æµç¨åç§°ï¼ERP éå®åºåºå®¡æ¹æµç¨ |
| | | -- ä¸å¡å
³èï¼éå®åºåºå ID |
| | | |
| | | -- ===================================================== |
| | | -- åæ»èæ¬ï¼å¦éåæ»ï¼æ§è¡ä»¥ä¸è¯å¥ï¼ |
| | | -- ===================================================== |
| | | |
| | | /* |
| | | -- å 餿°å¢å段 |
| | | ALTER TABLE `erp_sale_out` DROP COLUMN `process_instance_id`; |
| | | |
| | | -- å 餿°å¢èå |
| | | DELETE FROM `system_menu` WHERE `permission` = 'erp:sale-out:submit'; |
| | | */ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # Batch 5: ERP éå®åºåºå审æ¹éæ - åç«¯ä¿®æ¹ææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬æ¹æ¬¡ä¸º ERP éå®åºåºå模åéæ BPM æµç¨å®¡æ¹åè½ãéå®åºåºå审æ¹éè¿åä¼èªå¨åå°åºåã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ä¿®æ¹é¡µé¢ï¼éå®åºåºç®¡ç页é¢ï¼æ°å¢æäº¤å®¡æ¹ã审æ¹ç¶æå±ç¤ºï¼ |
| | | |
| | | --- |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /erp/sale-out/submit | æäº¤éå®åºåºå®¡æ¹ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | éå®åºåºåç¼å· | |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. éå®åºåºå表页é¢ä¿®æ¹ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `src/views/erp/sale/out/index.vue` |
| | | |
| | | #### 1.1 æ°å¢æäº¤å®¡æ¹æé® |
| | | |
| | | ```vue |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | @click="handleSubmit(scope.row.id)" |
| | | v-hasPermi="['erp:sale-out:update']" |
| | | v-if="scope.row.status === 0" |
| | | > |
| | | æäº¤å®¡æ¹ |
| | | </el-button> |
| | | ``` |
| | | |
| | | #### 1.2 æ°å¢æäº¤å®¡æ¹æ¹æ³ |
| | | |
| | | ```typescript |
| | | /** æäº¤å®¡æ¹ */ |
| | | const handleSubmit = async (id: number) => { |
| | | try { |
| | | await message.confirm('确认æäº¤è¯¥éå®åºåºåè¿è¡å®¡æ¹ï¼å®¡æ¹éè¿åå°åå°åºå') |
| | | await SaleOutApi.submitSaleOut(id) |
| | | message.success('æäº¤æå') |
| | | await getList() |
| | | } catch {} |
| | | } |
| | | ``` |
| | | |
| | | ### 2. API æ¥å£æä»¶ä¿®æ¹ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `src/api/erp/sale/out/index.ts` |
| | | |
| | | ```typescript |
| | | // æäº¤éå®åºåºå®¡æ¹ |
| | | export const submitSaleOut = async (id: number) => { |
| | | return await request.post({ url: '/erp/sale-out/submit?id=' + id }) |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. éå®åºåºå审æ¹éè¿åä¼èªå¨åå°åºåï¼è´æ°åæ´ï¼ |
| | | 2. 审æ¹ä¸éè¿æåæ¶ä¸ä¼åæ´åºå |
| | | 3. BPM æµç¨ Keyï¼`erp-sale-out-audit` |
| | | |
| | | --- |
| | | |
| | | **ææ¡£çæ¬**: v1.0 |
| | | **åå»ºæ¥æ**: 2026-06-26 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- æ¹æ¬¡å
ï¼MES ç产工å BPM 审æ¹éæ |
| | | -- æ§è¡é¡ºåºï¼1 |
| | | -- ============================================= |
| | | |
| | | -- 1. 为 MES ç产工åè¡¨æ·»å æµç¨å®ä¾ç¼å·å段 |
| | | ALTER TABLE `mes_pro_work_order` ADD COLUMN `process_instance_id` VARCHAR(64) NULL COMMENT 'BPM æµç¨å®ä¾ç¼å·' AFTER `status`; |
| | | |
| | | -- 2. 为æµç¨å®ä¾ç¼å·å建索å¼ï¼å¯éï¼ç¨äºææµç¨å®ä¾æ¥è¯¢ï¼ |
| | | -- ALTER TABLE `mes_pro_work_order` ADD INDEX `idx_process_instance_id` (`process_instance_id`); |
| | | |
| | | -- 3. æ´æ°å·¥åç¶æåå
¸æ°æ®ï¼æ·»å 审æ¹ä¸ã审æ¹ä¸éè¿ç¶æï¼ |
| | | -- 注æï¼å¦æåå
¸æ°æ®å·²åå¨åå¿½ç¥ |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES |
| | | (1, '审æ¹ä¸', '1', 'mes_pro_work_order_status', 0, 'warning', '', 'MESç产工åç¶æ-审æ¹ä¸', '1', NOW(), '1', NOW(), b'0'), |
| | | (5, '审æ¹ä¸éè¿', '5', 'mes_pro_work_order_status', 0, 'danger', '', 'MESç产工åç¶æ-审æ¹ä¸éè¿', '1', NOW(), '1', NOW(), b'0') |
| | | ON DUPLICATE KEY UPDATE `updater` = '1', `update_time` = NOW(); |
| | | |
| | | -- 4. æ·»å èåæé®ï¼æäº¤å®¡æ¹ï¼ |
| | | -- å
æ¥è¯¢ç产工åèåIDï¼å设èåè·¯å¾ä¸º MES管ç > ç产管ç > ç产工åï¼ |
| | | SET @workorder_menu_id = (SELECT `id` FROM `system_menu` WHERE `name` = 'ç产工å' AND `parent_id` IN (SELECT `id` FROM `system_menu` WHERE `name` = 'ç产管ç') LIMIT 1); |
| | | |
| | | INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 'ç产工åæäº¤å®¡æ¹', 'mes:pro-work-order:update', 3, 6, @workorder_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE @workorder_menu_id IS NOT NULL |
| | | AND NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `name` = 'ç产工åæäº¤å®¡æ¹' AND `parent_id` = @workorder_menu_id); |
| | | |
| | | -- 5. 为è§è²åé
æäº¤å®¡æ¹æé®æéï¼æ ¹æ®å®é
éè¦è°æ´ï¼ |
| | | -- 示ä¾ï¼ä¸º MES 管çåè§è²åé
æé |
| | | -- INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) |
| | | -- SELECT r.id, m.id, '1', NOW(), '1', NOW(), b'0', 1 |
| | | -- FROM `system_role` r, `system_menu` m |
| | | -- WHERE r.name = 'MES管çå' AND m.name = 'ç产工åæäº¤å®¡æ¹'; |
| | | |
| | | -- ============================================= |
| | | -- åæ»èæ¬ï¼å¦éåæ»æ§è¡ä»¥ä¸è¯å¥ï¼ |
| | | -- ============================================= |
| | | -- ALTER TABLE `mes_pro_work_order` DROP COLUMN `process_instance_id`; |
| | | -- DELETE FROM `system_dict_data` WHERE `dict_type` = 'mes_pro_work_order_status' AND `value` IN ('1', '5'); |
| | | -- DELETE FROM `system_menu` WHERE `name` = 'ç产工åæäº¤å®¡æ¹'; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # MES ç产工å审æ¹éæ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ç产工ååè¡¨é¡µé¢ (`views/mes/pro/workorder/index.vue`) |
| | | - ç产工å详æ
/ç¼è¾é¡µé¢ (`views/mes/pro/workorder/WorkOrderForm.vue`) |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | PUT | /mes/pro/work-order/submit | æäº¤å·¥åå®¡æ¹ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | å·¥åç¼å·ï¼Query åæ°ï¼ | |
| | | |
| | | **ååºï¼** `{ "code": 200, "msg": "æä½æå", "data": true }` |
| | | |
| | | ## å·¥åç¶æåæ´è¯´æ |
| | | |
| | | | åç¶æ | æ°ç¶æ | è§¦åæ¡ä»¶ | |
| | | |--------|--------|----------| |
| | | | è稿(0) | 审æ¹ä¸(1) | æäº¤å®¡æ¹ | |
| | | | 审æ¹ä¸(1) | 已确认(2) | 审æ¹éè¿ | |
| | | | 审æ¹ä¸(1) | 审æ¹ä¸éè¿(5) | 审æ¹ä¸éè¿ | |
| | | | 审æ¹ä¸(1) | è稿(0) | 审æ¹åæ¶ | |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. åè¡¨é¡µé¢ - æ·»å "æäº¤å®¡æ¹"æé® |
| | | |
| | | **ä½ç½®ï¼** `views/mes/pro/workorder/index.vue` |
| | | |
| | | ```html |
| | | <!-- 卿ä½å䏿·»å æäº¤å®¡æ¹æé® --> |
| | | <el-table-column label="æä½" align="center" width="200"> |
| | | <template #default="scope"> |
| | | <el-button |
| | | v-if="scope.row.status === 0" |
| | | link |
| | | type="primary" |
| | | @click="handleSubmit(scope.row.id)" |
| | | v-hasPermi="['mes:pro-work-order:update']" |
| | | > |
| | | æäº¤å®¡æ¹ |
| | | </el-button> |
| | | <el-button |
| | | v-if="scope.row.status === 0" |
| | | link |
| | | type="primary" |
| | | @click="handleUpdate(scope.row.id)" |
| | | v-hasPermi="['mes:pro-work-order:update']" |
| | | > |
| | | ç¼è¾ |
| | | </el-button> |
| | | <el-button |
| | | v-if="scope.row.status === 0" |
| | | link |
| | | type="danger" |
| | | @click="handleDelete(scope.row.id)" |
| | | v-hasPermi="['mes:pro-work-order:delete']" |
| | | > |
| | | å é¤ |
| | | </el-button> |
| | | <!-- å·²ç¡®è®¤ç¶ææ¾ç¤ºå®æãåæ¶æé® --> |
| | | <el-button |
| | | v-if="scope.row.status === 2" |
| | | link |
| | | type="success" |
| | | @click="handleFinish(scope.row.id)" |
| | | v-hasPermi="['mes:pro-work-order:update']" |
| | | > |
| | | 宿 |
| | | </el-button> |
| | | <el-button |
| | | v-if="scope.row.status === 2" |
| | | link |
| | | type="warning" |
| | | @click="handleCancel(scope.row.id)" |
| | | v-hasPermi="['mes:pro-work-order:update']" |
| | | > |
| | | åæ¶ |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | ``` |
| | | |
| | | ### 2. data æ°æ® |
| | | |
| | | ```js |
| | | // ç¶æåå
¸ |
| | | const statusDict = ref([ |
| | | { label: 'è稿', value: 0, tagType: 'info' }, |
| | | { label: '审æ¹ä¸', value: 1, tagType: 'warning' }, |
| | | { label: '已确认', value: 2, tagType: 'success' }, |
| | | { label: '已宿', value: 3, tagType: 'primary' }, |
| | | { label: '已忶', value: 4, tagType: 'danger' }, |
| | | { label: '审æ¹ä¸éè¿', value: 5, tagType: 'danger' } |
| | | ]) |
| | | ``` |
| | | |
| | | ### 3. æ¹æ³ |
| | | |
| | | ```js |
| | | import { submitWorkOrder } from '@/api/mes/pro/workorder' |
| | | |
| | | // æäº¤å®¡æ¹ |
| | | const handleSubmit = async (id: number) => { |
| | | try { |
| | | await message.confirm('确认æäº¤è¯¥å·¥åè¿è¡å®¡æ¹ï¼') |
| | | await submitWorkOrder(id) |
| | | message.success('æäº¤æå') |
| | | await getList() |
| | | } catch (error) { |
| | | console.error(error) |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 4. API æ¹æ³ |
| | | |
| | | **æä»¶ï¼** `api/mes/pro/workorder/index.ts` |
| | | |
| | | ```ts |
| | | // æäº¤å·¥åå®¡æ¹ |
| | | export const submitWorkOrder = (id: number) => { |
| | | return request.put({ url: '/mes/pro/work-order/submit', params: { id } }) |
| | | } |
| | | ``` |
| | | |
| | | ### 5. ç¶ææ ç¾æ¾ç¤º |
| | | |
| | | ```html |
| | | <dict-tag :type="DICT_TYPE.MES_PRO_WORK_ORDER_STATUS" :value="scope.row.status" /> |
| | | ``` |
| | | |
| | | ### 6. 表åç¶æç¦ç¨é»è¾ |
| | | |
| | | **ç¼è¾è¡¨åï¼** åªæèç¨¿ç¶æ(0)å审æ¹ä¸éè¿ç¶æ(5)æè½ç¼è¾ |
| | | |
| | | ```js |
| | | // 夿æ¯å¦å¯ç¼è¾ |
| | | const isEditable = computed(() => { |
| | | return formData.value.status === 0 || formData.value.status === 5 |
| | | }) |
| | | ``` |
| | | |
| | | ```html |
| | | <el-form-item label="å·¥åç¼ç " prop="code"> |
| | | <el-input v-model="formData.code" :disabled="!isEditable" /> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **ç¶ææµè½¬**ï¼è稿 â æäº¤å®¡æ¹ â 审æ¹ä¸ â 审æ¹éè¿(已确认) / 审æ¹ä¸éè¿ |
| | | 2. **审æ¹ä¸éè¿å**ï¼å·¥åç¶æå为"审æ¹ä¸éè¿"(5)ï¼å¯ä»¥éæ°ç¼è¾å忬¡æäº¤å®¡æ¹ |
| | | 3. **æéæ§å¶**ï¼æäº¤å®¡æ¹ä½¿ç¨ `mes:pro-work-order:update` æéï¼ä¸ç¼è¾æéä¸è´ |
| | | 4. **æé®æ¾ç¤º**ï¼æ ¹æ®å·¥åç¶æå¨ææ¾ç¤ºæä½æé®ï¼é¿å
误æä½ |
| | | 5. **åå
¸æ°æ®**ï¼ç¡®ä¿ç³»ç»åå
¸ `mes_pro_work_order_status` 已添å 审æ¹ä¸(1)å审æ¹ä¸éè¿(5)ç¶æ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # MES/ERP/WMS/CRM 跨模åéææ¹æ¡ |
| | | |
| | | ## ä¸ãæ´ä½æ¶ææ¦è¿° |
| | | |
| | | ### 1.1 模åå®ä½ |
| | | |
| | | | 模å | æ ¸å¿èè´£ | ä¸å¡è¾¹ç | |
| | | |------|---------|---------| |
| | | | **ERP** | è´¢å¡æ ¸ç®ãéè´éå®è®¢å管ç | 对å¤ä¸å¡å¾æ¥ãææ¬æ ¸ç® | |
| | | | **MES** | ç产æ§è¡ãå·¥èºç®¡çãè´¨éæ§å¶ | ç产è¿ç¨ç®¡ç | |
| | | | **WMS** | ä»å¨ç®¡çãåºåæ§å¶ | å®ç©åºå管ç | |
| | | | **CRM** | 客æ·å
³ç³»ãé宿ºä¼ãåå管ç | 客æ·ä¾§ä¸å¡ç®¡ç | |
| | | |
| | | ### 1.2 ç»ä¸åºç¡æ°æ®æ¶æ |
| | | |
| | | éç¨ **åä¸äº§åä¸»æ°æ®** 模å¼ï¼æç ´æ¨¡åå£åï¼ |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â åºç¡æ°æ®å±ï¼å
±äº«ï¼ â |
| | | ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠|
| | | â 产åç©æä¸»æ°æ®ï¼MD_ITEMï¼ â æææ¨¡åå
±ç¨å¯ä¸äº§åç¼ç â |
| | | â 客æ·ä¸»æ°æ®ï¼MD_CLIENTï¼ â ERP/CRM å
±ç¨ â |
| | | â ä¾åºåä¸»æ°æ®ï¼MD_VENDORï¼ â ERP/MES å
±ç¨ â |
| | | â ä»åºä¸»æ°æ®ï¼MD Warehouseï¼ â ERP/WMS/MES å
±ç¨ â |
| | | â 计éåä½ä¸»æ°æ®ï¼MD Unitï¼ â å
¨å±å
±ç¨ â |
| | | â BOM ä¸»æ°æ®ï¼MD BOMï¼ â MES/ERP å
±ç¨ â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â â â â |
| | | âââââââââââ âââââââââââ âââââââââââ âââââââââââ |
| | | â ERP â â MES â â WMS â â CRM â |
| | | âââââââââââ âââââââââââ âââââââââââ âââââââââââ |
| | | ``` |
| | | |
| | | ### 1.3 æ ¸å¿è®¾è®¡åå |
| | | |
| | | 1. **æ°æ®å¯ä¸æ§**ï¼äº§åç©æç¼ç å
¨å±å¯ä¸ï¼å模åéè¿äº§åIDå
³è |
| | | 2. **æµç¨é©±å¨**ï¼ææè·¨æ¨¡åæä½éè¿ BPM å®¡æ¹æµç¨è§¦å |
| | | 3. **äºä»¶è§£è¦**ï¼æ¨¡åé´éè¿äºä»¶ç嬿ºå¶å®ç°èå¨ï¼é¿å
ç´æ¥è°ç¨ |
| | | 4. **åºåä¸å¿å**ï¼WMS ä½ä¸ºå¯ä¸åºå管çè
ï¼ææåºååå¨éç»è¿ WMS |
| | | |
| | | --- |
| | | |
| | | ## äºãç»ä¸åºç¡æ°æ®è®¾è®¡ |
| | | |
| | | ### 2.1 产åç©æä¸»æ°æ®ï¼æ ¸å¿ï¼ |
| | | |
| | | **è¡¨ç»æï¼** `md_item` |
| | | |
| | | | åæ®µ | ç±»å | 说æ | ä½¿ç¨æ¨¡å | |
| | | |------|------|------|---------| |
| | | | id | BIGINT | 产åIDï¼å
¨å±å¯ä¸ï¼ | å
¨é¨ | |
| | | | code | VARCHAR(64) | 产åç¼ç ï¼å
¨å±å¯ä¸ï¼ | å
¨é¨ | |
| | | | name | VARCHAR(255) | 产ååç§° | å
¨é¨ | |
| | | | specification | VARCHAR(255) | è§æ ¼åå· | å
¨é¨ | |
| | | | unit_measure_id | BIGINT | 主计éåä½ | å
¨é¨ | |
| | | | category_id | BIGINT | 产ååç±» | å
¨é¨ | |
| | | | item_type | INT | ç©æç±»åï¼åæ/åæå/æå/è¾
æï¼ | MES/ERP | |
| | | | is_batch_managed | BOOLEAN | æ¯å¦æ¹æ¬¡ç®¡ç | WMS/MES | |
| | | | is_serial_managed | BOOLEAN | æ¯å¦åºåå·ç®¡ç | WMS/MES | |
| | | | barcode_rule_id | BIGINT | æ¡ç è§å | WMS/MES | |
| | | | safety_stock | DECIMAL | å®å
¨åºå | WMS | |
| | | | min_order_qty | DECIMAL | æå°è®¢è´§é | ERP | |
| | | | lead_time | INT | éè´æåæï¼å¤©ï¼ | ERP/MES | |
| | | | purchase_price | DECIMAL | éè´ä»· | ERP | |
| | | | sales_price | DECIMAL | éå®ä»· | ERP/CRM | |
| | | | cost_price | DECIMAL | ææ¬ä»· | ERP | |
| | | | status | INT | ç¶æï¼å¯ç¨/ç¦ç¨ï¼ | å
¨é¨ | |
| | | |
| | | ### 2.2 æ¨¡åæ°æ®å½å±åå |
| | | |
| | | | æ°æ®ç±»å | æå±æ¨¡å | å
±äº«èå´ | |
| | | |---------|---------|---------| |
| | | | 产åç©æ | MESï¼ä¸»ï¼æç¬ç«æ¨¡å | ERP/WMS/CRM/MES å
¨é¨å
񄧮 | |
| | | | 客æ·ä¿¡æ¯ | CRMï¼ä¸»ï¼æç¬ç«æ¨¡å | ERP/MES å
±äº«ï¼è®¢å/åè´§ï¼ | |
| | | | ä¾åºåä¿¡æ¯ | ERPï¼ä¸»ï¼æç¬ç«æ¨¡å | MES å
±äº«ï¼å¤åå å·¥ï¼ | |
| | | | ä»åºä¿¡æ¯ | WMSï¼ä¸»ï¼æç¬ç«æ¨¡å | ERP/MES å
±äº«ï¼åºå
¥åºï¼ | |
| | | | BOM ä¿¡æ¯ | MESï¼ä¸»ï¼æç¬ç«æ¨¡å | ERP å
±äº«ï¼ææ¬æ ¸ç®ï¼ | |
| | | | å·¥èºè·¯çº¿ | MES ç¬æ | ä¸å
񄧮 | |
| | | | é宿ºä¼ | CRM ç¬æ | ä¸å
񄧮 | |
| | | | è´¨æ£æ å | MES ç¬æ | WMS åè | |
| | | |
| | | ### 2.3 æ°æ®åæ¥çç¥ |
| | | |
| | | ``` |
| | | âââââââââââââââ API/äºä»¶ âââââââââââââââ |
| | | â ä¸»æ°æ®æ¨¡å â ââââââââââââââââ â ä¸å¡æ¨¡å â |
| | | âââââââââââââââ âââââââââââââââ |
| | | â â |
| | | æ°æ®åæ´äºä»¶ æ¬å°ç¼åæ´æ° |
| | | â â |
| | | åå¸ DomainEvent çå¬å¹¶åæ¥ |
| | | ``` |
| | | |
| | | **忥æ¹å¼ï¼** |
| | | 1. **宿¶åæ¥**ï¼å
³é®æ°æ®åæ´éè¿ Spring Event 宿¶éç¥ |
| | | 2. **API æ¥è¯¢**ï¼ä¸å¡æ¨¡åéè¦è¯¦æ
æ¶è°ç¨ä¸»æ°æ®æ¨¡å API |
| | | 3. **æ¬å°ç¼å**ï¼é«é¢è®¿é®æ°æ®å¨ä¸å¡æ¨¡å建ç«ç¼å表ï¼ä»
å ID+åç§°+ç¼ç ï¼ |
| | | |
| | | --- |
| | | |
| | | ## ä¸ã跨模åä¸å¡æµç¨éæ |
| | | |
| | | ### 3.1 éè´ä¸å¡æµç¨ï¼ERP â WMS â MESï¼ |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â éè´ä¸å¡å®æ´æµç¨ â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | |
| | | ERPéè´è®¢å ââ(审æ¹éè¿)âââ å¯å建éè´å
¥åºå |
| | | â â |
| | | ç¶æåæ´ ERPéè´å
¥åº |
| | | â ââ(审æ¹éè¿)âââ |
| | | æ´æ°è®¢åç¶æ â |
| | | WMSåºåå¢å |
| | | â |
| | | MESåæå¯ç¨ |
| | | â |
| | | å¯å建çäº§é¢æå |
| | | ``` |
| | | |
| | | **èå¨ç¹è®¾è®¡ï¼** |
| | | |
| | | | 触åç¹ | èå¨æä½ | å®ç°æ¹å¼ | |
| | | |--------|---------|---------| |
| | | | ERPéè´è®¢å审æ¹éè¿ | 订åç¶æ=已审æ¹ï¼å
许å建å
¥åºå | ç¶ææ ¡éª | |
| | | | ERPéè´å
¥åºå®¡æ¹éè¿ | WMSåºåå¢å ãæ´æ°éè´è®¢åå·²å
¥åºæ°é | äºä»¶çå¬ | |
| | | | ERPéè´å
¥åºå
¨é¨å®æ | éè´è®¢åç¶æ=已宿 | æ°é夿 | |
| | | | MESçäº§é¢æå®¡æ¹éè¿ | WMSåæåºååå° | äºä»¶çå¬ | |
| | | |
| | | ### 3.2 éå®ä¸å¡æµç¨ï¼CRM â ERP â WMSï¼ |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â éå®ä¸å¡å®æ´æµç¨ â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | |
| | | CRMéå®åå ââ(审æ¹éè¿)âââ å¯å建ERPéå®è®¢å |
| | | â â |
| | | ç¶æåæ´ ERPéå®è®¢å |
| | | â ââ(审æ¹éè¿)âââ |
| | | ååå±¥è¡å¼å§ â |
| | | å¯å建éå®åºåºå |
| | | â |
| | | ERPéå®åºåº |
| | | â |
| | | ââ(审æ¹éè¿)âââ |
| | | â |
| | | WMSåºååå° |
| | | â |
| | | ERPææ¬æ ¸ç® |
| | | â |
| | | CRMååå±¥è¡æ´æ° |
| | | ``` |
| | | |
| | | **èå¨ç¹è®¾è®¡ï¼** |
| | | |
| | | | 触åç¹ | èå¨æä½ | å®ç°æ¹å¼ | |
| | | |--------|---------|---------| |
| | | | CRMåå审æ¹éè¿ | å¯å建ERPéå®è®¢åï¼å
³èååID | ç¶ææ ¡éª | |
| | | | ERPéå®è®¢å审æ¹éè¿ | 订åç¶æ=已审æ¹ï¼å
许å建åºåºå | ç¶ææ ¡éª | |
| | | | ERPéå®åºåºå®¡æ¹éè¿ | WMSåºååå°ãæ´æ°éå®è®¢åå·²åºåºæ°é | äºä»¶çå¬ | |
| | | | ERPéå®åºåºå®¡æ¹éè¿ | æ´æ°CRMååå±¥è¡è¿åº¦ | äºä»¶çå¬ | |
| | | | ERPéå®åºåºå
¨é¨å®æ | éå®è®¢åç¶æ=已宿 | æ°é夿 | |
| | | |
| | | ### 3.3 ç产ä¸å¡æµç¨ï¼MES â WMS â ERPï¼ |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â ç产ä¸å¡å®æ´æµç¨ â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | |
| | | MESç产工å ââ(审æ¹éè¿)âââ ç¶æ=已确认 |
| | | â â |
| | | èªå¨çæBOM å¯å建çäº§ä»»å¡ |
| | | â â |
| | | å¯åå»ºé¢æå MESçäº§ä»»å¡æ§è¡ |
| | | â ââ(ä»»å¡å¼å§)âââ |
| | | MESçäº§é¢æ â |
| | | â åææ¶èè®°å½ |
| | | ââ(审æ¹éè¿)âââ â |
| | | â ââ(ä»»å¡å®æ)âââ |
| | | WMSåæåºååå° â |
| | | MESç产å
¥åº |
| | | â |
| | | ââ(审æ¹éè¿)âââ |
| | | â |
| | | WMSæååºåå¢å |
| | | â |
| | | ERPææ¬æ ¸ç® |
| | | â |
| | | MESå·¥å宿 |
| | | ``` |
| | | |
| | | **èå¨ç¹è®¾è®¡ï¼** |
| | | |
| | | | 触åç¹ | èå¨æä½ | å®ç°æ¹å¼ | |
| | | |--------|---------|---------| |
| | | | MESç产工å审æ¹éè¿ | å·¥åç¶æ=已确认ï¼å¯å建任å¡/颿å | ç¶ææ ¡éª | |
| | | | MESçäº§é¢æå®¡æ¹éè¿ | WMSåæåºååå° | äºä»¶çå¬ | |
| | | | MESç产任å¡å®æ | 累计ç产æ°éãå¯å建å
¥åºå | ç¶ææ ¡éª | |
| | | | MESç产å
¥åºå®¡æ¹éè¿ | WMSæååºåå¢å ãå·¥åç产æ°éç´¯å | äºä»¶çå¬ | |
| | | | MESç产å
¥åºå®¡æ¹éè¿ | ERPææ¬æ ¸ç®ï¼å¯éï¼ | äºä»¶çå¬ | |
| | | | MESå·¥åå
¨é¨å®æ | å·¥åç¶æ=已宿 | æ°é夿 | |
| | | |
| | | ### 3.4 éè´§ä¸å¡æµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â éè´§ä¸å¡æµç¨ â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | |
| | | ERPéè´éè´§ ââ(审æ¹éè¿)âââ WMSåºååå° |
| | | â |
| | | æ´æ°éè´è®¢åéè´§æ°é |
| | | |
| | | ERPéå®éè´§ ââ(审æ¹éè¿)âââ WMSåºåå¢å |
| | | â |
| | | æ´æ°éå®è®¢åéè´§æ°é |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## åãåºå管çç»ä¸è®¾è®¡ |
| | | |
| | | ### 4.1 åºåæ°æ®æ¨¡å |
| | | |
| | | **æ ¸å¿è¡¨ï¼** `wms_stock` |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | BIGINT | ä¸»é® | |
| | | | item_id | BIGINT | 产åIDï¼å
³è md_itemï¼ | |
| | | | warehouse_id | BIGINT | ä»åºID | |
| | | | location_id | BIGINT | åºä½ID | |
| | | | batch_code | VARCHAR(64) | æ¹æ¬¡å· | |
| | | | quantity | DECIMAL | å½ååºåæ°é | |
| | | | quantity_locked | DECIMAL | é宿°é | |
| | | | quantity_available | DECIMAL | å¯ç¨æ°é = quantity - quantity_locked | |
| | | | unit_measure_id | BIGINT | 计éåä½ | |
| | | |
| | | ### 4.2 åºåå卿¥æº |
| | | |
| | | | åå¨ç±»å | å¢åæ¹å | æ¥æºæ¨¡å | è§¦åæ¡ä»¶ | |
| | | |---------|---------|---------|---------| |
| | | | éè´å
¥åº | + | ERP | éè´å
¥åºå审æ¹éè¿ | |
| | | | éå®åºåº | - | ERP | éå®åºåºå审æ¹éè¿ | |
| | | | ç产å
¥åº | + | MES | ç产å
¥åºå审æ¹éè¿ | |
| | | | çäº§é¢æ | - | MES | çäº§é¢æå审æ¹éè¿ | |
| | | | çäº§éæ | + | MES | ç产éæå审æ¹éè¿ | |
| | | | éè´éè´§ | - | ERP | éè´éè´§å审æ¹éè¿ | |
| | | | éå®éè´§ | + | ERP | éå®éè´§å审æ¹éè¿ | |
| | | | è°æ¨å
¥åº | + | WMS | è°æ¨å审æ¹éè¿ï¼ç®æ ä»ï¼ | |
| | | | è°æ¨åºåº | - | WMS | è°æ¨å审æ¹éè¿ï¼æºä»ï¼ | |
| | | | çç | + | WMS | çç¹å审æ¹éè¿ | |
| | | | çäº | - | WMS | çç¹å审æ¹éè¿ | |
| | | |
| | | ### 4.3 åºåæå¡ API 设计 |
| | | |
| | | ```java |
| | | /** |
| | | * åºåæå¡æ¥å£ - WMS 模åæä¾ï¼å
¶ä»æ¨¡åè°ç¨ |
| | | */ |
| | | public interface WmsStockApi { |
| | | |
| | | /** |
| | | * å建åºåè®°å½ï¼å
¥åºï¼ |
| | | */ |
| | | Long createStockRecord(StockRecordCreateDTO dto); |
| | | |
| | | /** |
| | | * éå®åºå |
| | | */ |
| | | void lockStock(Long itemId, Long warehouseId, BigDecimal quantity); |
| | | |
| | | /** |
| | | * è§£éåºå |
| | | */ |
| | | void unlockStock(Long itemId, Long warehouseId, BigDecimal quantity); |
| | | |
| | | /** |
| | | * æ¥è¯¢å¯ç¨åºå |
| | | */ |
| | | BigDecimal getAvailableStock(Long itemId, Long warehouseId); |
| | | |
| | | /** |
| | | * æ¹éæ¥è¯¢åºå |
| | | */ |
| | | Map<Long, BigDecimal> getAvailableStockMap(List<Long> itemIds, Long warehouseId); |
| | | |
| | | /** |
| | | * æ ¡éªåºåå
è¶³ |
| | | */ |
| | | void validateStockEnough(Long itemId, Long warehouseId, BigDecimal quantity); |
| | | } |
| | | ``` |
| | | |
| | | ### 4.4 åºåé¢è¦æºå¶ |
| | | |
| | | | é¢è¦ç±»å | è§¦åæ¡ä»¶ | éç¥å¯¹è±¡ | |
| | | |---------|---------|---------| |
| | | | åºåä¸è¶³ | å¯ç¨åºå < å®å
¨åºå | ERPéè´ãMES计å | |
| | | | åºå积å | åºå > æé«åºåéå¼ | ERPéå® | |
| | | | ææé¢è¦ | æ¹æ¬¡ææ < 30天 | WMSãMESè´¨é | |
| | | | éå®è¶
æ¶ | é宿¶é´ > é
ç½®éå¼ | ç¸å
³ä¸å¡äººå | |
| | | |
| | | --- |
| | | |
| | | ## äºãBPM å®¡æ¹æµç¨ç»ä¸è®¾è®¡ |
| | | |
| | | ### 5.1 å®¡æ¹æµç¨æ è¯è§è |
| | | |
| | | | 模å | ä¸å¡åæ® | æµç¨ KEY | |
| | | |------|---------|---------| |
| | | | ERP | éè´è®¢å | `erp-purchase-order-audit` | |
| | | | ERP | éå®è®¢å | `erp-sale-order-audit` | |
| | | | ERP | éè´å
¥åº | `erp-purchase-in-audit` | |
| | | | ERP | éå®åºåº | `erp-sale-out-audit` | |
| | | | ERP | éè´éè´§ | `erp-purchase-return-audit` | |
| | | | ERP | éå®éè´§ | `erp-sale-return-audit` | |
| | | | MES | ç产工å | `mes-pro-work-order-audit` | |
| | | | MES | çäº§é¢æ | `mes-material-issue-audit` | |
| | | | MES | ç产å
¥åº | `mes-material-receive-audit` | |
| | | | WMS | åºåè°æ¨ | `wms-stock-transfer-audit` | |
| | | | WMS | åºåçç¹ | `wms-stock-check-audit` | |
| | | | CRM | éå®åå | `crm-sale-contract-audit` | |
| | | | CRM | é宿¥ä»· | `crm-sale-quotation-audit` | |
| | | |
| | | ### 5.2 审æ¹ç¶ææä¸¾ç»ä¸ |
| | | |
| | | ```java |
| | | /** |
| | | * ç»ä¸å®¡æ¹ç¶ææä¸¾ |
| | | */ |
| | | public enum AuditStatusEnum { |
| | | DRAFT(0, "è稿"), // æ°å»ºç¶æ |
| | | AUDITING(1, "审æ¹ä¸"), // å·²æäº¤å®¡æ¹ |
| | | APPROVED(20, "已审æ¹"), // 审æ¹éè¿ |
| | | REJECTED(30, "å·²æç»"), // 审æ¹ä¸éè¿ |
| | | CANCELLED(40, "已忶"); // 审æ¹åæ¶ |
| | | |
| | | // BPM æµç¨ç¶æå¯¹åºï¼ |
| | | // BPM_RESULT_PASS = 2 â APPROVED |
| | | // BPM_RESULT_REJECT = 3 â REJECTED |
| | | // BPM_RESULT_CANCEL = 4 â DRAFTï¼éåèç¨¿ï¼ |
| | | } |
| | | ``` |
| | | |
| | | ### 5.3 审æ¹çå¬å¨ç»ä¸æ¨¡æ¿ |
| | | |
| | | ```java |
| | | /** |
| | | * 跨模å审æ¹ç»æçå¬å¨åºç±» |
| | | */ |
| | | public abstract class CrossModuleAuditListener extends BpmProcessInstanceStatusEventListener { |
| | | |
| | | @Override |
| | | protected void onEvent(BpmProcessInstanceStatusEvent event) { |
| | | // 1. æ´æ°æ¬æ¨¡ååæ®ç¶æ |
| | | updateAuditStatus(event.getBusinessKey(), event.getStatus()); |
| | | |
| | | // 2. 触å跨模åèå¨ï¼éè¿äºä»¶åå¸ï¼ |
| | | if (event.getStatus() == 2) { // 审æ¹éè¿ |
| | | publishCrossModuleEvent(event.getBusinessKey()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åå¸è·¨æ¨¡åèå¨äºä»¶ |
| | | */ |
| | | protected abstract void publishCrossModuleEvent(String businessKey); |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
ã跨模åäºä»¶æºå¶è®¾è®¡ |
| | | |
| | | ### 6.1 äºä»¶ç±»åå®ä¹ |
| | | |
| | | | äºä»¶ç±»å | å叿¨¡å | ç嬿¨¡å | 说æ | |
| | | |---------|---------|---------|---------| |
| | | | `PurchaseInApprovedEvent` | ERP | WMS, ERP-PO | éè´å
¥åºå®¡æ¹éè¿ | |
| | | | `SaleOutApprovedEvent` | ERP | WMS, ERP-SO, CRM | éå®åºåºå®¡æ¹éè¿ | |
| | | | `MaterialIssueApprovedEvent` | MES | WMS | çäº§é¢æå®¡æ¹éè¿ | |
| | | | `MaterialReceiveApprovedEvent` | MES | WMS, MES-WO | ç产å
¥åºå®¡æ¹éè¿ | |
| | | | `WorkOrderApprovedEvent` | MES | MES-Task | ç产工å审æ¹éè¿ | |
| | | | `ContractApprovedEvent` | CRM | ERP | éå®åå审æ¹éè¿ | |
| | | |
| | | ### 6.2 äºä»¶æ°æ®ç»æ |
| | | |
| | | ```java |
| | | /** |
| | | * 跨模åäºä»¶åºç±» |
| | | */ |
| | | @Data |
| | | public abstract class CrossModuleEvent { |
| | | /** ä¸å¡åæ®ID */ |
| | | private Long businessId; |
| | | /** ä¸å¡åæ®ç¼ç */ |
| | | private String businessCode; |
| | | /** 产åIDå表 */ |
| | | private List<Long> itemIds; |
| | | /** ä»åºID */ |
| | | private Long warehouseId; |
| | | /** æä½æ¶é´ */ |
| | | private LocalDateTime eventTime; |
| | | /** æä½ç¨æ·ID */ |
| | | private Long userId; |
| | | /** ç§æ·ID */ |
| | | private Long tenantId; |
| | | } |
| | | |
| | | /** |
| | | * éè´å
¥åºå®¡æ¹éè¿äºä»¶ |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class PurchaseInApprovedEvent extends CrossModuleEvent { |
| | | /** å
¥åºæ°éï¼æäº§åï¼ */ |
| | | private Map<Long, BigDecimal> quantityMap; |
| | | /** å
³èéè´è®¢åID */ |
| | | private Long purchaseOrderId; |
| | | } |
| | | ``` |
| | | |
| | | ### 6.3 äºä»¶åå¸ä¸çå¬ |
| | | |
| | | ```java |
| | | // ERP 模ååå¸äºä»¶ |
| | | @Component |
| | | public class ErpPurchaseInStatusListener extends CrossModuleAuditListener { |
| | | |
| | | @Resource |
| | | private ApplicationEventPublisher eventPublisher; |
| | | |
| | | @Override |
| | | protected void publishCrossModuleEvent(String businessKey) { |
| | | ErpPurchaseInDO purchaseIn = purchaseInService.getPurchaseIn(Long.parseLong(businessKey)); |
| | | |
| | | // åå¸äºä»¶ä¾å
¶ä»æ¨¡åçå¬ |
| | | eventPublisher.publishEvent(new PurchaseInApprovedEvent() |
| | | .setBusinessId(purchaseIn.getId()) |
| | | .setItemIds(extractItemIds(purchaseIn)) |
| | | .setQuantityMap(extractQuantityMap(purchaseIn)) |
| | | .setWarehouseId(purchaseIn.getWarehouseId())); |
| | | } |
| | | } |
| | | |
| | | // WMS 模åçå¬äºä»¶ |
| | | @Component |
| | | public class WmsStockEventListener { |
| | | |
| | | @EventListener |
| | | public void onPurchaseInApproved(PurchaseInApprovedEvent event) { |
| | | // å¢å åºå |
| | | event.getQuantityMap().forEach((itemId, quantity) -> { |
| | | stockService.createStockRecord(new StockRecordCreateDTO() |
| | | .setItemId(itemId) |
| | | .setWarehouseId(event.getWarehouseId()) |
| | | .setQuantity(quantity) |
| | | .setBizType(StockBizTypeEnum.PURCHASE_IN)); |
| | | }); |
| | | } |
| | | } |
| | | |
| | | // ERP éè´è®¢å模åçå¬äºä»¶ |
| | | @Component |
| | | public class ErpPurchaseOrderEventListener { |
| | | |
| | | @EventListener |
| | | public void onPurchaseInApproved(PurchaseInApprovedEvent event) { |
| | | // æ´æ°éè´è®¢åå·²å
¥åºæ°é |
| | | purchaseOrderService.updateInQuantity(event.getPurchaseOrderId(), event.getQuantityMap()); |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ã宿½è®¡å |
| | | |
| | | ### 7.1 åæ¹æ¬¡å®æ½é¡ºåº |
| | | |
| | | | æ¹æ¬¡ | å
容 | 模å | é¢ä¼°å·¥ä½é | |
| | | |------|------|------|-----------| |
| | | | 1 | åºç¡æ°æ®ç»ä¸ | å
¨é¨ | 3天 | |
| | | | 2 | åºåæå¡ API | WMS | 2天 | |
| | | | 3 | éè´ä¸å¡èå¨ | ERP/WMS | 2天 | |
| | | | 4 | éå®ä¸å¡èå¨ | ERP/WMS/CRM | 2天 | |
| | | | 5 | ç产ä¸å¡èå¨ | MES/WMS | 3天 | |
| | | | 6 | éè´§ä¸å¡èå¨ | ERP/WMS | 1天 | |
| | | | 7 | äºä»¶æºå¶å®å | å
¨é¨ | 2天 | |
| | | | 8 | æµç¨å®ä¹é
置 | BPM | 2天 | |
| | | | 9 | å端页é¢è°æ´ | å
¨é¨ | 3天 | |
| | | | 10 | èè°æµè¯ | å
¨é¨ | 3天 | |
| | | |
| | | ### 7.2 ææ¯è¦ç¹ |
| | | |
| | | 1. **Spring Event 弿¥å¤ç**ï¼è·¨æ¨¡åäºä»¶ä½¿ç¨ `@Async` 弿¥æ§è¡ï¼é¿å
äºå¡åµå¥ |
| | | 2. **åå¸å¼äºå¡**ï¼å
³é®æä½èèä½¿ç¨ Seata ææ¬å°æ¶æ¯è¡¨ä¿è¯ä¸è´æ§ |
| | | 3. **å¹ç设计**ï¼äºä»¶çå¬å¨éæ¯æå¹çï¼é²æ¢é夿§è¡ |
| | | 4. **ç§æ·é离**ï¼äºä»¶æ°æ®æºå¸¦ tenantIdï¼ç嬿¶è¿æ»¤ |
| | | |
| | | --- |
| | | |
| | | ## å
«ãé£é©ä¸å¯¹ç |
| | | |
| | | | é£é©ç¹ | å½±å | 对ç | |
| | | |--------|------|------| |
| | | | æ°æ®ä¸ä¸è´ | åºåä¸å®é
ä¸ç¬¦ | äºä»¶å¹ç+è¡¥å¿æºå¶+宿çç¹ | |
| | | | æµç¨æ»é | 审æ¹å¡ä½ | 设置审æ¹è¶
æ¶èªå¨å¤ç | |
| | | | æ§è½ç¶é¢ | äºä»¶éåé»å¡ | 弿¥éå+æ¹éå¤ç | |
| | | | è·¨ç§æ·æ°æ®æ³é² | å®å
¨é£é© | äºä»¶æºå¸¦ç§æ·ID+ä¸¥æ ¼æ ¡éª | |
| | | |
| | | --- |
| | | |
| | | ## ä¹ãæ»ç» |
| | | |
| | | æ¬æ¹æ¡éè¿ä»¥ä¸æºå¶å®ç°æ¨¡åé´æéï¼ |
| | | |
| | | 1. **ç»ä¸åºç¡æ°æ®**ï¼äº§å/客æ·/ä¾åºå/ä»åºçä¸»æ°æ®å
¨å±å
񄧮 |
| | | 2. **äºä»¶é©±å¨èå¨**ï¼å®¡æ¹éè¿è§¦å跨模åäºä»¶ï¼è§£è¦æ¨¡åä¾èµ |
| | | 3. **åºåä¸å¿å**ï¼WMS ä½ä¸ºå¯ä¸åºå管çè
ï¼ææåå¨éè¿ API/äºä»¶ |
| | | 4. **æµç¨æ åå**ï¼ç»ä¸ç BPM æµç¨ KEYãç¶ææä¸¾ãçå¬å¨æ¨¡æ¿ |
| | | |
| | | ä¸ä¸æ¥éç¡®è®¤ï¼ |
| | | - ä¸»æ°æ®æ¨¡åå½å±ï¼æ¯å¦æ°å»ºç¬ç«æ¨¡åï¼ |
| | | - åå¸å¼äºå¡æ¹æ¡éæ© |
| | | - å
·ä½å®æ½ä¼å
级æåº |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- IM 峿¶éè®¯æ¨¡åæ°æ®åºè¡¨ç»æ |
| | | -- çææ¥æ: 2026-06-29 |
| | | -- éç¨é¡¹ç®: mom-pro2-after |
| | | -- å
å«: 好å管çã群è管çãç§èæ¶æ¯ãç¾¤èæ¶æ¯ |
| | | -- ===================================================== |
| | | |
| | | -- ===================================================== |
| | | -- 第ä¸é¨å: åå
¸ç±»åå®ä¹ |
| | | -- ===================================================== |
| | | |
| | | -- IM ç§èæ¶æ¯ç¶æ |
| | | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (600, 'IM ç§èæ¶æ¯ç¶æ', 'im_private_message_status', 0, 'ç§èæ¶æ¯ç¶æ', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM ç¾¤èæ¶æ¯ç¶æ |
| | | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (601, 'IM ç¾¤èæ¶æ¯ç¶æ', 'im_group_message_status', 0, 'ç¾¤èæ¶æ¯ç¶æ', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM ç¾¤èæ¶æ¯åæ§ç¶æ |
| | | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (602, 'IM ç¾¤èæ¶æ¯åæ§ç¶æ', 'im_group_message_receipt_status', 0, 'ç¾¤èæ¶æ¯åæ§ç¶æ', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM 好åç¶æ |
| | | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (603, 'IM 好åç¶æ', 'im_friend_status', 0, '好åç¶æ', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM ç¾¤ç¶æ |
| | | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (604, 'IM ç¾¤ç¶æ', 'im_group_status', 0, 'ç¾¤ç¶æ', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM 群æåè§è² |
| | | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (605, 'IM 群æåè§è²', 'im_group_member_role', 0, '群æåè§è²', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM 好忷»å æ¥æº |
| | | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (606, 'IM 好忷»å æ¥æº', 'im_friend_add_source', 0, '好忷»å æ¥æº', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM 好åç³è¯·å¤çç»æ |
| | | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (607, 'IM 好åç³è¯·å¤çç»æ', 'im_friend_request_handle_result', 0, '好åç³è¯·å¤çç»æ', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM æ¶æ¯ç±»å |
| | | INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (608, 'IM æ¶æ¯ç±»å', 'im_message_type', 0, 'æ¶æ¯ç±»å', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- ===================================================== |
| | | -- 第äºé¨å: åå
¸æ°æ®å®ä¹ |
| | | -- ===================================================== |
| | | |
| | | -- IM ç§èæ¶æ¯ç¶æåå
¸æ°æ® |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 'æªè¯»', '0', 'im_private_message_status', 0, 'warning', '', 'ç§è=æªè¯»', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2, 'å·²æ¤å', '2', 'im_private_message_status', 0, 'danger', '', 'RECALL', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (3, '已读', '3', 'im_private_message_status', 0, 'success', '', 'READ', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM ç¾¤èæ¶æ¯ç¶æåå
¸æ°æ® |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 'æ£å¸¸', '0', 'im_group_message_status', 0, 'success', '', 'ç¾¤èæ£å¸¸', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2, 'å·²æ¤å', '2', 'im_group_message_status', 0, 'danger', '', '群èå·²æ¤å', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM 好åç¶æåå
¸æ°æ® |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 'æ£å¸¸', '0', 'im_friend_status', 0, 'success', '', 'æ£å¸¸å¥½åå
³ç³»', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2, 'å·²å é¤', '1', 'im_friend_status', 0, 'danger', '', 'å·²å é¤å¥½åå
³ç³»', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM ç¾¤ç¶æåå
¸æ°æ® |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 'æ£å¸¸', '0', 'im_group_status', 0, 'success', '', '群æ£å¸¸', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2, '已解æ£', '1', 'im_group_status', 0, 'info', '', '群已解æ£', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM 群æåè§è²åå
¸æ°æ® |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, '群主', '1', 'im_group_member_role', 0, 'primary', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2, '管çå', '2', 'im_group_member_role', 0, 'warning', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (3, 'æ®éæå', '3', 'im_group_member_role', 0, 'info', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM 好忷»å æ¥æºåå
¸æ°æ® |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 'æç´¢', '1', 'im_friend_add_source', 0, 'default', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2, '群è', '2', 'im_friend_add_source', 0, 'default', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (3, 'æ«ç ', '3', 'im_friend_add_source', 0, 'default', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (4, 'åç', '4', 'im_friend_add_source', 0, 'default', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM 好åç³è¯·å¤çç»æåå
¸æ°æ® |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 'çå¾
éªè¯', '0', 'im_friend_request_handle_result', 0, 'warning', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2, '已添å ', '1', 'im_friend_request_handle_result', 0, 'success', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (3, 'å·²æç»', '2', 'im_friend_request_handle_result', 0, 'info', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM æ¶æ¯ç±»ååå
¸æ°æ® |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (101, 'ææ¬', '101', 'im_message_type', 0, '', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (102, 'å¾ç', '102', 'im_message_type', 0, 'success', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (103, 'è¯é³', '103', 'im_message_type', 0, 'warning', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (104, 'è§é¢', '104', 'im_message_type', 0, 'warning', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (105, 'æä»¶', '105', 'im_message_type', 0, 'info', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2101, 'æ¤å', '2101', 'im_message_type', 0, 'danger', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2200, 'åæ§', '2200', 'im_message_type', 0, 'warning', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2201, '已读', '2201', 'im_message_type', 0, 'success', '', NULL, 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- IM ç¾¤æ¶æ¯åæ§ç¶æ |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 'ä¸éè¦åæ§', '0', 'im_group_message_receipt_status', 0, 'info', '', 'NO_RECEIPT', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2, 'å¾
宿', '1', 'im_group_message_receipt_status', 0, 'warning', '', 'PENDING', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (3, '已宿', '2', 'im_group_message_receipt_status', 0, 'success', '', 'DONE', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- ===================================================== |
| | | -- 第ä¸é¨å: IM æ¨¡åæ ¸å¿è¡¨ç»æ (11 å¼ è¡¨) |
| | | -- ===================================================== |
| | | |
| | | -- 3.1 好åå
³ç³»è¡¨ |
| | | DROP TABLE IF EXISTS `im_friend`; |
| | | CREATE TABLE `im_friend` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主é®', |
| | | `user_id` bigint NOT NULL COMMENT 'ç¨æ·ç¼å·', |
| | | `friend_user_id` bigint NOT NULL COMMENT '好åç¨æ·ç¼å·', |
| | | `remark` varchar(255) DEFAULT NULL COMMENT '好å夿³¨', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT '好åç¶æï¼0æ£å¸¸ 1å·²å é¤ï¼', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_user_id` (`user_id`), |
| | | KEY `idx_friend_user_id` (`friend_user_id`), |
| | | UNIQUE KEY `uk_user_friend` (`user_id`, `friend_user_id`) |
| | | ) ENGINE=InnoDB COMMENT='好åå
³ç³»è¡¨'; |
| | | |
| | | -- 3.2 好åç³è¯·è¡¨ |
| | | DROP TABLE IF EXISTS `im_friend_request`; |
| | | CREATE TABLE `im_friend_request` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主é®', |
| | | `user_id` bigint NOT NULL COMMENT 'ç³è¯·äººç¼å·', |
| | | `target_user_id` bigint NOT NULL COMMENT 'ç®æ ç¨æ·ç¼å·', |
| | | `content` varchar(500) DEFAULT NULL COMMENT 'ç³è¯·å
容', |
| | | `source` tinyint NOT NULL DEFAULT 1 COMMENT 'æ·»å æ¥æºï¼1æç´¢ 2群è 3æ«ç 4åçï¼', |
| | | `handle_result` tinyint NOT NULL DEFAULT 0 COMMENT 'å¤çç»æï¼0çå¾
1已添å 2å·²æç»ï¼', |
| | | `handle_time` datetime DEFAULT NULL COMMENT 'å¤çæ¶é´', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_user_id` (`user_id`), |
| | | KEY `idx_target_user_id` (`target_user_id`) |
| | | ) ENGINE=InnoDB COMMENT='好åç³è¯·è¡¨'; |
| | | |
| | | -- 3.3 群ç»è¡¨ |
| | | DROP TABLE IF EXISTS `im_group`; |
| | | CREATE TABLE `im_group` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT '群ç¼å·', |
| | | `name` varchar(100) NOT NULL COMMENT '群åç§°', |
| | | `avatar` varchar(255) DEFAULT NULL COMMENT '群头å', |
| | | `owner_user_id` bigint NOT NULL COMMENT 'ç¾¤ä¸»ç¨æ·ç¼å·', |
| | | `notice` varchar(500) DEFAULT NULL COMMENT '群å
Œ', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¾¤ç¶æï¼0æ£å¸¸ 1已解æ£ï¼', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_owner_user_id` (`owner_user_id`) |
| | | ) ENGINE=InnoDB COMMENT='群ç»è¡¨'; |
| | | |
| | | -- 3.4 群æå表 |
| | | DROP TABLE IF EXISTS `im_group_member`; |
| | | CREATE TABLE `im_group_member` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主é®', |
| | | `group_id` bigint NOT NULL COMMENT '群ç¼å·', |
| | | `user_id` bigint NOT NULL COMMENT 'ç¨æ·ç¼å·', |
| | | `nickname` varchar(100) DEFAULT NULL COMMENT '群å
æµç§°', |
| | | `role` tinyint NOT NULL DEFAULT 3 COMMENT '群è§è²ï¼1群主 2管çå 3æ®éæåï¼', |
| | | `mute_flag` bit(1) DEFAULT b'0' COMMENT 'æ¯å¦ç¦è¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_group_id` (`group_id`), |
| | | KEY `idx_user_id` (`user_id`), |
| | | UNIQUE KEY `uk_group_user` (`group_id`, `user_id`) |
| | | ) ENGINE=InnoDB COMMENT='群æå表'; |
| | | |
| | | -- 3.5 ç§èæ¶æ¯è¡¨ |
| | | DROP TABLE IF EXISTS `im_private_message`; |
| | | CREATE TABLE `im_private_message` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'æ¶æ¯ç¼å·', |
| | | `from_user_id` bigint NOT NULL COMMENT 'åé人ç¼å·', |
| | | `to_user_id` bigint NOT NULL COMMENT 'æ¥æ¶äººç¼å·', |
| | | `content` text COMMENT 'æ¶æ¯å
容', |
| | | `message_type` int NOT NULL DEFAULT 101 COMMENT 'æ¶æ¯ç±»åï¼101ææ¬ 102å¾ç 103è¯é³ 104è§é¢ 105æä»¶ï¼', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'æ¶æ¯ç¶æï¼0æªè¯» 2å·²æ¤å 3已读ï¼', |
| | | `send_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'åéæ¶é´', |
| | | `read_time` datetime DEFAULT NULL COMMENT '已读æ¶é´', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_from_user_id` (`from_user_id`), |
| | | KEY `idx_to_user_id` (`to_user_id`) |
| | | ) ENGINE=InnoDB COMMENT='ç§èæ¶æ¯è¡¨'; |
| | | |
| | | -- 3.6 ç¾¤èæ¶æ¯è¡¨ |
| | | DROP TABLE IF EXISTS `im_group_message`; |
| | | CREATE TABLE `im_group_message` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'æ¶æ¯ç¼å·', |
| | | `group_id` bigint NOT NULL COMMENT '群ç¼å·', |
| | | `from_user_id` bigint NOT NULL COMMENT 'åé人ç¼å·', |
| | | `content` text COMMENT 'æ¶æ¯å
容', |
| | | `message_type` int NOT NULL DEFAULT 101 COMMENT 'æ¶æ¯ç±»å', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'æ¶æ¯ç¶æï¼0æ£å¸¸ 2å·²æ¤åï¼', |
| | | `receipt_status` tinyint NOT NULL DEFAULT 0 COMMENT 'åæ§ç¶æï¼0ä¸éè¦ 1å¾
宿 2已宿ï¼', |
| | | `send_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'åéæ¶é´', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_group_id` (`group_id`), |
| | | KEY `idx_from_user_id` (`from_user_id`) |
| | | ) ENGINE=InnoDB COMMENT='ç¾¤èæ¶æ¯è¡¨'; |
| | | |
| | | -- 3.7 ç¾¤æ¶æ¯åæ§è¡¨ |
| | | DROP TABLE IF EXISTS `im_group_message_receipt`; |
| | | CREATE TABLE `im_group_message_receipt` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主é®', |
| | | `message_id` bigint NOT NULL COMMENT 'ç¾¤æ¶æ¯ç¼å·', |
| | | `user_id` bigint NOT NULL COMMENT 'ç¨æ·ç¼å·', |
| | | `read_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '已读æ¶é´', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_message_id` (`message_id`), |
| | | KEY `idx_user_id` (`user_id`), |
| | | UNIQUE KEY `uk_message_user` (`message_id`, `user_id`) |
| | | ) ENGINE=InnoDB COMMENT='ç¾¤æ¶æ¯åæ§è¡¨'; |
| | | |
| | | -- 3.8 ä¼è¯è¡¨ï¼ç§è+群èï¼ |
| | | DROP TABLE IF EXISTS `im_conversation`; |
| | | CREATE TABLE `im_conversation` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ä¼è¯ç¼å·', |
| | | `user_id` bigint NOT NULL COMMENT 'ç¨æ·ç¼å·', |
| | | `conversation_type` tinyint NOT NULL COMMENT 'ä¼è¯ç±»åï¼1ç§è 2群èï¼', |
| | | `target_id` bigint NOT NULL COMMENT 'ç®æ ç¼å·ï¼ç§èä¸ºç¨æ·IDï¼ç¾¤è为群IDï¼', |
| | | `last_message_id` bigint DEFAULT NULL COMMENT 'æåæ¶æ¯ç¼å·', |
| | | `last_message_time` datetime DEFAULT NULL COMMENT 'æåæ¶æ¯æ¶é´', |
| | | `unread_count` int NOT NULL DEFAULT 0 COMMENT 'æªè¯»æ¶æ¯æ°', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_user_id` (`user_id`), |
| | | UNIQUE KEY `uk_user_target_type` (`user_id`, `target_id`, `conversation_type`) |
| | | ) ENGINE=InnoDB COMMENT='ä¼è¯è¡¨'; |
| | | |
| | | -- 3.9 ç¨æ·å¨çº¿ç¶æè¡¨ |
| | | DROP TABLE IF EXISTS `im_user_online`; |
| | | CREATE TABLE `im_user_online` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主é®', |
| | | `user_id` bigint NOT NULL COMMENT 'ç¨æ·ç¼å·', |
| | | `online_status` tinyint NOT NULL DEFAULT 0 COMMENT 'å¨çº¿ç¶æï¼0离线 1å¨çº¿ï¼', |
| | | `last_online_time` datetime DEFAULT NULL COMMENT 'æåå¨çº¿æ¶é´', |
| | | `last_offline_time` datetime DEFAULT NULL COMMENT 'æå离线æ¶é´', |
| | | `device_type` tinyint DEFAULT NULL COMMENT '设å¤ç±»åï¼1Web 2Android 3iOSï¼', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_user_id` (`user_id`), |
| | | UNIQUE KEY `uk_user_id` (`user_id`) |
| | | ) ENGINE=InnoDB COMMENT='ç¨æ·å¨çº¿ç¶æè¡¨'; |
| | | |
| | | -- 3.10 群ç³è¯·è¡¨ |
| | | DROP TABLE IF EXISTS `im_group_request`; |
| | | CREATE TABLE `im_group_request` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主é®', |
| | | `group_id` bigint NOT NULL COMMENT '群ç¼å·', |
| | | `user_id` bigint NOT NULL COMMENT 'ç³è¯·äººç¼å·', |
| | | `content` varchar(500) DEFAULT NULL COMMENT 'ç³è¯·å
容', |
| | | `handle_result` tinyint NOT NULL DEFAULT 0 COMMENT 'å¤çç»æï¼0çå¾
1å·²éè¿ 2å·²æç»ï¼', |
| | | `handle_user_id` bigint DEFAULT NULL COMMENT 'å¤ç人ç¼å·', |
| | | `handle_time` datetime DEFAULT NULL COMMENT 'å¤çæ¶é´', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_group_id` (`group_id`), |
| | | KEY `idx_user_id` (`user_id`) |
| | | ) ENGINE=InnoDB COMMENT='群ç³è¯·è¡¨'; |
| | | |
| | | -- 3.11 æ¶æ¯æä»¶è¡¨ |
| | | DROP TABLE IF EXISTS `im_message_file`; |
| | | CREATE TABLE `im_message_file` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主é®', |
| | | `message_id` bigint NOT NULL COMMENT 'æ¶æ¯ç¼å·', |
| | | `message_type` tinyint NOT NULL COMMENT 'æ¶æ¯ç±»åï¼102å¾ç 103è¯é³ 104è§é¢ 105æä»¶ï¼', |
| | | `file_url` varchar(500) NOT NULL COMMENT 'æä»¶URL', |
| | | `file_name` varchar(255) DEFAULT NULL COMMENT 'æä»¶å', |
| | | `file_size` bigint DEFAULT NULL COMMENT 'æä»¶å¤§å°ï¼åèï¼', |
| | | `file_duration` int DEFAULT NULL COMMENT 'æä»¶æ¶é¿ï¼ç§ï¼è¯é³/è§é¢ï¼', |
| | | `width` int DEFAULT NULL COMMENT '宽度ï¼å¾ç/è§é¢ï¼', |
| | | `height` int DEFAULT NULL COMMENT 'é«åº¦ï¼å¾ç/è§é¢ï¼', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_message_id` (`message_id`) |
| | | ) ENGINE=InnoDB COMMENT='æ¶æ¯æä»¶è¡¨'; |
| | | |
| | | -- ===================================================== |
| | | -- IM 模å表ç»è®¡: 11 å¼ è¡¨ |
| | | -- ===================================================== |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # IM 峿¶é讯模åè§£éæå |
| | | |
| | | ## ä¸ãæ¨¡åæ¦è¿° |
| | | |
| | | IMï¼Instant Messagingï¼å³æ¶é讯模åæä¾ä¼ä¸å
é¨ç峿¶é讯è½åï¼æ¯æç§èã群èã好å管ççæ ¸å¿åè½ã |
| | | |
| | | ### 1.1 åè½æ¸
å |
| | | |
| | | | åè½ | 说æ | |
| | | |------|------| |
| | | | 好å管ç | æ·»å 好åãå é¤å¥½åã好åç³è¯·å®¡æ ¸ | |
| | | | ç§èæ¶æ¯ | ä¸å¯¹ä¸èå¤©ãæ¶æ¯æ¤åãå·²è¯»åæ§ | |
| | | | 群è管ç | å建群ãè§£æ£ç¾¤ã群æå管çã群å
Œ | |
| | | | ç¾¤èæ¶æ¯ | 群å
èå¤©ãæ¶æ¯æ¤åãåæ§ç¡®è®¤ | |
| | | | ä¼è¯ç®¡ç | ä¼è¯åè¡¨ãæªè¯»è®¡æ°ãå岿¶æ¯ | |
| | | | å¨çº¿ç¶æ | ç¨æ·å¨çº¿/ç¦»çº¿ç¶ææ¾ç¤º | |
| | | |
| | | ### 1.2 æ°æ®åºè¡¨æ¸
å |
| | | |
| | | | 表å | 说æ | |
| | | |------|------| |
| | | | im_friend | 好åå
³ç³»è¡¨ | |
| | | | im_friend_request | 好åç³è¯·è¡¨ | |
| | | | im_group | 群ç»è¡¨ | |
| | | | im_group_member | 群æå表 | |
| | | | im_private_message | ç§èæ¶æ¯è¡¨ | |
| | | | im_group_message | ç¾¤èæ¶æ¯è¡¨ | |
| | | | im_group_message_receipt | ç¾¤æ¶æ¯åæ§è¡¨ | |
| | | | im_conversation | ä¼è¯è¡¨ | |
| | | | im_user_online | ç¨æ·å¨çº¿ç¶æè¡¨ | |
| | | | im_group_request | 群ç³è¯·è¡¨ | |
| | | | im_message_file | æ¶æ¯æä»¶è¡¨ | |
| | | |
| | | --- |
| | | |
| | | ## äºãè§£éæ¥éª¤ |
| | | |
| | | ### 2.1 å建模åç®å½ç»æ |
| | | |
| | | ```bash |
| | | mkdir -p yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/api |
| | | mkdir -p yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/{controller,service,dal} |
| | | mkdir -p yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/{friend,group,message} |
| | | mkdir -p yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/{friend,group,message} |
| | | mkdir -p yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/{dataobject,mysql} |
| | | mkdir -p yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/{friend,group,message} |
| | | mkdir -p yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/{friend,group,message} |
| | | ``` |
| | | |
| | | ### 2.2 å建 pom.xml |
| | | |
| | | **yudao-module-im-api/pom.xml:** |
| | | |
| | | ```xml |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-im</artifactId> |
| | | <version>${revision}</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <artifactId>yudao-module-im-api</artifactId> |
| | | <packaging>jar</packaging> |
| | | |
| | | <name>${project.artifactId}</name> |
| | | <description>IM 峿¶é讯模å API</description> |
| | | |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-framework-common</artifactId> |
| | | </dependency> |
| | | </dependencies> |
| | | </project> |
| | | ``` |
| | | |
| | | **yudao-module-im-biz/pom.xml:** |
| | | |
| | | ```xml |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-im</artifactId> |
| | | <version>${revision}</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <artifactId>yudao-module-im-biz</artifactId> |
| | | <packaging>jar</packaging> |
| | | |
| | | <name>${project.artifactId}</name> |
| | | <description>IM 峿¶é讯模åä¸å¡å®ç°</description> |
| | | |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-im-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-system-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- Web ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-web</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-security</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- DB ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-mybatis</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-redis</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- WebSocket --> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-websocket</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Test æµè¯ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-test</artifactId> |
| | | </dependency> |
| | | </dependencies> |
| | | </project> |
| | | ``` |
| | | |
| | | ### 2.3 æ§è¡æ°æ®åº SQL |
| | | |
| | | ```bash |
| | | # æ§è¡ IM 模åè¡¨ç»æ SQL |
| | | mysql -u root -p mom_pro < docs/im_module.sql |
| | | ``` |
| | | |
| | | ### 2.4 å¨ yudao-server/pom.xml 䏿·»å ä¾èµ |
| | | |
| | | ```xml |
| | | <!-- IM 峿¶é讯模å --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-im-biz</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãæ ¸å¿å®ä½ç±»ç¤ºä¾ |
| | | |
| | | ### 3.1 ImFriendDO.java |
| | | |
| | | ```java |
| | | package cn.iocoder.yudao.module.im.dal.dataobject.friend; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | /** |
| | | * 好åå
³ç³» DO |
| | | */ |
| | | @TableName("im_friend") |
| | | @KeySequence("im_friend_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class ImFriendDO extends BaseDO { |
| | | |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** ç¨æ·ç¼å· */ |
| | | private Long userId; |
| | | |
| | | /** 好åç¨æ·ç¼å· */ |
| | | private Long friendUserId; |
| | | |
| | | /** 好å夿³¨ */ |
| | | private String remark; |
| | | |
| | | /** 好åç¶æï¼0æ£å¸¸ 1å·²å é¤ï¼ */ |
| | | private Integer status; |
| | | |
| | | } |
| | | ``` |
| | | |
| | | ### 3.2 ImGroupDO.java |
| | | |
| | | ```java |
| | | package cn.iocoder.yudao.module.im.dal.dataobject.group; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | /** |
| | | * ç¾¤ç» DO |
| | | */ |
| | | @TableName("im_group") |
| | | @KeySequence("im_group_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class ImGroupDO extends BaseDO { |
| | | |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** 群åç§° */ |
| | | private String name; |
| | | |
| | | /** 群头å */ |
| | | private String avatar; |
| | | |
| | | /** ç¾¤ä¸»ç¨æ·ç¼å· */ |
| | | private Long ownerUserId; |
| | | |
| | | /** 群å
Œ */ |
| | | private String notice; |
| | | |
| | | /** ç¾¤ç¶æï¼0æ£å¸¸ 1已解æ£ï¼ */ |
| | | private Integer status; |
| | | |
| | | } |
| | | ``` |
| | | |
| | | ### 3.3 ImPrivateMessageDO.java |
| | | |
| | | ```java |
| | | package cn.iocoder.yudao.module.im.dal.dataobject.message; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * ç§èæ¶æ¯ DO |
| | | */ |
| | | @TableName("im_private_message") |
| | | @KeySequence("im_private_message_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class ImPrivateMessageDO extends BaseDO { |
| | | |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** åé人ç¼å· */ |
| | | private Long fromUserId; |
| | | |
| | | /** æ¥æ¶äººç¼å· */ |
| | | private Long toUserId; |
| | | |
| | | /** æ¶æ¯å
容 */ |
| | | private String content; |
| | | |
| | | /** æ¶æ¯ç±»å */ |
| | | private Integer messageType; |
| | | |
| | | /** æ¶æ¯ç¶æï¼0æªè¯» 2å·²æ¤å 3å·²è¯»ï¼ */ |
| | | private Integer status; |
| | | |
| | | /** åéæ¶é´ */ |
| | | private LocalDateTime sendTime; |
| | | |
| | | /** 已读æ¶é´ */ |
| | | private LocalDateTime readTime; |
| | | |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## åãä¸å¡æµç¨è¯´æ |
| | | |
| | | ### 4.1 好忷»å æµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â åé好å â -> â å¯¹æ¹æ¶å° â -> â åæ/æç» â -> â 建ç«å¥½å â |
| | | â ç³è¯· â â ç³è¯·éç¥ â â ç³è¯· â â å
³ç³» â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â â â |
| | | v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â im_friend_ â â WebSocket â â im_friend â |
| | | â request â â æ¨ééç¥ â â 表æ°å¢ â |
| | | â 表æ°å¢ â â â â â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | ``` |
| | | |
| | | ### 4.2 ç§èæ¶æ¯æµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â åéæ¶æ¯ â -> â WebSocket â -> â æ¥æ¶æ¶æ¯ â -> â å·²è¯»åæ§ â |
| | | â â â æ¨é â â â â â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â â â â |
| | | v v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â im_private_ â â 宿¶æ¨é â â æ¶æ¯å
¥åº â â æ´æ°å·²è¯» â |
| | | â message â â ç»æ¥æ¶äºº â â ç¶ææªè¯» â â ç¶æ â |
| | | â å
¥åº â â â â â â â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | ``` |
| | | |
| | | ### 4.3 群èç®¡çæµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â å建群è â -> â æ·»å æå â -> â 群å
è天 â -> â è§£æ£ç¾¤è â |
| | | â â â â â â â â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â â â â |
| | | v v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â im_group â â im_group_ â â im_group_ â â æ´æ°ç¾¤ç¶æ â |
| | | â 表æ°å¢ â â member â â message â â ä¸ºå·²è§£æ£ â |
| | | â â â 表æ°å¢ â â å
¥åº â â â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãèåé
ç½® |
| | | |
| | | éè¦å¨ system_menu è¡¨ä¸æ·»å IM 模åçèåï¼ |
| | | |
| | | ```sql |
| | | -- IM 模åä¸çº§èå |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2100, '峿¶é讯', '', 1, 30, 0, '/im', 'message', NULL, 0, b'1', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- 好å管ç |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2101, '好å管ç', '', 2, 1, 2100, 'friend', '', 'im/friend/index', 0, b'1', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- 群è管ç |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2102, '群è管ç', '', 2, 2, 2100, 'group', '', 'im/group/index', 0, b'1', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | |
| | | -- æ¶æ¯ç®¡ç |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2103, 'æ¶æ¯ç®¡ç', '', 2, 3, 2100, 'message', '', 'im/message/index', 0, b'1', 'admin', NOW(), 'admin', NOW(), b'0'); |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
ãæ³¨æäºé¡¹ |
| | | |
| | | 1. **WebSocket é
ç½®**: IM 模åä¾èµ WebSocket å®ç°å®æ¶é讯ï¼éè¦é
ç½® WebSocket ç«¯ç¹ |
| | | 2. **Redis æ¶æ¯éå**: å»ºè®®ä½¿ç¨ Redis Pub/Sub å®ç°æ¶æ¯å¹¿æ |
| | | 3. **ç¦»çº¿æ¶æ¯åå¨**: ç¨æ·ç¦»çº¿æ¶çæ¶æ¯éè¦æä¹
åï¼ä¸çº¿åæ¨é |
| | | 4. **æ¶æ¯å®å
¨**: æ¶æ¯å
容éè¦èèææè¯è¿æ»¤ã XSS 鲿¤ |
| | | 5. **æ§è½ä¼å**: é«å¹¶ååºæ¯å»ºè®®ä½¿ç¨æ¶æ¯éååå³°å¡«è°· |
| | | |
| | | --- |
| | | |
| | | **ææ¡£çæ¬**: v1.0 |
| | | **åå»ºæ¥æ**: 2026-06-29 |
| | | **éç¨é¡¹ç®**: mom-pro2-after |
| | | **表æ°é**: 11 å¼ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # MDM ç©æä¸»æ°æ®æ¨¡åæ¹é - åç«¯åæ´ææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬æ¬¡æ¹é å° ERPãMESãWMS ä¸ä¸ªæ¨¡åçç©æ/äº§åæ°æ®ç»ä¸å° MDMï¼ä¸»æ°æ®ç®¡çï¼æ¨¡åï¼æ¶é¤æ°æ®å¤å²ã |
| | | |
| | | ## 模ååæ´ |
| | | |
| | | ### 1. MDM 模åï¼æ°å¢ï¼ |
| | | |
| | | æ°å¢ MDM ç©æä¸»æ°æ®ç®¡ç模åï¼å
å«ä»¥ä¸é¡µé¢ï¼ |
| | | |
| | | | é¡µé¢ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | ç©æç®¡ç | /mdm/item | ç©æä¸»æ°æ®ç®¡ç | |
| | | | ç©æåç±» | /mdm/category | ç©æå类管ç | |
| | | | 计éåä½ | /mdm/unit | 计éåä½ç®¡ç | |
| | | | åç管ç | /mdm/brand | åç管ç | |
| | | | ä»åºç®¡ç | /mdm/warehouse | ä»åºä¸»æ°æ®ç®¡ç | |
| | | |
| | | ### 2. ERP 模å |
| | | |
| | | ERP äº§åæ°æ®æ¥æºäº MDMï¼åæ´å¦ä¸ï¼ |
| | | |
| | | | åé¡µé¢ | åå | |
| | | |--------|------| |
| | | | /erp/product | äº§åæ°æ®ä» MDM è·åï¼é¡µé¢ä¿ç使°æ®æºåæ´ | |
| | | |
| | | ### 3. MES 模å |
| | | |
| | | MES ç©ææ°æ®æ¥æºäº MDMï¼åæ´å¦ä¸ï¼ |
| | | |
| | | | åé¡µé¢ | åå | |
| | | |--------|------| |
| | | | /mes/md/item | ç©ææ°æ®ä» MDM è·åï¼é¡µé¢ä¿ç使°æ®æºåæ´ | |
| | | |
| | | ### 4. WMS 模å |
| | | |
| | | WMS ååå SKU æ°æ®æ¥æºäº MDMï¼åæ´å¦ä¸ï¼ |
| | | |
| | | | åé¡µé¢ | åå | |
| | | |--------|------| |
| | | | /wms/item | ååæ°æ®ä» MDM è·åï¼é¡µé¢ä¿ç使°æ®æºåæ´ | |
| | | | /wms/item-sku | SKU æ°æ®ä» MDM è·åï¼é¡µé¢ä¿ç使°æ®æºåæ´ | |
| | | |
| | | --- |
| | | |
| | | ## API åæ´è¯´æ |
| | | |
| | | ### MDM ç©æ API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /mdm/item/create | åå»ºç©æ | |
| | | | PUT | /mdm/item/update | æ´æ°ç©æ | |
| | | | PUT | /mdm/item/update-status | æ´æ°ç©æç¶æ | |
| | | | DELETE | /mdm/item/delete | å é¤ç©æï¼å®é
为ç¦ç¨ï¼ | |
| | | | GET | /mdm/item/get | è·åç©æ | |
| | | | GET | /mdm/item/page | è·åç©æå页 | |
| | | | GET | /mdm/item/list-by-ids | è·åç©æå表 | |
| | | |
| | | **请æ±åæ°ï¼å建ï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | code | String | æ¯ | ç©æç¼ç | |
| | | | name | String | æ¯ | ç©æåç§° | |
| | | | barCode | String | å¦ | ç©ææ¡ç | |
| | | | specification | String | å¦ | è§æ ¼åå· | |
| | | | categoryId | Long | æ¯ | ç©æåç±»ç¼å· | |
| | | | unitMeasureId | Long | æ¯ | 计éåä½ç¼å· | |
| | | | brandId | Long | å¦ | åçç¼å· | |
| | | | itemType | Integer | æ¯ | ç©æç±»åï¼1:ç©æ, 2:产å, 3:åæåï¼ | |
| | | | status | Integer | å¦ | ç¶æï¼0:å¯ç¨, 1:ç¦ç¨ï¼ | |
| | | | purchasePrice | BigDecimal | å¦ | éè´ä»·æ ¼ | |
| | | | salesPrice | BigDecimal | å¦ | éå®ä»·æ ¼ | |
| | | | costPrice | BigDecimal | å¦ | ææ¬ä»·æ ¼ | |
| | | | safetyStock | BigDecimal | å¦ | å®å
¨åºå | |
| | | | expiryDays | Integer | å¦ | ä¿è´¨æå¤©æ° | |
| | | | isBatchManaged | Boolean | å¦ | æ¯å¦æ¹æ¬¡ç®¡ç | |
| | | | remark | String | å¦ | 夿³¨ | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": 1, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ### MDM ç©æåç±» API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /mdm/category/create | å建åç±» | |
| | | | PUT | /mdm/category/update | æ´æ°åç±» | |
| | | | DELETE | /mdm/category/delete | å é¤åç±» | |
| | | | GET | /mdm/category/get | è·ååç±» | |
| | | | GET | /mdm/category/list | è·ååç±»å表 | |
| | | | GET | /mdm/category/list-all-simple | è·åå¯ç¨çåç±»å表 | |
| | | |
| | | ### MDM 计éåä½ API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /mdm/unit/create | å建åä½ | |
| | | | PUT | /mdm/unit/update | æ´æ°åä½ | |
| | | | DELETE | /mdm/unit/delete | å é¤åä½ | |
| | | | GET | /mdm/unit/get | è·ååä½ | |
| | | | GET | /mdm/unit/page | è·ååä½å页 | |
| | | | GET | /mdm/unit/list-by-ids | è·ååä½å表 | |
| | | |
| | | ### MDM åç API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /mdm/brand/create | å建åç | |
| | | | PUT | /mdm/brand/update | æ´æ°åç | |
| | | | DELETE | /mdm/brand/delete | å é¤åç | |
| | | | GET | /mdm/brand/get | è·ååç | |
| | | | GET | /mdm/brand/page | è·ååçå页 | |
| | | | GET | /mdm/brand/list-by-ids | è·ååçå表 | |
| | | |
| | | ### MDM ä»åº API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /mdm/warehouse/create | å建ä»åº | |
| | | | PUT | /mdm/warehouse/update | æ´æ°ä»åº | |
| | | | PUT | /mdm/warehouse/update-status | æ´æ°ä»åºç¶æ | |
| | | | DELETE | /mdm/warehouse/delete | å é¤ä»åº | |
| | | | GET | /mdm/warehouse/get | è·åä»åº | |
| | | | GET | /mdm/warehouse/page | è·åä»åºå页 | |
| | | | GET | /mdm/warehouse/list-by-ids | è·åä»åºå表 | |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. ERP 产åé¡µé¢ |
| | | |
| | | ERP 产å页颿¹ä¸ºä» MDM è·åæ°æ®ï¼å端éè¦ä¿®æ¹ï¼ |
| | | |
| | | **API è°ç¨åæ´ï¼** |
| | | |
| | | ```js |
| | | // åè°ç¨ ERP 产å API |
| | | import { getProductPage, getProduct } from '@/api/erp/product' |
| | | |
| | | // æ¹ä¸ºè°ç¨ MDM ç©æ APIï¼itemType=2 产åï¼ |
| | | import { getItemPage, getItem } from '@/api/mdm/item' |
| | | |
| | | // æ¥è¯¢æ¶éè¦ä¼ å
¥ itemType=2ï¼äº§åç±»åï¼ |
| | | getItemPage({ itemType: 2, pageNo: 1, pageSize: 10 }) |
| | | ``` |
| | | |
| | | **åæ®µæ å°ï¼** |
| | | |
| | | | ERP åæ®µ | MDM åæ®µ | 说æ | |
| | | |----------|----------|------| |
| | | | id | id | ç¼å· | |
| | | | barCode | code | ç¼ç ï¼åæ¡ç æ¹ä¸ºç¼ç ï¼ | |
| | | | name | name | åç§° | |
| | | | spec | specification | è§æ ¼åå· | |
| | | | categoryId | categoryId | åç±»ç¼å· | |
| | | | unitId | unitMeasureId | åä½ç¼å· | |
| | | | brandId | brandId | åçç¼å· | |
| | | | status | status | ç¶æ | |
| | | | purchasePrice | purchasePrice | éè´ä»·æ ¼ | |
| | | | salePrice | salesPrice | éå®ä»·æ ¼ | |
| | | | minPrice | costPrice | æä½ä»·æ ¼æ¹ä¸ºææ¬ä»· | |
| | | |
| | | ### 2. MES ç©æé¡µé¢ |
| | | |
| | | MES ç©æé¡µé¢æ¹ä¸ºä» MDM è·åæ°æ®ï¼ |
| | | |
| | | **API è°ç¨åæ´ï¼** |
| | | |
| | | ```js |
| | | // åè°ç¨ MES ç©æ API |
| | | import { getItemPage, getItem } from '@/api/mes/md/item' |
| | | |
| | | // æ¹ä¸ºè°ç¨ MDM ç©æ APIï¼itemType=1 ç©æï¼ |
| | | import { getItemPage, getItem } from '@/api/mdm/item' |
| | | |
| | | // æ¥è¯¢æ¶éè¦ä¼ å
¥ itemType=1ï¼ç©æç±»åï¼ |
| | | getItemPage({ itemType: 1, pageNo: 1, pageSize: 10 }) |
| | | ``` |
| | | |
| | | **MES ç¹æåè½ä¿çï¼** |
| | | - æ¹æ¬¡å±æ§é
ç½®ï¼ä»ç± MES 模å管ç |
| | | - BOM é
ç½®ï¼ä»ç± MES 模å管ç |
| | | - SOP/SIP é
ç½®ï¼ä»ç± MES 模å管ç |
| | | |
| | | ### 3. WMS åå/SKU é¡µé¢ |
| | | |
| | | WMS ååå SKU 页颿¹ä¸ºä» MDM è·åæ°æ®ï¼ |
| | | |
| | | **API è°ç¨åæ´ï¼** |
| | | |
| | | ```js |
| | | // åè°ç¨ WMS åå API |
| | | import { getItemPage, getItem } from '@/api/wms/item' |
| | | |
| | | // æ¹ä¸ºè°ç¨ MDM ç©æ API |
| | | import { getItemPage, getItem } from '@/api/mdm/item' |
| | | |
| | | // SKU æ°æ® |
| | | import { getItemSkuList } from '@/api/mdm/item-sku' |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **ç©æç±»ååºå**ï¼ |
| | | - itemType=1ï¼ç©æï¼MES 使ç¨ï¼ |
| | | - itemType=2ï¼äº§åï¼ERP 使ç¨ï¼ |
| | | - itemType=3ï¼åæå |
| | | |
| | | 2. **å 餿ä½**ï¼MDM ç©æå é¤å®é
为ç¦ç¨æä½ï¼ä¸åç©çå é¤ |
| | | |
| | | 3. **SKU 模å¼**ï¼ææç©æå¿
é¡»é
ç½® SKUï¼ERP/MES æ°æ®è¿ç§»æ¶èªå¨å建é»è®¤ SKU |
| | | |
| | | 4. **ååå
¼å®¹**ï¼å模åç API æ¥å£ä¿çï¼å
é¨è°ç¨ MDM API |
| | | |
| | | --- |
| | | |
| | | ## æ°æ®åºè¡¨ |
| | | |
| | | | 表å | 说æ | |
| | | |------|------| |
| | | | mdm_item | ç©æä¸»æ°æ®è¡¨ | |
| | | | mdm_item_sku | ç©æ SKU 表 | |
| | | | mdm_item_category | ç©æå类表 | |
| | | | mdm_unit_measure | 计éåä½è¡¨ | |
| | | | mdm_brand | åç表 | |
| | | | mdm_warehouse | ä»åºè¡¨ | |
| | | | mdm_item_batch_config | æ¹æ¬¡å±æ§é
置表 | |
| | |
| | | |
| | | ### 1.1 项ç®ç®ä» |
| | | |
| | | èé ruoyi-vue-pro æ¯ä¸å¥å
¨é¨å¼æºçä¼ä¸çº§å¿«éå¼åå¹³å°ï¼åºäº Spring Boot 4.0 + Vue 3 æå»ºï¼å
å«ç³»ç»ç®¡çã工使µãCRMãERPãMESãWMS çå¤ä¸ªä¸å¡æ¨¡åã |
| | | èé ruoyi-vue-pro æ¯ä¸å¥å
¨é¨å¼æºçä¼ä¸çº§å¿«éå¼åå¹³å°ï¼åºäº Spring Boot 4.0 + Vue 3 æå»ºï¼å
å«ç³»ç»ç®¡çã工使µãCRMãERPãMESãWMSãMDM çå¤ä¸ªä¸å¡æ¨¡åã |
| | | |
| | | ### 1.2 å·²è§£éæ¨¡å |
| | | |
| | |
| | | | yudao-module-infra | åºç¡è®¾æ½ï¼ä»£ç çæãæä»¶ã宿¶ä»»å¡çï¼ | 11 | |
| | | | yudao-module-bpm | 工使µå¼æ | 8 | |
| | | | yudao-module-crm | 客æ·å
³ç³»ç®¡ç | 19 | |
| | | | yudao-module-mdm | ä¸»æ°æ®ç®¡çï¼ç»ä¸ç©æãåç±»ãåä½çï¼ | 6 | |
| | | | yudao-module-erp | ä¼ä¸èµæºè®¡å | 33 | |
| | | | yudao-module-mes | å¶é æ§è¡ç³»ç» | 71 | |
| | | | yudao-module-wms | ä»åºç®¡çç³»ç» | 16 | |
| | | | yudao-module-wms | ä»åºç®¡çç³»ç» | 18 | |
| | | |
| | | ### 1.3 模åéææ¶æï¼æ ¸å¿æ¹é ï¼ |
| | | |
| | | æ¬é¡¹ç®å·²å®ç° **MDM ä¸»æ°æ®ç®¡ç** 模åï¼æé ERPãMESãWMS ä¸ä¸ªä¸å¡æ¨¡åçæ°æ®å¤å²ï¼ |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââ |
| | | â MDM ä¸»æ°æ®ç®¡ç模å â |
| | | â (ç©æãSKUãåç±»ãåä½ãåç) â |
| | | ââââââââââââââââ¬âââââââââââââââââââââââ |
| | | â |
| | | ââââââââââââââââââââ¼âââââââââââââââââââ |
| | | â â â |
| | | â¼ â¼ â¼ |
| | | âââââââââââââââââ âââââââââââââââââ âââââââââââââââââ |
| | | â ERP 模å â â WMS 模å â â MES 模å â |
| | | â 产å = æå â â åå = ç©æ â â ç©æ = åæ â |
| | | â itemType=2 â â itemType=1 â â itemType=1 â |
| | | âââââââââ¬ââââââââ âââââââââ¬ââââââââ âââââââââ¬ââââââââ |
| | | â â â |
| | | ââââââââââââââââââââ¼âââââââââââââââââââ |
| | | â |
| | | âââââââââââââââ¼ââââââââââââââ |
| | | â WMS åºå管ç API â |
| | | â (ç»ä¸åºåå
¥åº/åºåº/æ¥è¯¢) â |
| | | âââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | **æ°æ®ç»ä¸è¯´æï¼** |
| | | |
| | | | ä¸å¡æ¨¡å | åæ°æ®è¡¨ | ç°æ°æ®æº | ç©æç±»åæ å° | |
| | | |----------|----------|----------|--------------| |
| | | | ERP | erp_product | MDM Item | itemType=2ï¼æåï¼ | |
| | | | WMS | wms_item + wms_item_sku | MDM Item + SKU | itemType=1ï¼ç©æï¼ | |
| | | | MES | mes_md_item | MDM Item | itemType=1ï¼ç©æï¼ | |
| | | |
| | | --- |
| | | |
| | |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãåè½æ¨¡å工使µç¨ |
| | | ## ä¸ãä¸»æ°æ®ç®¡ç模å (MDM) |
| | | |
| | | ### 3.1 ç³»ç»ç®¡ç模å (System) |
| | | ### 3.1 MDM æ¨¡åæ¦è¿° |
| | | |
| | | #### 3.1.1 ç¨æ·ç®¡çæµç¨ |
| | | MDMï¼Master Data Managementï¼ä¸»æ°æ®ç®¡çæ¨¡åæ¯æ´ä¸ªç³»ç»çæ°æ®æ ¸å¿ï¼è´è´£ç»ä¸ç®¡çï¼ |
| | | |
| | | - **ç©æä¸»æ°æ®** - 产åãç©æãåæåçç»ä¸æ¡£æ¡ |
| | | - **ç©æ SKU** - ç©æçè§æ ¼åä½ï¼å°ºå¯¸ãé¢è²çï¼ |
| | | - **ç©æåç±»** - ç©æçåç±»ä½ç³» |
| | | - **计éåä½** - ç»ä¸ç计éåä½ç®¡ç |
| | | - **åç管ç** - åçæ¡£æ¡ç®¡ç |
| | | |
| | | ### 3.2 ç©æç±»å说æ |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â MDM ç©æç±»å (itemType) â |
| | | ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠|
| | | â 1 - ç©æ/åæ â ç¨äº WMS ååãMES ç©æ â |
| | | â 2 - æå/产å â ç¨äº ERP 产å â |
| | | â 3 - åæå â ç¨äº MES ç产ä¸é´ä»¶ â |
| | | â 4 - è¾
æ â ç¨äºç产è¾
婿æ â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | ### 3.3 ç©æç®¡çæµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â åå»ºç©æ â -> â 设置åç±» â -> â é
ç½® SKU â -> â å¯ç¨ç©æ â |
| | | â åºæ¬ä¿¡æ¯ â â åä½åç â â è§æ ¼ä»·æ ¼ â â â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â â â |
| | | v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â ç¼ç çæ â â åç±»å
³è â â å¤è§æ ¼æ¯æ â |
| | | â æ¡ç 管ç â â å使¢ç® â â ä»·æ ¼ä½ç³» â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | ``` |
| | | |
| | | **æä½æ¥éª¤ï¼** |
| | | |
| | | 1. è¿å
¥ãMDMã->ãç©æç®¡çã |
| | | 2. ç¹å»ãæ°å¢ãï¼å¡«åç©æåºæ¬ä¿¡æ¯ |
| | | - ç©æç¼ç ï¼å¯ä¸ï¼ |
| | | - ç©æåç§° |
| | | - ç©ææ¡ç |
| | | - è§æ ¼åå· |
| | | 3. éæ©ç©æåç±»ã计éåä½ãåç |
| | | 4. è®¾ç½®ç©æç±»åï¼ç©æ/æå/åæåï¼ |
| | | 5. é
ç½®ä»·æ ¼ï¼éè´ä»·ãéå®ä»·ãææ¬ä»·ï¼ |
| | | 6. ä¿ååï¼å¯æ·»å SKU è§æ ¼ |
| | | |
| | | **æ¶å表ï¼** |
| | | - `mdm_item` - ç©æä¸»è¡¨ |
| | | - `mdm_item_sku` - ç©æ SKU 表 |
| | | - `mdm_item_category` - ç©æå类表 |
| | | - `mdm_unit_measure` - 计éåä½è¡¨ |
| | | - `mdm_brand` - åç表 |
| | | |
| | | ### 3.4 SKU 管ç说æ |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â ç©æ (Item) â |
| | | â id: 1001 code: ITEM001 name: Tæ¤ â |
| | | ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠|
| | | â SKU å表 â |
| | | âââââââââââââââââââ¬ââââââââââââââââââ¬âââââââââââââââââââââââââ⤠|
| | | â SKU-001 â SKU-002 â SKU-003 â |
| | | â çº¢è² / L â èè² / M â é»è² / XL â |
| | | â æ¡ç : 001REDL â æ¡ç : 001BLUEM â æ¡ç : 001BLACKXL â |
| | | â éå®ä»·: 99 â éå®ä»·: 99 â éå®ä»·: 109 â |
| | | âââââââââââââââââââ´ââââââââââââââââââ´ââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | **SKU åæ®µï¼** |
| | | - SKU ç¼ç ãSKU åç§°ãSKU æ¡ç |
| | | - 尺寸ï¼é¿/宽/é«ï¼ |
| | | - ééï¼æ¯é/åéï¼ |
| | | - ä»·æ ¼ï¼ææ¬ä»·/éå®ä»·ï¼ |
| | | |
| | | --- |
| | | |
| | | ## åãåè½æ¨¡å工使µç¨ |
| | | |
| | | ### 4.1 ç³»ç»ç®¡ç模å (System) |
| | | |
| | | #### 4.1.1 ç¨æ·ç®¡çæµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | |
| | | - `system_user_role` - ç¨æ·è§è²å
³è表 |
| | | - `system_user_post` - ç¨æ·å²ä½å
³è表 |
| | | |
| | | #### 3.1.2 è§è²æéé
ç½®æµç¨ |
| | | #### 4.1.2 è§è²æéé
ç½®æµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | |
| | | |
| | | --- |
| | | |
| | | ### 3.2 工使µæ¨¡å (BPM) |
| | | ### 4.2 工使µæ¨¡å (BPM) |
| | | |
| | | #### 3.2.1 æµç¨è®¾è®¡æµç¨ |
| | | #### 4.2.1 æµç¨è®¾è®¡æµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | |
| | | - `bpm_form` - 表åå®ä¹è¡¨ |
| | | - `bpm_process_definition_info` - æµç¨å®ä¹æ©å±è¡¨ |
| | | |
| | | #### 3.2.2 æµç¨å®¡æ¹æµç¨ |
| | | #### 4.2.2 æµç¨å®¡æ¹æµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | |
| | | |
| | | --- |
| | | |
| | | ### 3.3 客æ·å
³ç³»ç®¡ç模å (CRM) |
| | | ### 4.3 客æ·å
³ç³»ç®¡ç模å (CRM) |
| | | |
| | | #### 3.3.1 çº¿ç´¢è½¬å®¢æ·æµç¨ |
| | | #### 4.3.1 çº¿ç´¢è½¬å®¢æ·æµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | |
| | | - `crm_follow_up_record` - è·è¿è®°å½è¡¨ |
| | | - `crm_permission` - æ°æ®æé表 |
| | | |
| | | #### 3.3.2 åæºé宿µç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â åå»ºåæº â -> â å
³è产å â -> â é¶æ®µæ¨è¿ â -> â çæåå â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â â â |
| | | v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â åæºé¶æ®µ â â äº§åæ¥ä»· â â èµ¢å/è¾å â |
| | | â 管ç â â â â â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | ``` |
| | | |
| | | **æ¶å表ï¼** |
| | | - `crm_business` - åæºè¡¨ |
| | | - `crm_business_product` - åæºäº§åå
³è表 |
| | | - `crm_business_status` - åæºç¶æè¡¨ |
| | | - `crm_contract` - åå表 |
| | | |
| | | --- |
| | | |
| | | ### 3.4 ä¼ä¸èµæºè®¡å模å (ERP) |
| | | ### 4.4 ä¼ä¸èµæºè®¡å模å (ERP) |
| | | |
| | | #### 3.4.1 éè´ä¸å¡æµç¨ |
| | | #### 4.4.1 产å管çï¼MDM éæï¼ |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â ERP 产å = MDM ç©æ (itemType=2) â |
| | | ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠|
| | | â ErpProductService â |
| | | â â â |
| | | â â¼ â |
| | | â MdmItemApi.createItem() âââ MDM åå»ºç©æ â |
| | | â MdmItemApi.updateItem() âââ MDM æ´æ°ç©æ â |
| | | â MdmItemApi.getItem() âââ MDM æ¥è¯¢ç©æ â |
| | | â MdmItemApi.getItemPage() âââ MDM å页æ¥è¯¢ â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | **åæ®µæ å°ï¼** |
| | | |
| | | | ERP åæ®µ | MDM åæ®µ | 说æ | |
| | | |----------|----------|------| |
| | | | id | id | ç»ä¸ ID | |
| | | | name | name | 产ååç§° | |
| | | | barCode | barCode | äº§åæ¡ç | |
| | | | standard | specification | è§æ ¼åå· | |
| | | | unitId | unitMeasureId | åä½ç¼å· | |
| | | | salePrice | salesPrice | éå®ä»·æ ¼ | |
| | | | minPrice | costPrice | æä½ä»·æ ¼/ææ¬ä»· | |
| | | |
| | | #### 4.4.2 éè´ä¸å¡æµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | |
| | | â â â â |
| | | v v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â éæ±é¨é¨ â â ä¾åºå â â ä»åº â â è´¢å¡ â |
| | | â åèµ· â â 确认 â â éªæ¶ â â ç»ç® â |
| | | â éæ±é¨é¨ â â ä¾åºå â â WMSå
¥åº â â è´¢å¡ â |
| | | â åèµ· â â 确认 â â APIè°ç¨ â â ç»ç® â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | ``` |
| | | |
| | | **éè´è®¢åæä½æ¥éª¤ï¼** |
| | | **éè´å
¥åºéæï¼** |
| | | |
| | | 1. è¿å
¥ãERPã->ãéè´ç®¡çã->ãéè´è®¢åã |
| | | 2. ç¹å»ãæ°å¢ãï¼éæ©ä¾åºå |
| | | 3. æ·»å éè´äº§åæç»ï¼äº§åãæ°éãåä»·ï¼ |
| | | 4. è®¾ç½®äº¤è´§æ¥æãç»ç®è´¦æ· |
| | | 5. ç¹å»ãæäº¤ãæç´æ¥ãå®¡æ ¸ã |
| | | 6. 订åå®¡æ ¸åï¼å¯è¿è¡å
¥åºæä½ |
| | | |
| | | **éè´å
¥åºæä½æ¥éª¤ï¼** |
| | | |
| | | 1. è¿å
¥ãéè´å
¥åºãé¡µé¢ |
| | | 2. éæ©å·²å®¡æ ¸çéè´è®¢å |
| | | 3. ç³»ç»èªå¨å¸¦å
¥äº§åæç» |
| | | 4. éæ©å
¥åºä»åº |
| | | 5. 确认å
¥åºæ°éï¼ç¹å»ãæäº¤ã |
| | | 6. å®¡æ ¸éè¿åï¼åºåèªå¨å¢å |
| | | ``` |
| | | ERP éè´å
¥åº |
| | | â |
| | | â¼ |
| | | ErpStockRecordService.createStockRecord() |
| | | â |
| | | â¼ |
| | | WmsInventoryApi.receipt() âââ WMS å
¥åºæä½ |
| | | â |
| | | â¼ |
| | | WMS åºåå¢å |
| | | ``` |
| | | |
| | | **æ¶å表ï¼** |
| | | - `erp_supplier` - ä¾åºå表 |
| | | - `erp_purchase_order` - éè´è®¢å表 |
| | | - `erp_purchase_order_items` - éè´è®¢å项表 |
| | | - `erp_purchase_in` - éè´å
¥åºè¡¨ |
| | | - `erp_stock` - åºå表 |
| | | - `erp_stock_record` - åºåæµæ°´è¡¨ï¼ERP æ¬å°è®°å½ï¼ |
| | | |
| | | #### 3.4.2 éå®ä¸å¡æµç¨ |
| | | #### 4.4.3 éå®ä¸å¡æµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | |
| | | â â â â |
| | | v v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â 客æ·è¯¢ä»· â â ååç¾è®¢ â â åè´§ â â 对账å¼ç¥¨ â |
| | | â 客æ·è¯¢ä»· â â ååç¾è®¢ â â WMSåºåº â â 对账å¼ç¥¨ â |
| | | â â â â â APIè°ç¨ â â â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | ``` |
| | | |
| | | **éå®åºåºéæï¼** |
| | | |
| | | ``` |
| | | ERP éå®åºåº |
| | | â |
| | | â¼ |
| | | ErpStockRecordService.createStockRecord() |
| | | â |
| | | â¼ |
| | | WmsInventoryApi.shipment() âââ WMS åºåºæä½ |
| | | â |
| | | â¼ |
| | | WMS åºååå° |
| | | ``` |
| | | |
| | | **æ¶å表ï¼** |
| | |
| | | - `erp_sale_out` - éå®åºåºè¡¨ |
| | | - `erp_finance_receipt` - æ¶æ¬¾å表 |
| | | |
| | | #### 3.4.3 åºåç®¡çæµç¨ |
| | | #### 4.4.4 åºåæ¥è¯¢ï¼WMS éæï¼ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â åºåæ¥è¯¢ â -> â åºåçç¹ â -> â åºåè°æ¨ â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â â â |
| | | v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â 宿¶åºå â â çç/çäº â â è·¨ä»è°æ¨ â |
| | | â æç» â â å¤ç â â â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â ERP åºå = WMS åºå API â |
| | | ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠|
| | | â ErpStockService â |
| | | â â â |
| | | â â¼ â |
| | | â MdmItemSkuApi.getItemSkuListByItemId() âââ è·åé»è®¤ SKU â |
| | | â â â |
| | | â â¼ â |
| | | â WmsInventoryApi.getAvailableQuantity() âââ æ¥è¯¢å¯ç¨åºå â |
| | | â WmsInventoryApi.getInventoryList() âââ æ¥è¯¢åºåå表 â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | **æ¶å表ï¼** |
| | | - `erp_warehouse` - ä»åºè¡¨ |
| | | - `erp_stock` - åºå表 |
| | | - `erp_stock_record` - åºåæµæ°´è¡¨ |
| | | - `erp_stock_check` - çç¹å表 |
| | | - `erp_stock_move` - è°æ¨å表 |
| | | |
| | | --- |
| | | |
| | | ### 3.5 å¶é æ§è¡ç³»ç»æ¨¡å (MES) |
| | | ### 4.5 å¶é æ§è¡ç³»ç»æ¨¡å (MES) |
| | | |
| | | #### 3.5.1 çäº§ä¸»æ°æ®ç®¡çæµç¨ |
| | | #### 4.5.1 ç©æç®¡çï¼MDM éæï¼ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â ç©æç®¡ç â -> â BOM 管ç â -> â å·¥èºè·¯çº¿ â -> â å·¥ä½ç« â |
| | | â â â â â â â é
ç½® â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â â â â |
| | | v v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â ç©æåç±» â â 产åç»æ â â å·¥åºå®ä¹ â â 设å¤/人å â |
| | | â 计éåä½ â â æ¿ä»£æ â â 顺åºé
ç½® â â å·¥å
·å¤¹å
· â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â MES ç©æ = MDM ç©æ (itemType=1) â |
| | | ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠|
| | | â MesMdItemService â |
| | | â â â |
| | | â â¼ â |
| | | â MdmItemApi.getItem() âââ MDM æ¥è¯¢ç©æ â |
| | | â MdmItemApi.getItemList() âââ MDM æ¥è¯¢ç©æå表 â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | **ç©æç®¡çæä½ï¼** |
| | | |
| | | 1. è¿å
¥ãMESã->ãä¸»æ°æ®ã->ãç©æç®¡çã |
| | | 2. æ°å¢ç©æåç±»ï¼æ å½¢ç»æï¼ |
| | | 3. åå»ºç©ææ¡£æ¡ï¼ç¼ç ãåç§°ãè§æ ¼ãåä½çï¼ |
| | | 4. é
ç½®ç©ææ¹æ¬¡å±æ§ |
| | | |
| | | **å·¥èºè·¯çº¿æä½ï¼** |
| | | |
| | | 1. è¿å
¥ãå·¥èºè·¯çº¿ã管ç |
| | | 2. å
å®ä¹ãå·¥åºãï¼å å·¥ãæ£éªãè£
é
çï¼ |
| | | 3. å建工èºè·¯çº¿ï¼å
³è产å |
| | | 4. é
置工åºé¡ºåºãå·¥æ¶å®é¢ |
| | | 5. å
³èå·¥ä½ä¸å¿/è®¾å¤ |
| | | |
| | | **æ¶å表ï¼** |
| | | - `mes_md_item` - ç©æè¡¨ |
| | | - `mes_md_item_type` - ç©æå类表 |
| | | - `mes_md_product_bom` - BOM 表 |
| | | - `mes_pro_process` - å·¥åºè¡¨ |
| | | - `mes_pro_route` - å·¥èºè·¯çº¿è¡¨ |
| | | - `mes_md_workstation` - å·¥ä½ç«è¡¨ |
| | | |
| | | #### 3.5.2 ç产æ§è¡æµç¨ |
| | | #### 4.5.2 ç产æ§è¡æµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | |
| | | â â â â |
| | | v v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â 计åæç¨ â â ä»»å¡åé
â â ç©ææ¶è â â è¿åº¦åé¦ â |
| | | â ç©ææ£æ¥ â â å·¥ä½ç«ææ´¾ â â æ¹æ¬¡è¿½æº¯ â â è´¨éè®°å½ â |
| | | â 计åæç¨ â â ä»»å¡åé
â â WMSåºåº â â è¿åº¦åé¦ â |
| | | â ç©ææ£æ¥ â â å·¥ä½ç«ææ´¾ â â APIè°ç¨ â â è´¨éè®°å½ â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â |
| | | v |
| | | âââââââââââââââ |
| | | â ç产å
¥åº â |
| | | â WMSå
¥åº â |
| | | â APIè°ç¨ â |
| | | âââââââââââââââ |
| | | ``` |
| | | |
| | | **ç产工åæä½æ¥éª¤ï¼** |
| | | |
| | | 1. è¿å
¥ãMESã->ãç产管çã->ãç产工åã |
| | | 2. ç¹å»ãæ°å¢ãï¼éæ©äº§å |
| | | 3. ç³»ç»èªå¨å¸¦å
¥ BOM åå·¥èºè·¯çº¿ |
| | | 4. è®¾ç½®è®¡åæ°éã计åå¼å§/ç»ææ¶é´ |
| | | 5. ç¹å»ãä¸è¾¾ãå·¥å |
| | | 6. å·¥åä¸è¾¾åå¯è¿è¡æ´¾å·¥ã颿æä½ |
| | | |
| | | **ç产æ¥å·¥æä½ï¼** |
| | | |
| | | 1. è¿å
¥ãæ¥å·¥ãé¡µé¢ |
| | | 2. æ«ç æéæ©å·¥åãå·¥åº |
| | | 3. 填忥工æ°éï¼åæ ¼/æ¥åºï¼ |
| | | 4. è®°å½å·¥æ¶ã设å¤ä½¿ç¨æ
åµ |
| | | 5. æäº¤æ¥å·¥æ°æ® |
| | | |
| | | **æ¶å表ï¼** |
| | | - `mes_pro_work_order` - ç产工å表 |
| | |
| | | - `mes_pro_work_record` - æ¥å·¥è®°å½è¡¨ |
| | | - `mes_wm_item_consume` - ç©ææ¶è表 |
| | | |
| | | #### 3.5.3 设å¤ç®¡çæµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â 设å¤å°è´¦ â -> â ç¹æ£ä¿å
» â -> â 维修管ç â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â â â |
| | | v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â è®¾å¤æ¡£æ¡ â â ç¹æ£è®¡å â â 维修工å â |
| | | â 设å¤ç¶æ â â ä¿å
»è®¡å â â æ
éè®°å½ â |
| | | â 车é´åå¸ â â æ§è¡è®°å½ â â éªæ¶ç¡®è®¤ â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | ``` |
| | | |
| | | **设å¤ç¹æ£æä½ï¼** |
| | | |
| | | 1. è¿å
¥ã设å¤ç®¡çã->ãç¹æ£æ¹æ¡ã |
| | | 2. åå»ºç¹æ£æ¹æ¡ï¼é
ç½®ç¹æ£é¡¹ç® |
| | | 3. å
³è设å¤å卿 |
| | | 4. æ§è¡ç¹æ£æ¶ï¼è¿å
¥ãç¹æ£è®°å½ã |
| | | 5. éé¡¹æ£æ¥ï¼è®°å½ç»æ |
| | | 6. åç°å¼å¸¸ï¼èªå¨è§¦åæ¥ä¿® |
| | | |
| | | **æ¶å表ï¼** |
| | | - `mes_dv_machinery` - 设å¤å°è´¦è¡¨ |
| | | - `mes_dv_check_plan` - ç¹æ£æ¹æ¡è¡¨ |
| | | - `mes_dv_check_record` - ç¹æ£è®°å½è¡¨ |
| | | - `mes_dv_repair` - 维修工å表 |
| | | |
| | | #### 3.5.4 è´¨éç®¡çæµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â æ¥ææ£éª â -> â è¿ç¨æ£éª â -> â æåæ£éª â -> â åºè´§æ£éª â |
| | | â (IQC) â â (IPQC) â â (FQC) â â (OQC) â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â â â â |
| | | v v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â éè´å
¥åº â â çäº§å·¥åº â â çäº§å®æ â â éå®åºåº â |
| | | â åæ£éª â â æ½æ£/å·¡æ£ â â å
¨æ£/æ½æ£ â â åæ£éª â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | ``` |
| | | |
| | | **è´¨æ£æ¹æ¡é
ç½®ï¼** |
| | | |
| | | 1. è¿å
¥ãè´¨é管çã->ãè´¨æ£æ¹æ¡ã |
| | | 2. åå»ºè´¨æ£æ¨¡æ¿ï¼é
ç½®æ£æµé¡¹ç® |
| | | 3. è®¾ç½®æ½æ ·æ¹æ¡ï¼å
¨æ£/æ½æ£æ¯ä¾ï¼ |
| | | 4. é
ç½®æ£éªææ åæ åå¼ |
| | | |
| | | **æ£éªæä½ï¼** |
| | | |
| | | 1. éæ©å¾
æ£åæ®ï¼éè´å
¥åºå/ç产工åçï¼ |
| | | 2. å建æ£éªå |
| | | 3. é项æ£éªï¼è®°å½æ°æ® |
| | | 4. å¤å®ç»æï¼åæ ¼/ä¸åæ ¼/è®©æ¥æ¥æ¶ï¼ |
| | | 5. ä¸åæ ¼åè¿å
¥å¤çæµç¨ |
| | | |
| | | **æ¶å表ï¼** |
| | | - `mes_qc_template` - è´¨æ£æ¹æ¡è¡¨ |
| | | - `mes_qc_iqc` - æ¥ææ£éªè¡¨ |
| | | - `mes_qc_ipqc` - è¿ç¨æ£éªè¡¨ |
| | | - `mes_qc_oqc` - åºè´§æ£éªè¡¨ |
| | | - `mes_qc_defect_record` - 缺é·è®°å½è¡¨ |
| | | |
| | | --- |
| | | |
| | | ### 3.6 ä»åºç®¡çç³»ç»æ¨¡å (WMS) |
| | | ### 4.6 ä»åºç®¡çç³»ç»æ¨¡å (WMS) |
| | | |
| | | #### 3.6.1 å
¥åºä¸å¡æµç¨ |
| | | #### 4.6.1 åå管çï¼MDM éæï¼ |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â WMS åå = MDM ç©æ (itemType=1) â |
| | | ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠|
| | | â WmsItemService â |
| | | â â â |
| | | â â¼ â |
| | | â MdmItemApi.createItem() âââ MDM åå»ºç©æ â |
| | | â MdmItemApi.updateItem() âââ MDM æ´æ°ç©æ â |
| | | â MdmItemApi.getItemPage() âââ MDM å页æ¥è¯¢ â |
| | | â MdmItemApi.getItemList() âââ MDM æ¥è¯¢å表 â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | **åæ®µæ å°ï¼** |
| | | |
| | | | WMS åæ®µ | MDM åæ®µ | 说æ | |
| | | |----------|----------|------| |
| | | | id | id | ç»ä¸ ID | |
| | | | code | code | ååç¼ç | |
| | | | name | name | åååç§° | |
| | | | unit | unitMeasure.name | åä½åç§°ï¼ä»è®¡éåä½è·åï¼ | |
| | | | categoryId | categoryId | åç±»ç¼å· | |
| | | | brandId | brandId | åçç¼å· | |
| | | |
| | | #### 4.6.2 åºåç®¡çæ ¸å¿ |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â WMS åºå管ç API â |
| | | ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠|
| | | â WmsInventoryApi â |
| | | â â â |
| | | â ââ receipt() å
¥åºæä½ â |
| | | â â ââ åæ°: bizType, bizId, warehouseId, items[] â |
| | | â â â |
| | | â ââ shipment() åºåºæä½ â |
| | | â â ââ åæ°: bizType, bizId, warehouseId, items[] â |
| | | â â â |
| | | â ââ reserve() åºåé¢çï¼éåºåï¼ â |
| | | â â ââ åæ°: bizType, bizId, warehouseId, items[] â |
| | | â â â |
| | | â ââ releaseReserve() éæ¾é¢ç â |
| | | â â ââ åæ°: reserveNo â |
| | | â â â |
| | | â ââ getInventoryList() æ¥è¯¢åºåå表 â |
| | | â â ââ åæ°: skuIds, warehouseIds, onlyPositive â |
| | | â â â |
| | | â ââ getAvailableQuantity() æ¥è¯¢å¯ç¨åºå â |
| | | â ââ åæ°: skuId, warehouseId â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | #### 4.6.3 å
¥åºä¸å¡æµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | |
| | | v v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â ERPéè´å â â éè´§åæ® â â è´¨éæ£éª â â åºä½åé
â |
| | | â çæé¢çº¦ â â 车è¾ä¿¡æ¯ â â æ°é确认 â â æ¹æ¬¡ç®¡ç â |
| | | â MESç产å
¥åº â â 车è¾ä¿¡æ¯ â â æ°é确认 â â æ¹æ¬¡ç®¡ç â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | ``` |
| | | |
| | | **å
¥åºæä½æ¥éª¤ï¼** |
| | | **API è°ç¨ç¤ºä¾ï¼** |
| | | |
| | | 1. è¿å
¥ãWMSã->ãå
¥åºç®¡çã->ãå
¥åºåã |
| | | 2. æ°å»ºå
¥åºåï¼éæ©å
¥åºç±»åï¼éè´å
¥åº/ç产å
¥åº/å
¶ä»å
¥åºï¼ |
| | | 3. æ·»å å
¥åºååæç» |
| | | 4. éæ©ä»åº |
| | | 5. æäº¤å®¡æ ¸ |
| | | 6. å®¡æ ¸éè¿åï¼åºåå¢å |
| | | ```java |
| | | // ERP/MES è°ç¨ WMS å
¥åº |
| | | WmsReceiptReqDTO req = new WmsReceiptReqDTO(); |
| | | req.setBizType(WmsInventoryBizTypeEnum.PURCHASE_RECEIPT.getType()); |
| | | req.setBizId(purchaseInId); |
| | | req.setBizNo(purchaseInNo); |
| | | req.setWarehouseId(warehouseId); |
| | | req.setItems(List.of( |
| | | new WmsReceiptReqDTO.Item(skuId, quantity, price) |
| | | )); |
| | | wmsInventoryApi.receipt(req); |
| | | ``` |
| | | |
| | | **æ¶å表ï¼** |
| | | - `wms_receipt_order` - å
¥åºå表 |
| | | - `wms_receipt_order_detail` - å
¥åºåæç»è¡¨ |
| | | - `wms_inventory` - åºå表 |
| | | - `wms_inventory_history` - åºåæµæ°´è¡¨ |
| | | |
| | | #### 3.6.2 åºåºä¸å¡æµç¨ |
| | | #### 4.6.4 åºåºä¸å¡æµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | ``` |
| | | |
| | | **æ¶å表ï¼** |
| | | - `wms_shipment_order` - åºåºå表 |
| | | - `wms_shipment_order_detail` - åºåºåæç»è¡¨ |
| | | **API è°ç¨ç¤ºä¾ï¼** |
| | | |
| | | #### 3.6.3 åºåç®¡çæµç¨ |
| | | |
| | | ``` |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â åºåæ¥è¯¢ â -> â åºåçç¹ â -> â ç§»åºä½ä¸ â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â â â |
| | | v v v |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | â 宿¶åºå â â çççäº â â åºä½è°æ´ â |
| | | â æ¹æ¬¡è¿½æº¯ â â å·®å¼å¤ç â â åºåä¼å â |
| | | âââââââââââââââ âââââââââââââââ âââââââââââââââ |
| | | ```java |
| | | // ERP/MES è°ç¨ WMS åºåº |
| | | WmsShipmentReqDTO req = new WmsShipmentReqDTO(); |
| | | req.setBizType(WmsInventoryBizTypeEnum.SALE_SHIPMENT.getType()); |
| | | req.setBizId(saleOutId); |
| | | req.setBizNo(saleOutNo); |
| | | req.setWarehouseId(warehouseId); |
| | | req.setItems(List.of( |
| | | new WmsShipmentReqDTO.Item(skuId, quantity) |
| | | )); |
| | | wmsInventoryApi.shipment(req); |
| | | ``` |
| | | |
| | | **æ¶å表ï¼** |
| | | - `wms_inventory` - åºå表 |
| | | - `wms_check_order` - çç¹å表 |
| | | - `wms_movement_order` - ç§»åºå表 |
| | | - `wms_item_sku` - åå SKU 表 |
| | | - `wms_inventory_history` - åºåæµæ°´è¡¨ |
| | | - `wms_inventory_reserve` - åºåé¢ç表 |
| | | |
| | | --- |
| | | |
| | | ## åãç³»ç»éæè¯´æ |
| | | ## äºãç³»ç»éæè¯´æ |
| | | |
| | | ### 4.1 模åé´æ°æ®æµè½¬ |
| | | ### 5.1 模åé´æ°æ®æµè½¬ |
| | | |
| | | ``` |
| | | âââââââââââââââââââ |
| | | â System 模å â |
| | | â (ç¨æ·/æé) â |
| | | â MDM 模å â |
| | | â (ç©æä¸»æ°æ®) â |
| | | ââââââââââ¬âââââââââ |
| | | â |
| | | ââââââââââââââââ¼âââââââââââââââ |
| | | â â â |
| | | v v v |
| | | ââââââââââââââ ââââââââââââââ ââââââââââââââ |
| | | â CRM 模å â â ERP 模å â â MES 模å â |
| | | â (客æ·) â â (éè´/éå®)â â (ç产) â |
| | | â ERP 模å â â WMS 模å â â MES 模å â |
| | | â (æå) â â (ç©æ+SKU) â â (ç©æ) â |
| | | â itemType=2 â â itemType=1 â â itemType=1 â |
| | | âââââââ¬âââââââ âââââââ¬âââââââ âââââââ¬âââââââ |
| | | â â â |
| | | â â â |
| | | âââââââââââââââââ¼ââââââââââââââââ |
| | | â |
| | | âââââââvâââââââ |
| | | â WMS 模å â |
| | | â (åºå) â |
| | | â WMS åºå â |
| | | â API â |
| | | âââââââââââââââ |
| | | ``` |
| | | |
| | | ### 4.2 ä¸å¡æ°æ®å
³è |
| | | ### 5.2 API æ¥å£æ¸
å |
| | | |
| | | | ä¸å¡åºæ¯ | æ¶å模å | æ°æ®æµå | |
| | | |----------|----------|----------| |
| | | | éå®è®¢å -> åè´§ | CRM â WMS | 客æ·è®¢å触ååºåº | |
| | | | éè´è®¢å -> å
¥åº | ERP â WMS | éè´è®¢å触åå
¥åº | |
| | | | çäº§é¢æ | MES â WMS | å·¥å触å颿åºåº | |
| | | | ç产å
¥åº | MES â WMS | å®å·¥è§¦åæåå
¥åº | |
| | | | è´¨éæ£éª | WMS â MES | å
¥åºè§¦åæ¥ææ£éª | |
| | | | API æ¥å£ | æä¾æ¹ | è°ç¨æ¹ | 说æ | |
| | | |----------|--------|--------|------| |
| | | | MdmItemApi | MDM | ERP/WMS/MES | ç©æä¸»æ°æ® CRUD | |
| | | | MdmItemSkuApi | MDM | ERP/WMS/MES | SKU 管ç | |
| | | | MdmItemCategoryApi | MDM | ERP/WMS/MES | ç©æåç±» | |
| | | | MdmUnitMeasureApi | MDM | ERP/WMS/MES | 计éåä½ | |
| | | | WmsInventoryApi | WMS | ERP/MES | åºåå
¥åº/åºåº/æ¥è¯¢ | |
| | | |
| | | ### 5.3 ä¸å¡æ°æ®å
³è |
| | | |
| | | | ä¸å¡åºæ¯ | æ¶å模å | æ°æ®æµå | API è°ç¨ | |
| | | |----------|----------|----------|----------| |
| | | | ERP 产å管ç | ERP â MDM | 产å CRUD | MdmItemApi | |
| | | | WMS åå管ç | WMS â MDM | åå CRUD | MdmItemApi | |
| | | | MES ç©æç®¡ç | MES â MDM | ç©ææ¥è¯¢ | MdmItemApi | |
| | | | éè´å
¥åº | ERP â WMS | åºåå¢å | WmsInventoryApi.receipt() | |
| | | | éå®åºåº | ERP â WMS | åºååå° | WmsInventoryApi.shipment() | |
| | | | çäº§é¢æ | MES â WMS | åºååå° | WmsInventoryApi.shipment() | |
| | | | ç产å
¥åº | MES â WMS | åºåå¢å | WmsInventoryApi.receipt() | |
| | | | åºåæ¥è¯¢ | ERP/MES â WMS | åºåæ¥è¯¢ | WmsInventoryApi.getAvailableQuantity() | |
| | | |
| | | --- |
| | | |
| | | ## äºã常è§é®é¢å¤ç |
| | | ## å
ã常è§é®é¢å¤ç |
| | | |
| | | ### 5.1 ç¨æ·æ æ³ç»å½ |
| | | ### 6.1 ç¨æ·æ æ³ç»å½ |
| | | |
| | | **ææ¥æ¥éª¤ï¼** |
| | | |
| | |
| | | 4. æ£æ¥è´¦æ·æ¯å¦è¢«éå®ï¼å¯ç é误次æ°è¿å¤ï¼ |
| | | 5. æ¥çç»å½æ¥å¿ `system_login_log` |
| | | |
| | | ### 5.2 æ°æ®æéé®é¢ |
| | | ### 6.2 æ°æ®æéé®é¢ |
| | | |
| | | **ææ¥æ¥éª¤ï¼** |
| | | |
| | |
| | | 2. CRM æ¨¡åæ£æ¥ `crm_permission` 表 |
| | | 3. ç¡®è®¤æ°æ®æ¯å¦æ£ç¡®åé
è´è´£äºº |
| | | |
| | | ### 5.3 æµç¨å®¡æ¹å¼å¸¸ |
| | | ### 6.3 æµç¨å®¡æ¹å¼å¸¸ |
| | | |
| | | **ææ¥æ¥éª¤ï¼** |
| | | |
| | |
| | | 3. æ¥çæµç¨å®ä¾ç¶æ |
| | | 4. æ£æ¥åéç¨æ·/ç¨æ·ç»é
ç½® |
| | | |
| | | ### 5.4 åºåæ°æ®ä¸ä¸è´ |
| | | ### 6.4 ç©ææ°æ®ä¸ä¸è´ |
| | | |
| | | **ææ¥æ¥éª¤ï¼** |
| | | |
| | | 1. æ£æ¥ `wms_inventory_history` æ `erp_stock_record` æµæ°´è®°å½ |
| | | 1. ç¡®è®¤ç©ææ¯å¦å¨ MDM 䏿£ç¡®å建 |
| | | 2. æ£æ¥ç©æç±»åï¼itemTypeï¼æ¯å¦æ£ç¡® |
| | | 3. 确认 SKU æ¯å¦æ£ç¡®é
ç½® |
| | | 4. éªè¯åç±»ãåä½å
³èæ¯å¦æ£ç¡® |
| | | |
| | | ### 6.5 åºåæ°æ®ä¸ä¸è´ |
| | | |
| | | **ææ¥æ¥éª¤ï¼** |
| | | |
| | | 1. æ£æ¥ `wms_inventory_history` åºåæµæ°´è®°å½ |
| | | 2. æ ¸å¯¹åºå
¥åºåæ®æ¯å¦å
¨é¨å®¡æ ¸ |
| | | 3. æ§è¡åºåçç¹æ ¡æ£ |
| | | 4. æ£æ¥æ¯å¦ææªå®æçè°æ¨å |
| | | 3. 确认 WMS API è°ç¨æ¯å¦æå |
| | | 4. æ§è¡åºåçç¹æ ¡æ£ |
| | | |
| | | --- |
| | | |
| | | ## å
ãéå½ |
| | | ## ä¸ãéå½ |
| | | |
| | | ### 6.1 模åè·¯å¾å¯¹ç
§è¡¨ |
| | | ### 7.1 模åè·¯å¾å¯¹ç
§è¡¨ |
| | | |
| | | | 模å | åç«¯è·¯å¾ | åç«¯è·¯å¾ | |
| | | |------|----------|----------| |
| | |
| | | | Infra | yudao-module-infra | views/infra | |
| | | | BPM | yudao-module-bpm | views/bpm | |
| | | | CRM | yudao-module-crm | views/crm | |
| | | | MDM | yudao-module-mdm | views/mdm | |
| | | | ERP | yudao-module-erp | views/erp | |
| | | | MES | yudao-module-mes | views/mes | |
| | | | WMS | yudao-module-wms | views/wms | |
| | | |
| | | ### 6.2 æ¥å£é´æè¯´æ |
| | | ### 7.2 æ¥å£é´æè¯´æ |
| | | |
| | | ææä¸å¡æ¥å£éè¦æºå¸¦ Token 访é®ï¼ |
| | | |
| | |
| | | |
| | | Token è·åæ¹å¼ï¼è°ç¨ç»å½æ¥å£ `/system/auth/login` |
| | | |
| | | ### 6.3 å¤ç§æ·è¯´æ |
| | | ### 7.3 å¤ç§æ·è¯´æ |
| | | |
| | | ç³»ç»æ¯æå¤ç§æ·æ¨¡å¼ï¼ç§æ·é离éè¿ `tenant_id` åæ®µå®ç°ï¼ |
| | | |
| | | - System 模å大é¨å表å
å« `tenant_id` |
| | | - ä¸å¡æ¨¡åï¼CRMãERPãMESãWMSï¼ä¸å«ç§æ·å段ï¼éèªè¡å®ç°é离é»è¾ |
| | | - ä¸å¡æ¨¡åï¼CRMãERPãMESãWMSãMDMï¼ä¸å«ç§æ·å段ï¼éèªè¡å®ç°é离é»è¾ |
| | | |
| | | ### 7.4 æ ¸å¿æ¹é æä»¶æ¸
å |
| | | |
| | | | æä»¶ | æ¹é 说æ | |
| | | |------|----------| |
| | | | ErpProductServiceImpl | 产å CRUD è°ç¨ MdmItemApi | |
| | | | ErpStockServiceImpl | åºåæ¥è¯¢è°ç¨ WmsInventoryApi | |
| | | | ErpStockRecordServiceImpl | åºååæ´è°ç¨ WmsInventoryApi | |
| | | | WmsItemServiceImpl | åå CRUD è°ç¨ MdmItemApi | |
| | | | MdmItemApi | MDM ç©æ API æ¥å£ | |
| | | | MdmItemSkuApi | MDM SKU API æ¥å£ | |
| | | | WmsInventoryApi | WMS åºå API æ¥å£ | |
| | | |
| | | --- |
| | | |
| | | **ææ¡£çæ¬**: v1.0 |
| | | **æ´æ°æ¥æ**: 2026-06-23 |
| | | **ææ¡£çæ¬**: v2.0 |
| | | **æ´æ°æ¥æ**: 2026-06-29 |
| | | **éç¨çæ¬**: ruoyi-vue-pro 2026.04-SNAPSHOT |
| | | **æ ¸å¿æ¹é **: MDM ä¸»æ°æ®ç®¡ç模åéæï¼æé ERP/MES/WMS æ°æ®å¤å² |
| | |
| | | <module>yudao-module-iot</module> |
| | | <module>yudao-module-mes</module> |
| | | <module>yudao-module-wms</module> |
| | | <module>yudao-module-mdm</module> |
| | | <module>yudao-module-mdm-api</module> |
| | | <!-- 请åè https://doc.iocoder.cn/ai/build/ ææ¡£ï¼å®æ AI 模åçå¯å¨ï¼ï¼ï¼ --> |
| | | <module>yudao-module-ai</module> |
| | | </modules> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- MDM æ°æ®è¿ç§» SQL èæ¬ |
| | | -- åå»ºæ¥æ: 2026-06-29 |
| | | -- 说æ: å° MES/ERP/WMS çç©ææ°æ®è¿ç§»å°ç»ä¸ä¸»æ°æ®è¡¨ md_item |
| | | -- 注æ: æ§è¡å请å¤ä»½æ°æ®åºï¼ |
| | | -- ============================================= |
| | | |
| | | -- --------------------------------------------- |
| | | -- 第ä¸é¶æ®µï¼è¿ç§»åºç¡æ°æ®ï¼åç±»ãåä½ãåçï¼ |
| | | -- --------------------------------------------- |
| | | |
| | | -- 1. è¿ç§» MES 计éåä½å° md_unit_measure |
| | | INSERT INTO `md_unit_measure` (`id`, `code`, `name`, `primary_flag`, `primary_id`, `change_rate`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT |
| | | id, |
| | | LOWER(REPLACE(name, ' ', '_')) AS code, -- 使ç¨åç§°çæç¼ç |
| | | name, |
| | | COALESCE(primary_flag, 0) AS primary_flag, |
| | | primary_id, |
| | | change_rate, |
| | | COALESCE(status, 0) AS status, |
| | | remark, |
| | | creator, create_time, updater, update_time, deleted |
| | | FROM `mes_md_unit_measure` |
| | | WHERE deleted = 0 |
| | | ON DUPLICATE KEY UPDATE name = VALUES(name); |
| | | |
| | | -- 2. è¿ç§» ERP 计éåä½å° md_unit_measureï¼ä½¿ç¨æ°IDèå´ 10000-19999ï¼ |
| | | INSERT INTO `md_unit_measure` (`id`, `code`, `name`, `primary_flag`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT |
| | | id + 10000, -- ERP åä½ ID åç§» 10000 |
| | | LOWER(REPLACE(name, ' ', '_')) AS code, |
| | | name, |
| | | 0 AS primary_flag, |
| | | COALESCE(status, 0) AS status, |
| | | remark, |
| | | creator, create_time, updater, update_time, deleted |
| | | FROM `erp_product_unit` |
| | | WHERE deleted = 0 |
| | | ON DUPLICATE KEY UPDATE name = VALUES(name); |
| | | |
| | | -- 3. è¿ç§» MES ç©æåç±»å° md_item_category |
| | | INSERT INTO `md_item_category` (`id`, `parent_id`, `code`, `name`, `item_type`, `sort`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT |
| | | id, |
| | | parent_id, |
| | | code, |
| | | name, |
| | | CASE item_or_product |
| | | WHEN 'ITEM' THEN 1 -- åæ |
| | | WHEN 'PRODUCT' THEN 3 -- æå |
| | | ELSE NULL |
| | | END AS item_type, |
| | | sort, |
| | | COALESCE(status, 0) AS status, |
| | | remark, |
| | | creator, create_time, updater, update_time, deleted |
| | | FROM `mes_md_item_type` |
| | | WHERE deleted = 0 |
| | | ON DUPLICATE KEY UPDATE name = VALUES(name); |
| | | |
| | | -- 4. è¿ç§» ERP 产ååç±»å° md_item_categoryï¼ä½¿ç¨æ°IDèå´ 10000-19999ï¼ |
| | | INSERT INTO `md_item_category` (`id`, `parent_id`, `code`, `name`, `item_type`, `sort`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT |
| | | id + 10000, |
| | | CASE WHEN parent_id = 0 THEN 0 ELSE parent_id + 10000 END, |
| | | CONCAT('ERP_', code) AS code, -- æ·»å åç¼é¿å
å²çª |
| | | name, |
| | | 3 AS item_type, -- ERP 产åé»è®¤ä¸ºæå |
| | | COALESCE(sort, 0) AS sort, |
| | | COALESCE(status, 0) AS status, |
| | | remark, |
| | | creator, create_time, updater, update_time, deleted |
| | | FROM `erp_product_category` |
| | | WHERE deleted = 0 |
| | | ON DUPLICATE KEY UPDATE name = VALUES(name); |
| | | |
| | | -- 5. è¿ç§» WMS åååç±»å° md_item_categoryï¼ä½¿ç¨æ°IDèå´ 20000-29999ï¼ |
| | | INSERT INTO `md_item_category` (`id`, `parent_id`, `code`, `name`, `item_type`, `sort`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT |
| | | id + 20000, |
| | | CASE WHEN parent_id = 0 THEN 0 ELSE parent_id + 20000 END, |
| | | CONCAT('WMS_', code) AS code, |
| | | name, |
| | | NULL AS item_type, -- WMS åç±»ä¸åºåç±»å |
| | | COALESCE(sort, 0) AS sort, |
| | | COALESCE(status, 0) AS status, |
| | | remark, |
| | | creator, create_time, updater, update_time, deleted |
| | | FROM `wms_item_category` |
| | | WHERE deleted = 0 |
| | | ON DUPLICATE KEY UPDATE name = VALUES(name); |
| | | |
| | | -- 6. è¿ç§» WMS åçå° md_brand |
| | | INSERT INTO `md_brand` (`id`, `code`, `name`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT |
| | | id, |
| | | code, |
| | | name, |
| | | 0 AS status, |
| | | remark, |
| | | creator, create_time, updater, update_time, deleted |
| | | FROM `wms_item_brand` |
| | | WHERE deleted = 0 |
| | | ON DUPLICATE KEY UPDATE name = VALUES(name); |
| | | |
| | | -- --------------------------------------------- |
| | | -- 第äºé¶æ®µï¼è¿ç§»ç©æä¸»æ°æ® |
| | | -- --------------------------------------------- |
| | | |
| | | -- 7. è¿ç§» MES ç©æå° md_item |
| | | INSERT INTO `md_item` ( |
| | | `id`, `code`, `name`, `bar_code`, `specification`, |
| | | `category_id`, `unit_measure_id`, `brand_id`, `item_type`, `status`, |
| | | `purchase_price`, `sales_price`, `cost_price`, `min_price`, |
| | | `safety_stock`, `min_stock`, `max_stock`, `min_order_qty`, `lead_time`, |
| | | `is_batch_managed`, `is_serial_managed`, `barcode_rule_id`, |
| | | `expiry_day`, `high_value`, `weight`, `remark`, |
| | | `creator`, `create_time`, `updater`, `update_time`, `deleted` |
| | | ) |
| | | SELECT |
| | | id, |
| | | code, |
| | | name, |
| | | NULL AS bar_code, -- MES æ²¡ææ¡ç |
| | | specification, |
| | | itemTypeId, |
| | | unitMeasureId, |
| | | NULL AS brand_id, |
| | | 1 AS item_type, -- MES ç©æé»è®¤ä¸ºåæ |
| | | COALESCE(status, 0), |
| | | NULL, NULL, NULL, NULL, -- ä»·æ ¼ä¿¡æ¯ MES 没æ |
| | | NULL AS safety_stock, |
| | | min_stock, |
| | | max_stock, |
| | | NULL, NULL, -- æå°è®¢è´§éãæåæ MES 没æ |
| | | COALESCE(batchFlag, 0), |
| | | 0 AS is_serial_managed, |
| | | NULL AS barcode_rule_id, |
| | | NULL AS expiry_day, |
| | | COALESCE(highValue, 0), |
| | | NULL AS weight, |
| | | remark, |
| | | creator, create_time, updater, update_time, deleted |
| | | FROM `mes_md_item` |
| | | WHERE deleted = 0; |
| | | |
| | | -- 8. è®°å½ MES ç©æè¿ç§»æ å° |
| | | INSERT INTO `md_item_migration_map` (`source_module`, `source_table`, `source_id`, `target_item_id`, `create_time`) |
| | | SELECT 'MES', 'mes_md_item', id, id, NOW() |
| | | FROM `mes_md_item` |
| | | WHERE deleted = 0; |
| | | |
| | | -- 9. è¿ç§» ERP 产åå° md_itemï¼ä½¿ç¨æ°IDèå´ 100000-199999ï¼ |
| | | INSERT INTO `md_item` ( |
| | | `id`, `code`, `name`, `bar_code`, `specification`, |
| | | `category_id`, `unit_measure_id`, `brand_id`, `item_type`, `status`, |
| | | `purchase_price`, `sales_price`, `cost_price`, `min_price`, |
| | | `safety_stock`, `min_stock`, `max_stock`, `min_order_qty`, `lead_time`, |
| | | `is_batch_managed`, `is_serial_managed`, `barcode_rule_id`, |
| | | `expiry_day`, `high_value`, `weight`, `remark`, |
| | | `creator`, `create_time`, `updater`, `update_time`, `deleted` |
| | | ) |
| | | SELECT |
| | | id + 100000, -- ERP 产å ID åç§» 100000 |
| | | COALESCE(bar_code, CONCAT('ERP_', id)) AS code, -- ä½¿ç¨æ¡ç ä½ä¸ºç¼ç ï¼æ²¡æåçæ |
| | | name, |
| | | bar_code, |
| | | standard AS specification, |
| | | categoryId + 10000, -- ä½¿ç¨ ERP åç±»æ å°åçID |
| | | unitId + 10000, -- ä½¿ç¨ ERP å使 å°åçID |
| | | NULL AS brand_id, |
| | | 3 AS item_type, -- ERP 产åé»è®¤ä¸ºæå |
| | | COALESCE(status, 0), |
| | | purchase_price, |
| | | sale_price, |
| | | NULL AS cost_price, |
| | | min_price, |
| | | NULL, NULL, NULL, NULL, NULL, -- åºå管ç ERP 没æ |
| | | 0 AS is_batch_managed, |
| | | 0 AS is_serial_managed, |
| | | NULL AS barcode_rule_id, |
| | | expiry_day, |
| | | 0 AS high_value, |
| | | weight, |
| | | remark, |
| | | creator, create_time, updater, update_time, deleted |
| | | FROM `erp_product` |
| | | WHERE deleted = 0; |
| | | |
| | | -- 10. è®°å½ ERP 产åè¿ç§»æ å° |
| | | INSERT INTO `md_item_migration_map` (`source_module`, `source_table`, `source_id`, `target_item_id`, `create_time`) |
| | | SELECT 'ERP', 'erp_product', id, id + 100000, NOW() |
| | | FROM `erp_product` |
| | | WHERE deleted = 0; |
| | | |
| | | -- 11. è¿ç§» WMS ååå° md_itemï¼ä½¿ç¨æ°IDèå´ 200000-299999ï¼ |
| | | INSERT INTO `md_item` ( |
| | | `id`, `code`, `name`, `bar_code`, `specification`, |
| | | `category_id`, `unit_measure_id`, `brand_id`, `item_type`, `status`, |
| | | `purchase_price`, `sales_price`, `cost_price`, `min_price`, |
| | | `safety_stock`, `min_stock`, `max_stock`, `min_order_qty`, `lead_time`, |
| | | `is_batch_managed`, `is_serial_managed`, `barcode_rule_id`, |
| | | `expiry_day`, `high_value`, `weight`, `remark`, |
| | | `creator`, `create_time`, `updater`, `update_time`, `deleted` |
| | | ) |
| | | SELECT |
| | | id + 200000, -- WMS åå ID åç§» 200000 |
| | | code, |
| | | name, |
| | | NULL AS bar_code, -- WMS æ¡ç å¨ SKU å± |
| | | NULL AS specification, |
| | | categoryId + 20000, -- ä½¿ç¨ WMS åç±»æ å°åçID |
| | | NULL AS unit_measure_id, -- WMS å使¯å符串ï¼éè¦åç»å¤ç |
| | | brandId, |
| | | 1 AS item_type, -- WMS ååé»è®¤ä¸ºåæ |
| | | 0 AS status, |
| | | NULL, NULL, NULL, NULL, -- ä»·æ ¼å¨ SKU å± |
| | | NULL, NULL, NULL, NULL, NULL, |
| | | 0, 0, NULL, |
| | | NULL, 0, NULL, |
| | | remark, |
| | | creator, create_time, updater, update_time, deleted |
| | | FROM `wms_item` |
| | | WHERE deleted = 0; |
| | | |
| | | -- 12. è®°å½ WMS ååè¿ç§»æ å° |
| | | INSERT INTO `md_item_migration_map` (`source_module`, `source_table`, `source_id`, `target_item_id`, `create_time`) |
| | | SELECT 'WMS', 'wms_item', id, id + 200000, NOW() |
| | | FROM `wms_item` |
| | | WHERE deleted = 0; |
| | | |
| | | -- --------------------------------------------- |
| | | -- 第ä¸é¶æ®µï¼è¿ç§»æ¹æ¬¡å±æ§é
ç½® |
| | | -- --------------------------------------------- |
| | | |
| | | -- 13. è¿ç§» MES æ¹æ¬¡å±æ§é
ç½®å° md_item_batch_config |
| | | INSERT INTO `md_item_batch_config` ( |
| | | `id`, `item_id`, |
| | | `produce_date_flag`, `expire_date_flag`, `receipt_date_flag`, |
| | | `vendor_flag`, `client_flag`, `sales_order_code_flag`, `purchase_order_code_flag`, |
| | | `work_order_flag`, `task_flag`, `workstation_flag`, `tool_flag`, `mold_flag`, |
| | | `lot_number_flag`, `quality_status_flag`, |
| | | `creator`, `create_time`, `updater`, `update_time`, `deleted` |
| | | ) |
| | | SELECT |
| | | id, |
| | | itemId, |
| | | COALESCE(produce_date_flag, 0), |
| | | COALESCE(expire_date_flag, 0), |
| | | COALESCE(receipt_date_flag, 0), |
| | | COALESCE(vendor_flag, 0), |
| | | COALESCE(client_flag, 0), |
| | | COALESCE(sales_order_code_flag, 0), |
| | | COALESCE(purchase_order_code_flag, 0), |
| | | COALESCE(work_order_flag, 0), |
| | | COALESCE(task_flag, 0), |
| | | COALESCE(workstation_flag, 0), |
| | | COALESCE(tool_flag, 0), |
| | | COALESCE(mold_flag, 0), |
| | | COALESCE(lot_number_flag, 0), |
| | | COALESCE(quality_status_flag, 0), |
| | | creator, create_time, updater, update_time, deleted |
| | | FROM `mes_md_item_batch_config` |
| | | WHERE deleted = 0; |
| | | |
| | | -- --------------------------------------------- |
| | | -- 第åé¶æ®µï¼è¿ç§»ä»åºæ°æ® |
| | | -- --------------------------------------------- |
| | | |
| | | -- 14. è¿ç§» MES ä»åºå° md_warehouse |
| | | INSERT INTO `md_warehouse` (`id`, `code`, `name`, `address`, `area`, `type`, `charge_user_id`, `status`, `frozen`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT |
| | | id, |
| | | code, |
| | | name, |
| | | address, |
| | | area, |
| | | NULL AS type, -- MES ä»åºæ²¡æç±»å |
| | | chargeUserId, |
| | | 0 AS status, |
| | | COALESCE(frozen, 0), |
| | | remark, |
| | | creator, create_time, updater, update_time, deleted |
| | | FROM `mes_wm_warehouse` |
| | | WHERE deleted = 0; |
| | | |
| | | -- 15. è¿ç§» ERP ä»åºå° md_warehouseï¼ä½¿ç¨æ°IDèå´ 10000-19999ï¼ |
| | | INSERT INTO `md_warehouse` (`id`, `code`, `name`, `address`, `area`, `type`, `charge_user_id`, `status`, `frozen`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT |
| | | id + 10000, |
| | | CONCAT('ERP_', id) AS code, -- ERP ä»åºæ²¡æç¼ç ï¼çæä¸ä¸ª |
| | | name, |
| | | address, |
| | | NULL AS area, |
| | | NULL AS type, |
| | | NULL AS charge_user_id, -- ERP ä½¿ç¨ principal åç¬¦ä¸²ï¼æ æ³æ å° |
| | | COALESCE(status, 0), |
| | | 0 AS frozen, |
| | | remark, |
| | | creator, create_time, updater, update_time, deleted |
| | | FROM `erp_warehouse` |
| | | WHERE deleted = 0; |
| | | |
| | | -- 16. è¿ç§» WMS ä»åºå° md_warehouseï¼ä½¿ç¨æ°IDèå´ 20000-29999ï¼ |
| | | INSERT INTO `md_warehouse` (`id`, `code`, `name`, `address`, `area`, `type`, `charge_user_id`, `status`, `frozen`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT |
| | | id + 20000, |
| | | code, |
| | | name, |
| | | address, |
| | | area, |
| | | NULL AS type, |
| | | chargeUserId, |
| | | COALESCE(status, 0), |
| | | 0 AS frozen, |
| | | remark, |
| | | creator, create_time, updater, update_time, deleted |
| | | FROM `wms_warehouse` |
| | | WHERE deleted = 0; |
| | | |
| | | -- --------------------------------------------- |
| | | -- 第äºé¶æ®µï¼è¿ç§»åºåæ°æ® |
| | | -- --------------------------------------------- |
| | | |
| | | -- 17. è¿ç§» MES åºåå° wms_stock |
| | | INSERT INTO `wms_stock` (`item_id`, `warehouse_id`, `location_id`, `batch_code`, `quantity`, `quantity_locked`, `quantity_available`, `unit_measure_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT |
| | | m.target_item_id AS item_id, -- ä½¿ç¨æ å°åçç©æID |
| | | s.warehouseId AS warehouse_id, |
| | | s.locationId AS location_id, |
| | | s.batchCode AS batch_code, |
| | | s.quantity, |
| | | 0 AS quantity_locked, |
| | | s.quantity AS quantity_available, |
| | | i.unitMeasureId AS unit_measure_id, |
| | | s.creator, s.create_time, s.updater, s.update_time, s.deleted |
| | | FROM `mes_wm_material_stock` s |
| | | LEFT JOIN `mes_md_item` i ON i.id = s.itemId |
| | | LEFT JOIN `md_item_migration_map` m ON m.source_module = 'MES' AND m.source_table = 'mes_md_item' AND m.source_id = s.itemId |
| | | WHERE s.deleted = 0 AND m.target_item_id IS NOT NULL; |
| | | |
| | | -- 18. è¿ç§» ERP åºåå° wms_stock |
| | | INSERT INTO `wms_stock` (`item_id`, `warehouse_id`, `batch_code`, `quantity`, `quantity_locked`, `quantity_available`, `unit_measure_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT |
| | | m.target_item_id AS item_id, |
| | | s.warehouseId + 10000 AS warehouse_id, -- ä½¿ç¨ ERP ä»åºæ å°åçID |
| | | NULL AS batch_code, |
| | | s.count AS quantity, |
| | | 0 AS quantity_locked, |
| | | s.count AS quantity_available, |
| | | p.unitId + 10000 AS unit_measure_id, -- ä½¿ç¨ ERP å使 å°åçID |
| | | s.creator, s.create_time, s.updater, s.update_time, s.deleted |
| | | FROM `erp_stock` s |
| | | LEFT JOIN `erp_product` p ON p.id = s.productId |
| | | LEFT JOIN `md_item_migration_map` m ON m.source_module = 'ERP' AND m.source_table = 'erp_product' AND m.source_id = s.productId |
| | | WHERE s.deleted = 0 AND m.target_item_id IS NOT NULL; |
| | | |
| | | -- 19. è¿ç§» WMS åºåå° wms_stock |
| | | INSERT INTO `wms_stock` (`item_id`, `warehouse_id`, `batch_code`, `quantity`, `quantity_locked`, `quantity_available`, `unit_measure_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT |
| | | m.target_item_id AS item_id, |
| | | s.warehouseId + 20000 AS warehouse_id, -- ä½¿ç¨ WMS ä»åºæ å°åçID |
| | | NULL AS batch_code, |
| | | s.quantity, |
| | | 0 AS quantity_locked, |
| | | s.quantity AS quantity_available, |
| | | NULL AS unit_measure_id, -- WMS åºå没æåä½ |
| | | s.creator, s.create_time, s.updater, s.update_time, s.deleted |
| | | FROM `wms_inventory` s |
| | | LEFT JOIN `md_item_migration_map` m ON m.source_module = 'WMS' AND m.source_table = 'wms_item' AND m.source_id = s.skuId -- 注æï¼WMS åºåå
³èçæ¯ SKU |
| | | WHERE s.deleted = 0 AND m.target_item_id IS NOT NULL; |
| | | |
| | | -- ============================================= |
| | | -- è¿ç§»å®æ |
| | | -- ============================================= |
| | | |
| | | -- æ¥è¯¢è¿ç§»ç»æç»è®¡ |
| | | SELECT |
| | | 'md_item' AS table_name, |
| | | (SELECT COUNT(*) FROM md_item WHERE deleted = 0) AS count |
| | | UNION ALL |
| | | SELECT |
| | | 'md_item_category', |
| | | (SELECT COUNT(*) FROM md_item_category WHERE deleted = 0) |
| | | UNION ALL |
| | | SELECT |
| | | 'md_unit_measure', |
| | | (SELECT COUNT(*) FROM md_unit_measure WHERE deleted = 0) |
| | | UNION ALL |
| | | SELECT |
| | | 'md_brand', |
| | | (SELECT COUNT(*) FROM md_brand WHERE deleted = 0) |
| | | UNION ALL |
| | | SELECT |
| | | 'md_warehouse', |
| | | (SELECT COUNT(*) FROM md_warehouse WHERE deleted = 0) |
| | | UNION ALL |
| | | SELECT |
| | | 'wms_stock', |
| | | (SELECT COUNT(*) FROM wms_stock WHERE deleted = 0) |
| | | UNION ALL |
| | | SELECT |
| | | 'md_item_migration_map', |
| | | (SELECT COUNT(*) FROM md_item_migration_map); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- ç»ä¸ç©æä¸»æ°æ®æ¨¡å (MDM) 建表 SQL |
| | | -- åå»ºæ¥æ: 2026-06-29 |
| | | -- 说æ: æ´å MES/ERP/WMS çç©ææ°æ®ï¼å®ç°è·¨æ¨¡åæ°æ®æé |
| | | -- 注æ: ä¸å¼å¯å¤ç§æ·æ¨¡å¼ |
| | | -- ============================================= |
| | | |
| | | -- --------------------------------------------- |
| | | -- 1. ç©æä¸»æ°æ®è¡¨ (md_item) |
| | | -- æ ¸å¿è¡¨ï¼æææ¨¡åå
±ç¨å¯ä¸äº§åç¼ç |
| | | -- --------------------------------------------- |
| | | DROP TABLE IF EXISTS `md_item`; |
| | | CREATE TABLE `md_item` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç©æIDï¼å
¨å±å¯ä¸ï¼', |
| | | `code` varchar(64) NOT NULL COMMENT 'ç©æç¼ç ï¼å
¨å±å¯ä¸ï¼', |
| | | `name` varchar(255) NOT NULL COMMENT 'ç©æåç§°', |
| | | `bar_code` varchar(64) DEFAULT NULL COMMENT 'ç©ææ¡ç ', |
| | | `specification` varchar(500) DEFAULT NULL COMMENT 'è§æ ¼åå·', |
| | | |
| | | -- åç±»ä¸åä½ |
| | | `category_id` bigint NOT NULL COMMENT 'ç©æåç±»ç¼å·', |
| | | `unit_measure_id` bigint NOT NULL COMMENT '主计éåä½ç¼å·', |
| | | `brand_id` bigint DEFAULT NULL COMMENT 'åçç¼å·', |
| | | |
| | | -- ç©æç±»å |
| | | `item_type` tinyint NOT NULL DEFAULT 1 COMMENT 'ç©æç±»å(1:åæ, 2:åæå, 3:æå, 4:è¾
æ)', |
| | | |
| | | -- ç¶æ |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æ(0:å¯ç¨, 1:ç¦ç¨)', |
| | | |
| | | -- ä»·æ ¼ä¿¡æ¯ |
| | | `purchase_price` decimal(24,6) DEFAULT NULL COMMENT 'éè´ä»·', |
| | | `sales_price` decimal(24,6) DEFAULT NULL COMMENT 'éå®ä»·', |
| | | `cost_price` decimal(24,6) DEFAULT NULL COMMENT 'ææ¬ä»·', |
| | | `min_price` decimal(24,6) DEFAULT NULL COMMENT 'æä½ä»·', |
| | | |
| | | -- åºå管ç |
| | | `safety_stock` decimal(24,6) DEFAULT NULL COMMENT 'å®å
¨åºå', |
| | | `min_stock` decimal(24,6) DEFAULT NULL COMMENT 'æä½åºåé', |
| | | `max_stock` decimal(24,6) DEFAULT NULL COMMENT 'æé«åºåé', |
| | | `min_order_qty` decimal(24,6) DEFAULT NULL COMMENT 'æå°è®¢è´§é', |
| | | `lead_time` int DEFAULT NULL COMMENT 'éè´æåæï¼å¤©ï¼', |
| | | |
| | | -- æ¹æ¬¡ä¸åºåå·ç®¡ç |
| | | `is_batch_managed` bit(1) DEFAULT b'0' COMMENT 'æ¯å¦æ¹æ¬¡ç®¡ç', |
| | | `is_serial_managed` bit(1) DEFAULT b'0' COMMENT 'æ¯å¦åºåå·ç®¡ç', |
| | | `barcode_rule_id` bigint DEFAULT NULL COMMENT 'æ¡ç è§åID', |
| | | |
| | | -- è´¨é管ç |
| | | `expiry_day` int DEFAULT NULL COMMENT 'ä¿è´¨æå¤©æ°', |
| | | `high_value` bit(1) DEFAULT b'0' COMMENT 'æ¯å¦é«å¼ç©æ', |
| | | |
| | | -- ç©ç屿§ |
| | | `weight` decimal(24,6) DEFAULT NULL COMMENT 'éé(kg)', |
| | | |
| | | -- 夿³¨ |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | |
| | | -- ç³»ç»å段 |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_code` (`code`), |
| | | KEY `idx_category_id` (`category_id`), |
| | | KEY `idx_unit_measure_id` (`unit_measure_id`), |
| | | KEY `idx_brand_id` (`brand_id`), |
| | | KEY `idx_item_type` (`item_type`), |
| | | KEY `idx_status` (`status`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='ç©æä¸»æ°æ®è¡¨'; |
| | | |
| | | -- --------------------------------------------- |
| | | -- 2. ç©æå类表 (md_item_category) |
| | | -- ç»ä¸åç±»ï¼æ¯ææ å½¢ç»æ |
| | | -- --------------------------------------------- |
| | | DROP TABLE IF EXISTS `md_item_category`; |
| | | CREATE TABLE `md_item_category` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'åç±»ç¼å·', |
| | | `parent_id` bigint NOT NULL DEFAULT 0 COMMENT 'ç¶åç±»ç¼å·(æ ¹èç¹=0)', |
| | | `code` varchar(64) NOT NULL COMMENT 'åç±»ç¼ç ', |
| | | `name` varchar(255) NOT NULL COMMENT 'åç±»åç§°', |
| | | `item_type` tinyint DEFAULT NULL COMMENT 'éç¨ç©æç±»å(1:åæ, 2:åæå, 3:æå, 4:è¾
æ, NULL:å
¨é¨)', |
| | | `sort` int NOT NULL DEFAULT 0 COMMENT 'æåº', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æ(0:å¯ç¨, 1:ç¦ç¨)', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | |
| | | -- ç³»ç»å段 |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_code` (`code`), |
| | | KEY `idx_parent_id` (`parent_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='ç©æå类表'; |
| | | |
| | | -- --------------------------------------------- |
| | | -- 3. 计éåä½è¡¨ (md_unit_measure) |
| | | -- ç»ä¸è®¡éåä½ |
| | | -- --------------------------------------------- |
| | | DROP TABLE IF EXISTS `md_unit_measure`; |
| | | CREATE TABLE `md_unit_measure` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'åä½ç¼å·', |
| | | `code` varchar(64) NOT NULL COMMENT 'åä½ç¼ç ', |
| | | `name` varchar(64) NOT NULL COMMENT 'åä½åç§°', |
| | | `primary_flag` bit(1) DEFAULT b'0' COMMENT 'æ¯å¦ä¸»åä½', |
| | | `primary_id` bigint DEFAULT NULL COMMENT '主åä½ç¼å·', |
| | | `change_rate` decimal(24,6) DEFAULT NULL COMMENT 'ä¸ä¸»å使¢ç®æ¯ä¾', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æ(0:å¯ç¨, 1:ç¦ç¨)', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | |
| | | -- ç³»ç»å段 |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_code` (`code`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='计éåä½è¡¨'; |
| | | |
| | | -- --------------------------------------------- |
| | | -- 4. åç表 (md_brand) |
| | | -- ç»ä¸åçæ°æ® |
| | | -- --------------------------------------------- |
| | | DROP TABLE IF EXISTS `md_brand`; |
| | | CREATE TABLE `md_brand` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'åçç¼å·', |
| | | `code` varchar(64) NOT NULL COMMENT 'åçç¼ç ', |
| | | `name` varchar(255) NOT NULL COMMENT 'åçåç§°', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æ(0:å¯ç¨, 1:ç¦ç¨)', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | |
| | | -- ç³»ç»å段 |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_code` (`code`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='åç表'; |
| | | |
| | | -- --------------------------------------------- |
| | | -- 5. ç©ææ¹æ¬¡å±æ§é
置表 (md_item_batch_config) |
| | | -- æ¥èª MES çæ¹æ¬¡ç®¡çé
ç½® |
| | | -- --------------------------------------------- |
| | | DROP TABLE IF EXISTS `md_item_batch_config`; |
| | | CREATE TABLE `md_item_batch_config` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `item_id` bigint NOT NULL COMMENT 'ç©æç¼å·', |
| | | |
| | | -- æ¹æ¬¡å±æ§å¼å
³ |
| | | `produce_date_flag` bit(1) DEFAULT b'0' COMMENT 'çäº§æ¥æ', |
| | | `expire_date_flag` bit(1) DEFAULT b'0' COMMENT 'æææ', |
| | | `receipt_date_flag` bit(1) DEFAULT b'0' COMMENT 'å
¥åºæ¥æ', |
| | | `vendor_flag` bit(1) DEFAULT b'0' COMMENT 'ä¾åºå', |
| | | `client_flag` bit(1) DEFAULT b'0' COMMENT '客æ·', |
| | | `sales_order_code_flag` bit(1) DEFAULT b'0' COMMENT 'éå®è®¢åç¼å·', |
| | | `purchase_order_code_flag` bit(1) DEFAULT b'0' COMMENT 'éè´è®¢åç¼å·', |
| | | `work_order_flag` bit(1) DEFAULT b'0' COMMENT 'ç产工å', |
| | | `task_flag` bit(1) DEFAULT b'0' COMMENT 'ç产任å¡', |
| | | `workstation_flag` bit(1) DEFAULT b'0' COMMENT 'å·¥ä½ç«', |
| | | `tool_flag` bit(1) DEFAULT b'0' COMMENT 'å·¥å
·', |
| | | `mold_flag` bit(1) DEFAULT b'0' COMMENT '模å
·', |
| | | `lot_number_flag` bit(1) DEFAULT b'0' COMMENT 'ç产æ¹å·', |
| | | `quality_status_flag` bit(1) DEFAULT b'0' COMMENT 'è´¨éç¶æ', |
| | | |
| | | -- ç³»ç»å段 |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_item_id` (`item_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='ç©ææ¹æ¬¡å±æ§é
置表'; |
| | | |
| | | -- --------------------------------------------- |
| | | -- 6. ä»åºä¸»æ°æ®è¡¨ (md_warehouse) |
| | | -- ç»ä¸ä»åºæ°æ®ï¼WMS ä¸ºä¸»æ°æ®æº |
| | | -- --------------------------------------------- |
| | | DROP TABLE IF EXISTS `md_warehouse`; |
| | | CREATE TABLE `md_warehouse` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ä»åºID', |
| | | `code` varchar(64) NOT NULL COMMENT 'ä»åºç¼ç ', |
| | | `name` varchar(255) NOT NULL COMMENT 'ä»åºåç§°', |
| | | `address` varchar(500) DEFAULT NULL COMMENT 'ä»åºå°å', |
| | | `area` decimal(24,6) DEFAULT NULL COMMENT 'é¢ç§¯(å¹³æ¹ç±³)', |
| | | `type` tinyint DEFAULT NULL COMMENT 'ä»åºç±»å(1:åæä», 2:æåä», 3:åæåä», 4:线边ä»)', |
| | | `charge_user_id` bigint DEFAULT NULL COMMENT 'è´è´£äººç¨æ·ID', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æ(0:å¯ç¨, 1:ç¦ç¨)', |
| | | `frozen` bit(1) DEFAULT b'0' COMMENT 'æ¯å¦å»ç»', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | |
| | | -- ç³»ç»å段 |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_code` (`code`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='ä»åºä¸»æ°æ®è¡¨'; |
| | | |
| | | -- --------------------------------------------- |
| | | -- 7. åºå表 (wms_stock) |
| | | -- WMS ä½ä¸ºå¯ä¸åºå管çè
|
| | | -- --------------------------------------------- |
| | | DROP TABLE IF EXISTS `wms_stock`; |
| | | CREATE TABLE `wms_stock` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'åºåID', |
| | | `item_id` bigint NOT NULL COMMENT 'ç©æIDï¼å
³è md_itemï¼', |
| | | `warehouse_id` bigint NOT NULL COMMENT 'ä»åºIDï¼å
³è md_warehouseï¼', |
| | | `location_id` bigint DEFAULT NULL COMMENT 'åºä½ID', |
| | | `batch_code` varchar(64) DEFAULT NULL COMMENT 'æ¹æ¬¡å·', |
| | | |
| | | -- åºåæ°é |
| | | `quantity` decimal(24,6) NOT NULL DEFAULT 0 COMMENT 'å½ååºåæ°é', |
| | | `quantity_locked` decimal(24,6) NOT NULL DEFAULT 0 COMMENT 'é宿°é', |
| | | `quantity_available` decimal(24,6) NOT NULL DEFAULT 0 COMMENT 'å¯ç¨æ°é = quantity - quantity_locked', |
| | | |
| | | `unit_measure_id` bigint NOT NULL COMMENT '计éåä½ID', |
| | | |
| | | -- ç³»ç»å段 |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_item_warehouse_batch` (`item_id`, `warehouse_id`, `batch_code`), |
| | | KEY `idx_item_id` (`item_id`), |
| | | KEY `idx_warehouse_id` (`warehouse_id`), |
| | | KEY `idx_batch_code` (`batch_code`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='åºå表'; |
| | | |
| | | -- --------------------------------------------- |
| | | -- 8. åºåäºå¡æµæ°´è¡¨ (wms_stock_transaction) |
| | | -- è®°å½ææåºååå¨ |
| | | -- --------------------------------------------- |
| | | DROP TABLE IF EXISTS `wms_stock_transaction`; |
| | | CREATE TABLE `wms_stock_transaction` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'æµæ°´ID', |
| | | `item_id` bigint NOT NULL COMMENT 'ç©æID', |
| | | `warehouse_id` bigint NOT NULL COMMENT 'ä»åºID', |
| | | `location_id` bigint DEFAULT NULL COMMENT 'åºä½ID', |
| | | `batch_code` varchar(64) DEFAULT NULL COMMENT 'æ¹æ¬¡å·', |
| | | |
| | | -- åå¨ä¿¡æ¯ |
| | | `quantity` decimal(24,6) NOT NULL COMMENT 'å卿°é(æ£æ°å
¥åº,è´æ°åºåº)', |
| | | `biz_type` tinyint NOT NULL COMMENT 'ä¸å¡ç±»å(è§æä¸¾)', |
| | | `biz_id` bigint DEFAULT NULL COMMENT 'ä¸å¡åæ®ID', |
| | | `biz_no` varchar(64) DEFAULT NULL COMMENT 'ä¸å¡åæ®å·', |
| | | |
| | | -- å
³èåºåè®°å½ |
| | | `stock_id` bigint DEFAULT NULL COMMENT 'å
³èåºåè®°å½ID', |
| | | |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | |
| | | -- ç³»ç»å段 |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_item_id` (`item_id`), |
| | | KEY `idx_warehouse_id` (`warehouse_id`), |
| | | KEY `idx_biz_type` (`biz_type`), |
| | | KEY `idx_biz_id` (`biz_id`), |
| | | KEY `idx_create_time` (`create_time`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='åºåäºå¡æµæ°´è¡¨'; |
| | | |
| | | -- --------------------------------------------- |
| | | -- 9. ç©æè¿ç§»æ å°è¡¨ (md_item_migration_map) |
| | | -- ç¨äºè®°å½æ§è¡¨æ°æ®å°æ°è¡¨çæ å°å
³ç³» |
| | | -- --------------------------------------------- |
| | | DROP TABLE IF EXISTS `md_item_migration_map`; |
| | | CREATE TABLE `md_item_migration_map` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'æ å°ID', |
| | | `source_module` varchar(20) NOT NULL COMMENT 'æ¥æºæ¨¡å(ERP/MES/WMS)', |
| | | `source_table` varchar(64) NOT NULL COMMENT 'æ¥æºè¡¨å', |
| | | `source_id` bigint NOT NULL COMMENT 'åID', |
| | | `target_item_id` bigint NOT NULL COMMENT 'MDMç©æID', |
| | | |
| | | -- ç³»ç»å段 |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_source` (`source_module`, `source_table`, `source_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='ç©æè¿ç§»æ å°è¡¨'; |
| | | |
| | | -- --------------------------------------------- |
| | | -- 10. åºååå¨ä¸å¡ç±»åæä¸¾å¼ |
| | | -- --------------------------------------------- |
| | | -- ä¸å¡ç±»å说æï¼ |
| | | -- 10: éè´å
¥åº (ERP) |
| | | -- 11: éè´å
¥åºä½åº (ERP) |
| | | -- 20: éå®åºåº (ERP) |
| | | -- 21: éå®åºåºä½åº (ERP) |
| | | -- 30: ç产å
¥åº (MES) |
| | | -- 31: ç产å
¥åºä½åº (MES) |
| | | -- 40: çäº§é¢æ (MES) |
| | | -- 41: çäº§é¢æä½åº (MES) |
| | | -- 50: çäº§éæ (MES) |
| | | -- 51: ç产éæä½åº (MES) |
| | | -- 60: éè´éè´§åºåº (ERP) |
| | | -- 61: éè´éè´§åºåºä½åº (ERP) |
| | | -- 70: éå®éè´§å
¥åº (ERP) |
| | | -- 71: éå®éè´§å
¥åºä½åº (ERP) |
| | | -- 80: è°æ¨å
¥åº (WMS) |
| | | -- 81: è°æ¨å
¥åºä½åº (WMS) |
| | | -- 90: è°æ¨åºåº (WMS) |
| | | -- 91: è°æ¨åºåºä½åº (WMS) |
| | | -- 100: ççå
¥åº (WMS) |
| | | -- 101: ççå
¥åºä½åº (WMS) |
| | | -- 110: çäºåºåº (WMS) |
| | | -- 111: çäºåºåºä½åº (WMS) |
| | | |
| | | -- ============================================= |
| | | -- å®æå»ºè¡¨ SQL |
| | | -- ============================================= |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- MDM ä¸»æ°æ®ç®¡ç模å API --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-mdm</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- WMS ä»åºç®¡ç模å --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-wms</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- BPM æµç¨æ¨¡å --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-bpm</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ä¸å¡ç»ä»¶ --> |
| | | |
| | | <!-- Web ç¸å
³ --> |
| | |
| | | @Schema(description = "产ååç±»ç¼å·", example = "11161") |
| | | private Long categoryId; |
| | | |
| | | @Schema(description = "产åç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| | | private LocalDateTime[] createTime; |
| | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| | | |
| | | @Tag(name = "管çåå° - ERP éè´å
¥åº") |
| | | @RestController |
| | |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/submit") |
| | | @Operation(summary = "æäº¤éè´å
¥åºå®¡æ¹") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-in:update')") |
| | | public CommonResult<Boolean> submitPurchaseIn(@RequestParam("id") Long id) { |
| | | purchaseInService.submitPurchaseIn(id, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤éè´å
¥åº") |
| | | @Parameter(name = "ids", description = "ç¼å·æ°ç»", required = true) |
| | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| | | |
| | | @Tag(name = "管çåå° - ERP éè´è®¢å") |
| | | @RestController |
| | |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/submit") |
| | | @Operation(summary = "æäº¤éè´è®¢å审æ¹") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-order:update')") |
| | | public CommonResult<Boolean> submitPurchaseOrder(@RequestParam("id") Long id) { |
| | | purchaseOrderService.submitPurchaseOrder(id, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤éè´è®¢å") |
| | | @Parameter(name = "ids", description = "ç¼å·æ°ç»", required = true) |
| | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| | | |
| | | @Tag(name = "管çåå° - ERP éå®è®¢å") |
| | | @RestController |
| | |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/submit") |
| | | @Operation(summary = "æäº¤éå®è®¢å审æ¹") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('erp:sale-out:update')") |
| | | public CommonResult<Boolean> submitSaleOrder(@RequestParam("id") Long id) { |
| | | saleOrderService.submitSaleOrder(id, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤éå®è®¢å") |
| | | @Parameter(name = "ids", description = "ç¼å·æ°ç»", required = true) |
| | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| | | |
| | | @Tag(name = "管çåå° - ERP éå®åºåº") |
| | | @RestController |
| | |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/submit") |
| | | @Operation(summary = "æäº¤éå®åºåºå®¡æ¹") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('erp:sale-out:update')") |
| | | public CommonResult<Boolean> submitSaleOut(@RequestParam("id") Long id) { |
| | | saleOutService.submitSaleOut(id, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤éå®åºåº") |
| | | @Parameter(name = "ids", description = "ç¼å·æ°ç»", required = true) |
| | |
| | | */ |
| | | private String remark; |
| | | |
| | | // ========== BPM æµç¨å®¡æ¹ ========== |
| | | /** |
| | | * BPM æµç¨å®ä¾ç¼å· |
| | | */ |
| | | private String processInstanceId; |
| | | |
| | | } |
| | |
| | | */ |
| | | private String remark; |
| | | |
| | | // ========== BPM æµç¨å®¡æ¹ ========== |
| | | /** |
| | | * BPM æµç¨å®ä¾ç¼å· |
| | | */ |
| | | private String processInstanceId; |
| | | |
| | | // ========== éè´å
¥åº ========== |
| | | /** |
| | | * éè´å
¥åºæ°é |
| | |
| | | */ |
| | | private String remark; |
| | | |
| | | // ========== BPM æµç¨å®¡æ¹ ========== |
| | | /** |
| | | * BPM æµç¨å®ä¾ç¼å· |
| | | */ |
| | | private String processInstanceId; |
| | | |
| | | // ========== éå®åºåº ========== |
| | | /** |
| | | * éå®åºåºæ°é |
| | |
| | | */ |
| | | private String remark; |
| | | |
| | | // ========== BPM æµç¨å®¡æ¹ ========== |
| | | /** |
| | | * BPM æµç¨å®ä¾ç¼å· |
| | | */ |
| | | private String processInstanceId; |
| | | |
| | | } |
| | |
| | | @Getter |
| | | public enum ErpAuditStatus implements ArrayValuable<Integer> { |
| | | |
| | | PROCESS(10, "æªå®¡æ ¸"), // å®¡æ ¸ä¸ |
| | | APPROVE(20, "å·²å®¡æ ¸"); // å®¡æ ¸éè¿ |
| | | DRAFT(0, "è稿"), // èç¨¿ç¶æï¼æªæäº¤å®¡æ¹ |
| | | PROCESS(10, "审æ¹ä¸"), // 审æ¹ä¸ |
| | | APPROVE(20, "审æ¹éè¿"), // 审æ¹éè¿ |
| | | REJECT(30, "审æ¹ä¸éè¿"); // 审æ¹ä¸éè¿ |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(ErpAuditStatus::getStatus).toArray(Integer[]::new); |
| | | |
| | |
| | | ErrorCode PURCHASE_ORDER_PROCESS_FAIL_EXISTS_IN = new ErrorCode(1_030_101_008, "åå®¡æ ¸å¤±è´¥ï¼å·²åå¨å¯¹åºçéè´å
¥åºå"); |
| | | ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_009, "éè´è®¢å项({})è¶
è¿æå¤§å
许éè´§æ°é({})"); |
| | | ErrorCode PURCHASE_ORDER_PROCESS_FAIL_EXISTS_RETURN = new ErrorCode(1_030_101_010, "åå®¡æ ¸å¤±è´¥ï¼å·²åå¨å¯¹åºçéè´éè´§å"); |
| | | ErrorCode PURCHASE_ORDER_SUBMIT_FAIL_NOT_DRAFT = new ErrorCode(1_030_101_011, "æäº¤å®¡æ¹å¤±è´¥ï¼åªæèç¨¿ç¶æçéè´è®¢åæè½æäº¤å®¡æ¹"); |
| | | ErrorCode PURCHASE_ORDER_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS = new ErrorCode(1_030_101_012, "æ´æ°å®¡æ¹ç¶æå¤±è´¥ï¼åªæå®¡æ¹ä¸çéè´è®¢åæè½æ´æ°å®¡æ¹ç¶æ"); |
| | | |
| | | // ========== ERP éè´å
¥åºï¼1-030-102-000ï¼ ========== |
| | | ErrorCode PURCHASE_IN_NOT_EXISTS = new ErrorCode(1_030_102_000, "éè´å
¥åºåä¸åå¨"); |
| | |
| | | ErrorCode PURCHASE_IN_NOT_APPROVE = new ErrorCode(1_030_102_006, "éè´å
¥åºåæªå®¡æ ¸ï¼æ æ³æä½"); |
| | | ErrorCode PURCHASE_IN_FAIL_PAYMENT_PRICE_EXCEED = new ErrorCode(1_030_102_007, "仿¬¾éé¢({})è¶
è¿éè´å
¥åºåæ»éé¢({})"); |
| | | ErrorCode PURCHASE_IN_PROCESS_FAIL_EXISTS_PAYMENT = new ErrorCode(1_030_102_008, "åå®¡æ ¸å¤±è´¥ï¼å·²åå¨å¯¹åºç仿¬¾å"); |
| | | ErrorCode PURCHASE_IN_SUBMIT_FAIL_NOT_DRAFT = new ErrorCode(1_030_102_009, "æäº¤å®¡æ¹å¤±è´¥ï¼åªæèç¨¿ç¶æçéè´å
¥åºåæè½æäº¤å®¡æ¹"); |
| | | ErrorCode PURCHASE_IN_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS = new ErrorCode(1_030_102_010, "æ´æ°å®¡æ¹ç¶æå¤±è´¥ï¼åªæå®¡æ¹ä¸çéè´å
¥åºåæè½æ´æ°å®¡æ¹ç¶æ"); |
| | | |
| | | // ========== ERP éè´éè´§ï¼1-030-103-000ï¼ ========== |
| | | ErrorCode PURCHASE_RETURN_NOT_EXISTS = new ErrorCode(1_030_103_000, "éè´éè´§åä¸åå¨"); |
| | |
| | | ErrorCode SALE_ORDER_PROCESS_FAIL_EXISTS_OUT = new ErrorCode(1_020_201_008, "åå®¡æ ¸å¤±è´¥ï¼å·²åå¨å¯¹åºçéå®åºåºå"); |
| | | ErrorCode SALE_ORDER_ITEM_RETURN_FAIL_OUT_EXCEED = new ErrorCode(1_020_201_009, "éå®è®¢å项({})è¶
è¿æå¤§å
许éè´§æ°é({})"); |
| | | ErrorCode SALE_ORDER_PROCESS_FAIL_EXISTS_RETURN = new ErrorCode(1_020_201_010, "åå®¡æ ¸å¤±è´¥ï¼å·²åå¨å¯¹åºçéå®éè´§å"); |
| | | ErrorCode SALE_ORDER_SUBMIT_FAIL_NOT_DRAFT = new ErrorCode(1_020_201_011, "æäº¤å®¡æ¹å¤±è´¥ï¼åªæèç¨¿ç¶æçéå®è®¢åæè½æäº¤å®¡æ¹"); |
| | | ErrorCode SALE_ORDER_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS = new ErrorCode(1_020_201_012, "æ´æ°å®¡æ¹ç¶æå¤±è´¥ï¼åªæå®¡æ¹ä¸çéå®è®¢åæè½æ´æ°å®¡æ¹ç¶æ"); |
| | | |
| | | // ========== ERP éå®åºåºï¼1-030-202-000ï¼ ========== |
| | | ErrorCode SALE_OUT_NOT_EXISTS = new ErrorCode(1_020_202_000, "éå®åºåºåä¸åå¨"); |
| | |
| | | ErrorCode SALE_OUT_NOT_APPROVE = new ErrorCode(1_020_202_006, "éå®åºåºåæªå®¡æ ¸ï¼æ æ³æä½"); |
| | | ErrorCode SALE_OUT_FAIL_RECEIPT_PRICE_EXCEED = new ErrorCode(1_020_202_007, "æ¶æ¬¾éé¢({})è¶
è¿éå®åºåºåæ»éé¢({})"); |
| | | ErrorCode SALE_OUT_PROCESS_FAIL_EXISTS_RECEIPT = new ErrorCode(1_020_202_008, "åå®¡æ ¸å¤±è´¥ï¼å·²åå¨å¯¹åºçæ¶æ¬¾å"); |
| | | ErrorCode SALE_OUT_SUBMIT_FAIL_NOT_DRAFT = new ErrorCode(1_020_202_009, "æäº¤å®¡æ¹å¤±è´¥ï¼åªæèç¨¿ç¶æçéå®åºåºåæè½æäº¤å®¡æ¹"); |
| | | ErrorCode SALE_OUT_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS = new ErrorCode(1_020_202_010, "æ´æ°å®¡æ¹ç¶æå¤±è´¥ï¼åªæå®¡æ¹ä¸çéå®åºåºåæè½æ´æ°å®¡æ¹ç¶æ"); |
| | | |
| | | // ========== ERP éå®éè´§ï¼1-030-203-000ï¼ ========== |
| | | ErrorCode SALE_RETURN_NOT_EXISTS = new ErrorCode(1_020_203_000, "éå®éè´§åä¸åå¨"); |
| | |
| | | // ========== ERP 产å 1-030-500-000 ========== |
| | | ErrorCode PRODUCT_NOT_EXISTS = new ErrorCode(1_030_500_000, "产åä¸åå¨"); |
| | | ErrorCode PRODUCT_NOT_ENABLE = new ErrorCode(1_030_500_001, "产å({})æªå¯ç¨"); |
| | | ErrorCode PRODUCT_BAR_CODE_EXISTS = new ErrorCode(1_030_500_002, "äº§åæ¡ç å·²åå¨"); |
| | | |
| | | // ========== ERP 产ååç±» 1-030-501-000 ========== |
| | | ErrorCode PRODUCT_CATEGORY_NOT_EXISTS = new ErrorCode(1_030_501_000, "产ååç±»ä¸åå¨"); |
| | |
| | | import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductCategoryDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductMapper; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemCreateReqDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemUpdateReqDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.category.MdmItemCategoryApi; |
| | | import cn.iocoder.yudao.module.mdm.api.category.dto.MdmItemCategoryRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | |
| | | /** |
| | | * ERP 产å Service å®ç°ç±» |
| | | * |
| | | * æ¹é 说æï¼ERP äº§åæ°æ®æ¥æºäº MDM ç©æä¸»æ°æ® |
| | | * - ææäº§åæä½åè°ç¨ MDM API |
| | | * - ERP 产åå¯¹åº MDM ç©æç±»å = æåï¼itemType = 2ï¼ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class ErpProductServiceImpl implements ErpProductService { |
| | | |
| | | @Resource |
| | | private ErpProductMapper productMapper; |
| | | /** ERP 产å对åºç MDM ç©æç±»åï¼æå */ |
| | | private static final int MDM_ITEM_TYPE_PRODUCT = 2; |
| | | |
| | | @Resource |
| | | private ErpProductCategoryService productCategoryService; |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | @Resource |
| | | private ErpProductUnitService productUnitService; |
| | | private MdmItemCategoryApi mdmItemCategoryApi; |
| | | |
| | | @Resource |
| | | private MdmUnitMeasureApi mdmUnitMeasureApi; |
| | | |
| | | @Override |
| | | public Long createProduct(ProductSaveReqVO createReqVO) { |
| | | // TODO èè¿ï¼æ ¡éªåç±» |
| | | // æå
¥ |
| | | ErpProductDO product = BeanUtils.toBean(createReqVO, ErpProductDO.class); |
| | | productMapper.insert(product); |
| | | // è¿å |
| | | return product.getId(); |
| | | // 1. æ ¡éªæ¡ç å¯ä¸ |
| | | validateProductBarCodeUnique(null, createReqVO.getBarCode()); |
| | | |
| | | // 2. æå»ºå建请æ±å¹¶è°ç¨ MDM API |
| | | MdmItemCreateReqDTO createReqDTO = buildCreateReqDTO(createReqVO); |
| | | return mdmItemApi.createItem(createReqDTO).getCheckedData(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateProduct(ProductSaveReqVO updateReqVO) { |
| | | // TODO èè¿ï¼æ ¡éªåç±» |
| | | // æ ¡éªåå¨ |
| | | // 1. æ ¡éªåå¨ |
| | | validateProductExists(updateReqVO.getId()); |
| | | // æ´æ° |
| | | ErpProductDO updateObj = BeanUtils.toBean(updateReqVO, ErpProductDO.class); |
| | | productMapper.updateById(updateObj); |
| | | |
| | | // 2. æ ¡éªæ¡ç å¯ä¸ |
| | | validateProductBarCodeUnique(updateReqVO.getId(), updateReqVO.getBarCode()); |
| | | |
| | | // 3. æå»ºæ´æ°è¯·æ±å¹¶è°ç¨ MDM API |
| | | MdmItemUpdateReqDTO updateReqDTO = buildUpdateReqDTO(updateReqVO); |
| | | mdmItemApi.updateItem(updateReqDTO); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteProduct(Long id) { |
| | | // æ ¡éªåå¨ |
| | | validateProductExists(id); |
| | | // å é¤ |
| | | productMapper.deleteById(id); |
| | | // ERP 产åå é¤å®é
为ç¦ç¨ï¼MDM ç©æä¸è½ç©çå é¤ï¼ |
| | | mdmItemApi.updateItemStatus(id, CommonStatusEnum.DISABLE.getStatus()); |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | List<ErpProductDO> list = productMapper.selectByIds(ids); |
| | | Map<Long, ErpProductDO> productMap = convertMap(list, ErpProductDO::getId); |
| | | |
| | | // 1. è°ç¨ MDM API è·åç©æå表 |
| | | List<MdmItemRespDTO> itemList = mdmItemApi.getItemList(ids).getCheckedData(); |
| | | Map<Long, MdmItemRespDTO> itemMap = convertMap(itemList, MdmItemRespDTO::getId); |
| | | |
| | | // 2. æ ¡éªæ¯ä¸ªäº§å |
| | | for (Long id : ids) { |
| | | ErpProductDO product = productMap.get(id); |
| | | if (productMap.get(id) == null) { |
| | | MdmItemRespDTO item = itemMap.get(id); |
| | | if (item == null) { |
| | | throw exception(PRODUCT_NOT_EXISTS); |
| | | } |
| | | if (CommonStatusEnum.isDisable(product.getStatus())) { |
| | | throw exception(PRODUCT_NOT_ENABLE, product.getName()); |
| | | if (CommonStatusEnum.isDisable(item.getStatus())) { |
| | | throw exception(PRODUCT_NOT_ENABLE, item.getName()); |
| | | } |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | private void validateProductExists(Long id) { |
| | | if (productMapper.selectById(id) == null) { |
| | | throw exception(PRODUCT_NOT_EXISTS); |
| | | } |
| | | // 3. 转æ¢ä¸º ERP Product DOï¼æå¨æ å°åæ®µï¼ |
| | | return convertToErpProductDOList(itemList); |
| | | } |
| | | |
| | | @Override |
| | | public ErpProductDO getProduct(Long id) { |
| | | return productMapper.selectById(id); |
| | | MdmItemRespDTO item = mdmItemApi.getItem(id).getCheckedData(); |
| | | return convertToErpProductDO(item); |
| | | } |
| | | |
| | | @Override |
| | | public List<ErpProductRespVO> getProductVOListByStatus(Integer status) { |
| | | List<ErpProductDO> list = productMapper.selectListByStatus(status); |
| | | return buildProductVOList(list); |
| | | List<MdmItemRespDTO> itemList = mdmItemApi.getItemListByStatus(status).getCheckedData(); |
| | | return buildProductVOList(itemList); |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | List<ErpProductDO> list = productMapper.selectByIds(ids); |
| | | return buildProductVOList(list); |
| | | List<MdmItemRespDTO> itemList = mdmItemApi.getItemList(ids).getCheckedData(); |
| | | return buildProductVOList(itemList); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<ErpProductRespVO> getProductVOPage(ErpProductPageReqVO pageReqVO) { |
| | | PageResult<ErpProductDO> pageResult = productMapper.selectPage(pageReqVO); |
| | | return new PageResult<>(buildProductVOList(pageResult.getList()), pageResult.getTotal()); |
| | | } |
| | | // è°ç¨ MDM API å页æ¥è¯¢ |
| | | PageResult<MdmItemRespDTO> mdmPageResult = mdmItemApi.getItemPage( |
| | | MDM_ITEM_TYPE_PRODUCT, |
| | | pageReqVO.getStatus(), |
| | | pageReqVO.getPageNo(), |
| | | pageReqVO.getPageSize() |
| | | ).getCheckedData(); |
| | | |
| | | private List<ErpProductRespVO> buildProductVOList(List<ErpProductDO> list) { |
| | | if (CollUtil.isEmpty(list)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | Map<Long, ErpProductCategoryDO> categoryMap = productCategoryService.getProductCategoryMap( |
| | | convertSet(list, ErpProductDO::getCategoryId)); |
| | | Map<Long, ErpProductUnitDO> unitMap = productUnitService.getProductUnitMap( |
| | | convertSet(list, ErpProductDO::getUnitId)); |
| | | return BeanUtils.toBean(list, ErpProductRespVO.class, product -> { |
| | | MapUtils.findAndThen(categoryMap, product.getCategoryId(), |
| | | category -> product.setCategoryName(category.getName())); |
| | | MapUtils.findAndThen(unitMap, product.getUnitId(), |
| | | unit -> product.setUnitName(unit.getName())); |
| | | }); |
| | | List<ErpProductRespVO> productVOList = buildProductVOList(mdmPageResult.getList()); |
| | | return new PageResult<>(productVOList, mdmPageResult.getTotal()); |
| | | } |
| | | |
| | | @Override |
| | | public Long getProductCountByCategoryId(Long categoryId) { |
| | | return productMapper.selectCountByCategoryId(categoryId); |
| | | return mdmItemApi.getItemCountByCategoryId(categoryId).getCheckedData(); |
| | | } |
| | | |
| | | @Override |
| | | public Long getProductCountByUnitId(Long unitId) { |
| | | return productMapper.selectCountByUnitId(unitId); |
| | | return mdmItemApi.getItemCountByUnitMeasureId(unitId).getCheckedData(); |
| | | } |
| | | |
| | | } |
| | | // ==================== ç§ææ¹æ³ ==================== |
| | | |
| | | /** |
| | | * æ ¡éªäº§ååå¨ |
| | | */ |
| | | private void validateProductExists(Long id) { |
| | | mdmItemApi.validateItemExists(id).getCheckedData(); |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªäº§åæ¡ç å¯ä¸ |
| | | */ |
| | | private void validateProductBarCodeUnique(Long id, String barCode) { |
| | | if (barCode == null) { |
| | | return; |
| | | } |
| | | MdmItemRespDTO existItem = mdmItemApi.getItemByBarCode(barCode).getCheckedData(); |
| | | if (existItem != null && !existItem.getId().equals(id)) { |
| | | throw exception(PRODUCT_BAR_CODE_EXISTS); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æå»ºåå»ºè¯·æ± DTO |
| | | * 注æï¼ProductSaveReqVO ä½¿ç¨ standard åæ®µä½ä¸ºè§æ ¼ï¼MDM ä½¿ç¨ specification |
| | | */ |
| | | private MdmItemCreateReqDTO buildCreateReqDTO(ProductSaveReqVO saveReqVO) { |
| | | MdmItemCreateReqDTO createReqDTO = new MdmItemCreateReqDTO(); |
| | | createReqDTO.setCode(saveReqVO.getBarCode()); // ä½¿ç¨æ¡ç ä½ä¸ºç¼ç |
| | | createReqDTO.setName(saveReqVO.getName()); |
| | | createReqDTO.setBarCode(saveReqVO.getBarCode()); |
| | | createReqDTO.setSpecification(saveReqVO.getStandard()); // standard -> specification |
| | | createReqDTO.setCategoryId(saveReqVO.getCategoryId()); |
| | | createReqDTO.setUnitMeasureId(saveReqVO.getUnitId()); // unitId -> unitMeasureId |
| | | createReqDTO.setItemType(MDM_ITEM_TYPE_PRODUCT); |
| | | createReqDTO.setStatus(saveReqVO.getStatus() != null ? saveReqVO.getStatus() : CommonStatusEnum.ENABLE.getStatus()); |
| | | createReqDTO.setPurchasePrice(saveReqVO.getPurchasePrice()); |
| | | createReqDTO.setSalesPrice(saveReqVO.getSalePrice()); |
| | | createReqDTO.setCostPrice(saveReqVO.getMinPrice()); // minPrice -> costPrice |
| | | createReqDTO.setExpiryDay(saveReqVO.getExpiryDay()); |
| | | createReqDTO.setWeight(saveReqVO.getWeight()); |
| | | createReqDTO.setRemark(saveReqVO.getRemark()); |
| | | return createReqDTO; |
| | | } |
| | | |
| | | /** |
| | | * æå»ºæ´æ°è¯·æ± DTO |
| | | */ |
| | | private MdmItemUpdateReqDTO buildUpdateReqDTO(ProductSaveReqVO saveReqVO) { |
| | | MdmItemUpdateReqDTO updateReqDTO = new MdmItemUpdateReqDTO(); |
| | | updateReqDTO.setId(saveReqVO.getId()); |
| | | updateReqDTO.setCode(saveReqVO.getBarCode()); |
| | | updateReqDTO.setName(saveReqVO.getName()); |
| | | updateReqDTO.setBarCode(saveReqVO.getBarCode()); |
| | | updateReqDTO.setSpecification(saveReqVO.getStandard()); // standard -> specification |
| | | updateReqDTO.setCategoryId(saveReqVO.getCategoryId()); |
| | | updateReqDTO.setUnitMeasureId(saveReqVO.getUnitId()); // unitId -> unitMeasureId |
| | | updateReqDTO.setStatus(saveReqVO.getStatus()); |
| | | updateReqDTO.setPurchasePrice(saveReqVO.getPurchasePrice()); |
| | | updateReqDTO.setSalesPrice(saveReqVO.getSalePrice()); |
| | | updateReqDTO.setCostPrice(saveReqVO.getMinPrice()); |
| | | updateReqDTO.setExpiryDay(saveReqVO.getExpiryDay()); |
| | | updateReqDTO.setWeight(saveReqVO.getWeight()); |
| | | updateReqDTO.setRemark(saveReqVO.getRemark()); |
| | | return updateReqDTO; |
| | | } |
| | | |
| | | /** |
| | | * æå»ºäº§å VO å表ï¼å
å«åç±»ååä½åç§°ï¼ |
| | | * 注æï¼MDM å ERP åæ®µåæå·®å¼ï¼éè¦æå¨æ å° |
| | | */ |
| | | private List<ErpProductRespVO> buildProductVOList(List<MdmItemRespDTO> itemList) { |
| | | if (CollUtil.isEmpty(itemList)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | |
| | | // 1. è·ååç±»ååä½ä¿¡æ¯ |
| | | Set<Long> categoryIds = convertSet(itemList, MdmItemRespDTO::getCategoryId); |
| | | Set<Long> unitIds = convertSet(itemList, MdmItemRespDTO::getUnitMeasureId); |
| | | |
| | | Map<Long, MdmItemCategoryRespDTO> categoryMap = CollUtil.isEmpty(categoryIds) |
| | | ? Collections.emptyMap() |
| | | : convertMap(mdmItemCategoryApi.getItemCategoryList(categoryIds).getCheckedData(), MdmItemCategoryRespDTO::getId); |
| | | |
| | | Map<Long, MdmUnitMeasureRespDTO> unitMap = CollUtil.isEmpty(unitIds) |
| | | ? Collections.emptyMap() |
| | | : convertMap(mdmUnitMeasureApi.getUnitMeasureList(unitIds).getCheckedData(), MdmUnitMeasureRespDTO::getId); |
| | | |
| | | // 2. æå¨è½¬æ¢å¹¶å¡«å
å
³èä¿¡æ¯ï¼å¤çåæ®µåå·®å¼ï¼ |
| | | List<ErpProductRespVO> result = new ArrayList<>(); |
| | | for (MdmItemRespDTO mdmItem : itemList) { |
| | | ErpProductRespVO product = new ErpProductRespVO(); |
| | | product.setId(mdmItem.getId()); |
| | | product.setName(mdmItem.getName()); |
| | | product.setBarCode(mdmItem.getBarCode()); |
| | | product.setStandard(mdmItem.getSpecification()); // specification -> standard |
| | | product.setCategoryId(mdmItem.getCategoryId()); |
| | | product.setUnitId(mdmItem.getUnitMeasureId()); // unitMeasureId -> unitId |
| | | product.setStatus(mdmItem.getStatus()); |
| | | product.setPurchasePrice(mdmItem.getPurchasePrice()); |
| | | product.setSalePrice(mdmItem.getSalesPrice()); // salesPrice -> salePrice |
| | | product.setMinPrice(mdmItem.getCostPrice()); // costPrice -> minPrice |
| | | product.setExpiryDay(mdmItem.getExpiryDay()); |
| | | product.setWeight(mdmItem.getWeight()); |
| | | product.setRemark(mdmItem.getRemark()); |
| | | |
| | | // 设置åç±»ååä½åç§° |
| | | MapUtils.findAndThen(categoryMap, mdmItem.getCategoryId(), |
| | | category -> product.setCategoryName(category.getName())); |
| | | MapUtils.findAndThen(unitMap, mdmItem.getUnitMeasureId(), |
| | | unit -> product.setUnitName(unit.getName())); |
| | | |
| | | result.add(product); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * è½¬æ¢ MDM ç©æä¸º ERP 产å DO |
| | | * 注æï¼å段åå·®å¼éè¦æå¨æ å° |
| | | */ |
| | | private ErpProductDO convertToErpProductDO(MdmItemRespDTO mdmItem) { |
| | | if (mdmItem == null) { |
| | | return null; |
| | | } |
| | | ErpProductDO product = new ErpProductDO(); |
| | | product.setId(mdmItem.getId()); |
| | | product.setName(mdmItem.getName()); |
| | | product.setBarCode(mdmItem.getBarCode()); |
| | | product.setStandard(mdmItem.getSpecification()); // specification -> standard |
| | | product.setCategoryId(mdmItem.getCategoryId()); |
| | | product.setUnitId(mdmItem.getUnitMeasureId()); // unitMeasureId -> unitId |
| | | product.setStatus(mdmItem.getStatus()); |
| | | product.setPurchasePrice(mdmItem.getPurchasePrice()); |
| | | product.setSalePrice(mdmItem.getSalesPrice()); // salesPrice -> salePrice |
| | | product.setMinPrice(mdmItem.getCostPrice()); // costPrice -> minPrice |
| | | product.setExpiryDay(mdmItem.getExpiryDay()); |
| | | product.setWeight(mdmItem.getWeight()); |
| | | product.setRemark(mdmItem.getRemark()); |
| | | return product; |
| | | } |
| | | |
| | | /** |
| | | * æ¹éè½¬æ¢ MDM ç©æå表为 ERP 产åå表 |
| | | */ |
| | | private List<ErpProductDO> convertToErpProductDOList(List<MdmItemRespDTO> mdmItemList) { |
| | | if (CollUtil.isEmpty(mdmItemList)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | List<ErpProductDO> result = new ArrayList<>(); |
| | | for (MdmItemRespDTO mdmItem : mdmItemList) { |
| | | result.add(convertToErpProductDO(mdmItem)); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | } |
| | |
| | | void updatePurchaseInStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * æäº¤éè´å
¥åºå®¡æ¹ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param userId ç¨æ·ç¼å· |
| | | */ |
| | | void submitPurchaseIn(Long id, Long userId); |
| | | |
| | | /** |
| | | * æ´æ°éè´å
¥åºç审æ¹ç¶æ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | */ |
| | | void updatePurchaseInAuditStatus(Long id, Integer bpmResult); |
| | | |
| | | /** |
| | | * æ´æ°éè´å
¥åºç仿¬¾éé¢ |
| | | * |
| | | * @param id ç¼å· |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.in.ErpPurchaseInPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.in.ErpPurchaseInSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; |
| | |
| | | import cn.iocoder.yudao.module.erp.service.stock.bo.ErpStockRecordCreateReqBO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| | | import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; |
| | | |
| | | // TODO èè¿ï¼è®°å½æä½æ¥å¿ |
| | | |
| | | /** |
| | | * ERP éè´å
¥åº Service å®ç°ç±» |
| | | * |
| | |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { |
| | | |
| | | /** |
| | | * BPM éè´å
¥åºå®¡æ¹æµç¨æ è¯ |
| | | */ |
| | | public static final String BPM_PROCESS_DEFINITION_KEY = "erp-purchase-in-audit"; |
| | | |
| | | @Resource |
| | | private ErpPurchaseInMapper purchaseInMapper; |
| | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createPurchaseIn(ErpPurchaseInSaveReqVO createReqVO) { |
| | |
| | | |
| | | // 2.1 æå
¥å
¥åº |
| | | ErpPurchaseInDO purchaseIn = BeanUtils.toBean(createReqVO, ErpPurchaseInDO.class, in -> in |
| | | .setNo(no).setStatus(ErpAuditStatus.PROCESS.getStatus())) |
| | | .setNo(no).setStatus(ErpAuditStatus.DRAFT.getStatus())) |
| | | .setOrderNo(purchaseOrder.getNo()).setSupplierId(purchaseOrder.getSupplierId()); |
| | | calculateTotalPrice(purchaseIn, purchaseInItems); |
| | | purchaseInMapper.insert(purchaseIn); |
| | |
| | | : ErpStockRecordBizTypeEnum.PURCHASE_IN_CANCEL.getType(); |
| | | purchaseInItems.forEach(purchaseInItem -> { |
| | | BigDecimal count = approve ? purchaseInItem.getCount() : purchaseInItem.getCount().negate(); |
| | | stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO( |
| | | purchaseInItem.getProductId(), purchaseInItem.getWarehouseId(), count, |
| | | bizType, purchaseInItem.getInId(), purchaseInItem.getId(), purchaseIn.getNo())); |
| | | ErpStockRecordCreateReqBO stockRecordBO = new ErpStockRecordCreateReqBO(); |
| | | stockRecordBO.setProductId(purchaseInItem.getProductId()); |
| | | stockRecordBO.setWarehouseId(purchaseInItem.getWarehouseId()); |
| | | stockRecordBO.setCount(count); |
| | | stockRecordBO.setBizType(bizType); |
| | | stockRecordBO.setBizId(purchaseInItem.getInId()); |
| | | stockRecordBO.setBizItemId(purchaseInItem.getId()); |
| | | stockRecordBO.setBizNo(purchaseIn.getNo()); |
| | | stockRecordService.createStockRecord(stockRecordBO); |
| | | }); |
| | | } |
| | | |
| | |
| | | return purchaseInItemMapper.selectListByInIds(inIds); |
| | | } |
| | | |
| | | // ==================== BPM æµç¨å®¡æ¹ ==================== |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitPurchaseIn(Long id, Long userId) { |
| | | // 1. æ ¡éªéè´å
¥åºå¤äºèç¨¿ç¶æ |
| | | ErpPurchaseInDO purchaseIn = validatePurchaseInExists(id); |
| | | if (ObjectUtil.notEqual(purchaseIn.getStatus(), ErpAuditStatus.DRAFT.getStatus())) { |
| | | throw exception(PURCHASE_IN_SUBMIT_FAIL_NOT_DRAFT); |
| | | } |
| | | |
| | | // 2. å建éè´å
¥åºå®¡æ¹æµç¨å®ä¾ |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(BPM_PROCESS_DEFINITION_KEY) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | |
| | | // 3. æ´æ°éè´å
¥åºå·¥ä½æµç¼å·ãç¶æ |
| | | purchaseInMapper.updateById(new ErpPurchaseInDO() |
| | | .setId(id) |
| | | .setProcessInstanceId(processInstanceId) |
| | | .setStatus(ErpAuditStatus.PROCESS.getStatus())); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updatePurchaseInAuditStatus(Long id, Integer bpmResult) { |
| | | // 1. æ ¡éªéè´å
¥åºåå¨ |
| | | ErpPurchaseInDO purchaseIn = validatePurchaseInExists(id); |
| | | |
| | | // 2. æ ¡éªéè´å
¥åºå¤äºå®¡æ¹ä¸ |
| | | if (ObjectUtil.notEqual(purchaseIn.getStatus(), ErpAuditStatus.PROCESS.getStatus())) { |
| | | log.error("[updatePurchaseInAuditStatus][purchaseIn({}) ä¸å¤äºå®¡æ¹ä¸ï¼æ æ³æ´æ°å®¡æ¹ç»æ({})]", |
| | | purchaseIn.getId(), bpmResult); |
| | | throw exception(PURCHASE_IN_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS); |
| | | } |
| | | |
| | | // 3. æ´æ°éè´å
¥åºå®¡æ¹ç»æ |
| | | Integer auditStatus = convertBpmResultToAuditStatus(bpmResult); |
| | | purchaseInMapper.updateById(new ErpPurchaseInDO() |
| | | .setId(id) |
| | | .setStatus(auditStatus)); |
| | | |
| | | // 4. 审æ¹éè¿æ¶åæ´åºå |
| | | if (ErpAuditStatus.APPROVE.getStatus().equals(auditStatus)) { |
| | | List<ErpPurchaseInItemDO> purchaseInItems = purchaseInItemMapper.selectListByInId(id); |
| | | purchaseInItems.forEach(purchaseInItem -> { |
| | | ErpStockRecordCreateReqBO stockRecordBO = new ErpStockRecordCreateReqBO(); |
| | | stockRecordBO.setProductId(purchaseInItem.getProductId()); |
| | | stockRecordBO.setWarehouseId(purchaseInItem.getWarehouseId()); |
| | | stockRecordBO.setCount(purchaseInItem.getCount()); |
| | | stockRecordBO.setBizType(ErpStockRecordBizTypeEnum.PURCHASE_IN.getType()); |
| | | stockRecordBO.setBizId(purchaseInItem.getInId()); |
| | | stockRecordBO.setBizItemId(purchaseInItem.getId()); |
| | | stockRecordBO.setBizNo(purchaseIn.getNo()); |
| | | stockRecordService.createStockRecord(stockRecordBO); |
| | | }); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å° BPM 审æ¹ç»æè½¬æ¢ä¸º ERP 审æ¹ç¶æ |
| | | * |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | * @return ERP 审æ¹ç¶æ |
| | | */ |
| | | private Integer convertBpmResultToAuditStatus(Integer bpmResult) { |
| | | // BPM 审æ¹ç»æï¼2=éè¿ï¼3=ä¸éè¿ï¼4=已忶 |
| | | if (bpmResult == 2) { |
| | | return ErpAuditStatus.APPROVE.getStatus(); |
| | | } else if (bpmResult == 3) { |
| | | return ErpAuditStatus.REJECT.getStatus(); |
| | | } else if (bpmResult == 4) { |
| | | return ErpAuditStatus.DRAFT.getStatus(); |
| | | } else { |
| | | log.warn("[convertBpmResultToAuditStatus][æªç¥ç BPM 审æ¹ç»æ({})]", bpmResult); |
| | | return ErpAuditStatus.PROCESS.getStatus(); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | void updatePurchaseOrderStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * æäº¤éè´è®¢åå®¡æ¹ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param userId ç¨æ·ç¼å· |
| | | */ |
| | | void submitPurchaseOrder(Long id, Long userId); |
| | | |
| | | /** |
| | | * æ´æ°éè´è®¢åç审æ¹ç¶æ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | */ |
| | | void updatePurchaseOrderAuditStatus(Long id, Integer bpmResult); |
| | | |
| | | /** |
| | | * æ´æ°éè´è®¢åçå
¥åºæ°é |
| | | * |
| | | * @param id ç¼å· |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; |
| | |
| | | import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService; |
| | | import cn.iocoder.yudao.module.erp.service.product.ErpProductService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| | | import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; |
| | | |
| | | // TODO èè¿ï¼è®°å½æä½æ¥å¿ |
| | | |
| | | /** |
| | | * ERP éè´è®¢å Service å®ç°ç±» |
| | | * |
| | |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService { |
| | | |
| | | /** |
| | | * BPM éè´è®¢åå®¡æ¹æµç¨æ è¯ |
| | | */ |
| | | public static final String BPM_PROCESS_DEFINITION_KEY = "erp-purchase-order-audit"; |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderMapper purchaseOrderMapper; |
| | |
| | | private ErpSupplierService supplierService; |
| | | @Resource |
| | | private ErpAccountService accountService; |
| | | |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | |
| | | // 2.1 æå
¥è®¢å |
| | | ErpPurchaseOrderDO purchaseOrder = BeanUtils.toBean(createReqVO, ErpPurchaseOrderDO.class, in -> in |
| | | .setNo(no).setStatus(ErpAuditStatus.PROCESS.getStatus())); |
| | | .setNo(no).setStatus(ErpAuditStatus.DRAFT.getStatus())); |
| | | calculateTotalPrice(purchaseOrder, purchaseOrderItems); |
| | | purchaseOrderMapper.insert(purchaseOrder); |
| | | // 2.2 æå
¥è®¢å项 |
| | |
| | | return purchaseOrderItemMapper.selectListByOrderIds(orderIds); |
| | | } |
| | | |
| | | // ==================== BPM æµç¨å®¡æ¹ ==================== |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitPurchaseOrder(Long id, Long userId) { |
| | | // 1. æ ¡éªéè´è®¢åå¤äºèç¨¿ç¶æ |
| | | ErpPurchaseOrderDO purchaseOrder = validatePurchaseOrderExists(id); |
| | | if (ObjectUtil.notEqual(purchaseOrder.getStatus(), ErpAuditStatus.DRAFT.getStatus())) { |
| | | throw exception(PURCHASE_ORDER_SUBMIT_FAIL_NOT_DRAFT); |
| | | } |
| | | |
| | | // 2. å建éè´è®¢åå®¡æ¹æµç¨å®ä¾ |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(BPM_PROCESS_DEFINITION_KEY) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | |
| | | // 3. æ´æ°éè´è®¢å工使µç¼å·ãç¶æ |
| | | purchaseOrderMapper.updateById(new ErpPurchaseOrderDO() |
| | | .setId(id) |
| | | .setProcessInstanceId(processInstanceId) |
| | | .setStatus(ErpAuditStatus.PROCESS.getStatus())); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updatePurchaseOrderAuditStatus(Long id, Integer bpmResult) { |
| | | // 1. æ ¡éªéè´è®¢ååå¨ |
| | | ErpPurchaseOrderDO purchaseOrder = validatePurchaseOrderExists(id); |
| | | |
| | | // 2. æ ¡éªéè´è®¢åå¤äºå®¡æ¹ä¸ |
| | | if (ObjectUtil.notEqual(purchaseOrder.getStatus(), ErpAuditStatus.PROCESS.getStatus())) { |
| | | log.error("[updatePurchaseOrderAuditStatus][purchaseOrder({}) ä¸å¤äºå®¡æ¹ä¸ï¼æ æ³æ´æ°å®¡æ¹ç»æ({})]", |
| | | purchaseOrder.getId(), bpmResult); |
| | | throw exception(PURCHASE_ORDER_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS); |
| | | } |
| | | |
| | | // 3. æ´æ°éè´è®¢å审æ¹ç»æ |
| | | Integer auditStatus = convertBpmResultToAuditStatus(bpmResult); |
| | | purchaseOrderMapper.updateById(new ErpPurchaseOrderDO() |
| | | .setId(id) |
| | | .setStatus(auditStatus)); |
| | | } |
| | | |
| | | /** |
| | | * å° BPM 审æ¹ç»æè½¬æ¢ä¸º ERP 审æ¹ç¶æ |
| | | * |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | * @return ERP 审æ¹ç¶æ |
| | | */ |
| | | private Integer convertBpmResultToAuditStatus(Integer bpmResult) { |
| | | // BPM 审æ¹ç»æï¼2=éè¿ï¼3=ä¸éè¿ï¼4=已忶 |
| | | if (bpmResult == 2) { |
| | | return ErpAuditStatus.APPROVE.getStatus(); |
| | | } else if (bpmResult == 3) { |
| | | return ErpAuditStatus.REJECT.getStatus(); |
| | | } else if (bpmResult == 4) { |
| | | return ErpAuditStatus.DRAFT.getStatus(); |
| | | } else { |
| | | log.warn("[convertBpmResultToAuditStatus][æªç¥ç BPM 审æ¹ç»æ({})]", bpmResult); |
| | | return ErpAuditStatus.PROCESS.getStatus(); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | : ErpStockRecordBizTypeEnum.PURCHASE_RETURN_CANCEL.getType(); |
| | | purchaseReturnItems.forEach(purchaseReturnItem -> { |
| | | BigDecimal count = approve ? purchaseReturnItem.getCount().negate() : purchaseReturnItem.getCount(); |
| | | stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO( |
| | | purchaseReturnItem.getProductId(), purchaseReturnItem.getWarehouseId(), count, |
| | | bizType, purchaseReturnItem.getReturnId(), purchaseReturnItem.getId(), purchaseReturn.getNo())); |
| | | ErpStockRecordCreateReqBO stockRecordBO = new ErpStockRecordCreateReqBO(); |
| | | stockRecordBO.setProductId(purchaseReturnItem.getProductId()); |
| | | stockRecordBO.setWarehouseId(purchaseReturnItem.getWarehouseId()); |
| | | stockRecordBO.setCount(count); |
| | | stockRecordBO.setBizType(bizType); |
| | | stockRecordBO.setBizId(purchaseReturnItem.getReturnId()); |
| | | stockRecordBO.setBizItemId(purchaseReturnItem.getId()); |
| | | stockRecordBO.setBizNo(purchaseReturn.getNo()); |
| | | stockRecordService.createStockRecord(stockRecordBO); |
| | | }); |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.purchase.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInService; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInServiceImpl; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * éè´å
¥åºå®¡æ¹çç»æççå¬å¨å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Component |
| | | public class ErpPurchaseInStatusListener extends BpmProcessInstanceStatusEventListener { |
| | | |
| | | @Resource |
| | | private ErpPurchaseInService purchaseInService; |
| | | |
| | | @Override |
| | | public String getProcessDefinitionKey() { |
| | | return ErpPurchaseInServiceImpl.BPM_PROCESS_DEFINITION_KEY; |
| | | } |
| | | |
| | | @Override |
| | | protected void onEvent(BpmProcessInstanceStatusEvent event) { |
| | | purchaseInService.updatePurchaseInAuditStatus(Long.parseLong(event.getBusinessKey()), event.getStatus()); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.purchase.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseOrderService; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseOrderServiceImpl; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * éè´è®¢å审æ¹çç»æççå¬å¨å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Component |
| | | public class ErpPurchaseOrderStatusListener extends BpmProcessInstanceStatusEventListener { |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderService purchaseOrderService; |
| | | |
| | | @Override |
| | | public String getProcessDefinitionKey() { |
| | | return ErpPurchaseOrderServiceImpl.BPM_PROCESS_DEFINITION_KEY; |
| | | } |
| | | |
| | | @Override |
| | | protected void onEvent(BpmProcessInstanceStatusEvent event) { |
| | | purchaseOrderService.updatePurchaseOrderAuditStatus(Long.parseLong(event.getBusinessKey()), event.getStatus()); |
| | | } |
| | | |
| | | } |
| | |
| | | void updateSaleOrderStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * æäº¤éå®è®¢åå®¡æ¹ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param userId ç¨æ·ç¼å· |
| | | */ |
| | | void submitSaleOrder(Long id, Long userId); |
| | | |
| | | /** |
| | | * æ´æ°éå®è®¢åç审æ¹ç¶æ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | */ |
| | | void updateSaleOrderAuditStatus(Long id, Integer bpmResult); |
| | | |
| | | /** |
| | | * æ´æ°éå®è®¢åçåºåºæ°é |
| | | * |
| | | * @param id ç¼å· |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; |
| | |
| | | import cn.iocoder.yudao.module.erp.service.product.ErpProductService; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| | | import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; |
| | | |
| | | // TODO èè¿ï¼è®°å½æä½æ¥å¿ |
| | | |
| | | /** |
| | | * ERP éå®è®¢å Service å®ç°ç±» |
| | | * |
| | |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { |
| | | |
| | | /** |
| | | * BPM éå®è®¢åå®¡æ¹æµç¨æ è¯ |
| | | */ |
| | | public static final String BPM_PROCESS_DEFINITION_KEY = "erp-sale-order-audit"; |
| | | |
| | | @Resource |
| | | private ErpSaleOrderMapper saleOrderMapper; |
| | |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | |
| | | // 2.1 æå
¥è®¢å |
| | | ErpSaleOrderDO saleOrder = BeanUtils.toBean(createReqVO, ErpSaleOrderDO.class, in -> in |
| | | .setNo(no).setStatus(ErpAuditStatus.PROCESS.getStatus())); |
| | | .setNo(no).setStatus(ErpAuditStatus.DRAFT.getStatus())); |
| | | calculateTotalPrice(saleOrder, saleOrderItems); |
| | | saleOrderMapper.insert(saleOrder); |
| | | // 2.2 æå
¥è®¢å项 |
| | |
| | | return saleOrderItemMapper.selectListByOrderIds(orderIds); |
| | | } |
| | | |
| | | // ==================== BPM æµç¨å®¡æ¹ ==================== |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitSaleOrder(Long id, Long userId) { |
| | | // 1. æ ¡éªéå®è®¢åå¤äºèç¨¿ç¶æ |
| | | ErpSaleOrderDO saleOrder = validateSaleOrderExists(id); |
| | | if (ObjectUtil.notEqual(saleOrder.getStatus(), ErpAuditStatus.DRAFT.getStatus())) { |
| | | throw exception(SALE_ORDER_SUBMIT_FAIL_NOT_DRAFT); |
| | | } |
| | | |
| | | // 2. å建éå®è®¢åå®¡æ¹æµç¨å®ä¾ |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(BPM_PROCESS_DEFINITION_KEY) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | |
| | | // 3. æ´æ°éå®è®¢å工使µç¼å·ãç¶æ |
| | | saleOrderMapper.updateById(new ErpSaleOrderDO() |
| | | .setId(id) |
| | | .setProcessInstanceId(processInstanceId) |
| | | .setStatus(ErpAuditStatus.PROCESS.getStatus())); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateSaleOrderAuditStatus(Long id, Integer bpmResult) { |
| | | // 1. æ ¡éªéå®è®¢ååå¨ |
| | | ErpSaleOrderDO saleOrder = validateSaleOrderExists(id); |
| | | |
| | | // 2. æ ¡éªéå®è®¢åå¤äºå®¡æ¹ä¸ |
| | | if (ObjectUtil.notEqual(saleOrder.getStatus(), ErpAuditStatus.PROCESS.getStatus())) { |
| | | log.error("[updateSaleOrderAuditStatus][saleOrder({}) ä¸å¤äºå®¡æ¹ä¸ï¼æ æ³æ´æ°å®¡æ¹ç»æ({})]", |
| | | saleOrder.getId(), bpmResult); |
| | | throw exception(SALE_ORDER_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS); |
| | | } |
| | | |
| | | // 3. æ´æ°éå®è®¢å审æ¹ç»æ |
| | | Integer auditStatus = convertBpmResultToAuditStatus(bpmResult); |
| | | saleOrderMapper.updateById(new ErpSaleOrderDO() |
| | | .setId(id) |
| | | .setStatus(auditStatus)); |
| | | } |
| | | |
| | | /** |
| | | * å° BPM 审æ¹ç»æè½¬æ¢ä¸º ERP 审æ¹ç¶æ |
| | | * |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | * @return ERP 审æ¹ç¶æ |
| | | */ |
| | | private Integer convertBpmResultToAuditStatus(Integer bpmResult) { |
| | | // BPM 审æ¹ç»æï¼2=éè¿ï¼3=ä¸éè¿ï¼4=已忶 |
| | | if (bpmResult == 2) { |
| | | return ErpAuditStatus.APPROVE.getStatus(); |
| | | } else if (bpmResult == 3) { |
| | | return ErpAuditStatus.REJECT.getStatus(); |
| | | } else if (bpmResult == 4) { |
| | | return ErpAuditStatus.DRAFT.getStatus(); |
| | | } else { |
| | | log.warn("[convertBpmResultToAuditStatus][æªç¥ç BPM 审æ¹ç»æ({})]", bpmResult); |
| | | return ErpAuditStatus.PROCESS.getStatus(); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | void updateSaleOutStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * æäº¤éå®åºåºå®¡æ¹ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param userId ç¨æ·ç¼å· |
| | | */ |
| | | void submitSaleOut(Long id, Long userId); |
| | | |
| | | /** |
| | | * æ´æ°éå®åºåºç审æ¹ç¶æ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | */ |
| | | void updateSaleOutAuditStatus(Long id, Integer bpmResult); |
| | | |
| | | /** |
| | | * æ´æ°éå®åºåºçæ¶æ¬¾éé¢ |
| | | * |
| | | * @param id ç¼å· |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.out.ErpSaleOutPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.out.ErpSaleOutSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; |
| | |
| | | import cn.iocoder.yudao.module.erp.service.stock.bo.ErpStockRecordCreateReqBO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| | | import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; |
| | | |
| | | // TODO èè¿ï¼è®°å½æä½æ¥å¿ |
| | | |
| | | /** |
| | | * ERP éå®åºåº Service å®ç°ç±» |
| | | * |
| | |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class ErpSaleOutServiceImpl implements ErpSaleOutService { |
| | | |
| | | /** |
| | | * BPM éå®åºåºå®¡æ¹æµç¨æ è¯ |
| | | */ |
| | | public static final String BPM_PROCESS_DEFINITION_KEY = "erp-sale-out-audit"; |
| | | |
| | | @Resource |
| | | private ErpSaleOutMapper saleOutMapper; |
| | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createSaleOut(ErpSaleOutSaveReqVO createReqVO) { |
| | |
| | | |
| | | // 2.1 æå
¥åºåº |
| | | ErpSaleOutDO saleOut = BeanUtils.toBean(createReqVO, ErpSaleOutDO.class, in -> in |
| | | .setNo(no).setStatus(ErpAuditStatus.PROCESS.getStatus())) |
| | | .setNo(no).setStatus(ErpAuditStatus.DRAFT.getStatus())) |
| | | .setOrderNo(saleOrder.getNo()).setCustomerId(saleOrder.getCustomerId()); |
| | | calculateTotalPrice(saleOut, saleOutItems); |
| | | saleOutMapper.insert(saleOut); |
| | |
| | | : ErpStockRecordBizTypeEnum.SALE_OUT_CANCEL.getType(); |
| | | saleOutItems.forEach(saleOutItem -> { |
| | | BigDecimal count = approve ? saleOutItem.getCount().negate() : saleOutItem.getCount(); |
| | | stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO( |
| | | saleOutItem.getProductId(), saleOutItem.getWarehouseId(), count, |
| | | bizType, saleOutItem.getOutId(), saleOutItem.getId(), saleOut.getNo())); |
| | | ErpStockRecordCreateReqBO stockRecordBO = new ErpStockRecordCreateReqBO(); |
| | | stockRecordBO.setProductId(saleOutItem.getProductId()); |
| | | stockRecordBO.setWarehouseId(saleOutItem.getWarehouseId()); |
| | | stockRecordBO.setCount(count); |
| | | stockRecordBO.setBizType(bizType); |
| | | stockRecordBO.setBizId(saleOutItem.getOutId()); |
| | | stockRecordBO.setBizItemId(saleOutItem.getId()); |
| | | stockRecordBO.setBizNo(saleOut.getNo()); |
| | | stockRecordService.createStockRecord(stockRecordBO); |
| | | }); |
| | | } |
| | | |
| | |
| | | return saleOutItemMapper.selectListByOutIds(outIds); |
| | | } |
| | | |
| | | // ==================== BPM æµç¨å®¡æ¹ ==================== |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitSaleOut(Long id, Long userId) { |
| | | // 1. æ ¡éªéå®åºåºå¤äºèç¨¿ç¶æ |
| | | ErpSaleOutDO saleOut = validateSaleOutExists(id); |
| | | if (ObjectUtil.notEqual(saleOut.getStatus(), ErpAuditStatus.DRAFT.getStatus())) { |
| | | throw exception(SALE_OUT_SUBMIT_FAIL_NOT_DRAFT); |
| | | } |
| | | |
| | | // 2. å建éå®åºåºå®¡æ¹æµç¨å®ä¾ |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(BPM_PROCESS_DEFINITION_KEY) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | |
| | | // 3. æ´æ°éå®åºåºå·¥ä½æµç¼å·ãç¶æ |
| | | saleOutMapper.updateById(new ErpSaleOutDO() |
| | | .setId(id) |
| | | .setProcessInstanceId(processInstanceId) |
| | | .setStatus(ErpAuditStatus.PROCESS.getStatus())); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateSaleOutAuditStatus(Long id, Integer bpmResult) { |
| | | // 1. æ ¡éªéå®åºåºåå¨ |
| | | ErpSaleOutDO saleOut = validateSaleOutExists(id); |
| | | |
| | | // 2. æ ¡éªéå®åºåºå¤äºå®¡æ¹ä¸ |
| | | if (ObjectUtil.notEqual(saleOut.getStatus(), ErpAuditStatus.PROCESS.getStatus())) { |
| | | log.error("[updateSaleOutAuditStatus][saleOut({}) ä¸å¤äºå®¡æ¹ä¸ï¼æ æ³æ´æ°å®¡æ¹ç»æ({})]", |
| | | saleOut.getId(), bpmResult); |
| | | throw exception(SALE_OUT_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS); |
| | | } |
| | | |
| | | // 3. æ´æ°éå®åºåºå®¡æ¹ç»æ |
| | | Integer auditStatus = convertBpmResultToAuditStatus(bpmResult); |
| | | saleOutMapper.updateById(new ErpSaleOutDO() |
| | | .setId(id) |
| | | .setStatus(auditStatus)); |
| | | |
| | | // 4. 审æ¹éè¿æ¶åæ´åºåï¼åå°åºåï¼ |
| | | if (ErpAuditStatus.APPROVE.getStatus().equals(auditStatus)) { |
| | | List<ErpSaleOutItemDO> saleOutItems = saleOutItemMapper.selectListByOutId(id); |
| | | saleOutItems.forEach(saleOutItem -> { |
| | | ErpStockRecordCreateReqBO stockRecordBO = new ErpStockRecordCreateReqBO(); |
| | | stockRecordBO.setProductId(saleOutItem.getProductId()); |
| | | stockRecordBO.setWarehouseId(saleOutItem.getWarehouseId()); |
| | | stockRecordBO.setCount(saleOutItem.getCount().negate()); |
| | | stockRecordBO.setBizType(ErpStockRecordBizTypeEnum.SALE_OUT.getType()); |
| | | stockRecordBO.setBizId(saleOutItem.getOutId()); |
| | | stockRecordBO.setBizItemId(saleOutItem.getId()); |
| | | stockRecordBO.setBizNo(saleOut.getNo()); |
| | | stockRecordService.createStockRecord(stockRecordBO); |
| | | }); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å° BPM 审æ¹ç»æè½¬æ¢ä¸º ERP 审æ¹ç¶æ |
| | | * |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | * @return ERP 审æ¹ç¶æ |
| | | */ |
| | | private Integer convertBpmResultToAuditStatus(Integer bpmResult) { |
| | | // BPM 审æ¹ç»æï¼2=éè¿ï¼3=ä¸éè¿ï¼4=已忶 |
| | | if (bpmResult == 2) { |
| | | return ErpAuditStatus.APPROVE.getStatus(); |
| | | } else if (bpmResult == 3) { |
| | | return ErpAuditStatus.REJECT.getStatus(); |
| | | } else if (bpmResult == 4) { |
| | | return ErpAuditStatus.DRAFT.getStatus(); |
| | | } else { |
| | | log.warn("[convertBpmResultToAuditStatus][æªç¥ç BPM 审æ¹ç»æ({})]", bpmResult); |
| | | return ErpAuditStatus.PROCESS.getStatus(); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | : ErpStockRecordBizTypeEnum.SALE_RETURN_CANCEL.getType(); |
| | | saleReturnItems.forEach(saleReturnItem -> { |
| | | BigDecimal count = approve ? saleReturnItem.getCount() : saleReturnItem.getCount().negate(); |
| | | stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO( |
| | | saleReturnItem.getProductId(), saleReturnItem.getWarehouseId(), count, |
| | | bizType, saleReturnItem.getReturnId(), saleReturnItem.getId(), saleReturn.getNo())); |
| | | ErpStockRecordCreateReqBO stockRecordBO = new ErpStockRecordCreateReqBO(); |
| | | stockRecordBO.setProductId(saleReturnItem.getProductId()); |
| | | stockRecordBO.setWarehouseId(saleReturnItem.getWarehouseId()); |
| | | stockRecordBO.setCount(count); |
| | | stockRecordBO.setBizType(bizType); |
| | | stockRecordBO.setBizId(saleReturnItem.getReturnId()); |
| | | stockRecordBO.setBizItemId(saleReturnItem.getId()); |
| | | stockRecordBO.setBizNo(saleReturn.getNo()); |
| | | stockRecordService.createStockRecord(stockRecordBO); |
| | | }); |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.sale.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOrderService; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOrderServiceImpl; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * éå®è®¢å审æ¹çç»æççå¬å¨å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Component |
| | | public class ErpSaleOrderStatusListener extends BpmProcessInstanceStatusEventListener { |
| | | |
| | | @Resource |
| | | private ErpSaleOrderService saleOrderService; |
| | | |
| | | @Override |
| | | public String getProcessDefinitionKey() { |
| | | return ErpSaleOrderServiceImpl.BPM_PROCESS_DEFINITION_KEY; |
| | | } |
| | | |
| | | @Override |
| | | protected void onEvent(BpmProcessInstanceStatusEvent event) { |
| | | saleOrderService.updateSaleOrderAuditStatus(Long.parseLong(event.getBusinessKey()), event.getStatus()); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.sale.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOutService; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOutServiceImpl; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * éå®åºåºå®¡æ¹çç»æççå¬å¨å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Component |
| | | public class ErpSaleOutStatusListener extends BpmProcessInstanceStatusEventListener { |
| | | |
| | | @Resource |
| | | private ErpSaleOutService saleOutService; |
| | | |
| | | @Override |
| | | public String getProcessDefinitionKey() { |
| | | return ErpSaleOutServiceImpl.BPM_PROCESS_DEFINITION_KEY; |
| | | } |
| | | |
| | | @Override |
| | | protected void onEvent(BpmProcessInstanceStatusEvent event) { |
| | | saleOutService.updateSaleOutAuditStatus(Long.parseLong(event.getBusinessKey()), event.getStatus()); |
| | | } |
| | | |
| | | } |
| | |
| | | bizType = count.compareTo(BigDecimal.ZERO) > 0 ? ErpStockRecordBizTypeEnum.CHECK_MORE_IN_CANCEL.getType() |
| | | : ErpStockRecordBizTypeEnum.CHECK_LESS_OUT_CANCEL.getType(); |
| | | } |
| | | stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO( |
| | | stockCheckItem.getProductId(), stockCheckItem.getWarehouseId(), count, |
| | | bizType, stockCheckItem.getCheckId(), stockCheckItem.getId(), stockCheck.getNo())); |
| | | ErpStockRecordCreateReqBO stockRecordBO = new ErpStockRecordCreateReqBO(); |
| | | stockRecordBO.setProductId(stockCheckItem.getProductId()); |
| | | stockRecordBO.setWarehouseId(stockCheckItem.getWarehouseId()); |
| | | stockRecordBO.setCount(count); |
| | | stockRecordBO.setBizType(bizType); |
| | | stockRecordBO.setBizId(stockCheckItem.getCheckId()); |
| | | stockRecordBO.setBizItemId(stockCheckItem.getId()); |
| | | stockRecordBO.setBizNo(stockCheck.getNo()); |
| | | stockRecordService.createStockRecord(stockRecordBO); |
| | | }); |
| | | } |
| | | |
| | |
| | | : ErpStockRecordBizTypeEnum.OTHER_IN_CANCEL.getType(); |
| | | stockInItems.forEach(stockInItem -> { |
| | | BigDecimal count = approve ? stockInItem.getCount() : stockInItem.getCount().negate(); |
| | | stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO( |
| | | stockInItem.getProductId(), stockInItem.getWarehouseId(), count, |
| | | bizType, stockInItem.getInId(), stockInItem.getId(), stockIn.getNo())); |
| | | ErpStockRecordCreateReqBO stockRecordBO = new ErpStockRecordCreateReqBO(); |
| | | stockRecordBO.setProductId(stockInItem.getProductId()); |
| | | stockRecordBO.setWarehouseId(stockInItem.getWarehouseId()); |
| | | stockRecordBO.setCount(count); |
| | | stockRecordBO.setBizType(bizType); |
| | | stockRecordBO.setBizId(stockInItem.getInId()); |
| | | stockRecordBO.setBizItemId(stockInItem.getId()); |
| | | stockRecordBO.setBizNo(stockIn.getNo()); |
| | | stockRecordService.createStockRecord(stockRecordBO); |
| | | }); |
| | | } |
| | | |
| | |
| | | stockMoveItems.forEach(stockMoveItem -> { |
| | | BigDecimal fromCount = approve ? stockMoveItem.getCount().negate() : stockMoveItem.getCount(); |
| | | BigDecimal toCount = approve ? stockMoveItem.getCount() : stockMoveItem.getCount().negate(); |
| | | stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO( |
| | | stockMoveItem.getProductId(), stockMoveItem.getFromWarehouseId(), fromCount, |
| | | fromBizType, stockMoveItem.getMoveId(), stockMoveItem.getId(), stockMove.getNo())); |
| | | stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO( |
| | | stockMoveItem.getProductId(), stockMoveItem.getToWarehouseId(), toCount, |
| | | toBizType, stockMoveItem.getMoveId(), stockMoveItem.getId(), stockMove.getNo())); |
| | | ErpStockRecordCreateReqBO fromStockRecordBO = new ErpStockRecordCreateReqBO(); |
| | | fromStockRecordBO.setProductId(stockMoveItem.getProductId()); |
| | | fromStockRecordBO.setWarehouseId(stockMoveItem.getFromWarehouseId()); |
| | | fromStockRecordBO.setCount(fromCount); |
| | | fromStockRecordBO.setBizType(fromBizType); |
| | | fromStockRecordBO.setBizId(stockMoveItem.getMoveId()); |
| | | fromStockRecordBO.setBizItemId(stockMoveItem.getId()); |
| | | fromStockRecordBO.setBizNo(stockMove.getNo()); |
| | | stockRecordService.createStockRecord(fromStockRecordBO); |
| | | ErpStockRecordCreateReqBO toStockRecordBO = new ErpStockRecordCreateReqBO(); |
| | | toStockRecordBO.setProductId(stockMoveItem.getProductId()); |
| | | toStockRecordBO.setWarehouseId(stockMoveItem.getToWarehouseId()); |
| | | toStockRecordBO.setCount(toCount); |
| | | toStockRecordBO.setBizType(toBizType); |
| | | toStockRecordBO.setBizId(stockMoveItem.getMoveId()); |
| | | toStockRecordBO.setBizItemId(stockMoveItem.getId()); |
| | | toStockRecordBO.setBizNo(stockMove.getNo()); |
| | | stockRecordService.createStockRecord(toStockRecordBO); |
| | | }); |
| | | } |
| | | |
| | |
| | | : ErpStockRecordBizTypeEnum.OTHER_OUT_CANCEL.getType(); |
| | | stockOutItems.forEach(stockOutItem -> { |
| | | BigDecimal count = approve ? stockOutItem.getCount().negate() : stockOutItem.getCount(); |
| | | stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO( |
| | | stockOutItem.getProductId(), stockOutItem.getWarehouseId(), count, |
| | | bizType, stockOutItem.getOutId(), stockOutItem.getId(), stockOut.getNo())); |
| | | ErpStockRecordCreateReqBO stockRecordBO = new ErpStockRecordCreateReqBO(); |
| | | stockRecordBO.setProductId(stockOutItem.getProductId()); |
| | | stockRecordBO.setWarehouseId(stockOutItem.getWarehouseId()); |
| | | stockRecordBO.setCount(count); |
| | | stockRecordBO.setBizType(bizType); |
| | | stockRecordBO.setBizId(stockOutItem.getOutId()); |
| | | stockRecordBO.setBizItemId(stockOutItem.getId()); |
| | | stockRecordBO.setBizNo(stockOut.getNo()); |
| | | stockRecordService.createStockRecord(stockRecordBO); |
| | | }); |
| | | } |
| | | |
| | |
| | | package cn.iocoder.yudao.module.erp.service.stock; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.record.ErpStockRecordPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockRecordDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockRecordMapper; |
| | | import cn.iocoder.yudao.module.erp.service.stock.bo.ErpStockRecordCreateReqBO; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemSkuApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemSkuRespDTO; |
| | | import cn.iocoder.yudao.module.wms.api.inventory.WmsInventoryApi; |
| | | import cn.iocoder.yudao.module.wms.api.inventory.dto.WmsReceiptReqDTO; |
| | | import cn.iocoder.yudao.module.wms.api.inventory.dto.WmsShipmentReqDTO; |
| | | import cn.iocoder.yudao.module.wms.enums.inventory.WmsInventoryBizTypeEnum; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ERP 产ååºåæç» Service å®ç°ç±» |
| | | * |
| | | * æ¹é 说æï¼åºååæ´è°ç¨ WMS åºå API |
| | | * - å
¥åºæä½è°ç¨ WmsInventoryApi.receipt() |
| | | * - åºåºæä½è°ç¨ WmsInventoryApi.shipment() |
| | | * - productId å¯¹åº MDM itemIdï¼éè¿ SKU API è·åé»è®¤ SKU |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | |
| | | |
| | | @Resource |
| | | private ErpStockService stockService; |
| | | |
| | | @Resource |
| | | private WmsInventoryApi wmsInventoryApi; |
| | | |
| | | @Resource |
| | | private MdmItemSkuApi mdmItemSkuApi; |
| | | |
| | | @Override |
| | | public ErpStockRecordDO getStockRecord(Long id) { |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void createStockRecord(ErpStockRecordCreateReqBO createReqBO) { |
| | | // 1. æ´æ°åºå |
| | | BigDecimal totalCount = stockService.updateStockCountIncrement( |
| | | createReqBO.getProductId(), createReqBO.getWarehouseId(), createReqBO.getCount()); |
| | | // 2. å建åºåæç» |
| | | // 1. è·å产åçé»è®¤ SKU IDï¼ERP productId = MDM itemIdï¼ |
| | | Long skuId = getDefaultSkuId(createReqBO.getProductId()); |
| | | if (skuId == null) { |
| | | // å¦ææ²¡æ SKUï¼ä½¿ç¨åæé»è¾æ´æ°åºå |
| | | BigDecimal totalCount = stockService.updateStockCountIncrement( |
| | | createReqBO.getProductId(), createReqBO.getWarehouseId(), createReqBO.getCount()); |
| | | ErpStockRecordDO stockRecord = BeanUtils.toBean(createReqBO, ErpStockRecordDO.class) |
| | | .setTotalCount(totalCount); |
| | | stockRecordMapper.insert(stockRecord); |
| | | return; |
| | | } |
| | | |
| | | // 2. æ ¹æ® count æ£è´å¤æå
¥åºè¿æ¯åºåº |
| | | BigDecimal count = createReqBO.getCount(); |
| | | if (count.compareTo(BigDecimal.ZERO) > 0) { |
| | | // å
¥åºæä½ |
| | | WmsReceiptReqDTO receiptReq = buildReceiptReqDTO(createReqBO, skuId); |
| | | wmsInventoryApi.receipt(receiptReq); |
| | | } else if (count.compareTo(BigDecimal.ZERO) < 0) { |
| | | // åºåºæä½ï¼æ°éè½¬ä¸ºæ£æ°ï¼ |
| | | WmsShipmentReqDTO shipmentReq = buildShipmentReqDTO(createReqBO, skuId); |
| | | wmsInventoryApi.shipment(shipmentReq); |
| | | } |
| | | |
| | | // 3. å建åºåæç»ï¼è®°å½æä½ï¼ |
| | | BigDecimal currentStock = wmsInventoryApi.getAvailableQuantity(skuId, createReqBO.getWarehouseId()).getCheckedData(); |
| | | ErpStockRecordDO stockRecord = BeanUtils.toBean(createReqBO, ErpStockRecordDO.class) |
| | | .setTotalCount(totalCount); |
| | | .setTotalCount(currentStock != null ? currentStock : BigDecimal.ZERO); |
| | | stockRecordMapper.insert(stockRecord); |
| | | } |
| | | |
| | | /** |
| | | * è·å产åçé»è®¤ SKU ID |
| | | */ |
| | | private Long getDefaultSkuId(Long productId) { |
| | | if (productId == null) { |
| | | return null; |
| | | } |
| | | List<MdmItemSkuRespDTO> skuList = mdmItemSkuApi.getItemSkuListByItemId(productId).getCheckedData(); |
| | | if (CollUtil.isEmpty(skuList)) { |
| | | return null; |
| | | } |
| | | return skuList.get(0).getId(); |
| | | } |
| | | |
| | | /** |
| | | * æå»ºå
¥åºè¯·æ± |
| | | */ |
| | | private WmsReceiptReqDTO buildReceiptReqDTO(ErpStockRecordCreateReqBO createReqBO, Long skuId) { |
| | | WmsReceiptReqDTO receiptReq = new WmsReceiptReqDTO(); |
| | | receiptReq.setBizType(convertBizType(createReqBO.getBizType())); |
| | | receiptReq.setBizId(createReqBO.getBizId()); |
| | | receiptReq.setBizNo(createReqBO.getBizNo()); |
| | | receiptReq.setWarehouseId(createReqBO.getWarehouseId()); |
| | | receiptReq.setRemark(createReqBO.getRemark()); |
| | | |
| | | WmsReceiptReqDTO.Item item = new WmsReceiptReqDTO.Item(); |
| | | item.setSkuId(skuId); |
| | | item.setQuantity(createReqBO.getCount()); |
| | | receiptReq.setItems(List.of(item)); |
| | | return receiptReq; |
| | | } |
| | | |
| | | /** |
| | | * æå»ºåºåºè¯·æ± |
| | | */ |
| | | private WmsShipmentReqDTO buildShipmentReqDTO(ErpStockRecordCreateReqBO createReqBO, Long skuId) { |
| | | WmsShipmentReqDTO shipmentReq = new WmsShipmentReqDTO(); |
| | | shipmentReq.setBizType(convertBizType(createReqBO.getBizType())); |
| | | shipmentReq.setBizId(createReqBO.getBizId()); |
| | | shipmentReq.setBizNo(createReqBO.getBizNo()); |
| | | shipmentReq.setWarehouseId(createReqBO.getWarehouseId()); |
| | | shipmentReq.setRemark(createReqBO.getRemark()); |
| | | |
| | | WmsShipmentReqDTO.Item item = new WmsShipmentReqDTO.Item(); |
| | | item.setSkuId(skuId); |
| | | item.setQuantity(createReqBO.getCount().negate()); // åºåºæ°éä¸ºæ£æ° |
| | | shipmentReq.setItems(List.of(item)); |
| | | return shipmentReq; |
| | | } |
| | | |
| | | /** |
| | | * 转æ¢ä¸å¡ç±»åï¼ERP ä¸å¡ç±»åæ å°å° WMS ä¸å¡ç±»åï¼ |
| | | */ |
| | | private Integer convertBizType(Integer erpBizType) { |
| | | // ERP ä¸å¡ç±»åæ å°å° WMS ä¸å¡ç±»å |
| | | // å¯ä»¥æ ¹æ®å®é
ä¸å¡éæ±æ©å±æ å°å
³ç³» |
| | | if (erpBizType == null) { |
| | | return WmsInventoryBizTypeEnum.OTHER.getType(); |
| | | } |
| | | // é»è®¤è¿å OTHER ç±»åï¼åç»å¯æ ¹æ® ERP ä¸å¡ç±»åæä¸¾æ©å± |
| | | return WmsInventoryBizTypeEnum.OTHER.getType(); |
| | | } |
| | | |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.erp.service.stock; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.stock.ErpStockPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockMapper; |
| | | import cn.iocoder.yudao.module.erp.service.product.ErpProductService; |
| | | import cn.iocoder.yudao.module.erp.service.stock.ErpWarehouseService; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemSkuApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemSkuRespDTO; |
| | | import cn.iocoder.yudao.module.wms.api.inventory.WmsInventoryApi; |
| | | import cn.iocoder.yudao.module.wms.api.inventory.dto.WmsInventoryQueryReqDTO; |
| | | import cn.iocoder.yudao.module.wms.api.inventory.dto.WmsInventoryRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_COUNT_NEGATIVE; |
| | | import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_COUNT_NEGATIVE2; |
| | | import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * ERP 产ååºå Service å®ç°ç±» |
| | | * |
| | | * æ¹é 说æï¼ERP åºåè°ç¨ WMS åºå API |
| | | * - productId å¯¹åº MDM itemId |
| | | * - éè¿ MDM SKU API è·åç©æçé»è®¤ SKU |
| | | * - åºåæä½è°ç¨ WMS Inventory API |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | |
| | | |
| | | /** |
| | | * å
许åºåä¸ºè´æ° |
| | | * |
| | | * TODO èè¿ï¼åç»åæ db é
ç½® |
| | | */ |
| | | private static final Boolean NEGATIVE_STOCK_COUNT_ENABLE = false; |
| | | |
| | | @Resource |
| | | private ErpProductService productService; |
| | | |
| | | @Resource |
| | | private ErpWarehouseService warehouseService; |
| | | |
| | | @Resource |
| | | private ErpStockMapper stockMapper; |
| | | |
| | | @Resource |
| | | private WmsInventoryApi wmsInventoryApi; |
| | | |
| | | @Resource |
| | | private MdmItemSkuApi mdmItemSkuApi; |
| | | |
| | | @Override |
| | | public ErpStockDO getStock(Long id) { |
| | |
| | | |
| | | @Override |
| | | public ErpStockDO getStock(Long productId, Long warehouseId) { |
| | | return stockMapper.selectByProductIdAndWarehouseId(productId, warehouseId); |
| | | // éè¿ MDM è·å产åçé»è®¤ SKUï¼ç¶åæ¥è¯¢ WMS åºå |
| | | Long skuId = getDefaultSkuId(productId); |
| | | if (skuId == null) { |
| | | return null; |
| | | } |
| | | |
| | | // æ¥è¯¢ WMS åºå |
| | | BigDecimal quantity = wmsInventoryApi.getAvailableQuantity(skuId, warehouseId).getCheckedData(); |
| | | if (quantity == null || quantity.compareTo(BigDecimal.ZERO) == 0) { |
| | | return null; |
| | | } |
| | | |
| | | // 转æ¢ä¸º ERP Stock DO |
| | | ErpStockDO stock = new ErpStockDO(); |
| | | stock.setProductId(productId); |
| | | stock.setWarehouseId(warehouseId); |
| | | stock.setCount(quantity); |
| | | return stock; |
| | | } |
| | | |
| | | @Override |
| | | public BigDecimal getStockCount(Long productId) { |
| | | BigDecimal count = stockMapper.selectSumByProductId(productId); |
| | | return count != null ? count : BigDecimal.ZERO; |
| | | // éè¿ MDM è·å产åçé»è®¤ SKUï¼ç¶åæ¥è¯¢ WMS åºåæ»é |
| | | Long skuId = getDefaultSkuId(productId); |
| | | if (skuId == null) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | |
| | | // æ¥è¯¢è¯¥ SKU 卿æä»åºçåºå |
| | | WmsInventoryQueryReqDTO queryReq = new WmsInventoryQueryReqDTO(); |
| | | queryReq.setSkuIds(List.of(skuId)); |
| | | queryReq.setOnlyPositive(true); |
| | | |
| | | List<WmsInventoryRespDTO> inventories = wmsInventoryApi.getInventoryList(queryReq).getCheckedData(); |
| | | if (CollUtil.isEmpty(inventories)) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | |
| | | return inventories.stream() |
| | | .map(WmsInventoryRespDTO::getQuantity) |
| | | .filter(q -> q != null) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<ErpStockDO> getStockPage(ErpStockPageReqVO pageReqVO) { |
| | | // ææ¶ä¿çåé»è¾ï¼åç»å¯æ¹ä¸ºè°ç¨ WMS å页 API |
| | | return stockMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public BigDecimal updateStockCountIncrement(Long productId, Long warehouseId, BigDecimal count) { |
| | | // 1.1 æ¥è¯¢å½ååºå |
| | | ErpStockDO stock = stockMapper.selectByProductIdAndWarehouseId(productId, warehouseId); |
| | | if (stock == null) { |
| | | stock = new ErpStockDO().setProductId(productId).setWarehouseId(warehouseId).setCount(BigDecimal.ZERO); |
| | | stockMapper.insert(stock); |
| | | } |
| | | // 1.2 æ ¡éªåºåæ¯å¦å
è¶³ |
| | | if (!NEGATIVE_STOCK_COUNT_ENABLE && stock.getCount().add(count).compareTo(BigDecimal.ZERO) < 0) { |
| | | throw exception(STOCK_COUNT_NEGATIVE, productService.getProduct(productId).getName(), |
| | | warehouseService.getWarehouse(warehouseId).getName(), stock.getCount(), count); |
| | | } |
| | | |
| | | // 2. åºååæ´ |
| | | int updateCount = stockMapper.updateCountIncrement(stock.getId(), count, NEGATIVE_STOCK_COUNT_ENABLE); |
| | | if (updateCount == 0) { |
| | | // æ¤æ¶ä¸å¥½å»æ¥è¯¢ææ°åºåï¼æä»¥ç´æ¥æåºè¯¥æç¤ºï¼ä¸æä¾å
·ä½åºåæ°å |
| | | throw exception(STOCK_COUNT_NEGATIVE2, productService.getProduct(productId).getName(), |
| | | // éè¿ MDM è·å产åçé»è®¤ SKU |
| | | Long skuId = getDefaultSkuId(productId); |
| | | if (skuId == null) { |
| | | throw exception(STOCK_COUNT_NEGATIVE2, |
| | | productService.getProduct(productId).getName(), |
| | | warehouseService.getWarehouse(warehouseId).getName()); |
| | | } |
| | | |
| | | // 3. è¿åææ°åºå |
| | | // æ¥è¯¢å½ååºå |
| | | BigDecimal currentStock = wmsInventoryApi.getAvailableQuantity(skuId, warehouseId).getCheckedData(); |
| | | if (currentStock == null) { |
| | | currentStock = BigDecimal.ZERO; |
| | | } |
| | | |
| | | // æ ¡éªåºåæ¯å¦å
è¶³ï¼åºåºæ¶ï¼ |
| | | if (!NEGATIVE_STOCK_COUNT_ENABLE && count.compareTo(BigDecimal.ZERO) < 0) { |
| | | BigDecimal afterStock = currentStock.add(count); |
| | | if (afterStock.compareTo(BigDecimal.ZERO) < 0) { |
| | | throw exception(STOCK_COUNT_NEGATIVE, |
| | | productService.getProduct(productId).getName(), |
| | | warehouseService.getWarehouse(warehouseId).getName(), |
| | | currentStock, count.abs()); |
| | | } |
| | | } |
| | | |
| | | // TODO: è°ç¨ WMS åºååæ´ APIï¼éè¦ WMS æä¾ increment/decrement æ¹æ³ï¼ |
| | | // ææ¶ä¿çåé»è¾ï¼ä½¿ç¨æ¬å°åºå表 |
| | | ErpStockDO stock = stockMapper.selectByProductIdAndWarehouseId(productId, warehouseId); |
| | | if (stock == null) { |
| | | stock = new ErpStockDO() |
| | | .setProductId(productId) |
| | | .setWarehouseId(warehouseId) |
| | | .setCount(BigDecimal.ZERO); |
| | | stockMapper.insert(stock); |
| | | } |
| | | |
| | | int updateCount = stockMapper.updateCountIncrement(stock.getId(), count, NEGATIVE_STOCK_COUNT_ENABLE); |
| | | if (updateCount == 0) { |
| | | throw exception(STOCK_COUNT_NEGATIVE2, |
| | | productService.getProduct(productId).getName(), |
| | | warehouseService.getWarehouse(warehouseId).getName()); |
| | | } |
| | | |
| | | return stock.getCount().add(count); |
| | | } |
| | | |
| | | /** |
| | | * è·å产åçé»è®¤ SKU ID |
| | | * ERP productId å¯¹åº MDM itemIdï¼é»è®¤ä½¿ç¨ç¬¬ä¸ä¸ª SKU |
| | | */ |
| | | private Long getDefaultSkuId(Long productId) { |
| | | if (productId == null) { |
| | | return null; |
| | | } |
| | | List<MdmItemSkuRespDTO> skuList = mdmItemSkuApi.getItemSkuListByItemId(productId).getCheckedData(); |
| | | if (CollUtil.isEmpty(skuList)) { |
| | | return null; |
| | | } |
| | | return skuList.get(0).getId(); |
| | | } |
| | | |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.erp.service.stock.bo; |
| | | |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | | |
| | |
| | | */ |
| | | @Data |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class ErpStockRecordCreateReqBO { |
| | | |
| | | /** |
| | |
| | | @NotNull(message = "ä¸å¡åå·ä¸è½ä¸ºç©º") |
| | | private String bizNo; |
| | | |
| | | } |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao</artifactId> |
| | | <version>${revision}</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <artifactId>yudao-module-mdm-api</artifactId> |
| | | <packaging>jar</packaging> |
| | | |
| | | <name>${project.artifactId}</name> |
| | | <description> |
| | | mdm 模åä¸ï¼ä¸»æ°æ®ç®¡çç API æ¥å£å®ä¹ï¼ä¾å
¶ä»æ¨¡åå¼ç¨ |
| | | </description> |
| | | |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-common</artifactId> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | </project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao</artifactId> |
| | | <version>${revision}</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <artifactId>yudao-module-mdm</artifactId> |
| | | <packaging>jar</packaging> |
| | | |
| | | <name>${project.artifactId}</name> |
| | | <description> |
| | | mdm 模åä¸ï¼ä¸»æ°æ®ç®¡çï¼Master Data Managementï¼ã |
| | | ä¾å¦è¯´ï¼ç©æãåç±»ãåä½ãåçãä»åºçä¸»æ°æ®ç®¡ç |
| | | </description> |
| | | |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-system</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- Web ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-web</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-security</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- DB ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-mybatis</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-redis</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- å·¥å
·ç±»ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-excel</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Test æµè¯ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-test</artifactId> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | |
| | | </project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.brand; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.mdm.api.brand.dto.MdmBrandRespDTO; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MDM åç API æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmBrandApi { |
| | | |
| | | String PREFIX = "/rpc-api/mdm/brand"; |
| | | |
| | | /** |
| | | * è·ååç |
| | | * |
| | | * @param id åçç¼å· |
| | | * @return åç |
| | | */ |
| | | CommonResult<MdmBrandRespDTO> getBrand(Long id); |
| | | |
| | | /** |
| | | * è·ååçå表 |
| | | * |
| | | * @param ids åçç¼å·å表 |
| | | * @return åçå表 |
| | | */ |
| | | CommonResult<List<MdmBrandRespDTO>> getBrandList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * æ ¡éªåçåå¨ |
| | | * |
| | | * @param id åçç¼å· |
| | | * @return åç |
| | | */ |
| | | CommonResult<MdmBrandRespDTO> validateBrandExists(Long id); |
| | | |
| | | /** |
| | | * æ ¹æ®ç¼ç è·ååç |
| | | * |
| | | * @param code åçç¼ç |
| | | * @return åç |
| | | */ |
| | | CommonResult<MdmBrandRespDTO> getBrandByCode(String code); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.brand; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.brand.dto.MdmBrandRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.brand.MdmBrandDO; |
| | | import cn.iocoder.yudao.module.mdm.service.brand.MdmBrandService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * MDM åç API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RestController |
| | | @RequestMapping(MdmBrandApi.PREFIX) |
| | | @Validated |
| | | public class MdmBrandApiImpl implements MdmBrandApi { |
| | | |
| | | @Resource |
| | | private MdmBrandService brandService; |
| | | |
| | | @Override |
| | | public CommonResult<MdmBrandRespDTO> getBrand(Long id) { |
| | | MdmBrandDO brand = brandService.getBrand(id); |
| | | return success(BeanUtils.toBean(brand, MdmBrandRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<MdmBrandRespDTO>> getBrandList(Collection<Long> ids) { |
| | | List<MdmBrandDO> list = brandService.getBrandList(ids); |
| | | return success(BeanUtils.toBean(list, MdmBrandRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmBrandRespDTO> validateBrandExists(Long id) { |
| | | MdmBrandDO brand = brandService.validateBrandExists(id); |
| | | return success(BeanUtils.toBean(brand, MdmBrandRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmBrandRespDTO> getBrandByCode(String code) { |
| | | MdmBrandDO brand = brandService.getBrandByCode(code); |
| | | return success(BeanUtils.toBean(brand, MdmBrandRespDTO.class)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.brand.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | @Schema(description = "RPC æå¡ - MDM åç Response DTO") |
| | | @Data |
| | | public class MdmBrandRespDTO { |
| | | |
| | | @Schema(description = "åçç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åçç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "BRAND001") |
| | | private String code; |
| | | |
| | | @Schema(description = "åçåç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "åçA") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.category; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.mdm.api.category.dto.MdmItemCategoryRespDTO; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MDM ç©æåç±» API æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmItemCategoryApi { |
| | | |
| | | String PREFIX = "/rpc-api/mdm/category"; |
| | | |
| | | /** |
| | | * è·åç©æåç±» |
| | | * |
| | | * @param id åç±»ç¼å· |
| | | * @return ç©æåç±» |
| | | */ |
| | | CommonResult<MdmItemCategoryRespDTO> getItemCategory(Long id); |
| | | |
| | | /** |
| | | * è·åç©æåç±»å表 |
| | | * |
| | | * @param ids åç±»ç¼å·å表 |
| | | * @return ç©æåç±»å表 |
| | | */ |
| | | CommonResult<List<MdmItemCategoryRespDTO>> getItemCategoryList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * æ ¡éªç©æåç±»åå¨ |
| | | * |
| | | * @param id åç±»ç¼å· |
| | | * @return ç©æåç±» |
| | | */ |
| | | CommonResult<MdmItemCategoryRespDTO> validateItemCategoryExists(Long id); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.category; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.category.dto.MdmItemCategoryRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO; |
| | | import cn.iocoder.yudao.module.mdm.service.category.MdmItemCategoryService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * MDM ç©æåç±» API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RestController |
| | | @RequestMapping(MdmItemCategoryApi.PREFIX) |
| | | @Validated |
| | | public class MdmItemCategoryApiImpl implements MdmItemCategoryApi { |
| | | |
| | | @Resource |
| | | private MdmItemCategoryService itemCategoryService; |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemCategoryRespDTO> getItemCategory(Long id) { |
| | | MdmItemCategoryDO itemCategory = itemCategoryService.getItemCategory(id); |
| | | return success(BeanUtils.toBean(itemCategory, MdmItemCategoryRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<MdmItemCategoryRespDTO>> getItemCategoryList(Collection<Long> ids) { |
| | | List<MdmItemCategoryDO> list = itemCategoryService.getItemCategoryList(ids); |
| | | return success(BeanUtils.toBean(list, MdmItemCategoryRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemCategoryRespDTO> validateItemCategoryExists(Long id) { |
| | | MdmItemCategoryDO itemCategory = itemCategoryService.validateItemCategoryExists(id); |
| | | return success(BeanUtils.toBean(itemCategory, MdmItemCategoryRespDTO.class)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.category.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | @Schema(description = "RPC æå¡ - MDM ç©æåç±» Response DTO") |
| | | @Data |
| | | public class MdmItemCategoryRespDTO { |
| | | |
| | | @Schema(description = "åç±»ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç¶åç±»ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Long parentId; |
| | | |
| | | @Schema(description = "åç±»ç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "CAT001") |
| | | private String code; |
| | | |
| | | @Schema(description = "åç±»åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "äºéé
ä»¶") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç©æç±»å", example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemCreateReqDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemUpdateReqDTO; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| | | |
| | | /** |
| | | * MDM ç©æ API æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmItemApi { |
| | | |
| | | String PREFIX = "/rpc-api/mdm/item"; |
| | | |
| | | /** |
| | | * åå»ºç©æ |
| | | * |
| | | * @param createReqDTO åå»ºä¿¡æ¯ |
| | | * @return ç©æç¼å· |
| | | */ |
| | | CommonResult<Long> createItem(MdmItemCreateReqDTO createReqDTO); |
| | | |
| | | /** |
| | | * æ´æ°ç©æ |
| | | * |
| | | * @param updateReqDTO æ´æ°ä¿¡æ¯ |
| | | * @return æ¯å¦æå |
| | | */ |
| | | CommonResult<Boolean> updateItem(MdmItemUpdateReqDTO updateReqDTO); |
| | | |
| | | /** |
| | | * è·åç©æ |
| | | * |
| | | * @param id ç©æç¼å· |
| | | * @return ç©æ |
| | | */ |
| | | CommonResult<MdmItemRespDTO> getItem(Long id); |
| | | |
| | | /** |
| | | * è·åç©æå表 |
| | | * |
| | | * @param ids ç©æç¼å·å表 |
| | | * @return ç©æå表 |
| | | */ |
| | | CommonResult<List<MdmItemRespDTO>> getItemList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·åç©æ Map |
| | | * |
| | | * @param ids ç©æç¼å·å表 |
| | | * @return ç©æ Map |
| | | */ |
| | | default Map<Long, MdmItemRespDTO> getItemMap(Collection<Long> ids) { |
| | | List<MdmItemRespDTO> list = getItemList(ids).getCheckedData(); |
| | | return convertMap(list, MdmItemRespDTO::getId); |
| | | } |
| | | |
| | | /** |
| | | * è·åç©æå页 |
| | | * |
| | | * @param itemType ç©æç±»å |
| | | * @param status ç¶æ |
| | | * @param pageNo 页ç |
| | | * @param pageSize æ¯é¡µæ°é |
| | | * @return ç©æå页 |
| | | */ |
| | | CommonResult<PageResult<MdmItemRespDTO>> getItemPage(Integer itemType, Integer status, Integer pageNo, Integer pageSize); |
| | | |
| | | /** |
| | | * æ ¹æ®ç¶æè·åç©æå表 |
| | | * |
| | | * @param status ç¶æ |
| | | * @return ç©æå表 |
| | | */ |
| | | CommonResult<List<MdmItemRespDTO>> getItemListByStatus(Integer status); |
| | | |
| | | /** |
| | | * æ ¡éªç©æåå¨ |
| | | * |
| | | * @param id ç©æç¼å· |
| | | * @return ç©æ |
| | | */ |
| | | CommonResult<MdmItemRespDTO> validateItemExists(Long id); |
| | | |
| | | /** |
| | | * æ ¡éªç©æåå¨ä¸å¯ç¨ |
| | | * |
| | | * @param id ç©æç¼å· |
| | | * @return ç©æ |
| | | */ |
| | | CommonResult<MdmItemRespDTO> validateItemExistsAndEnable(Long id); |
| | | |
| | | /** |
| | | * æ ¹æ®ç¼ç è·åç©æ |
| | | * |
| | | * @param code ç©æç¼ç |
| | | * @return ç©æ |
| | | */ |
| | | CommonResult<MdmItemRespDTO> getItemByCode(String code); |
| | | |
| | | /** |
| | | * æ ¹æ®æ¡ç è·åç©æ |
| | | * |
| | | * @param barCode ç©ææ¡ç |
| | | * @return ç©æ |
| | | */ |
| | | CommonResult<MdmItemRespDTO> getItemByBarCode(String barCode); |
| | | |
| | | /** |
| | | * æ ¹æ®åç±»ç¼å·ç»è®¡ç©ææ°é |
| | | * |
| | | * @param categoryId åç±»ç¼å· |
| | | * @return ç©ææ°é |
| | | */ |
| | | CommonResult<Long> getItemCountByCategoryId(Long categoryId); |
| | | |
| | | /** |
| | | * æ ¹æ®åä½ç¼å·ç»è®¡ç©ææ°é |
| | | * |
| | | * @param unitMeasureId åä½ç¼å· |
| | | * @return ç©ææ°é |
| | | */ |
| | | CommonResult<Long> getItemCountByUnitMeasureId(Long unitMeasureId); |
| | | |
| | | /** |
| | | * æ´æ°ç©æç¶æ |
| | | * |
| | | * @param id ç©æç¼å· |
| | | * @param status ç¶æ |
| | | * @return æ¯å¦æå |
| | | */ |
| | | CommonResult<Boolean> updateItemStatus(Long id, Integer status); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemCreateReqDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemUpdateReqDTO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemMapper; |
| | | import cn.iocoder.yudao.module.mdm.service.item.MdmItemService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * MDM ç©æ API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RestController |
| | | @RequestMapping(MdmItemApi.PREFIX) |
| | | @Validated |
| | | public class MdmItemApiImpl implements MdmItemApi { |
| | | |
| | | @Resource |
| | | private MdmItemService itemService; |
| | | |
| | | @Resource |
| | | private MdmItemMapper itemMapper; |
| | | |
| | | @Override |
| | | public CommonResult<Long> createItem(MdmItemCreateReqDTO createReqDTO) { |
| | | MdmItemSaveReqVO saveReqVO = BeanUtils.toBean(createReqDTO, MdmItemSaveReqVO.class); |
| | | // 设置é»è®¤ç¶æ |
| | | if (saveReqVO.getStatus() == null) { |
| | | saveReqVO.setStatus(0); |
| | | } |
| | | return success(itemService.createItem(saveReqVO)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Boolean> updateItem(MdmItemUpdateReqDTO updateReqDTO) { |
| | | MdmItemSaveReqVO saveReqVO = BeanUtils.toBean(updateReqDTO, MdmItemSaveReqVO.class); |
| | | itemService.updateItem(saveReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemRespDTO> getItem(Long id) { |
| | | MdmItemDO item = itemService.getItem(id); |
| | | return success(BeanUtils.toBean(item, MdmItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<MdmItemRespDTO>> getItemList(Collection<Long> ids) { |
| | | List<MdmItemDO> list = itemService.getItemList(ids); |
| | | return success(BeanUtils.toBean(list, MdmItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<PageResult<MdmItemRespDTO>> getItemPage(Integer itemType, Integer status, Integer pageNo, Integer pageSize) { |
| | | MdmItemPageReqVO pageReqVO = new MdmItemPageReqVO(); |
| | | pageReqVO.setItemType(itemType); |
| | | pageReqVO.setStatus(status); |
| | | pageReqVO.setPageNo(pageNo); |
| | | pageReqVO.setPageSize(pageSize); |
| | | PageResult<MdmItemDO> pageResult = itemService.getItemPage(pageReqVO); |
| | | return success(BeanUtils.toBean(pageResult, MdmItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<MdmItemRespDTO>> getItemListByStatus(Integer status) { |
| | | MdmItemPageReqVO pageReqVO = new MdmItemPageReqVO(); |
| | | pageReqVO.setStatus(status); |
| | | pageReqVO.setPageNo(1); |
| | | pageReqVO.setPageSize(Integer.MAX_VALUE); |
| | | PageResult<MdmItemDO> pageResult = itemService.getItemPage(pageReqVO); |
| | | return success(BeanUtils.toBean(pageResult.getList(), MdmItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemRespDTO> validateItemExists(Long id) { |
| | | MdmItemDO item = itemService.validateItemExists(id); |
| | | return success(BeanUtils.toBean(item, MdmItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemRespDTO> validateItemExistsAndEnable(Long id) { |
| | | MdmItemDO item = itemService.validateItemExistsAndEnable(id); |
| | | return success(BeanUtils.toBean(item, MdmItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemRespDTO> getItemByCode(String code) { |
| | | MdmItemDO item = itemService.getItemByCode(code); |
| | | return success(BeanUtils.toBean(item, MdmItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemRespDTO> getItemByBarCode(String barCode) { |
| | | MdmItemDO item = itemMapper.selectByBarCode(barCode); |
| | | return success(BeanUtils.toBean(item, MdmItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Long> getItemCountByCategoryId(Long categoryId) { |
| | | return success(itemService.getItemCountByCategoryId(categoryId)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Long> getItemCountByUnitMeasureId(Long unitMeasureId) { |
| | | return success(itemService.getItemCountByUnitMeasureId(unitMeasureId)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Boolean> updateItemStatus(Long id, Integer status) { |
| | | itemService.updateItemStatus(id, status); |
| | | return success(true); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemSkuRespDTO; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| | | |
| | | /** |
| | | * MDM ç©æ SKU API æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmItemSkuApi { |
| | | |
| | | String PREFIX = "/rpc-api/mdm/item-sku"; |
| | | |
| | | /** |
| | | * è·å SKU |
| | | * |
| | | * @param id SKU ç¼å· |
| | | * @return SKU |
| | | */ |
| | | CommonResult<MdmItemSkuRespDTO> getItemSku(Long id); |
| | | |
| | | /** |
| | | * è·å SKU å表 |
| | | * |
| | | * @param ids SKU ç¼å·å表 |
| | | * @return SKU å表 |
| | | */ |
| | | CommonResult<List<MdmItemSkuRespDTO>> getItemSkuList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·å SKU Map |
| | | * |
| | | * @param ids SKU ç¼å·å表 |
| | | * @return SKU Map |
| | | */ |
| | | default Map<Long, MdmItemSkuRespDTO> getItemSkuMap(Collection<Long> ids) { |
| | | List<MdmItemSkuRespDTO> list = getItemSkuList(ids).getCheckedData(); |
| | | return convertMap(list, MdmItemSkuRespDTO::getId); |
| | | } |
| | | |
| | | /** |
| | | * è·åç©æç SKU å表 |
| | | * |
| | | * @param itemId ç©æç¼å· |
| | | * @return SKU å表 |
| | | */ |
| | | CommonResult<List<MdmItemSkuRespDTO>> getItemSkuListByItemId(Long itemId); |
| | | |
| | | /** |
| | | * æ ¡éª SKU åå¨ |
| | | * |
| | | * @param id SKU ç¼å· |
| | | * @return SKU |
| | | */ |
| | | CommonResult<MdmItemSkuRespDTO> validateItemSkuExists(Long id); |
| | | |
| | | /** |
| | | * æ ¡éª SKU åå¨ä¸å¯ç¨ |
| | | * |
| | | * @param id SKU ç¼å· |
| | | * @return SKU |
| | | */ |
| | | CommonResult<MdmItemSkuRespDTO> validateItemSkuExistsAndEnable(Long id); |
| | | |
| | | /** |
| | | * æ ¹æ®ç¼ç è·å SKU |
| | | * |
| | | * @param code SKU ç¼ç |
| | | * @return SKU |
| | | */ |
| | | CommonResult<MdmItemSkuRespDTO> getItemSkuByCode(String code); |
| | | |
| | | /** |
| | | * æ ¹æ®æ¡ç è·å SKU |
| | | * |
| | | * @param barCode SKU æ¡ç |
| | | * @return SKU |
| | | */ |
| | | CommonResult<MdmItemSkuRespDTO> getItemSkuByBarCode(String barCode); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemSkuRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemSkuDO; |
| | | import cn.iocoder.yudao.module.mdm.service.item.MdmItemSkuService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * MDM ç©æ SKU API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RestController |
| | | @RequestMapping(MdmItemSkuApi.PREFIX) |
| | | @Validated |
| | | public class MdmItemSkuApiImpl implements MdmItemSkuApi { |
| | | |
| | | @Resource |
| | | private MdmItemSkuService itemSkuService; |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemSkuRespDTO> getItemSku(Long id) { |
| | | MdmItemSkuDO sku = itemSkuService.getItemSku(id); |
| | | return success(BeanUtils.toBean(sku, MdmItemSkuRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<MdmItemSkuRespDTO>> getItemSkuList(Collection<Long> ids) { |
| | | List<MdmItemSkuDO> list = itemSkuService.getItemSkuList(ids); |
| | | return success(BeanUtils.toBean(list, MdmItemSkuRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<MdmItemSkuRespDTO>> getItemSkuListByItemId(Long itemId) { |
| | | List<MdmItemSkuDO> list = itemSkuService.getItemSkuListByItemId(itemId); |
| | | return success(BeanUtils.toBean(list, MdmItemSkuRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemSkuRespDTO> validateItemSkuExists(Long id) { |
| | | MdmItemSkuDO sku = itemSkuService.validateItemSkuExists(id); |
| | | return success(BeanUtils.toBean(sku, MdmItemSkuRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemSkuRespDTO> validateItemSkuExistsAndEnable(Long id) { |
| | | MdmItemSkuDO sku = itemSkuService.validateItemSkuExistsAndEnable(id); |
| | | return success(BeanUtils.toBean(sku, MdmItemSkuRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemSkuRespDTO> getItemSkuByCode(String code) { |
| | | MdmItemSkuDO sku = itemSkuService.getItemSkuByCode(code); |
| | | return success(BeanUtils.toBean(sku, MdmItemSkuRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemSkuRespDTO> getItemSkuByBarCode(String barCode) { |
| | | MdmItemSkuDO sku = itemSkuService.getItemSkuByBarCode(barCode); |
| | | return success(BeanUtils.toBean(sku, MdmItemSkuRespDTO.class)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "RPC æå¡ - MDM ç©æå建 Request DTO") |
| | | @Data |
| | | public class MdmItemCreateReqDTO { |
| | | |
| | | @Schema(description = "ç©æç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "ITEM001") |
| | | private String code; |
| | | |
| | | @Schema(description = "ç©æåç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "èºä¸") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç©ææ¡ç ", example = "12345678") |
| | | private String barCode; |
| | | |
| | | @Schema(description = "è§æ ¼åå·", example = "M8*20") |
| | | private String specification; |
| | | |
| | | @Schema(description = "ç©æåç±»ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long categoryId; |
| | | |
| | | @Schema(description = "计éåä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long unitMeasureId; |
| | | |
| | | @Schema(description = "åçç¼å·", example = "1") |
| | | private Long brandId; |
| | | |
| | | @Schema(description = "ç©æç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "éè´ä»·æ ¼", example = "10.00") |
| | | private BigDecimal purchasePrice; |
| | | |
| | | @Schema(description = "éå®ä»·æ ¼", example = "15.00") |
| | | private BigDecimal salesPrice; |
| | | |
| | | @Schema(description = "ææ¬ä»·æ ¼", example = "8.00") |
| | | private BigDecimal costPrice; |
| | | |
| | | @Schema(description = "å®å
¨åºå", example = "100") |
| | | private BigDecimal safetyStock; |
| | | |
| | | @Schema(description = "ä¿è´¨æå¤©æ°", example = "365") |
| | | private Integer expiryDay; |
| | | |
| | | @Schema(description = "æ¯å¦æ¹æ¬¡ç®¡ç", example = "false") |
| | | private Boolean isBatchManaged; |
| | | |
| | | @Schema(description = "éé(kg)", example = "0.5") |
| | | private BigDecimal weight; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "RPC æå¡ - MDM ç©æ Response DTO") |
| | | @Data |
| | | public class MdmItemRespDTO { |
| | | |
| | | @Schema(description = "ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç©æç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "ITEM001") |
| | | private String code; |
| | | |
| | | @Schema(description = "ç©æåç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "èºä¸") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç©ææ¡ç ", example = "12345678") |
| | | private String barCode; |
| | | |
| | | @Schema(description = "è§æ ¼åå·", example = "M8*20") |
| | | private String specification; |
| | | |
| | | @Schema(description = "ç©æåç±»ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long categoryId; |
| | | |
| | | @Schema(description = "计éåä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long unitMeasureId; |
| | | |
| | | @Schema(description = "åçç¼å·", example = "1") |
| | | private Long brandId; |
| | | |
| | | @Schema(description = "ç©æç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "éè´ä»·æ ¼", example = "10.00") |
| | | private BigDecimal purchasePrice; |
| | | |
| | | @Schema(description = "éå®ä»·æ ¼", example = "15.00") |
| | | private BigDecimal salesPrice; |
| | | |
| | | @Schema(description = "ææ¬ä»·æ ¼", example = "8.00") |
| | | private BigDecimal costPrice; |
| | | |
| | | @Schema(description = "å®å
¨åºå", example = "100") |
| | | private BigDecimal safetyStock; |
| | | |
| | | @Schema(description = "ä¿è´¨æå¤©æ°", example = "365") |
| | | private Integer expiryDay; |
| | | |
| | | @Schema(description = "æ¯å¦æ¹æ¬¡ç®¡ç", example = "false") |
| | | private Boolean isBatchManaged; |
| | | |
| | | @Schema(description = "æ¯å¦é«å¼ç©æ", example = "false") |
| | | private Boolean highValue; |
| | | |
| | | @Schema(description = "éé", example = "0.5") |
| | | private BigDecimal weight; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "RPC æå¡ - MDM ç©æ SKU Response DTO") |
| | | @Data |
| | | public class MdmItemSkuRespDTO { |
| | | |
| | | @Schema(description = "SKU ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long itemId; |
| | | |
| | | @Schema(description = "SKU ç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "SKU001") |
| | | private String code; |
| | | |
| | | @Schema(description = "SKU åç§°", example = "è§æ ¼A") |
| | | private String name; |
| | | |
| | | @Schema(description = "SKU æ¡ç ", example = "12345678") |
| | | private String barCode; |
| | | |
| | | @Schema(description = "é¿åº¦ï¼cmï¼", example = "10") |
| | | private BigDecimal length; |
| | | |
| | | @Schema(description = "宽度ï¼cmï¼", example = "5") |
| | | private BigDecimal width; |
| | | |
| | | @Schema(description = "é«åº¦ï¼cmï¼", example = "2") |
| | | private BigDecimal height; |
| | | |
| | | @Schema(description = "æ¯éï¼kgï¼", example = "0.5") |
| | | private BigDecimal grossWeight; |
| | | |
| | | @Schema(description = "åéï¼kgï¼", example = "0.4") |
| | | private BigDecimal netWeight; |
| | | |
| | | @Schema(description = "ææ¬ä»·", example = "8.00") |
| | | private BigDecimal costPrice; |
| | | |
| | | @Schema(description = "éå®ä»·", example = "15.00") |
| | | private BigDecimal salePrice; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "RPC æå¡ - MDM ç©ææ´æ° Request DTO") |
| | | @Data |
| | | public class MdmItemUpdateReqDTO { |
| | | |
| | | @Schema(description = "ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç©æç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "ITEM001") |
| | | private String code; |
| | | |
| | | @Schema(description = "ç©æåç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "èºä¸") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç©ææ¡ç ", example = "12345678") |
| | | private String barCode; |
| | | |
| | | @Schema(description = "è§æ ¼åå·", example = "M8*20") |
| | | private String specification; |
| | | |
| | | @Schema(description = "ç©æåç±»ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long categoryId; |
| | | |
| | | @Schema(description = "计éåä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long unitMeasureId; |
| | | |
| | | @Schema(description = "åçç¼å·", example = "1") |
| | | private Long brandId; |
| | | |
| | | @Schema(description = "ç©æç±»å", example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "éè´ä»·æ ¼", example = "10.00") |
| | | private BigDecimal purchasePrice; |
| | | |
| | | @Schema(description = "éå®ä»·æ ¼", example = "15.00") |
| | | private BigDecimal salesPrice; |
| | | |
| | | @Schema(description = "ææ¬ä»·æ ¼", example = "8.00") |
| | | private BigDecimal costPrice; |
| | | |
| | | @Schema(description = "å®å
¨åºå", example = "100") |
| | | private BigDecimal safetyStock; |
| | | |
| | | @Schema(description = "ä¿è´¨æå¤©æ°", example = "365") |
| | | private Integer expiryDay; |
| | | |
| | | @Schema(description = "æ¯å¦æ¹æ¬¡ç®¡ç", example = "false") |
| | | private Boolean isBatchManaged; |
| | | |
| | | @Schema(description = "éé(kg)", example = "0.5") |
| | | private BigDecimal weight; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.unit; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MDM 计éåä½ API æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmUnitMeasureApi { |
| | | |
| | | String PREFIX = "/rpc-api/mdm/unit"; |
| | | |
| | | /** |
| | | * è·å计éåä½ |
| | | * |
| | | * @param id åä½ç¼å· |
| | | * @return 计éåä½ |
| | | */ |
| | | CommonResult<MdmUnitMeasureRespDTO> getUnitMeasure(Long id); |
| | | |
| | | /** |
| | | * è·å计éåä½å表 |
| | | * |
| | | * @param ids åä½ç¼å·å表 |
| | | * @return 计éåä½å表 |
| | | */ |
| | | CommonResult<List<MdmUnitMeasureRespDTO>> getUnitMeasureList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * æ ¡éªè®¡éåä½åå¨ |
| | | * |
| | | * @param id åä½ç¼å· |
| | | * @return 计éåä½ |
| | | */ |
| | | CommonResult<MdmUnitMeasureRespDTO> validateUnitMeasureExists(Long id); |
| | | |
| | | /** |
| | | * æ ¹æ®ç¼ç è·å计éåä½ |
| | | * |
| | | * @param code åä½ç¼ç |
| | | * @return 计éåä½ |
| | | */ |
| | | CommonResult<MdmUnitMeasureRespDTO> getUnitMeasureByCode(String code); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.unit; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mdm.service.unit.MdmUnitMeasureService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * MDM 计éåä½ API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RestController |
| | | @RequestMapping(MdmUnitMeasureApi.PREFIX) |
| | | @Validated |
| | | public class MdmUnitMeasureApiImpl implements MdmUnitMeasureApi { |
| | | |
| | | @Resource |
| | | private MdmUnitMeasureService unitMeasureService; |
| | | |
| | | @Override |
| | | public CommonResult<MdmUnitMeasureRespDTO> getUnitMeasure(Long id) { |
| | | MdmUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasure(id); |
| | | return success(BeanUtils.toBean(unitMeasure, MdmUnitMeasureRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<MdmUnitMeasureRespDTO>> getUnitMeasureList(Collection<Long> ids) { |
| | | List<MdmUnitMeasureDO> list = unitMeasureService.getUnitMeasureList(ids); |
| | | return success(BeanUtils.toBean(list, MdmUnitMeasureRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmUnitMeasureRespDTO> validateUnitMeasureExists(Long id) { |
| | | MdmUnitMeasureDO unitMeasure = unitMeasureService.validateUnitMeasureExists(id); |
| | | return success(BeanUtils.toBean(unitMeasure, MdmUnitMeasureRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmUnitMeasureRespDTO> getUnitMeasureByCode(String code) { |
| | | MdmUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasureByCode(code); |
| | | return success(BeanUtils.toBean(unitMeasure, MdmUnitMeasureRespDTO.class)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.unit.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "RPC æå¡ - MDM 计éåä½ Response DTO") |
| | | @Data |
| | | public class MdmUnitMeasureRespDTO { |
| | | |
| | | @Schema(description = "åä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åä½ç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "PCS") |
| | | private String code; |
| | | |
| | | @Schema(description = "åä½åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "个") |
| | | private String name; |
| | | |
| | | @Schema(description = "æ¯å¦ä¸»åä½", example = "true") |
| | | private Boolean primaryFlag; |
| | | |
| | | @Schema(description = "主åä½ç¼å·", example = "1") |
| | | private Long primaryId; |
| | | |
| | | @Schema(description = "ä¸ä¸»å使¢ç®æ¯ä¾", example = "1.0") |
| | | private BigDecimal changeRate; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.warehouse; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.mdm.api.warehouse.dto.MdmWarehouseRespDTO; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| | | |
| | | /** |
| | | * MDM ä»åº API æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmWarehouseApi { |
| | | |
| | | String PREFIX = "/rpc-api/mdm/warehouse"; |
| | | |
| | | /** |
| | | * è·åä»åº |
| | | * |
| | | * @param id ä»åºç¼å· |
| | | * @return ä»åº |
| | | */ |
| | | CommonResult<MdmWarehouseRespDTO> getWarehouse(Long id); |
| | | |
| | | /** |
| | | * è·åä»åºå表 |
| | | * |
| | | * @param ids ä»åºç¼å·å表 |
| | | * @return ä»åºå表 |
| | | */ |
| | | CommonResult<List<MdmWarehouseRespDTO>> getWarehouseList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·åä»åº Map |
| | | * |
| | | * @param ids ä»åºç¼å·å表 |
| | | * @return ä»åº Map |
| | | */ |
| | | default Map<Long, MdmWarehouseRespDTO> getWarehouseMap(Collection<Long> ids) { |
| | | List<MdmWarehouseRespDTO> list = getWarehouseList(ids).getCheckedData(); |
| | | return convertMap(list, MdmWarehouseRespDTO::getId); |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªä»åºåå¨ |
| | | * |
| | | * @param id ä»åºç¼å· |
| | | * @return ä»åº |
| | | */ |
| | | CommonResult<MdmWarehouseRespDTO> validateWarehouseExists(Long id); |
| | | |
| | | /** |
| | | * æ ¡éªä»åºåå¨ä¸å¯ç¨ |
| | | * |
| | | * @param id ä»åºç¼å· |
| | | * @return ä»åº |
| | | */ |
| | | CommonResult<MdmWarehouseRespDTO> validateWarehouseExistsAndEnable(Long id); |
| | | |
| | | /** |
| | | * æ ¹æ®ç¼ç è·åä»åº |
| | | * |
| | | * @param code ä»åºç¼ç |
| | | * @return ä»åº |
| | | */ |
| | | CommonResult<MdmWarehouseRespDTO> getWarehouseByCode(String code); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.warehouse; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.warehouse.dto.MdmWarehouseRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.warehouse.MdmWarehouseDO; |
| | | import cn.iocoder.yudao.module.mdm.service.warehouse.MdmWarehouseService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * MDM ä»åº API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RestController |
| | | @RequestMapping(MdmWarehouseApi.PREFIX) |
| | | @Validated |
| | | public class MdmWarehouseApiImpl implements MdmWarehouseApi { |
| | | |
| | | @Resource |
| | | private MdmWarehouseService warehouseService; |
| | | |
| | | @Override |
| | | public CommonResult<MdmWarehouseRespDTO> getWarehouse(Long id) { |
| | | MdmWarehouseDO warehouse = warehouseService.getWarehouse(id); |
| | | return success(BeanUtils.toBean(warehouse, MdmWarehouseRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<MdmWarehouseRespDTO>> getWarehouseList(Collection<Long> ids) { |
| | | List<MdmWarehouseDO> list = warehouseService.getWarehouseList(ids); |
| | | return success(BeanUtils.toBean(list, MdmWarehouseRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmWarehouseRespDTO> validateWarehouseExists(Long id) { |
| | | MdmWarehouseDO warehouse = warehouseService.validateWarehouseExists(id); |
| | | return success(BeanUtils.toBean(warehouse, MdmWarehouseRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmWarehouseRespDTO> validateWarehouseExistsAndEnable(Long id) { |
| | | MdmWarehouseDO warehouse = warehouseService.validateWarehouseExistsAndEnable(id); |
| | | return success(BeanUtils.toBean(warehouse, MdmWarehouseRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmWarehouseRespDTO> getWarehouseByCode(String code) { |
| | | MdmWarehouseDO warehouse = warehouseService.getWarehouseByCode(code); |
| | | return success(BeanUtils.toBean(warehouse, MdmWarehouseRespDTO.class)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.warehouse.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "RPC æå¡ - MDM ä»åº Response DTO") |
| | | @Data |
| | | public class MdmWarehouseRespDTO { |
| | | |
| | | @Schema(description = "ä»åºç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ä»åºç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "WH001") |
| | | private String code; |
| | | |
| | | @Schema(description = "ä»åºåç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "åæä»") |
| | | private String name; |
| | | |
| | | @Schema(description = "ä»åºå°å", example = "䏿µ·å¸æµ¦ä¸æ°åº") |
| | | private String address; |
| | | |
| | | @Schema(description = "é¢ç§¯ï¼å¹³æ¹ç±³ï¼", example = "1000") |
| | | private BigDecimal area; |
| | | |
| | | @Schema(description = "ä»åºç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "è´è´£äººç¨æ·ID", example = "1") |
| | | private Long chargeUserId; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "æ¯å¦å»ç»", example = "false") |
| | | private Boolean frozen; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.brand; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.brand.vo.MdmBrandPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.brand.vo.MdmBrandSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.brand.MdmBrandDO; |
| | | import cn.iocoder.yudao.module.mdm.service.brand.MdmBrandService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - MDM åç") |
| | | @RestController |
| | | @RequestMapping("/mdm/brand") |
| | | @Validated |
| | | public class MdmBrandController { |
| | | |
| | | @Resource |
| | | private MdmBrandService brandService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建åç") |
| | | @PreAuthorize("@ss.hasPermission('mdm:brand:create')") |
| | | public CommonResult<Long> createBrand(@Valid @RequestBody MdmBrandSaveReqVO createReqVO) { |
| | | return success(brandService.createBrand(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°åç") |
| | | @PreAuthorize("@ss.hasPermission('mdm:brand:update')") |
| | | public CommonResult<Boolean> updateBrand(@Valid @RequestBody MdmBrandSaveReqVO updateReqVO) { |
| | | brandService.updateBrand(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/update-status") |
| | | @Operation(summary = "æ´æ°åçç¶æ") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @Parameter(name = "status", description = "ç¶æ", required = true, example = "0") |
| | | @PreAuthorize("@ss.hasPermission('mdm:brand:update')") |
| | | public CommonResult<Boolean> updateBrandStatus(@RequestParam("id") Long id, @RequestParam("status") Integer status) { |
| | | brandService.updateBrandStatus(id, status); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤åç") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @PreAuthorize("@ss.hasPermission('mdm:brand:delete')") |
| | | public CommonResult<Boolean> deleteBrand(@RequestParam("id") Long id) { |
| | | brandService.deleteBrand(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾åç") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @PreAuthorize("@ss.hasPermission('mdm:brand:query')") |
| | | public CommonResult<MdmBrandDO> getBrand(@RequestParam("id") Long id) { |
| | | return success(brandService.getBrand(id)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾åçå页") |
| | | @PreAuthorize("@ss.hasPermission('mdm:brand:query')") |
| | | public CommonResult<PageResult<MdmBrandDO>> getBrandPage(@Valid MdmBrandPageReqVO pageReqVO) { |
| | | return success(brandService.getBrandPage(pageReqVO)); |
| | | } |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·å¾åçå表") |
| | | @PreAuthorize("@ss.hasPermission('mdm:brand:query')") |
| | | public CommonResult<List<MdmBrandDO>> getBrandList() { |
| | | return success(brandService.getBrandList(null)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.brand.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - MDM åçå页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class MdmBrandPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "åçç¼ç ", example = "BRAND001") |
| | | private String code; |
| | | |
| | | @Schema(description = "åçåç§°", example = "åçA") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private LocalDateTime[] createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.brand.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | @Schema(description = "管çåå° - MDM åçæ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class MdmBrandSaveReqVO { |
| | | |
| | | @Schema(description = "åçç¼å·", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åçç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "BRAND001") |
| | | private String code; |
| | | |
| | | @Schema(description = "åçåç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "åçA") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.category; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.category.vo.MdmItemCategoryPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.category.vo.MdmItemCategoryRespVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.category.vo.MdmItemCategorySaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO; |
| | | import cn.iocoder.yudao.module.mdm.service.category.MdmItemCategoryService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - MDM ç©æåç±»") |
| | | @RestController |
| | | @RequestMapping("/mdm/item-category") |
| | | @Validated |
| | | public class MdmItemCategoryController { |
| | | |
| | | @Resource |
| | | private MdmItemCategoryService itemCategoryService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "åå»ºç©æåç±»") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item-category:create')") |
| | | public CommonResult<Long> createItemCategory(@Valid @RequestBody MdmItemCategorySaveReqVO createReqVO) { |
| | | return success(itemCategoryService.createItemCategory(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°ç©æåç±»") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item-category:update')") |
| | | public CommonResult<Boolean> updateItemCategory(@Valid @RequestBody MdmItemCategorySaveReqVO updateReqVO) { |
| | | itemCategoryService.updateItemCategory(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/update-status") |
| | | @Operation(summary = "æ´æ°ç©æåç±»ç¶æ") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @Parameter(name = "status", description = "ç¶æ", required = true, example = "0") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item-category:update')") |
| | | public CommonResult<Boolean> updateItemCategoryStatus(@RequestParam("id") Long id, @RequestParam("status") Integer status) { |
| | | itemCategoryService.updateItemCategoryStatus(id, status); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤ç©æåç±»") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item-category:delete')") |
| | | public CommonResult<Boolean> deleteItemCategory(@RequestParam("id") Long id) { |
| | | itemCategoryService.deleteItemCategory(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾ç©æåç±»") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item-category:query')") |
| | | public CommonResult<MdmItemCategoryRespVO> getItemCategory(@RequestParam("id") Long id) { |
| | | MdmItemCategoryDO itemCategory = itemCategoryService.getItemCategory(id); |
| | | return success(BeanUtils.toBean(itemCategory, MdmItemCategoryRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾ç©æåç±»å页") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item-category:query')") |
| | | public CommonResult<PageResult<MdmItemCategoryRespVO>> getItemCategoryPage(@Valid MdmItemCategoryPageReqVO pageReqVO) { |
| | | PageResult<MdmItemCategoryDO> pageResult = itemCategoryService.getItemCategoryPage(pageReqVO); |
| | | return success(BeanUtils.toBean(pageResult, MdmItemCategoryRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·å¾ç©æåç±»å表") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item-category:query')") |
| | | public CommonResult<List<MdmItemCategoryRespVO>> getItemCategoryList() { |
| | | List<MdmItemCategoryDO> list = itemCategoryService.getItemCategoryList(null); |
| | | return success(BeanUtils.toBean(list, MdmItemCategoryRespVO.class)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.category.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | @Schema(description = "管çåå° - MDM ç©æåç±»å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class MdmItemCategoryPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "åç±»ç¼ç ", example = "CAT001") |
| | | private String code; |
| | | |
| | | @Schema(description = "åç±»åç§°", example = "äºéé
ä»¶") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç¶åç±»ç¼å·", example = "0") |
| | | private Long parentId; |
| | | |
| | | @Schema(description = "ç©æç±»å", example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.category.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - MDM ç©æåç±» Response VO") |
| | | @Data |
| | | public class MdmItemCategoryRespVO { |
| | | |
| | | @Schema(description = "åç±»ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç¶åç±»ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Long parentId; |
| | | |
| | | @Schema(description = "åç±»ç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "CAT001") |
| | | private String code; |
| | | |
| | | @Schema(description = "åç±»åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "äºéé
ä»¶") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç©æç±»å", example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "æåº", example = "1") |
| | | private Integer sort; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.category.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | @Schema(description = "管çåå° - MDM ç©æåç±»æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class MdmItemCategorySaveReqVO { |
| | | |
| | | @Schema(description = "åç±»ç¼å·", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç¶åç±»ç¼å·", example = "0") |
| | | private Long parentId; |
| | | |
| | | @Schema(description = "åç±»ç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "CAT001") |
| | | private String code; |
| | | |
| | | @Schema(description = "åç±»åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "äºéé
ä»¶") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç©æç±»å", example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "æåº", example = "1") |
| | | private Integer sort; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.item; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemRespVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; |
| | | import cn.iocoder.yudao.module.mdm.service.item.MdmItemService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - MDM ç©æä¸»æ°æ®") |
| | | @RestController |
| | | @RequestMapping("/mdm/item") |
| | | @Validated |
| | | public class MdmItemController { |
| | | |
| | | @Resource |
| | | private MdmItemService itemService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "åå»ºç©æ") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item:create')") |
| | | public CommonResult<Long> createItem(@Valid @RequestBody MdmItemSaveReqVO createReqVO) { |
| | | return success(itemService.createItem(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°ç©æ") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item:update')") |
| | | public CommonResult<Boolean> updateItem(@Valid @RequestBody MdmItemSaveReqVO updateReqVO) { |
| | | itemService.updateItem(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/update-status") |
| | | @Operation(summary = "æ´æ°ç©æç¶æ") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @Parameter(name = "status", description = "ç¶æ", required = true, example = "0") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item:update')") |
| | | public CommonResult<Boolean> updateItemStatus(@RequestParam("id") Long id, @RequestParam("status") Integer status) { |
| | | itemService.updateItemStatus(id, status); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤ç©æ") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item:delete')") |
| | | public CommonResult<Boolean> deleteItem(@RequestParam("id") Long id) { |
| | | itemService.deleteItem(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾ç©æ") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @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)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾ç©æå页") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item:query')") |
| | | public CommonResult<PageResult<MdmItemRespVO>> getItemPage(@Valid MdmItemPageReqVO pageReqVO) { |
| | | PageResult<MdmItemDO> pageResult = itemService.getItemPage(pageReqVO); |
| | | return success(BeanUtils.toBean(pageResult, MdmItemRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/list-by-ids") |
| | | @Operation(summary = "è·å¾ç©æå表") |
| | | @Parameter(name = "ids", description = "ç¼å·å表", required = true, example = "1,2,3") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item:query')") |
| | | public CommonResult<List<MdmItemRespVO>> getItemList(@RequestParam("ids") List<Long> ids) { |
| | | List<MdmItemDO> list = itemService.getItemList(ids); |
| | | return success(BeanUtils.toBean(list, MdmItemRespVO.class)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.item.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - MDM ç©æå页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class MdmItemPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "ç©æç¼ç ", example = "ITEM001") |
| | | private String code; |
| | | |
| | | @Schema(description = "ç©æåç§°", example = "èºä¸") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç©ææ¡ç ", example = "12345678") |
| | | private String barCode; |
| | | |
| | | @Schema(description = "ç©æåç±»ç¼å·", example = "1") |
| | | private Long categoryId; |
| | | |
| | | @Schema(description = "ç©æç±»å", example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "åçç¼å·", example = "1") |
| | | private Long brandId; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private LocalDateTime[] createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.item.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - MDM ç©æ Response VO") |
| | | @Data |
| | | public class MdmItemRespVO { |
| | | |
| | | @Schema(description = "ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç©æç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "ITEM001") |
| | | private String code; |
| | | |
| | | @Schema(description = "ç©æåç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "èºä¸") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç©ææ¡ç ", example = "12345678") |
| | | private String barCode; |
| | | |
| | | @Schema(description = "è§æ ¼åå·", example = "M8*20") |
| | | private String specification; |
| | | |
| | | @Schema(description = "ç©æåç±»ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long categoryId; |
| | | |
| | | @Schema(description = "ç©æåç±»åç§°", example = "äºéé
ä»¶") |
| | | private String categoryName; |
| | | |
| | | @Schema(description = "计éåä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long unitMeasureId; |
| | | |
| | | @Schema(description = "计éåä½åç§°", example = "个") |
| | | private String unitMeasureName; |
| | | |
| | | @Schema(description = "åçç¼å·", example = "1") |
| | | private Long brandId; |
| | | |
| | | @Schema(description = "åçåç§°", example = "åçA") |
| | | private String brandName; |
| | | |
| | | @Schema(description = "ç©æç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "éè´ä»·æ ¼", example = "10.00") |
| | | private BigDecimal purchasePrice; |
| | | |
| | | @Schema(description = "éå®ä»·æ ¼", example = "15.00") |
| | | private BigDecimal salesPrice; |
| | | |
| | | @Schema(description = "ææ¬ä»·æ ¼", example = "8.00") |
| | | private BigDecimal costPrice; |
| | | |
| | | @Schema(description = "å®å
¨åºå", example = "100") |
| | | private BigDecimal safetyStock; |
| | | |
| | | @Schema(description = "æä½åºå", example = "50") |
| | | private BigDecimal minStock; |
| | | |
| | | @Schema(description = "æé«åºå", example = "500") |
| | | private BigDecimal maxStock; |
| | | |
| | | @Schema(description = "ä¿è´¨æå¤©æ°", example = "365") |
| | | private Integer expiryDays; |
| | | |
| | | @Schema(description = "æ¯å¦æ¹æ¬¡ç®¡ç", example = "false") |
| | | private Boolean isBatchManaged; |
| | | |
| | | @Schema(description = "æ¯å¦é«å¼ç©æ", example = "false") |
| | | private Boolean isHighValue; |
| | | |
| | | @Schema(description = "éé", example = "0.5") |
| | | private BigDecimal weight; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.item.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "管çåå° - MDM ç©ææ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class MdmItemSaveReqVO { |
| | | |
| | | @Schema(description = "ç©æç¼å·", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç©æç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "ITEM001") |
| | | private String code; |
| | | |
| | | @Schema(description = "ç©æåç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "èºä¸") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç©ææ¡ç ", example = "12345678") |
| | | private String barCode; |
| | | |
| | | @Schema(description = "è§æ ¼åå·", example = "M8*20") |
| | | private String specification; |
| | | |
| | | @Schema(description = "ç©æåç±»ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long categoryId; |
| | | |
| | | @Schema(description = "计éåä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long unitMeasureId; |
| | | |
| | | @Schema(description = "åçç¼å·", example = "1") |
| | | private Long brandId; |
| | | |
| | | @Schema(description = "ç©æç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "éè´ä»·æ ¼", example = "10.00") |
| | | private BigDecimal purchasePrice; |
| | | |
| | | @Schema(description = "éå®ä»·æ ¼", example = "15.00") |
| | | private BigDecimal salesPrice; |
| | | |
| | | @Schema(description = "ææ¬ä»·æ ¼", example = "8.00") |
| | | private BigDecimal costPrice; |
| | | |
| | | @Schema(description = "å®å
¨åºå", example = "100") |
| | | private BigDecimal safetyStock; |
| | | |
| | | @Schema(description = "æä½åºå", example = "50") |
| | | private BigDecimal minStock; |
| | | |
| | | @Schema(description = "æé«åºå", example = "500") |
| | | private BigDecimal maxStock; |
| | | |
| | | @Schema(description = "ä¿è´¨æå¤©æ°", example = "365") |
| | | private Integer expiryDay; |
| | | |
| | | @Schema(description = "æ¯å¦æ¹æ¬¡ç®¡ç", example = "false") |
| | | private Boolean isBatchManaged; |
| | | |
| | | @Schema(description = "æ¯å¦é«å¼ç©æ", example = "false") |
| | | private Boolean isHighValue; |
| | | |
| | | @Schema(description = "éé", example = "0.5") |
| | | private BigDecimal weight; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.unit; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasurePageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mdm.service.unit.MdmUnitMeasureService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - MDM 计éåä½") |
| | | @RestController |
| | | @RequestMapping("/mdm/unit-measure") |
| | | @Validated |
| | | public class MdmUnitMeasureController { |
| | | |
| | | @Resource |
| | | private MdmUnitMeasureService unitMeasureService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建计éåä½") |
| | | @PreAuthorize("@ss.hasPermission('mdm:unit-measure:create')") |
| | | public CommonResult<Long> createUnitMeasure(@Valid @RequestBody MdmUnitMeasureSaveReqVO createReqVO) { |
| | | return success(unitMeasureService.createUnitMeasure(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°è®¡éåä½") |
| | | @PreAuthorize("@ss.hasPermission('mdm:unit-measure:update')") |
| | | public CommonResult<Boolean> updateUnitMeasure(@Valid @RequestBody MdmUnitMeasureSaveReqVO updateReqVO) { |
| | | unitMeasureService.updateUnitMeasure(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/update-status") |
| | | @Operation(summary = "æ´æ°è®¡éåä½ç¶æ") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @Parameter(name = "status", description = "ç¶æ", required = true, example = "0") |
| | | @PreAuthorize("@ss.hasPermission('mdm:unit-measure:update')") |
| | | public CommonResult<Boolean> updateUnitMeasureStatus(@RequestParam("id") Long id, @RequestParam("status") Integer status) { |
| | | unitMeasureService.updateUnitMeasureStatus(id, status); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤è®¡éåä½") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @PreAuthorize("@ss.hasPermission('mdm:unit-measure:delete')") |
| | | public CommonResult<Boolean> deleteUnitMeasure(@RequestParam("id") Long id) { |
| | | unitMeasureService.deleteUnitMeasure(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾è®¡éåä½") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @PreAuthorize("@ss.hasPermission('mdm:unit-measure:query')") |
| | | public CommonResult<MdmUnitMeasureDO> getUnitMeasure(@RequestParam("id") Long id) { |
| | | return success(unitMeasureService.getUnitMeasure(id)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾è®¡éåä½å页") |
| | | @PreAuthorize("@ss.hasPermission('mdm:unit-measure:query')") |
| | | public CommonResult<PageResult<MdmUnitMeasureDO>> getUnitMeasurePage(@Valid MdmUnitMeasurePageReqVO pageReqVO) { |
| | | return success(unitMeasureService.getUnitMeasurePage(pageReqVO)); |
| | | } |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·å¾è®¡éåä½å表") |
| | | @PreAuthorize("@ss.hasPermission('mdm:unit-measure:query')") |
| | | public CommonResult<List<MdmUnitMeasureDO>> getUnitMeasureList() { |
| | | return success(unitMeasureService.getUnitMeasureList(null)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.unit.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - MDM 计éåä½å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class MdmUnitMeasurePageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "åä½ç¼ç ", example = "PCS") |
| | | private String code; |
| | | |
| | | @Schema(description = "åä½åç§°", example = "个") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private LocalDateTime[] createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.unit.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "管çåå° - MDM 计éå使°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class MdmUnitMeasureSaveReqVO { |
| | | |
| | | @Schema(description = "åä½ç¼å·", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åä½ç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "PCS") |
| | | private String code; |
| | | |
| | | @Schema(description = "åä½åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "个") |
| | | private String name; |
| | | |
| | | @Schema(description = "æ¯å¦ä¸»åä½", example = "true") |
| | | private Boolean primaryFlag; |
| | | |
| | | @Schema(description = "主åä½ç¼å·", example = "1") |
| | | private Long primaryId; |
| | | |
| | | @Schema(description = "ä¸ä¸»å使¢ç®æ¯ä¾", example = "1.0") |
| | | private BigDecimal changeRate; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.warehouse; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.warehouse.vo.*; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.warehouse.MdmWarehouseDO; |
| | | 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; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - MDM ä»åº") |
| | | @RestController |
| | | @RequestMapping("/mdm/warehouse") |
| | | @Validated |
| | | public class MdmWarehouseController { |
| | | |
| | | @Resource |
| | | private MdmWarehouseService warehouseService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建ä»åº") |
| | | @PreAuthorize("@ss.hasPermission('mdm:warehouse:create')") |
| | | public CommonResult<Long> createWarehouse(@Valid @RequestBody MdmWarehouseSaveReqVO createReqVO) { |
| | | return success(warehouseService.createWarehouse(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°ä»åº") |
| | | @PreAuthorize("@ss.hasPermission('mdm:warehouse:update')") |
| | | public CommonResult<Boolean> updateWarehouse(@Valid @RequestBody MdmWarehouseSaveReqVO updateReqVO) { |
| | | warehouseService.updateWarehouse(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/update-status") |
| | | @Operation(summary = "æ´æ°ä»åºç¶æ") |
| | | @PreAuthorize("@ss.hasPermission('mdm:warehouse:update')") |
| | | public CommonResult<Boolean> updateWarehouseStatus(@RequestParam("id") Long id, @RequestParam("status") Integer status) { |
| | | warehouseService.updateWarehouseStatus(id, status); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤ä»åº") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('mdm:warehouse:delete')") |
| | | public CommonResult<Boolean> deleteWarehouse(@RequestParam("id") Long id) { |
| | | warehouseService.deleteWarehouse(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾ä»åº") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('mdm:warehouse:query')") |
| | | public CommonResult<MdmWarehouseRespVO> getWarehouse(@RequestParam("id") Long id) { |
| | | MdmWarehouseDO warehouse = warehouseService.getWarehouse(id); |
| | | return success(BeanUtils.toBean(warehouse, MdmWarehouseRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾ä»åºå页") |
| | | @PreAuthorize("@ss.hasPermission('mdm:warehouse:query')") |
| | | public CommonResult<PageResult<MdmWarehouseRespVO>> getWarehousePage(@Valid MdmWarehousePageReqVO pageReqVO) { |
| | | PageResult<MdmWarehouseDO> pageResult = warehouseService.getWarehousePage(pageReqVO); |
| | | return success(BeanUtils.toBean(pageResult, MdmWarehouseRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/list-by-ids") |
| | | @Operation(summary = "è·å¾ä»åºå表") |
| | | @Parameter(name = "ids", description = "ç¼å·å表", required = true, example = "1,2,3") |
| | | @PreAuthorize("@ss.hasPermission('mdm:warehouse:query')") |
| | | public CommonResult<List<MdmWarehouseRespVO>> getWarehouseList(@RequestParam("ids") List<Long> ids) { |
| | | List<MdmWarehouseDO> list = warehouseService.getWarehouseList(ids); |
| | | return success(BeanUtils.toBean(list, MdmWarehouseRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/list-all-simple") |
| | | @Operation(summary = "è·å¾å
¨é¨å¯ç¨çä»åºå表") |
| | | public CommonResult<List<MdmWarehouseRespVO>> getSimpleWarehouseList() { |
| | | MdmWarehouseDO query = new MdmWarehouseDO(); |
| | | query.setStatus(0); |
| | | List<MdmWarehouseDO> list = warehouseService.getWarehousePage(new MdmWarehousePageReqVO()).getList(); |
| | | return success(BeanUtils.toBean(list, MdmWarehouseRespVO.class)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.warehouse.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - MDM ä»åºå页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class MdmWarehousePageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "ä»åºç¼ç ", example = "WH001") |
| | | private String code; |
| | | |
| | | @Schema(description = "ä»åºåç§°", example = "æåä»åº") |
| | | private String name; |
| | | |
| | | @Schema(description = "ä»åºç±»å", example = "1") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private LocalDateTime[] createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.warehouse.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - MDM ä»åº Response VO") |
| | | @Data |
| | | public class MdmWarehouseRespVO { |
| | | |
| | | @Schema(description = "ä»åºç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ä»åºç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "WH001") |
| | | private String code; |
| | | |
| | | @Schema(description = "ä»åºåç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "æåä»åº") |
| | | private String name; |
| | | |
| | | @Schema(description = "ä»åºå°å", example = "䏿µ·å¸æµ¦ä¸æ°åº") |
| | | private String address; |
| | | |
| | | @Schema(description = "é¢ç§¯ï¼å¹³æ¹ç±³ï¼", example = "1000.00") |
| | | private BigDecimal area; |
| | | |
| | | @Schema(description = "ä»åºç±»å", example = "1") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "è´è´£äººç¨æ·ID", example = "1") |
| | | private Long chargeUserId; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "æ¯å¦å»ç»", example = "false") |
| | | private Boolean frozen; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.warehouse.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "管çåå° - MDM ä»åºæ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class MdmWarehouseSaveReqVO { |
| | | |
| | | @Schema(description = "ä»åºç¼å·", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ä»åºç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "WH001") |
| | | private String code; |
| | | |
| | | @Schema(description = "ä»åºåç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "æåä»åº") |
| | | private String name; |
| | | |
| | | @Schema(description = "ä»åºå°å", example = "䏿µ·å¸æµ¦ä¸æ°åº") |
| | | private String address; |
| | | |
| | | @Schema(description = "é¢ç§¯ï¼å¹³æ¹ç±³ï¼", example = "1000.00") |
| | | private BigDecimal area; |
| | | |
| | | @Schema(description = "ä»åºç±»å", example = "1") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "è´è´£äººç¨æ·ID", example = "1") |
| | | private Long chargeUserId; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "æ¯å¦å»ç»", example = "false") |
| | | private Boolean frozen; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.dataobject.brand; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | /** |
| | | * MDM åç DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("md_brand") |
| | | @KeySequence("md_brand_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class MdmBrandDO extends BaseDO { |
| | | |
| | | /** |
| | | * åçç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * åçç¼ç |
| | | */ |
| | | private String code; |
| | | |
| | | /** |
| | | * åçåç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.dataobject.category; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | /** |
| | | * MDM ç©æåç±» DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("md_item_category") |
| | | @KeySequence("md_item_category_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class MdmItemCategoryDO extends BaseDO { |
| | | |
| | | /** |
| | | * åç±»ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * ç¶åç±»ç¼å·ï¼æ ¹èç¹=0ï¼ |
| | | */ |
| | | private Long parentId; |
| | | |
| | | /** |
| | | * åç±»ç¼ç |
| | | */ |
| | | private String code; |
| | | |
| | | /** |
| | | * åç±»åç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * éç¨ç©æç±»å |
| | | * |
| | | * 1: åæ |
| | | * 2: åæå |
| | | * 3: æå |
| | | * 4: è¾
æ |
| | | * NULL: å
¨é¨ |
| | | */ |
| | | private Integer itemType; |
| | | |
| | | /** |
| | | * æåº |
| | | */ |
| | | private Integer sort; |
| | | |
| | | /** |
| | | * ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.dataobject.item; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | /** |
| | | * MDM ç©ææ¹æ¬¡å±æ§é
ç½® DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("md_item_batch_config") |
| | | @KeySequence("md_item_batch_config_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class MdmItemBatchConfigDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * ç©æç¼å· |
| | | * |
| | | * å
³è {@link MdmItemDO#getId()} |
| | | */ |
| | | private Long itemId; |
| | | |
| | | /** |
| | | * çäº§æ¥æ |
| | | */ |
| | | private Boolean produceDateFlag; |
| | | |
| | | /** |
| | | * æææ |
| | | */ |
| | | private Boolean expireDateFlag; |
| | | |
| | | /** |
| | | * å
¥åºæ¥æ |
| | | */ |
| | | private Boolean receiptDateFlag; |
| | | |
| | | /** |
| | | * ä¾åºå |
| | | */ |
| | | private Boolean vendorFlag; |
| | | |
| | | /** |
| | | * å®¢æ· |
| | | */ |
| | | private Boolean clientFlag; |
| | | |
| | | /** |
| | | * éå®è®¢åç¼å· |
| | | */ |
| | | private Boolean salesOrderCodeFlag; |
| | | |
| | | /** |
| | | * éè´è®¢åç¼å· |
| | | */ |
| | | private Boolean purchaseOrderCodeFlag; |
| | | |
| | | /** |
| | | * ç产工å |
| | | */ |
| | | private Boolean workOrderFlag; |
| | | |
| | | /** |
| | | * çäº§ä»»å¡ |
| | | */ |
| | | private Boolean taskFlag; |
| | | |
| | | /** |
| | | * å·¥ä½ç« |
| | | */ |
| | | private Boolean workstationFlag; |
| | | |
| | | /** |
| | | * å·¥å
· |
| | | */ |
| | | private Boolean toolFlag; |
| | | |
| | | /** |
| | | * 模å
· |
| | | */ |
| | | private Boolean moldFlag; |
| | | |
| | | /** |
| | | * ç产æ¹å· |
| | | */ |
| | | private Boolean lotNumberFlag; |
| | | |
| | | /** |
| | | * è´¨éç¶æ |
| | | */ |
| | | private Boolean qualityStatusFlag; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.dataobject.item; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.brand.MdmBrandDO; |
| | | import cn.iocoder.yudao.module.mdm.enums.MdmItemTypeEnum; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * MDM ç©æä¸»æ°æ® DO |
| | | * |
| | | * ç»ä¸ç©ææ°æ®ï¼ERP/MES/WMS å
±ç¨ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("md_item") |
| | | @KeySequence("md_item_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class MdmItemDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç©æIDï¼å
¨å±å¯ä¸ï¼ |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * ç©æç¼ç ï¼å
¨å±å¯ä¸ï¼ |
| | | */ |
| | | private String code; |
| | | |
| | | /** |
| | | * ç©æåç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * ç©ææ¡ç |
| | | */ |
| | | private String barCode; |
| | | |
| | | /** |
| | | * è§æ ¼åå· |
| | | */ |
| | | private String specification; |
| | | |
| | | /** |
| | | * ç©æåç±»ç¼å· |
| | | * |
| | | * å
³è {@link MdmItemCategoryDO#getId()} |
| | | */ |
| | | private Long categoryId; |
| | | |
| | | /** |
| | | * 主计éåä½ç¼å· |
| | | * |
| | | * å
³è {@link MdmUnitMeasureDO#getId()} |
| | | */ |
| | | private Long unitMeasureId; |
| | | |
| | | /** |
| | | * åçç¼å· |
| | | * |
| | | * å
³è {@link MdmBrandDO#getId()} |
| | | */ |
| | | private Long brandId; |
| | | |
| | | /** |
| | | * ç©æç±»å |
| | | * |
| | | * æä¸¾ {@link MdmItemTypeEnum} |
| | | * 1: åæ |
| | | * 2: åæå |
| | | * 3: æå |
| | | * 4: è¾
æ |
| | | */ |
| | | private Integer itemType; |
| | | |
| | | /** |
| | | * ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * éè´ä»· |
| | | */ |
| | | private BigDecimal purchasePrice; |
| | | |
| | | /** |
| | | * éå®ä»· |
| | | */ |
| | | private BigDecimal salesPrice; |
| | | |
| | | /** |
| | | * ææ¬ä»· |
| | | */ |
| | | private BigDecimal costPrice; |
| | | |
| | | /** |
| | | * æä½ä»· |
| | | */ |
| | | private BigDecimal minPrice; |
| | | |
| | | /** |
| | | * å®å
¨åºå |
| | | */ |
| | | private BigDecimal safetyStock; |
| | | |
| | | /** |
| | | * æä½åºåé |
| | | */ |
| | | private BigDecimal minStock; |
| | | |
| | | /** |
| | | * æé«åºåé |
| | | */ |
| | | private BigDecimal maxStock; |
| | | |
| | | /** |
| | | * æå°è®¢è´§é |
| | | */ |
| | | private BigDecimal minOrderQty; |
| | | |
| | | /** |
| | | * éè´æåæï¼å¤©ï¼ |
| | | */ |
| | | private Integer leadTime; |
| | | |
| | | /** |
| | | * æ¯å¦æ¹æ¬¡ç®¡ç |
| | | */ |
| | | private Boolean isBatchManaged; |
| | | |
| | | /** |
| | | * æ¯å¦åºåå·ç®¡ç |
| | | */ |
| | | private Boolean isSerialManaged; |
| | | |
| | | /** |
| | | * æ¡ç è§åID |
| | | */ |
| | | private Long barcodeRuleId; |
| | | |
| | | /** |
| | | * ä¿è´¨æå¤©æ° |
| | | */ |
| | | private Integer expiryDay; |
| | | |
| | | /** |
| | | * æ¯å¦é«å¼ç©æ |
| | | */ |
| | | private Boolean highValue; |
| | | |
| | | /** |
| | | * éé(kg) |
| | | */ |
| | | private BigDecimal weight; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.dataobject.item; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * MDM ç©æ SKU DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("mdm_item_sku") |
| | | @KeySequence("mdm_item_sku_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class MdmItemSkuDO extends BaseDO { |
| | | |
| | | /** |
| | | * SKU ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * ç©æç¼å· |
| | | */ |
| | | private Long itemId; |
| | | |
| | | /** |
| | | * SKU ç¼ç |
| | | */ |
| | | private String code; |
| | | |
| | | /** |
| | | * SKU åç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * SKU æ¡ç |
| | | */ |
| | | private String barCode; |
| | | |
| | | /** |
| | | * é¿åº¦ï¼cmï¼ |
| | | */ |
| | | private BigDecimal length; |
| | | |
| | | /** |
| | | * 宽度ï¼cmï¼ |
| | | */ |
| | | private BigDecimal width; |
| | | |
| | | /** |
| | | * é«åº¦ï¼cmï¼ |
| | | */ |
| | | private BigDecimal height; |
| | | |
| | | /** |
| | | * æ¯éï¼kgï¼ |
| | | */ |
| | | private BigDecimal grossWeight; |
| | | |
| | | /** |
| | | * åéï¼kgï¼ |
| | | */ |
| | | private BigDecimal netWeight; |
| | | |
| | | /** |
| | | * ææ¬ä»· |
| | | */ |
| | | private BigDecimal costPrice; |
| | | |
| | | /** |
| | | * éå®ä»· |
| | | */ |
| | | private BigDecimal salePrice; |
| | | |
| | | /** |
| | | * ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.dataobject.unit; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * MDM 计éåä½ DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("md_unit_measure") |
| | | @KeySequence("md_unit_measure_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class MdmUnitMeasureDO extends BaseDO { |
| | | |
| | | /** |
| | | * åä½ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * åä½ç¼ç |
| | | */ |
| | | private String code; |
| | | |
| | | /** |
| | | * åä½åç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * æ¯å¦ä¸»åä½ |
| | | */ |
| | | private Boolean primaryFlag; |
| | | |
| | | /** |
| | | * 主åä½ç¼å· |
| | | */ |
| | | private Long primaryId; |
| | | |
| | | /** |
| | | * ä¸ä¸»å使¢ç®æ¯ä¾ |
| | | */ |
| | | private BigDecimal changeRate; |
| | | |
| | | /** |
| | | * ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.dataobject.warehouse; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * MDM ä»åºä¸»æ°æ® DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("md_warehouse") |
| | | @KeySequence("md_warehouse_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class MdmWarehouseDO extends BaseDO { |
| | | |
| | | /** |
| | | * ä»åºID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * ä»åºç¼ç |
| | | */ |
| | | private String code; |
| | | |
| | | /** |
| | | * ä»åºåç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * ä»åºå°å |
| | | */ |
| | | private String address; |
| | | |
| | | /** |
| | | * é¢ç§¯ï¼å¹³æ¹ç±³ï¼ |
| | | */ |
| | | private BigDecimal area; |
| | | |
| | | /** |
| | | * ä»åºç±»å |
| | | * |
| | | * 1: åæä» |
| | | * 2: æåä» |
| | | * 3: åæåä» |
| | | * 4: çº¿è¾¹ä» |
| | | */ |
| | | private Integer type; |
| | | |
| | | /** |
| | | * è´è´£äººç¨æ·ID |
| | | */ |
| | | private Long chargeUserId; |
| | | |
| | | /** |
| | | * ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * æ¯å¦å»ç» |
| | | */ |
| | | private Boolean frozen; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.mysql.brand; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.brand.vo.MdmBrandPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.brand.MdmBrandDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MDM åç Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface MdmBrandMapper extends BaseMapperX<MdmBrandDO> { |
| | | |
| | | default PageResult<MdmBrandDO> selectPage(MdmBrandPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MdmBrandDO>() |
| | | .likeIfPresent(MdmBrandDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MdmBrandDO::getName, reqVO.getName()) |
| | | .eqIfPresent(MdmBrandDO::getStatus, reqVO.getStatus()) |
| | | .betweenIfPresent(MdmBrandDO::getCreateTime, reqVO.getCreateTime()) |
| | | .orderByDesc(MdmBrandDO::getId)); |
| | | } |
| | | |
| | | default List<MdmBrandDO> selectList(MdmBrandDO reqVO) { |
| | | return selectList(new LambdaQueryWrapperX<MdmBrandDO>() |
| | | .likeIfPresent(MdmBrandDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MdmBrandDO::getName, reqVO.getName()) |
| | | .eqIfPresent(MdmBrandDO::getStatus, reqVO.getStatus()) |
| | | .orderByDesc(MdmBrandDO::getId)); |
| | | } |
| | | |
| | | default MdmBrandDO selectByCode(String code) { |
| | | return selectOne(MdmBrandDO::getCode, code); |
| | | } |
| | | |
| | | default MdmBrandDO selectByName(String name) { |
| | | return selectOne(MdmBrandDO::getName, name); |
| | | } |
| | | |
| | | default List<MdmBrandDO> selectListByIds(Collection<Long> ids) { |
| | | return selectList(MdmBrandDO::getId, ids); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.mysql.category; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.category.vo.MdmItemCategoryPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MDM ç©æåç±» Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface MdmItemCategoryMapper extends BaseMapperX<MdmItemCategoryDO> { |
| | | |
| | | default PageResult<MdmItemCategoryDO> selectPage(MdmItemCategoryPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MdmItemCategoryDO>() |
| | | .likeIfPresent(MdmItemCategoryDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MdmItemCategoryDO::getName, reqVO.getName()) |
| | | .eqIfPresent(MdmItemCategoryDO::getParentId, reqVO.getParentId()) |
| | | .eqIfPresent(MdmItemCategoryDO::getItemType, reqVO.getItemType()) |
| | | .eqIfPresent(MdmItemCategoryDO::getStatus, reqVO.getStatus()) |
| | | .orderByAsc(MdmItemCategoryDO::getSort)); |
| | | } |
| | | |
| | | default List<MdmItemCategoryDO> selectList(MdmItemCategoryDO reqVO) { |
| | | return selectList(new LambdaQueryWrapperX<MdmItemCategoryDO>() |
| | | .likeIfPresent(MdmItemCategoryDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MdmItemCategoryDO::getName, reqVO.getName()) |
| | | .eqIfPresent(MdmItemCategoryDO::getParentId, reqVO.getParentId()) |
| | | .eqIfPresent(MdmItemCategoryDO::getItemType, reqVO.getItemType()) |
| | | .eqIfPresent(MdmItemCategoryDO::getStatus, reqVO.getStatus()) |
| | | .orderByAsc(MdmItemCategoryDO::getSort)); |
| | | } |
| | | |
| | | default MdmItemCategoryDO selectByCode(String code) { |
| | | return selectOne(MdmItemCategoryDO::getCode, code); |
| | | } |
| | | |
| | | default MdmItemCategoryDO selectByParentIdAndName(Long parentId, String name) { |
| | | return selectOne(new LambdaQueryWrapperX<MdmItemCategoryDO>() |
| | | .eq(MdmItemCategoryDO::getParentId, parentId) |
| | | .eq(MdmItemCategoryDO::getName, name)); |
| | | } |
| | | |
| | | default List<MdmItemCategoryDO> selectListByParentId(Long parentId) { |
| | | return selectList(MdmItemCategoryDO::getParentId, parentId); |
| | | } |
| | | |
| | | default Long selectCountByParentId(Long parentId) { |
| | | return selectCount(MdmItemCategoryDO::getParentId, parentId); |
| | | } |
| | | |
| | | default List<MdmItemCategoryDO> selectListByIds(Collection<Long> ids) { |
| | | return selectList(MdmItemCategoryDO::getId, ids); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.mysql.item; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * MDM ç©ææ¹æ¬¡å±æ§é
ç½® Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface MdmItemBatchConfigMapper extends BaseMapperX<MdmItemBatchConfigDO> { |
| | | |
| | | default MdmItemBatchConfigDO selectByItemId(Long itemId) { |
| | | return selectOne(MdmItemBatchConfigDO::getItemId, itemId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.mysql.item; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MDM ç©æä¸»æ°æ® Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface MdmItemMapper extends BaseMapperX<MdmItemDO> { |
| | | |
| | | default PageResult<MdmItemDO> selectPage(MdmItemPageReqVO reqVO, Collection<Long> categoryIds) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MdmItemDO>() |
| | | .likeIfPresent(MdmItemDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MdmItemDO::getName, reqVO.getName()) |
| | | .likeIfPresent(MdmItemDO::getBarCode, reqVO.getBarCode()) |
| | | .inIfPresent(MdmItemDO::getCategoryId, categoryIds) |
| | | .eqIfPresent(MdmItemDO::getItemType, reqVO.getItemType()) |
| | | .eqIfPresent(MdmItemDO::getBrandId, reqVO.getBrandId()) |
| | | .eqIfPresent(MdmItemDO::getStatus, reqVO.getStatus()) |
| | | .betweenIfPresent(MdmItemDO::getCreateTime, reqVO.getCreateTime()) |
| | | .orderByDesc(MdmItemDO::getId)); |
| | | } |
| | | |
| | | default List<MdmItemDO> selectList(MdmItemPageReqVO reqVO, Collection<Long> categoryIds) { |
| | | return selectList(new LambdaQueryWrapperX<MdmItemDO>() |
| | | .likeIfPresent(MdmItemDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MdmItemDO::getName, reqVO.getName()) |
| | | .inIfPresent(MdmItemDO::getCategoryId, categoryIds) |
| | | .eqIfPresent(MdmItemDO::getItemType, reqVO.getItemType()) |
| | | .eqIfPresent(MdmItemDO::getStatus, reqVO.getStatus()) |
| | | .orderByDesc(MdmItemDO::getId)); |
| | | } |
| | | |
| | | default MdmItemDO selectByCode(String code) { |
| | | return selectOne(MdmItemDO::getCode, code); |
| | | } |
| | | |
| | | default MdmItemDO selectByBarCode(String barCode) { |
| | | return selectOne(MdmItemDO::getBarCode, barCode); |
| | | } |
| | | |
| | | default Long selectCountByCategoryId(Long categoryId) { |
| | | return selectCount(MdmItemDO::getCategoryId, categoryId); |
| | | } |
| | | |
| | | default Long selectCountByUnitMeasureId(Long unitMeasureId) { |
| | | return selectCount(MdmItemDO::getUnitMeasureId, unitMeasureId); |
| | | } |
| | | |
| | | default Long selectCountByBrandId(Long brandId) { |
| | | return selectCount(MdmItemDO::getBrandId, brandId); |
| | | } |
| | | |
| | | default List<MdmItemDO> selectListByIds(Collection<Long> ids) { |
| | | return selectList(MdmItemDO::getId, ids); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.mysql.item; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemSkuDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MDM ç©æ SKU Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface MdmItemSkuMapper extends BaseMapperX<MdmItemSkuDO> { |
| | | |
| | | default MdmItemSkuDO selectByCode(String code) { |
| | | return selectOne(MdmItemSkuDO::getCode, code); |
| | | } |
| | | |
| | | default MdmItemSkuDO selectByBarCode(String barCode) { |
| | | return selectOne(MdmItemSkuDO::getBarCode, barCode); |
| | | } |
| | | |
| | | default List<MdmItemSkuDO> selectListByItemId(Long itemId) { |
| | | return selectList(new LambdaQueryWrapperX<MdmItemSkuDO>() |
| | | .eq(MdmItemSkuDO::getItemId, itemId) |
| | | .orderByAsc(MdmItemSkuDO::getId)); |
| | | } |
| | | |
| | | default List<MdmItemSkuDO> selectListByItemIds(Collection<Long> itemIds) { |
| | | return selectList(MdmItemSkuDO::getItemId, itemIds); |
| | | } |
| | | |
| | | default int deleteByItemId(Long itemId) { |
| | | return delete(MdmItemSkuDO::getItemId, itemId); |
| | | } |
| | | |
| | | default long selectCountByItemId(Long itemId) { |
| | | return selectCount(MdmItemSkuDO::getItemId, itemId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.mysql.unit; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasurePageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MDM 计éåä½ Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface MdmUnitMeasureMapper extends BaseMapperX<MdmUnitMeasureDO> { |
| | | |
| | | default PageResult<MdmUnitMeasureDO> selectPage(MdmUnitMeasurePageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MdmUnitMeasureDO>() |
| | | .likeIfPresent(MdmUnitMeasureDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MdmUnitMeasureDO::getName, reqVO.getName()) |
| | | .eqIfPresent(MdmUnitMeasureDO::getStatus, reqVO.getStatus()) |
| | | .betweenIfPresent(MdmUnitMeasureDO::getCreateTime, reqVO.getCreateTime()) |
| | | .orderByDesc(MdmUnitMeasureDO::getId)); |
| | | } |
| | | |
| | | default List<MdmUnitMeasureDO> selectList(MdmUnitMeasureDO reqVO) { |
| | | return selectList(new LambdaQueryWrapperX<MdmUnitMeasureDO>() |
| | | .likeIfPresent(MdmUnitMeasureDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MdmUnitMeasureDO::getName, reqVO.getName()) |
| | | .eqIfPresent(MdmUnitMeasureDO::getStatus, reqVO.getStatus()) |
| | | .orderByDesc(MdmUnitMeasureDO::getId)); |
| | | } |
| | | |
| | | default MdmUnitMeasureDO selectByCode(String code) { |
| | | return selectOne(MdmUnitMeasureDO::getCode, code); |
| | | } |
| | | |
| | | default MdmUnitMeasureDO selectByName(String name) { |
| | | return selectOne(MdmUnitMeasureDO::getName, name); |
| | | } |
| | | |
| | | default List<MdmUnitMeasureDO> selectListByIds(Collection<Long> ids) { |
| | | return selectList(MdmUnitMeasureDO::getId, ids); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.dal.mysql.warehouse; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.warehouse.vo.MdmWarehousePageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.warehouse.MdmWarehouseDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MDM ä»åº Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface MdmWarehouseMapper extends BaseMapperX<MdmWarehouseDO> { |
| | | |
| | | default PageResult<MdmWarehouseDO> selectPage(MdmWarehousePageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MdmWarehouseDO>() |
| | | .likeIfPresent(MdmWarehouseDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MdmWarehouseDO::getName, reqVO.getName()) |
| | | .eqIfPresent(MdmWarehouseDO::getType, reqVO.getType()) |
| | | .eqIfPresent(MdmWarehouseDO::getStatus, reqVO.getStatus()) |
| | | .betweenIfPresent(MdmWarehouseDO::getCreateTime, reqVO.getCreateTime()) |
| | | .orderByDesc(MdmWarehouseDO::getId)); |
| | | } |
| | | |
| | | default List<MdmWarehouseDO> selectList(MdmWarehouseDO reqVO) { |
| | | return selectList(new LambdaQueryWrapperX<MdmWarehouseDO>() |
| | | .likeIfPresent(MdmWarehouseDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MdmWarehouseDO::getName, reqVO.getName()) |
| | | .eqIfPresent(MdmWarehouseDO::getType, reqVO.getType()) |
| | | .eqIfPresent(MdmWarehouseDO::getStatus, reqVO.getStatus()) |
| | | .orderByDesc(MdmWarehouseDO::getId)); |
| | | } |
| | | |
| | | default MdmWarehouseDO selectByCode(String code) { |
| | | return selectOne(MdmWarehouseDO::getCode, code); |
| | | } |
| | | |
| | | default MdmWarehouseDO selectByName(String name) { |
| | | return selectOne(MdmWarehouseDO::getName, name); |
| | | } |
| | | |
| | | default List<MdmWarehouseDO> selectListByIds(Collection<Long> ids) { |
| | | return selectList(MdmWarehouseDO::getId, ids); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.exception.ErrorCode; |
| | | |
| | | /** |
| | | * MDM éè¯¯ç æä¸¾ç±» |
| | | * |
| | | * mdm 模åï¼ä½¿ç¨ 1-050-000 段 |
| | | */ |
| | | public interface ErrorCodeConstants { |
| | | |
| | | // ========== ç©æç¸å
³ 1-050-001 ~ 1-050-050 ========== |
| | | ErrorCode MDM_ITEM_NOT_EXISTS = new ErrorCode(1_050_001, "ç©æä¸åå¨"); |
| | | ErrorCode MDM_ITEM_IS_DISABLE = new ErrorCode(1_050_002, "ç©æå·²ç¦ç¨"); |
| | | ErrorCode MDM_ITEM_CODE_DUPLICATE = new ErrorCode(1_050_003, "ç©æç¼ç å·²åå¨"); |
| | | ErrorCode MDM_ITEM_SKU_NOT_EXISTS = new ErrorCode(1_050_004, "ç©æSKUä¸åå¨"); |
| | | ErrorCode MDM_ITEM_SKU_IS_DISABLE = new ErrorCode(1_050_005, "ç©æSKUå·²ç¦ç¨"); |
| | | ErrorCode MDM_ITEM_SKU_CODE_DUPLICATE = new ErrorCode(1_050_006, "SKUç¼ç å·²åå¨"); |
| | | |
| | | // ========== ç©æåç±»ç¸å
³ 1-050-051 ~ 1-050-100 ========== |
| | | ErrorCode MDM_ITEM_CATEGORY_NOT_EXISTS = new ErrorCode(1_050_051, "ç©æåç±»ä¸åå¨"); |
| | | ErrorCode MDM_ITEM_CATEGORY_CODE_DUPLICATE = new ErrorCode(1_050_052, "ç©æåç±»ç¼ç å·²åå¨"); |
| | | ErrorCode MDM_ITEM_CATEGORY_NAME_DUPLICATE = new ErrorCode(1_050_053, "ç©æåç±»åç§°å·²åå¨"); |
| | | ErrorCode MDM_ITEM_CATEGORY_PARENT_NOT_EXISTS = new ErrorCode(1_050_054, "ç¶åç±»ä¸åå¨"); |
| | | ErrorCode MDM_ITEM_CATEGORY_EXISTS_CHILDREN = new ErrorCode(1_050_055, "åå¨ååç±»ï¼æ æ³å é¤"); |
| | | ErrorCode MDM_ITEM_CATEGORY_EXISTS_ITEM = new ErrorCode(1_050_056, "åç±»ä¸åå¨ç©æï¼æ æ³å é¤"); |
| | | |
| | | // ========== 计éåä½ç¸å
³ 1-050-101 ~ 1-050-150 ========== |
| | | ErrorCode MDM_UNIT_MEASURE_NOT_EXISTS = new ErrorCode(1_050_101, "计éåä½ä¸åå¨"); |
| | | ErrorCode MDM_UNIT_MEASURE_CODE_DUPLICATE = new ErrorCode(1_050_102, "计éåä½ç¼ç å·²åå¨"); |
| | | ErrorCode MDM_UNIT_MEASURE_NAME_DUPLICATE = new ErrorCode(1_050_103, "计éåä½åç§°å·²åå¨"); |
| | | ErrorCode MDM_UNIT_MEASURE_EXISTS_ITEM = new ErrorCode(1_050_104, "计éåä½è¢«ç©æä½¿ç¨ï¼æ æ³å é¤"); |
| | | |
| | | // ========== åçç¸å
³ 1-050-151 ~ 1-050-200 ========== |
| | | ErrorCode MDM_BRAND_NOT_EXISTS = new ErrorCode(1_050_151, "åçä¸åå¨"); |
| | | ErrorCode MDM_BRAND_CODE_DUPLICATE = new ErrorCode(1_050_152, "åçç¼ç å·²åå¨"); |
| | | ErrorCode MDM_BRAND_NAME_DUPLICATE = new ErrorCode(1_050_153, "åçåç§°å·²åå¨"); |
| | | ErrorCode MDM_BRAND_EXISTS_ITEM = new ErrorCode(1_050_154, "åçè¢«ç©æä½¿ç¨ï¼æ æ³å é¤"); |
| | | |
| | | // ========== ä»åºç¸å
³ 1-050-201 ~ 1-050-250 ========== |
| | | ErrorCode MDM_WAREHOUSE_NOT_EXISTS = new ErrorCode(1_050_201, "ä»åºä¸åå¨"); |
| | | ErrorCode MDM_WAREHOUSE_CODE_DUPLICATE = new ErrorCode(1_050_202, "ä»åºç¼ç å·²åå¨"); |
| | | ErrorCode MDM_WAREHOUSE_NAME_DUPLICATE = new ErrorCode(1_050_203, "ä»åºåç§°å·²åå¨"); |
| | | ErrorCode MDM_WAREHOUSE_IS_DISABLE = new ErrorCode(1_050_204, "ä»åºå·²ç¦ç¨"); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.enums; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * MDM ç©æç±»åæä¸¾ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum MdmItemTypeEnum { |
| | | |
| | | RAW_MATERIAL(1, "åæ"), |
| | | SEMI_FINISHED(2, "åæå"), |
| | | FINISHED(3, "æå"), |
| | | AUXILIARY(4, "è¾
æ"); |
| | | |
| | | /** |
| | | * ç±»åç¼ç |
| | | */ |
| | | private final Integer type; |
| | | |
| | | /** |
| | | * ç±»ååç§° |
| | | */ |
| | | private final String name; |
| | | |
| | | /** |
| | | * æ ¹æ®ç±»åç¼ç è·åæä¸¾ |
| | | */ |
| | | public static MdmItemTypeEnum fromType(Integer type) { |
| | | for (MdmItemTypeEnum value : values()) { |
| | | if (value.getType().equals(type)) { |
| | | return value; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.brand; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.brand.vo.MdmBrandPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.brand.vo.MdmBrandSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.brand.MdmBrandDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| | | |
| | | /** |
| | | * MDM åç Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmBrandService { |
| | | |
| | | /** |
| | | * å建åç |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return ç¼å· |
| | | */ |
| | | Long createBrand(@Valid MdmBrandSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°åç |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateBrand(@Valid MdmBrandSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * æ´æ°åçç¶æ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param status ç¶æ |
| | | */ |
| | | void updateBrandStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * å é¤åç |
| | | * |
| | | * @param id ç¼å· |
| | | */ |
| | | void deleteBrand(Long id); |
| | | |
| | | /** |
| | | * è·å¾åç |
| | | * |
| | | * @param id ç¼å· |
| | | * @return åç |
| | | */ |
| | | MdmBrandDO getBrand(Long id); |
| | | |
| | | /** |
| | | * æ ¡éªåçåå¨ |
| | | * |
| | | * @param id ç¼å· |
| | | * @return åç |
| | | */ |
| | | MdmBrandDO validateBrandExists(Long id); |
| | | |
| | | /** |
| | | * è·å¾åçå页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return åçå页 |
| | | */ |
| | | PageResult<MdmBrandDO> getBrandPage(MdmBrandPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾åçå表 |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | | * @return åçå表 |
| | | */ |
| | | List<MdmBrandDO> getBrandList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾åç Map |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | | * @return åç Map |
| | | */ |
| | | default Map<Long, MdmBrandDO> getBrandMap(Collection<Long> ids) { |
| | | return convertMap(getBrandList(ids), MdmBrandDO::getId); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®ç¼ç è·ååç |
| | | * |
| | | * @param code åçç¼ç |
| | | * @return åç |
| | | */ |
| | | MdmBrandDO getBrandByCode(String code); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.brand; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.brand.vo.MdmBrandPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.brand.vo.MdmBrandSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.brand.MdmBrandDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.brand.MdmBrandMapper; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.*; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.mdm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * MDM åç Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class MdmBrandServiceImpl implements MdmBrandService { |
| | | |
| | | @Resource |
| | | private MdmBrandMapper brandMapper; |
| | | |
| | | @Resource |
| | | private MdmItemMapper itemMapper; |
| | | |
| | | @Override |
| | | public Long createBrand(MdmBrandSaveReqVO createReqVO) { |
| | | // æ ¡éªæ°æ® |
| | | validateBrandSaveData(createReqVO); |
| | | |
| | | // æå
¥ |
| | | MdmBrandDO brand = BeanUtils.toBean(createReqVO, MdmBrandDO.class); |
| | | brandMapper.insert(brand); |
| | | return brand.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateBrand(MdmBrandSaveReqVO updateReqVO) { |
| | | // æ ¡éªåå¨ |
| | | validateBrandExists(updateReqVO.getId()); |
| | | // æ ¡éªæ°æ® |
| | | validateBrandSaveData(updateReqVO); |
| | | |
| | | // æ´æ° |
| | | MdmBrandDO updateObj = BeanUtils.toBean(updateReqVO, MdmBrandDO.class); |
| | | brandMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void updateBrandStatus(Long id, Integer status) { |
| | | // æ ¡éªåå¨ |
| | | validateBrandExists(id); |
| | | // æ´æ°ç¶æ |
| | | brandMapper.updateById(new MdmBrandDO().setId(id).setStatus(status)); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteBrand(Long id) { |
| | | // æ ¡éªåå¨ |
| | | validateBrandExists(id); |
| | | // æ ¡éªæ¯å¦è¢«ç©æä½¿ç¨ï¼ç´æ¥ä½¿ç¨ Mapper é¿å
循ç¯ä¾èµï¼ |
| | | if (itemMapper.selectCountByBrandId(id) > 0) { |
| | | throw exception(MDM_BRAND_EXISTS_ITEM); |
| | | } |
| | | // å é¤ |
| | | brandMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | public MdmBrandDO validateBrandExists(Long id) { |
| | | MdmBrandDO brand = brandMapper.selectById(id); |
| | | if (brand == null) { |
| | | throw exception(MDM_BRAND_NOT_EXISTS); |
| | | } |
| | | return brand; |
| | | } |
| | | |
| | | private void validateBrandSaveData(MdmBrandSaveReqVO reqVO) { |
| | | // æ ¡éªç¼ç å¯ä¸ |
| | | MdmBrandDO brand = brandMapper.selectByCode(reqVO.getCode()); |
| | | if (brand != null && ObjUtil.notEqual(brand.getId(), reqVO.getId())) { |
| | | throw exception(MDM_BRAND_CODE_DUPLICATE); |
| | | } |
| | | // æ ¡éªåç§°å¯ä¸ |
| | | MdmBrandDO sameName = brandMapper.selectByName(reqVO.getName()); |
| | | if (sameName != null && ObjUtil.notEqual(sameName.getId(), reqVO.getId())) { |
| | | throw exception(MDM_BRAND_NAME_DUPLICATE); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public MdmBrandDO getBrand(Long id) { |
| | | return brandMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<MdmBrandDO> getBrandPage(MdmBrandPageReqVO pageReqVO) { |
| | | return brandMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public List<MdmBrandDO> getBrandList(Collection<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return brandMapper.selectBatchIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | public MdmBrandDO getBrandByCode(String code) { |
| | | return brandMapper.selectByCode(code); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.category; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.category.vo.MdmItemCategoryPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.category.vo.MdmItemCategorySaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| | | |
| | | /** |
| | | * MDM ç©æåç±» Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmItemCategoryService { |
| | | |
| | | /** |
| | | * åå»ºç©æåç±» |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return ç¼å· |
| | | */ |
| | | Long createItemCategory(@Valid MdmItemCategorySaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°ç©æåç±» |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateItemCategory(@Valid MdmItemCategorySaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * æ´æ°ç©æåç±»ç¶æ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param status ç¶æ |
| | | */ |
| | | void updateItemCategoryStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * å é¤ç©æåç±» |
| | | * |
| | | * @param id ç¼å· |
| | | */ |
| | | void deleteItemCategory(Long id); |
| | | |
| | | /** |
| | | * è·å¾ç©æåç±» |
| | | * |
| | | * @param id ç¼å· |
| | | * @return ç©æåç±» |
| | | */ |
| | | MdmItemCategoryDO getItemCategory(Long id); |
| | | |
| | | /** |
| | | * æ ¡éªç©æåç±»åå¨ |
| | | * |
| | | * @param id ç¼å· |
| | | * @return ç©æåç±» |
| | | */ |
| | | MdmItemCategoryDO validateItemCategoryExists(Long id); |
| | | |
| | | /** |
| | | * è·å¾ç©æåç±»å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return ç©æåç±»å页 |
| | | */ |
| | | PageResult<MdmItemCategoryDO> getItemCategoryPage(MdmItemCategoryPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾ç©æåç±»å表 |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | | * @return ç©æåç±»å表 |
| | | */ |
| | | List<MdmItemCategoryDO> getItemCategoryList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾ç©æåç±» Map |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | | * @return ç©æåç±» Map |
| | | */ |
| | | default Map<Long, MdmItemCategoryDO> getItemCategoryMap(Collection<Long> ids) { |
| | | return convertMap(getItemCategoryList(ids), MdmItemCategoryDO::getId); |
| | | } |
| | | |
| | | /** |
| | | * è·å¾æå®åç±»çååç±»å表ï¼å
å«èªå·±ï¼ |
| | | * |
| | | * @param id åç±»ç¼å· |
| | | * @return ååç±»å表 |
| | | */ |
| | | List<MdmItemCategoryDO> getItemCategoryChildrenList(Long id); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.category; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.category.vo.MdmItemCategoryPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.category.vo.MdmItemCategorySaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.category.MdmItemCategoryMapper; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.*; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.mdm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * MDM ç©æåç±» Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class MdmItemCategoryServiceImpl implements MdmItemCategoryService { |
| | | |
| | | @Resource |
| | | private MdmItemCategoryMapper itemCategoryMapper; |
| | | |
| | | @Resource |
| | | private MdmItemMapper itemMapper; |
| | | |
| | | @Override |
| | | public Long createItemCategory(MdmItemCategorySaveReqVO createReqVO) { |
| | | // æ ¡éªæ°æ® |
| | | validateItemCategorySaveData(createReqVO); |
| | | |
| | | // æå
¥ |
| | | MdmItemCategoryDO itemCategory = BeanUtils.toBean(createReqVO, MdmItemCategoryDO.class); |
| | | itemCategoryMapper.insert(itemCategory); |
| | | return itemCategory.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateItemCategory(MdmItemCategorySaveReqVO updateReqVO) { |
| | | // æ ¡éªåå¨ |
| | | validateItemCategoryExists(updateReqVO.getId()); |
| | | // æ ¡éªæ°æ® |
| | | validateItemCategorySaveData(updateReqVO); |
| | | |
| | | // æ´æ° |
| | | MdmItemCategoryDO updateObj = BeanUtils.toBean(updateReqVO, MdmItemCategoryDO.class); |
| | | itemCategoryMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void updateItemCategoryStatus(Long id, Integer status) { |
| | | // æ ¡éªåå¨ |
| | | validateItemCategoryExists(id); |
| | | // æ´æ°ç¶æ |
| | | itemCategoryMapper.updateById(new MdmItemCategoryDO().setId(id).setStatus(status)); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteItemCategory(Long id) { |
| | | // æ ¡éªåå¨ |
| | | validateItemCategoryExists(id); |
| | | // æ ¡éªæ¯å¦æååç±» |
| | | if (itemCategoryMapper.selectCountByParentId(id) > 0) { |
| | | throw exception(MDM_ITEM_CATEGORY_EXISTS_CHILDREN); |
| | | } |
| | | // æ ¡éªåç±»ä¸æ¯å¦æç©æï¼ç´æ¥ä½¿ç¨ Mapper é¿å
循ç¯ä¾èµï¼ |
| | | if (itemMapper.selectCountByCategoryId(id) > 0) { |
| | | throw exception(MDM_ITEM_CATEGORY_EXISTS_ITEM); |
| | | } |
| | | // å é¤ |
| | | itemCategoryMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | public MdmItemCategoryDO validateItemCategoryExists(Long id) { |
| | | MdmItemCategoryDO itemCategory = itemCategoryMapper.selectById(id); |
| | | if (itemCategory == null) { |
| | | throw exception(MDM_ITEM_CATEGORY_NOT_EXISTS); |
| | | } |
| | | return itemCategory; |
| | | } |
| | | |
| | | private void validateItemCategorySaveData(MdmItemCategorySaveReqVO reqVO) { |
| | | // æ ¡éªç¼ç å¯ä¸ |
| | | MdmItemCategoryDO category = itemCategoryMapper.selectByCode(reqVO.getCode()); |
| | | if (category != null && ObjUtil.notEqual(category.getId(), reqVO.getId())) { |
| | | throw exception(MDM_ITEM_CATEGORY_CODE_DUPLICATE); |
| | | } |
| | | // æ ¡éªåä¸ç¶çº§ä¸åç§°å¯ä¸ |
| | | MdmItemCategoryDO sameName = itemCategoryMapper.selectByParentIdAndName( |
| | | reqVO.getParentId() != null ? reqVO.getParentId() : 0L, reqVO.getName()); |
| | | if (sameName != null && ObjUtil.notEqual(sameName.getId(), reqVO.getId())) { |
| | | throw exception(MDM_ITEM_CATEGORY_NAME_DUPLICATE); |
| | | } |
| | | // æ ¡éªç¶åç±»åå¨ |
| | | if (reqVO.getParentId() != null && reqVO.getParentId() > 0) { |
| | | if (itemCategoryMapper.selectById(reqVO.getParentId()) == null) { |
| | | throw exception(MDM_ITEM_CATEGORY_PARENT_NOT_EXISTS); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public MdmItemCategoryDO getItemCategory(Long id) { |
| | | return itemCategoryMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<MdmItemCategoryDO> getItemCategoryPage(MdmItemCategoryPageReqVO pageReqVO) { |
| | | return itemCategoryMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public List<MdmItemCategoryDO> getItemCategoryList(Collection<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return itemCategoryMapper.selectBatchIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | public List<MdmItemCategoryDO> getItemCategoryChildrenList(Long id) { |
| | | List<MdmItemCategoryDO> result = new ArrayList<>(); |
| | | // æ·»å èªå·± |
| | | MdmItemCategoryDO self = itemCategoryMapper.selectById(id); |
| | | if (self != null) { |
| | | result.add(self); |
| | | } |
| | | // éå½è·åææååç±» |
| | | loadChildren(id, result); |
| | | return result; |
| | | } |
| | | |
| | | private void loadChildren(Long parentId, List<MdmItemCategoryDO> result) { |
| | | List<MdmItemCategoryDO> children = itemCategoryMapper.selectListByParentId(parentId); |
| | | if (CollUtil.isNotEmpty(children)) { |
| | | result.addAll(children); |
| | | for (MdmItemCategoryDO child : children) { |
| | | loadChildren(child.getId(), result); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.item; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| | | |
| | | /** |
| | | * MDM ç©æä¸»æ°æ® Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmItemService { |
| | | |
| | | /** |
| | | * åå»ºç©æ |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return ç¼å· |
| | | */ |
| | | Long createItem(@Valid MdmItemSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°ç©æ |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateItem(@Valid MdmItemSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * æ´æ°ç©æç¶æ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param status ç¶æ |
| | | */ |
| | | void updateItemStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * å é¤ç©æ |
| | | * |
| | | * @param id ç¼å· |
| | | */ |
| | | void deleteItem(Long id); |
| | | |
| | | /** |
| | | * è·å¾ç©æ |
| | | * |
| | | * @param id ç¼å· |
| | | * @return ç©æ |
| | | */ |
| | | MdmItemDO getItem(Long id); |
| | | |
| | | /** |
| | | * æ ¡éªç©æåå¨ |
| | | * |
| | | * @param id ç¼å· |
| | | * @return ç©æ |
| | | */ |
| | | MdmItemDO validateItemExists(Long id); |
| | | |
| | | /** |
| | | * æ ¡éªç©æåå¨ä¸å¯ç¨ |
| | | * |
| | | * @param id ç¼å· |
| | | * @return ç©æ |
| | | */ |
| | | MdmItemDO validateItemExistsAndEnable(Long id); |
| | | |
| | | /** |
| | | * è·å¾ç©æå页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return ç©æå页 |
| | | */ |
| | | PageResult<MdmItemDO> getItemPage(MdmItemPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾ç©æå表 |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | | * @return ç©æå表 |
| | | */ |
| | | List<MdmItemDO> getItemList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾ç©æ Map |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | | * @return ç©æ Map |
| | | */ |
| | | default Map<Long, MdmItemDO> getItemMap(Collection<Long> ids) { |
| | | return convertMap(getItemList(ids), MdmItemDO::getId); |
| | | } |
| | | |
| | | /** |
| | | * åºäºç©æåç±»ç¼å·ï¼è·å¾ç©ææ°é |
| | | * |
| | | * @param categoryId ç©æåç±»ç¼å· |
| | | * @return ç©ææ°é |
| | | */ |
| | | Long getItemCountByCategoryId(Long categoryId); |
| | | |
| | | /** |
| | | * åºäºè®¡éåä½ç¼å·ï¼è·å¾ç©ææ°é |
| | | * |
| | | * @param unitMeasureId 计éåä½ç¼å· |
| | | * @return ç©ææ°é |
| | | */ |
| | | Long getItemCountByUnitMeasureId(Long unitMeasureId); |
| | | |
| | | /** |
| | | * åºäºåçç¼å·ï¼è·å¾ç©ææ°é |
| | | * |
| | | * @param brandId åçç¼å· |
| | | * @return ç©ææ°é |
| | | */ |
| | | Long getItemCountByBrandId(Long brandId); |
| | | |
| | | /** |
| | | * æ ¹æ®ç¼ç è·åç©æ |
| | | * |
| | | * @param code ç©æç¼ç |
| | | * @return ç©æ |
| | | */ |
| | | MdmItemDO getItemByCode(String code); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.item; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemMapper; |
| | | import cn.iocoder.yudao.module.mdm.service.category.MdmItemCategoryService; |
| | | import cn.iocoder.yudao.module.mdm.service.unit.MdmUnitMeasureService; |
| | | import cn.iocoder.yudao.module.mdm.service.brand.MdmBrandService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.*; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.module.mdm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * MDM ç©æä¸»æ°æ® Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class MdmItemServiceImpl implements MdmItemService { |
| | | |
| | | @Resource |
| | | private MdmItemMapper itemMapper; |
| | | |
| | | @Resource |
| | | private MdmItemCategoryService itemCategoryService; |
| | | @Resource |
| | | private MdmUnitMeasureService unitMeasureService; |
| | | @Resource |
| | | private MdmBrandService brandService; |
| | | |
| | | @Override |
| | | public Long createItem(MdmItemSaveReqVO createReqVO) { |
| | | // æ ¡éªæ°æ® |
| | | validateItemSaveData(createReqVO); |
| | | |
| | | // æå
¥ |
| | | MdmItemDO item = BeanUtils.toBean(createReqVO, MdmItemDO.class); |
| | | itemMapper.insert(item); |
| | | return item.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateItem(MdmItemSaveReqVO updateReqVO) { |
| | | // æ ¡éªåå¨ |
| | | validateItemExists(updateReqVO.getId()); |
| | | // æ ¡éªæ°æ® |
| | | validateItemSaveData(updateReqVO); |
| | | |
| | | // æ´æ° |
| | | MdmItemDO updateObj = BeanUtils.toBean(updateReqVO, MdmItemDO.class); |
| | | itemMapper.updateById(updateObj); |
| | | } |
| | | |
| | | private void validateItemSaveData(MdmItemSaveReqVO reqVO) { |
| | | // æ ¡éªç©æç¼ç çå¯ä¸æ§ |
| | | validateItemCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | // æ ¡éªç©æåç±»åå¨ |
| | | validateCategoryExists(reqVO.getCategoryId()); |
| | | // æ ¡éªè®¡éåä½åå¨ |
| | | validateUnitMeasureExists(reqVO.getUnitMeasureId()); |
| | | // æ ¡éªåçåå¨ï¼å¦ææï¼ |
| | | if (reqVO.getBrandId() != null) { |
| | | validateBrandExists(reqVO.getBrandId()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void updateItemStatus(Long id, Integer status) { |
| | | // æ ¡éªåå¨ |
| | | validateItemExists(id); |
| | | // æ´æ°ç¶æ |
| | | itemMapper.updateById(new MdmItemDO().setId(id).setStatus(status)); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteItem(Long id) { |
| | | // æ ¡éªåå¨ |
| | | validateItemExists(id); |
| | | // å é¤ |
| | | itemMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | public MdmItemDO validateItemExists(Long id) { |
| | | MdmItemDO item = itemMapper.selectById(id); |
| | | if (item == null) { |
| | | throw exception(MDM_ITEM_NOT_EXISTS); |
| | | } |
| | | return item; |
| | | } |
| | | |
| | | @Override |
| | | public MdmItemDO validateItemExistsAndEnable(Long id) { |
| | | MdmItemDO item = validateItemExists(id); |
| | | if (ObjUtil.notEqual(cn.iocoder.yudao.framework.common.enums.CommonStatusEnum.ENABLE.getStatus(), item.getStatus())) { |
| | | throw exception(MDM_ITEM_IS_DISABLE); |
| | | } |
| | | return item; |
| | | } |
| | | |
| | | private void validateItemCodeUnique(Long id, String code) { |
| | | MdmItemDO item = itemMapper.selectByCode(code); |
| | | if (item == null) { |
| | | return; |
| | | } |
| | | if (ObjUtil.notEqual(item.getId(), id)) { |
| | | throw exception(MDM_ITEM_CODE_DUPLICATE); |
| | | } |
| | | } |
| | | |
| | | private void validateCategoryExists(Long categoryId) { |
| | | if (itemCategoryService.getItemCategory(categoryId) == null) { |
| | | throw exception(MDM_ITEM_CATEGORY_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | private void validateUnitMeasureExists(Long unitMeasureId) { |
| | | if (unitMeasureService.getUnitMeasure(unitMeasureId) == null) { |
| | | throw exception(MDM_UNIT_MEASURE_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | private void validateBrandExists(Long brandId) { |
| | | if (brandService.getBrand(brandId) == null) { |
| | | throw exception(MDM_BRAND_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public MdmItemDO getItem(Long id) { |
| | | return itemMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<MdmItemDO> getItemPage(MdmItemPageReqVO pageReqVO) { |
| | | // æ¥æ¾æ¶ï¼å¦ææ¥æ¾æä¸ªåç±»ç¼å·ï¼åå
å«å®çååç±» |
| | | Set<Long> categoryIds = null; |
| | | if (pageReqVO.getCategoryId() != null) { |
| | | categoryIds = new HashSet<>(); |
| | | categoryIds.add(pageReqVO.getCategoryId()); |
| | | List<cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO> children = |
| | | itemCategoryService.getItemCategoryChildrenList(pageReqVO.getCategoryId()); |
| | | categoryIds.addAll(convertSet(children, cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO::getId)); |
| | | } |
| | | // å页æ¥è¯¢ |
| | | return itemMapper.selectPage(pageReqVO, categoryIds); |
| | | } |
| | | |
| | | @Override |
| | | public List<MdmItemDO> getItemList(Collection<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return itemMapper.selectBatchIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | public Long getItemCountByCategoryId(Long categoryId) { |
| | | return itemMapper.selectCountByCategoryId(categoryId); |
| | | } |
| | | |
| | | @Override |
| | | public Long getItemCountByUnitMeasureId(Long unitMeasureId) { |
| | | return itemMapper.selectCountByUnitMeasureId(unitMeasureId); |
| | | } |
| | | |
| | | @Override |
| | | public Long getItemCountByBrandId(Long brandId) { |
| | | return itemMapper.selectCountByBrandId(brandId); |
| | | } |
| | | |
| | | @Override |
| | | public MdmItemDO getItemByCode(String code) { |
| | | return itemMapper.selectByCode(code); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.item; |
| | | |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemSkuDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| | | |
| | | /** |
| | | * MDM ç©æ SKU Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmItemSkuService { |
| | | |
| | | /** |
| | | * å建 SKU |
| | | * |
| | | * @param sku åå»ºä¿¡æ¯ |
| | | * @return ç¼å· |
| | | */ |
| | | Long createItemSku(@Valid MdmItemSkuDO sku); |
| | | |
| | | /** |
| | | * æ¹éå建 SKU |
| | | * |
| | | * @param itemId ç©æç¼å· |
| | | * @param skuList SKU å表 |
| | | */ |
| | | void createItemSkuList(Long itemId, List<MdmItemSkuDO> skuList); |
| | | |
| | | /** |
| | | * æ´æ° SKU |
| | | * |
| | | * @param sku æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateItemSku(@Valid MdmItemSkuDO sku); |
| | | |
| | | /** |
| | | * æ¹éæ´æ° SKU |
| | | * |
| | | * @param itemId ç©æç¼å· |
| | | * @param skuList SKU å表 |
| | | */ |
| | | void updateItemSkuList(Long itemId, List<MdmItemSkuDO> skuList); |
| | | |
| | | /** |
| | | * å é¤ SKU |
| | | * |
| | | * @param id ç¼å· |
| | | */ |
| | | void deleteItemSku(Long id); |
| | | |
| | | /** |
| | | * å é¤ç©æçææ SKU |
| | | * |
| | | * @param itemId ç©æç¼å· |
| | | */ |
| | | void deleteItemSkuListByItemId(Long itemId); |
| | | |
| | | /** |
| | | * è·å¾ SKU |
| | | * |
| | | * @param id ç¼å· |
| | | * @return SKU |
| | | */ |
| | | MdmItemSkuDO getItemSku(Long id); |
| | | |
| | | /** |
| | | * æ ¡éª SKU åå¨ |
| | | * |
| | | * @param id ç¼å· |
| | | * @return SKU |
| | | */ |
| | | MdmItemSkuDO validateItemSkuExists(Long id); |
| | | |
| | | /** |
| | | * æ ¡éª SKU åå¨ä¸å¯ç¨ |
| | | * |
| | | * @param id ç¼å· |
| | | * @return SKU |
| | | */ |
| | | MdmItemSkuDO validateItemSkuExistsAndEnable(Long id); |
| | | |
| | | /** |
| | | * è·å¾ç©æç SKU å表 |
| | | * |
| | | * @param itemId ç©æç¼å· |
| | | * @return SKU å表 |
| | | */ |
| | | List<MdmItemSkuDO> getItemSkuListByItemId(Long itemId); |
| | | |
| | | /** |
| | | * è·å¾ SKU å表 |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | | * @return SKU å表 |
| | | */ |
| | | List<MdmItemSkuDO> getItemSkuList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾ SKU Map |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | | * @return SKU Map |
| | | */ |
| | | default Map<Long, MdmItemSkuDO> getItemSkuMap(Collection<Long> ids) { |
| | | return convertMap(getItemSkuList(ids), MdmItemSkuDO::getId); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®ç¼ç è·å SKU |
| | | * |
| | | * @param code SKU ç¼ç |
| | | * @return SKU |
| | | */ |
| | | MdmItemSkuDO getItemSkuByCode(String code); |
| | | |
| | | /** |
| | | * æ ¹æ®æ¡ç è·å SKU |
| | | * |
| | | * @param barCode SKU æ¡ç |
| | | * @return SKU |
| | | */ |
| | | MdmItemSkuDO getItemSkuByBarCode(String barCode); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.item; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemSkuDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemSkuMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.*; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.mdm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * MDM ç©æ SKU Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class MdmItemSkuServiceImpl implements MdmItemSkuService { |
| | | |
| | | @Resource |
| | | private MdmItemSkuMapper itemSkuMapper; |
| | | |
| | | @Override |
| | | public Long createItemSku(MdmItemSkuDO sku) { |
| | | // æ ¡éªç¼ç å¯ä¸ |
| | | validateItemSkuCodeUnique(null, sku.getCode()); |
| | | // 设置é»è®¤ç¶æ |
| | | if (sku.getStatus() == null) { |
| | | sku.setStatus(CommonStatusEnum.ENABLE.getStatus()); |
| | | } |
| | | itemSkuMapper.insert(sku); |
| | | return sku.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void createItemSkuList(Long itemId, List<MdmItemSkuDO> skuList) { |
| | | if (CollUtil.isEmpty(skuList)) { |
| | | return; |
| | | } |
| | | for (MdmItemSkuDO sku : skuList) { |
| | | sku.setItemId(itemId); |
| | | createItemSku(sku); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void updateItemSku(MdmItemSkuDO sku) { |
| | | // æ ¡éªåå¨ |
| | | validateItemSkuExists(sku.getId()); |
| | | // æ ¡éªç¼ç å¯ä¸ |
| | | validateItemSkuCodeUnique(sku.getId(), sku.getCode()); |
| | | itemSkuMapper.updateById(sku); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateItemSkuList(Long itemId, List<MdmItemSkuDO> skuList) { |
| | | // ç¬¬ä¸æ¥ï¼å 餿§ç SKU |
| | | itemSkuMapper.deleteByItemId(itemId); |
| | | // ç¬¬äºæ¥ï¼æå
¥æ°ç SKU |
| | | if (CollUtil.isEmpty(skuList)) { |
| | | return; |
| | | } |
| | | for (MdmItemSkuDO sku : skuList) { |
| | | sku.setItemId(itemId); |
| | | sku.setId(null); // æ¸
空 IDï¼ä½ä¸ºæ°æå
¥ |
| | | if (sku.getStatus() == null) { |
| | | sku.setStatus(CommonStatusEnum.ENABLE.getStatus()); |
| | | } |
| | | itemSkuMapper.insert(sku); |
| | | } |
| | | } |
| | | |
| | | private void validateItemSkuCodeUnique(Long id, String code) { |
| | | MdmItemSkuDO sku = itemSkuMapper.selectByCode(code); |
| | | if (sku == null) { |
| | | return; |
| | | } |
| | | if (id == null || ObjUtil.notEqual(sku.getId(), id)) { |
| | | throw exception(MDM_ITEM_SKU_CODE_DUPLICATE); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void deleteItemSku(Long id) { |
| | | // æ ¡éªåå¨ |
| | | validateItemSkuExists(id); |
| | | // å é¤ |
| | | itemSkuMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteItemSkuListByItemId(Long itemId) { |
| | | itemSkuMapper.deleteByItemId(itemId); |
| | | } |
| | | |
| | | @Override |
| | | public MdmItemSkuDO validateItemSkuExists(Long id) { |
| | | MdmItemSkuDO sku = itemSkuMapper.selectById(id); |
| | | if (sku == null) { |
| | | throw exception(MDM_ITEM_SKU_NOT_EXISTS); |
| | | } |
| | | return sku; |
| | | } |
| | | |
| | | @Override |
| | | public MdmItemSkuDO validateItemSkuExistsAndEnable(Long id) { |
| | | MdmItemSkuDO sku = validateItemSkuExists(id); |
| | | if (CommonStatusEnum.isDisable(sku.getStatus())) { |
| | | throw exception(MDM_ITEM_SKU_IS_DISABLE); |
| | | } |
| | | return sku; |
| | | } |
| | | |
| | | @Override |
| | | public MdmItemSkuDO getItemSku(Long id) { |
| | | return itemSkuMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public List<MdmItemSkuDO> getItemSkuListByItemId(Long itemId) { |
| | | return itemSkuMapper.selectListByItemId(itemId); |
| | | } |
| | | |
| | | @Override |
| | | public List<MdmItemSkuDO> getItemSkuList(Collection<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return itemSkuMapper.selectBatchIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | public MdmItemSkuDO getItemSkuByCode(String code) { |
| | | return itemSkuMapper.selectByCode(code); |
| | | } |
| | | |
| | | @Override |
| | | public MdmItemSkuDO getItemSkuByBarCode(String barCode) { |
| | | return itemSkuMapper.selectByBarCode(barCode); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.unit; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasurePageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| | | |
| | | /** |
| | | * MDM 计éåä½ Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmUnitMeasureService { |
| | | |
| | | /** |
| | | * å建计éåä½ |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return ç¼å· |
| | | */ |
| | | Long createUnitMeasure(@Valid MdmUnitMeasureSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°è®¡éåä½ |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateUnitMeasure(@Valid MdmUnitMeasureSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * æ´æ°è®¡éåä½ç¶æ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param status ç¶æ |
| | | */ |
| | | void updateUnitMeasureStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * å é¤è®¡éåä½ |
| | | * |
| | | * @param id ç¼å· |
| | | */ |
| | | void deleteUnitMeasure(Long id); |
| | | |
| | | /** |
| | | * è·å¾è®¡éåä½ |
| | | * |
| | | * @param id ç¼å· |
| | | * @return 计éåä½ |
| | | */ |
| | | MdmUnitMeasureDO getUnitMeasure(Long id); |
| | | |
| | | /** |
| | | * æ ¡éªè®¡éåä½åå¨ |
| | | * |
| | | * @param id ç¼å· |
| | | * @return 计éåä½ |
| | | */ |
| | | MdmUnitMeasureDO validateUnitMeasureExists(Long id); |
| | | |
| | | /** |
| | | * è·å¾è®¡éåä½å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return 计éåä½å页 |
| | | */ |
| | | PageResult<MdmUnitMeasureDO> getUnitMeasurePage(MdmUnitMeasurePageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾è®¡éåä½å表 |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | | * @return 计éåä½å表 |
| | | */ |
| | | List<MdmUnitMeasureDO> getUnitMeasureList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾è®¡éåä½ Map |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | | * @return 计éåä½ Map |
| | | */ |
| | | default Map<Long, MdmUnitMeasureDO> getUnitMeasureMap(Collection<Long> ids) { |
| | | return convertMap(getUnitMeasureList(ids), MdmUnitMeasureDO::getId); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®ç¼ç è·å计éåä½ |
| | | * |
| | | * @param code åä½ç¼ç |
| | | * @return 计éåä½ |
| | | */ |
| | | MdmUnitMeasureDO getUnitMeasureByCode(String code); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.unit; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasurePageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemMapper; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.unit.MdmUnitMeasureMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.*; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.mdm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * MDM 计éåä½ Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class MdmUnitMeasureServiceImpl implements MdmUnitMeasureService { |
| | | |
| | | @Resource |
| | | private MdmUnitMeasureMapper unitMeasureMapper; |
| | | |
| | | @Resource |
| | | private MdmItemMapper itemMapper; |
| | | |
| | | @Override |
| | | public Long createUnitMeasure(MdmUnitMeasureSaveReqVO createReqVO) { |
| | | // æ ¡éªæ°æ® |
| | | validateUnitMeasureSaveData(createReqVO); |
| | | |
| | | // æå
¥ |
| | | MdmUnitMeasureDO unitMeasure = BeanUtils.toBean(createReqVO, MdmUnitMeasureDO.class); |
| | | unitMeasureMapper.insert(unitMeasure); |
| | | return unitMeasure.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateUnitMeasure(MdmUnitMeasureSaveReqVO updateReqVO) { |
| | | // æ ¡éªåå¨ |
| | | validateUnitMeasureExists(updateReqVO.getId()); |
| | | // æ ¡éªæ°æ® |
| | | validateUnitMeasureSaveData(updateReqVO); |
| | | |
| | | // æ´æ° |
| | | MdmUnitMeasureDO updateObj = BeanUtils.toBean(updateReqVO, MdmUnitMeasureDO.class); |
| | | unitMeasureMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void updateUnitMeasureStatus(Long id, Integer status) { |
| | | // æ ¡éªåå¨ |
| | | validateUnitMeasureExists(id); |
| | | // æ´æ°ç¶æ |
| | | unitMeasureMapper.updateById(new MdmUnitMeasureDO().setId(id).setStatus(status)); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteUnitMeasure(Long id) { |
| | | // æ ¡éªåå¨ |
| | | validateUnitMeasureExists(id); |
| | | // æ ¡éªæ¯å¦è¢«ç©æä½¿ç¨ï¼ç´æ¥ä½¿ç¨ Mapper é¿å
循ç¯ä¾èµï¼ |
| | | if (itemMapper.selectCountByUnitMeasureId(id) > 0) { |
| | | throw exception(MDM_UNIT_MEASURE_EXISTS_ITEM); |
| | | } |
| | | // å é¤ |
| | | unitMeasureMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | public MdmUnitMeasureDO validateUnitMeasureExists(Long id) { |
| | | MdmUnitMeasureDO unitMeasure = unitMeasureMapper.selectById(id); |
| | | if (unitMeasure == null) { |
| | | throw exception(MDM_UNIT_MEASURE_NOT_EXISTS); |
| | | } |
| | | return unitMeasure; |
| | | } |
| | | |
| | | private void validateUnitMeasureSaveData(MdmUnitMeasureSaveReqVO reqVO) { |
| | | // æ ¡éªç¼ç å¯ä¸ |
| | | MdmUnitMeasureDO unit = unitMeasureMapper.selectByCode(reqVO.getCode()); |
| | | if (unit != null && ObjUtil.notEqual(unit.getId(), reqVO.getId())) { |
| | | throw exception(MDM_UNIT_MEASURE_CODE_DUPLICATE); |
| | | } |
| | | // æ ¡éªåç§°å¯ä¸ |
| | | MdmUnitMeasureDO sameName = unitMeasureMapper.selectByName(reqVO.getName()); |
| | | if (sameName != null && ObjUtil.notEqual(sameName.getId(), reqVO.getId())) { |
| | | throw exception(MDM_UNIT_MEASURE_NAME_DUPLICATE); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public MdmUnitMeasureDO getUnitMeasure(Long id) { |
| | | return unitMeasureMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<MdmUnitMeasureDO> getUnitMeasurePage(MdmUnitMeasurePageReqVO pageReqVO) { |
| | | return unitMeasureMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public List<MdmUnitMeasureDO> getUnitMeasureList(Collection<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return unitMeasureMapper.selectBatchIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | public MdmUnitMeasureDO getUnitMeasureByCode(String code) { |
| | | return unitMeasureMapper.selectByCode(code); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.warehouse; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.warehouse.vo.MdmWarehousePageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.warehouse.vo.MdmWarehouseSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.warehouse.MdmWarehouseDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MDM ä»åº Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmWarehouseService { |
| | | |
| | | /** |
| | | * å建ä»åº |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return ç¼å· |
| | | */ |
| | | Long createWarehouse(@Valid MdmWarehouseSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°ä»åº |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateWarehouse(@Valid MdmWarehouseSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * æ´æ°ä»åºç¶æ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param status ç¶æ |
| | | */ |
| | | void updateWarehouseStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * å é¤ä»åº |
| | | * |
| | | * @param id ç¼å· |
| | | */ |
| | | void deleteWarehouse(Long id); |
| | | |
| | | /** |
| | | * è·å¾ä»åº |
| | | * |
| | | * @param id ç¼å· |
| | | * @return ä»åº |
| | | */ |
| | | MdmWarehouseDO getWarehouse(Long id); |
| | | |
| | | /** |
| | | * æ ¡éªä»åºåå¨ |
| | | * |
| | | * @param id ç¼å· |
| | | * @return ä»åº |
| | | */ |
| | | MdmWarehouseDO validateWarehouseExists(Long id); |
| | | |
| | | /** |
| | | * æ ¡éªä»åºåå¨ä¸å¯ç¨ |
| | | * |
| | | * @param id ç¼å· |
| | | * @return ä»åº |
| | | */ |
| | | MdmWarehouseDO validateWarehouseExistsAndEnable(Long id); |
| | | |
| | | /** |
| | | * è·å¾ä»åºå页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return ä»åºå页 |
| | | */ |
| | | PageResult<MdmWarehouseDO> getWarehousePage(MdmWarehousePageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾ä»åºå表 |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | | * @return ä»åºå表 |
| | | */ |
| | | List<MdmWarehouseDO> getWarehouseList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * æ ¹æ®ç¼ç è·åä»åº |
| | | * |
| | | * @param code ä»åºç¼ç |
| | | * @return ä»åº |
| | | */ |
| | | MdmWarehouseDO getWarehouseByCode(String code); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.warehouse; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.warehouse.vo.MdmWarehousePageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.warehouse.vo.MdmWarehouseSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.warehouse.MdmWarehouseDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.warehouse.MdmWarehouseMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.*; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.mdm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * MDM ä»åº Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class MdmWarehouseServiceImpl implements MdmWarehouseService { |
| | | |
| | | @Resource |
| | | private MdmWarehouseMapper warehouseMapper; |
| | | |
| | | @Override |
| | | public Long createWarehouse(MdmWarehouseSaveReqVO createReqVO) { |
| | | // æ ¡éªæ°æ® |
| | | validateWarehouseSaveData(createReqVO); |
| | | |
| | | // æå
¥ |
| | | MdmWarehouseDO warehouse = BeanUtils.toBean(createReqVO, MdmWarehouseDO.class); |
| | | warehouseMapper.insert(warehouse); |
| | | return warehouse.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateWarehouse(MdmWarehouseSaveReqVO updateReqVO) { |
| | | // æ ¡éªåå¨ |
| | | validateWarehouseExists(updateReqVO.getId()); |
| | | // æ ¡éªæ°æ® |
| | | validateWarehouseSaveData(updateReqVO); |
| | | |
| | | // æ´æ° |
| | | MdmWarehouseDO updateObj = BeanUtils.toBean(updateReqVO, MdmWarehouseDO.class); |
| | | warehouseMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void updateWarehouseStatus(Long id, Integer status) { |
| | | // æ ¡éªåå¨ |
| | | validateWarehouseExists(id); |
| | | // æ´æ°ç¶æ |
| | | warehouseMapper.updateById(new MdmWarehouseDO().setId(id).setStatus(status)); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteWarehouse(Long id) { |
| | | // æ ¡éªåå¨ |
| | | validateWarehouseExists(id); |
| | | // TODO: æ ¡éªæ¯å¦è¢«åºåä½¿ç¨ |
| | | // å é¤ |
| | | warehouseMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | public MdmWarehouseDO validateWarehouseExists(Long id) { |
| | | MdmWarehouseDO warehouse = warehouseMapper.selectById(id); |
| | | if (warehouse == null) { |
| | | throw exception(MDM_WAREHOUSE_NOT_EXISTS); |
| | | } |
| | | return warehouse; |
| | | } |
| | | |
| | | @Override |
| | | public MdmWarehouseDO validateWarehouseExistsAndEnable(Long id) { |
| | | MdmWarehouseDO warehouse = validateWarehouseExists(id); |
| | | if (warehouse.getStatus() != null && warehouse.getStatus() != 0) { |
| | | throw exception(MDM_WAREHOUSE_IS_DISABLE); |
| | | } |
| | | return warehouse; |
| | | } |
| | | |
| | | private void validateWarehouseSaveData(MdmWarehouseSaveReqVO reqVO) { |
| | | // æ ¡éªç¼ç å¯ä¸ |
| | | MdmWarehouseDO warehouse = warehouseMapper.selectByCode(reqVO.getCode()); |
| | | if (warehouse != null && ObjUtil.notEqual(warehouse.getId(), reqVO.getId())) { |
| | | throw exception(MDM_WAREHOUSE_CODE_DUPLICATE); |
| | | } |
| | | // æ ¡éªåç§°å¯ä¸ |
| | | MdmWarehouseDO sameName = warehouseMapper.selectByName(reqVO.getName()); |
| | | if (sameName != null && ObjUtil.notEqual(sameName.getId(), reqVO.getId())) { |
| | | throw exception(MDM_WAREHOUSE_NAME_DUPLICATE); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public MdmWarehouseDO getWarehouse(Long id) { |
| | | return warehouseMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<MdmWarehouseDO> getWarehousePage(MdmWarehousePageReqVO pageReqVO) { |
| | | return warehouseMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public List<MdmWarehouseDO> getWarehouseList(Collection<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return warehouseMapper.selectListByIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | public MdmWarehouseDO getWarehouseByCode(String code) { |
| | | return warehouseMapper.selectByCode(code); |
| | | } |
| | | |
| | | } |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- MDM ä¸»æ°æ®ç®¡ç模å --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-mdm</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- BPM æµç¨æ¨¡å --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-bpm</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ä¸å¡ç»ä»¶ --> |
| | | |
| | | <!-- Web ç¸å
³ --> |
| | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| | | |
| | | @Tag(name = "管çåå° - MES ç产工å") |
| | | @RestController |
| | |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/submit") |
| | | @Operation(summary = "æäº¤å·¥å审æ¹") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('mes:pro-work-order:update')") |
| | | public CommonResult<Boolean> submitWorkOrder(@RequestParam("id") Long id) { |
| | | workOrderService.submitWorkOrder(id, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | | // ==================== æ¼æ¥ VO ==================== |
| | | |
| | | private List<MesProWorkOrderRespVO> buildWorkOrderRespVOList(List<MesProWorkOrderDO> list) { |
| | |
| | | */ |
| | | private Integer status; |
| | | /** |
| | | * BPM æµç¨å®ä¾ç¼å· |
| | | */ |
| | | private String processInstanceId; |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | |
| | | ErrorCode PRO_WORK_ORDER_NOT_CONFIRMED = new ErrorCode(1_040_502_003, "åªæå·²ç¡®è®¤ç¶æçå·¥åæè½æ§è¡æ¤æä½"); |
| | | ErrorCode PRO_WORK_ORDER_HAS_CHILDREN = new ErrorCode(1_040_502_004, "åå¨åå·¥åï¼æ æ³å é¤"); |
| | | ErrorCode PRO_WORK_ORDER_PRODUCT_MISMATCH = new ErrorCode(1_040_502_005, "å½å产åç©æä¸ç产工å产åä¸ä¸è´"); |
| | | ErrorCode PRO_WORK_ORDER_SUBMIT_FAIL_NOT_PREPARE = new ErrorCode(1_040_502_006, "å·¥åæäº¤å¤±è´¥ï¼åªæèç¨¿ç¶æçå·¥åæè½æäº¤"); |
| | | ErrorCode PRO_WORK_ORDER_UPDATE_AUDIT_STATUS_FAIL_NOT_AUDITING = new ErrorCode(1_040_502_007, "å·¥å审æ¹ç¶ææ´æ°å¤±è´¥ï¼å·¥åä¸å¤äºå®¡æ¹ä¸"); |
| | | ErrorCode PRO_WORK_ORDER_BOM_NOT_EXISTS = new ErrorCode(1_040_502_100, "ç产工åBOMä¸åå¨"); |
| | | |
| | | // ========== MES ç产管ç-ç产任å¡ï¼1-040-503-000ï¼ ========== |
| | |
| | | */ |
| | | PREPARE(0, "è稿"), |
| | | /** |
| | | * 审æ¹ä¸ |
| | | * |
| | | * å¯¹åº MesProWorkOrderService#submitWorkOrder æ¹æ³ |
| | | */ |
| | | AUDITING(1, "审æ¹ä¸"), |
| | | /** |
| | | * 已确认 |
| | | * |
| | | * å¯¹åº MesProWorkOrderService#confirmWorkOrder æ¹æ³ |
| | | * å¯¹åº MesProWorkOrderService#confirmWorkOrder æ¹æ³ï¼å®¡æ¹éè¿åèªå¨ç¡®è®¤ï¼ |
| | | */ |
| | | CONFIRMED(1, "已确认"), |
| | | CONFIRMED(2, "已确认"), |
| | | /** |
| | | * 已宿 |
| | | * |
| | | * å¯¹åº MesProWorkOrderService#finishWorkOrder æ¹æ³ |
| | | */ |
| | | FINISHED(2, "已宿"), |
| | | FINISHED(3, "已宿"), |
| | | /** |
| | | * 已忶 |
| | | * |
| | | * å¯¹åº MesProWorkOrderService#cancelWorkOrder æ¹æ³ |
| | | */ |
| | | CANCELED(3, "已忶"); |
| | | CANCELED(4, "已忶"), |
| | | /** |
| | | * 审æ¹ä¸éè¿ |
| | | */ |
| | | REJECTED(5, "审æ¹ä¸éè¿"); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesProWorkOrderStatusEnum::getStatus).toArray(Integer[]::new); |
| | | |
| | |
| | | import cn.iocoder.yudao.framework.common.exception.ServiceException; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemImportExcelVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemImportRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemPageReqVO; |
| | |
| | | /** |
| | | * MES ç©æäº§å Service å®ç°ç±» |
| | | * |
| | | * æ¹é 说æï¼MES ç©æä¸»æ°æ®æ¥æºäº MDM |
| | | * - getItem/getItemList/validateItemExists è°ç¨ MDM API |
| | | * - MES ç¹æé
ç½®ï¼æ¹æ¬¡é
ç½®ãBOMãSOPãSIPï¼ä¿çå¨ MES 模å管ç |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | |
| | | |
| | | @Resource |
| | | private MesMdItemMapper itemMapper; |
| | | |
| | | @Resource |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | @Resource |
| | | private MesMdItemTypeService itemTypeService; |
| | |
| | | |
| | | @Override |
| | | public MesMdItemDO validateItemExists(Long id) { |
| | | MesMdItemDO item = itemMapper.selectById(id); |
| | | if (item == null) { |
| | | throw exception(MD_ITEM_NOT_EXISTS); |
| | | } |
| | | return item; |
| | | MdmItemRespDTO item = mdmItemApi.validateItemExists(id).getCheckedData(); |
| | | return BeanUtils.toBean(item, MesMdItemDO.class); |
| | | } |
| | | |
| | | @Override |
| | | public MesMdItemDO validateItemExistsAndEnable(Long id) { |
| | | MesMdItemDO item = validateItemExists(id); |
| | | if (ObjUtil.notEqual(CommonStatusEnum.ENABLE.getStatus(), item.getStatus())) { |
| | | throw exception(MD_ITEM_IS_DISABLE); |
| | | } |
| | | return item; |
| | | MdmItemRespDTO item = mdmItemApi.validateItemExistsAndEnable(id).getCheckedData(); |
| | | return BeanUtils.toBean(item, MesMdItemDO.class); |
| | | } |
| | | |
| | | private void validateItemCodeUnique(Long id, String code) { |
| | |
| | | |
| | | @Override |
| | | public MesMdItemDO getItem(Long id) { |
| | | return itemMapper.selectById(id); |
| | | // ä» MDM è·åç©æä¸»æ°æ® |
| | | MdmItemRespDTO item = mdmItemApi.getItem(id).getCheckedData(); |
| | | return BeanUtils.toBean(item, MesMdItemDO.class); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<MesMdItemDO> getItemPage(MesMdItemPageReqVO pageReqVO) { |
| | | // æ¥æ¾æ¶ï¼å¦ææ¥æ¾æä¸ªåç±»ç¼å·ï¼åå
å«å®çååç±» |
| | | Set<Long> itemTypeIds = null; |
| | | if (pageReqVO.getItemTypeId() != null) { |
| | | itemTypeIds = new HashSet<>(); |
| | | itemTypeIds.add(pageReqVO.getItemTypeId()); |
| | | List<MesMdItemTypeDO> children = itemTypeService.getItemTypeChildrenList(pageReqVO.getItemTypeId()); |
| | | itemTypeIds.addAll(convertSet(children, MesMdItemTypeDO::getId)); |
| | | } |
| | | // å页æ¥è¯¢ |
| | | return itemMapper.selectPage(pageReqVO, itemTypeIds); |
| | | // è°ç¨ MDM API å页æ¥è¯¢ï¼MES ç©æå¯¹åº MDM ç©æç±»å=ç©æï¼ |
| | | cn.iocoder.yudao.framework.common.pojo.PageResult<MdmItemRespDTO> mdmPageResult = |
| | | mdmItemApi.getItemPage(1, pageReqVO.getStatus(), pageReqVO.getPageNo(), pageReqVO.getPageSize()).getCheckedData(); |
| | | List<MesMdItemDO> itemList = BeanUtils.toBean(mdmPageResult.getList(), MesMdItemDO.class); |
| | | return new PageResult<>(itemList, mdmPageResult.getTotal()); |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return itemMapper.selectByIds(ids); |
| | | List<MdmItemRespDTO> itemList = mdmItemApi.getItemList(ids).getCheckedData(); |
| | | return BeanUtils.toBean(itemList, MesMdItemDO.class); |
| | | } |
| | | |
| | | @Override |
| | | public Long getItemCountByItemTypeId(Long itemTypeId) { |
| | | return itemMapper.selectCountByItemTypeId(itemTypeId); |
| | | // MES åç±»éè¦æ å°å° MDM åç±» |
| | | return mdmItemApi.getItemCountByCategoryId(itemTypeId).getCheckedData(); |
| | | } |
| | | |
| | | @Override |
| | | public Long getItemCountByUnitMeasureId(Long unitMeasureId) { |
| | | return itemMapper.selectCountByUnitMeasureId(unitMeasureId); |
| | | return mdmItemApi.getItemCountByUnitMeasureId(unitMeasureId).getCheckedData(); |
| | | } |
| | | |
| | | @Override |
| | |
| | | void cancelWorkOrder(Long id); |
| | | |
| | | /** |
| | | * æäº¤å·¥åå®¡æ¹ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param userId ç¨æ·ç¼å· |
| | | */ |
| | | void submitWorkOrder(Long id, Long userId); |
| | | |
| | | /** |
| | | * æ´æ°å·¥åç审æ¹ç¶æ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | */ |
| | | void updateWorkOrderAuditStatus(Long id, Integer bpmResult); |
| | | |
| | | /** |
| | | * ç´¯å å·¥åçå·²ç产æ°é |
| | | * |
| | | * @param id å·¥åç¼å· |
| | |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO; |
| | |
| | | import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class MesProWorkOrderServiceImpl implements MesProWorkOrderService { |
| | | |
| | | /** |
| | | * BPM ç产工åå®¡æ¹æµç¨æ è¯ |
| | | */ |
| | | public static final String BPM_PROCESS_DEFINITION_KEY = "mes-pro-work-order-audit"; |
| | | |
| | | @Resource |
| | | private MesProWorkOrderMapper workOrderMapper; |
| | |
| | | private MesWmBarcodeService barcodeService; |
| | | @Resource |
| | | private MesProTaskService taskService; |
| | | |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | return workOrderMapper.selectCountByVendorId(vendorId); |
| | | } |
| | | |
| | | // ==================== BPM æµç¨å®¡æ¹ ==================== |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitWorkOrder(Long id, Long userId) { |
| | | // 1. æ ¡éªå·¥åå¤äºèç¨¿ç¶æ |
| | | MesProWorkOrderDO workOrder = validateWorkOrderExists(id); |
| | | if (ObjUtil.notEqual(workOrder.getStatus(), MesProWorkOrderStatusEnum.PREPARE.getStatus())) { |
| | | throw exception(PRO_WORK_ORDER_SUBMIT_FAIL_NOT_PREPARE); |
| | | } |
| | | |
| | | // 2. å建ç产工åå®¡æ¹æµç¨å®ä¾ |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(BPM_PROCESS_DEFINITION_KEY) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | |
| | | // 3. æ´æ°å·¥å工使µç¼å·ãç¶æä¸ºå®¡æ¹ä¸ |
| | | workOrderMapper.updateById(new MesProWorkOrderDO() |
| | | .setId(id) |
| | | .setProcessInstanceId(processInstanceId) |
| | | .setStatus(MesProWorkOrderStatusEnum.AUDITING.getStatus())); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateWorkOrderAuditStatus(Long id, Integer bpmResult) { |
| | | // 1. æ ¡éªå·¥ååå¨ |
| | | MesProWorkOrderDO workOrder = validateWorkOrderExists(id); |
| | | |
| | | // 2. æ ¡éªå·¥åå¤äºå®¡æ¹ä¸ |
| | | if (ObjUtil.notEqual(workOrder.getStatus(), MesProWorkOrderStatusEnum.AUDITING.getStatus())) { |
| | | log.error("[updateWorkOrderAuditStatus][workOrder({}) ä¸å¤äºå®¡æ¹ä¸ï¼æ æ³æ´æ°å®¡æ¹ç»æ({})]", |
| | | workOrder.getId(), bpmResult); |
| | | throw exception(PRO_WORK_ORDER_UPDATE_AUDIT_STATUS_FAIL_NOT_AUDITING); |
| | | } |
| | | |
| | | // 3. æ´æ°å·¥å审æ¹ç»æ |
| | | Integer auditStatus = convertBpmResultToWorkOrderStatus(bpmResult); |
| | | workOrderMapper.updateById(new MesProWorkOrderDO() |
| | | .setId(id) |
| | | .setStatus(auditStatus)); |
| | | } |
| | | |
| | | /** |
| | | * å° BPM 审æ¹ç»æè½¬æ¢ä¸º MES å·¥åç¶æ |
| | | * |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | * @return MES å·¥åç¶æ |
| | | */ |
| | | private Integer convertBpmResultToWorkOrderStatus(Integer bpmResult) { |
| | | // BPM 审æ¹ç»æï¼2=éè¿ï¼3=ä¸éè¿ï¼4=已忶 |
| | | if (bpmResult == 2) { |
| | | return MesProWorkOrderStatusEnum.CONFIRMED.getStatus(); |
| | | } else if (bpmResult == 3) { |
| | | return MesProWorkOrderStatusEnum.REJECTED.getStatus(); |
| | | } else if (bpmResult == 4) { |
| | | return MesProWorkOrderStatusEnum.PREPARE.getStatus(); |
| | | } else { |
| | | log.warn("[convertBpmResultToWorkOrderStatus][æªç¥ç BPM 审æ¹ç»æ({})]", bpmResult); |
| | | return MesProWorkOrderStatusEnum.AUDITING.getStatus(); |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.pro.workorder.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener; |
| | | import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderServiceImpl; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * ç产工å审æ¹çç»æççå¬å¨å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Component |
| | | public class MesProWorkOrderStatusListener extends BpmProcessInstanceStatusEventListener { |
| | | |
| | | @Resource |
| | | private MesProWorkOrderService workOrderService; |
| | | |
| | | @Override |
| | | public String getProcessDefinitionKey() { |
| | | return MesProWorkOrderServiceImpl.BPM_PROCESS_DEFINITION_KEY; |
| | | } |
| | | |
| | | @Override |
| | | protected void onEvent(BpmProcessInstanceStatusEvent event) { |
| | | workOrderService.updateWorkOrderAuditStatus(Long.parseLong(event.getBusinessKey()), event.getStatus()); |
| | | } |
| | | |
| | | } |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- MDM ä¸»æ°æ®ç®¡ç模å --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-mdm</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ä¸å¡ç»ä»¶ --> |
| | | |
| | | <!-- Web ç¸å
³ --> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.api.inventory; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.wms.api.inventory.dto.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * WMS åºåæä½ API æ¥å£ |
| | | * |
| | | * æä¾ç» ERPãMES çæ¨¡åè°ç¨ï¼å®ç°è·¨æ¨¡ååºåæä½ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface WmsInventoryApi { |
| | | |
| | | String PREFIX = "/rpc-api/wms/inventory"; |
| | | |
| | | // ==================== å
¥åºæä½ ==================== |
| | | |
| | | /** |
| | | * å
¥åºæä½ |
| | | * |
| | | * @param reqDTO å
¥åºè¯·æ± |
| | | * @return å
¥åºç»æ |
| | | */ |
| | | CommonResult<WmsReceiptResultDTO> receipt(WmsReceiptReqDTO reqDTO); |
| | | |
| | | // ==================== åºåºæä½ ==================== |
| | | |
| | | /** |
| | | * åºåºæä½ |
| | | * |
| | | * @param reqDTO åºåºè¯·æ± |
| | | * @return åºåºç»æ |
| | | */ |
| | | CommonResult<WmsShipmentResultDTO> shipment(WmsShipmentReqDTO reqDTO); |
| | | |
| | | // ==================== åºåé¢ç ==================== |
| | | |
| | | /** |
| | | * åºåé¢çï¼éåºåï¼ |
| | | * |
| | | * @param reqDTO é¢çè¯·æ± |
| | | * @return é¢çåå· |
| | | */ |
| | | CommonResult<String> reserve(WmsReserveReqDTO reqDTO); |
| | | |
| | | /** |
| | | * éæ¾åºåé¢ç |
| | | * |
| | | * @param reserveNo é¢çåå· |
| | | */ |
| | | CommonResult<Boolean> releaseReserve(String reserveNo); |
| | | |
| | | /** |
| | | * 使ç¨é¢çåºåï¼åºåºæ¶æ£åé¢çï¼ |
| | | * |
| | | * @param reqDTO 使ç¨é¢çè¯·æ± |
| | | */ |
| | | CommonResult<Boolean> useReserve(WmsUseReserveReqDTO reqDTO); |
| | | |
| | | // ==================== åºåæ¥è¯¢ ==================== |
| | | |
| | | /** |
| | | * æ¥è¯¢åºå |
| | | * |
| | | * @param reqDTO æ¥è¯¢è¯·æ± |
| | | * @return åºåå表 |
| | | */ |
| | | CommonResult<List<WmsInventoryRespDTO>> getInventoryList(WmsInventoryQueryReqDTO reqDTO); |
| | | |
| | | /** |
| | | * æ¥è¯¢å¯ç¨åºåï¼æ»åºå - é¢çåºåï¼ |
| | | * |
| | | * @param skuId SKU ç¼å· |
| | | * @param warehouseId ä»åºç¼å· |
| | | * @return å¯ç¨åºåæ°é |
| | | */ |
| | | CommonResult<BigDecimal> getAvailableQuantity(Long skuId, Long warehouseId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.api.inventory; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.wms.api.inventory.dto.*; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryTransactionDO; |
| | | import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryMapper; |
| | | import cn.iocoder.yudao.module.wms.enums.inventory.WmsTransactionTypeEnum; |
| | | import cn.iocoder.yudao.module.wms.service.inventory.dto.WmsInventoryChangeReqDTO; |
| | | import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryReserveService; |
| | | import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryService; |
| | | import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryTransactionService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.UUID; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * WMS åºåæä½ API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RestController |
| | | @RequestMapping(WmsInventoryApi.PREFIX) |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class WmsInventoryApiImpl implements WmsInventoryApi { |
| | | |
| | | @Resource |
| | | private WmsInventoryService inventoryService; |
| | | |
| | | @Resource |
| | | private WmsInventoryReserveService reserveService; |
| | | |
| | | @Resource |
| | | private WmsInventoryTransactionService transactionService; |
| | | |
| | | @Resource |
| | | private WmsInventoryMapper inventoryMapper; |
| | | |
| | | // ==================== å
¥åºæä½ ==================== |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public CommonResult<WmsReceiptResultDTO> receipt(WmsReceiptReqDTO reqDTO) { |
| | | // 1. æå»ºåºååæ´è¯·æ± |
| | | WmsInventoryChangeReqDTO changeReq = buildInventoryChangeReq(reqDTO); |
| | | |
| | | // 2. æ§è¡å
¥åºåæ´ |
| | | inventoryService.changeInventory(changeReq); |
| | | |
| | | // 3. è®°å½äºå¡æµæ°´ |
| | | List<WmsInventoryTransactionDO> transactions = buildReceiptTransactions(reqDTO); |
| | | transactionService.createTransactionList(transactions); |
| | | |
| | | // 4. æå»ºè¿åç»æ |
| | | WmsReceiptResultDTO result = new WmsReceiptResultDTO(); |
| | | result.setReceiptOrderNo(generateReceiptNo()); |
| | | result.setTotalQuantity(calculateTotalQuantity(reqDTO.getItems())); |
| | | return success(result); |
| | | } |
| | | |
| | | // ==================== åºåºæä½ ==================== |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public CommonResult<WmsShipmentResultDTO> shipment(WmsShipmentReqDTO reqDTO) { |
| | | // 1. 妿æé¢çåå·ï¼å
使ç¨é¢ç |
| | | if (reqDTO.getReserveNo() != null) { |
| | | WmsUseReserveReqDTO useReq = new WmsUseReserveReqDTO(); |
| | | useReq.setReserveNo(reqDTO.getReserveNo()); |
| | | useReq.setQuantity(calculateTotalQuantity(reqDTO.getItems())); |
| | | reserveService.useReserve(useReq); |
| | | } |
| | | |
| | | // 2. æå»ºåºååæ´è¯·æ±ï¼åºåºä¸ºè´æ°ï¼ |
| | | WmsInventoryChangeReqDTO changeReq = buildShipmentChangeReq(reqDTO); |
| | | |
| | | // 3. æ§è¡åºåºåæ´ |
| | | inventoryService.changeInventory(changeReq); |
| | | |
| | | // 4. è®°å½äºå¡æµæ°´ |
| | | List<WmsInventoryTransactionDO> transactions = buildShipmentTransactions(reqDTO); |
| | | transactionService.createTransactionList(transactions); |
| | | |
| | | // 5. æå»ºè¿åç»æ |
| | | WmsShipmentResultDTO result = new WmsShipmentResultDTO(); |
| | | result.setShipmentOrderNo(generateShipmentNo()); |
| | | result.setTotalQuantity(calculateTotalQuantity(reqDTO.getItems())); |
| | | return success(result); |
| | | } |
| | | |
| | | // ==================== åºåé¢ç ==================== |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public CommonResult<String> reserve(WmsReserveReqDTO reqDTO) { |
| | | return success(reserveService.createReserve(reqDTO)); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public CommonResult<Boolean> releaseReserve(String reserveNo) { |
| | | reserveService.releaseReserve(reserveNo); |
| | | return success(true); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public CommonResult<Boolean> useReserve(WmsUseReserveReqDTO reqDTO) { |
| | | reserveService.useReserve(reqDTO); |
| | | return success(true); |
| | | } |
| | | |
| | | // ==================== åºåæ¥è¯¢ ==================== |
| | | |
| | | @Override |
| | | public CommonResult<List<WmsInventoryRespDTO>> getInventoryList(WmsInventoryQueryReqDTO reqDTO) { |
| | | // 1. æ¥è¯¢åºå |
| | | List<WmsInventoryDO> inventories = inventoryMapper.selectListByQuery(reqDTO); |
| | | |
| | | // 2. 转æ¢ç»æ |
| | | List<WmsInventoryRespDTO> results = new ArrayList<>(); |
| | | for (WmsInventoryDO inventory : inventories) { |
| | | WmsInventoryRespDTO resp = BeanUtils.toBean(inventory, WmsInventoryRespDTO.class); |
| | | // 计ç®é¢çæ°é |
| | | BigDecimal reserveQuantity = reserveService.getReserveQuantity( |
| | | inventory.getSkuId(), inventory.getWarehouseId()); |
| | | resp.setReserveQuantity(reserveQuantity); |
| | | resp.setAvailableQuantity(inventory.getQuantity().subtract(reserveQuantity)); |
| | | results.add(resp); |
| | | } |
| | | return success(results); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<BigDecimal> getAvailableQuantity(Long skuId, Long warehouseId) { |
| | | return success(inventoryService.getAvailableQuantity(skuId, warehouseId)); |
| | | } |
| | | |
| | | // ==================== ç§ææ¹æ³ ==================== |
| | | |
| | | private WmsInventoryChangeReqDTO buildInventoryChangeReq(WmsReceiptReqDTO reqDTO) { |
| | | WmsInventoryChangeReqDTO changeReq = new WmsInventoryChangeReqDTO(); |
| | | changeReq.setOrderType(reqDTO.getBizType()); |
| | | changeReq.setOrderNo(reqDTO.getBizNo()); |
| | | |
| | | List<WmsInventoryChangeReqDTO.Item> items = new ArrayList<>(); |
| | | for (WmsReceiptReqDTO.Item item : reqDTO.getItems()) { |
| | | WmsInventoryChangeReqDTO.Item changeItem = new WmsInventoryChangeReqDTO.Item(); |
| | | changeItem.setSkuId(item.getSkuId()); |
| | | changeItem.setWarehouseId(reqDTO.getWarehouseId()); |
| | | changeItem.setQuantity(item.getQuantity()); // å
¥åºä¸ºæ£æ° |
| | | changeItem.setPrice(item.getPrice()); |
| | | changeItem.setRemark(item.getRemark()); |
| | | items.add(changeItem); |
| | | } |
| | | changeReq.setItems(items); |
| | | return changeReq; |
| | | } |
| | | |
| | | private WmsInventoryChangeReqDTO buildShipmentChangeReq(WmsShipmentReqDTO reqDTO) { |
| | | WmsInventoryChangeReqDTO changeReq = new WmsInventoryChangeReqDTO(); |
| | | changeReq.setOrderType(reqDTO.getBizType()); |
| | | changeReq.setOrderNo(reqDTO.getBizNo()); |
| | | |
| | | List<WmsInventoryChangeReqDTO.Item> items = new ArrayList<>(); |
| | | for (WmsShipmentReqDTO.Item item : reqDTO.getItems()) { |
| | | WmsInventoryChangeReqDTO.Item changeItem = new WmsInventoryChangeReqDTO.Item(); |
| | | changeItem.setSkuId(item.getSkuId()); |
| | | changeItem.setWarehouseId(reqDTO.getWarehouseId()); |
| | | changeItem.setQuantity(item.getQuantity().negate()); // åºåºä¸ºè´æ° |
| | | changeItem.setRemark(item.getRemark()); |
| | | items.add(changeItem); |
| | | } |
| | | changeReq.setItems(items); |
| | | return changeReq; |
| | | } |
| | | |
| | | private List<WmsInventoryTransactionDO> buildReceiptTransactions(WmsReceiptReqDTO reqDTO) { |
| | | List<WmsInventoryTransactionDO> transactions = new ArrayList<>(); |
| | | for (WmsReceiptReqDTO.Item item : reqDTO.getItems()) { |
| | | WmsInventoryTransactionDO transaction = WmsInventoryTransactionDO.builder() |
| | | .transactionNo(generateTransactionNo()) |
| | | .transactionType(WmsTransactionTypeEnum.RECEIPT.getType()) |
| | | .bizType(reqDTO.getBizType()) |
| | | .bizId(reqDTO.getBizId()) |
| | | .bizNo(reqDTO.getBizNo()) |
| | | .skuId(item.getSkuId()) |
| | | .warehouseId(reqDTO.getWarehouseId()) |
| | | .quantity(item.getQuantity()) |
| | | .transactionTime(reqDTO.getReceiptTime() != null ? reqDTO.getReceiptTime() : LocalDateTime.now()) |
| | | .remark(item.getRemark()) |
| | | .build(); |
| | | transactions.add(transaction); |
| | | } |
| | | return transactions; |
| | | } |
| | | |
| | | private List<WmsInventoryTransactionDO> buildShipmentTransactions(WmsShipmentReqDTO reqDTO) { |
| | | List<WmsInventoryTransactionDO> transactions = new ArrayList<>(); |
| | | for (WmsShipmentReqDTO.Item item : reqDTO.getItems()) { |
| | | WmsInventoryTransactionDO transaction = WmsInventoryTransactionDO.builder() |
| | | .transactionNo(generateTransactionNo()) |
| | | .transactionType(WmsTransactionTypeEnum.SHIPMENT.getType()) |
| | | .bizType(reqDTO.getBizType()) |
| | | .bizId(reqDTO.getBizId()) |
| | | .bizNo(reqDTO.getBizNo()) |
| | | .skuId(item.getSkuId()) |
| | | .warehouseId(reqDTO.getWarehouseId()) |
| | | .quantity(item.getQuantity().negate()) |
| | | .reserveNo(reqDTO.getReserveNo()) |
| | | .transactionTime(reqDTO.getShipmentTime() != null ? reqDTO.getShipmentTime() : LocalDateTime.now()) |
| | | .remark(item.getRemark()) |
| | | .build(); |
| | | transactions.add(transaction); |
| | | } |
| | | return transactions; |
| | | } |
| | | |
| | | private BigDecimal calculateTotalQuantity(List<?> items) { |
| | | if (CollUtil.isEmpty(items)) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | BigDecimal total = BigDecimal.ZERO; |
| | | for (Object item : items) { |
| | | if (item instanceof WmsReceiptReqDTO.Item) { |
| | | total = total.add(((WmsReceiptReqDTO.Item) item).getQuantity()); |
| | | } else if (item instanceof WmsShipmentReqDTO.Item) { |
| | | total = total.add(((WmsShipmentReqDTO.Item) item).getQuantity()); |
| | | } |
| | | } |
| | | return total; |
| | | } |
| | | |
| | | private String generateReceiptNo() { |
| | | return "RCPT" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) |
| | | + UUID.randomUUID().toString().substring(0, 6).toUpperCase(); |
| | | } |
| | | |
| | | private String generateShipmentNo() { |
| | | return "SHIP" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) |
| | | + UUID.randomUUID().toString().substring(0, 6).toUpperCase(); |
| | | } |
| | | |
| | | private String generateTransactionNo() { |
| | | return "TRX" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) |
| | | + UUID.randomUUID().toString().substring(0, 6).toUpperCase(); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.api.inventory.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * WMS åºåæ¥è¯¢è¯·æ± DTO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Data |
| | | public class WmsInventoryQueryReqDTO { |
| | | |
| | | /** |
| | | * SKU ç¼å·å表 |
| | | */ |
| | | private List<Long> skuIds; |
| | | |
| | | /** |
| | | * ä»åºç¼å·å表 |
| | | */ |
| | | private List<Long> warehouseIds; |
| | | |
| | | /** |
| | | * æ¯å¦åªæ¥è¯¢æåºåç |
| | | */ |
| | | private Boolean onlyPositive; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.api.inventory.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * WMS åºåååº DTO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Data |
| | | public class WmsInventoryRespDTO { |
| | | |
| | | /** |
| | | * åºå ID |
| | | */ |
| | | private Long id; |
| | | |
| | | /** |
| | | * SKU ç¼å· |
| | | */ |
| | | private Long skuId; |
| | | |
| | | /** |
| | | * SKU åç§° |
| | | */ |
| | | private String skuName; |
| | | |
| | | /** |
| | | * ä»åºç¼å· |
| | | */ |
| | | private Long warehouseId; |
| | | |
| | | /** |
| | | * ä»åºåç§° |
| | | */ |
| | | private String warehouseName; |
| | | |
| | | /** |
| | | * åºåæ°é |
| | | */ |
| | | private BigDecimal quantity; |
| | | |
| | | /** |
| | | * é¢çæ°é |
| | | */ |
| | | private BigDecimal reserveQuantity; |
| | | |
| | | /** |
| | | * å¯ç¨æ°éï¼åºåæ°é - é¢çæ°éï¼ |
| | | */ |
| | | private BigDecimal availableQuantity; |
| | | |
| | | /** |
| | | * æ´æ°æ¶é´ |
| | | */ |
| | | private LocalDateTime updateTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.api.inventory.dto; |
| | | |
| | | import jakarta.validation.Valid; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * WMS å
¥åºè¯·æ± DTO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Data |
| | | public class WmsReceiptReqDTO { |
| | | |
| | | /** |
| | | * ä¸å¡ç±»å |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.wms.enums.inventory.WmsInventoryBizTypeEnum} |
| | | */ |
| | | @NotNull(message = "ä¸å¡ç±»åä¸è½ä¸ºç©º") |
| | | private Integer bizType; |
| | | |
| | | /** |
| | | * ä¸å¡åæ® ID |
| | | */ |
| | | @NotNull(message = "ä¸å¡åæ®IDä¸è½ä¸ºç©º") |
| | | private Long bizId; |
| | | |
| | | /** |
| | | * ä¸å¡åæ®å· |
| | | */ |
| | | private String bizNo; |
| | | |
| | | /** |
| | | * ä»åºç¼å· |
| | | */ |
| | | @NotNull(message = "ä»åºä¸è½ä¸ºç©º") |
| | | private Long warehouseId; |
| | | |
| | | /** |
| | | * å
¥åºæ¶é´ |
| | | */ |
| | | private LocalDateTime receiptTime; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | /** |
| | | * å
¥åºæç» |
| | | */ |
| | | @NotEmpty(message = "å
¥åºæç»ä¸è½ä¸ºç©º") |
| | | @Valid |
| | | private List<Item> items; |
| | | |
| | | /** |
| | | * å
¥åºæç»é¡¹ |
| | | */ |
| | | @Data |
| | | public static class Item { |
| | | |
| | | /** |
| | | * SKU ç¼å· |
| | | */ |
| | | @NotNull(message = "SKUä¸è½ä¸ºç©º") |
| | | private Long skuId; |
| | | |
| | | /** |
| | | * å
¥åºæ°é |
| | | */ |
| | | @NotNull(message = "å
¥åºæ°éä¸è½ä¸ºç©º") |
| | | private BigDecimal quantity; |
| | | |
| | | /** |
| | | * åä»·ï¼å¯éï¼ |
| | | */ |
| | | private BigDecimal price; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.api.inventory.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * WMS å
¥åºç»æ DTO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Data |
| | | public class WmsReceiptResultDTO { |
| | | |
| | | /** |
| | | * å
¥åºå ID |
| | | */ |
| | | private Long receiptOrderId; |
| | | |
| | | /** |
| | | * å
¥åºåå· |
| | | */ |
| | | private String receiptOrderNo; |
| | | |
| | | /** |
| | | * æ»å
¥åºæ°é |
| | | */ |
| | | private BigDecimal totalQuantity; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.api.inventory.dto; |
| | | |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * WMS åºåé¢çè¯·æ± DTO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Data |
| | | public class WmsReserveReqDTO { |
| | | |
| | | /** |
| | | * ä¸å¡ç±»å |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.wms.enums.inventory.WmsReserveBizTypeEnum} |
| | | */ |
| | | @NotNull(message = "ä¸å¡ç±»åä¸è½ä¸ºç©º") |
| | | private Integer bizType; |
| | | |
| | | /** |
| | | * ä¸å¡åæ® ID |
| | | */ |
| | | @NotNull(message = "ä¸å¡åæ®IDä¸è½ä¸ºç©º") |
| | | private Long bizId; |
| | | |
| | | /** |
| | | * ä¸å¡åæ®å· |
| | | */ |
| | | private String bizNo; |
| | | |
| | | /** |
| | | * SKU ç¼å· |
| | | */ |
| | | @NotNull(message = "SKUä¸è½ä¸ºç©º") |
| | | private Long skuId; |
| | | |
| | | /** |
| | | * ä»åºç¼å· |
| | | */ |
| | | @NotNull(message = "ä»åºä¸è½ä¸ºç©º") |
| | | private Long warehouseId; |
| | | |
| | | /** |
| | | * é¢çæ°é |
| | | */ |
| | | @NotNull(message = "é¢çæ°éä¸è½ä¸ºç©º") |
| | | private BigDecimal quantity; |
| | | |
| | | /** |
| | | * è¿ææ¶é´ï¼å¯éï¼é¢çèªå¨éæ¾æ¶é´ï¼ |
| | | */ |
| | | private LocalDateTime expireTime; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.api.inventory.dto; |
| | | |
| | | import jakarta.validation.Valid; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * WMS åºåºè¯·æ± DTO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Data |
| | | public class WmsShipmentReqDTO { |
| | | |
| | | /** |
| | | * ä¸å¡ç±»å |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.wms.enums.inventory.WmsInventoryBizTypeEnum} |
| | | */ |
| | | @NotNull(message = "ä¸å¡ç±»åä¸è½ä¸ºç©º") |
| | | private Integer bizType; |
| | | |
| | | /** |
| | | * ä¸å¡åæ® ID |
| | | */ |
| | | @NotNull(message = "ä¸å¡åæ®IDä¸è½ä¸ºç©º") |
| | | private Long bizId; |
| | | |
| | | /** |
| | | * ä¸å¡åæ®å· |
| | | */ |
| | | private String bizNo; |
| | | |
| | | /** |
| | | * ä»åºç¼å· |
| | | */ |
| | | @NotNull(message = "ä»åºä¸è½ä¸ºç©º") |
| | | private Long warehouseId; |
| | | |
| | | /** |
| | | * åºåºæ¶é´ |
| | | */ |
| | | private LocalDateTime shipmentTime; |
| | | |
| | | /** |
| | | * é¢çåå·ï¼å¦æä½¿ç¨äºé¢çï¼ |
| | | */ |
| | | private String reserveNo; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | /** |
| | | * åºåºæç» |
| | | */ |
| | | @NotEmpty(message = "åºåºæç»ä¸è½ä¸ºç©º") |
| | | @Valid |
| | | private List<Item> items; |
| | | |
| | | /** |
| | | * åºåºæç»é¡¹ |
| | | */ |
| | | @Data |
| | | public static class Item { |
| | | |
| | | /** |
| | | * SKU ç¼å· |
| | | */ |
| | | @NotNull(message = "SKUä¸è½ä¸ºç©º") |
| | | private Long skuId; |
| | | |
| | | /** |
| | | * åºåºæ°é |
| | | */ |
| | | @NotNull(message = "åºåºæ°éä¸è½ä¸ºç©º") |
| | | private BigDecimal quantity; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.api.inventory.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * WMS åºåºç»æ DTO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Data |
| | | public class WmsShipmentResultDTO { |
| | | |
| | | /** |
| | | * åºåºå ID |
| | | */ |
| | | private Long shipmentOrderId; |
| | | |
| | | /** |
| | | * åºåºåå· |
| | | */ |
| | | private String shipmentOrderNo; |
| | | |
| | | /** |
| | | * æ»åºåºæ°é |
| | | */ |
| | | private BigDecimal totalQuantity; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.api.inventory.dto; |
| | | |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * WMS 使ç¨é¢çè¯·æ± DTO |
| | | * |
| | | * åºåºæ¶æ£åé¢çåºå |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Data |
| | | public class WmsUseReserveReqDTO { |
| | | |
| | | /** |
| | | * é¢çåå· |
| | | */ |
| | | @NotNull(message = "é¢çåå·ä¸è½ä¸ºç©º") |
| | | private String reserveNo; |
| | | |
| | | /** |
| | | * ä½¿ç¨æ°é |
| | | */ |
| | | @NotNull(message = "ä½¿ç¨æ°éä¸è½ä¸ºç©º") |
| | | private BigDecimal quantity; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.api.stock; |
| | | |
| | | import cn.iocoder.yudao.module.wms.api.stock.dto.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * WMS åºåæå¡ API æ¥å£ |
| | | * |
| | | * æä¾ç» ERPãMES çæ¨¡åè°ç¨ï¼å®ç°è·¨æ¨¡ååºåæä½ |
| | | * 使ç¨ç»ä¸çç©æIDï¼md_item.idï¼ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface WmsStockApi { |
| | | |
| | | // ==================== åºåè®°å½æä½ ==================== |
| | | |
| | | /** |
| | | * å建åºåè®°å½ï¼å
¥åºï¼ |
| | | * |
| | | * @param dto åºåè®°å½åå»ºè¯·æ± |
| | | * @return åºåè®°å½ID |
| | | */ |
| | | Long createStockRecord(StockRecordCreateDTO dto); |
| | | |
| | | /** |
| | | * æ¹éå建åºåè®°å½ |
| | | * |
| | | * @param dtoList åºåè®°å½å建请æ±å表 |
| | | * @return åºåè®°å½IDå表 |
| | | */ |
| | | List<Long> createStockRecordBatch(List<StockRecordCreateDTO> dtoList); |
| | | |
| | | // ==================== åºåéå® ==================== |
| | | |
| | | /** |
| | | * éå®åºå |
| | | * |
| | | * @param itemId ç©æID |
| | | * @param warehouseId ä»åºID |
| | | * @param quantity é宿°é |
| | | * @return éå®åå· |
| | | */ |
| | | String lockStock(Long itemId, Long warehouseId, BigDecimal quantity); |
| | | |
| | | /** |
| | | * æ¹ééå®åºå |
| | | * |
| | | * @param itemId ç©æID |
| | | * @param warehouseId ä»åºID |
| | | * @param quantity é宿°é |
| | | * @param bizType ä¸å¡ç±»å |
| | | * @param bizId ä¸å¡åæ®ID |
| | | * @return éå®åå· |
| | | */ |
| | | String lockStockWithBiz(Long itemId, Long warehouseId, BigDecimal quantity, Integer bizType, Long bizId); |
| | | |
| | | /** |
| | | * è§£éåºå |
| | | * |
| | | * @param lockNo éå®åå· |
| | | */ |
| | | void unlockStock(String lockNo); |
| | | |
| | | // ==================== åºåæ¥è¯¢ ==================== |
| | | |
| | | /** |
| | | * æ¥è¯¢å¯ç¨åºå |
| | | * |
| | | * @param itemId ç©æID |
| | | * @param warehouseId ä»åºID |
| | | * @return å¯ç¨åºåæ°é |
| | | */ |
| | | BigDecimal getAvailableStock(Long itemId, Long warehouseId); |
| | | |
| | | /** |
| | | * æ¹éæ¥è¯¢åºå |
| | | * |
| | | * @param itemIds ç©æIDå表 |
| | | * @param warehouseId ä»åºID |
| | | * @return ç©æID -> å¯ç¨åºåæ°é |
| | | */ |
| | | Map<Long, BigDecimal> getAvailableStockMap(List<Long> itemIds, Long warehouseId); |
| | | |
| | | /** |
| | | * æ¥è¯¢ææä»åºçåºå |
| | | * |
| | | * @param itemId ç©æID |
| | | * @return ä»åºID -> å¯ç¨åºåæ°é |
| | | */ |
| | | Map<Long, BigDecimal> getAvailableStockByWarehouse(Long itemId); |
| | | |
| | | // ==================== åºåæ ¡éª ==================== |
| | | |
| | | /** |
| | | * æ ¡éªåºåå
è¶³ |
| | | * |
| | | * @param itemId ç©æID |
| | | * @param warehouseId ä»åºID |
| | | * @param quantity éæ±æ°é |
| | | * @return true=å
è¶³, false=ä¸è¶³ |
| | | */ |
| | | boolean validateStockEnough(Long itemId, Long warehouseId, BigDecimal quantity); |
| | | |
| | | /** |
| | | * æ ¡éªåºåå
è¶³ï¼ä¸è¶³æ¶æåºå¼å¸¸ï¼ |
| | | * |
| | | * @param itemId ç©æID |
| | | * @param warehouseId ä»åºID |
| | | * @param quantity éæ±æ°é |
| | | * @throws cn.iocoder.yudao.framework.common.exception.ServiceException åºåä¸è¶³æ¶æåºå¼å¸¸ |
| | | */ |
| | | void checkStockEnough(Long itemId, Long warehouseId, BigDecimal quantity); |
| | | |
| | | // ==================== åºåæ£å ==================== |
| | | |
| | | /** |
| | | * æ£ååºåï¼åºåºï¼ |
| | | * |
| | | * @param itemId ç©æID |
| | | * @param warehouseId ä»åºID |
| | | * @param quantity æ£åæ°é |
| | | * @param bizType ä¸å¡ç±»å |
| | | * @param bizId ä¸å¡åæ®ID |
| | | * @param bizNo ä¸å¡åæ®å· |
| | | */ |
| | | void deductStock(Long itemId, Long warehouseId, BigDecimal quantity, Integer bizType, Long bizId, String bizNo); |
| | | |
| | | /** |
| | | * å¢å åºåï¼å
¥åºï¼ |
| | | * |
| | | * @param itemId ç©æID |
| | | * @param warehouseId ä»åºID |
| | | * @param quantity å¢å æ°é |
| | | * @param bizType ä¸å¡ç±»å |
| | | * @param bizId ä¸å¡åæ®ID |
| | | * @param bizNo ä¸å¡åæ®å· |
| | | */ |
| | | void addStock(Long itemId, Long warehouseId, BigDecimal quantity, Integer bizType, Long bizId, String bizNo); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.api.stock.dto; |
| | | |
| | | import lombok.Data; |
| | | import lombok.experimental.Accessors; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * åºåè®°å½å建 DTO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Data |
| | | @Accessors(chain = true) |
| | | public class StockRecordCreateDTO implements Serializable { |
| | | |
| | | /** |
| | | * ç©æIDï¼å
³è md_item.idï¼ |
| | | */ |
| | | private Long itemId; |
| | | |
| | | /** |
| | | * ä»åºIDï¼å
³è md_warehouse.idï¼ |
| | | */ |
| | | private Long warehouseId; |
| | | |
| | | /** |
| | | * åºä½IDï¼å¯éï¼ |
| | | */ |
| | | private Long locationId; |
| | | |
| | | /** |
| | | * æ¹æ¬¡å·ï¼å¯éï¼ |
| | | */ |
| | | private String batchCode; |
| | | |
| | | /** |
| | | * å卿°éï¼æ£æ°=å
¥åºï¼è´æ°=åºåºï¼ |
| | | */ |
| | | private BigDecimal quantity; |
| | | |
| | | /** |
| | | * ä¸å¡ç±»å |
| | | * |
| | | * æä¸¾å¼ï¼ |
| | | * 10: éè´å
¥åº |
| | | * 20: éå®åºåº |
| | | * 30: ç产å
¥åº |
| | | * 40: çäº§é¢æ |
| | | * 50: çäº§éæ |
| | | * 60: éè´éè´§åºåº |
| | | * 70: éå®éè´§å
¥åº |
| | | * 80: è°æ¨å
¥åº |
| | | * 90: è°æ¨åºåº |
| | | * 100: ççå
¥åº |
| | | * 110: çäºåºåº |
| | | */ |
| | | private Integer bizType; |
| | | |
| | | /** |
| | | * ä¸å¡åæ®ID |
| | | */ |
| | | private Long bizId; |
| | | |
| | | /** |
| | | * ä¸å¡åæ®å· |
| | | */ |
| | | private String bizNo; |
| | | |
| | | /** |
| | | * 计éåä½ID |
| | | */ |
| | | private Long unitMeasureId; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.controller.admin.inventory; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils; |
| | | import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryReservePageReqVO; |
| | | import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryReserveRespVO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryReserveDO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; |
| | | import cn.iocoder.yudao.module.wms.enums.DictTypeConstants; |
| | | import cn.iocoder.yudao.module.wms.service.inventory.WmsInventoryReserveService; |
| | | import cn.iocoder.yudao.module.wms.service.md.item.WmsItemSkuService; |
| | | import cn.iocoder.yudao.module.wms.service.md.warehouse.WmsWarehouseService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | |
| | | @Tag(name = "管çåå° - åºåé¢ç") |
| | | @RestController |
| | | @RequestMapping("/wms/inventory-reserve") |
| | | @Validated |
| | | public class WmsInventoryReserveController { |
| | | |
| | | @Resource |
| | | private WmsInventoryReserveService reserveService; |
| | | |
| | | @Resource |
| | | private WmsItemSkuService itemSkuService; |
| | | |
| | | @Resource |
| | | private WmsWarehouseService warehouseService; |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾åºåé¢çå页") |
| | | @PreAuthorize("@ss.hasPermission('wms:inventory-reserve:query')") |
| | | public CommonResult<PageResult<WmsInventoryReserveRespVO>> getInventoryReservePage(@Valid WmsInventoryReservePageReqVO reqVO) { |
| | | PageResult<WmsInventoryReserveDO> pageResult = reserveService.getReservePage(reqVO); |
| | | // è½¬æ¢ |
| | | PageResult<WmsInventoryReserveRespVO> voPageResult = BeanUtils.toBean(pageResult, WmsInventoryReserveRespVO.class); |
| | | // è¡¥å
ä¿¡æ¯ |
| | | enrichReserveList(voPageResult.getList()); |
| | | return success(voPageResult); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾åºåé¢ç详æ
") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @PreAuthorize("@ss.hasPermission('wms:inventory-reserve:query')") |
| | | public CommonResult<WmsInventoryReserveRespVO> getInventoryReserve(@RequestParam("id") Long id) { |
| | | WmsInventoryReserveDO reserve = reserveService.getReserve(id); |
| | | if (reserve == null) { |
| | | return success(null); |
| | | } |
| | | WmsInventoryReserveRespVO respVO = BeanUtils.toBean(reserve, WmsInventoryReserveRespVO.class); |
| | | // è¡¥å
ä¿¡æ¯ |
| | | enrichReserve(respVO); |
| | | return success(respVO); |
| | | } |
| | | |
| | | @PostMapping("/release") |
| | | @Operation(summary = "éæ¾åºåé¢ç") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @PreAuthorize("@ss.hasPermission('wms:inventory-reserve:release')") |
| | | public CommonResult<Boolean> releaseInventoryReserve(@RequestParam("id") Long id) { |
| | | WmsInventoryReserveDO reserve = reserveService.getReserve(id); |
| | | if (reserve != null) { |
| | | reserveService.releaseReserve(reserve.getReserveNo()); |
| | | } |
| | | return success(true); |
| | | } |
| | | |
| | | /** |
| | | * æ¹éè¡¥å
é¢çè®°å½ä¿¡æ¯ |
| | | */ |
| | | private void enrichReserveList(List<WmsInventoryReserveRespVO> list) { |
| | | if (list == null || list.isEmpty()) { |
| | | return; |
| | | } |
| | | // è·å SKU ä¿¡æ¯ |
| | | Map<Long, WmsItemSkuDO> skuMap = itemSkuService.getItemSkuMap( |
| | | convertSet(list, WmsInventoryReserveRespVO::getSkuId)); |
| | | // è·åä»åºä¿¡æ¯ |
| | | Map<Long, WmsWarehouseDO> warehouseMap = warehouseService.getWarehouseMap( |
| | | convertSet(list, WmsInventoryReserveRespVO::getWarehouseId)); |
| | | |
| | | for (WmsInventoryReserveRespVO vo : list) { |
| | | // ä¸å¡ç±»ååç§° |
| | | vo.setBizTypeName(DictFrameworkUtils.parseDictDataLabel(DictTypeConstants.WMS_RESERVE_BIZ_TYPE, vo.getBizType())); |
| | | // ç¶æåç§° |
| | | vo.setStatusName(DictFrameworkUtils.parseDictDataLabel(DictTypeConstants.WMS_RESERVE_STATUS, vo.getStatus())); |
| | | // SKU åç§° |
| | | WmsItemSkuDO sku = skuMap.get(vo.getSkuId()); |
| | | if (sku != null) { |
| | | vo.setSkuName(sku.getName()); |
| | | } |
| | | // ä»åºåç§° |
| | | WmsWarehouseDO warehouse = warehouseMap.get(vo.getWarehouseId()); |
| | | if (warehouse != null) { |
| | | vo.setWarehouseName(warehouse.getName()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è¡¥å
å个é¢çè®°å½ä¿¡æ¯ |
| | | */ |
| | | private void enrichReserve(WmsInventoryReserveRespVO vo) { |
| | | // ä¸å¡ç±»ååç§° |
| | | vo.setBizTypeName(DictFrameworkUtils.parseDictDataLabel(DictTypeConstants.WMS_RESERVE_BIZ_TYPE, vo.getBizType())); |
| | | // ç¶æåç§° |
| | | vo.setStatusName(DictFrameworkUtils.parseDictDataLabel(DictTypeConstants.WMS_RESERVE_STATUS, vo.getStatus())); |
| | | // SKU åç§° |
| | | List<WmsItemSkuDO> skuList = itemSkuService.getItemSkuListByIds(List.of(vo.getSkuId())); |
| | | if (!skuList.isEmpty()) { |
| | | vo.setSkuName(skuList.get(0).getName()); |
| | | } |
| | | // ä»åºåç§° |
| | | WmsWarehouseDO warehouse = warehouseService.getWarehouse(vo.getWarehouseId()); |
| | | if (warehouse != null) { |
| | | vo.setWarehouseName(warehouse.getName()); |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.controller.admin.inventory.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | @Schema(description = "管çåå° - åºåé¢çå页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class WmsInventoryReservePageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "é¢çåå·", example = "RES202606260001") |
| | | private String reserveNo; |
| | | |
| | | @Schema(description = "ä¸å¡ç±»å", example = "10") |
| | | private Integer bizType; |
| | | |
| | | @Schema(description = "ä¸å¡åæ®å·", example = "SO202606260001") |
| | | private String bizNo; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.controller.admin.inventory.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - åºåé¢ç Response VO") |
| | | @Data |
| | | public class WmsInventoryReserveRespVO { |
| | | |
| | | @Schema(description = "ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "é¢çåå·", requiredMode = Schema.RequiredMode.REQUIRED, example = "RES202606260001") |
| | | private String reserveNo; |
| | | |
| | | @Schema(description = "ä¸å¡ç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | private Integer bizType; |
| | | |
| | | @Schema(description = "ä¸å¡ç±»ååç§°", example = "éå®é¢ç") |
| | | private String bizTypeName; |
| | | |
| | | @Schema(description = "ä¸å¡åæ®ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") |
| | | private Long bizId; |
| | | |
| | | @Schema(description = "ä¸å¡åæ®å·", example = "SO202606260001") |
| | | private String bizNo; |
| | | |
| | | @Schema(description = "SKUç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long skuId; |
| | | |
| | | @Schema(description = "SKUåç§°", example = "ååA-红è²-L") |
| | | private String skuName; |
| | | |
| | | @Schema(description = "ä»åºç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long warehouseId; |
| | | |
| | | @Schema(description = "ä»åºåç§°", example = "主ä»åº") |
| | | private String warehouseName; |
| | | |
| | | @Schema(description = "é¢çæ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") |
| | | private BigDecimal reserveQuantity; |
| | | |
| | | @Schema(description = "å·²ä½¿ç¨æ°é", example = "0.00") |
| | | private BigDecimal usedQuantity; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "ç¶æåç§°", example = "é¢çä¸") |
| | | private String statusName; |
| | | |
| | | @Schema(description = "è¿ææ¶é´", example = "2026-06-30 00:00:00") |
| | | private LocalDateTime expireTime; |
| | | |
| | | @Schema(description = "夿³¨", example = "éå®è®¢åé¢ç") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| | |
| | | @Schema(description = "åååçç¼å·", example = "2048") |
| | | private Long brandId; |
| | | |
| | | @Schema(description = "ååç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| | | private LocalDateTime[] createTime; |
| | |
| | | @Schema(description = "åååçç¼å·", example = "2048") |
| | | private Long brandId; |
| | | |
| | | @Schema(description = "ååç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| | | private LocalDateTime[] createTime; |
| | |
| | | @Size(max = 20, message = "åä½é¿åº¦ä¸è½è¶
è¿ 20 个å符") |
| | | private String unit; |
| | | |
| | | @Schema(description = "计éåä½ç¼å·", example = "1") |
| | | private Long unitMeasureId; |
| | | |
| | | @Schema(description = "åååçç¼å·", example = "1") |
| | | private Long brandId; |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.dal.dataobject.inventory; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; |
| | | import cn.iocoder.yudao.module.wms.enums.inventory.WmsReserveBizTypeEnum; |
| | | import cn.iocoder.yudao.module.wms.enums.inventory.WmsReserveStatusEnum; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * WMS åºåé¢ç DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("wms_inventory_reserve") |
| | | @KeySequence("wms_inventory_reserve_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class WmsInventoryReserveDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * é¢çåå· |
| | | */ |
| | | private String reserveNo; |
| | | |
| | | /** |
| | | * ä¸å¡ç±»å |
| | | * |
| | | * æä¸¾ {@link WmsReserveBizTypeEnum} |
| | | */ |
| | | private Integer bizType; |
| | | |
| | | /** |
| | | * ä¸å¡åæ® ID |
| | | */ |
| | | private Long bizId; |
| | | |
| | | /** |
| | | * ä¸å¡åæ®å· |
| | | */ |
| | | private String bizNo; |
| | | |
| | | /** |
| | | * SKU ç¼å· |
| | | * |
| | | * å
³è {@link WmsItemSkuDO#getId()} |
| | | */ |
| | | private Long skuId; |
| | | |
| | | /** |
| | | * ä»åºç¼å· |
| | | * |
| | | * å
³è {@link WmsWarehouseDO#getId()} |
| | | */ |
| | | private Long warehouseId; |
| | | |
| | | /** |
| | | * é¢çæ°é |
| | | */ |
| | | private BigDecimal reserveQuantity; |
| | | |
| | | /** |
| | | * å·²ä½¿ç¨æ°é |
| | | */ |
| | | private BigDecimal usedQuantity; |
| | | |
| | | /** |
| | | * ç¶æ |
| | | * |
| | | * æä¸¾ {@link WmsReserveStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * è¿ææ¶é´ |
| | | */ |
| | | private LocalDateTime expireTime; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.dal.dataobject.inventory; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.md.warehouse.WmsWarehouseDO; |
| | | import cn.iocoder.yudao.module.wms.enums.inventory.WmsTransactionTypeEnum; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * WMS åºåäºå¡æµæ°´ DO |
| | | * |
| | | * è®°å½æ¯ä¸ç¬åºååå¨æä½ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("wms_inventory_transaction") |
| | | @KeySequence("wms_inventory_transaction_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class WmsInventoryTransactionDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * äºå¡æµæ°´å· |
| | | */ |
| | | private String transactionNo; |
| | | |
| | | /** |
| | | * äºå¡ç±»å |
| | | * |
| | | * æä¸¾ {@link WmsTransactionTypeEnum} |
| | | */ |
| | | private Integer transactionType; |
| | | |
| | | /** |
| | | * ä¸å¡ç±»å |
| | | */ |
| | | private Integer bizType; |
| | | |
| | | /** |
| | | * ä¸å¡åæ® ID |
| | | */ |
| | | private Long bizId; |
| | | |
| | | /** |
| | | * ä¸å¡åæ®å· |
| | | */ |
| | | private String bizNo; |
| | | |
| | | /** |
| | | * SKU ç¼å· |
| | | * |
| | | * å
³è {@link WmsItemSkuDO#getId()} |
| | | */ |
| | | private Long skuId; |
| | | |
| | | /** |
| | | * ä»åºç¼å· |
| | | * |
| | | * å
³è {@link WmsWarehouseDO#getId()} |
| | | */ |
| | | private Long warehouseId; |
| | | |
| | | /** |
| | | * å卿°é |
| | | * |
| | | * æ£æ°=å
¥åºï¼è´æ°=åºåº |
| | | */ |
| | | private BigDecimal quantity; |
| | | |
| | | /** |
| | | * åå¨åæ°é |
| | | */ |
| | | private BigDecimal beforeQuantity; |
| | | |
| | | /** |
| | | * åå¨åæ°é |
| | | */ |
| | | private BigDecimal afterQuantity; |
| | | |
| | | /** |
| | | * å
³èé¢ç ID |
| | | */ |
| | | private Long reserveId; |
| | | |
| | | /** |
| | | * å
³èé¢çåå· |
| | | */ |
| | | private String reserveNo; |
| | | |
| | | /** |
| | | * äºå¡æ¶é´ |
| | | */ |
| | | private LocalDateTime transactionTime; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| | |
| | | /** |
| | | * éå®ä»·ï¼åä½å
|
| | | */ |
| | | private BigDecimal sellingPrice; |
| | | private BigDecimal salePrice; |
| | | |
| | | /** |
| | | * ç¶æ |
| | | */ |
| | | private Integer status; |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; |
| | | import cn.iocoder.yudao.module.wms.api.inventory.dto.WmsInventoryQueryReqDTO; |
| | | import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryListReqVO; |
| | | import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryPageReqVO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO; |
| | |
| | | throw new IllegalArgumentException("æªç¥åºåç»è®¡ç»´åº¦ï¼" + type); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ® API æ¥è¯¢æ¡ä»¶æ¥è¯¢åºåå表 |
| | | */ |
| | | default List<WmsInventoryDO> selectListByQuery(WmsInventoryQueryReqDTO reqDTO) { |
| | | LambdaQueryWrapperX<WmsInventoryDO> query = new LambdaQueryWrapperX<WmsInventoryDO>() |
| | | .inIfPresent(WmsInventoryDO::getSkuId, reqDTO.getSkuIds()) |
| | | .inIfPresent(WmsInventoryDO::getWarehouseId, reqDTO.getWarehouseIds()); |
| | | if (Boolean.TRUE.equals(reqDTO.getOnlyPositive())) { |
| | | query.gt(WmsInventoryDO::getQuantity, BigDecimal.ZERO); |
| | | } |
| | | return selectList(query); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.dal.mysql.inventory; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.wms.api.inventory.dto.WmsInventoryQueryReqDTO; |
| | | import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryReservePageReqVO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryReserveDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import org.apache.ibatis.annotations.Select; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * WMS åºåé¢ç Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface WmsInventoryReserveMapper extends BaseMapperX<WmsInventoryReserveDO> { |
| | | |
| | | default PageResult<WmsInventoryReserveDO> selectPage(WmsInventoryReservePageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<WmsInventoryReserveDO>() |
| | | .likeIfPresent(WmsInventoryReserveDO::getReserveNo, reqVO.getReserveNo()) |
| | | .eqIfPresent(WmsInventoryReserveDO::getBizType, reqVO.getBizType()) |
| | | .likeIfPresent(WmsInventoryReserveDO::getBizNo, reqVO.getBizNo()) |
| | | .eqIfPresent(WmsInventoryReserveDO::getStatus, reqVO.getStatus()) |
| | | .orderByDesc(WmsInventoryReserveDO::getId)); |
| | | } |
| | | |
| | | default List<WmsInventoryReserveDO> selectListByBiz(Integer bizType, Long bizId) { |
| | | return selectList(new LambdaQueryWrapperX<WmsInventoryReserveDO>() |
| | | .eq(WmsInventoryReserveDO::getBizType, bizType) |
| | | .eq(WmsInventoryReserveDO::getBizId, bizId) |
| | | .in(WmsInventoryReserveDO::getStatus, 0, 1)); // é¢ç䏿é¨åä½¿ç¨ |
| | | } |
| | | |
| | | default WmsInventoryReserveDO selectByReserveNo(String reserveNo) { |
| | | return selectOne(WmsInventoryReserveDO::getReserveNo, reserveNo); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢æå® SKU åä»åºçé¢çæ°é |
| | | */ |
| | | @Select("SELECT IFNULL(SUM(reserve_quantity - used_quantity), 0) FROM wms_inventory_reserve " + |
| | | "WHERE sku_id = #{skuId} AND warehouse_id = #{warehouseId} AND status IN (0, 1) AND deleted = 0") |
| | | BigDecimal selectReserveQuantity(@Param("skuId") Long skuId, @Param("warehouseId") Long warehouseId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.dal.mysql.inventory; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryTransactionDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * WMS åºåäºå¡æµæ°´ Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface WmsInventoryTransactionMapper extends BaseMapperX<WmsInventoryTransactionDO> { |
| | | |
| | | default List<WmsInventoryTransactionDO> selectListByBiz(Integer bizType, Long bizId) { |
| | | return selectList(new LambdaQueryWrapperX<WmsInventoryTransactionDO>() |
| | | .eq(WmsInventoryTransactionDO::getBizType, bizType) |
| | | .eq(WmsInventoryTransactionDO::getBizId, bizId) |
| | | .orderByAsc(WmsInventoryTransactionDO::getTransactionTime)); |
| | | } |
| | | |
| | | default WmsInventoryTransactionDO selectByTransactionNo(String transactionNo) { |
| | | return selectOne(WmsInventoryTransactionDO::getTransactionNo, transactionNo); |
| | | } |
| | | |
| | | } |
| | |
| | | String RECEIPT_ORDER_TYPE = "wms_receipt_order_type"; |
| | | String SHIPMENT_ORDER_TYPE = "wms_shipment_order_type"; |
| | | |
| | | String WMS_RESERVE_BIZ_TYPE = "wms_reserve_biz_type"; |
| | | String WMS_RESERVE_STATUS = "wms_reserve_status"; |
| | | String WMS_TRANSACTION_TYPE = "wms_transaction_type"; |
| | | |
| | | } |
| | |
| | | // ========== WMS åºå 1-060-300-000 ========== |
| | | ErrorCode INVENTORY_QUANTITY_NOT_ENOUGH = new ErrorCode(1_060_300_000, |
| | | "åºåä¸è¶³ï¼ååï¼{}ï¼ååè§æ ¼ï¼{}ï¼ä»åºï¼{}ï¼å½ååºåï¼{}ï¼åæ´æ°éï¼{}"); |
| | | ErrorCode INVENTORY_QUANTITY_NOT_ENOUGH_FOR_RESERVE = new ErrorCode(1_060_300_001, |
| | | "å¯ç¨åºåä¸è¶³ï¼SKUï¼{}ï¼ä»åºï¼{}ï¼å¯ç¨åºåï¼{}ï¼é¢çæ°éï¼{}"); |
| | | |
| | | // ========== WMS åºåé¢ç 1-060-301-000 ========== |
| | | ErrorCode INVENTORY_RESERVE_NOT_EXISTS = new ErrorCode(1_060_301_000, "åºåé¢çä¸åå¨"); |
| | | ErrorCode INVENTORY_RESERVE_STATUS_INVALID = new ErrorCode(1_060_301_001, "åºåé¢çç¶æä¸å
è®¸æ¤æä½"); |
| | | ErrorCode INVENTORY_RESERVE_QUANTITY_NOT_ENOUGH = new ErrorCode(1_060_301_002, |
| | | "é¢çæ°éä¸è¶³ï¼é¢çåå·ï¼{}ï¼å©ä½é¢çï¼{}ï¼è¯·æ±ä½¿ç¨ï¼{}"); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.enums.inventory; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * WMS åºåä¸å¡ç±»åæä¸¾ |
| | | * |
| | | * ç¨äºåºååºåæä½çä¸å¡æ¥æº |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum WmsInventoryBizTypeEnum implements ArrayValuable<Integer> { |
| | | |
| | | // ========== å
¥åºç±»å [100, 150) ========== |
| | | |
| | | PURCHASE_RECEIPT(100, "ERP éè´å
¥åº"), |
| | | PRODUCE_RECEIPT(101, "MES ç产å
¥åº"), |
| | | RETURN_RECEIPT(102, "éè´§å
¥åº"), |
| | | OTHER_RECEIPT(103, "å
¶ä»å
¥åº"), |
| | | OTHER(104, "å
¶ä»"), |
| | | |
| | | // ========== åºåºç±»å [150, 200) ========== |
| | | |
| | | SALE_SHIPMENT(150, "ERP éå®åºåº"), |
| | | PRODUCE_MATERIAL(151, "MES çäº§é¢æ"), |
| | | RETURN_SHIPMENT(152, "éè´§åºåº"), |
| | | OTHER_SHIPMENT(153, "å
¶ä»åºåº"), |
| | | |
| | | ; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()) |
| | | .map(WmsInventoryBizTypeEnum::getType).toArray(Integer[]::new); |
| | | |
| | | /** |
| | | * ç±»å |
| | | */ |
| | | private final Integer type; |
| | | /** |
| | | * åç§° |
| | | */ |
| | | private final String name; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | /** |
| | | * 夿æ¯å¦ä¸ºå
¥åºç±»å |
| | | */ |
| | | public static boolean isReceiptType(Integer type) { |
| | | return type != null && type >= 100 && type < 150; |
| | | } |
| | | |
| | | /** |
| | | * 夿æ¯å¦ä¸ºåºåºç±»å |
| | | */ |
| | | public static boolean isShipmentType(Integer type) { |
| | | return type != null && type >= 150 && type < 200; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.enums.inventory; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * WMS åºåé¢çä¸å¡ç±»åæä¸¾ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum WmsReserveBizTypeEnum implements ArrayValuable<Integer> { |
| | | |
| | | SALE(10, "éå®é¢ç"), |
| | | PRODUCE(20, "ç产é¢ç"), |
| | | ; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()) |
| | | .map(WmsReserveBizTypeEnum::getType).toArray(Integer[]::new); |
| | | |
| | | /** |
| | | * ç±»å |
| | | */ |
| | | private final Integer type; |
| | | /** |
| | | * åç§° |
| | | */ |
| | | private final String name; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.enums.inventory; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * WMS åºåé¢çç¶ææä¸¾ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum WmsReserveStatusEnum implements ArrayValuable<Integer> { |
| | | |
| | | RESERVED(0, "é¢çä¸"), |
| | | PARTIAL_USED(1, "é¨å使ç¨"), |
| | | USED(2, "已使ç¨"), |
| | | RELEASED(3, "已鿾"), |
| | | ; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()) |
| | | .map(WmsReserveStatusEnum::getStatus).toArray(Integer[]::new); |
| | | |
| | | /** |
| | | * ç¶æ |
| | | */ |
| | | private final Integer status; |
| | | /** |
| | | * åç§° |
| | | */ |
| | | private final String name; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.enums.inventory; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * WMS åºåäºå¡ç±»åæä¸¾ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum WmsTransactionTypeEnum implements ArrayValuable<Integer> { |
| | | |
| | | RECEIPT(10, "å
¥åº"), |
| | | SHIPMENT(20, "åºåº"), |
| | | RESERVE(30, "é¢ç"), |
| | | RELEASE(40, "éæ¾"), |
| | | CHECK(50, "çç¹"), |
| | | MOVE(60, "è°æ¨"), |
| | | ; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()) |
| | | .map(WmsTransactionTypeEnum::getType).toArray(Integer[]::new); |
| | | |
| | | /** |
| | | * ç±»å |
| | | */ |
| | | private final Integer type; |
| | | /** |
| | | * åç§° |
| | | */ |
| | | private final String name; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.enums.stock; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * åºåä¸å¡ç±»åæä¸¾ |
| | | * |
| | | * å®ä¹åºååå¨çä¸å¡æ¥æº |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum StockBizTypeEnum { |
| | | |
| | | // ==================== å
¥åºç±»å ==================== |
| | | |
| | | PURCHASE_IN(10, "éè´å
¥åº"), |
| | | PURCHASE_IN_CANCEL(11, "éè´å
¥åºä½åº"), |
| | | |
| | | PRODUCE_IN(30, "ç产å
¥åº"), |
| | | PRODUCE_IN_CANCEL(31, "ç产å
¥åºä½åº"), |
| | | |
| | | PRODUCE_RETURN(50, "ç产éæ"), |
| | | PRODUCE_RETURN_CANCEL(51, "ç产éæä½åº"), |
| | | |
| | | SALE_RETURN_IN(70, "éå®éè´§å
¥åº"), |
| | | SALE_RETURN_IN_CANCEL(71, "éå®éè´§å
¥åºä½åº"), |
| | | |
| | | TRANSFER_IN(80, "è°æ¨å
¥åº"), |
| | | TRANSFER_IN_CANCEL(81, "è°æ¨å
¥åºä½åº"), |
| | | |
| | | CHECK_IN(100, "ççå
¥åº"), |
| | | CHECK_IN_CANCEL(101, "ççå
¥åºä½åº"), |
| | | |
| | | // ==================== åºåºç±»å ==================== |
| | | |
| | | SALE_OUT(20, "éå®åºåº"), |
| | | SALE_OUT_CANCEL(21, "éå®åºåºä½åº"), |
| | | |
| | | PRODUCE_ISSUE(40, "çäº§é¢æ"), |
| | | PRODUCE_ISSUE_CANCEL(41, "çäº§é¢æä½åº"), |
| | | |
| | | PURCHASE_RETURN_OUT(60, "éè´éè´§åºåº"), |
| | | PURCHASE_RETURN_OUT_CANCEL(61, "éè´éè´§åºåºä½åº"), |
| | | |
| | | TRANSFER_OUT(90, "è°æ¨åºåº"), |
| | | TRANSFER_OUT_CANCEL(91, "è°æ¨åºåºä½åº"), |
| | | |
| | | CHECK_OUT(110, "çäºåºåº"), |
| | | CHECK_OUT_CANCEL(111, "çäºåºåºä½åº"); |
| | | |
| | | /** |
| | | * ä¸å¡ç±»åç¼ç |
| | | */ |
| | | private final Integer type; |
| | | |
| | | /** |
| | | * ä¸å¡ç±»ååç§° |
| | | */ |
| | | private final String name; |
| | | |
| | | /** |
| | | * 夿æ¯å¦ä¸ºå
¥åºç±»å |
| | | */ |
| | | public boolean isInbound() { |
| | | // å
¥åºç±»åç¼ç ï¼10, 30, 50, 70, 80, 100 |
| | | return type % 20 == 10 || type == 50 || type == 70 || type == 100; |
| | | } |
| | | |
| | | /** |
| | | * 夿æ¯å¦ä¸ºåºåºç±»å |
| | | */ |
| | | public boolean isOutbound() { |
| | | // åºåºç±»åç¼ç ï¼20, 40, 60, 90, 110 |
| | | return type % 20 == 0 && type != 0 && !isInbound(); |
| | | } |
| | | |
| | | /** |
| | | * 夿æ¯å¦ä¸ºä½åºç±»å |
| | | */ |
| | | public boolean isCancel() { |
| | | return type % 10 == 1 && type != 11; // ä½åºç±»åçç¼ç å°¾æ°ä¸º 1 |
| | | } |
| | | |
| | | /** |
| | | * è·å对åºçæ£å¸¸ä¸å¡ç±»åï¼å¦ææ¯ä½åºç±»åï¼ |
| | | */ |
| | | public StockBizTypeEnum getNormalType() { |
| | | if (isCancel()) { |
| | | return fromType(type - 1); |
| | | } |
| | | return this; |
| | | } |
| | | |
| | | /** |
| | | * è·å对åºçä½åºä¸å¡ç±»åï¼å¦ææ¯æ£å¸¸ç±»åï¼ |
| | | */ |
| | | public StockBizTypeEnum getCancelType() { |
| | | if (!isCancel()) { |
| | | return fromType(type + 1); |
| | | } |
| | | return this; |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®ç±»åç¼ç è·åæä¸¾ |
| | | */ |
| | | public static StockBizTypeEnum fromType(Integer type) { |
| | | for (StockBizTypeEnum value : values()) { |
| | | if (value.getType().equals(type)) { |
| | | return value; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.service.inventory; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.wms.api.inventory.dto.*; |
| | | import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryReservePageReqVO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryReserveDO; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * WMS åºåé¢ç Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface WmsInventoryReserveService { |
| | | |
| | | /** |
| | | * å建åºåé¢ç |
| | | * |
| | | * @param reqDTO é¢çè¯·æ± |
| | | * @return é¢çåå· |
| | | */ |
| | | String createReserve(WmsReserveReqDTO reqDTO); |
| | | |
| | | /** |
| | | * éæ¾åºåé¢ç |
| | | * |
| | | * @param reserveNo é¢çåå· |
| | | */ |
| | | void releaseReserve(String reserveNo); |
| | | |
| | | /** |
| | | * 使ç¨é¢çåºåï¼æ£åï¼ |
| | | * |
| | | * @param reqDTO 使ç¨è¯·æ± |
| | | */ |
| | | void useReserve(WmsUseReserveReqDTO reqDTO); |
| | | |
| | | /** |
| | | * æ ¹æ®ä¸å¡æ¥è¯¢é¢çè®°å½ |
| | | * |
| | | * @param bizType ä¸å¡ç±»å |
| | | * @param bizId ä¸å¡åæ®ID |
| | | * @return é¢çè®°å½å表 |
| | | */ |
| | | List<WmsInventoryReserveDO> getReserveListByBiz(Integer bizType, Long bizId); |
| | | |
| | | /** |
| | | * è·ååºåé¢çå页 |
| | | * |
| | | * @param reqVO åé¡µè¯·æ± |
| | | * @return åé¡µç»æ |
| | | */ |
| | | PageResult<WmsInventoryReserveDO> getReservePage(WmsInventoryReservePageReqVO reqVO); |
| | | |
| | | /** |
| | | * è·åé¢ç详æ
|
| | | * |
| | | * @param id é¢çID |
| | | * @return é¢çè®°å½ |
| | | */ |
| | | WmsInventoryReserveDO getReserve(Long id); |
| | | |
| | | /** |
| | | * æ¥è¯¢æå® SKU åä»åºçé¢çæ°é |
| | | * |
| | | * @param skuId SKUç¼å· |
| | | * @param warehouseId ä»åºç¼å· |
| | | * @return é¢çæ°é |
| | | */ |
| | | BigDecimal getReserveQuantity(Long skuId, Long warehouseId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.service.inventory; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.wms.api.inventory.dto.*; |
| | | import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryReservePageReqVO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryReserveDO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryTransactionDO; |
| | | import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryReserveMapper; |
| | | import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryTransactionMapper; |
| | | import cn.iocoder.yudao.module.wms.enums.inventory.WmsReserveStatusEnum; |
| | | import cn.iocoder.yudao.module.wms.enums.inventory.WmsTransactionTypeEnum; |
| | | import cn.iocoder.yudao.module.wms.service.inventory.dto.WmsInventoryChangeReqDTO; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.List; |
| | | import java.util.UUID; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * WMS åºåé¢ç Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class WmsInventoryReserveServiceImpl implements WmsInventoryReserveService { |
| | | |
| | | @Resource |
| | | private WmsInventoryReserveMapper reserveMapper; |
| | | |
| | | @Resource |
| | | private WmsInventoryTransactionMapper transactionMapper; |
| | | |
| | | @Resource |
| | | private WmsInventoryService inventoryService; |
| | | |
| | | @Resource |
| | | private WmsInventoryTransactionService transactionService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public String createReserve(WmsReserveReqDTO reqDTO) { |
| | | // 1. æ ¡éªå¯ç¨åºå |
| | | BigDecimal availableQuantity = inventoryService.getAvailableQuantity(reqDTO.getSkuId(), reqDTO.getWarehouseId()); |
| | | if (availableQuantity.compareTo(reqDTO.getQuantity()) < 0) { |
| | | throw exception(INVENTORY_QUANTITY_NOT_ENOUGH_FOR_RESERVE, |
| | | reqDTO.getSkuId(), reqDTO.getWarehouseId(), availableQuantity, reqDTO.getQuantity()); |
| | | } |
| | | |
| | | // 2. çæé¢çåå· |
| | | String reserveNo = generateReserveNo(); |
| | | |
| | | // 3. å建é¢çè®°å½ |
| | | WmsInventoryReserveDO reserve = BeanUtils.toBean(reqDTO, WmsInventoryReserveDO.class); |
| | | reserve.setReserveNo(reserveNo); |
| | | reserve.setReserveQuantity(reqDTO.getQuantity()); |
| | | reserve.setUsedQuantity(BigDecimal.ZERO); |
| | | reserve.setStatus(WmsReserveStatusEnum.RESERVED.getStatus()); |
| | | reserveMapper.insert(reserve); |
| | | |
| | | // 4. è®°å½äºå¡æµæ°´ |
| | | transactionService.createTransaction(buildReserveTransaction(reserve, reqDTO.getQuantity())); |
| | | |
| | | return reserveNo; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void releaseReserve(String reserveNo) { |
| | | // 1. æ¥è¯¢é¢çè®°å½ |
| | | WmsInventoryReserveDO reserve = reserveMapper.selectByReserveNo(reserveNo); |
| | | if (reserve == null) { |
| | | throw exception(INVENTORY_RESERVE_NOT_EXISTS); |
| | | } |
| | | // 1.1 æ ¡éªç¶æï¼åªæé¢ç䏿é¨å使ç¨ç¶æå¯éæ¾ |
| | | if (reserve.getStatus() != WmsReserveStatusEnum.RESERVED.getStatus() |
| | | && reserve.getStatus() != WmsReserveStatusEnum.PARTIAL_USED.getStatus()) { |
| | | throw exception(INVENTORY_RESERVE_STATUS_INVALID); |
| | | } |
| | | |
| | | // 2. 计ç®éæ¾æ°é |
| | | BigDecimal releaseQuantity = reserve.getReserveQuantity().subtract(reserve.getUsedQuantity()); |
| | | |
| | | // 3. æ´æ°é¢çç¶æ |
| | | reserve.setStatus(WmsReserveStatusEnum.RELEASED.getStatus()); |
| | | reserveMapper.updateById(reserve); |
| | | |
| | | // 4. è®°å½äºå¡æµæ°´ï¼éæ¾ä¸ºè´æ°ï¼ |
| | | transactionService.createTransaction(buildReleaseTransaction(reserve, releaseQuantity.negate())); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void useReserve(WmsUseReserveReqDTO reqDTO) { |
| | | // 1. æ¥è¯¢é¢çè®°å½ |
| | | WmsInventoryReserveDO reserve = reserveMapper.selectByReserveNo(reqDTO.getReserveNo()); |
| | | if (reserve == null) { |
| | | throw exception(INVENTORY_RESERVE_NOT_EXISTS); |
| | | } |
| | | // 1.1 æ ¡éªç¶æ |
| | | if (reserve.getStatus() != WmsReserveStatusEnum.RESERVED.getStatus() |
| | | && reserve.getStatus() != WmsReserveStatusEnum.PARTIAL_USED.getStatus()) { |
| | | throw exception(INVENTORY_RESERVE_STATUS_INVALID); |
| | | } |
| | | |
| | | // 2. 计ç®å©ä½å¯ä½¿ç¨æ°é |
| | | BigDecimal remainQuantity = reserve.getReserveQuantity().subtract(reserve.getUsedQuantity()); |
| | | if (reqDTO.getQuantity().compareTo(remainQuantity) > 0) { |
| | | throw exception(INVENTORY_RESERVE_QUANTITY_NOT_ENOUGH, reqDTO.getReserveNo(), remainQuantity, reqDTO.getQuantity()); |
| | | } |
| | | |
| | | // 3. æ´æ°å·²ä½¿ç¨æ°éåç¶æ |
| | | BigDecimal newUsedQuantity = reserve.getUsedQuantity().add(reqDTO.getQuantity()); |
| | | reserve.setUsedQuantity(newUsedQuantity); |
| | | if (newUsedQuantity.compareTo(reserve.getReserveQuantity()) == 0) { |
| | | reserve.setStatus(WmsReserveStatusEnum.USED.getStatus()); |
| | | } else { |
| | | reserve.setStatus(WmsReserveStatusEnum.PARTIAL_USED.getStatus()); |
| | | } |
| | | reserveMapper.updateById(reserve); |
| | | } |
| | | |
| | | @Override |
| | | public List<WmsInventoryReserveDO> getReserveListByBiz(Integer bizType, Long bizId) { |
| | | return reserveMapper.selectListByBiz(bizType, bizId); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<WmsInventoryReserveDO> getReservePage(WmsInventoryReservePageReqVO reqVO) { |
| | | return reserveMapper.selectPage(reqVO); |
| | | } |
| | | |
| | | @Override |
| | | public WmsInventoryReserveDO getReserve(Long id) { |
| | | return reserveMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public BigDecimal getReserveQuantity(Long skuId, Long warehouseId) { |
| | | return reserveMapper.selectReserveQuantity(skuId, warehouseId); |
| | | } |
| | | |
| | | /** |
| | | * çæé¢çåå· |
| | | */ |
| | | private String generateReserveNo() { |
| | | return "RES" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) |
| | | + UUID.randomUUID().toString().substring(0, 8).toUpperCase(); |
| | | } |
| | | |
| | | /** |
| | | * æå»ºé¢çäºå¡æµæ°´ |
| | | */ |
| | | private WmsInventoryTransactionDO buildReserveTransaction(WmsInventoryReserveDO reserve, BigDecimal quantity) { |
| | | return WmsInventoryTransactionDO.builder() |
| | | .transactionNo(generateTransactionNo()) |
| | | .transactionType(WmsTransactionTypeEnum.RESERVE.getType()) |
| | | .bizType(reserve.getBizType()) |
| | | .bizId(reserve.getBizId()) |
| | | .bizNo(reserve.getBizNo()) |
| | | .skuId(reserve.getSkuId()) |
| | | .warehouseId(reserve.getWarehouseId()) |
| | | .quantity(quantity) |
| | | .reserveId(reserve.getId()) |
| | | .reserveNo(reserve.getReserveNo()) |
| | | .transactionTime(LocalDateTime.now()) |
| | | .remark(reserve.getRemark()) |
| | | .build(); |
| | | } |
| | | |
| | | /** |
| | | * æå»ºéæ¾äºå¡æµæ°´ |
| | | */ |
| | | private WmsInventoryTransactionDO buildReleaseTransaction(WmsInventoryReserveDO reserve, BigDecimal quantity) { |
| | | return WmsInventoryTransactionDO.builder() |
| | | .transactionNo(generateTransactionNo()) |
| | | .transactionType(WmsTransactionTypeEnum.RELEASE.getType()) |
| | | .bizType(reserve.getBizType()) |
| | | .bizId(reserve.getBizId()) |
| | | .bizNo(reserve.getBizNo()) |
| | | .skuId(reserve.getSkuId()) |
| | | .warehouseId(reserve.getWarehouseId()) |
| | | .quantity(quantity) |
| | | .reserveId(reserve.getId()) |
| | | .reserveNo(reserve.getReserveNo()) |
| | | .transactionTime(LocalDateTime.now()) |
| | | .remark("éæ¾é¢ç") |
| | | .build(); |
| | | } |
| | | |
| | | /** |
| | | * çæäºå¡æµæ°´å· |
| | | */ |
| | | private String generateTransactionNo() { |
| | | return "TRX" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) |
| | | + UUID.randomUUID().toString().substring(0, 6).toUpperCase(); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.wms.service.inventory.dto.WmsInventoryChangeReqDTO; |
| | | import cn.iocoder.yudao.module.wms.service.inventory.dto.WmsInventoryCheckReqDTO; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | */ |
| | | void changeInventory(WmsInventoryChangeReqDTO reqDTO); |
| | | |
| | | /** |
| | | * è·åå¯ç¨åºåæ°éï¼æ»åºå - é¢çåºåï¼ |
| | | * |
| | | * @param skuId SKU ç¼å· |
| | | * @param warehouseId ä»åºç¼å· |
| | | * @return å¯ç¨åºåæ°é |
| | | */ |
| | | BigDecimal getAvailableQuantity(Long skuId, Long warehouseId); |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.wms.controller.admin.inventory.vo.WmsInventoryPageReqVO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryDO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryHistoryDO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryReserveDO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; |
| | | import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryMapper; |
| | | import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryReserveMapper; |
| | | import cn.iocoder.yudao.module.wms.service.inventory.dto.WmsInventoryChangeReqDTO; |
| | | import cn.iocoder.yudao.module.wms.service.inventory.dto.WmsInventoryCheckReqDTO; |
| | | import cn.iocoder.yudao.module.wms.service.md.item.WmsItemService; |
| | |
| | | |
| | | @Resource |
| | | private WmsInventoryHistoryService inventoryHistoryService; |
| | | |
| | | @Resource |
| | | private WmsInventoryReserveMapper reserveMapper; |
| | | |
| | | @Resource |
| | | private WmsItemSkuService itemSkuService; |
| | |
| | | item.getWarehouseId(), beforeQuantity, item.getQuantity()); |
| | | } |
| | | |
| | | @Override |
| | | public BigDecimal getAvailableQuantity(Long skuId, Long warehouseId) { |
| | | // 1. æ¥è¯¢åºåæ°é |
| | | WmsInventoryDO inventory = inventoryMapper.selectBySkuIdAndWarehouseId(skuId, warehouseId); |
| | | if (inventory == null) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | |
| | | // 2. æ¥è¯¢é¢çæ°é |
| | | BigDecimal reserveQuantity = reserveMapper.selectReserveQuantity(skuId, warehouseId); |
| | | |
| | | // 3. 计ç®å¯ç¨æ°é |
| | | return inventory.getQuantity().subtract(reserveQuantity != null ? reserveQuantity : BigDecimal.ZERO); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.service.inventory; |
| | | |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryTransactionDO; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * WMS åºåäºå¡æµæ°´ Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface WmsInventoryTransactionService { |
| | | |
| | | /** |
| | | * å建äºå¡æµæ°´ |
| | | * |
| | | * @param transaction äºå¡æµæ°´ |
| | | * @return äºå¡æµæ°´ID |
| | | */ |
| | | Long createTransaction(WmsInventoryTransactionDO transaction); |
| | | |
| | | /** |
| | | * æ¹éå建äºå¡æµæ°´ |
| | | * |
| | | * @param transactions äºå¡æµæ°´å表 |
| | | */ |
| | | void createTransactionList(List<WmsInventoryTransactionDO> transactions); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.wms.service.inventory; |
| | | |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.inventory.WmsInventoryTransactionDO; |
| | | import cn.iocoder.yudao.module.wms.dal.mysql.inventory.WmsInventoryTransactionMapper; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * WMS åºåäºå¡æµæ°´ Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class WmsInventoryTransactionServiceImpl implements WmsInventoryTransactionService { |
| | | |
| | | @Resource |
| | | private WmsInventoryTransactionMapper transactionMapper; |
| | | |
| | | @Override |
| | | public Long createTransaction(WmsInventoryTransactionDO transaction) { |
| | | transactionMapper.insert(transaction); |
| | | return transaction.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void createTransactionList(List<WmsInventoryTransactionDO> transactions) { |
| | | if (transactions != null && !transactions.isEmpty()) { |
| | | transactionMapper.insertBatch(transactions); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.wms.service.md.item; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemCreateReqDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemUpdateReqDTO; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi; |
| | | import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; |
| | | import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item.WmsItemListReqVO; |
| | | import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item.WmsItemPageReqVO; |
| | | import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.item.WmsItemSaveReqVO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemDO; |
| | | import cn.iocoder.yudao.module.wms.dal.mysql.md.item.WmsItemMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.*; |
| | |
| | | /** |
| | | * WMS åå Service å®ç°ç±» |
| | | * |
| | | * æ¹é 说æï¼WMS ååæ°æ®æ¥æºäº MDM ç©æä¸»æ°æ® |
| | | * - æææä½è°ç¨ MDM API |
| | | * - WMS ååå¯¹åº MDM ç©æç±»å = ç©æï¼itemType = 1ï¼ |
| | | * - åæ®µæ å°ï¼WmsItemDO.unit <- MDM 计éåä½åç§° |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class WmsItemServiceImpl implements WmsItemService { |
| | | |
| | | /** WMS åå对åºç MDM ç©æç±»åï¼ç©æ */ |
| | | private static final int MDM_ITEM_TYPE_MATERIAL = 1; |
| | | |
| | | @Resource |
| | | private WmsItemMapper itemMapper; |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | @Resource |
| | | @Lazy // å»¶è¿å è½½ï¼é¿å
循ç¯ä¾èµ |
| | | private WmsItemCategoryService categoryService; |
| | | @Resource |
| | | @Lazy // å»¶è¿å è½½ï¼é¿å
循ç¯ä¾èµ |
| | | private WmsItemBrandService brandService; |
| | | @Resource |
| | | private WmsItemSkuService itemSkuService; |
| | | private MdmUnitMeasureApi mdmUnitMeasureApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createItem(WmsItemSaveReqVO createReqVO) { |
| | | // æ ¡éªæ°æ® |
| | | validateItemSaveData(createReqVO); |
| | | |
| | | // æå
¥åå |
| | | WmsItemDO item = BeanUtils.toBean(createReqVO, WmsItemDO.class); |
| | | itemMapper.insert(item); |
| | | // æå
¥ SKU |
| | | itemSkuService.createItemSkuList(item.getId(), createReqVO.getSkus()); |
| | | return item.getId(); |
| | | // æå»ºå建请æ±å¹¶è°ç¨ MDM API |
| | | MdmItemCreateReqDTO createReqDTO = buildCreateReqDTO(createReqVO); |
| | | return mdmItemApi.createItem(createReqDTO).getCheckedData(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateItem(WmsItemSaveReqVO updateReqVO) { |
| | | // æ ¡éªåå¨ |
| | | validateItemExists(updateReqVO.getId()); |
| | | // æ ¡éªæ°æ® |
| | | validateItemSaveData(updateReqVO); |
| | | |
| | | // æ´æ°åå |
| | | WmsItemDO updateObj = BeanUtils.toBean(updateReqVO, WmsItemDO.class); |
| | | itemMapper.updateById(updateObj); |
| | | // æ´æ° SKU |
| | | itemSkuService.updateItemSkuList(updateReqVO.getId(), updateReqVO.getSkus()); |
| | | } |
| | | |
| | | private void validateItemSaveData(WmsItemSaveReqVO reqVO) { |
| | | // æ ¡éªååç¼å·å¯ä¸ |
| | | validateItemCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | // æ ¡éªåååç§°å¯ä¸ |
| | | validateItemNameUnique(reqVO.getId(), reqVO.getName()); |
| | | // æ ¡éªåååç±»åå¨ |
| | | validateCategoryExists(reqVO.getCategoryId()); |
| | | // æ ¡éªåååçåå¨ |
| | | validateBrandExists(reqVO.getBrandId()); |
| | | } |
| | | |
| | | private void validateItemCodeUnique(Long id, String code) { |
| | | WmsItemDO item = itemMapper.selectByCode(code); |
| | | if (item == null) { |
| | | return; |
| | | } |
| | | if (id == null || ObjectUtil.notEqual(item.getId(), id)) { |
| | | throw exception(ITEM_CODE_DUPLICATE); |
| | | } |
| | | } |
| | | |
| | | private void validateItemNameUnique(Long id, String name) { |
| | | WmsItemDO item = itemMapper.selectByName(name); |
| | | if (item == null) { |
| | | return; |
| | | } |
| | | if (id == null || ObjectUtil.notEqual(item.getId(), id)) { |
| | | throw exception(ITEM_NAME_DUPLICATE); |
| | | } |
| | | } |
| | | |
| | | private void validateCategoryExists(Long categoryId) { |
| | | categoryService.validateItemCategoryExists(categoryId); |
| | | } |
| | | |
| | | private void validateBrandExists(Long brandId) { |
| | | if (brandId == null) { |
| | | return; |
| | | } |
| | | brandService.validateItemBrandExists(brandId); |
| | | // æå»ºæ´æ°è¯·æ±å¹¶è°ç¨ MDM API |
| | | MdmItemUpdateReqDTO updateReqDTO = buildUpdateReqDTO(updateReqVO); |
| | | mdmItemApi.updateItem(updateReqDTO); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deleteItem(Long id) { |
| | | // æ ¡éªåå¨ |
| | | validateItemExists(id); |
| | | |
| | | // å é¤ååå SKU |
| | | itemSkuService.deleteItemSkuListByItemId(id); |
| | | itemMapper.deleteById(id); |
| | | // WMS ååå é¤å®é
为ç¦ç¨ï¼MDM ç©æä¸è½ç©çå é¤ï¼ |
| | | mdmItemApi.updateItemStatus(id, CommonStatusEnum.DISABLE.getStatus()); |
| | | } |
| | | |
| | | @Override |
| | | public WmsItemDO validateItemExists(Long id) { |
| | | WmsItemDO item = itemMapper.selectById(id); |
| | | if (item == null) { |
| | | throw exception(ITEM_NOT_EXISTS); |
| | | } |
| | | return item; |
| | | MdmItemRespDTO item = mdmItemApi.validateItemExists(id).getCheckedData(); |
| | | return convertToWmsItemDO(item); |
| | | } |
| | | |
| | | @Override |
| | | public WmsItemDO getItem(Long id) { |
| | | return itemMapper.selectById(id); |
| | | MdmItemRespDTO item = mdmItemApi.getItem(id).getCheckedData(); |
| | | if (item == null) { |
| | | return null; |
| | | } |
| | | return convertToWmsItemDO(item); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<WmsItemDO> getItemPage(WmsItemPageReqVO pageReqVO) { |
| | | return itemMapper.selectPage(pageReqVO, |
| | | categoryService.getSelfAndChildItemCategoryIdList(pageReqVO.getCategoryId())); |
| | | // è°ç¨ MDM API å页æ¥è¯¢ |
| | | PageResult<MdmItemRespDTO> mdmPageResult = mdmItemApi.getItemPage( |
| | | MDM_ITEM_TYPE_MATERIAL, |
| | | pageReqVO.getStatus(), |
| | | pageReqVO.getPageNo(), |
| | | pageReqVO.getPageSize() |
| | | ).getCheckedData(); |
| | | |
| | | // 转æ¢ç»æ |
| | | List<WmsItemDO> itemList = convertToWmsItemDOList(mdmPageResult.getList()); |
| | | return new PageResult<>(itemList, mdmPageResult.getTotal()); |
| | | } |
| | | |
| | | @Override |
| | | public List<WmsItemDO> getItemList(WmsItemListReqVO listReqVO) { |
| | | return itemMapper.selectList(listReqVO, |
| | | categoryService.getSelfAndChildItemCategoryIdList(listReqVO.getCategoryId())); |
| | | // è°ç¨ MDM API è·åå表 |
| | | List<MdmItemRespDTO> itemList = mdmItemApi.getItemListByStatus(listReqVO.getStatus()).getCheckedData(); |
| | | return convertToWmsItemDOList(itemList); |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return itemMapper.selectByIds(ids); |
| | | List<MdmItemRespDTO> itemList = mdmItemApi.getItemList(ids).getCheckedData(); |
| | | return convertToWmsItemDOList(itemList); |
| | | } |
| | | |
| | | @Override |
| | | public long getItemCountByCategoryId(Long categoryId) { |
| | | return itemMapper.selectCountByCategoryId(categoryId); |
| | | return mdmItemApi.getItemCountByCategoryId(categoryId).getCheckedData(); |
| | | } |
| | | |
| | | @Override |
| | | public long getItemCountByBrandId(Long brandId) { |
| | | return itemMapper.selectCountByBrandId(brandId); |
| | | // MDM ææ æåçç»è®¡æ¹æ³ï¼è¿å 0 |
| | | return 0L; |
| | | } |
| | | |
| | | } |
| | | // ==================== ç§ææ¹æ³ ==================== |
| | | |
| | | /** |
| | | * æ ¡éªååä¿åæ°æ® |
| | | */ |
| | | private void validateItemSaveData(WmsItemSaveReqVO reqVO) { |
| | | // æ ¡éªååç¼ç å¯ä¸ |
| | | if (reqVO.getCode() != null) { |
| | | MdmItemRespDTO existItem = mdmItemApi.getItemByCode(reqVO.getCode()).getCheckedData(); |
| | | if (existItem != null && !existItem.getId().equals(reqVO.getId())) { |
| | | throw exception(ITEM_CODE_DUPLICATE); |
| | | } |
| | | } |
| | | // æ ¡éªåååç§°å¯ä¸ |
| | | if (reqVO.getName() != null) { |
| | | // MDM ææ æåç§°æ¥è¯¢æ¹æ³ï¼è·³è¿æ¤æ ¡éª |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æå»ºåå»ºè¯·æ± DTO |
| | | */ |
| | | private MdmItemCreateReqDTO buildCreateReqDTO(WmsItemSaveReqVO saveReqVO) { |
| | | MdmItemCreateReqDTO createReqDTO = new MdmItemCreateReqDTO(); |
| | | createReqDTO.setCode(saveReqVO.getCode()); |
| | | createReqDTO.setName(saveReqVO.getName()); |
| | | createReqDTO.setCategoryId(saveReqVO.getCategoryId()); |
| | | createReqDTO.setBrandId(saveReqVO.getBrandId()); |
| | | createReqDTO.setUnitMeasureId(saveReqVO.getUnitMeasureId()); |
| | | createReqDTO.setItemType(MDM_ITEM_TYPE_MATERIAL); |
| | | createReqDTO.setStatus(CommonStatusEnum.ENABLE.getStatus()); |
| | | createReqDTO.setRemark(saveReqVO.getRemark()); |
| | | return createReqDTO; |
| | | } |
| | | |
| | | /** |
| | | * æå»ºæ´æ°è¯·æ± DTO |
| | | */ |
| | | private MdmItemUpdateReqDTO buildUpdateReqDTO(WmsItemSaveReqVO saveReqVO) { |
| | | MdmItemUpdateReqDTO updateReqDTO = new MdmItemUpdateReqDTO(); |
| | | updateReqDTO.setId(saveReqVO.getId()); |
| | | updateReqDTO.setCode(saveReqVO.getCode()); |
| | | updateReqDTO.setName(saveReqVO.getName()); |
| | | updateReqDTO.setCategoryId(saveReqVO.getCategoryId()); |
| | | updateReqDTO.setBrandId(saveReqVO.getBrandId()); |
| | | updateReqDTO.setUnitMeasureId(saveReqVO.getUnitMeasureId()); |
| | | updateReqDTO.setStatus(CommonStatusEnum.ENABLE.getStatus()); |
| | | updateReqDTO.setRemark(saveReqVO.getRemark()); |
| | | return updateReqDTO; |
| | | } |
| | | |
| | | /** |
| | | * è½¬æ¢ MDM ç©æä¸º WMS åå |
| | | */ |
| | | private WmsItemDO convertToWmsItemDO(MdmItemRespDTO mdmItem) { |
| | | if (mdmItem == null) { |
| | | return null; |
| | | } |
| | | WmsItemDO item = new WmsItemDO(); |
| | | item.setId(mdmItem.getId()); |
| | | item.setCode(mdmItem.getCode()); |
| | | item.setName(mdmItem.getName()); |
| | | item.setCategoryId(mdmItem.getCategoryId()); |
| | | item.setBrandId(mdmItem.getBrandId()); |
| | | item.setRemark(mdmItem.getRemark()); |
| | | |
| | | // è·å计éåä½åç§° |
| | | if (mdmItem.getUnitMeasureId() != null) { |
| | | MdmUnitMeasureRespDTO unit = mdmUnitMeasureApi.getUnitMeasure(mdmItem.getUnitMeasureId()).getCheckedData(); |
| | | if (unit != null) { |
| | | item.setUnit(unit.getName()); |
| | | } |
| | | } |
| | | return item; |
| | | } |
| | | |
| | | /** |
| | | * æ¹éè½¬æ¢ MDM ç©æå表为 WMS ååå表 |
| | | */ |
| | | private List<WmsItemDO> convertToWmsItemDOList(List<MdmItemRespDTO> mdmItemList) { |
| | | if (CollUtil.isEmpty(mdmItemList)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | |
| | | // æ¹éè·å计éåä½ |
| | | Set<Long> unitIds = mdmItemList.stream() |
| | | .map(MdmItemRespDTO::getUnitMeasureId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | |
| | | Map<Long, MdmUnitMeasureRespDTO> unitMap = new HashMap<>(); |
| | | if (!unitIds.isEmpty()) { |
| | | List<MdmUnitMeasureRespDTO> units = mdmUnitMeasureApi.getUnitMeasureList(unitIds).getCheckedData(); |
| | | for (MdmUnitMeasureRespDTO unit : units) { |
| | | unitMap.put(unit.getId(), unit); |
| | | } |
| | | } |
| | | |
| | | // 转æ¢å表 |
| | | List<WmsItemDO> result = new ArrayList<>(); |
| | | for (MdmItemRespDTO mdmItem : mdmItemList) { |
| | | WmsItemDO item = new WmsItemDO(); |
| | | item.setId(mdmItem.getId()); |
| | | item.setCode(mdmItem.getCode()); |
| | | item.setName(mdmItem.getName()); |
| | | item.setCategoryId(mdmItem.getCategoryId()); |
| | | item.setBrandId(mdmItem.getBrandId()); |
| | | item.setRemark(mdmItem.getRemark()); |
| | | |
| | | // 设置åä½åç§° |
| | | if (mdmItem.getUnitMeasureId() != null) { |
| | | MdmUnitMeasureRespDTO unit = unitMap.get(mdmItem.getUnitMeasureId()); |
| | | if (unit != null) { |
| | | item.setUnit(unit.getName()); |
| | | } |
| | | } |
| | | result.add(item); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemSkuApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemSkuRespDTO; |
| | | import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku.WmsItemSkuPageReqVO; |
| | | import cn.iocoder.yudao.module.wms.controller.admin.md.item.vo.sku.WmsItemSkuSaveReqVO; |
| | | import cn.iocoder.yudao.module.wms.dal.dataobject.md.item.WmsItemSkuDO; |
| | |
| | | /** |
| | | * WMS åå SKU Service å®ç°ç±» |
| | | * |
| | | * æ¹é 说æï¼WMS SKU æ°æ®æ¥æºäº MDM ç©æ SKU |
| | | * - getItemSkuListByIds/validateItemSkuExists è°ç¨ MDM SKU API |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | |
| | | |
| | | @Resource |
| | | private WmsItemSkuMapper itemSkuMapper; |
| | | |
| | | @Resource |
| | | private MdmItemSkuApi mdmItemSkuApi; |
| | | |
| | | @Resource |
| | | @Lazy // å»¶è¿å è½½ï¼é¿å
循ç¯ä¾èµ |
| | | private WmsInventoryService inventoryService; |
| | |
| | | |
| | | @Override |
| | | public WmsItemSkuDO validateItemSkuExists(Long id) { |
| | | WmsItemSkuDO sku = itemSkuMapper.selectById(id); |
| | | if (sku == null) { |
| | | throw exception(ITEM_SKU_NOT_EXISTS); |
| | | } |
| | | return sku; |
| | | MdmItemSkuRespDTO sku = mdmItemSkuApi.validateItemSkuExists(id).getCheckedData(); |
| | | return BeanUtils.toBean(sku, WmsItemSkuDO.class); |
| | | } |
| | | |
| | | @Override |
| | | public List<WmsItemSkuDO> getItemSkuList(Long itemId) { |
| | | return itemSkuMapper.selectListByItemId(itemId); |
| | | List<MdmItemSkuRespDTO> list = mdmItemSkuApi.getItemSkuListByItemId(itemId).getCheckedData(); |
| | | return BeanUtils.toBean(list, WmsItemSkuDO.class); |
| | | } |
| | | |
| | | @Override |
| | | public List<WmsItemSkuDO> getItemSkuList(Collection<Long> itemIds) { |
| | | return itemSkuMapper.selectListByItemIds(itemIds); |
| | | // MDM API æä¸æ¯ææå¤ä¸ªç©æ ID æ¥è¯¢ SKUï¼ææ¶è¿å空å表 |
| | | return ListUtil.of(); |
| | | } |
| | | |
| | | @Override |
| | | public List<WmsItemSkuDO> getItemSkuList(Collection<Long> itemIds, String code, String name) { |
| | | return itemSkuMapper.selectList(itemIds, code, name); |
| | | // MDM API æä¸æ¯æå¤ææ¥è¯¢ï¼ææ¶è¿å空å表 |
| | | return ListUtil.of(); |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return ListUtil.of(); |
| | | } |
| | | return itemSkuMapper.selectByIds(ids); |
| | | List<MdmItemSkuRespDTO> list = mdmItemSkuApi.getItemSkuList(ids).getCheckedData(); |
| | | return BeanUtils.toBean(list, WmsItemSkuDO.class); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<WmsItemSkuDO> getItemSkuPage(WmsItemSkuPageReqVO pageReqVO) { |
| | | return itemSkuMapper.selectPage(pageReqVO); |
| | | // MDM API æä¸æ¯æå页æ¥è¯¢ SKUï¼ææ¶è¿åç©ºç»æ |
| | | return new PageResult<>(ListUtil.of(), 0L); |
| | | } |
| | | |
| | | private void validateItemSkuList(List<WmsItemSkuSaveReqVO> skus) { |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- MDM ä¸»æ°æ®ç®¡ç模å --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-mdm</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- spring boot é
ç½®æéä¾èµ --> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |