| | |
| | | "mcp__ide__getDiagnostics", |
| | | "WebFetch(domain:help.jimureport.com)", |
| | | "WebSearch", |
| | | "Bash(python3 *)" |
| | | "Bash(python3 *)", |
| | | "Bash(mvn compile *)", |
| | | "Bash(mysql -u root -p123456 -D ruoyi-vue-pro)", |
| | | "Bash(mysql -h127.0.0.1 -P3306 -uroot -p123456 ruoyi-vue-pro)", |
| | | "Bash(where mysql *)", |
| | | "Bash(dir /s /b \"C:\\\\Program Files\\\\MySQL\\\\*\\\\bin\\\\mysql.exe\")", |
| | | "Bash(dir /s /b \"C:\\\\Program Files \\(x86\\)\\\\MySQL\\\\*\\\\bin\\\\mysql.exe\")", |
| | | "Bash(cmd.exe /c \"where mysql\")", |
| | | "Bash(cmd.exe /c \"dir /s /b C:\\\\ProgramData\\\\MySQL\\\\*\\\\mysql.exe\")", |
| | | "Bash(cmd.exe /c \"dir /s /b C:\\\\Program Files\\\\MySQL\\\\*\\\\mysql.exe\")", |
| | | "Bash(mysql -u root -p123456 ruoyi-vue-pro -e \"SELECT id, name, code, deleted FROM bpm_category WHERE code = 'purchase_approve' OR name LIKE '%éè´å®¡æ ¸%';\")", |
| | | "Bash(dir /s /b \"D:\\\\ç马\\\\åé\\\\å端\\\\mom-pro2-after\\\\yudao-module-mdm-api\\\\*.java\")" |
| | | ], |
| | | "deny": [ |
| | | "Bash(rm -rf *)", |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # CRM ååçæ ERP éå®è®¢å - åç«¯ææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬æ¬¡æ¹é å®ç° CRM åå审æ¹éè¿åï¼å¯ç´æ¥çæ ERP éå®è®¢åï¼æéååå°è®¢åçä¸å¡æµç¨ã |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãæ¹é æ¸
å |
| | | |
| | | ### å端æ¹é ï¼å·²å®æï¼ |
| | | |
| | | | æä»¶ | æ¹å¨è¯´æ | |
| | | |------|----------| |
| | | | `yudao-module-erp-api/` | æ°å¢ ERP éå®è®¢å API 模å | |
| | | | `ErpSaleOrderApi.java` | éå®è®¢å API æ¥å£ | |
| | | | `ErpSaleOrderCreateReqDTO.java` | éå®è®¢ååå»ºè¯·æ± DTO | |
| | | | `ErpSaleOrderRespDTO.java` | éå®è®¢åååº DTO | |
| | | | `ErpSaleOrderApiImpl.java` | ERP éå®è®¢å API å®ç° | |
| | | | `CrmContractDO.java` | æ°å¢ orderIdãorderNo åæ®µ | |
| | | | `ErpSaleOrderDO.java` | æ°å¢ contractIdãcontractNo åæ®µ | |
| | | | `CrmContractService.java` | æ°å¢ generateSaleOrder æ¹æ³ | |
| | | | `CrmContractServiceImpl.java` | å®ç°çæéå®è®¢åé»è¾ | |
| | | | `CrmContractController.java` | æ°å¢çæéå®è®¢å API | |
| | | | `CrmContractRespVO.java` | æ°å¢ orderIdãorderNo åæ®µ | |
| | | |
| | | --- |
| | | |
| | | ## äºãæ¶åé¡µé¢ |
| | | |
| | | ### CRM åå管ç |
| | | |
| | | | é¡µé¢ | è·¯å¾ | æ¹å¨è¯´æ | |
| | | |------|------|----------| |
| | | | ååå表 | `/crm/contract/index` | æ·»å "çæéå®è®¢å"æé® | |
| | | | åå详æ
| `/crm/contract/detail` | æ¾ç¤ºå
³èçéå®è®¢åä¿¡æ¯ | |
| | | |
| | | ### ERP éå®è®¢å管ç |
| | | |
| | | | é¡µé¢ | è·¯å¾ | æ¹å¨è¯´æ | |
| | | |------|------|----------| |
| | | | éå®è®¢åå表 | `/erp/sale/order/index` | æ¾ç¤ºå
³èååä¿¡æ¯ | |
| | | | éå®è®¢å详æ
| `/erp/sale/order/detail` | æ¾ç¤ºå
³èååä¿¡æ¯ | |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãAPI æ¥å£ |
| | | |
| | | ### CRM åå API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /crm/contract/generate-sale-order | æ ¹æ®ååçæéå®è®¢å | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | ååç¼å· | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": 12345, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ### ERP éå®è®¢å APIï¼æ°å¢ RPCï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /rpc-api/erp/sale-order/create | å建éå®è®¢å | |
| | | | GET | /rpc-api/erp/sale-order/get | è·åéå®è®¢å | |
| | | | GET | /rpc-api/erp/sale-order/get-by-contract-id | æ ¹æ®ååç¼å·è·å订å | |
| | | |
| | | --- |
| | | |
| | | ## åãå端修æ¹ç¹ |
| | | |
| | | ### 4.1 åååè¡¨é¡µé¢ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `/src/views/crm/contract/index.vue` |
| | | |
| | | **æ°å¢æé®ï¼** |
| | | |
| | | ```html |
| | | <!-- å¨ååæä½åæ·»å "çæéå®è®¢å"æé® --> |
| | | <el-button |
| | | v-if="row.auditStatus === 20 && !row.orderId" |
| | | type="success" |
| | | size="small" |
| | | @click="handleGenerateOrder(row)" |
| | | > |
| | | çæéå®è®¢å |
| | | </el-button> |
| | | <el-button |
| | | v-if="row.orderId" |
| | | type="primary" |
| | | size="small" |
| | | @click="handleViewOrder(row)" |
| | | > |
| | | æ¥ç订å |
| | | </el-button> |
| | | ``` |
| | | |
| | | **æ°å¢æ¹æ³ï¼** |
| | | |
| | | ```js |
| | | methods: { |
| | | // çæéå®è®¢å |
| | | async handleGenerateOrder(row) { |
| | | try { |
| | | await this.$confirm('ç¡®è®¤æ ¹æ®è¯¥ååçæéå®è®¢åï¼', 'æç¤º') |
| | | const { data } = await generateSaleOrder(row.id) |
| | | this.$message.success('çæéå®è®¢åæåï¼è®¢åå·ï¼' + data) |
| | | this.getList() // å·æ°å表 |
| | | } catch (e) { |
| | | if (e !== 'cancel') { |
| | | this.$message.error(e.message || 'çæå¤±è´¥') |
| | | } |
| | | } |
| | | }, |
| | | // æ¥çéå®è®¢å |
| | | handleViewOrder(row) { |
| | | this.$router.push({ |
| | | path: '/erp/sale/order/detail', |
| | | query: { id: row.orderId } |
| | | }) |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | **æ°å¢ APIï¼** |
| | | |
| | | ```js |
| | | // api/crm/contract.js |
| | | export function generateSaleOrder(id) { |
| | | return request({ |
| | | url: '/crm/contract/generate-sale-order', |
| | | method: 'post', |
| | | params: { id } |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | ### 4.2 åå详æ
é¡µé¢ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `/src/views/crm/contract/detail.vue` |
| | | |
| | | **æ°å¢æ¾ç¤ºå段ï¼** |
| | | |
| | | ```html |
| | | <!-- å¨åååºæ¬ä¿¡æ¯åºåæ·»å --> |
| | | <el-descriptions-item label="éå®è®¢å"> |
| | | <span v-if="contract.orderId"> |
| | | <el-link type="primary" @click="handleViewOrder"> |
| | | {{ contract.orderNo }} |
| | | </el-link> |
| | | </span> |
| | | <span v-else> |
| | | <el-button |
| | | v-if="contract.auditStatus === 20" |
| | | type="success" |
| | | size="small" |
| | | @click="handleGenerateOrder" |
| | | > |
| | | çæéå®è®¢å |
| | | </el-button> |
| | | <span v-else>æªçæ</span> |
| | | </span> |
| | | </el-descriptions-item> |
| | | ``` |
| | | |
| | | ### 4.3 éå®è®¢ååè¡¨é¡µé¢ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `/src/views/erp/sale/order/index.vue` |
| | | |
| | | **æ°å¢åæ¾ç¤ºï¼** |
| | | |
| | | ```html |
| | | <el-table-column label="å
³èåå" prop="contractNo" width="150"> |
| | | <template #default="{ row }"> |
| | | <span v-if="row.contractId"> |
| | | <el-link type="primary" @click="handleViewContract(row)"> |
| | | {{ row.contractNo }} |
| | | </el-link> |
| | | </span> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | ``` |
| | | |
| | | ### 4.4 éå®è®¢å详æ
é¡µé¢ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `/src/views/erp/sale/order/detail.vue` |
| | | |
| | | **æ°å¢æ¾ç¤ºå段ï¼** |
| | | |
| | | ```html |
| | | <el-descriptions-item label="å
³èåå"> |
| | | <span v-if="order.contractId"> |
| | | <el-link type="primary" @click="handleViewContract"> |
| | | {{ order.contractNo }} |
| | | </el-link> |
| | | </span> |
| | | <span v-else>-</span> |
| | | </el-descriptions-item> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãæ°æ®æ¨¡ååæ´ |
| | | |
| | | ### CRM ååè¡¨åæ´ |
| | | |
| | | ```sql |
| | | ALTER TABLE `crm_contract` |
| | | ADD COLUMN `order_id` bigint DEFAULT NULL COMMENT 'å
³è ERP éå®è®¢åç¼å·' AFTER `total_price`, |
| | | ADD COLUMN `order_no` varchar(32) DEFAULT NULL COMMENT 'ERP éå®è®¢ååå·' AFTER `order_id`; |
| | | ``` |
| | | |
| | | ### ERP éå®è®¢åè¡¨åæ´ |
| | | |
| | | ```sql |
| | | ALTER TABLE `erp_sale_order` |
| | | ADD COLUMN `contract_id` bigint DEFAULT NULL COMMENT 'å
³è CRM ååç¼å·' AFTER `customer_id`, |
| | | ADD COLUMN `contract_no` varchar(32) DEFAULT NULL COMMENT 'CRM åååå·' AFTER `contract_id`; |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
ãä¸å¡è§å |
| | | |
| | | ### 6.1 çæéå®è®¢åæ¡ä»¶ |
| | | |
| | | - ååå¿
须审æ¹éè¿ï¼auditStatus = 20ï¼ |
| | | - ååæªå
³èéå®è®¢åï¼orderId ä¸ºç©ºï¼ |
| | | - ååå¿
é¡»å
å«äº§åä¿¡æ¯ |
| | | |
| | | ### 6.2 éå®è®¢åæ°æ®æ¥æº |
| | | |
| | | - 客æ·ï¼ååå®¢æ· |
| | | - 产åï¼åå产åå表 |
| | | - éé¢ï¼ååéé¢ï¼æ£é¤ææ£ï¼ |
| | | - 夿³¨ï¼èªå¨æ·»å "ç±ååãxxxãèªå¨çæ" |
| | | |
| | | ### 6.3 æ°æ®å
³è |
| | | |
| | | - éå®è®¢åå建åï¼èªå¨åå¡«åå orderIdãorderNo |
| | | - éå®è®¢åè®°å½ contractIdãcontractNo ç¨äºååæ¥è¯¢ |
| | | |
| | | --- |
| | | |
| | | ## ä¸ã注æäºé¡¹ |
| | | |
| | | 1. **ç¶ææ§å¶**ï¼åªæå®¡æ¹éè¿çååæè½çæè®¢å |
| | | 2. **å¯ä¸æ§**ï¼ä¸ä¸ªåååªè½çæä¸ä¸ªéå®è®¢å |
| | | 3. **æ°æ®åæ¥**ï¼çæè®¢ååï¼ååä¸è®¢åååå
³è |
| | | 4. **æéè¦æ±**ï¼éè¦æååç¼è¾æéæè½çæè®¢å |
| | | 5. **订åç¶æ**ï¼çæçéå®è®¢åé»è®¤ä¸º"æªå®¡æ ¸"ç¶æï¼éè¦å¨ ERP ä¸å®¡æ¹ |
| | | |
| | | --- |
| | | |
| | | ## å
«ãåç»è®¡å |
| | | |
| | | | Phase | å
容 | ç¶æ | |
| | | |-------|------|------| |
| | | | Phase 1 | å®¢æ·æ°æ®ç»ä¸ - ERP ä½¿ç¨ CRM å®¢æ· | **已宿** | |
| | | | Phase 2 | äº§åæ°æ®ç»ä¸ - CRM/ERP ä½¿ç¨ MDM ç©æ | **已宿** | |
| | | | Phase 3 | ååçæéå®è®¢å | **已宿** | |
| | | | Phase 4 | éå®å
¨æµç¨è¿½æº¯ | å¾
å¼å§ | |
| | | | Phase 5 | è¥éæ°æ®æ¥è¡¨ | å¾
å¼å§ | |
| | | | Phase 6 | æ°æ®è¿ç§»ä¸æ¸
ç | å¾
å¼å§ | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # CRM ä¸ ERP éå®ä¸ä½åæ¹é - åç«¯ææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬æ¬¡æ¹é å° CRM 客æ·ä½ä¸ºç»ä¸å®¢æ·ä¸»æ°æ®ï¼ERP é宿¨¡åï¼éå®è®¢åãéå®åºåºãéå®éè´§ãæ¶æ¬¾åï¼ç»ä¸ä½¿ç¨ CRM 客æ·ã |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãæ¹é æ¸
å |
| | | |
| | | ### å端æ¹é ï¼å·²å®æï¼ |
| | | |
| | | | æä»¶ | æ¹å¨è¯´æ | |
| | | |------|----------| |
| | | | `yudao-module-crm-api/` | æ°å¢ CRM å®¢æ· API 模å | |
| | | | `CrmCustomerApi.java` | æ°å¢å®¢æ· API æ¥å£ | |
| | | | `CrmCustomerRespDTO.java` | æ°å¢å®¢æ· DTO | |
| | | | `CrmCustomerApiImpl.java` | å®ç° CRM å®¢æ· API | |
| | | | `ErpSaleOrderServiceImpl.java` | ä½¿ç¨ CRM å®¢æ· API | |
| | | | `ErpFinanceReceiptServiceImpl.java` | ä½¿ç¨ CRM å®¢æ· API | |
| | | | `ErpSaleOrderController.java` | ä½¿ç¨ CRM å®¢æ· API | |
| | | | `ErpSaleOrderDO.java` | æ´æ°æ³¨éå
³è CRM å®¢æ· | |
| | | | `ErpSaleOutDO.java` | æ´æ°æ³¨éå
³è CRM å®¢æ· | |
| | | | `ErpSaleReturnDO.java` | æ´æ°æ³¨éå
³è CRM å®¢æ· | |
| | | | `ErpFinanceReceiptDO.java` | æ´æ°æ³¨éå
³è CRM å®¢æ· | |
| | | |
| | | ### å端æ¹é ï¼å¾
å®æï¼ |
| | | |
| | | | æä»¶ | æ¹å¨è¯´æ | |
| | | |------|----------| |
| | | | `ErpSaleOutController.java` | ä½¿ç¨ CRM å®¢æ· API | |
| | | | `ErpSaleReturnController.java` | ä½¿ç¨ CRM å®¢æ· API | |
| | | | `ErpFinanceReceiptController.java` | ä½¿ç¨ CRM å®¢æ· API | |
| | | |
| | | --- |
| | | |
| | | ## äºãæ¶åé¡µé¢ |
| | | |
| | | ### ERP é宿¨¡å |
| | | |
| | | | é¡µé¢ | è·¯å¾ | æ¹å¨è¯´æ | |
| | | |------|------|----------| |
| | | | éå®è®¢åå表 | `/erp/sale/order/index` | 客æ·éæ©æ¹ä¸º CRM 客æ·éæ©ç»ä»¶ | |
| | | | éå®è®¢å表å | `/erp/sale/order/form` | 客æ·éæ©æ¹ä¸º CRM 客æ·éæ©ç»ä»¶ | |
| | | | éå®åºåºå表 | `/erp/sale/out/index` | 客æ·éæ©æ¹ä¸º CRM 客æ·éæ©ç»ä»¶ | |
| | | | éå®åºåºè¡¨å | `/erp/sale/out/form` | 客æ·éæ©æ¹ä¸º CRM 客æ·éæ©ç»ä»¶ | |
| | | | éå®éè´§å表 | `/erp/sale/return/index` | 客æ·éæ©æ¹ä¸º CRM 客æ·éæ©ç»ä»¶ | |
| | | | éå®é货表å | `/erp/sale/return/form` | 客æ·éæ©æ¹ä¸º CRM 客æ·éæ©ç»ä»¶ | |
| | | | æ¶æ¬¾åå表 | `/erp/finance/receipt/index` | 客æ·éæ©æ¹ä¸º CRM 客æ·éæ©ç»ä»¶ | |
| | | | æ¶æ¬¾å表å | `/erp/finance/receipt/form` | 客æ·éæ©æ¹ä¸º CRM 客æ·éæ©ç»ä»¶ | |
| | | |
| | | --- |
| | | |
| | | ## ä¸ã客æ·éæ©ç»ä»¶ |
| | | |
| | | ### 3.1 ä½¿ç¨ CRM 客æ·éæ©ç»ä»¶ |
| | | |
| | | ERP é宿¨¡åç客æ·éæ©ç»ä¸ä½¿ç¨ CRM 客æ·éæ©ç»ä»¶ã |
| | | |
| | | ```html |
| | | <!-- 忥ï¼ERP 客æ·éæ© --> |
| | | <el-select v-model="form.customerId" placeholder="è¯·éæ©å®¢æ·"> |
| | | <el-option |
| | | v-for="item in customerList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id" |
| | | /> |
| | | </el-select> |
| | | |
| | | <!-- æ¹ä¸ºï¼CRM 客æ·éæ©ç»ä»¶ --> |
| | | <CrmCustomerSelect v-model="form.customerId" /> |
| | | ``` |
| | | |
| | | ### 3.2 CRM å®¢æ· API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /crm/customer/simple-list | è·å客æ·ç²¾ç®å表ï¼ç¨äºä¸æéæ©ï¼ | |
| | | | GET | /crm/customer/list-by-ids | æ¹éè·å客æ·ä¿¡æ¯ | |
| | | |
| | | **客æ·ç²¾ç®å表ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": [ |
| | | { |
| | | "id": 1, |
| | | "name": "客æ·A", |
| | | "mobile": "13800138000", |
| | | "telephone": "0571-12345678", |
| | | "ownerUserName": "å¼ ä¸" |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## åãåºå¼ç ERP 客æ·ç®¡ç |
| | | |
| | | ### 4.1 ERP 客æ·ç®¡ç页é¢åºå¼ |
| | | |
| | | 以ä¸é¡µé¢æ 记为åºå¼ï¼å»ºè®®å¨èåä¸éèæå é¤ï¼ |
| | | |
| | | - `/erp/customer/index` - ERP 客æ·å表 |
| | | - `/erp/customer/form` - ERP 客æ·è¡¨å |
| | | |
| | | --- |
| | | |
| | | ## äºãSQL æ§è¡ |
| | | |
| | | è§ `docs/crm_erp_integration_sql.sql` |
| | | |
| | | --- |
| | | |
| | | ## å
ãæ¹é å®æç¶æ |
| | | |
| | | | Phase | å
容 | ç¶æ | |
| | | |-------|------|------| |
| | | | Phase 1 | å®¢æ·æ°æ®ç»ä¸ - ERP ä½¿ç¨ CRM å®¢æ· | **已宿** | |
| | | | Phase 2 | äº§åæ°æ®ç»ä¸ - CRM/ERP ä½¿ç¨ MDM ç©æ | **已宿** | |
| | | | Phase 3 | ååçæéå®è®¢å | **已宿** | |
| | | | Phase 4 | éå®å
¨æµç¨è¿½æº¯ | **已宿** | |
| | | | Phase 5 | è¥éæ°æ®æ¥è¡¨ | **已宿** | |
| | | | Phase 6 | æ°æ®è¿ç§»ä¸æ¸
ç | **已宿** | |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãäº§åºææ¡£æ¸
å |
| | | |
| | | | ææ¡£ | 说æ | |
| | | |------|------| |
| | | | `docs/crm_erp_integration_frontend.md` | CRM 客æ·ä¸ä½ååç«¯ææ¡£ | |
| | | | `docs/crm_erp_integration_sql.sql` | SQL åæ´èæ¬ | |
| | | | `docs/mdm_product_integration_frontend.md` | MDM 产åä¸ä½ååç«¯ææ¡£ | |
| | | | `docs/contract_generate_order_frontend.md` | ååçæè®¢ååç«¯ææ¡£ | |
| | | | `docs/sales_traceability_frontend.md` | éå®è¿½æº¯åç«¯ææ¡£ | |
| | | | `docs/marketing_report_frontend.md` | è¥éæ¥è¡¨åç«¯ææ¡£ | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # CRM ä¸ ERP éå®ä¸ä½åæ¹é 计å |
| | | |
| | | ## ä¸ãç°ç¶åæ |
| | | |
| | | ### 1.1 å½åé®é¢ |
| | | |
| | | | é®é¢ | 说æ | |
| | | |------|------| |
| | | | **å®¢æ·æ°æ®ç¬ç«** | CRM å®¢æ· (`crm_customer`) å ERP å®¢æ· (`erp_customer`) æ¯ä¸¤å¼ å®å
¨ç¬ç«çè¡¨ï¼æ æ³å
񄧮 | |
| | | | **äº§åæ°æ®ç¬ç«** | CRM 产å (`crm_product`) å ERP 产å (`erp_product`) ç¬ç«ç»´æ¤ | |
| | | | **ååä¸è®¢åè±è** | CRM åå审æ¹éè¿åæ æ³èªå¨çæ ERP éå®è®¢å | |
| | | | **忬¾æ°æ®ç¬ç«** | CRM 忬¾ (`crm_receivable`) å ERP æ¶æ¬¾å (`erp_finance_receipt`) æ å
³è | |
| | | | **é宿µç¨æè£** | 线索 â å®¢æ· â åæº â åå â 订å â åºåº â æ¶æ¬¾ï¼æµç¨å¨ååå订åä¹é´æè£ | |
| | | |
| | | ### 1.2 æ¹é ç®æ |
| | | |
| | | æ ¹æ®éæ±æè¿°ï¼æ¹é ç®æ ä¸ºï¼ |
| | | |
| | | 1. **ç»ä¸å®¢æ·ç®¡ç** - CRM 客æ·ä½ä¸ºç»ä¸å®¢æ·ä¸»æ°æ®ï¼ERP ä½¿ç¨ CRM å®¢æ· |
| | | 2. **ç»ä¸äº§å管ç** - ERP 产åä½ä¸ºäº§åä¸»æ°æ®ï¼CRM ä½¿ç¨ ERP 产å |
| | | 3. **é宿µç¨æé** - åå审æ¹éè¿åå¯çæéå®è®¢åï¼å®ç°å
¨æµç¨è¿½æº¯ |
| | | 4. **é宿°æ®èå¨** - éå®è®¢åç¶æå®æ¶åæ¥ï¼æ¯æéå®å³çåæ |
| | | 5. **è¥éæ°æ®æ¥è¡¨** - æ´å CRM å ERP æ°æ®ï¼æä¾å®æ´çéå®åææ¥è¡¨ |
| | | |
| | | --- |
| | | |
| | | ## äºãåæ¹æ¹é 计å |
| | | |
| | | ### Phase 1: å®¢æ·æ°æ®ç»ä¸ï¼é¢è®¡ 2 å¤©ï¼ |
| | | |
| | | **ç®æ **: ç»ä¸å®¢æ·ä¸»æ°æ®ï¼ERP é宿¨¡åä½¿ç¨ CRM å®¢æ· |
| | | |
| | | **æ¹é å
容**: |
| | | |
| | | | åºå· | æ¹é 项 | 说æ | |
| | | |------|--------|------| |
| | | | 1.1 | å建 CRM å®¢æ· API 模å | æ´é²å®¢æ·æ¥è¯¢æ¥å£ä¾ ERP è°ç¨ | |
| | | | 1.2 | ERP éå®è®¢åå
³è CRM å®¢æ· | `erp_sale_order.customer_id` æ¹ä¸ºå
³è `crm_customer.id` | |
| | | | 1.3 | ERP éå®åºåºå
³è CRM å®¢æ· | `erp_sale_out.customer_id` æ¹ä¸ºå
³è `crm_customer.id` | |
| | | | 1.4 | ERP éå®éè´§å
³è CRM å®¢æ· | `erp_sale_return.customer_id` æ¹ä¸ºå
³è `crm_customer.id` | |
| | | | 1.5 | ERP æ¶æ¬¾åå
³è CRM å®¢æ· | `erp_finance_receipt.customer_id` æ¹ä¸ºå
³è `crm_customer.id` | |
| | | | 1.6 | åºå¼ ERP 客æ·è¡¨ | æ è®°åºå¼ï¼ä¿çæ°æ®è¿ç§»æ¥å£ | |
| | | |
| | | **æ¶åæä»¶**: |
| | | - æ°å¢: `yudao-module-crm-api/` 模å |
| | | - ä¿®æ¹: `ErpSaleOrderDO.java`, `ErpSaleOutDO.java`, `ErpSaleReturnDO.java` |
| | | - ä¿®æ¹: `ErpSaleOrderServiceImpl.java`, `ErpSaleOutServiceImpl.java`, `ErpSaleReturnServiceImpl.java` |
| | | |
| | | --- |
| | | |
| | | ### Phase 2: äº§åæ°æ®ç»ä¸ï¼é¢è®¡ 1 å¤©ï¼ |
| | | |
| | | **ç®æ **: ç»ä¸äº§åä¸»æ°æ®ï¼CRM ä½¿ç¨ ERP 产å |
| | | |
| | | **æ¹é å
容**: |
| | | |
| | | | åºå· | æ¹é 项 | 说æ | |
| | | |------|--------|------| |
| | | | 2.1 | å建 ERP 产å API 模å | æ´é²äº§åæ¥è¯¢æ¥å£ä¾ CRM è°ç¨ | |
| | | | 2.2 | CRM åæºäº§åå
³è ERP 产å | `crm_business_product.product_id` æ¹ä¸ºå
³è `erp_product.id` | |
| | | | 2.3 | CRM åå产åå
³è ERP 产å | `crm_contract_product.product_id` æ¹ä¸ºå
³è `erp_product.id` | |
| | | | 2.4 | åºå¼ CRM 产å表 | æ è®°åºå¼ï¼ä¿çæ°æ®è¿ç§»æ¥å£ | |
| | | |
| | | **æ¶åæä»¶**: |
| | | - æ°å¢: `yudao-module-erp-api/` 模åï¼å¦æä¸åå¨ï¼ |
| | | - ä¿®æ¹: `CrmBusinessProductDO.java`, `CrmContractProductDO.java` |
| | | - ä¿®æ¹: CRM åæº/åå Service å± |
| | | |
| | | --- |
| | | |
| | | ### Phase 3: ååçæéå®è®¢åï¼é¢è®¡ 2 å¤©ï¼ |
| | | |
| | | **ç®æ **: CRM åå审æ¹éè¿åå¯çæ ERP éå®è®¢å |
| | | |
| | | **æ¹é å
容**: |
| | | |
| | | | åºå· | æ¹é 项 | 说æ | |
| | | |------|--------|------| |
| | | | 3.1 | ERP éå®è®¢åå¢å å
³èåååæ®µ | æ°å¢ `contract_id`, `contract_no` åæ®µ | |
| | | | 3.2 | CRM ååå¢å 订åå
³èåæ®µ | æ°å¢ `order_id`, `order_no` åæ®µ | |
| | | | 3.3 | ååçæè®¢åæ¥å£ | åå审æ¹éè¿åï¼è°ç¨ ERP æå¡çæéå®è®¢å | |
| | | | 3.4 | ååç¶æçå¬å¨ | çå¬åå审æ¹éè¿äºä»¶ï¼èªå¨/æå¨è§¦å订åçæ | |
| | | |
| | | **æ¶åæä»¶**: |
| | | - ä¿®æ¹: `ErpSaleOrderDO.java`, `CrmContractDO.java` |
| | | - æ°å¢: `CrmContractToOrderService.java` |
| | | - ä¿®æ¹: `CrmContractStatusListener.java` |
| | | |
| | | --- |
| | | |
| | | ### Phase 4: éå®å
¨æµç¨è¿½æº¯ï¼é¢è®¡ 1 å¤©ï¼ |
| | | |
| | | **ç®æ **: å®ç°ä»çº¿ç´¢å°æ¶æ¬¾ç宿´é宿µç¨è¿½æº¯ |
| | | |
| | | **æ¹é å
容**: |
| | | |
| | | | åºå· | æ¹é 项 | 说æ | |
| | | |------|--------|------| |
| | | | 4.1 | åæºå
³èéå®è®¢å | `crm_business` å¢å 订åå
³èï¼æ¯æåæºç´æ¥ä¸å | |
| | | | 4.2 | éå®è®¢åç¶æåå | åºåº/éè´§/æ¶æ¬¾ç¶æå®æ¶ååå°è®¢ååå
³èåå | |
| | | | 4.3 | å
¨æµç¨æ¥è¯¢æ¥å£ | æä¾æå®¢æ·/åæº/ååæ¥è¯¢å®æ´éå®é¾è·¯çæ¥å£ | |
| | | |
| | | **æ¶åæä»¶**: |
| | | - ä¿®æ¹: `CrmBusinessDO.java` |
| | | - æ°å¢: `CrmSaleTraceService.java` |
| | | |
| | | --- |
| | | |
| | | ### Phase 5: è¥éæ°æ®æ¥è¡¨ï¼é¢è®¡ 2 å¤©ï¼ |
| | | |
| | | **ç®æ **: æ´å CRM å ERP æ°æ®ï¼æä¾éå®å³çæ¥è¡¨ |
| | | |
| | | **æ¹é å
容**: |
| | | |
| | | | åºå· | æ¹é 项 | 说æ | |
| | | |------|--------|------| |
| | | | 5.1 | é宿¼æåæå¢å¼º | æ´å ERP è®¢åæ°æ®ï¼å±ç¤ºä»åæºå°è®¢åç转åç | |
| | | | 5.2 | 客æ·éå®åæ | æå®¢æ·ç»è®¡ï¼åæºéé¢ãååéé¢ã订åéé¢ãåºåºéé¢ãæ¶æ¬¾éé¢ | |
| | | | 5.3 | éå®ä¸ç»©åæ | æ´å CRM åæº/ååå ERP 订å/æ¶æ¬¾ï¼è®¡ç®éå®ä¸ç»© | |
| | | | 5.4 | éå®è¶å¿åæ | ææ¶é´ç»´åº¦åæéå®è¶å¿ | |
| | | | 5.5 | éå®æè¡æ¦ | 综åæåï¼åæºãååã订åãæ¶æ¬¾ | |
| | | |
| | | **æ¶åæä»¶**: |
| | | - ä¿®æ¹: CRM ç»è®¡ç¸å
³ Service |
| | | - æ°å¢: `CrmErpSalesStatisticsService.java` |
| | | |
| | | --- |
| | | |
| | | ### Phase 6: æ°æ®è¿ç§»ä¸æ¸
çï¼é¢è®¡ 1 å¤©ï¼ |
| | | |
| | | **ç®æ **: å°ç°ææ°æ®è¿ç§»å°ç»ä¸ç»æ |
| | | |
| | | **æ¹é å
容**: |
| | | |
| | | | åºå· | æ¹é 项 | 说æ | |
| | | |------|--------|------| |
| | | | 6.1 | ERP 客æ·è¿ç§»å° CRM | æ°æ®è¿ç§» SQL èæ¬ | |
| | | | 6.2 | CRM 产åè¿ç§»å° ERP | æ°æ®è¿ç§» SQL èæ¬ | |
| | | | 6.3 | æ°æ®æ ¡éªèæ¬ | éªè¯è¿ç§»åæ°æ®å®æ´æ§ | |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãæ¹é ä¼å
级建议 |
| | | |
| | | | ä¼å
级 | Phase | 说æ | |
| | | |--------|-------|------| |
| | | | P0 | Phase 1 | 客æ·ç»ä¸æ¯åºç¡ï¼å¿
é¡»æå
宿 | |
| | | | P0 | Phase 2 | 产åç»ä¸æ¯åºç¡ï¼å¿
é¡»æå
宿 | |
| | | | P1 | Phase 3 | ååçæè®¢åæ¯æ ¸å¿ä¸å¡æµç¨ | |
| | | | P1 | Phase 4 | å
¨æµç¨è¿½æº¯æ¯åè§è¦æ± | |
| | | | P2 | Phase 5 | æ¥è¡¨åæå¯åç»å®å | |
| | | | P2 | Phase 6 | æ°æ®è¿ç§»å¯å¨ç³»ç»ç¨³å®åè¿è¡ | |
| | | |
| | | --- |
| | | |
| | | ## åãææ¯æ¹æ¡è¦ç¹ |
| | | |
| | | ### 4.1 跨模åè°ç¨æ¹æ¡ |
| | | |
| | | ä½¿ç¨æ¨¡åé´ API è°ç¨ï¼ |
| | | - CRM æä¾ `CrmCustomerApi` ä¾ ERP è°ç¨ |
| | | - ERP æä¾ `ErpProductApi`ã`ErpSaleOrderApi` ä¾ CRM è°ç¨ |
| | | |
| | | ### 4.2 æ°æ®ä¸è´æ§æ¹æ¡ |
| | | |
| | | - ä½¿ç¨ Spring Event è¿è¡æ¨¡åé´äºä»¶éç¥ |
| | | - å
³é®æä½ä½¿ç¨äºå¡ä¿è¯ä¸è´æ§ |
| | | - å¢å æ°æ®åæ¥ç¶æåæ®µï¼æ¯æå¼å¸¸æ¢å¤ |
| | | |
| | | ### 4.3 æéæ§å¶æ¹æ¡ |
| | | |
| | | - CRM å®¢æ·æ²¿ç¨ç°æçå¢éæéæºå¶ |
| | | - ERP 模åéè¿ API æ¥è¯¢å®¢æ·æ¶ï¼éæ ¡éªæ°æ®æé |
| | | |
| | | --- |
| | | |
| | | ## äºãé£é©ä¸æ³¨æäºé¡¹ |
| | | |
| | | | é£é© | åºå¯¹æªæ½ | |
| | | |------|----------| |
| | | | ç°ææ°æ®è¿ç§»å¤æ | æä¾è¿ç§»èæ¬ååæ»èæ¬ï¼åæ¹è¿ç§» | |
| | | | 跨模åè°ç¨æ§è½ | 使ç¨ç¼ååå° API è°ç¨ï¼æ¹éæ¥è¯¢ä¼å | |
| | | | æéæ§å¶å¤æ | ç»ä¸æéæ ¡éªé»è¾ï¼å¤ç¨ CRM æéæå¡ | |
| | | | ä¸å¡æµç¨åæ´ | å
åæµè¯ï¼æä¾ç¨æ·å¹è®ææ¡£ | |
| | | |
| | | --- |
| | | |
| | | ## å
ã交ä»ç© |
| | | |
| | | æ¯ä¸ª Phase 宿å交ä»ï¼ |
| | | 1. **SQL èæ¬** - è¡¨ç»æåæ´ãæ°æ®è¿ç§» |
| | | 2. **åç«¯ææ¡£** - æ¥å£åæ´ã页é¢ä¿®æ¹è¯´æ |
| | | 3. **æµè¯ç¨ä¾** - åè½æµè¯ãå彿µè¯ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- CRM ä¸ ERP éå®ä¸ä½åæ¹é - SQL æ§è¡è®°å½ |
| | | -- ============================================= |
| | | -- |
| | | -- æ§è¡ç¶æï¼ |
| | | -- Phase 1: å®¢æ·æ°æ®ç»ä¸ - å·²å®æï¼æ æ°å¢è¡¨ï¼ |
| | | -- Phase 2: äº§åæ°æ®ç»ä¸ - 已宿ï¼MDM ç©æè¡¨å·²åå¨ï¼ |
| | | -- Phase 3: åå订åå
³è - SQL å·²æ§è¡ â |
| | | -- Phase 4: åæºè®¢åå
³è - SQL å·²æ§è¡ â |
| | | -- Phase 5: è¥éæ¥è¡¨ - æ éæ°å¢è¡¨ |
| | | -- Phase 6: æ°æ®è¿ç§»æ¸
ç - ç¨æ·æå¨æ§è¡å®æ â |
| | | -- |
| | | -- ============================================= |
| | | |
| | | -- ============================================= |
| | | -- Phase 1 SQL |
| | | -- å®¢æ·æ°æ®ç»ä¸ï¼ERP é宿¨¡åä½¿ç¨ CRM å®¢æ· |
| | | -- ============================================= |
| | | |
| | | -- 1. å建 CRM å®¢æ· API 模åç¸å
³è¡¨ï¼æ æ°å¢è¡¨ï¼ä½¿ç¨ç°æ crm_customerï¼ |
| | | |
| | | -- 2. æ°æ®è¿ç§»ï¼å° ERP å®¢æ·æ°æ®è¿ç§»å° CRM 客æ·ï¼å¯éï¼æ ¹æ®å®é
æ
嵿§è¡ï¼ |
| | | -- 注æï¼æ¤æ¥éª¤éè¦æ ¹æ®å®é
æ°æ®æ
åµè¿è¡è°æ´ |
| | | |
| | | -- 2.1 æ¥ç ERP å®¢æ·æ°æ® |
| | | -- SELECT * FROM erp_customer WHERE deleted = 0; |
| | | |
| | | -- 2.2 è¿ç§» ERP 客æ·å° CRM 客æ·ï¼ç¤ºä¾èæ¬ï¼éæ ¹æ®å®é
æ
åµè°æ´ï¼ |
| | | -- INSERT INTO crm_customer (id, name, mobile, telephone, email, detail_address, |
| | | -- follow_up_status, lock_status, deal_status, owner_user_id, owner_time, |
| | | -- creator, create_time, updater, update_time, deleted, tenant_id) |
| | | -- SELECT |
| | | -- id, |
| | | -- name, |
| | | -- mobile, |
| | | -- telephone, |
| | | -- email, |
| | | -- NULL as detail_address, |
| | | -- 0 as follow_up_status, |
| | | -- 0 as lock_status, |
| | | -- 0 as deal_status, |
| | | -- NULL as owner_user_id, |
| | | -- NOW() as owner_time, |
| | | -- creator, |
| | | -- create_time, |
| | | -- updater, |
| | | -- update_time, |
| | | -- deleted, |
| | | -- tenant_id |
| | | -- FROM erp_customer WHERE deleted = 0; |
| | | |
| | | -- 3. åºå¼ ERP 客æ·è¡¨ï¼ä¿çè¡¨ç»æï¼ä»
æ 记说æï¼ |
| | | -- 注æï¼erp_customer 表ä¿çï¼ä½ä¸åä½ä¸ºä¸»æ°æ®ä½¿ç¨ |
| | | -- åç»å¯å 餿彿¡£ |
| | | |
| | | -- ============================================= |
| | | -- Phase 3 SQLï¼é¢åï¼ |
| | | -- ååçæéå®è®¢åç¸å
³ |
| | | -- ============================================= |
| | | |
| | | -- 4. ERP éå®è®¢åå¢å å
³èåååæ®µ |
| | | ALTER TABLE `erp_sale_order` |
| | | ADD COLUMN `contract_id` bigint DEFAULT NULL COMMENT 'å
³è CRM ååç¼å·' AFTER `customer_id`, |
| | | ADD COLUMN `contract_no` varchar(32) DEFAULT NULL COMMENT 'CRM åååå·' AFTER `contract_id`; |
| | | |
| | | -- 5. CRM ååå¢å å
³è订ååæ®µ |
| | | ALTER TABLE `crm_contract` |
| | | ADD COLUMN `order_id` bigint DEFAULT NULL COMMENT 'å
³è ERP éå®è®¢åç¼å·' AFTER `total_price`, |
| | | ADD COLUMN `order_no` varchar(32) DEFAULT NULL COMMENT 'ERP éå®è®¢ååå·' AFTER `order_id`; |
| | | |
| | | -- ============================================= |
| | | -- Phase 4 SQLï¼é¢åï¼ |
| | | -- åæºå
³èéå®è®¢å |
| | | -- ============================================= |
| | | |
| | | -- 6. CRM åæºå¢å å
³è订ååæ®µ |
| | | ALTER TABLE `crm_business` |
| | | ADD COLUMN `order_id` bigint DEFAULT NULL COMMENT 'å
³è ERP éå®è®¢åç¼å·' AFTER `total_price`, |
| | | ADD COLUMN `order_no` varchar(32) DEFAULT NULL COMMENT 'ERP éå®è®¢ååå·' AFTER `order_id`; |
| | | |
| | | -- ============================================= |
| | | -- 注æäºé¡¹ |
| | | -- ============================================= |
| | | -- 1. æ§è¡ SQL å请å¤ä»½æ°æ® |
| | | -- 2. æ°æ®è¿ç§»èæ¬éè¦æ ¹æ®å®é
æ°æ®æ
åµè°æ´ |
| | | -- 3. åºå¼ç ERP 客æ·è¡¨å»ºè®®ä¿ç䏿®µæ¶é´ååå é¤ |
| | | -- 4. ååååæºå
³è订ååæ®µå¯å
æ·»å ï¼åç»åè½å®ç°æ¶åä½¿ç¨ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ERP éè´ç®¡ç模åå®å - åç«¯åæ´ææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | å®å ERP éè´ç®¡ç模åï¼å®ç°ä»éè´ç³è¯·å°éè´å
¥åºç宿´æµç¨ç®¡çã |
| | | |
| | | **æµç¨è¯´æ**ï¼ |
| | | - **éè´ç³è¯·**ï¼éè¦ BPM 审æ¹ï¼å®¡æ¹éè¿åå¯çæéè´è®¢å |
| | | - **éè´è®¢å**ï¼ç±éè´ç³è¯·çæï¼æ é审æ¹ï¼ç´æ¥å¯è¿è¡å
¥åºæä½ |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãåç½®æ¡ä»¶ |
| | | |
| | | ### BPM æµç¨é
ç½®ï¼éè´ç³è¯·ï¼ |
| | | |
| | | éè´ç³è¯·å®¡æ¹éè¦ BPM æµç¨æ¯æï¼å¿
é¡»å
宿以ä¸é
ç½®ï¼ |
| | | |
| | | 1. **å建éè´ç³è¯·å®¡æ¹åç±»**ï¼å¨ BPM æµç¨åç±»ä¸å建 `purchase_request_approve` åç±» |
| | | 2. **å建éè´ç³è¯·å®¡æ¹æµç¨**ï¼å¨ BPM æµç¨æ¨¡åä¸å建éè´ç³è¯·å®¡æ¹æµç¨ |
| | | |
| | | **æ§è¡ SQL**ï¼ |
| | | ```sql |
| | | -- å建 BPM éè´ç³è¯·å®¡æ¹åç±» |
| | | INSERT INTO bpm_category (id, name, code, description, status, sort, creator, create_time, updater, update_time, deleted) |
| | | VALUES (101, 'éè´ç³è¯·å®¡æ¹', 'purchase_request_approve', 'éè´ç³è¯·å®¡æ¹æµç¨åç±»', 0, 11, '1', NOW(), '1', NOW(), 0); |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãåè½æ¸
å |
| | | |
| | | | åºå· | åè½æ¨¡å | 页é¢è·¯å¾ | åè½è¯´æ | |
| | | |------|----------|----------|----------| |
| | | | 1 | éè´ç³è¯· | `/erp/purchase/request` | éæ±é¨é¨åèµ·éè´éæ±ãBPM 审æ¹ãçæéè´è®¢å | |
| | | | 2 | ä¾åºå管ç | `/erp/purchase/supplier` | ä¾åºåä¸»æ°æ®æ¡£æ¡ç®¡ç | |
| | | | 3 | éè´è®¢å | `/erp/purchase/order` | éè´è®¢å管çï¼æ é审æ¹ï¼ç±éè´ç³è¯·çæï¼ | |
| | | | 4 | éè´å
¥åº | `/erp/purchase/in` | å°è´§å
¥åºãéªæ¶ç®¡ç | |
| | | | 5 | éè´éè´§ | `/erp/purchase/return` | éè´é货管ç | |
| | | | 6 | éè´ç»è®¡ | `/erp/purchase/statistics` | ç»è®¡åææ¥è¡¨ | |
| | | |
| | | ### éè´æµç¨è¯´æ |
| | | |
| | | 宿´çéè´æµç¨ä¸ºï¼ |
| | | |
| | | **éè´ç³è¯· -> å®¡æ¹ -> éè´è®¢å -> å
¥åº -> 仿¬¾** |
| | | |
| | | 1. **éè´ç³è¯·**ï¼éæ±é¨é¨åèµ·éè´éæ±ï¼å¡«åç³è¯·çç±å产åæç» |
| | | 2. **审æ¹**ï¼éè¿ BPM 工使µè¿è¡å®¡æ¹ |
| | | 3. **éè´è®¢å**ï¼å®¡æ¹éè¿åï¼éæ©ä¾åºåçæéè´è®¢åï¼æ éå审æ¹ï¼ |
| | | 4. **å
¥åº**ï¼ä¾åºååè´§åï¼è¿è¡å
¥åºéªæ¶ |
| | | 5. **仿¬¾**ï¼æ ¹æ®å
¥åºæ
åµè¿è¡ä»æ¬¾ |
| | | |
| | | **è¯¦ç»ææ¡£**ï¼éè´ç³è¯·åè½è¯¦è§ `docs/erp_purchase_request_frontend.md` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãä¾åºå管çé¡µé¢ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - `/erp/purchase/supplier/index` - ä¾åºåå表 |
| | | - `/erp/purchase/supplier/form` - ä¾åºå表å |
| | | |
| | | ### æ°å¢å段 |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | creditCode | String | ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç | |
| | | | bankName | String | 弿·é¶è¡ | |
| | | | bankAccount | String | é¶è¡è´¦å· | |
| | | | address | String | å°å | |
| | | | contact | String | è系人 | |
| | | | phone | String | èç³»çµè¯ | |
| | | | email | String | é®ç®± | |
| | | | taxNo | String | ç¨å· | |
| | | | qualification | String | èµè´¨ä¿¡æ¯ | |
| | | | cooperationTime | Date | åä½å¼å§æ¶é´ | |
| | | |
| | | ### å端表åä¿®æ¹ |
| | | |
| | | ```html |
| | | <el-form :model="form" :rules="rules"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ä¾åºååç§°" prop="name"> |
| | | <el-input v-model="form.name" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç " prop="creditCode"> |
| | | <el-input v-model="form.creditCode" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç¨å·" prop="taxNo"> |
| | | <el-input v-model="form.taxNo" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="è系人" prop="contact"> |
| | | <el-input v-model="form.contact" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="èç³»çµè¯" prop="phone"> |
| | | <el-input v-model="form.phone" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="é®ç®±" prop="email"> |
| | | <el-input v-model="form.email" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="弿·é¶è¡" prop="bankName"> |
| | | <el-input v-model="form.bankName" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="é¶è¡è´¦å·" prop="bankAccount"> |
| | | <el-input v-model="form.bankAccount" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="åä½å¼å§æ¶é´" prop="cooperationTime"> |
| | | <el-date-picker v-model="form.cooperationTime" type="date" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="16"> |
| | | <el-form-item label="å°å" prop="address"> |
| | | <el-input v-model="form.address" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio :label="0">å¯ç¨</el-radio> |
| | | <el-radio :label="1">ç¦ç¨</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-form-item label="èµè´¨ä¿¡æ¯" prop="qualification"> |
| | | <el-input v-model="form.qualification" type="textarea" :rows="3" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## åãéè´å
¥åºé¡µé¢ï¼éªæ¶åè½ï¼ |
| | | |
| | | ### æ°å¢å段 |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | inspectionStatus | Integer | éªæ¶ç¶æï¼0:å¾
éªæ¶ 1:å·²éªæ¶ 2:éªæ¶ä¸åæ ¼ï¼ | |
| | | | inspectionTime | DateTime | éªæ¶æ¶é´ | |
| | | | inspectorId | Long | éæ¶äººåç¼å· | |
| | | | inspectionResult | String | éªæ¶ç»æ | |
| | | |
| | | ### åç«¯ä¿®æ¹ |
| | | |
| | | ```html |
| | | <!-- éªæ¶æé® --> |
| | | <el-button @click="handleInspection(row)" v-if="row.inspectionStatus === 0"> |
| | | éªæ¶ |
| | | </el-button> |
| | | |
| | | <!-- éªæ¶å¼¹çª --> |
| | | <el-dialog title="éè´å
¥åºéªæ¶" v-model="inspectionDialogVisible"> |
| | | <el-form :model="inspectionForm"> |
| | | <el-form-item label="éªæ¶ç¶æ"> |
| | | <el-radio-group v-model="inspectionForm.inspectionStatus"> |
| | | <el-radio :label="1">éªæ¶åæ ¼</el-radio> |
| | | <el-radio :label="2">éªæ¶ä¸åæ ¼</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="éªæ¶ç»æ"> |
| | | <el-input v-model="inspectionForm.inspectionResult" type="textarea" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <el-button @click="inspectionDialogVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="submitInspection">ç¡®å®</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãéè´ç»è®¡é¡µé¢ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - `/erp/purchase/statistics/index` - éè´ç»è®¡é¦é¡µ |
| | | - `/erp/purchase/statistics/supplier` - ä¾åºåä¾è´§ç»è®¡ |
| | | - `/erp/purchase/statistics/price` - éè´ä»·æ ¼åæ |
| | | - `/erp/purchase/statistics/uncompleted` - æªå®æè®¢åè·è¸ª |
| | | |
| | | ### API åæ´ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /erp/purchase-statistics/summary | éè´æ±æ»ç»è®¡ | |
| | | | GET | /erp/purchase-statistics/supplier | ä¾åºåä¾è´§ç»è®¡ | |
| | | | GET | /erp/purchase-statistics/price | éè´ä»·æ ¼åæ | |
| | | | GET | /erp/purchase-statistics/uncompleted | æªå®æè®¢åè·è¸ª | |
| | | |
| | | #### ä¾åºåä¾è´§ç»è®¡ååº |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": [ |
| | | { |
| | | "supplierId": 1, |
| | | "supplierName": "ä¾åºåA", |
| | | "orderCount": 10, |
| | | "orderAmount": 100000.00, |
| | | "inCount": 8, |
| | | "inAmount": 80000.00, |
| | | "returnCount": 1, |
| | | "returnAmount": 5000.00 |
| | | } |
| | | ], |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | #### éè´ä»·æ ¼åæååº |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": [ |
| | | { |
| | | "productId": 1, |
| | | "productName": "产åA", |
| | | "productBarCode": "12345678", |
| | | "avgPrice": 50.00, |
| | | "minPrice": 45.00, |
| | | "maxPrice": 55.00, |
| | | "latestPrice": 52.00, |
| | | "priceChangeRate": 4.0 |
| | | } |
| | | ], |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | #### æªå®æè®¢åè·è¸ªååº |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": [ |
| | | { |
| | | "orderId": 1, |
| | | "orderNo": "PO202401001", |
| | | "supplierName": "ä¾åºåA", |
| | | "orderTime": "2024-01-01", |
| | | "productNames": "产åA,产åB", |
| | | "orderAmount": 10000.00, |
| | | "inAmount": 5000.00, |
| | | "uncompletedAmount": 5000.00, |
| | | "daysOverdue": 5 |
| | | } |
| | | ], |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
ãæ³¨æäºé¡¹ |
| | | |
| | | 1. **æ°æ®å®æ´æ§**ï¼ä¾åºåä¸»æ°æ®éå¡«å宿´ä¿¡æ¯ï¼å
æ¬ä¿¡ç¨ä»£ç ãèç³»æ¹å¼ãé¶è¡ä¿¡æ¯ç |
| | | 2. **éªæ¶ç®¡ç**ï¼éè´å
¥åºéè¿è¡éªæ¶ï¼éªæ¶åæ ¼åææ£å¼å
¥åº |
| | | 3. **æéæ§å¶**ï¼æ¯ä¸ªåè½æ¨¡å齿ç¬ç«çæéæ§å¶ï¼éé
ç½®è§è²æé |
| | | 4. **æ°æ®è¿½æº¯**ï¼æææä½è®°å½é½æå®æ´çå建人ãå建æ¶é´ã审æ¹äººãå®¡æ¹æ¶é´çä¿¡æ¯ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ERP éè´ç³è¯·åè½ - åç«¯åæ´ææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ°å¢ ERP éè´ç³è¯·åè½ï¼å®ç°ä»éæ±é¨é¨åèµ·éè´éæ±å°çæéè´è®¢åç宿´æµç¨ç®¡çã |
| | | |
| | | **éè¦è¯´æ**ï¼éè´ç³è¯·å®¡æ¹éè¦éæ BPM 工使µï¼å¿
é¡»å
å¨ BPM 模åå建 `purchase_request_approve` åç±»å对åºçå®¡æ¹æµç¨ã |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãåç½®æ¡ä»¶ |
| | | |
| | | ### BPM æµç¨é
ç½® |
| | | |
| | | éè´ç³è¯·å®¡æ¹éè¦ BPM æµç¨æ¯æï¼å¿
é¡»å
宿以ä¸é
ç½®ï¼ |
| | | |
| | | 1. **å建éè´ç³è¯·å®¡æ¹åç±»**ï¼å¨ BPM æµç¨åç±»ä¸å建 `purchase_request_approve` åç±» |
| | | 2. **å建éè´ç³è¯·å®¡æ¹æµç¨**ï¼å¨ BPM æµç¨æ¨¡åä¸å建éè´ç³è¯·å®¡æ¹æµç¨ |
| | | - **æµç¨æ è¯ï¼Keyï¼å¿
须为**ï¼`erp-purchase-request-audit` |
| | | - å
³èå° `purchase_request_approve` åç±» |
| | | - åå¸å¹¶æ¿æ´»æµç¨ |
| | | |
| | | **æ§è¡ SQL**ï¼ |
| | | ```sql |
| | | -- å建 BPM éè´ç³è¯·å®¡æ¹åç±» |
| | | INSERT INTO bpm_category (id, name, code, description, status, sort, creator, create_time, updater, update_time, deleted) |
| | | VALUES (101, 'éè´ç³è¯·å®¡æ¹', 'purchase_request_approve', 'éè´ç³è¯·å®¡æ¹æµç¨åç±»', 0, 11, '1', NOW(), '1', NOW(), 0); |
| | | ``` |
| | | |
| | | **æ ¡éªé»è¾**ï¼ |
| | | - æäº¤éè´ç³è¯·æ¶ï¼ç³»ç»ä¼æ ¡éª BPM éè´ç³è¯·å®¡æ¹åç±»æ¯å¦åå¨ |
| | | - 妿åç±»ä¸åå¨ï¼ä¼æåºå¼å¸¸ï¼`éè´ç³è¯·å®¡æ¹åç±»ä¸åå¨ï¼è¯·å
å¨BPM模åå建éè´ç³è¯·å®¡æ¹æµç¨åç±»` |
| | | - 妿æµç¨æ è¯ä¸º `erp-purchase-request-audit` çæµç¨æªåå¸ææªæ¿æ´»ï¼ä¼æåºå¼å¸¸ï¼`éè´ç³è¯·å®¡æ¹æµç¨æªåå¸ææªæ¿æ´»ï¼è¯·å
å建æµç¨æ è¯ä¸º[erp-purchase-request-audit]çæµç¨æ¨¡åå¹¶åå¸` |
| | | |
| | | --- |
| | | |
| | | ## äºãæ¶åé¡µé¢ |
| | | |
| | | - `/erp/purchase/request/index` - éè´ç³è¯·å表 |
| | | - `/erp/purchase/request/form` - éè´ç³è¯·è¡¨åï¼æ°å¢/ç¼è¾ï¼ |
| | | - `/erp/purchase/request/detail` - éè´ç³è¯·è¯¦æ
|
| | | |
| | | --- |
| | | |
| | | ## ä¸ãåè½æ¸
å |
| | | |
| | | | åºå· | åè½ | 说æ | |
| | | |------|------|------| |
| | | | 1 | æ°å¢éè´ç³è¯· | å建èç¨¿ç¶æçéè´ç³è¯· | |
| | | | 2 | ç¼è¾éè´ç³è¯· | ä¿®æ¹èç¨¿ç¶æçéè´ç³è¯· | |
| | | | 3 | å é¤éè´ç³è¯· | å é¤èç¨¿ç¶æçéè´ç³è¯· | |
| | | | 4 | æäº¤å®¡æ¹ | æäº¤ BPM æµç¨å®¡æ¹ | |
| | | | 5 | çæéè´è®¢å | 审æ¹éè¿åçæéè´è®¢å | |
| | | | 6 | å¯¼åº Excel | 导åºéè´ç³è¯·å表 | |
| | | |
| | | --- |
| | | |
| | | ## åãAPI æ¥å£ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /erp/purchase-request/create | å建éè´ç³è¯· | |
| | | | PUT | /erp/purchase-request/update | æ´æ°éè´ç³è¯· | |
| | | | PUT | /erp/purchase-request/submit | æäº¤éè´ç³è¯·å®¡æ¹ | |
| | | | DELETE | /erp/purchase-request/delete | å é¤éè´ç³è¯· | |
| | | | GET | /erp/purchase-request/get | è·å¾éè´ç³è¯·è¯¦æ
| |
| | | | GET | /erp/purchase-request/page | è·å¾éè´ç³è¯·å页 | |
| | | | GET | /erp/purchase-request/export-excel | 导åºéè´ç³è¯· Excel | |
| | | | POST | /erp/purchase-request/generate-order | çæéè´è®¢å | |
| | | | GET | /erp/purchase-request/approve-process-list | è·åå®¡æ¹æµç¨å表 | |
| | | |
| | | > **æä»¶ä¸ä¼ **ï¼ä½¿ç¨éç¨æ¥å£ `POST /infra/file/upload`ï¼åæ° `file` + `directory=purchase-request`ï¼è¿åæä»¶ URLãè¯¦è§ `docs/file_upload_guide.md`ã |
| | | |
| | | ### 4.1 å建éè´ç³è¯· |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | requestTime | DateTime | æ¯ | ç³è¯·æ¶é´ | |
| | | | requestReason | String | å¦ | ç³è¯·çç± | |
| | | | supplierId | Long | å¦ | ä¾åºåç¼å·ï¼å¯éï¼ | |
| | | | discountPercent | BigDecimal | å¦ | 伿 çï¼ç¾åæ¯ | |
| | | | fileUrl | String | å¦ | éä»¶å°å | |
| | | | remark | String | å¦ | 夿³¨ | |
| | | | items | List | æ¯ | ç³è¯·æç»å表 | |
| | | |
| | | **items æç»åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | productId | Long | æ¯ | 产åç¼å· | |
| | | | productUnitId | Long | æ¯ | 产ååä½ç¼å· | |
| | | | productPrice | BigDecimal | å¦ | 产ååä»·ï¼åèä»·ï¼ | |
| | | | count | BigDecimal | æ¯ | æ°é | |
| | | | taxPercent | BigDecimal | å¦ | ç¨çï¼ç¾åæ¯ | |
| | | | demandTime | Date | å¦ | éæ±æ¥æ | |
| | | | remark | String | å¦ | 夿³¨ | |
| | | |
| | | **ååºï¼** `{ "code": 0, "data": 1001, "msg": "æä½æå" }` |
| | | |
| | | ### 4.2 æäº¤éè´ç³è¯·å®¡æ¹ |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | éè´ç³è¯·ç¼å· | |
| | | | processDefinitionKey | String | æ¯ | æµç¨å®ä¹ Keyï¼ç¨æ·ä»æµç¨å表ä¸éæ©ï¼ | |
| | | |
| | | **ååºï¼** `{ "code": 0, "msg": "æä½æå" }` |
| | | |
| | | > **æµç¨éæ©**ï¼æäº¤å®¡æ¹åï¼éå
è°ç¨ `/erp/purchase-request/approve-process-list` è·åå¯éæµç¨å表ï¼è®©ç¨æ·éæ©åä¼ å
¥ `processDefinitionKey`ã |
| | | |
| | | ### 4.3 çæéè´è®¢å |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | éè´ç³è¯·ç¼å· | |
| | | | supplierId | Long | æ¯ | ä¾åºåç¼å· | |
| | | |
| | | **ååºï¼** `{ "code": 0, "data": 2001, "msg": "æä½æå" }`ï¼è¿åéè´è®¢åç¼å·ï¼ |
| | | |
| | | ### 4.4 å页æ¥è¯¢ååº |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "list": [ |
| | | { |
| | | "id": 1, |
| | | "no": "CGSQ20260701000001", |
| | | "status": 20, |
| | | "requestUserId": 1, |
| | | "requestUserName": "å¼ ä¸", |
| | | "requestDeptId": 100, |
| | | "requestDeptName": "ç产é¨", |
| | | "requestTime": "2026-07-01 10:00:00", |
| | | "requestReason": "ç产éè¦", |
| | | "supplierId": 1, |
| | | "supplierName": "ä¾åºåA", |
| | | "totalCount": 100.00, |
| | | "totalPrice": 10000.00, |
| | | "productNames": "产åA,产åB", |
| | | "orderId": 2001, |
| | | "orderNo": "CGDD20260701000001", |
| | | "createTime": "2026-07-01 10:00:00" |
| | | } |
| | | ], |
| | | "total": 1 |
| | | }, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãç¶ææµè½¬ |
| | | |
| | | | ç¶æå¼ | ç¶æå | 说æ | |
| | | |--------|--------|------| |
| | | | 0 | æªæäº¤ | èç¨¿ç¶æï¼å¯ç¼è¾ãå¯å é¤ | |
| | | | 10 | 审æ¹ä¸ | å·²æäº¤å®¡æ¹ï¼ä¸å¯ä¿®æ¹ | |
| | | | 20 | å®¡æ ¸éè¿ | 审æ¹éè¿ï¼å¯çæéè´è®¢å | |
| | | | 30 | å®¡æ ¸ä¸éè¿ | 审æ¹è¢«æç»ï¼å¯éæ°æäº¤ | |
| | | | 40 | 已忶 | æµç¨è¢«åæ¶ | |
| | | |
| | | **ç¶ææµè½¬å¾ï¼** |
| | | ``` |
| | | è稿(0) -> æäº¤ -> 审æ¹ä¸(10) -> 审æ¹éè¿(20) -> çæéè´è®¢å |
| | | | |
| | | +-> 审æ¹ä¸éè¿(30) -> éæ°æäº¤ -> 审æ¹ä¸(10) |
| | | | |
| | | +-> 已忶(40) |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
ãå端修æ¹ç¹ |
| | | |
| | | ### 6.1 å表页æé® |
| | | |
| | | ```html |
| | | <!-- æç´¢æ --> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true"> |
| | | <el-form-item label="ç³è¯·åå·" prop="no"> |
| | | <el-input v-model="queryParams.no" placeholder="请è¾å
¥ç³è¯·åå·" clearable /> |
| | | </el-form-item> |
| | | <el-form-item label="ç³è¯·äºº" prop="requestUserId"> |
| | | <el-select v-model="queryParams.requestUserId" placeholder="è¯·éæ©ç³è¯·äºº" clearable> |
| | | <!-- ç¨æ·å表 --> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="审æ¹ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="è¯·éæ©ç¶æ" clearable> |
| | | <el-option label="æªæäº¤" :value="0" /> |
| | | <el-option label="审æ¹ä¸" :value="10" /> |
| | | <el-option label="å®¡æ ¸éè¿" :value="20" /> |
| | | <el-option label="å®¡æ ¸ä¸éè¿" :value="30" /> |
| | | <el-option label="已忶" :value="40" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ç³è¯·æ¶é´" prop="requestTime"> |
| | | <el-date-picker v-model="queryParams.requestTime" type="daterange" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleQuery">æç´¢</el-button> |
| | | <el-button @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <!-- æä½æ --> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" @click="handleAdd" v-hasPermi="['erp:purchase-request:create']">æ°å¢</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="success" @click="handleExport" v-hasPermi="['erp:purchase-request:export']">导åº</el-button> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- è¡¨æ ¼æä½å --> |
| | | <el-table-column label="æä½" align="center" width="200"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" @click="handleDetail(scope.row)">详æ
</el-button> |
| | | <el-button link type="primary" @click="handleUpdate(scope.row)" |
| | | v-if="scope.row.status === 0" v-hasPermi="['erp:purchase-request:update']">ç¼è¾</el-button> |
| | | <el-button link type="primary" @click="handleSubmit(scope.row)" |
| | | v-if="scope.row.status === 0" v-hasPermi="['erp:purchase-request:submit']">æäº¤</el-button> |
| | | <el-button link type="primary" @click="handleGenerateOrder(scope.row)" |
| | | v-if="scope.row.status === 20 && !scope.row.orderId" v-hasPermi="['erp:purchase-request:generate-order']">çæè®¢å</el-button> |
| | | <el-button link type="danger" @click="handleDelete(scope.row)" |
| | | v-if="scope.row.status === 0" v-hasPermi="['erp:purchase-request:delete']">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | ``` |
| | | |
| | | ### 6.2 data æ°æ® |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | // æ¥è¯¢åæ° |
| | | queryParams: { |
| | | pageNo: 1, |
| | | pageSize: 10, |
| | | no: undefined, |
| | | requestUserId: undefined, |
| | | requestDeptId: undefined, |
| | | requestTime: [], |
| | | status: undefined, |
| | | productId: undefined, |
| | | }, |
| | | // ç¶æåå
¸ |
| | | statusOptions: [ |
| | | { value: 0, label: 'æªæäº¤' }, |
| | | { value: 10, label: '审æ¹ä¸' }, |
| | | { value: 20, label: 'å®¡æ ¸éè¿' }, |
| | | { value: 30, label: 'å®¡æ ¸ä¸éè¿' }, |
| | | { value: 40, label: '已忶' }, |
| | | ], |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 6.3 æ¹æ³ |
| | | |
| | | ```js |
| | | methods: { |
| | | // æäº¤å®¡æ¹ |
| | | async handleSubmit(row) { |
| | | try { |
| | | await this.$modal.confirm('确认æäº¤è¯¥éè´ç³è¯·è¿è¡å®¡æ¹ï¼') |
| | | await submitPurchaseRequest(row.id) |
| | | this.$modal.msgSuccess('æäº¤æå') |
| | | this.getList() |
| | | } catch {} |
| | | }, |
| | | |
| | | // çæéè´è®¢å |
| | | async handleGenerateOrder(row) { |
| | | try { |
| | | // å¼¹çªéæ©ä¾åºå |
| | | const { value: supplierId } = await this.$prompt('è¯·éæ©ä¾åºå', 'çæéè´è®¢å', { |
| | | inputType: 'select', |
| | | inputOptions: this.supplierOptions, |
| | | inputValidator: (value) => { |
| | | if (!value) return 'è¯·éæ©ä¾åºå' |
| | | return true |
| | | } |
| | | }) |
| | | const orderId = await generatePurchaseOrder(row.id, supplierId) |
| | | this.$modal.msgSuccess(`çæéè´è®¢åæåï¼è®¢åç¼å·ï¼${orderId}`) |
| | | this.getList() |
| | | } catch {} |
| | | }, |
| | | } |
| | | ``` |
| | | |
| | | ### 6.4 æä»¶ä¸ä¼ ç»ä»¶ |
| | | |
| | | > 使ç¨éç¨æä»¶ä¸ä¼ æ¥å£ `POST /infra/file/upload`ï¼è¯¦è§ `docs/file_upload_guide.md`ã |
| | | |
| | | ```html |
| | | <!-- 表åä¸çéä»¶ä¸ä¼ --> |
| | | <el-form-item label="éä»¶" prop="fileUrl"> |
| | | <el-upload |
| | | :action="uploadUrl" |
| | | :headers="headers" |
| | | :data="{ directory: 'purchase-request' }" |
| | | :on-success="handleUploadSuccess" |
| | | :before-upload="beforeUpload" |
| | | :file-list="fileList" |
| | | :limit="1" |
| | | > |
| | | <el-button type="primary">ç¹å»ä¸ä¼ </el-button> |
| | | <template #tip> |
| | | <div class="el-upload__tip">æ¯æ pdfãdocãdocxãxlsãxlsx æ ¼å¼ï¼æå¤§ 10MB</div> |
| | | </template> |
| | | </el-upload> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | // æä»¶ä¸ä¼ é
ç½®ï¼ä½¿ç¨éç¨æ¥å£ï¼ |
| | | uploadUrl: process.env.VUE_APP_BASE_API + '/infra/file/upload', |
| | | headers: { Authorization: 'Bearer ' + getToken() }, |
| | | fileList: [], |
| | | } |
| | | }, |
| | | methods: { |
| | | handleUploadSuccess(response) { |
| | | if (response.code === 0) { |
| | | this.form.fileUrl = response.data |
| | | this.$modal.msgSuccess('ä¸ä¼ æå') |
| | | } else { |
| | | this.$modal.msgError(response.msg || 'ä¸ä¼ 失败') |
| | | } |
| | | }, |
| | | beforeUpload(file) { |
| | | const allowedTypes = ['application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', |
| | | 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'] |
| | | const isAllowed = allowedTypes.includes(file.type) || file.name.endsWith('.pdf') || file.name.endsWith('.doc') || file.name.endsWith('.docx') |
| | | || file.name.endsWith('.xls') || file.name.endsWith('.xlsx') |
| | | if (!isAllowed) { |
| | | this.$message.error('åªæ¯æ pdfãdocãdocxãxlsãxlsx æ ¼å¼!') |
| | | return false |
| | | } |
| | | const isLt10M = file.size / 1024 / 1024 < 10 |
| | | if (!isLt10M) { |
| | | this.$message.error('æä»¶å¤§å°ä¸è½è¶
è¿ 10MB!') |
| | | return false |
| | | } |
| | | return true |
| | | }, |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãæéé
ç½® |
| | | |
| | | | æéæ è¯ | 说æ | |
| | | |---------|------| |
| | | | erp:purchase-request:query | æ¥è¯¢éè´ç³è¯· | |
| | | | erp:purchase-request:create | æ°å¢éè´ç³è¯· | |
| | | | erp:purchase-request:update | ä¿®æ¹éè´ç³è¯· | |
| | | | erp:purchase-request:delete | å é¤éè´ç³è¯· | |
| | | | erp:purchase-request:submit | æäº¤å®¡æ¹ | |
| | | | erp:purchase-request:export | 导åºéè´ç³è¯· | |
| | | | erp:purchase-request:generate-order | çæéè´è®¢å | |
| | | |
| | | --- |
| | | |
| | | ## å
«ã注æäºé¡¹ |
| | | |
| | | 1. **ç¶æéå¶**ï¼åªæèç¨¿ç¶æï¼status=0ï¼çç³è¯·åæè½ç¼è¾åå é¤ |
| | | 2. **å®¡æ¹æµç¨**ï¼æäº¤å®¡æ¹åè¯·ç¡®ä¿ BPM æµç¨å·²é
ç½®å®æ |
| | | 3. **çæè®¢å**ï¼åªæå®¡æ¹éè¿ï¼status=20ï¼ä¸æªçæè®¢åçç³è¯·åæè½çæéè´è®¢å |
| | | 4. **ä¾åºåéæ©**ï¼çæéè´è®¢åæ¶å¿
须鿩ä¾åºåï¼ç³è¯·æ¶å¯é¢å
æå®ä¾åºå |
| | | 5. **æ°æ®å®æ´æ§**ï¼ç³è¯·æç»éå¡«å宿´ç产åä¿¡æ¯åæ°é |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # æä»¶ä¸ä¼ éææå |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬ç³»ç»æä¾äº**ç»ä¸çæä»¶ä¸ä¼ æå¡**ï¼æ¯æå¤ç§å卿¹å¼ï¼æ¬å°ãS3/OSSãæ°æ®åºãFTP/SFTPï¼ã |
| | | |
| | | > **éè¦**ï¼ææä¸å¡æ¨¡åå¿
须使ç¨éç¨æä»¶ä¸ä¼ æ¥å£ï¼**ç¦æ¢ä¸ºæ¯ä¸ªæ¨¡åæ°å¢ä¸ä¼ æ¥å£**ã |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãéç¨ä¸ä¼ æ¥å£ |
| | | |
| | | ### 1.1 æ¥å£ä¿¡æ¯ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | `/infra/file/upload` | éç¨æä»¶ä¸ä¼ | |
| | | |
| | | ### 1.2 请æ±åæ° |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | file | MultipartFile | æ¯ | ä¸ä¼ çæä»¶ | |
| | | | directory | String | å¦ | åå¨ç®å½ï¼å¦ `purchase-request`ã`contract` | |
| | | |
| | | ### 1.3 ååºç¤ºä¾ |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": "https://xxx.com/xxx.pdf", |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | è¿åå¼ `data` å³ä¸ºæä»¶è®¿é® URLï¼å¯ç´æ¥åå¨å°æ°æ®åºã |
| | | |
| | | --- |
| | | |
| | | ## äºãåç«¯éæ |
| | | |
| | | ### 2.1 ä¸ä¼ ç»ä»¶ç¤ºä¾ |
| | | |
| | | ```html |
| | | <el-upload |
| | | :action="uploadUrl" |
| | | :headers="headers" |
| | | :data="{ directory: 'purchase-request' }" |
| | | :on-success="handleUploadSuccess" |
| | | :before-upload="beforeUpload" |
| | | > |
| | | <el-button type="primary">ç¹å»ä¸ä¼ </el-button> |
| | | </el-upload> |
| | | ``` |
| | | |
| | | ### 2.2 é
置说æ |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | // éç¨ä¸ä¼ æ¥å£ |
| | | uploadUrl: process.env.VUE_APP_BASE_API + '/infra/file/upload', |
| | | // 认è¯å¤´ |
| | | headers: { Authorization: 'Bearer ' + getToken() }, |
| | | } |
| | | }, |
| | | methods: { |
| | | handleUploadSuccess(response) { |
| | | if (response.code === 0) { |
| | | this.form.fileUrl = response.data // ä¿åæä»¶ URL |
| | | } |
| | | }, |
| | | beforeUpload(file) { |
| | | // ä¸å¡å±æ ¡éªæä»¶ç±»ååå¤§å° |
| | | const isLt10M = file.size / 1024 / 1024 < 10 |
| | | if (!isLt10M) { |
| | | this.$message.error('æä»¶å¤§å°ä¸è½è¶
è¿ 10MB!') |
| | | } |
| | | return isLt10M |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãç®å½è§è |
| | | |
| | | åä¸å¡æ¨¡åéè¿ `directory` åæ°åºååå¨ç®å½ï¼**ç¦æ¢æ°å¢ä¸å¡ä¸ä¼ æ¥å£**ï¼ |
| | | |
| | | | 模å | directory | 说æ | |
| | | |------|-----------|------| |
| | | | ç¨æ·å¤´å | `avatar` | ç¨æ·å¤´åå¾ç | |
| | | | ååéä»¶ | `contract` | ååç¸å
³æä»¶ | |
| | | | éè´ç³è¯· | `purchase-request` | éè´ç³è¯·éä»¶ | |
| | | | éè´è®¢å | `purchase-order` | éè´è®¢åéä»¶ | |
| | | | 产åå¾ç | `product` | 产åç¸å
³å¾ç | |
| | | | éç¨éä»¶ | `attachment` | éç¨ä¸å¡éä»¶ | |
| | | |
| | | > **å½åè§è**ï¼ä½¿ç¨å°å忝åè¿å符ï¼å¦ `purchase-request`ï¼ä¸æ¨¡ååä¿æä¸è´ã |
| | | |
| | | --- |
| | | |
| | | ## åãå端éæï¼ç¹æ®åºæ¯ï¼ |
| | | |
| | | ### 4.1 å端éè¦ä¸»å¨ä¸ä¼ æä»¶æ¶ |
| | | |
| | | æå°æ°åºæ¯ä¸ï¼å端éè¦ä¸»å¨ä¸ä¼ æä»¶ï¼å¦çææ¥è¡¨åä¿åï¼ï¼å¯æ³¨å
¥ `FileApi`ï¼ |
| | | |
| | | ```java |
| | | @Resource |
| | | private FileApi fileApi; |
| | | |
| | | // ä¸ä¼ æä»¶ |
| | | String url = fileApi.createFile(bytes, "æ¥è¡¨.xlsx", "report", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); |
| | | ``` |
| | | |
| | | ### 4.2 è·åç§ææä»¶é¢ç¾åå°å |
| | | |
| | | ```java |
| | | // çæä¸´æ¶è®¿é®å°åï¼1å°æ¶ææ |
| | | String presignedUrl = fileApi.presignGetUrl(fileUrl, 3600); |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãåå¨é
ç½® |
| | | |
| | | åå¨é
ç½®éè¿ç®¡çåå°å¨æé
ç½®ï¼æ éä¿®æ¹ä»£ç ï¼ |
| | | |
| | | 1. è®¿é® **åºç¡è®¾æ½ > æä»¶ç®¡ç > æä»¶é
ç½®** |
| | | 2. æ°å¢é
ç½®ï¼éæ©åå¨ç±»åå¹¶å¡«ååæ° |
| | | 3. ç¹å»"设置为主é
ç½®"æ¿æ´»ä½¿ç¨ |
| | | |
| | | ### æ¯æçåå¨ç±»å |
| | | |
| | | | ç±»å | 说æ | éç¨åºæ¯ | |
| | | |------|------|----------| |
| | | | DB | åå¨å°æ°æ®åº | å°æä»¶ãä¸´æ¶æä»¶ | |
| | | | LOCAL | æ¬å°ç£çåå¨ | å
ç½é¨ç½²ãå¼åç¯å¢ | |
| | | | FTP/SFTP | FTP æå¡å¨ | å
¼å®¹èç³»ç» | |
| | | | S3 | é¿éäº OSS / è
¾è®¯äº COS / MinIO | ç产ç¯å¢ | |
| | | |
| | | --- |
| | | |
| | | ## å
ãæä»¶å卿¹å¼ |
| | | |
| | | ### 6.1 夿件åå¨ï¼æ¨èï¼ |
| | | |
| | | ä½¿ç¨ `List<String>` + `StringListTypeHandler`ï¼åè CRM è·è¿è®°å½æ¨¡åï¼ |
| | | |
| | | **å®ä½ç±»ï¼** |
| | | |
| | | ```java |
| | | @TableName(value = "crm_follow_up_record", autoResultMap = true) |
| | | public class CrmFollowUpRecordDO extends BaseDO { |
| | | |
| | | /** |
| | | * å¾ç |
| | | */ |
| | | @TableField(typeHandler = StringListTypeHandler.class) |
| | | private List<String> picUrls; |
| | | |
| | | /** |
| | | * éä»¶ |
| | | */ |
| | | @TableField(typeHandler = StringListTypeHandler.class) |
| | | private List<String> fileUrls; |
| | | } |
| | | ``` |
| | | |
| | | **æ°æ®åºå段**ï¼`VARCHAR`ï¼åå¨ JSON æ°ç»æ ¼å¼å¦ `["url1","url2","url3"]` |
| | | |
| | | **VO ç±»ï¼** |
| | | |
| | | ```java |
| | | @Schema(description = "éä»¶") |
| | | private List<String> fileUrls; |
| | | ``` |
| | | |
| | | **å端使ç¨ï¼** |
| | | |
| | | ```js |
| | | // ä¸ä¼ æåå追å |
| | | handleUploadSuccess(response) { |
| | | if (response.code === 0) { |
| | | if (!this.form.fileUrls) { |
| | | this.form.fileUrls = [] |
| | | } |
| | | this.form.fileUrls.push(response.data) |
| | | } |
| | | } |
| | | |
| | | // å 餿件 |
| | | handleRemove(index) { |
| | | this.form.fileUrls.splice(index, 1) |
| | | } |
| | | ``` |
| | | |
| | | ### 6.2 åæä»¶åå¨ |
| | | |
| | | ```java |
| | | // å®ä½ç±» |
| | | private String fileUrl; |
| | | |
| | | // VO ç±» |
| | | @Schema(description = "éä»¶å°å") |
| | | private String fileUrl; |
| | | ``` |
| | | |
| | | ### 6.3 `infra_file` 表çä½ç¨ |
| | | |
| | | ç³»ç» `infra_file` è¡¨è®°å½ææä¸ä¼ æä»¶çå
æ°æ®ï¼nameãpathãurlãtypeãsizeï¼ï¼ä¸ä¸ä¸å¡å
³èï¼ä»
ç¨äºï¼ |
| | | - æä»¶ç®¡çåå°æ¥çä¸ä¼ è®°å½ |
| | | - ç»è®¡åå¨ä½¿ç¨æ
åµ |
| | | |
| | | --- |
| | | |
| | | ## ä¸ã注æäºé¡¹ |
| | | |
| | | 1. **使ç¨éç¨æ¥å£**ï¼æææä»¶ä¸ä¼ å¿
é¡»ä½¿ç¨ `/infra/file/upload`ï¼ç¦æ¢æ°å¢ä¸å¡ä¸ä¼ æ¥å£ |
| | | 2. **åºåç®å½**ï¼éè¿ `directory` åæ°åºåä¸å¡æ¨¡åï¼ä¾¿äºç®¡ç忏
ç |
| | | 3. **æä»¶å¤§å°**ï¼é»è®¤éå¶ 10MBï¼å¯å¨ Nginx æåºç¨å±è°æ´ |
| | | 4. **ç±»åæ ¡éª**ï¼åç«¯åºæ ¡éªå
许çæä»¶ç±»åï¼é²æ¢ä¸ä¼ æ¶ææä»¶ |
| | | 5. **URL åå¨**ï¼ä¸ä¼ æååï¼å°è¿åç URL åå¨å°ä¸å¡è¡¨ç `fileUrl` åæ®µ |
| | | |
| | | --- |
| | | |
| | | ## ä¸ã常è§é®é¢ |
| | | |
| | | **Q: 为ä»ä¹ä¸è½ä¸ºæ¯ä¸ªæ¨¡åæ°å¢ä¸ä¼ æ¥å£ï¼** |
| | | |
| | | A: ç»ä¸æ¥å£ä¾¿äºï¼ |
| | | - ç»ä¸ç®¡çåå¨é
ç½® |
| | | - ç»ä¸æéæ§å¶å审计 |
| | | - é¿å
代ç éå¤ |
| | | - åç»ç»´æ¤åè¿ç§» |
| | | |
| | | **Q: å¦ä½åºåä¸å模åçæä»¶ï¼** |
| | | |
| | | A: ä½¿ç¨ `directory` åæ°ï¼æä»¶ä¼åå¨å¨å¯¹åºç®å½ä¸ã |
| | | |
| | | **Q: å端å¦ä½éå¶æä»¶ç±»åï¼** |
| | | |
| | | A: å¨ `beforeUpload` æ¹æ³ä¸æ ¡éª `file.type` æ `file.name` åç¼ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- IM 模å MySQL è¡¨ç»æ |
| | | -- åºäº yudao-module-im 模åå®ä½ç±»æå |
| | | -- çææ¶é´: 2026-06-30 |
| | | |
| | | -- ======================================== |
| | | -- 1. im_channel - IM é¢é表 |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_channel`; |
| | | CREATE TABLE `im_channel` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `code` VARCHAR(64) NOT NULL COMMENT 'é¢éä¸å¡ç ', |
| | | `name` VARCHAR(128) NOT NULL COMMENT 'é¢éåç§°', |
| | | `avatar` VARCHAR(512) DEFAULT NULL COMMENT 'é¢é头å', |
| | | `sort` INT DEFAULT 0 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`), |
| | | UNIQUE KEY `uk_code` (`code`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM é¢é表'; |
| | | |
| | | -- ======================================== |
| | | -- 2. im_channel_material - IM é¢éç´ æè¡¨ |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_channel_material`; |
| | | CREATE TABLE `im_channel_material` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `channel_id` BIGINT NOT NULL COMMENT 'é¢éç¼å·', |
| | | `type` TINYINT NOT NULL COMMENT 'ç´ æå
容类å', |
| | | `title` VARCHAR(256) NOT NULL COMMENT 'æ é¢', |
| | | `cover_url` VARCHAR(512) DEFAULT NULL COMMENT 'å°é¢å¾', |
| | | `summary` VARCHAR(1024) DEFAULT NULL COMMENT 'æè¦', |
| | | `content` TEXT DEFAULT NULL COMMENT 'å¯ææ¬ HTML', |
| | | `url` VARCHAR(512) 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_channel_id` (`channel_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM é¢éç´ æè¡¨'; |
| | | |
| | | -- ======================================== |
| | | -- 3. im_conversation_read - IM ä¼è¯è¯»ä½ç½®è¡¨ |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_conversation_read`; |
| | | CREATE TABLE `im_conversation_read` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `user_id` BIGINT NOT NULL COMMENT 'ç¨æ·ç¼å·', |
| | | `conversation_type` TINYINT NOT NULL COMMENT 'ä¼è¯ç±»åï¼1ç§è 2群è 3é¢éï¼', |
| | | `target_id` BIGINT NOT NULL COMMENT 'ç®æ ç¼å·', |
| | | `message_id` BIGINT NOT NULL 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`), |
| | | UNIQUE KEY `uk_user_conv` (`user_id`, `conversation_type`, `target_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM ä¼è¯è¯»ä½ç½®è¡¨'; |
| | | |
| | | -- ======================================== |
| | | -- 4. im_face_pack - IM 表æ
å
表 |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_face_pack`; |
| | | CREATE TABLE `im_face_pack` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `name` VARCHAR(128) NOT NULL COMMENT '表æ
å
åç§°', |
| | | `icon` VARCHAR(512) DEFAULT NULL COMMENT '表æ
å
徿 ', |
| | | `sort` INT DEFAULT 0 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`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM 表æ
å
表'; |
| | | |
| | | -- ======================================== |
| | | -- 5. im_face_pack_item - IM 表æ
å
项表 |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_face_pack_item`; |
| | | CREATE TABLE `im_face_pack_item` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `pack_id` BIGINT NOT NULL COMMENT 'æå±è¡¨æ
å
ç¼å·', |
| | | `url` VARCHAR(512) NOT NULL COMMENT '表æ
å¾ URL', |
| | | `name` VARCHAR(64) DEFAULT NULL COMMENT '表æ
å', |
| | | `width` INT DEFAULT NULL COMMENT '渲æå®½åº¦ï¼åç´ ï¼', |
| | | `height` INT DEFAULT NULL COMMENT '渲æé«åº¦ï¼åç´ ï¼', |
| | | `sort` INT DEFAULT 0 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_pack_id` (`pack_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM 表æ
å
项表'; |
| | | |
| | | -- ======================================== |
| | | -- 6. im_face_user_item - IM ç¨æ·ç§æè¡¨æ
表 |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_face_user_item`; |
| | | CREATE TABLE `im_face_user_item` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `user_id` BIGINT NOT NULL COMMENT 'æå±ç¨æ·ç¼å·', |
| | | `url` VARCHAR(512) NOT NULL COMMENT '表æ
å¾ URL', |
| | | `name` VARCHAR(64) DEFAULT NULL COMMENT '表æ
å', |
| | | `width` INT DEFAULT NULL COMMENT '渲æå®½åº¦ï¼åç´ ï¼', |
| | | `height` INT DEFAULT NULL COMMENT '渲æé«åº¦ï¼åç´ ï¼', |
| | | `sort` INT 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`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM ç¨æ·ç§æè¡¨æ
表'; |
| | | |
| | | -- ======================================== |
| | | -- 7. im_friend - IM 好åå
³ç³»è¡¨ |
| | | -- ======================================== |
| | | 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 '好åç¨æ·ç¼å·', |
| | | `silent` BIT(1) DEFAULT b'0' COMMENT 'æ¯å¦å
ææ°', |
| | | `display_name` VARCHAR(128) DEFAULT NULL COMMENT '好åå±ç¤ºå¤æ³¨', |
| | | `add_source` TINYINT DEFAULT NULL COMMENT 'æ·»å æ¥æº', |
| | | `pinned` BIT(1) DEFAULT b'0' COMMENT 'æ¯å¦ç½®é¡¶è系人', |
| | | `blocked` BIT(1) DEFAULT b'0' COMMENT 'æ¯å¦æé»', |
| | | `status` TINYINT NOT NULL DEFAULT 0 COMMENT '好åç¶æï¼0æ£å¸¸ 1ç¦ç¨/å·²å é¤ï¼', |
| | | `add_time` DATETIME DEFAULT NULL COMMENT 'æ·»å 好忶é´', |
| | | `delete_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`), |
| | | UNIQUE KEY `uk_user_friend` (`user_id`, `friend_user_id`), |
| | | KEY `idx_friend_user_id` (`friend_user_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM 好åå
³ç³»è¡¨'; |
| | | |
| | | -- ======================================== |
| | | -- 8. im_friend_request - IM 好åç³è¯·è®°å½è¡¨ |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_friend_request`; |
| | | CREATE TABLE `im_friend_request` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `from_user_id` BIGINT NOT NULL COMMENT 'åèµ·æ¹ç¨æ·ç¼å·', |
| | | `to_user_id` BIGINT NOT NULL COMMENT 'æ¥æ¶æ¹ç¨æ·ç¼å·', |
| | | `apply_content` VARCHAR(256) DEFAULT NULL COMMENT 'ç³è¯·çç±', |
| | | `display_name` VARCHAR(128) DEFAULT NULL COMMENT 'åèµ·æ¹å¯¹æ¥æ¶æ¹ç夿³¨', |
| | | `add_source` TINYINT DEFAULT NULL COMMENT 'æ·»å æ¥æº', |
| | | `handle_result` TINYINT DEFAULT NULL COMMENT 'å¤çç»æ', |
| | | `handle_content` VARCHAR(256) 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_from_user_id` (`from_user_id`), |
| | | KEY `idx_to_user_id` (`to_user_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM 好åç³è¯·è®°å½è¡¨'; |
| | | |
| | | -- ======================================== |
| | | -- 9. im_group - IM 群信æ¯è¡¨ |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_group`; |
| | | CREATE TABLE `im_group` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `name` VARCHAR(128) NOT NULL COMMENT '群åç§°', |
| | | `owner_user_id` BIGINT NOT NULL COMMENT 'ç¾¤ä¸»ç¨æ·ç¼å·', |
| | | `avatar` VARCHAR(512) DEFAULT NULL COMMENT '群头å', |
| | | `notice` VARCHAR(1024) DEFAULT NULL COMMENT '群å
Œ', |
| | | `join_approval` BIT(1) DEFAULT b'0' COMMENT 'è¿ç¾¤æ¯å¦é审æ¹', |
| | | `banned` BIT(1) DEFAULT b'0' COMMENT 'æ¯å¦å°ç¦', |
| | | `banned_reason` VARCHAR(256) DEFAULT NULL COMMENT 'å°ç¦åå ', |
| | | `banned_time` DATETIME DEFAULT NULL COMMENT 'å°ç¦æ¶é´', |
| | | `status` TINYINT NOT NULL DEFAULT 0 COMMENT 'ç¾¤ç¶æï¼0æ£å¸¸ 1已解æ£ï¼', |
| | | `dissolved_time` DATETIME DEFAULT NULL COMMENT 'è§£æ£æ¶é´', |
| | | `muted_all` BIT(1) DEFAULT b'0' COMMENT 'æ¯å¦å
¨ç¾¤ç¦è¨', |
| | | `pinned_message_ids` VARCHAR(1024) 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_owner_user_id` (`owner_user_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM 群信æ¯è¡¨'; |
| | | |
| | | -- ======================================== |
| | | -- 10. im_group_member - IM 群æå表 |
| | | -- ======================================== |
| | | 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 'ç¨æ·ç¼å·', |
| | | `display_user_name` VARCHAR(128) DEFAULT NULL COMMENT 'ç»å
æ¾ç¤ºå', |
| | | `group_remark` VARCHAR(256) DEFAULT NULL COMMENT 'ç¾¤å¤æ³¨', |
| | | `silent` BIT(1) DEFAULT b'0' COMMENT 'æ¯å¦å
ææ°', |
| | | `status` TINYINT NOT NULL DEFAULT 0 COMMENT 'æåç¶æï¼0æ£å¸¸ 1ç¦ç¨ï¼', |
| | | `role` TINYINT NOT NULL DEFAULT 0 COMMENT 'æåè§è²ï¼0æ®éæå 1管çå 2群主ï¼', |
| | | `join_time` DATETIME DEFAULT NULL COMMENT 'å
¥ç¾¤æ¶é´', |
| | | `add_source` TINYINT DEFAULT NULL COMMENT 'å å
¥æ¥æº', |
| | | `inviter_user_id` BIGINT DEFAULT NULL COMMENT 'éè¯·äººç¨æ·ç¼å·', |
| | | `quit_time` DATETIME DEFAULT NULL COMMENT 'é群æ¶é´', |
| | | `mute_end_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`), |
| | | UNIQUE KEY `uk_group_user` (`group_id`, `user_id`), |
| | | KEY `idx_user_id` (`user_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM 群æå表'; |
| | | |
| | | -- ======================================== |
| | | -- 11. im_group_request - IM å 群ç³è¯·è®°å½è¡¨ |
| | | -- ======================================== |
| | | 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 'ç³è¯·äºº/被éè¯·äººç¨æ·ç¼å·', |
| | | `inviter_user_id` BIGINT DEFAULT NULL COMMENT 'éè¯·äººç¨æ·ç¼å·', |
| | | `apply_content` VARCHAR(256) DEFAULT NULL COMMENT 'ç³è¯·çç±', |
| | | `add_source` TINYINT DEFAULT NULL COMMENT 'å å
¥æ¥æº', |
| | | `handle_result` TINYINT DEFAULT NULL COMMENT 'å¤çç»æ', |
| | | `handle_user_id` BIGINT DEFAULT NULL COMMENT 'å¤çäººç¨æ·ç¼å·', |
| | | `handle_content` VARCHAR(256) 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 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM å 群ç³è¯·è®°å½è¡¨'; |
| | | |
| | | -- ======================================== |
| | | -- 12. im_channel_message - IM é¢éæ¶æ¯è¡¨ |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_channel_message`; |
| | | CREATE TABLE `im_channel_message` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `channel_id` BIGINT NOT NULL COMMENT 'é¢éç¼å·', |
| | | `material_id` BIGINT DEFAULT NULL COMMENT 'å
³èç´ æç¼å·', |
| | | `type` TINYINT NOT NULL COMMENT 'æ¶æ¯ç±»å', |
| | | `content` TEXT DEFAULT NULL COMMENT 'æ¶æ¯å
容 JSON', |
| | | `receiver_user_ids` VARCHAR(1024) DEFAULT NULL COMMENT 'æ¥æ¶äººç¼å·å表', |
| | | `send_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_channel_id` (`channel_id`), |
| | | KEY `idx_send_time` (`send_time`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM é¢éæ¶æ¯è¡¨'; |
| | | |
| | | -- ======================================== |
| | | -- 13. im_group_message - IM ç¾¤èæ¶æ¯è¡¨ |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_group_message`; |
| | | CREATE TABLE `im_group_message` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `client_message_id` VARCHAR(64) DEFAULT NULL COMMENT '客æ·ç«¯æ¶æ¯ç¼å·', |
| | | `sender_id` BIGINT NOT NULL COMMENT 'åé人ç¼å·', |
| | | `group_id` BIGINT NOT NULL COMMENT '群ç¼å·', |
| | | `type` TINYINT NOT NULL COMMENT 'æ¶æ¯ç±»å', |
| | | `content` TEXT DEFAULT NULL COMMENT 'æ¶æ¯å
容 JSON', |
| | | `status` TINYINT DEFAULT NULL COMMENT 'æ¶æ¯ç¶æ', |
| | | `send_time` DATETIME DEFAULT NULL COMMENT 'åéæ¶é´', |
| | | `receiver_user_ids` VARCHAR(1024) DEFAULT NULL COMMENT 'å®åæ¥æ¶ç¨æ·ç¼å·å表', |
| | | `at_user_ids` VARCHAR(1024) DEFAULT NULL COMMENT '@ç®æ ç¨æ·ç¼å·å表', |
| | | `receipt_status` TINYINT 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_client_message_id` (`client_message_id`), |
| | | KEY `idx_group_id` (`group_id`), |
| | | KEY `idx_sender_id` (`sender_id`), |
| | | KEY `idx_send_time` (`send_time`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM ç¾¤èæ¶æ¯è¡¨'; |
| | | |
| | | -- ======================================== |
| | | -- 14. im_private_message - IM ç§èæ¶æ¯è¡¨ |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_private_message`; |
| | | CREATE TABLE `im_private_message` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `client_message_id` VARCHAR(64) DEFAULT NULL COMMENT '客æ·ç«¯æ¶æ¯ç¼å·', |
| | | `sender_id` BIGINT NOT NULL COMMENT 'åé人ç¼å·', |
| | | `receiver_id` BIGINT NOT NULL COMMENT 'æ¥æ¶äººç¼å·', |
| | | `type` TINYINT NOT NULL COMMENT 'æ¶æ¯ç±»å', |
| | | `content` TEXT DEFAULT NULL COMMENT 'æ¶æ¯å
容 JSON', |
| | | `status` TINYINT DEFAULT NULL COMMENT 'æ¶æ¯ç¶æ', |
| | | `receipt_status` TINYINT DEFAULT NULL COMMENT 'åæ§ç¶æ', |
| | | `send_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`), |
| | | UNIQUE KEY `uk_client_message_id` (`client_message_id`), |
| | | KEY `idx_sender_id` (`sender_id`), |
| | | KEY `idx_receiver_id` (`receiver_id`), |
| | | KEY `idx_send_time` (`send_time`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM ç§èæ¶æ¯è¡¨'; |
| | | |
| | | -- ======================================== |
| | | -- 15. im_rtc_call - IM éè¯è®°å½è¡¨ |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_rtc_call`; |
| | | CREATE TABLE `im_rtc_call` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `room` VARCHAR(64) NOT NULL COMMENT 'ä¸å¡éè¯ç¼å·ï¼UUIDï¼', |
| | | `conversation_type` TINYINT NOT NULL COMMENT 'ä¼è¯ç±»å', |
| | | `media_type` TINYINT NOT NULL COMMENT 'åªä½ç±»å', |
| | | `inviter_user_id` BIGINT NOT NULL COMMENT 'åèµ·äººç¨æ·ç¼å·', |
| | | `group_id` BIGINT DEFAULT NULL COMMENT '群ç¼å·', |
| | | `status` TINYINT NOT NULL COMMENT 'éè¯ç¶æ', |
| | | `end_reason` TINYINT DEFAULT NULL COMMENT 'ç»æåå ', |
| | | `start_time` DATETIME DEFAULT NULL COMMENT 'åèµ·æ¶é´', |
| | | `accept_time` DATETIME DEFAULT NULL COMMENT 'æ¥éæ¶é´', |
| | | `end_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`), |
| | | UNIQUE KEY `uk_room` (`room`), |
| | | KEY `idx_inviter_user_id` (`inviter_user_id`), |
| | | KEY `idx_group_id` (`group_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM éè¯è®°å½è¡¨'; |
| | | |
| | | -- ======================================== |
| | | -- 16. im_rtc_participant - IM éè¯åä¸è
表 |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_rtc_participant`; |
| | | CREATE TABLE `im_rtc_participant` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `call_id` BIGINT NOT NULL COMMENT 'éè¯ç¼å·', |
| | | `room` VARCHAR(64) NOT NULL COMMENT 'ä¸å¡éè¯ç¼å·', |
| | | `user_id` BIGINT NOT NULL COMMENT 'åä¸è
ç¨æ·ç¼å·', |
| | | `role` TINYINT NOT NULL COMMENT 'åä¸è§è²', |
| | | `status` TINYINT NOT NULL COMMENT 'åä¸ç¶æ', |
| | | `invite_time` DATETIME DEFAULT NULL COMMENT '被é请æ¶é´', |
| | | `accept_time` DATETIME DEFAULT NULL COMMENT 'æ¥å¬æ¶é´', |
| | | `leave_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_call_id` (`call_id`), |
| | | KEY `idx_room` (`room`), |
| | | KEY `idx_user_id` (`user_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM éè¯åä¸è
表'; |
| | | |
| | | -- ======================================== |
| | | -- 17. im_sensitive_word - IM ææè¯è¡¨ |
| | | -- ======================================== |
| | | DROP TABLE IF EXISTS `im_sensitive_word`; |
| | | CREATE TABLE `im_sensitive_word` ( |
| | | `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `word` VARCHAR(128) NOT 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`), |
| | | UNIQUE KEY `uk_word` (`word`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IM ææè¯è¡¨'; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # CRM è¥éæ°æ®æ¥è¡¨ - åç«¯ææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬æ¬¡æ¹é å®ç°è¥éæ°æ®æ¥è¡¨åè½ï¼æä¾å®¢æ·åæãåæºåæãåååæãé宿¼æãéå®ä¸ç»©çå¤ç»´åº¦ç»è®¡åæã |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãæ¹é æ¸
å |
| | | |
| | | ### å端æ¹é ï¼å·²å®æï¼ |
| | | |
| | | | æä»¶ | æ¹å¨è¯´æ | |
| | | |------|----------| |
| | | | `CrmReportApi.java` | è¥éæ¥è¡¨ API æ¥å£ | |
| | | | `CrmCustomerAnalyzeRespDTO.java` | 客æ·åæç»è®¡ DTO | |
| | | | `CrmBusinessAnalyzeRespDTO.java` | åæºåæç»è®¡ DTO | |
| | | | `CrmContractAnalyzeRespDTO.java` | åååæç»è®¡ DTO | |
| | | | `CrmSalesFunnelRespDTO.java` | é宿¼æç»è®¡ DTO | |
| | | | `CrmSalesPerformanceRespDTO.java` | éå®ä¸ç»©ç»è®¡ DTO | |
| | | | `CrmReportApiImpl.java` | æ¥è¡¨ API å®ç°ç±» | |
| | | | `CrmCustomerMapper.java` | æ°å¢ç»è®¡æ¹æ³ | |
| | | | `CrmBusinessMapper.java` | æ°å¢ç»è®¡æ¹æ³ | |
| | | | `CrmContractMapper.java` | æ°å¢ç»è®¡æ¹æ³ | |
| | | | `CrmReceivableMapper.java` | æ°å¢ç»è®¡æ¹æ³ | |
| | | | `CrmReceivableService.java` | æ°å¢ç»è®¡æ¹æ³ | |
| | | |
| | | --- |
| | | |
| | | ## äºãæ¶åé¡µé¢ |
| | | |
| | | ### CRM æ¥è¡¨æ¨¡å |
| | | |
| | | | é¡µé¢ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | æ¥è¡¨æ¦è§ | `/crm/report/dashboard` | æ°æ®æ¦è§é¡µé¢ | |
| | | | 客æ·åæ | `/crm/report/customer` | 客æ·ç»è®¡åæ | |
| | | | åæºåæ | `/crm/report/business` | åæºç»è®¡åæ | |
| | | | åååæ | `/crm/report/contract` | ååç»è®¡åæ | |
| | | | é宿¼æ | `/crm/report/funnel` | é宿¼æå¾ | |
| | | | éå®ä¸ç»© | `/crm/report/performance` | éå®ä¸ç»©æè¡ | |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãAPI æ¥å£ |
| | | |
| | | ### CRM è¥éæ¥è¡¨ API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /rpc-api/crm/report/get-customer-analyze | è·å客æ·åæç»è®¡ | |
| | | | GET | /rpc-api/crm/report/get-business-analyze | è·ååæºåæç»è®¡ | |
| | | | GET | /rpc-api/crm/report/get-contract-analyze | è·ååååæç»è®¡ | |
| | | | GET | /rpc-api/crm/report/get-sales-funnel | è·åé宿¼æç»è®¡ | |
| | | | GET | /rpc-api/crm/report/get-sales-performance | è·åéå®ä¸ç»©ç»è®¡ | |
| | | |
| | | ### 请æ±åæ° |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | startTime | LocalDateTime | å¦ | å¼å§æ¶é´ | |
| | | | endTime | LocalDateTime | å¦ | ç»ææ¶é´ | |
| | | |
| | | ### ååºç¤ºä¾ |
| | | |
| | | **客æ·åæï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "totalCount": 1000, |
| | | "todayCount": 15, |
| | | "dealCount": 300, |
| | | "dealRate": 30.00, |
| | | "lockCount": 50, |
| | | "poolCount": 200 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | **åæºåæï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "totalCount": 500, |
| | | "todayCount": 8, |
| | | "totalPrice": 5000000.00, |
| | | "successCount": 150, |
| | | "successPrice": 2000000.00, |
| | | "successRate": 30.00, |
| | | "processingCount": 250, |
| | | "failCount": 100 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | **åååæï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "totalCount": 400, |
| | | "todayCount": 5, |
| | | "totalPrice": 3000000.00, |
| | | "approveCount": 300, |
| | | "approvePrice": 2500000.00, |
| | | "processCount": 20, |
| | | "receivablePrice": 1500000.00, |
| | | "receivableRate": 60.00 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | **é宿¼æï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "stages": [ |
| | | { "name": "客æ·", "count": 1000, "price": 0, "conversionRate": 100.00 }, |
| | | { "name": "åæº", "count": 500, "price": 5000000.00, "conversionRate": 50.00 }, |
| | | { "name": "åå", "count": 300, "price": 2500000.00, "conversionRate": 30.00 }, |
| | | { "name": "忬¾", "count": null, "price": 1500000.00, "conversionRate": 15.00 } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | **éå®ä¸ç»©ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "items": [ |
| | | { |
| | | "userId": 1, |
| | | "userName": "å¼ ä¸", |
| | | "deptName": "éå®ä¸é¨", |
| | | "contractCount": 50, |
| | | "contractPrice": 500000.00, |
| | | "receivablePrice": 300000.00, |
| | | "businessCount": 80, |
| | | "businessPrice": 800000.00 |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## åãå端修æ¹ç¹ |
| | | |
| | | ### 4.1 æ¥è¡¨æ¦è§é¡µé¢ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `/src/views/crm/report/dashboard.vue` |
| | | |
| | | ```html |
| | | <template> |
| | | <div class="report-dashboard"> |
| | | <!-- ç»è®¡å¡ç --> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6"> |
| | | <el-card class="stat-card"> |
| | | <div class="stat-title">å®¢æ·æ»æ°</div> |
| | | <div class="stat-value">{{ customerAnalyze.totalCount }}</div> |
| | | <div class="stat-footer">仿¥æ°å¢ï¼{{ customerAnalyze.todayCount }}</div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card class="stat-card"> |
| | | <div class="stat-title">åæºæ»æ°</div> |
| | | <div class="stat-value">{{ businessAnalyze.totalCount }}</div> |
| | | <div class="stat-footer">转åçï¼{{ businessAnalyze.successRate }}%</div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card class="stat-card"> |
| | | <div class="stat-title">ååéé¢</div> |
| | | <div class="stat-value">Â¥{{ contractAnalyze.totalPrice }}</div> |
| | | <div class="stat-footer">已忬¾ï¼Â¥{{ contractAnalyze.receivablePrice }}</div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card class="stat-card"> |
| | | <div class="stat-title">忬¾ç</div> |
| | | <div class="stat-value">{{ contractAnalyze.receivableRate }}%</div> |
| | | <div class="stat-footer">审æ¹éè¿ï¼{{ contractAnalyze.approveCount }}份</div> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- é宿¼æ --> |
| | | <el-card header="é宿¼æ"> |
| | | <FunnelChart :data="funnelData" /> |
| | | </el-card> |
| | | |
| | | <!-- éå®ä¸ç»©æè¡ --> |
| | | <el-card header="éå®ä¸ç»©æè¡"> |
| | | <el-table :data="performanceData" stripe> |
| | | <el-table-column prop="userName" label="éå®äººå" /> |
| | | <el-table-column prop="deptName" label="é¨é¨" /> |
| | | <el-table-column prop="contractCount" label="ååæ°é" width="100" /> |
| | | <el-table-column prop="contractPrice" label="ååéé¢" width="150" /> |
| | | <el-table-column prop="receivablePrice" label="忬¾éé¢" width="150" /> |
| | | <el-table-column prop="businessCount" label="åæºæ°é" width="100" /> |
| | | <el-table-column prop="businessPrice" label="åæºéé¢" width="150" /> |
| | | </el-table> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | | ``` |
| | | |
| | | ### 4.2 é宿¼æç»ä»¶ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `/src/components/FunnelChart.vue` |
| | | |
| | | ```html |
| | | <template> |
| | | <div class="funnel-chart"> |
| | | <div v-for="(stage, index) in data" :key="index" class="funnel-stage"> |
| | | <div class="funnel-bar" :style="getBarStyle(stage, index)"> |
| | | <span class="stage-name">{{ stage.name }}</span> |
| | | <span class="stage-value">{{ stage.price > 0 ? 'Â¥' + stage.price : stage.count }}</span> |
| | | </div> |
| | | <div class="conversion-rate">转åçï¼{{ stage.conversionRate }}%</div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | props: { |
| | | data: Array |
| | | }, |
| | | methods: { |
| | | getBarStyle(stage, index) { |
| | | const maxWidth = 100 |
| | | const width = maxWidth - (index * 15) |
| | | return { |
| | | width: `${width}%`, |
| | | backgroundColor: this.getColor(index) |
| | | } |
| | | }, |
| | | getColor(index) { |
| | | const colors = ['#409EFF', '#67C23A', '#E6A23C', '#F56C6C'] |
| | | return colors[index] || '#909399' |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | ``` |
| | | |
| | | ### 4.3 API å®ä¹ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `/src/api/crm/report.js` |
| | | |
| | | ```js |
| | | import request from '@/utils/request' |
| | | |
| | | // è·å客æ·åæç»è®¡ |
| | | export function getCustomerAnalyze(startTime, endTime) { |
| | | return request({ |
| | | url: '/crm/report/get-customer-analyze', |
| | | method: 'get', |
| | | params: { startTime, endTime } |
| | | }) |
| | | } |
| | | |
| | | // è·ååæºåæç»è®¡ |
| | | export function getBusinessAnalyze(startTime, endTime) { |
| | | return request({ |
| | | url: '/crm/report/get-business-analyze', |
| | | method: 'get', |
| | | params: { startTime, endTime } |
| | | }) |
| | | } |
| | | |
| | | // è·ååååæç»è®¡ |
| | | export function getContractAnalyze(startTime, endTime) { |
| | | return request({ |
| | | url: '/crm/report/get-contract-analyze', |
| | | method: 'get', |
| | | params: { startTime, endTime } |
| | | }) |
| | | } |
| | | |
| | | // è·åé宿¼æç»è®¡ |
| | | export function getSalesFunnel() { |
| | | return request({ |
| | | url: '/crm/report/get-sales-funnel', |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // è·åéå®ä¸ç»©ç»è®¡ |
| | | export function getSalesPerformance(startTime, endTime) { |
| | | return request({ |
| | | url: '/crm/report/get-sales-performance', |
| | | method: 'get', |
| | | params: { startTime, endTime } |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãå¾è¡¨å±ç¤ºå»ºè®® |
| | | |
| | | ### 5.1 客æ·åæå¾è¡¨ |
| | | |
| | | - **客æ·å¢é¿è¶å¿å¾**ï¼æçº¿å¾å±ç¤ºæ¯æ¥/æ¯å¨/æ¯ææ°å¢å®¢æ· |
| | | - **å®¢æ·æäº¤ç饼å¾**ï¼å·²æäº¤ vs æªæäº¤å®¢æ·æ¯ä¾ |
| | | - **å®¢æ·æ¥æºåå¸**ï¼é¥¼å¾å±ç¤ºä¸åæ¥æºç客æ·å æ¯ |
| | | |
| | | ### 5.2 åæºåæå¾è¡¨ |
| | | |
| | | - **åæºé¶æ®µåå¸**ï¼é¥¼å¾å±ç¤ºä¸åç¶æçåæºæ°é |
| | | - **åæºéé¢åå¸**ï¼æ±ç¶å¾å±ç¤ºä¸åéé¢åºé´çåæºæ°é |
| | | - **åæºè½¬åè¶å¿**ï¼æçº¿å¾å±ç¤ºè½¬åçåå |
| | | |
| | | ### 5.3 åååæå¾è¡¨ |
| | | |
| | | - **ååéé¢è¶å¿**ï¼æçº¿å¾å±ç¤ºååéé¢åå |
| | | - **ååç¶æåå¸**ï¼é¥¼å¾å±ç¤ºä¸å审æ¹ç¶æçåå |
| | | - **忬¾è¿åº¦å¾**ï¼è¿åº¦æ¡å±ç¤ºåæ¬¾å®æåº¦ |
| | | |
| | | ### 5.4 é宿¼æå¾ |
| | | |
| | | - ä½¿ç¨æ¨ªåæ¼æå¾å±ç¤ºåé¶æ®µè½¬åæ
åµ |
| | | - æ¯ä¸ªé¶æ®µæ¾ç¤ºæ°éåéé¢ |
| | | - èªå¨è®¡ç®è½¬åç |
| | | |
| | | --- |
| | | |
| | | ## å
ãæ³¨æäºé¡¹ |
| | | |
| | | 1. **æ°æ®æé**ï¼æ¥è¡¨æ°æ®éè¦æ ¹æ®ç¨æ·æéè¿æ»¤ |
| | | 2. **ç»è®¡å£å¾**ï¼æç¡®åç±»ç»è®¡æ°æ®ç计ç®é»è¾ |
| | | 3. **æ¶é´èå´**ï¼æ¯æèªå®ä¹æ¶é´èå´æ¥è¯¢ |
| | | 4. **æ°æ®å·æ°**ï¼èèæ°æ®ç¼ååå·æ°çç¥ |
| | | 5. **导åºåè½**ï¼æ¯ææ¥è¡¨æ°æ®å¯¼åºä¸º Excel |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãåç»è®¡å |
| | | |
| | | | Phase | å
容 | ç¶æ | |
| | | |-------|------|------| |
| | | | Phase 1 | å®¢æ·æ°æ®ç»ä¸ - ERP ä½¿ç¨ CRM å®¢æ· | **已宿** | |
| | | | Phase 2 | äº§åæ°æ®ç»ä¸ - CRM/ERP ä½¿ç¨ MDM ç©æ | **已宿** | |
| | | | Phase 3 | ååçæéå®è®¢å | **已宿** | |
| | | | Phase 4 | éå®å
¨æµç¨è¿½æº¯ | **已宿** | |
| | | | Phase 5 | è¥éæ°æ®æ¥è¡¨ | **已宿** | |
| | | | Phase 6 | æ°æ®è¿ç§»ä¸æ¸
ç | å¾
å¼å§ | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # 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 | æ¹æ¬¡å±æ§é
置表 | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # MDM ä¸»æ°æ®æ¨¡åæ¹é - åç«¯åæ´ææ¡£ï¼ç¬¬ä¸é¶æ®µï¼ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬æ¬¡æ¹é å° ERPãMESãWMS ä¸ä¸ªæ¨¡åçç©æ/äº§åæ°æ®ç»ä¸å° MDMï¼ä¸»æ°æ®ç®¡çï¼æ¨¡åã |
| | | |
| | | **æ¹é èå´**ï¼åºç¡æ°æ®ï¼åä½ï¼ |
| | | |
| | | **注æ**ï¼ |
| | | - ç©æç±»åï¼itemTypeï¼ä¸ºæä¸¾å段ï¼1:ç©æ, 2:产å, 3:åæåï¼ï¼ä¸éè¦åç¬ç»´æ¤é¡µé¢ |
| | | - åçæ°æ®ç± WMS ç»´æ¤ï¼ä¸éè¦åç¬ç MDM åçé¡µé¢ |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãMDM 计éåä½é¡µé¢ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - æ°å¢é¡µé¢ï¼`/mdm/unit` - 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 | è·ååä½å表 | |
| | | |
| | | **请æ±åæ°ï¼å建/æ´æ°ï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | å¦ | åä½ç¼å·ï¼æ´æ°æ¶å¿
å¡«ï¼ | |
| | | | code | String | æ¯ | åä½ç¼ç | |
| | | | name | String | æ¯ | åä½åç§° | |
| | | | primaryFlag | Boolean | å¦ | æ¯å¦ä¸»åä½ | |
| | | | primaryId | Long | å¦ | 主åä½ç¼å· | |
| | | | changeRate | BigDecimal | å¦ | ä¸ä¸»å使¢ç®æ¯ä¾ | |
| | | | status | Integer | æ¯ | ç¶æï¼0:å¯ç¨, 1:ç¦ç¨ï¼ | |
| | | | remark | String | å¦ | 夿³¨ | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "id": 1, |
| | | "code": "PCS", |
| | | "name": "个", |
| | | "primaryFlag": true, |
| | | "primaryId": null, |
| | | "changeRate": 1, |
| | | "status": 0, |
| | | "remark": "", |
| | | "createTime": "2024-01-01 12:00:00" |
| | | }, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãERP 产å管ç页é¢ä¿®æ¹ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - `/erp/product` - ERP 产å管çï¼ä¿çï¼æ°æ®æºåæ´ï¼ |
| | | |
| | | ### å端修æ¹ç¹ |
| | | |
| | | ç©æç±»ååºå®ä¸º `itemType = 2`ï¼äº§åï¼ï¼å端æ éç»´æ¤è¯¥å段ã |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãMES ç©æç®¡ç页é¢ä¿®æ¹ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - `/mes/md/item` - MES ç©æç®¡çï¼ä¿çï¼æ°æ®æºåæ´ï¼ |
| | | |
| | | ### å端修æ¹ç¹ |
| | | |
| | | ç©æç±»ååºå®ä¸º `itemType = 1`ï¼ç©æï¼ï¼å端æ éç»´æ¤è¯¥å段ã |
| | | |
| | | --- |
| | | |
| | | ## åãWMS åå管ç页é¢ä¿®æ¹ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - `/wms/item` - WMS åå管çï¼ä¿çï¼æ°æ®æºåæ´ï¼ |
| | | |
| | | ### å端修æ¹ç¹ |
| | | |
| | | ç©æç±»ååºå®ä¸º `itemType = 1`ï¼ç©æï¼ï¼å端æ éç»´æ¤è¯¥å段ã |
| | | |
| | | --- |
| | | |
| | | ## äºãæ°å¢å端 API æä»¶ |
| | | |
| | | ### æä»¶è·¯å¾ï¼`src/api/mdm/unit.js` |
| | | |
| | | ```js |
| | | import request from '@/utils/request' |
| | | |
| | | // å建计éåä½ |
| | | export function createUnit(data) { |
| | | return request({ |
| | | url: '/mdm/unit/create', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // æ´æ°è®¡éåä½ |
| | | export function updateUnit(data) { |
| | | return request({ |
| | | url: '/mdm/unit/update', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // å é¤è®¡éåä½ |
| | | export function deleteUnit(id) { |
| | | return request({ |
| | | url: '/mdm/unit/delete?id=' + id, |
| | | method: 'delete' |
| | | }) |
| | | } |
| | | |
| | | // è·å计éåä½ |
| | | export function getUnit(id) { |
| | | return request({ |
| | | url: '/mdm/unit/get?id=' + id, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // è·å计éåä½å页 |
| | | export function getUnitPage(params) { |
| | | return request({ |
| | | url: '/mdm/unit/page', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | // è·å计éåä½å表 |
| | | export function getUnitListByIds(ids) { |
| | | return request({ |
| | | url: '/mdm/unit/list-by-ids?ids=' + ids, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
ãæ³¨æäºé¡¹ |
| | | |
| | | 1. **æ°æ®å
¼å®¹**ï¼è¿ç§»æé´ï¼å模å页é¢ä¿çï¼ä½æ°æ®æºåæ´ä¸º MDM |
| | | 2. **ç©æç±»ååæ®µ**ï¼`itemType` 为æä¸¾å段ï¼ä¸éè¦åç¬ç»´æ¤é¡µé¢ |
| | | - ERP 产åï¼`itemType = 2`ï¼äº§åï¼ |
| | | - MES ç©æï¼`itemType = 1`ï¼ç©æï¼ |
| | | - WMS ååï¼`itemType = 1`ï¼ç©æï¼ |
| | | 3. **åçæ°æ®**ï¼ç± WMS 模åç»´æ¤ï¼ä¸éè¦åç¬ç MDM åçé¡µé¢ |
| | | 4. **ID æ å°**ï¼é¨åæ°æ® ID æåç§»ï¼æ³¨ææ¥è¯¢å
³èæ°æ® |
| | | 5. **æéé
ç½®**ï¼éè¦ä¸ºæ°é¡µé¢é
ç½®èååæé |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # MDM ä¸»æ°æ®æ¨¡åæ¹é - åç«¯åæ´ææ¡£ï¼ç¬¬äºé¶æ®µï¼ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬æ¬¡æ¹é å° ERPãMESãWMS ä¸ä¸ªæ¨¡åçç©æ/äº§åæ°æ®ç»ä¸å° MDMï¼ä¸»æ°æ®ç®¡çï¼æ¨¡åã |
| | | |
| | | **æ¹é èå´**ï¼ç©æ/äº§åæ°æ®è¿ç§»å SKU 管ç |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãMDM ç©æé¡µé¢ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - æ°å¢é¡µé¢ï¼`/mdm/item` - 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 | å¦ | å®å
¨åºå | |
| | | | minStock | BigDecimal | å¦ | æä½åºå | |
| | | | maxStock | BigDecimal | å¦ | æé«åºå | |
| | | | expiryDay | Integer | å¦ | ä¿è´¨æå¤©æ° | |
| | | | isBatchManaged | Boolean | å¦ | æ¯å¦æ¹æ¬¡ç®¡ç | |
| | | | weight | BigDecimal | å¦ | ééï¼kgï¼ | |
| | | | remark | String | å¦ | 夿³¨ | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "id": 1, |
| | | "code": "ITEM001", |
| | | "name": "èºä¸", |
| | | "barCode": "12345678", |
| | | "specification": "M8*20", |
| | | "categoryId": 1, |
| | | "categoryName": "äºéé
ä»¶", |
| | | "unitMeasureId": 1, |
| | | "unitMeasureName": "个", |
| | | "brandId": null, |
| | | "brandName": null, |
| | | "itemType": 1, |
| | | "status": 0, |
| | | "purchasePrice": 10.00, |
| | | "salesPrice": 15.00, |
| | | "costPrice": 8.00, |
| | | "safetyStock": 100, |
| | | "expiryDay": null, |
| | | "isBatchManaged": false, |
| | | "weight": 0.01, |
| | | "remark": "", |
| | | "createTime": "2024-01-01 12:00:00" |
| | | }, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãERP 产å页é¢ä¿®æ¹ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - `/erp/product` - ERP 产å管çï¼ä¿çï¼æ°æ®æºåæ´ï¼ |
| | | |
| | | ### å端修æ¹ç¹ |
| | | |
| | | #### 1. API è°ç¨åæ´ |
| | | |
| | | ```js |
| | | // åè°ç¨ ERP 产å API |
| | | import { getProductPage, getProduct, createProduct, updateProduct } from '@/api/erp/product' |
| | | |
| | | // æ¹ä¸ºè°ç¨ MDM ç©æ APIï¼itemType=2 产åï¼ |
| | | import { getItemPage, getItem, createItem, updateItem } from '@/api/mdm/item' |
| | | ``` |
| | | |
| | | #### 2. åæ®µæ å° |
| | | |
| | | | ERP åæ®µ | MDM åæ®µ | 说æ | |
| | | |----------|----------|------| |
| | | | id | id | ç¼å· | |
| | | | barCode | barCode | æ¡ç ï¼å ERP ç¨ barCodeï¼ç°ç»ä¸ï¼ | |
| | | | barCode | code | ç¼ç ï¼åæ¡ç æ¹ä¸ºç¼ç ï¼ | |
| | | | name | name | åç§° | |
| | | | standard | specification | è§æ ¼åå· | |
| | | | categoryId | categoryId | åç±»ç¼å· | |
| | | | unitId | unitMeasureId | åä½ç¼å· | |
| | | | status | status | ç¶æ | |
| | | | purchasePrice | purchasePrice | éè´ä»·æ ¼ | |
| | | | salePrice | salesPrice | éå®ä»·æ ¼ | |
| | | | minPrice | minPrice | æä½ä»·æ ¼ | |
| | | | expiryDay | expiryDay | ä¿è´¨æå¤©æ° | |
| | | | weight | weight | éé | |
| | | | remark | remark | 夿³¨ | |
| | | | - | itemType = 2 | 产åç±»å | |
| | | |
| | | #### 3. data æ°æ®ä¿®æ¹ |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | // æ¥è¯¢åæ° |
| | | queryParams: { |
| | | pageNo: 1, |
| | | pageSize: 10, |
| | | code: '', |
| | | name: '', |
| | | categoryId: null, |
| | | itemType: 2, // åºå®ä¸ºäº§åç±»å |
| | | status: null |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### 4. æ¥è¯¢æ¹æ³ä¿®æ¹ |
| | | |
| | | ```js |
| | | getList() { |
| | | this.loading = true |
| | | getItemPage({ |
| | | ...this.queryParams, |
| | | itemType: 2 // 产åç±»å |
| | | }).then(response => { |
| | | this.list = response.data.list |
| | | this.total = response.data.total |
| | | this.loading = false |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | #### 5. 表ååæ®µæ å°ä¿®æ¹ |
| | | |
| | | ```html |
| | | <!-- ååæ®µå --> |
| | | <el-input v-model="form.barCode" placeholder="äº§åæ¡ç " /> |
| | | |
| | | <!-- æ¹ä¸º --> |
| | | <el-input v-model="form.barCode" placeholder="äº§åæ¡ç " /> |
| | | <el-input v-model="form.code" placeholder="产åç¼ç " /> |
| | | ``` |
| | | |
| | | #### 6. è¡¨æ ¼åä¿®æ¹ |
| | | |
| | | ```html |
| | | <!-- åè¡¨æ ¼å --> |
| | | <el-table-column prop="barCode" label="äº§åæ¡ç " /> |
| | | <el-table-column prop="standard" label="è§æ ¼" /> |
| | | |
| | | <!-- æ¹ä¸º --> |
| | | <el-table-column prop="code" label="产åç¼ç " /> |
| | | <el-table-column prop="barCode" label="äº§åæ¡ç " /> |
| | | <el-table-column prop="specification" label="è§æ ¼åå·" /> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãMES ç©æé¡µé¢ä¿®æ¹ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - `/mes/md/item` - MES ç©æç®¡çï¼ä¿çï¼æ°æ®æºåæ´ï¼ |
| | | |
| | | ### å端修æ¹ç¹ |
| | | |
| | | #### 1. API è°ç¨åæ´ |
| | | |
| | | ```js |
| | | // åè°ç¨ MES ç©æ API |
| | | import { getItemPage, getItem, createItem, updateItem } from '@/api/mes/md/item' |
| | | |
| | | // æ¹ä¸ºè°ç¨ MDM ç©æ APIï¼itemType=1 ç©æï¼ |
| | | import { getItemPage, getItem, createItem, updateItem } from '@/api/mdm/item' |
| | | ``` |
| | | |
| | | #### 2. åæ®µæ å° |
| | | |
| | | | MES åæ®µ | MDM åæ®µ | 说æ | |
| | | |----------|----------|------| |
| | | | id | id | ç©æç¼å· | |
| | | | code | code | ç©æç¼ç | |
| | | | name | name | ç©æåç§° | |
| | | | specification | specification | è§æ ¼åå· | |
| | | | itemTypeId | categoryId | åç±»ç¼å· | |
| | | | unitMeasureId | unitMeasureId | åä½ç¼å· | |
| | | | status | status | ç¶æ | |
| | | | minStock | minStock | æä½åºå | |
| | | | maxStock | maxStock | æé«åºå | |
| | | | batchFlag | isBatchManaged | æ¯å¦æ¹æ¬¡ç®¡ç | |
| | | | highValue | highValue | æ¯å¦é«å¼ç©æ | |
| | | | safeStockFlag | - | æ¯å¦å¯ç¨å®å
¨åºåï¼è®¡ç® safetyStockï¼ | |
| | | | remark | remark | 夿³¨ | |
| | | | - | itemType = 1 | ç©æç±»å | |
| | | |
| | | #### 3. MES ç¹æåè½ä¿ç |
| | | |
| | | 以ä¸åè½ä»ç± MES 模å管çï¼ä¸å¨ MDM ä¸ï¼ |
| | | |
| | | - **æ¹æ¬¡å±æ§é
ç½®**ï¼`/mes/md/item/batch-config` - ç©ææ¹æ¬¡å±æ§é
ç½® |
| | | - **BOM é
ç½®**ï¼`/mes/md/product-bom` - 产å BOM é
ç½® |
| | | - **SOP é
ç½®**ï¼`/mes/md/product-sop` - 产å SOP é
ç½® |
| | | - **SIP é
ç½®**ï¼`/mes/md/product-sip` - 产å SIP é
ç½® |
| | | |
| | | è¿äºé¡µé¢éè¦éè¿ç©æ ID å
³è MDM ç©ææ°æ®ï¼æ¥è¯¢æ¶ä½¿ç¨ `list-by-ids` æ¥å£è·åç©æåºç¡ä¿¡æ¯ã |
| | | |
| | | #### 4. æ¹æ¬¡é
置页é¢ä¿®æ¹ |
| | | |
| | | ```js |
| | | // è·åç©æä¿¡æ¯æ¶ä½¿ç¨ MDM API |
| | | import { getItemListByIds } from '@/api/mdm/item' |
| | | |
| | | // æ¹æ¬¡é
ç½®åè¡¨é¡µé¢ |
| | | methods: { |
| | | // è·åç©æåç§° |
| | | getItemNames(itemIds) { |
| | | getItemListByIds(itemIds).then(response => { |
| | | const itemMap = {} |
| | | response.data.forEach(item => { |
| | | itemMap[item.id] = item.name |
| | | }) |
| | | this.itemMap = itemMap |
| | | }) |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## åãWMS åå/SKU 页é¢ä¿®æ¹ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - `/wms/item` - WMS åå管çï¼ä¿çï¼æ°æ®æºåæ´ï¼ |
| | | - `/wms/item-sku` - WMS SKU 管çï¼ä¿çï¼æ°æ®æºåæ´ï¼ |
| | | |
| | | ### å端修æ¹ç¹ |
| | | |
| | | #### 1. API è°ç¨åæ´ |
| | | |
| | | ```js |
| | | // åè°ç¨ WMS åå API |
| | | import { getItemPage, getItem } from '@/api/wms/item' |
| | | |
| | | // æ¹ä¸ºè°ç¨ MDM ç©æ API |
| | | import { getItemPage, getItem } from '@/api/mdm/item' |
| | | |
| | | // SKU æ°æ® |
| | | import { getSkuPage, getSku } from '@/api/mdm/item-sku' |
| | | ``` |
| | | |
| | | #### 2. åæ®µæ å° |
| | | |
| | | | WMS åååæ®µ | MDM ç©æåæ®µ | 说æ | |
| | | |--------------|--------------|------| |
| | | | id | id | ååç¼å· | |
| | | | code | code | ååç¼ç | |
| | | | name | name | åååç§° | |
| | | | unit | - | åä½ï¼éä» MDM åä½è¡¨è·ååç§°ï¼ | |
| | | | categoryId | categoryId | åç±»ç¼å· | |
| | | | brandId | brandId | åçç¼å· | |
| | | | remark | remark | 夿³¨ | |
| | | |
| | | | WMS SKU åæ®µ | MDM SKU åæ®µ | 说æ | |
| | | |--------------|--------------|------| |
| | | | id | id | SKU ç¼å· | |
| | | | itemId | itemId | ååç¼å· | |
| | | | code | code | SKU ç¼ç | |
| | | | name | name | SKU åç§° | |
| | | | barCode | barCode | SKU æ¡ç | |
| | | | length | length | é¿åº¦ï¼cmï¼ | |
| | | | width | width | 宽度ï¼cmï¼ | |
| | | | height | height | é«åº¦ï¼cmï¼ | |
| | | | grossWeight | grossWeight | æ¯éï¼kgï¼ | |
| | | | netWeight | netWeight | åéï¼kgï¼ | |
| | | | costPrice | costPrice | ææ¬ä»· | |
| | | | sellingPrice | salePrice | éå®ä»· | |
| | | |
| | | #### 3. åä½åç§°è·å |
| | | |
| | | ```js |
| | | // WMS åå忥 unit æ¯å符串ï¼ç°å¨éè¦ä» MDM åä½è·å |
| | | import { getUnitListByIds } from '@/api/mdm/unit' |
| | | |
| | | methods: { |
| | | // è·ååä½åç§° |
| | | loadUnitNames() { |
| | | const unitIds = this.list.map(item => item.unitMeasureId).filter(id => id) |
| | | if (unitIds.length > 0) { |
| | | getUnitListByIds(unitIds.join(',')).then(response => { |
| | | const unitMap = {} |
| | | response.data.forEach(unit => { |
| | | unitMap[unit.id] = unit.name |
| | | }) |
| | | this.unitMap = unitMap |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãæ°å¢å端 API æä»¶ |
| | | |
| | | ### æä»¶è·¯å¾ï¼`src/api/mdm/item.js` |
| | | |
| | | ```js |
| | | import request from '@/utils/request' |
| | | |
| | | // åå»ºç©æ |
| | | export function createItem(data) { |
| | | return request({ |
| | | url: '/mdm/item/create', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // æ´æ°ç©æ |
| | | export function updateItem(data) { |
| | | return request({ |
| | | url: '/mdm/item/update', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // æ´æ°ç©æç¶æ |
| | | export function updateItemStatus(id, status) { |
| | | return request({ |
| | | url: '/mdm/item/update-status?id=' + id + '&status=' + status, |
| | | method: 'put' |
| | | }) |
| | | } |
| | | |
| | | // å é¤ç©æ |
| | | export function deleteItem(id) { |
| | | return request({ |
| | | url: '/mdm/item/delete?id=' + id, |
| | | method: 'delete' |
| | | }) |
| | | } |
| | | |
| | | // è·åç©æ |
| | | export function getItem(id) { |
| | | return request({ |
| | | url: '/mdm/item/get?id=' + id, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // è·åç©æå页 |
| | | export function getItemPage(params) { |
| | | return request({ |
| | | url: '/mdm/item/page', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | // è·åç©æå表 |
| | | export function getItemListByIds(ids) { |
| | | return request({ |
| | | url: '/mdm/item/list-by-ids?ids=' + ids, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | ### æä»¶è·¯å¾ï¼`src/api/mdm/item-sku.js` |
| | | |
| | | ```js |
| | | import request from '@/utils/request' |
| | | |
| | | // å建 SKU |
| | | export function createSku(data) { |
| | | return request({ |
| | | url: '/mdm/item-sku/create', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // æ´æ° SKU |
| | | export function updateSku(data) { |
| | | return request({ |
| | | url: '/mdm/item-sku/update', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // å é¤ SKU |
| | | export function deleteSku(id) { |
| | | return request({ |
| | | url: '/mdm/item-sku/delete?id=' + id, |
| | | method: 'delete' |
| | | }) |
| | | } |
| | | |
| | | // è·å SKU |
| | | export function getSku(id) { |
| | | return request({ |
| | | url: '/mdm/item-sku/get?id=' + id, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // è·å SKU å页 |
| | | export function getSkuPage(params) { |
| | | return request({ |
| | | url: '/mdm/item-sku/page', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | // è·åç©æç SKU å表 |
| | | export function getSkuListByItemId(itemId) { |
| | | return request({ |
| | | url: '/mdm/item-sku/list-by-item-id?itemId=' + itemId, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
ãéæ©å¨ç»ä»¶ä¿®æ¹ |
| | | |
| | | ### ç©æéæ©å¨ç»ä»¶ |
| | | |
| | | 忍¡å使ç¨ç©æéæ©å¨æ¶ï¼éè¦ä¼ å
¥ `itemType` åæ°ï¼ |
| | | |
| | | ```vue |
| | | <!-- ERP 产åéæ©å¨ --> |
| | | <mdm-item-selector :item-type="2" @select="handleProductSelect" /> |
| | | |
| | | <!-- MES ç©æéæ©å¨ --> |
| | | <mdm-item-selector :item-type="1" @select="handleItemSelect" /> |
| | | |
| | | <!-- WMS ååéæ©å¨ --> |
| | | <mdm-item-selector :item-type="1" @select="handleItemSelect" /> |
| | | ``` |
| | | |
| | | ### ç»ä»¶å®ç°ç¤ºä¾ |
| | | |
| | | ```vue |
| | | <template> |
| | | <el-dialog title="éæ©ç©æ" :visible.sync="visible" width="800px"> |
| | | <el-table :data="list" @row-click="handleRowClick"> |
| | | <el-table-column prop="code" label="ç¼ç " width="120" /> |
| | | <el-table-column prop="name" label="åç§°" width="180" /> |
| | | <el-table-column prop="specification" label="è§æ ¼åå·" width="120" /> |
| | | <el-table-column prop="categoryName" label="åç±»" width="120" /> |
| | | <el-table-column prop="unitMeasureName" label="åä½" width="80" /> |
| | | </el-table> |
| | | <pagination :total="total" :page.sync="queryParams.pageNo" @pagination="getList" /> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getItemPage } from '@/api/mdm/item' |
| | | |
| | | export default { |
| | | name: 'MdmItemSelector', |
| | | props: { |
| | | itemType: { |
| | | type: Number, |
| | | default: null |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | visible: false, |
| | | list: [], |
| | | total: 0, |
| | | queryParams: { |
| | | pageNo: 1, |
| | | pageSize: 10 |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | show() { |
| | | this.visible = true |
| | | this.getList() |
| | | }, |
| | | getList() { |
| | | getItemPage({ |
| | | ...this.queryParams, |
| | | itemType: this.itemType, |
| | | status: 0 // åªéæ©å¯ç¨ç |
| | | }).then(response => { |
| | | this.list = response.data.list |
| | | this.total = response.data.total |
| | | }) |
| | | }, |
| | | handleRowClick(row) { |
| | | this.$emit('select', row) |
| | | this.visible = false |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ã注æäºé¡¹ |
| | | |
| | | 1. **ç©æç±»ååºå**ï¼ |
| | | - `itemType=1`ï¼ç©æï¼MES 使ç¨ï¼ |
| | | - `itemType=2`ï¼äº§åï¼ERP 使ç¨ï¼ |
| | | - `itemType=3`ï¼åæå |
| | | |
| | | 2. **å 餿ä½**ï¼MDM ç©æå é¤å®é
为ç¦ç¨æä½ï¼ä¸åç©çå é¤ |
| | | |
| | | 3. **SKU 模å¼**ï¼ææç©æå¿
é¡»é
ç½® SKUï¼ERP/MES æ°æ®è¿ç§»æ¶èªå¨å建é»è®¤ SKU |
| | | |
| | | 4. **ååå
¼å®¹**ï¼å模åç API æ¥å£ä¿çï¼å
é¨è°ç¨ MDM API |
| | | |
| | | 5. **æ°æ®å
³è**ï¼ |
| | | - MES æ¹æ¬¡é
ç½®ãBOM çéè¿ç©æ ID å
³è |
| | | - WMS åºåãåºå
¥åºçéè¿ SKU ID å
³è |
| | | |
| | | 6. **æéé
ç½®**ï¼éè¦ä¸ºæ°é¡µé¢é
ç½®èååæé |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # MDM ä¸»æ°æ®æ¨¡åæ¹é 计å |
| | | |
| | | ## ä¸ãæ¹é èæ¯ |
| | | |
| | | å½å ERPãMESãWMS ä¸ä¸ªæ¨¡ååèªç»´æ¤äº§å/ç©ææ°æ®ï¼å卿°æ®å¤å²é®é¢ï¼ |
| | | - **ERP**ï¼ç»´æ¤äº§åæ°æ®ï¼erp_productï¼ã产ååç±»ï¼erp_product_categoryï¼ã计éåä½ï¼erp_product_unitï¼ |
| | | - **MES**ï¼ç»´æ¤ç©ææ°æ®ï¼mes_md_itemï¼ãç©æåç±»ï¼mes_md_item_typeï¼ã计éåä½ï¼mes_md_unit_measureï¼ |
| | | - **WMS**ï¼ç»´æ¤ååæ°æ®ï¼wms_itemï¼ãåååç±»ï¼wms_item_categoryï¼ãåçï¼wms_item_brandï¼ãSKUï¼wms_item_skuï¼ |
| | | |
| | | æ¹é ç®æ ï¼å°åºç¡äº§åæ°æ®ç»ä¸å° MDM 模å管çï¼ä¸ä¸ªæ¨¡åéè¿ API è°ç¨è·åæ°æ®ã |
| | | |
| | | --- |
| | | |
| | | ## äºãæ¹é é¶æ®µè§å |
| | | |
| | | ### 第ä¸é¶æ®µï¼åºç¡æ°æ®è¿ç§»ï¼é¢è®¡ 1 å¤©ï¼ |
| | | |
| | | **ç®æ **ï¼å®æåç±»ãåä½ãåççåºç¡æ°æ®çè¿ç§» |
| | | |
| | | | åºå· | ä»»å¡ | 模å | ä¼å
级 | |
| | | |------|------|------|--------| |
| | | | 1.1 | è¿ç§» ERP 产ååç±»å° MDM ç©æåç±» | ERP | P0 | |
| | | | 1.2 | è¿ç§» MES ç©æåç±»å° MDM ç©æåç±» | MES | P0 | |
| | | | 1.3 | è¿ç§» WMS åååç±»å° MDM ç©æåç±» | WMS | P0 | |
| | | | 1.4 | è¿ç§» ERP 计éåä½å° MDM 计éåä½ | ERP | P0 | |
| | | | 1.5 | è¿ç§» MES 计éåä½å° MDM 计éåä½ | MES | P0 | |
| | | | 1.6 | è¿ç§» WMS åååçå° MDM åç | WMS | P0 | |
| | | |
| | | **产åºç©**ï¼ |
| | | - SQL æ°æ®è¿ç§»èæ¬ |
| | | - åç«¯åæ´ææ¡£ |
| | | |
| | | --- |
| | | |
| | | ### 第äºé¶æ®µï¼ç©ææ°æ®è¿ç§»ï¼é¢è®¡ 1 å¤©ï¼ |
| | | |
| | | **ç®æ **ï¼å®æç©æ/产åä¸»æ°æ®è¿ç§» |
| | | |
| | | | åºå· | ä»»å¡ | 模å | ä¼å
级 | |
| | | |------|------|------|--------| |
| | | | 2.1 | è¿ç§» MES ç©æå° MDMï¼itemType=1 ç©æï¼ | MES | P0 | |
| | | | 2.2 | è¿ç§» ERP 产åå° MDMï¼itemType=2 产åï¼ | ERP | P0 | |
| | | | 2.3 | è¿ç§» WMS ååå° MDM | WMS | P0 | |
| | | | 2.4 | åå»ºç©æ SKU æ°æ® | MDM | P0 | |
| | | |
| | | **产åºç©**ï¼ |
| | | - SQL æ°æ®è¿ç§»èæ¬ |
| | | - åç«¯åæ´ææ¡£ |
| | | |
| | | --- |
| | | |
| | | ### 第ä¸é¶æ®µï¼æ¨¡åéé
æ¹é ï¼é¢è®¡ 4 å¤©ï¼ |
| | | |
| | | **ç®æ **ï¼ERP/MES/WMS 模åéé
MDM æ°æ®æº |
| | | |
| | | | åºå· | ä»»å¡ | 模å | ä¼å
级 | |
| | | |------|------|------|--------| |
| | | | 3.1 | ERP 模åå¼ç¨ MDM APIï¼ä¿®æ¹ Service å± | ERP | P0 | |
| | | | 3.2 | ERP 模åä¿®æ¹ Controller å±ååºç»æ | ERP | P1 | |
| | | | 3.3 | MES 模åå¼ç¨ MDM APIï¼ä¿®æ¹ Service å± | MES | P0 | |
| | | | 3.4 | MES 模åä¿®æ¹ Controller å±ååºç»æ | MES | P1 | |
| | | | 3.5 | WMS 模åå¼ç¨ MDM APIï¼ä¿®æ¹ Service å± | WMS | P0 | |
| | | | 3.6 | WMS 模åä¿®æ¹ Controller å±ååºç»æ | WMS | P1 | |
| | | |
| | | **产åºç©**ï¼ |
| | | - åç«¯ä»£ç æ¹é |
| | | - åç«¯åæ´ææ¡£ |
| | | |
| | | --- |
| | | |
| | | ### 第åé¶æ®µï¼å端éé
ï¼é¢è®¡ 3 å¤©ï¼ |
| | | |
| | | **ç®æ **ï¼å端页é¢éé
æ°æ°æ®ç»æ |
| | | |
| | | | åºå· | ä»»å¡ | 模å | ä¼å
级 | |
| | | |------|------|------|--------| |
| | | | 4.1 | ERP 产å管ç页é¢éé
| ERP | P1 | |
| | | | 4.2 | MES ç©æç®¡ç页é¢éé
| MES | P1 | |
| | | | 4.3 | WMS åå管ç页é¢éé
| WMS | P1 | |
| | | | 4.4 | 忍¡åéæ©å¨ç»ä»¶éé
| å
¨é¨ | P1 | |
| | | |
| | | **产åºç©**ï¼ |
| | | - åç«¯ä»£ç æ¹é |
| | | - åç«¯åæ´ææ¡£ |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãæ°æ®å段æ å° |
| | | |
| | | ### 3.1 ERP 产å â MDM ç©æ |
| | | |
| | | | ERP åæ®µ | MDM åæ®µ | 说æ | |
| | | |----------|----------|------| |
| | | | id | id | 产åç¼å· | |
| | | | name | name | 产ååç§° | |
| | | | barCode | barCode | äº§åæ¡ç | |
| | | | categoryId | categoryId | åç±»ç¼å· | |
| | | | unitId | unitMeasureId | åä½ç¼å· | |
| | | | standard | specification | è§æ ¼åå· | |
| | | | status | status | ç¶æ | |
| | | | purchasePrice | purchasePrice | éè´ä»·æ ¼ | |
| | | | salePrice | salesPrice | éå®ä»·æ ¼ | |
| | | | minPrice | minPrice | æä½ä»·æ ¼ | |
| | | | expiryDay | expiryDay | ä¿è´¨æå¤©æ° | |
| | | | weight | weight | éé | |
| | | | remark | remark | 夿³¨ | |
| | | | - | itemType = 2 | 产åç±»å | |
| | | |
| | | ### 3.2 MES ç©æ â MDM ç©æ |
| | | |
| | | | MES åæ®µ | MDM åæ®µ | 说æ | |
| | | |----------|----------|------| |
| | | | id | id | ç©æç¼å· | |
| | | | code | code | ç©æç¼ç | |
| | | | name | name | ç©æåç§° | |
| | | | specification | specification | è§æ ¼åå· | |
| | | | itemTypeId | categoryId | åç±»ç¼å· | |
| | | | unitMeasureId | unitMeasureId | åä½ç¼å· | |
| | | | status | status | ç¶æ | |
| | | | minStock | minStock | æä½åºå | |
| | | | maxStock | maxStock | æé«åºå | |
| | | | batchFlag | isBatchManaged | æ¯å¦æ¹æ¬¡ç®¡ç | |
| | | | highValue | highValue | æ¯å¦é«å¼ç©æ | |
| | | | safeStockFlag | - | æ¯å¦å¯ç¨å®å
¨åºåï¼è½¬ä¸º safetyStock 计ç®ï¼ | |
| | | | remark | remark | 夿³¨ | |
| | | | - | itemType = 1 | ç©æç±»å | |
| | | |
| | | ### 3.3 WMS åå â MDM ç©æ |
| | | |
| | | | WMS åæ®µ | MDM åæ®µ | 说æ | |
| | | |----------|----------|------| |
| | | | id | id | ååç¼å· | |
| | | | code | code | ååç¼ç | |
| | | | name | name | åååç§° | |
| | | | unit | - | åä½ï¼éå
³è MDM åä½ï¼ | |
| | | | categoryId | categoryId | åç±»ç¼å· | |
| | | | brandId | brandId | åçç¼å· | |
| | | | remark | remark | 夿³¨ | |
| | | | - | itemType = 1 | é»è®¤ç©æç±»å | |
| | | |
| | | ### 3.4 WMS SKU â MDM SKU |
| | | |
| | | | WMS SKU åæ®µ | MDM SKU åæ®µ | 说æ | |
| | | |--------------|--------------|------| |
| | | | id | id | SKU ç¼å· | |
| | | | itemId | itemId | ç©æç¼å· | |
| | | | code | code | SKU ç¼ç | |
| | | | name | name | SKU åç§° | |
| | | | barCode | barCode | SKU æ¡ç | |
| | | | length | length | é¿åº¦ | |
| | | | width | width | 宽度 | |
| | | | height | height | é«åº¦ | |
| | | | grossWeight | grossWeight | æ¯é | |
| | | | netWeight | netWeight | åé | |
| | | | costPrice | costPrice | ææ¬ä»· | |
| | | | sellingPrice | salePrice | éå®ä»· | |
| | | |
| | | --- |
| | | |
| | | ## åãæ³¨æäºé¡¹ |
| | | |
| | | 1. **æ°æ®åå¹¶çç¥**ï¼åç±»ãåä½çåºç¡æ°æ®å¯è½åå¨éå¤ï¼éæç¼ç å»éåå¹¶ |
| | | 2. **ID å
¼å®¹**ï¼è¿ç§»åä¿æå ID ä¸åï¼é¿å
å
³è失æ |
| | | 3. **ååå
¼å®¹**ï¼å模å API ä¿çï¼å
é¨è°ç¨ MDM API å®ç° |
| | | 4. **æ°æ®éªè¯**ï¼æ¯é¶æ®µå®æåè¿è¡æ°æ®å®æ´æ§éªè¯ |
| | | |
| | | --- |
| | | |
| | | ## äºãé£é©è¯ä¼° |
| | | |
| | | | é£é©é¡¹ | é£é©ç级 | åºå¯¹æªæ½ | |
| | | |--------|----------|----------| |
| | | | æ°æ®åå¹¶å²çª | ä¸ | å¶å®åå¹¶è§åï¼äººå·¥å®¡æ ¸å²çªæ°æ® | |
| | | | å端éé
éæ¼ | ä¸ | ç¼å详ç»åæ´ææ¡£ï¼é页颿 ¸å¯¹ | |
| | | | æ§è½ä¸é | ä½ | MDM API å¢å ç¼åæºå¶ | |
| | | |
| | | --- |
| | | |
| | | ## å
ã产åºç©æ¸
å |
| | | |
| | | | æä»¶ | 说æ | è·¯å¾ | |
| | | |------|------|------| |
| | | | mdm_migration_plan.md | æ¹é è®¡åæ»ææ¡£ | docs/ | |
| | | | mdm_migration_01_basic_data.sql | 第ä¸é¶æ®µ SQLï¼åºç¡æ°æ®è¿ç§» | docs/sql/ | |
| | | | mdm_migration_02_item_data.sql | 第äºé¶æ®µ SQLï¼ç©ææ°æ®è¿ç§» | docs/sql/ | |
| | | | mdm_frontend_change_phase1.md | 第ä¸é¶æ®µåç«¯åæ´ææ¡£ | docs/ | |
| | | | mdm_frontend_change_phase2.md | 第äºé¶æ®µåç«¯åæ´ææ¡£ | docs/ | |
| | | | mdm_frontend_change.md | MDM API æ»è§ææ¡£ | docs/ | |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãè¿åº¦è·è¸ª |
| | | |
| | | | é¶æ®µ | å¼å§æ¥æ | ç»ææ¥æ | ç¶æ | 宿ç | |
| | | |------|----------|----------|------|--------| |
| | | | 第ä¸é¶æ®µ | SQLèæ¬å·²åå¤ | - | â
已宿ï¼éæå¨æ§è¡SQLï¼ | 100% | |
| | | | 第äºé¶æ®µ | SQLèæ¬å·²åå¤ | - | â
已宿ï¼éæå¨æ§è¡SQLï¼ | 100% | |
| | | | 第ä¸é¶æ®µ | åç«¯ä»£ç æ¹é 宿 | - | â
已宿 | 100% | |
| | | | 第åé¶æ®µ | - | - | â æªå¼å§ï¼éå端å¼åï¼ | 0% | |
| | | |
| | | --- |
| | | |
| | | ## å
«ãæ¹é 详æ
|
| | | |
| | | ### 第ä¸é¶æ®µå®ææ
åµ |
| | | |
| | | | åºå· | ä»»å¡ | ç¶æ | |
| | | |------|------|------| |
| | | | 1.1 | è¿ç§» ERP 产ååç±»å° MDM ç©æåç±» | â
SQLèæ¬å·²åå¤ | |
| | | | 1.2 | è¿ç§» MES ç©æåç±»å° MDM ç©æåç±» | â
SQLèæ¬å·²åå¤ | |
| | | | 1.3 | è¿ç§» WMS åååç±»å° MDM ç©æåç±» | â
SQLèæ¬å·²åå¤ | |
| | | | 1.4 | è¿ç§» ERP 计éåä½å° MDM 计éåä½ | â
SQLèæ¬å·²åå¤ | |
| | | | 1.5 | è¿ç§» MES 计éåä½å° MDM 计éåä½ | â
SQLèæ¬å·²åå¤ | |
| | | | 1.6 | è¿ç§» WMS åååçå° MDM åç | â
SQLèæ¬å·²åå¤ | |
| | | |
| | | **产åºç©**ï¼`docs/sql/mdm_migration_01_basic_data.sql` |
| | | |
| | | ### 第äºé¶æ®µå®ææ
åµ |
| | | |
| | | | åºå· | ä»»å¡ | ç¶æ | |
| | | |------|------|------| |
| | | | 2.1 | è¿ç§» MES ç©æå° MDMï¼itemType=1 ç©æï¼ | â
SQLèæ¬å·²åå¤ | |
| | | | 2.2 | è¿ç§» ERP 产åå° MDMï¼itemType=2 产åï¼ | â
SQLèæ¬å·²åå¤ | |
| | | | 2.3 | è¿ç§» WMS ååå° MDM | â
SQLèæ¬å·²åå¤ | |
| | | | 2.4 | åå»ºç©æ SKU æ°æ® | â
SQLèæ¬å·²åå¤ | |
| | | |
| | | **产åºç©**ï¼`docs/sql/mdm_migration_02_item_data.sql` |
| | | |
| | | ### 第ä¸é¶æ®µå®ææ
åµ |
| | | |
| | | | åºå· | ä»»å¡ | ç¶æ | |
| | | |------|------|------| |
| | | | 3.1 | ERP 模åå¼ç¨ MDM APIï¼ä¿®æ¹ Service å± | â
已宿 | |
| | | | 3.2 | ERP 模åä¿®æ¹ Controller å±ååºç»æ | â
ä¿æåç»æï¼æ éä¿®æ¹ | |
| | | | 3.3 | MES 模åå¼ç¨ MDM APIï¼ä¿®æ¹ Service å± | â
已宿 | |
| | | | 3.4 | MES 模åä¿®æ¹ Controller å±ååºç»æ | â
ä¿æåç»æï¼æ éä¿®æ¹ | |
| | | | 3.5 | WMS 模åå¼ç¨ MDM APIï¼ä¿®æ¹ Service å± | â
已宿 | |
| | | | 3.6 | WMS 模åä¿®æ¹ Controller å±ååºç»æ | â
ä¿æåç»æï¼æ éä¿®æ¹ | |
| | | |
| | | **æ¹å¨æä»¶**ï¼ |
| | | - `yudao-module-erp/pom.xml` - æ·»å MDM ä¾èµ |
| | | - `yudao-module-erp/.../ErpProductServiceImpl.java` - æ¹ä¸ºè°ç¨ MDM API |
| | | - `yudao-module-mes/pom.xml` - æ·»å MDM ä¾èµ |
| | | - `yudao-module-mes/.../MesMdItemServiceImpl.java` - æ¹ä¸ºè°ç¨ MDM API |
| | | - `yudao-module-wms/pom.xml` - æ·»å MDM ä¾èµ |
| | | - `yudao-module-wms/.../WmsItemServiceImpl.java` - æ¹ä¸ºè°ç¨ MDM API |
| | | - `yudao-module-mdm/.../MdmItemRespDTO.java` - æ·»å minStockãmaxStock åæ®µ |
| | | |
| | | ### 第åé¶æ®µå¾
åäºé¡¹ |
| | | |
| | | | åºå· | ä»»å¡ | ç¶æ | 夿³¨ | |
| | | |------|------|------|------| |
| | | | 4.1 | ERP 产å管ç页é¢éé
| â å¾
å¼å§ | éå端å¼å | |
| | | | 4.2 | MES ç©æç®¡ç页é¢éé
| â å¾
å¼å§ | éå端å¼å | |
| | | | 4.3 | WMS åå管ç页é¢éé
| â å¾
å¼å§ | éå端å¼å | |
| | | | 4.4 | 忍¡åéæ©å¨ç»ä»¶éé
| â å¾
å¼å§ | éå端å¼å | |
| | | |
| | | **åç«¯åæ´ææ¡£**ï¼ |
| | | - `docs/mdm_frontend_change_phase1.md` |
| | | - `docs/mdm_frontend_change_phase2.md` |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # MDM äº§åæ°æ®ä¸ä½åæ¹é - åç«¯ææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬æ¬¡æ¹é å° MDM ç©æä½ä¸ºç»ä¸äº§åä¸»æ°æ®ï¼CRM å ERP 模åçäº§åæ°æ®ç»ä¸ä½¿ç¨ MDM ç©æï¼itemType=2 产åç±»åï¼ã |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãæ¹é æ¸
å |
| | | |
| | | ### å端æ¹é ï¼å·²å®æï¼ |
| | | |
| | | | æä»¶ | æ¹å¨è¯´æ | |
| | | |------|----------| |
| | | | `yudao-module-mdm-api/` | MDM ç©æ API 模å | |
| | | | `MdmItemApi.java` | ç©æ API æ¥å£ | |
| | | | `MdmItemRespDTO.java` | ç©æååº DTO | |
| | | | `MdmItemCreateReqDTO.java` | ç©æåå»ºè¯·æ± DTO | |
| | | | `MdmItemUpdateReqDTO.java` | ç©ææ´æ°è¯·æ± DTO | |
| | | | `MdmItemTypeEnum.java` | ç©æç±»åæä¸¾ | |
| | | | `ErpProductServiceImpl.java` | ä½¿ç¨ MDM ç©æ API | |
| | | | `CrmProductServiceImpl.java` | ä½¿ç¨ MDM ç©æ API | |
| | | |
| | | --- |
| | | |
| | | ## äºãæ¶åé¡µé¢ |
| | | |
| | | ### ERP 产å管ç |
| | | |
| | | | é¡µé¢ | è·¯å¾ | æ¹å¨è¯´æ | |
| | | |------|------|----------| |
| | | | 产åå表 | `/erp/product/index` | æ éæ¹å¨ï¼æ¥å£å
¼å®¹ | |
| | | | 产å表å | `/erp/product/form` | æ éæ¹å¨ï¼æ¥å£å
¼å®¹ | |
| | | |
| | | ### CRM 产å管ç |
| | | |
| | | | é¡µé¢ | è·¯å¾ | æ¹å¨è¯´æ | |
| | | |------|------|----------| |
| | | | 产åå表 | `/crm/product/index` | æ éæ¹å¨ï¼æ¥å£å
¼å®¹ | |
| | | | 产å表å | `/crm/product/form` | æ éæ¹å¨ï¼æ¥å£å
¼å®¹ | |
| | | |
| | | ### MDM ç©æç®¡ç |
| | | |
| | | | é¡µé¢ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | ç©æå表 | `/mdm/item/index` | ç»ä¸äº§åä¸»æ°æ®å
¥å£ | |
| | | | ç©æè¡¨å | `/mdm/item/form` | å建/ç¼è¾ç©æ | |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãæ°æ®æ¨¡åæ å° |
| | | |
| | | ### MDM ç©æç±»å |
| | | |
| | | | ç±»åå¼ | 说æ | ç¨é | |
| | | |--------|------|------| |
| | | | 1 | ç©æ | åææãè¾
æç | |
| | | | 2 | 产å | éå®äº§åï¼CRMãERP 使ç¨ï¼ | |
| | | | 3 | åæå | ç产ä¸é´ä»¶ | |
| | | |
| | | ### åæ®µæ å°ï¼MDM -> ERPï¼ |
| | | |
| | | | MDM åæ®µ | ERP åæ®µ | 说æ | |
| | | |----------|----------|------| |
| | | | id | id | ç¼å· | |
| | | | name | name | åç§° | |
| | | | barCode | barCode | æ¡ç | |
| | | | specification | standard | è§æ ¼ | |
| | | | categoryId | categoryId | åç±»ç¼å· | |
| | | | unitMeasureId | unitId | åä½ç¼å· | |
| | | | status | status | ç¶æ | |
| | | | purchasePrice | purchasePrice | éè´ä»·æ ¼ | |
| | | | salesPrice | salePrice | éå®ä»·æ ¼ | |
| | | | costPrice | minPrice | ææ¬ä»· -> æä½ä»· | |
| | | | expiryDay | expiryDay | ä¿è´¨æ | |
| | | | weight | weight | éé | |
| | | | remark | remark | 夿³¨ | |
| | | |
| | | ### åæ®µæ å°ï¼MDM -> CRMï¼ |
| | | |
| | | | MDM åæ®µ | CRM åæ®µ | 说æ | |
| | | |----------|----------|------| |
| | | | id | id | ç¼å· | |
| | | | code | no | ç¼ç | |
| | | | name | name | åç§° | |
| | | | unitMeasureId | unit | åä½ | |
| | | | salesPrice | price | ä»·æ ¼ | |
| | | | status | status | ç¶æ | |
| | | | categoryId | categoryId | åç±»ç¼å· | |
| | | | remark | description | æè¿° | |
| | | |
| | | --- |
| | | |
| | | ## åãAPI æ¥å£ |
| | | |
| | | ### MDM ç©æ API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /rpc-api/mdm/item/create | åå»ºç©æ | |
| | | | PUT | /rpc-api/mdm/item/update | æ´æ°ç©æ | |
| | | | GET | /rpc-api/mdm/item/get | è·åç©æ | |
| | | | POST | /rpc-api/mdm/item/list | è·åç©æå表 | |
| | | | POST | /rpc-api/mdm/item/page | è·åç©æå页 | |
| | | | GET | /rpc-api/mdm/item/validate-exists | æ ¡éªç©æåå¨ | |
| | | | GET | /rpc-api/mdm/item/get-by-code | æ ¹æ®ç¼ç è·åç©æ | |
| | | | GET | /rpc-api/mdm/item/get-by-bar-code | æ ¹æ®æ¡ç è·åç©æ | |
| | | |
| | | ### ERP 产å APIï¼ä¿æä¸åï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /erp/product/create | å建产å | |
| | | | PUT | /erp/product/update | æ´æ°äº§å | |
| | | | DELETE | /erp/product/delete | å é¤äº§å | |
| | | | GET | /erp/product/get | è·å产å | |
| | | | GET | /erp/product/page | è·å产åå页 | |
| | | | GET | /erp/product/simple-list | è·å产åç²¾ç®å表 | |
| | | |
| | | ### CRM 产å APIï¼ä¿æä¸åï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /crm/product/create | å建产å | |
| | | | PUT | /crm/product/update | æ´æ°äº§å | |
| | | | DELETE | /crm/product/delete | å é¤äº§å | |
| | | | GET | /crm/product/get | è·å产å | |
| | | | GET | /crm/product/page | è·å产åå页 | |
| | | | GET | /crm/product/simple-list | è·å产åç²¾ç®å表 | |
| | | |
| | | --- |
| | | |
| | | ## äºãå端修æ¹ç¹ |
| | | |
| | | ### 5.1 产åéæ©ç»ä»¶ï¼å¯éä¼åï¼ |
| | | |
| | | 妿éè¦ç»ä¸äº§åéæ©ä½éªï¼å¯ä»¥å建 MDM ç©æéæ©ç»ä»¶ï¼ |
| | | |
| | | ```html |
| | | <!-- MdmItemSelect.vue --> |
| | | <template> |
| | | <el-select v-model="selectedValue" placeholder="è¯·éæ©äº§å" filterable> |
| | | <el-option |
| | | v-for="item in itemList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id" |
| | | > |
| | | <span>{{ item.name }}</span> |
| | | <span style="color: #999; margin-left: 8px;">{{ item.barCode }}</span> |
| | | </el-option> |
| | | </el-select> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getItemList } from '@/api/mdm/item' |
| | | |
| | | export default { |
| | | props: { |
| | | value: [Number, String], |
| | | itemType: { |
| | | type: Number, |
| | | default: 2 // é»è®¤äº§åç±»å |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | itemList: [] |
| | | } |
| | | }, |
| | | computed: { |
| | | selectedValue: { |
| | | get() { |
| | | return this.value |
| | | }, |
| | | set(val) { |
| | | this.$emit('input', val) |
| | | } |
| | | } |
| | | }, |
| | | created() { |
| | | this.loadItemList() |
| | | }, |
| | | methods: { |
| | | async loadItemList() { |
| | | const { data } = await getItemList({ itemType: this.itemType, status: 0 }) |
| | | this.itemList = data |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | ``` |
| | | |
| | | ### 5.2 ä½¿ç¨æ¹å¼ |
| | | |
| | | ```html |
| | | <!-- ERP éå®è®¢åä¸éæ©äº§å --> |
| | | <MdmItemSelect v-model="form.productId" :item-type="2" /> |
| | | |
| | | <!-- éè´è®¢åä¸éæ©ç©æ --> |
| | | <MdmItemSelect v-model="form.itemId" :item-type="1" /> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
ãæ³¨æäºé¡¹ |
| | | |
| | | ### 6.1 æ°æ®è¿ç§» |
| | | |
| | | 妿已æ ERP æ CRM äº§åæ°æ®ï¼éè¦è¿ç§»å° MDM ç©æè¡¨ï¼ |
| | | |
| | | ```sql |
| | | -- è¿ç§» ERP 产åå° MDM ç©æï¼ç¤ºä¾ï¼ |
| | | INSERT INTO mdm_item (id, code, name, bar_code, specification, category_id, unit_measure_id, |
| | | item_type, status, purchase_price, sales_price, cost_price, expiry_day, weight, remark, |
| | | creator, create_time, updater, update_time, deleted, tenant_id) |
| | | SELECT |
| | | id, |
| | | bar_code AS code, |
| | | name, |
| | | bar_code, |
| | | standard AS specification, |
| | | category_id, |
| | | unit_id AS unit_measure_id, |
| | | 2 AS item_type, -- 产åç±»å |
| | | status, |
| | | purchase_price, |
| | | sale_price AS sales_price, |
| | | min_price AS cost_price, |
| | | expiry_day, |
| | | weight, |
| | | remark, |
| | | creator, |
| | | create_time, |
| | | updater, |
| | | update_time, |
| | | deleted, |
| | | tenant_id |
| | | FROM erp_product |
| | | WHERE deleted = 0; |
| | | |
| | | -- è¿ç§» CRM 产åå° MDM ç©æï¼éè¦å¤ç ID å²çªï¼ |
| | | -- 注æï¼å¦æ ID ä¸ ERP 产åå²çªï¼éè¦éæ°åé
ID å¹¶æ´æ°å
³èæ°æ® |
| | | ``` |
| | | |
| | | ### 6.2 æ¥å£å
¼å®¹æ§ |
| | | |
| | | - ERP å CRM çäº§åæ¥å£ä¿æä¸åï¼å端æ éä¿®æ¹ |
| | | - æ°æ®å®é
ä» MDM è·åï¼å¯¹åç«¯éæ |
| | | - å建/æ´æ°æä½éè¿ MDM API æ§è¡ |
| | | |
| | | ### 6.3 æé管ç |
| | | |
| | | - CRM 产åä¿çæ¬å°è®°å½ç¨äºæé管ç |
| | | - 产å ID ä¸ MDM ç©æ ID ä¿æä¸è´ |
| | | - æééªè¯ä»ç¶éè¿ CRM æéç³»ç» |
| | | |
| | | ### 6.4 åºå¼è¯´æ |
| | | |
| | | - `erp_product` 表ï¼ä¿çä½ä¸åä½ä¸ºä¸»æ°æ®æº |
| | | - `crm_product` 表ï¼ä¿çç¨äºæé管çï¼æ°æ®åæ¥èª MDM |
| | | - 建议åç»çæ¬å¨å端èåä¸ç»ä¸ä½¿ç¨ MDM ç©æç®¡ç |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãåç»è®¡å |
| | | |
| | | | Phase | å
容 | ç¶æ | |
| | | |-------|------|------| |
| | | | Phase 1 | å®¢æ·æ°æ®ç»ä¸ - ERP ä½¿ç¨ CRM å®¢æ· | **已宿** | |
| | | | Phase 2 | äº§åæ°æ®ç»ä¸ - CRM/ERP ä½¿ç¨ MDM ç©æ | **已宿** | |
| | | | Phase 3 | ååçæéå®è®¢å | å¾
å¼å§ | |
| | | | Phase 4 | éå®å
¨æµç¨è¿½æº¯ | å¾
å¼å§ | |
| | | | Phase 5 | è¥éæ°æ®æ¥è¡¨ | å¾
å¼å§ | |
| | | | Phase 6 | æ°æ®è¿ç§»ä¸æ¸
ç | å¾
å¼å§ | |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # CRM éå®å
¨æµç¨è¿½æº¯ - åç«¯ææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬æ¬¡æ¹é å®ç°éå®å
¨æµç¨è¿½æº¯åè½ï¼å¯ä»åæºãååã客æ·çå¤ä¸ªç»´åº¦æ¥ç宿´çé宿µç¨ä¿¡æ¯ï¼å
æ¬åæº -> åå -> éå®è®¢å -> åºåº -> 忬¾ -> éè´§çå
¨é¾è·¯æ°æ®ã |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãæ¹é æ¸
å |
| | | |
| | | ### å端æ¹é ï¼å·²å®æï¼ |
| | | |
| | | | æä»¶ | æ¹å¨è¯´æ | |
| | | |------|----------| |
| | | | `CrmSaleTraceApi.java` | éå®è¿½æº¯ API æ¥å£ | |
| | | | `CrmSaleTraceRespDTO.java` | éå®è¿½æº¯ååº DTO | |
| | | | `CrmSaleTraceApiImpl.java` | éå®è¿½æº¯ API å®ç° | |
| | | | `CrmBusinessDO.java` | æ°å¢ orderIdãorderNo åæ®µ | |
| | | | `CrmBusinessRespVO.java` | æ°å¢ orderIdãorderNo åæ®µ | |
| | | | `CrmContractMapper.java` | æ°å¢ selectByBusinessIdãselectListByCustomerId æ¹æ³ | |
| | | | `CrmReceivableService.java` | æ°å¢ getReceivablePriceByContractId æ¹æ³ | |
| | | |
| | | --- |
| | | |
| | | ## äºãæ¶åé¡µé¢ |
| | | |
| | | ### CRM 模å |
| | | |
| | | | é¡µé¢ | è·¯å¾ | æ¹å¨è¯´æ | |
| | | |------|------|----------| |
| | | | åæºè¯¦æ
| `/crm/business/detail` | æ·»å é宿µç¨è¿½æº¯å
¥å£ | |
| | | | åå详æ
| `/crm/contract/detail` | æ·»å é宿µç¨è¿½æº¯å
¥å£ | |
| | | | 客æ·è¯¦æ
| `/crm/customer/detail` | æ·»å é宿µç¨è¿½æº¯å表 | |
| | | |
| | | ### æ°å¢é¡µé¢ |
| | | |
| | | | é¡µé¢ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | éå®è¿½æº¯è¯¦æ
| `/crm/sale-trace/detail` | é宿µç¨è¿½æº¯è¯¦æ
页 | |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãAPI æ¥å£ |
| | | |
| | | ### CRM éå®è¿½æº¯ API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /rpc-api/crm/sale-trace/get-by-business-id | æ ¹æ®åæºç¼å·è·åè¿½æº¯ä¿¡æ¯ | |
| | | | GET | /rpc-api/crm/sale-trace/get-by-contract-id | æ ¹æ®ååç¼å·è·åè¿½æº¯ä¿¡æ¯ | |
| | | | GET | /rpc-api/crm/sale-trace/get-list-by-customer-id | æ ¹æ®å®¢æ·ç¼å·è·å追溯å表 | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "businessId": 1, |
| | | "businessName": "åæºA", |
| | | "businessPrice": 100000, |
| | | "businessStatus": "è¿è¡ä¸", |
| | | "businessCreateTime": "2024-01-01 10:00:00", |
| | | "customerId": 1, |
| | | "customerName": "客æ·A", |
| | | "contractId": 1, |
| | | "contractName": "ååA", |
| | | "contractPrice": 95000, |
| | | "contractStatus": 20, |
| | | "contractCreateTime": "2024-01-15 10:00:00", |
| | | "orderId": 1, |
| | | "orderNo": "SO001", |
| | | "orderPrice": 95000, |
| | | "orderStatus": 0, |
| | | "orderCreateTime": "2024-01-16 10:00:00", |
| | | "receivablePrice": 50000, |
| | | "receivableItems": [ |
| | | { |
| | | "receivableId": 1, |
| | | "receivableNo": "RK001", |
| | | "price": 30000, |
| | | "receivableTime": "2024-02-01" |
| | | }, |
| | | { |
| | | "receivableId": 2, |
| | | "receivableNo": "RK002", |
| | | "price": 20000, |
| | | "receivableTime": "2024-03-01" |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## åãå端修æ¹ç¹ |
| | | |
| | | ### 4.1 åæºè¯¦æ
é¡µé¢ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `/src/views/crm/business/detail.vue` |
| | | |
| | | **æ°å¢ç»ä»¶ï¼** |
| | | |
| | | ```html |
| | | <!-- é宿µç¨è¿½æº¯å¡ç --> |
| | | <el-card class="sale-trace-card" header="é宿µç¨è¿½æº¯"> |
| | | <div v-if="traceInfo"> |
| | | <!-- æµç¨æ¶é´çº¿ --> |
| | | <el-timeline> |
| | | <el-timeline-item |
| | | :timestamp="traceInfo.businessCreateTime" |
| | | placement="top" |
| | | color="#409EFF" |
| | | > |
| | | <el-card> |
| | | <h4>åæºå建</h4> |
| | | <p>åæºåç§°ï¼{{ traceInfo.businessName }}</p> |
| | | <p>åæºéé¢ï¼Â¥{{ traceInfo.businessPrice }}</p> |
| | | </el-card> |
| | | </el-timeline-item> |
| | | |
| | | <el-timeline-item |
| | | v-if="traceInfo.contractId" |
| | | :timestamp="traceInfo.contractCreateTime" |
| | | placement="top" |
| | | color="#67C23A" |
| | | > |
| | | <el-card> |
| | | <h4>ååç¾è®¢</h4> |
| | | <p>åååç§°ï¼{{ traceInfo.contractName }}</p> |
| | | <p>ååéé¢ï¼Â¥{{ traceInfo.contractPrice }}</p> |
| | | <p>ååç¶æï¼{{ getContractStatusText(traceInfo.contractStatus) }}</p> |
| | | </el-card> |
| | | </el-timeline-item> |
| | | |
| | | <el-timeline-item |
| | | v-if="traceInfo.orderId" |
| | | :timestamp="traceInfo.orderCreateTime" |
| | | placement="top" |
| | | color="#E6A23C" |
| | | > |
| | | <el-card> |
| | | <h4>éå®è®¢å</h4> |
| | | <p>订åå·ï¼<el-link type="primary" @click="viewOrder(traceInfo.orderId)">{{ traceInfo.orderNo }}</el-link></p> |
| | | <p>订åéé¢ï¼Â¥{{ traceInfo.orderPrice }}</p> |
| | | <p>订åç¶æï¼{{ getOrderStatusText(traceInfo.orderStatus) }}</p> |
| | | </el-card> |
| | | </el-timeline-item> |
| | | |
| | | <el-timeline-item |
| | | v-if="traceInfo.receivablePrice > 0" |
| | | placement="top" |
| | | color="#F56C6C" |
| | | > |
| | | <el-card> |
| | | <h4>忬¾è®°å½</h4> |
| | | <p>已忬¾éé¢ï¼Â¥{{ traceInfo.receivablePrice }}</p> |
| | | <el-table v-if="traceInfo.receivableItems" :data="traceInfo.receivableItems" size="small"> |
| | | <el-table-column prop="receivableNo" label="忬¾åå·" /> |
| | | <el-table-column prop="price" label="忬¾éé¢" /> |
| | | <el-table-column prop="receivableTime" label="忬¾æ¶é´" /> |
| | | </el-table> |
| | | </el-card> |
| | | </el-timeline-item> |
| | | </el-timeline> |
| | | </div> |
| | | <div v-else> |
| | | <el-empty description="ææ é宿µç¨æ°æ®" /> |
| | | </div> |
| | | </el-card> |
| | | ``` |
| | | |
| | | **æ°å¢æ¹æ³ï¼** |
| | | |
| | | ```js |
| | | import { getTraceByBusinessId } from '@/api/crm/saleTrace' |
| | | |
| | | data() { |
| | | return { |
| | | traceInfo: null |
| | | } |
| | | }, |
| | | |
| | | methods: { |
| | | async loadTraceInfo() { |
| | | const { data } = await getTraceByBusinessId(this.businessId) |
| | | this.traceInfo = data |
| | | }, |
| | | getContractStatusText(status) { |
| | | const statusMap = { 0: 'è稿', 10: '审æ¹ä¸', 20: '审æ¹éè¿', 30: '审æ¹ä¸éè¿' } |
| | | return statusMap[status] || 'æªç¥' |
| | | }, |
| | | getOrderStatusText(status) { |
| | | const statusMap = { 0: 'æªå®¡æ ¸', 10: 'å·²å®¡æ ¸' } |
| | | return statusMap[status] || 'æªç¥' |
| | | }, |
| | | viewOrder(orderId) { |
| | | this.$router.push({ path: '/erp/sale/order/detail', query: { id: orderId } }) |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 4.2 åå详æ
é¡µé¢ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `/src/views/crm/contract/detail.vue` |
| | | |
| | | **æ°å¢æ¹æ³ï¼** |
| | | |
| | | ```js |
| | | import { getTraceByContractId } from '@/api/crm/saleTrace' |
| | | |
| | | methods: { |
| | | async loadTraceInfo() { |
| | | const { data } = await getTraceByContractId(this.contractId) |
| | | this.traceInfo = data |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 4.3 客æ·è¯¦æ
é¡µé¢ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `/src/views/crm/customer/detail.vue` |
| | | |
| | | **æ°å¢å表ï¼** |
| | | |
| | | ```html |
| | | <el-card header="é宿µç¨è¿½æº¯"> |
| | | <el-table :data="traceList" size="small"> |
| | | <el-table-column prop="businessName" label="åæºåç§°"> |
| | | <template #default="{ row }"> |
| | | <el-link v-if="row.businessId" type="primary" @click="viewBusiness(row.businessId)"> |
| | | {{ row.businessName }} |
| | | </el-link> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="contractName" label="åååç§°"> |
| | | <template #default="{ row }"> |
| | | <el-link v-if="row.contractId" type="primary" @click="viewContract(row.contractId)"> |
| | | {{ row.contractName }} |
| | | </el-link> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="contractPrice" label="ååéé¢" width="120" /> |
| | | <el-table-column prop="orderNo" label="éå®è®¢å"> |
| | | <template #default="{ row }"> |
| | | <el-link v-if="row.orderId" type="primary" @click="viewOrder(row.orderId)"> |
| | | {{ row.orderNo }} |
| | | </el-link> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="receivablePrice" label="已忬¾" width="120" /> |
| | | <el-table-column label="忬¾ç" width="100"> |
| | | <template #default="{ row }"> |
| | | <span v-if="row.contractPrice > 0"> |
| | | {{ ((row.receivablePrice / row.contractPrice) * 100).toFixed(1) }}% |
| | | </span> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | ``` |
| | | |
| | | ### 4.4 API å®ä¹ |
| | | |
| | | **æä»¶è·¯å¾ï¼** `/src/api/crm/saleTrace.js` |
| | | |
| | | ```js |
| | | import request from '@/utils/request' |
| | | |
| | | // æ ¹æ®åæºç¼å·è·åé宿µç¨è¿½æº¯ä¿¡æ¯ |
| | | export function getTraceByBusinessId(businessId) { |
| | | return request({ |
| | | url: '/crm/sale-trace/get-by-business-id', |
| | | method: 'get', |
| | | params: { businessId } |
| | | }) |
| | | } |
| | | |
| | | // æ ¹æ®ååç¼å·è·åé宿µç¨è¿½æº¯ä¿¡æ¯ |
| | | export function getTraceByContractId(contractId) { |
| | | return request({ |
| | | url: '/crm/sale-trace/get-by-contract-id', |
| | | method: 'get', |
| | | params: { contractId } |
| | | }) |
| | | } |
| | | |
| | | // æ ¹æ®å®¢æ·ç¼å·è·åé宿µç¨è¿½æº¯å表 |
| | | export function getTraceListByCustomerId(customerId) { |
| | | return request({ |
| | | url: '/crm/sale-trace/get-list-by-customer-id', |
| | | method: 'get', |
| | | params: { customerId } |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãæ°æ®æ¨¡ååæ´ |
| | | |
| | | ### CRM åæºè¡¨åæ´ |
| | | |
| | | ```sql |
| | | ALTER TABLE `crm_business` |
| | | ADD COLUMN `order_id` bigint DEFAULT NULL COMMENT 'å
³è ERP éå®è®¢åç¼å·' AFTER `total_price`, |
| | | ADD COLUMN `order_no` varchar(32) DEFAULT NULL COMMENT 'ERP éå®è®¢ååå·' AFTER `order_id`; |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
ãä¸å¡æµç¨å¾ |
| | | |
| | | ``` |
| | | åæºå建 â åæºè·è¿ â ååç¾è®¢ â ååå®¡æ¹ â çæè®¢å â 订åå®¡æ¹ â éå®åºåº â 客æ·å款 |
| | | â â â â â â â â |
| | | 10:00 12:00 15:00 16:00 17:00 18:00 20:00 25:00 |
| | | |
| | | ï¼éé¢ååè¿½è¸ªï¼ |
| | | åæºéé¢(100K) â ååéé¢(95K) â 订åéé¢(95K) â åºåºéé¢(95K) â 忬¾éé¢(50K) |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ã注æäºé¡¹ |
| | | |
| | | 1. **æ°æ®å
³è**ï¼è¿½æº¯æ°æ®æ¥æºäºå¤ä¸ªæ¨¡åï¼CRMãERPï¼ï¼éç¡®ä¿æ°æ®ä¸è´æ§ |
| | | 2. **æéæ§å¶**ï¼è¿½æº¯æ¥è¯¢éè¦å¯¹åºæ¨¡åçæ¥çæé |
| | | 3. **æ°æ®å®æ´æ§**ï¼é¨åä¸å¡å¯è½åªå°æä¸ªç¯èï¼å¦åªç¾ååæªçæè®¢åï¼ |
| | | 4. **æ¶é´çº¿å±ç¤º**ï¼ææ¶é´é¡ºåºå±ç¤ºåç¯èä¿¡æ¯ |
| | | 5. **é颿±æ»**ï¼å±ç¤ºæ¯ä¸ªç¯èçéé¢ååæ
åµ |
| | | |
| | | --- |
| | | |
| | | ## å
«ãåç»è®¡å |
| | | |
| | | | Phase | å
容 | ç¶æ | |
| | | |-------|------|------| |
| | | | Phase 1 | å®¢æ·æ°æ®ç»ä¸ - ERP ä½¿ç¨ CRM å®¢æ· | **已宿** | |
| | | | Phase 2 | äº§åæ°æ®ç»ä¸ - CRM/ERP ä½¿ç¨ MDM ç©æ | **已宿** | |
| | | | Phase 3 | ååçæéå®è®¢å | **已宿** | |
| | | | Phase 4 | éå®å
¨æµç¨è¿½æº¯ | **已宿** | |
| | | | Phase 5 | è¥éæ°æ®æ¥è¡¨ | å¾
å¼å§ | |
| | | | Phase 6 | æ°æ®è¿ç§»ä¸æ¸
ç | å¾
å¼å§ | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- BPM éè´å®¡æ ¸æµç¨ - SQL åå§å |
| | | -- ===================================================== |
| | | |
| | | -- ===================================================== |
| | | -- 01. å建æµç¨åç±»ï¼éè´ç®¡çï¼ |
| | | -- ===================================================== |
| | | |
| | | INSERT INTO bpm_category (id, name, code, description, status, sort, creator, create_time, updater, update_time, deleted) |
| | | VALUES (100, 'éè´å®¡æ ¸', 'purchase_approve', 'éè´è®¢åå®¡æ¹æµç¨åç±»', 0, 10, '1', NOW(), '1', NOW(), 0) |
| | | ON DUPLICATE KEY UPDATE name = VALUES(name), code = VALUES(code); |
| | | |
| | | -- ===================================================== |
| | | -- 02. å建éè´è®¢å审æ¹è¡¨å |
| | | -- ===================================================== |
| | | |
| | | INSERT INTO bpm_form (id, name, status, conf, fields, remark, creator, create_time, updater, update_time, deleted) |
| | | VALUES ( |
| | | 100, |
| | | 'éè´è®¢å审æ¹è¡¨å', |
| | | 0, |
| | | '{"formRef":"elForm","size":"medium","labelPosition":"right","labelWidth":100,"formRules":"rules","gutter":15,"disabled":false,"span":24,"formBtns":true}', |
| | | '[ |
| | | {"type":"input","label":"订åç¼å·","placeholder":"请è¾å
¥è®¢åç¼å·","field":"orderNo","defaultValue":"","required":true}, |
| | | {"type":"input","label":"ä¾åºååç§°","placeholder":"请è¾å
¥ä¾åºååç§°","field":"supplierName","defaultValue":"","required":true}, |
| | | {"type":"input","label":"éè´éé¢","placeholder":"请è¾å
¥éè´éé¢","field":"amount","defaultValue":"","required":true}, |
| | | {"type":"input","label":"è®¢åæ°é","placeholder":"请è¾å
¥è®¢åæ°é","field":"quantity","defaultValue":"","required":true}, |
| | | {"type":"textarea","label":"订åæç»","placeholder":"请è¾å
¥è®¢åæç»","field":"orderDetail","defaultValue":"","required":false}, |
| | | {"type":"textarea","label":"夿³¨","placeholder":"请è¾å
¥å¤æ³¨","field":"remark","defaultValue":"","required":false} |
| | | ]', |
| | | 'éè´è®¢å审æ¹è¡¨å', |
| | | '1', |
| | | NOW(), |
| | | '1', |
| | | NOW(), |
| | | 0 |
| | | ) ON DUPLICATE KEY UPDATE name = VALUES(name); |
| | | |
| | | -- ===================================================== |
| | | -- 03. 说æï¼æµç¨æ¨¡ååå®ä¹éè¦éè¿å端çé¢å建 |
| | | -- ===================================================== |
| | | -- |
| | | -- éè´å®¡æ¹æµç¨å»ºè®®é
ç½®ï¼ |
| | | -- |
| | | -- æµç¨åç§°ï¼éè´è®¢åå®¡æ¹ |
| | | -- æµç¨åç±»ï¼éè´å®¡æ ¸ (code = purchase_approve) |
| | | -- 表åç±»åï¼å¨æè¡¨åï¼å
³èä¸é¢ç表å id=100ï¼ |
| | | -- |
| | | -- æµç¨èç¹é
ç½®ï¼Simple 设计å¨ï¼ï¼ |
| | | -- |
| | | -- 1. å¼å§èç¹ |
| | | -- - å起人ï¼å
¨åå¯åèµ· |
| | | -- |
| | | -- 2. 主管审æ¹èç¹ |
| | | -- - 审æ¹äººï¼å起人çç´å±ä¸»ç®¡ |
| | | -- - 审æ¹ç±»åï¼å®¡æ¹ |
| | | -- |
| | | -- 3. éè´ç»ç审æ¹èç¹ï¼éé¢ > 5000 æ¶ï¼ |
| | | -- - æ¡ä»¶åæ¯ï¼éè´éé¢ > 5000 |
| | | -- - 审æ¹äººï¼éè´ç»çè§è²ææå®ç¨æ· |
| | | -- - 审æ¹ç±»åï¼å®¡æ¹ |
| | | -- |
| | | -- 4. è´¢å¡å®¡æ¹èç¹ï¼éé¢ > 10000 æ¶ï¼ |
| | | -- - æ¡ä»¶åæ¯ï¼éè´éé¢ > 10000 |
| | | -- - 审æ¹äººï¼è´¢å¡ç»çè§è²ææå®ç¨æ· |
| | | -- - 审æ¹ç±»åï¼å®¡æ¹ |
| | | -- |
| | | -- 5. æ»ç»ç审æ¹èç¹ï¼éé¢ > 50000 æ¶ï¼ |
| | | -- - æ¡ä»¶åæ¯ï¼éè´éé¢ > 50000 |
| | | -- - 审æ¹äººï¼æ»ç»çè§è²ææå®ç¨æ· |
| | | -- - 审æ¹ç±»åï¼å®¡æ¹ |
| | | -- |
| | | -- 6. ç»æèç¹ |
| | | -- - 审æ¹éè¿åèªå¨ç»æ |
| | | -- |
| | | -- ===================================================== |
| | | |
| | | -- ===================================================== |
| | | -- 04. æ¥è¯¢éªè¯ |
| | | -- ===================================================== |
| | | |
| | | -- éªè¯åç±»å建 |
| | | SELECT * FROM bpm_category WHERE code = 'purchase_approve'; |
| | | |
| | | -- éªè¯è¡¨åå建 |
| | | SELECT * FROM bpm_form WHERE name = 'éè´è®¢å审æ¹è¡¨å'; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- ERP éè´ç®¡ç模åå®å - SQL èæ¬ |
| | | -- ===================================================== |
| | | |
| | | -- ===================================================== |
| | | -- 00. å建 BPM éè´å®¡æ ¸åç±»ï¼å¿
é¡»å¨éè´è®¢åååå»ºï¼ |
| | | -- ===================================================== |
| | | INSERT INTO bpm_category (id, name, code, description, status, sort, creator, create_time, updater, update_time, deleted) |
| | | VALUES (100, 'éè´å®¡æ ¸', 'purchase_approve', 'éè´è®¢åå®¡æ¹æµç¨åç±»', 0, 10, '1', NOW(), '1', NOW(), 0) |
| | | ON DUPLICATE KEY UPDATE name = VALUES(name); |
| | | |
| | | -- ===================================================== |
| | | -- 01. éè´å
¥åºè¡¨å¢å éªæ¶å段 |
| | | -- ===================================================== |
| | | ALTER TABLE `erp_purchase_in` ADD COLUMN IF NOT EXISTS `inspection_status` tinyint DEFAULT 0 COMMENT 'éªæ¶ç¶æï¼0:å¾
éªæ¶ 1:å·²éªæ¶ 2:éªæ¶ä¸åæ ¼ï¼'; |
| | | ALTER TABLE `erp_purchase_in` ADD COLUMN IF NOT EXISTS `inspection_time` datetime DEFAULT NULL COMMENT 'éªæ¶æ¶é´'; |
| | | ALTER TABLE `erp_purchase_in` ADD COLUMN IF NOT EXISTS `inspector_id` bigint DEFAULT NULL COMMENT 'éªæ¶äººåç¼å·'; |
| | | ALTER TABLE `erp_purchase_in` ADD COLUMN IF NOT EXISTS `inspection_result` varchar(500) DEFAULT NULL COMMENT 'éªæ¶ç»æ'; |
| | | |
| | | -- ===================================================== |
| | | -- 02. ä¾åºå表å¢å åæ®µ |
| | | -- ===================================================== |
| | | ALTER TABLE `erp_supplier` ADD COLUMN IF NOT EXISTS `credit_code` varchar(50) DEFAULT NULL COMMENT 'ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç '; |
| | | ALTER TABLE `erp_supplier` ADD COLUMN IF NOT EXISTS `bank_name` varchar(100) DEFAULT NULL COMMENT '弿·é¶è¡'; |
| | | ALTER TABLE `erp_supplier` ADD COLUMN IF NOT EXISTS `bank_account` varchar(50) DEFAULT NULL COMMENT 'é¶è¡è´¦å·'; |
| | | ALTER TABLE `erp_supplier` ADD COLUMN IF NOT EXISTS `address` varchar(200) DEFAULT NULL COMMENT 'å°å'; |
| | | ALTER TABLE `erp_supplier` ADD COLUMN IF NOT EXISTS `contact` varchar(50) DEFAULT NULL COMMENT 'è系人'; |
| | | ALTER TABLE `erp_supplier` ADD COLUMN IF NOT EXISTS `phone` varchar(20) DEFAULT NULL COMMENT 'èç³»çµè¯'; |
| | | ALTER TABLE `erp_supplier` ADD COLUMN IF NOT EXISTS `email` varchar(100) DEFAULT NULL COMMENT 'é®ç®±'; |
| | | ALTER TABLE `erp_supplier` ADD COLUMN IF NOT EXISTS `tax_no` varchar(50) DEFAULT NULL COMMENT 'ç¨å·'; |
| | | ALTER TABLE `erp_supplier` ADD COLUMN IF NOT EXISTS `qualification` varchar(500) DEFAULT NULL COMMENT 'èµè´¨ä¿¡æ¯'; |
| | | ALTER TABLE `erp_supplier` ADD COLUMN IF NOT EXISTS `cooperation_time` date DEFAULT NULL COMMENT 'åä½å¼å§æ¶é´'; |
| | | |
| | | -- ===================================================== |
| | | -- 03. éè´è®¢å表å¢å 审æ¹å段 |
| | | -- ===================================================== |
| | | ALTER TABLE `erp_purchase_order` ADD COLUMN IF NOT EXISTS `approve_time` datetime DEFAULT NULL COMMENT 'å®¡æ¹æ¶é´'; |
| | | ALTER TABLE `erp_purchase_order` ADD COLUMN IF NOT EXISTS `approver_id` bigint DEFAULT NULL COMMENT '审æ¹äººåç¼å·'; |
| | | |
| | | -- ===================================================== |
| | | -- 04. åå§åèåæ°æ® |
| | | -- ===================================================== |
| | | |
| | | -- éè´ç®¡çç®å½ |
| | | 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 ('éè´ç®¡ç', '', 1, 10, 0, '/erp/purchase', 'ep:goods', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- è·åéè´ç®¡çèåID |
| | | SET @purchase_menu_id = LAST_INSERT_ID(); |
| | | |
| | | -- ä¾åºå管çèå |
| | | 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, 1, @purchase_menu_id, 'supplier', 'ep:office-building', 'erp/purchase/supplier/index', 'ErpSupplier', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | SET @supplier_menu_id = LAST_INSERT_ID(); |
| | | |
| | | -- ä¾åºåæé®æé |
| | | 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 |
| | | ('ä¾åºåæ¥è¯¢', 'erp:supplier:query', 3, 1, @supplier_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | ('ä¾åºåæ°å¢', 'erp:supplier:create', 3, 2, @supplier_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | ('ä¾åºåä¿®æ¹', 'erp:supplier:update', 3, 3, @supplier_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | ('ä¾åºåå é¤', 'erp:supplier:delete', 3, 4, @supplier_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | ('ä¾åºå导åº', 'erp:supplier:export', 3, 5, @supplier_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), 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 ('éè´è®¢å', '', 2, 2, @purchase_menu_id, 'order', 'ep:document-checked', 'erp/purchase/order/index', 'ErpPurchaseOrder', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | SET @order_menu_id = LAST_INSERT_ID(); |
| | | |
| | | -- éè´è®¢åæé®æé |
| | | 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 |
| | | ('éè´è®¢åæ¥è¯¢', 'erp:purchase-order:query', 3, 1, @order_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | ('éè´è®¢åæ°å¢', 'erp:purchase-order:create', 3, 2, @order_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | ('éè´è®¢åä¿®æ¹', 'erp:purchase-order:update', 3, 3, @order_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | ('éè´è®¢åå é¤', 'erp:purchase-order:delete', 3, 4, @order_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | ('éè´è®¢å审æ¹', 'erp:purchase-order:update-status', 3, 5, @order_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | ('éè´è®¢å导åº', 'erp:purchase-order:export', 3, 6, @order_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), 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 ('éè´å
¥åº', '', 2, 3, @purchase_menu_id, 'in', 'ep:box', 'erp/purchase/in/index', 'ErpPurchaseIn', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), 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 ('éè´éè´§', '', 2, 4, @purchase_menu_id, 'return', 'ep:back', 'erp/purchase/return/index', 'ErpPurchaseReturn', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), 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 ('éè´ç»è®¡', '', 2, 5, @purchase_menu_id, 'statistics', 'ep:data-analysis', 'erp/purchase/statistics/index', 'ErpPurchaseStatistics', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | SET @statistics_menu_id = LAST_INSERT_ID(); |
| | | |
| | | -- éè´ç»è®¡æé®æé |
| | | 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 |
| | | ('éè´ç»è®¡æ¥è¯¢', 'erp:purchase-statistics:query', 3, 1, @statistics_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | ('ä¾åºåä¾è´§ç»è®¡', 'erp:purchase-statistics:supplier', 3, 2, @statistics_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | ('éè´ä»·æ ¼åæ', 'erp:purchase-statistics:price', 3, 3, @statistics_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | ('æªå®æè®¢åè·è¸ª', 'erp:purchase-statistics:uncompleted', 3, 4, @statistics_menu_id, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- MDM ä¸»æ°æ®è¿ç§» - 第ä¸é¶æ®µï¼åºç¡æ°æ®è¿ç§» |
| | | -- æ§è¡é¡ºåºï¼01 -> 02 -> 03 -> 04 -> 05 -> 06 |
| | | -- éç¨åºæ¯ï¼æ°é¡¹ç®åå§åï¼æ åå²ä¸å¡æ°æ® |
| | | -- ===================================================== |
| | | |
| | | -- ===================================================== |
| | | -- 00. å建é»è®¤åä½ï¼ç¡®ä¿ WMS åååä½ä¸ä¸ºç©ºï¼ |
| | | -- ===================================================== |
| | | |
| | | -- å建ä¸ä¸ªé»è®¤åä½ï¼ç¨äº WMS ååå使 æ³å¹é
çæ
åµ |
| | | INSERT INTO mdm_unit_measure (id, code, name, primary_flag, primary_id, change_rate, status, remark, creator, create_time, updater, update_time, deleted) |
| | | VALUES (1, 'PCS', '个', TRUE, NULL, 1, 0, 'é»è®¤åä½', '1', NOW(), '1', NOW(), 0) |
| | | ON DUPLICATE KEY UPDATE name = VALUES(name); |
| | | |
| | | -- ===================================================== |
| | | -- 01. è¿ç§»åç±»æ°æ® |
| | | -- ===================================================== |
| | | |
| | | -- 1.1 è¿ç§» ERP 产ååç±»å° MDM ç©æåç±» |
| | | -- ERP åç±»é»è®¤å
³è产åç±»åï¼itemType=2ï¼ |
| | | INSERT INTO mdm_item_category (id, parent_id, code, name, item_type, sort, status, creator, create_time, updater, update_time, deleted) |
| | | SELECT |
| | | id, |
| | | COALESCE(parent_id, 0) AS parent_id, |
| | | code, |
| | | name, |
| | | 2 AS item_type, -- 产åç±»å |
| | | sort, |
| | | status, |
| | | '1' AS creator, |
| | | create_time, |
| | | '1' AS updater, |
| | | update_time, |
| | | 0 AS deleted |
| | | FROM erp_product_category |
| | | WHERE deleted = 0 |
| | | ON DUPLICATE KEY UPDATE |
| | | name = VALUES(name), |
| | | code = VALUES(code); |
| | | |
| | | -- 1.2 è¿ç§» MES ç©æåç±»å° MDM ç©æåç±» |
| | | -- MES åç±»æ ¹æ® itemOrProduct åæ®µå¤æç±»å |
| | | INSERT INTO mdm_item_category (id, parent_id, code, name, item_type, sort, status, remark, creator, create_time, updater, update_time, deleted) |
| | | SELECT |
| | | id + 10000 AS id, -- MES åç±»IDåç§»10000é¿å
å²çª |
| | | COALESCE(parent_id, 0) + |
| | | CASE WHEN parent_id IS NOT NULL AND parent_id > 0 THEN 10000 ELSE 0 END AS parent_id, |
| | | code, |
| | | name, |
| | | CASE item_or_product |
| | | WHEN 'ITEM' THEN 1 -- ç©æ |
| | | WHEN 'PRODUCT' THEN 2 -- 产å |
| | | ELSE NULL -- å
¨é¨ |
| | | END AS item_type, |
| | | sort, |
| | | status, |
| | | remark, |
| | | '1' AS creator, |
| | | create_time, |
| | | '1' AS updater, |
| | | update_time, |
| | | 0 AS deleted |
| | | FROM mes_md_item_type |
| | | WHERE deleted = 0 |
| | | ON DUPLICATE KEY UPDATE |
| | | name = VALUES(name), |
| | | code = VALUES(code); |
| | | |
| | | -- 1.3 è¿ç§» WMS åååç±»å° MDM ç©æåç±» |
| | | INSERT INTO mdm_item_category (id, parent_id, code, name, item_type, sort, status, creator, create_time, updater, update_time, deleted) |
| | | SELECT |
| | | id + 20000 AS id, -- WMS åç±»IDåç§»20000é¿å
å²çª |
| | | COALESCE(parent_id, 0) + |
| | | CASE WHEN parent_id IS NOT NULL AND parent_id > 0 THEN 20000 ELSE 0 END AS parent_id, |
| | | code, |
| | | name, |
| | | 1 AS item_type, -- é»è®¤ç©æç±»å |
| | | sort, |
| | | status, |
| | | '1' AS creator, |
| | | create_time, |
| | | '1' AS updater, |
| | | update_time, |
| | | 0 AS deleted |
| | | FROM wms_item_category |
| | | WHERE deleted = 0 |
| | | ON DUPLICATE KEY UPDATE |
| | | name = VALUES(name), |
| | | code = VALUES(code); |
| | | |
| | | -- ===================================================== |
| | | -- 02. è¿ç§»è®¡éå使°æ® |
| | | -- ===================================================== |
| | | |
| | | -- 2.1 è¿ç§» ERP 计éåä½å° MDMï¼ID ä» 100 å¼å§ï¼ |
| | | INSERT INTO mdm_unit_measure (id, code, name, primary_flag, primary_id, change_rate, status, remark, creator, create_time, updater, update_time, deleted) |
| | | SELECT |
| | | id + 100 AS id, -- ERP åä½IDåç§»100é¿å
ä¸é»è®¤åä½å²çª |
| | | name AS code, -- ERP å使²¡æç¼ç ï¼ä½¿ç¨åç§°ä½ä¸ºç¼ç |
| | | name, |
| | | TRUE AS primary_flag, -- é»è®¤ä¸ºä¸»åä½ |
| | | NULL AS primary_id, |
| | | 1 AS change_rate, |
| | | status, |
| | | NULL AS remark, |
| | | '1' AS creator, |
| | | create_time, |
| | | '1' AS updater, |
| | | update_time, |
| | | 0 AS deleted |
| | | FROM erp_product_unit |
| | | WHERE deleted = 0 |
| | | ON DUPLICATE KEY UPDATE |
| | | name = VALUES(name); |
| | | |
| | | -- 2.2 è¿ç§» MES 计éåä½å° MDMï¼ID ä» 1000 å¼å§ï¼ |
| | | INSERT INTO mdm_unit_measure (id, code, name, primary_flag, primary_id, change_rate, status, remark, creator, create_time, updater, update_time, deleted) |
| | | SELECT |
| | | id + 1000 AS id, -- MES åä½IDåç§»1000é¿å
å²çª |
| | | code, |
| | | name, |
| | | COALESCE(primary_flag, FALSE) AS primary_flag, |
| | | CASE WHEN primary_id IS NOT NULL THEN primary_id + 1000 ELSE NULL END AS primary_id, |
| | | change_rate, |
| | | status, |
| | | remark, |
| | | '1' AS creator, |
| | | create_time, |
| | | '1' AS updater, |
| | | update_time, |
| | | 0 AS deleted |
| | | FROM mes_md_unit_measure |
| | | WHERE deleted = 0 |
| | | ON DUPLICATE KEY UPDATE |
| | | name = VALUES(name), |
| | | code = VALUES(code); |
| | | |
| | | -- ===================================================== |
| | | -- 03. è¿ç§»åçæ°æ® |
| | | -- ===================================================== |
| | | |
| | | -- 3.1 è¿ç§» WMS åçå° MDM |
| | | INSERT INTO mdm_brand (id, code, name, status, remark, creator, create_time, updater, update_time, deleted) |
| | | SELECT |
| | | id, |
| | | code, |
| | | name, |
| | | 0 AS status, -- é»è®¤å¯ç¨ |
| | | NULL AS remark, |
| | | '1' AS creator, |
| | | create_time, |
| | | '1' AS updater, |
| | | update_time, |
| | | 0 AS deleted |
| | | FROM wms_item_brand |
| | | WHERE deleted = 0 |
| | | ON DUPLICATE KEY UPDATE |
| | | name = VALUES(name), |
| | | code = VALUES(code); |
| | | |
| | | -- ===================================================== |
| | | -- 04. æ°æ®éªè¯ |
| | | -- ===================================================== |
| | | |
| | | -- éªè¯åç±»æ°æ®è¿ç§» |
| | | SELECT 'ERPåç±»è¿ç§»' AS source, |
| | | (SELECT COUNT(*) FROM erp_product_category WHERE deleted = 0) AS original_count, |
| | | (SELECT COUNT(*) FROM mdm_item_category WHERE id < 10000 AND deleted = 0) AS migrated_count; |
| | | |
| | | SELECT 'MESåç±»è¿ç§»' AS source, |
| | | (SELECT COUNT(*) FROM mes_md_item_type WHERE deleted = 0) AS original_count, |
| | | (SELECT COUNT(*) FROM mdm_item_category WHERE id >= 10000 AND id < 20000 AND deleted = 0) AS migrated_count; |
| | | |
| | | SELECT 'WMSåç±»è¿ç§»' AS source, |
| | | (SELECT COUNT(*) FROM wms_item_category WHERE deleted = 0) AS original_count, |
| | | (SELECT COUNT(*) FROM mdm_item_category WHERE id >= 20000 AND deleted = 0) AS migrated_count; |
| | | |
| | | -- éªè¯å使°æ®è¿ç§» |
| | | SELECT 'ERPåä½è¿ç§»' AS source, |
| | | (SELECT COUNT(*) FROM erp_product_unit WHERE deleted = 0) AS original_count, |
| | | (SELECT COUNT(*) FROM mdm_unit_measure WHERE id >= 100 AND id < 1000 AND deleted = 0) AS migrated_count; |
| | | |
| | | SELECT 'MESåä½è¿ç§»' AS source, |
| | | (SELECT COUNT(*) FROM mes_md_unit_measure WHERE deleted = 0) AS original_count, |
| | | (SELECT COUNT(*) FROM mdm_unit_measure WHERE id >= 1000 AND deleted = 0) AS migrated_count; |
| | | |
| | | -- éªè¯åçæ°æ®è¿ç§» |
| | | SELECT 'WMSåçè¿ç§»' AS source, |
| | | (SELECT COUNT(*) FROM wms_item_brand WHERE deleted = 0) AS original_count, |
| | | (SELECT COUNT(*) FROM mdm_brand WHERE deleted = 0) AS migrated_count; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- MDM ä¸»æ°æ®è¿ç§» - 第äºé¶æ®µï¼ç©ææ°æ®è¿ç§» |
| | | -- æ§è¡é¡ºåºï¼å
æ§è¡ç¬¬ä¸é¶æ®µ SQL |
| | | -- éç¨åºæ¯ï¼æ°é¡¹ç®åå§åï¼æ åå²ä¸å¡æ°æ® |
| | | -- ===================================================== |
| | | |
| | | -- ===================================================== |
| | | -- 01. è¿ç§» MES ç©ææ°æ® |
| | | -- ===================================================== |
| | | |
| | | -- MES ç©æç±»å为 itemType=1ï¼ç©æï¼ |
| | | INSERT INTO mdm_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 |
| | | m.id AS id, |
| | | m.code, |
| | | m.name, |
| | | NULL AS bar_code, -- MES ç©ææ²¡ææ¡ç åæ®µ |
| | | m.specification, |
| | | -- MES åç±»IDåç§»äº10000 |
| | | m.item_type_id + 10000 AS category_id, |
| | | -- MES åä½IDåç§»äº1000 |
| | | m.unit_measure_id + 1000 AS unit_measure_id, |
| | | NULL AS brand_id, |
| | | 1 AS item_type, -- ç©æç±»å |
| | | m.status, |
| | | NULL AS purchase_price, |
| | | NULL AS sales_price, |
| | | NULL AS cost_price, |
| | | NULL AS min_price, |
| | | NULL AS safety_stock, |
| | | m.min_stock, |
| | | m.max_stock, |
| | | NULL AS min_order_qty, |
| | | NULL AS lead_time, |
| | | COALESCE(m.batch_flag, FALSE) AS is_batch_managed, |
| | | FALSE AS is_serial_managed, |
| | | NULL AS barcode_rule_id, |
| | | NULL AS expiry_day, |
| | | COALESCE(m.high_value, FALSE) AS high_value, |
| | | NULL AS weight, |
| | | m.remark, |
| | | '1' AS creator, |
| | | m.create_time, |
| | | '1' AS updater, |
| | | m.update_time, |
| | | 0 AS deleted |
| | | FROM mes_md_item m |
| | | WHERE m.deleted = 0 |
| | | ON DUPLICATE KEY UPDATE |
| | | name = VALUES(name), |
| | | code = VALUES(code); |
| | | |
| | | -- ===================================================== |
| | | -- 02. è¿ç§» ERP äº§åæ°æ® |
| | | -- ===================================================== |
| | | |
| | | -- ERP 产åç±»å为 itemType=2ï¼äº§åï¼ |
| | | INSERT INTO mdm_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 |
| | | p.id AS id, |
| | | p.bar_code AS code, -- ERP ä½¿ç¨æ¡ç ä½ä¸ºç¼ç |
| | | p.name, |
| | | p.bar_code, |
| | | p.standard AS specification, |
| | | -- ERP åç±»IDæ åç§» |
| | | p.category_id, |
| | | -- ERP åä½IDåç§»äº100 |
| | | p.unit_id + 100 AS unit_measure_id, |
| | | NULL AS brand_id, |
| | | 2 AS item_type, -- 产åç±»å |
| | | p.status, |
| | | p.purchase_price, |
| | | p.sale_price AS sales_price, |
| | | NULL AS cost_price, |
| | | p.min_price, |
| | | NULL AS safety_stock, |
| | | NULL AS min_stock, |
| | | NULL AS max_stock, |
| | | NULL AS min_order_qty, |
| | | NULL AS lead_time, |
| | | FALSE AS is_batch_managed, |
| | | FALSE AS is_serial_managed, |
| | | NULL AS barcode_rule_id, |
| | | p.expiry_day, |
| | | FALSE AS high_value, |
| | | p.weight, |
| | | p.remark, |
| | | '1' AS creator, |
| | | p.create_time, |
| | | '1' AS updater, |
| | | p.update_time, |
| | | 0 AS deleted |
| | | FROM erp_product p |
| | | WHERE p.deleted = 0 |
| | | ON DUPLICATE KEY UPDATE |
| | | name = VALUES(name), |
| | | bar_code = VALUES(bar_code); |
| | | |
| | | -- ===================================================== |
| | | -- 03. è¿ç§» WMS ååæ°æ® |
| | | -- ===================================================== |
| | | |
| | | -- WMS ååç±»å为 itemType=1ï¼ç©æï¼ |
| | | -- 注æï¼WMS ååç unit åæ®µæ¯å符串ï¼éè¦å¹é
MDM åä½åç§°ï¼æ¾ä¸å°å使ç¨é»è®¤åä½ï¼id=1ï¼ |
| | | INSERT INTO mdm_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 |
| | | w.id + 30000 AS id, -- WMS ååIDåç§»30000é¿å
å²çª |
| | | w.code, |
| | | w.name, |
| | | NULL AS bar_code, |
| | | NULL AS specification, |
| | | -- WMS åç±»IDåç§»äº20000 |
| | | w.category_id + 20000 AS category_id, |
| | | -- WMS åååä½ä¸ºå符串ï¼éå¹é
MDMåä½åç§°ï¼æ¾ä¸å°å使ç¨é»è®¤åä½ |
| | | COALESCE( |
| | | (SELECT id FROM mdm_unit_measure WHERE name = w.unit AND deleted = 0 LIMIT 1), |
| | | 1 -- é»è®¤åä½ID |
| | | ) AS unit_measure_id, |
| | | -- WMS åçIDæ åç§» |
| | | w.brand_id, |
| | | 1 AS item_type, -- é»è®¤ç©æç±»å |
| | | 0 AS status, -- é»è®¤å¯ç¨ |
| | | NULL AS purchase_price, |
| | | NULL AS sales_price, |
| | | NULL AS cost_price, |
| | | NULL AS min_price, |
| | | NULL AS safety_stock, |
| | | NULL AS min_stock, |
| | | NULL AS max_stock, |
| | | NULL AS min_order_qty, |
| | | NULL AS lead_time, |
| | | FALSE AS is_batch_managed, |
| | | FALSE AS is_serial_managed, |
| | | NULL AS barcode_rule_id, |
| | | NULL AS expiry_day, |
| | | FALSE AS high_value, |
| | | NULL AS weight, |
| | | w.remark, |
| | | '1' AS creator, |
| | | w.create_time, |
| | | '1' AS updater, |
| | | w.update_time, |
| | | 0 AS deleted |
| | | FROM wms_item w |
| | | WHERE w.deleted = 0 |
| | | ON DUPLICATE KEY UPDATE |
| | | name = VALUES(name), |
| | | code = VALUES(code); |
| | | |
| | | -- ===================================================== |
| | | -- 04. è¿ç§» WMS SKU æ°æ®å¹¶å建 MDM SKU |
| | | -- ===================================================== |
| | | |
| | | -- è¿ç§» WMS SKU å° MDM SKU |
| | | INSERT INTO mdm_item_sku (id, item_id, code, name, bar_code, length, width, height, |
| | | gross_weight, net_weight, cost_price, sale_price, status, remark, |
| | | creator, create_time, updater, update_time, deleted) |
| | | SELECT |
| | | s.id + 40000 AS id, -- SKU IDåç§»40000é¿å
å²çª |
| | | -- WMS ååIDåç§»äº30000 |
| | | s.item_id + 30000 AS item_id, |
| | | s.code, |
| | | s.name, |
| | | s.bar_code, |
| | | s.length, |
| | | s.width, |
| | | s.height, |
| | | s.gross_weight, |
| | | s.net_weight, |
| | | s.cost_price, |
| | | s.selling_price AS sale_price, |
| | | 0 AS status, |
| | | NULL AS remark, |
| | | '1' AS creator, |
| | | s.create_time, |
| | | '1' AS updater, |
| | | s.update_time, |
| | | 0 AS deleted |
| | | FROM wms_item_sku s |
| | | WHERE s.deleted = 0 |
| | | ON DUPLICATE KEY UPDATE |
| | | name = VALUES(name), |
| | | code = VALUES(code); |
| | | |
| | | -- ===================================================== |
| | | -- 05. 为 MES/ERP ç©æå建é»è®¤ SKU |
| | | -- ===================================================== |
| | | |
| | | -- 为 MES ç©æå建é»è®¤ SKUï¼å¦æä¸åå¨ï¼ |
| | | INSERT INTO mdm_item_sku (item_id, code, name, bar_code, length, width, height, |
| | | gross_weight, net_weight, cost_price, sale_price, status, remark, |
| | | creator, create_time, updater, update_time, deleted) |
| | | SELECT |
| | | m.id AS item_id, |
| | | CONCAT(m.code, '-DEFAULT') AS code, |
| | | CONCAT(m.name, '-é»è®¤SKU') AS name, |
| | | NULL AS bar_code, |
| | | NULL AS length, |
| | | NULL AS width, |
| | | NULL AS height, |
| | | NULL AS gross_weight, |
| | | NULL AS net_weight, |
| | | NULL AS cost_price, |
| | | NULL AS sale_price, |
| | | 0 AS status, |
| | | 'ç³»ç»èªå¨å建' AS remark, |
| | | '1' AS creator, |
| | | NOW() AS create_time, |
| | | '1' AS updater, |
| | | NOW() AS update_time, |
| | | 0 AS deleted |
| | | FROM mdm_item m |
| | | WHERE m.item_type = 1 -- MES ç©æ |
| | | AND m.deleted = 0 |
| | | AND m.id < 30000 -- æé¤ WMS ååï¼å·²æ SKUï¼ |
| | | AND NOT EXISTS ( |
| | | SELECT 1 FROM mdm_item_sku s WHERE s.item_id = m.id AND s.deleted = 0 |
| | | ); |
| | | |
| | | -- 为 ERP 产åå建é»è®¤ SKUï¼å¦æä¸åå¨ï¼ |
| | | INSERT INTO mdm_item_sku (item_id, code, name, bar_code, length, width, height, |
| | | gross_weight, net_weight, cost_price, sale_price, status, remark, |
| | | creator, create_time, updater, update_time, deleted) |
| | | SELECT |
| | | p.id AS item_id, |
| | | CONCAT(p.bar_code, '-DEFAULT') AS code, |
| | | CONCAT(p.name, '-é»è®¤SKU') AS name, |
| | | p.bar_code, |
| | | NULL AS length, |
| | | NULL AS width, |
| | | NULL AS height, |
| | | NULL AS gross_weight, |
| | | NULL AS net_weight, |
| | | NULL AS cost_price, |
| | | NULL AS sale_price, |
| | | 0 AS status, |
| | | 'ç³»ç»èªå¨å建' AS remark, |
| | | '1' AS creator, |
| | | NOW() AS create_time, |
| | | '1' AS updater, |
| | | NOW() AS update_time, |
| | | 0 AS deleted |
| | | FROM mdm_item p |
| | | WHERE p.item_type = 2 -- ERP 产å |
| | | AND p.deleted = 0 |
| | | AND NOT EXISTS ( |
| | | SELECT 1 FROM mdm_item_sku s WHERE s.item_id = p.id AND s.deleted = 0 |
| | | ); |
| | | |
| | | -- ===================================================== |
| | | -- 06. æ°æ®éªè¯ |
| | | -- ===================================================== |
| | | |
| | | -- éªè¯ç©ææ°æ®è¿ç§» |
| | | SELECT 'MESç©æè¿ç§»' AS source, |
| | | (SELECT COUNT(*) FROM mes_md_item WHERE deleted = 0) AS original_count, |
| | | (SELECT COUNT(*) FROM mdm_item WHERE item_type = 1 AND id < 30000 AND deleted = 0) AS migrated_count; |
| | | |
| | | SELECT 'ERP产åè¿ç§»' AS source, |
| | | (SELECT COUNT(*) FROM erp_product WHERE deleted = 0) AS original_count, |
| | | (SELECT COUNT(*) FROM mdm_item WHERE item_type = 2 AND deleted = 0) AS migrated_count; |
| | | |
| | | SELECT 'WMSååè¿ç§»' AS source, |
| | | (SELECT COUNT(*) FROM wms_item WHERE deleted = 0) AS original_count, |
| | | (SELECT COUNT(*) FROM mdm_item WHERE id >= 30000 AND deleted = 0) AS migrated_count; |
| | | |
| | | -- éªè¯ SKU æ°æ® |
| | | SELECT 'SKUæ»æ°' AS metric, COUNT(*) AS count FROM mdm_item_sku WHERE deleted = 0; |
| | | SELECT 'æSKUçç©ææ°' AS metric, COUNT(DISTINCT item_id) AS count FROM mdm_item_sku WHERE deleted = 0; |
| | | |
| | | -- ===================================================== |
| | | -- 07. æ£æ¥ä½¿ç¨é»è®¤åä½ç WMS åå |
| | | -- ===================================================== |
| | | |
| | | -- æ¥ç WMS ååä¸å使 æ³å¹é
çæ
åµ |
| | | SELECT w.id, w.code, w.name, w.unit |
| | | FROM wms_item w |
| | | WHERE w.deleted = 0 |
| | | AND NOT EXISTS ( |
| | | SELECT 1 FROM mdm_unit_measure u WHERE u.name = w.unit AND u.deleted = 0 |
| | | ) |
| | | LIMIT 20; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- MDM ä¸»æ°æ®è¿ç§» - è¡¥å
ï¼æ·»å 缺失çåæ®µ |
| | | -- æ§è¡é¡ºåºï¼å¨ mdm_migration_02_item_data.sql ä¹åæ§è¡ |
| | | -- ===================================================== |
| | | |
| | | -- ===================================================== |
| | | -- 01. æ£æ¥å¹¶æ·»å mes_wm_material_stock 表ç item_type_id åæ®µ |
| | | -- ===================================================== |
| | | |
| | | -- æ·»å item_type_id åæ®µï¼å¦æä¸åå¨ï¼ |
| | | -- MySQL 䏿¯æ IF NOT EXISTS ç¨äº ADD COLUMNï¼ä½¿ç¨åå¨è¿ç¨æç´æ¥æ§è¡ |
| | | -- å
å°è¯æ·»å ï¼å¦æå·²åå¨ä¼æ¥éï¼å¯ä»¥å¿½ç¥ |
| | | |
| | | -- æ¹å¼1ï¼ç´æ¥æ·»å ï¼å¦æå段已åå¨ä¼æ¥éï¼å¿½ç¥å³å¯ï¼ |
| | | ALTER TABLE mes_wm_material_stock ADD COLUMN item_type_id bigint DEFAULT NULL COMMENT 'ç©æåç±»ç¼å·' AFTER id; |
| | | |
| | | -- æ¹å¼2ï¼å¦ææ¹å¼1æ¥éè¯´åæ®µå·²åå¨ï¼è¯´æå段已ç»åå¨ï¼è·³è¿å³å¯ |
| | | |
| | | |
| | | -- ===================================================== |
| | | -- 02. 为 item_type_id å建索å¼ï¼å¯éï¼ |
| | | -- ===================================================== |
| | | |
| | | -- å建索å¼ï¼å¦æä¸åå¨ï¼ |
| | | -- CREATE INDEX idx_item_type_id ON mes_wm_material_stock(item_type_id); |
| | | |
| | | |
| | | -- ===================================================== |
| | | -- 03. æ´æ°åºå表ä¸ç item_type_id |
| | | -- æ ¹æ® item_id å
³è mes_md_item 表è·å item_type_id |
| | | -- ===================================================== |
| | | |
| | | -- ä»ç©æè¡¨è·ååç±»IDå¹¶æ´æ°å°åºå表 |
| | | UPDATE mes_wm_material_stock s |
| | | INNER JOIN mes_md_item i ON s.item_id = i.id |
| | | SET s.item_type_id = i.item_type_id + 10000 -- MDMåç±»IDåç§»10000 |
| | | WHERE s.item_type_id IS NULL |
| | | AND s.deleted = 0; |
| | | |
| | | -- ===================================================== |
| | | -- 04. éªè¯ç»æ |
| | | -- ===================================================== |
| | | |
| | | -- æ¥çåºåè¡¨åæ®µ |
| | | SELECT * FROM mes_wm_material_stock LIMIT 5; |
| | | |
| | | -- éªè¯ item_type_id æ¯å¦æ´æ° |
| | | SELECT COUNT(*) AS updated_count |
| | | FROM mes_wm_material_stock |
| | | WHERE item_type_id IS NOT NULL AND item_type_id >= 10000 AND deleted = 0; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- MDM ä¸»æ°æ®è¿ç§» - è¡¥å
ï¼ä¿®æ¹å段约æ |
| | | -- æ§è¡é¡ºåºï¼å¨ mdm_schema.sql ä¹åæ§è¡ï¼å¦æè¡¨å·²åå¨ï¼ |
| | | -- ===================================================== |
| | | |
| | | -- ä¿®æ¹ mdm_item è¡¨åæ®µçº¦æï¼å
许 category_id å unit_measure_id 为空 |
| | | ALTER TABLE mdm_item MODIFY COLUMN category_id bigint DEFAULT NULL COMMENT 'ç©æåç±»ç¼å·'; |
| | | ALTER TABLE mdm_item MODIFY COLUMN unit_measure_id bigint DEFAULT NULL COMMENT '计éåä½ç¼å·'; |
| | | |
| | | -- 妿éè¦å é¤ brand_id åæ®µ |
| | | ALTER TABLE mdm_item DROP COLUMN IF EXISTS brand_id; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- MDM ä¸»æ°æ®æ¨¡å - æ°æ®åºè¡¨ç»æ |
| | | -- æ§è¡é¡ºåºï¼å
æ§è¡æ¤èæ¬å建表ï¼åæ§è¡æ°æ®è¿ç§»èæ¬ |
| | | -- ===================================================== |
| | | |
| | | -- ===================================================== |
| | | -- 01. ç©æå类表 |
| | | -- ===================================================== |
| | | DROP TABLE IF EXISTS `mdm_item_category`; |
| | | CREATE TABLE `mdm_item_category` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'åç±»ç¼å·', |
| | | `parent_id` bigint NOT NULL DEFAULT 0 COMMENT 'ç¶åç±»ç¼å·ï¼æ ¹èç¹=0ï¼', |
| | | `code` varchar(50) DEFAULT NULL COMMENT 'åç±»ç¼ç ', |
| | | `name` varchar(100) NOT NULL COMMENT 'åç±»åç§°', |
| | | `item_type` tinyint DEFAULT NULL COMMENT 'éç¨ç©æç±»åï¼1:ç©æ 2:产å 3:åæå 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`), |
| | | KEY `idx_parent_id` (`parent_id`), |
| | | KEY `idx_code` (`code`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='MDM ç©æå类表'; |
| | | |
| | | -- ===================================================== |
| | | -- 02. 计éåä½è¡¨ |
| | | -- ===================================================== |
| | | DROP TABLE IF EXISTS `mdm_unit_measure`; |
| | | CREATE TABLE `mdm_unit_measure` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'åä½ç¼å·', |
| | | `code` varchar(50) NOT NULL COMMENT 'åä½ç¼ç ', |
| | | `name` varchar(50) NOT NULL COMMENT 'åä½åç§°', |
| | | `primary_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦ä¸»åä½', |
| | | `primary_id` bigint DEFAULT NULL COMMENT '主åä½ç¼å·', |
| | | `change_rate` decimal(24,6) DEFAULT 1.000000 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`, `deleted`), |
| | | KEY `idx_name` (`name`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='MDM 计éåä½è¡¨'; |
| | | |
| | | -- ===================================================== |
| | | -- 03. åç表 |
| | | -- ===================================================== |
| | | DROP TABLE IF EXISTS `mdm_brand`; |
| | | CREATE TABLE `mdm_brand` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'åçç¼å·', |
| | | `code` varchar(50) NOT NULL COMMENT 'åçç¼ç ', |
| | | `name` varchar(100) 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`, `deleted`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='MDM åç表'; |
| | | |
| | | -- ===================================================== |
| | | -- 04. ç©æä¸»æ°æ®è¡¨ |
| | | -- ===================================================== |
| | | DROP TABLE IF EXISTS `mdm_item`; |
| | | CREATE TABLE `mdm_item` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç©æç¼å·', |
| | | `code` varchar(50) NOT NULL COMMENT 'ç©æç¼ç ', |
| | | `name` varchar(200) NOT NULL COMMENT 'ç©æåç§°', |
| | | `bar_code` varchar(100) DEFAULT NULL COMMENT 'ç©ææ¡ç ', |
| | | `specification` varchar(200) DEFAULT NULL COMMENT 'è§æ ¼åå·', |
| | | `category_id` bigint DEFAULT NULL COMMENT 'ç©æåç±»ç¼å·', |
| | | `unit_measure_id` bigint DEFAULT NULL COMMENT '计éåä½ç¼å·', |
| | | `item_type` tinyint NOT NULL DEFAULT 1 COMMENT 'ç©æç±»åï¼1:ç©æ 2:产å 3:åæåï¼', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0æ£å¸¸ 1åç¨ï¼', |
| | | `purchase_price` decimal(24,2) DEFAULT NULL COMMENT 'éè´ä»·', |
| | | `sales_price` decimal(24,2) DEFAULT NULL COMMENT 'éå®ä»·', |
| | | `cost_price` decimal(24,2) DEFAULT NULL COMMENT 'ææ¬ä»·', |
| | | `min_price` decimal(24,2) 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) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦æ¹æ¬¡ç®¡ç', |
| | | `is_serial_managed` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦åºåå·ç®¡ç', |
| | | `barcode_rule_id` bigint DEFAULT NULL COMMENT 'æ¡ç è§åID', |
| | | `expiry_day` int DEFAULT NULL COMMENT 'ä¿è´¨æå¤©æ°', |
| | | `high_value` bit(1) NOT NULL 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`, `deleted`), |
| | | KEY `idx_name` (`name`), |
| | | KEY `idx_category_id` (`category_id`), |
| | | KEY `idx_item_type` (`item_type`), |
| | | KEY `idx_status` (`status`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='MDM ç©æä¸»æ°æ®è¡¨'; |
| | | |
| | | -- ===================================================== |
| | | -- 05. ç©æSKU表 |
| | | -- ===================================================== |
| | | DROP TABLE IF EXISTS `mdm_item_sku`; |
| | | CREATE TABLE `mdm_item_sku` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'SKUç¼å·', |
| | | `item_id` bigint NOT NULL COMMENT 'ç©æç¼å·', |
| | | `code` varchar(50) NOT NULL COMMENT 'SKUç¼ç ', |
| | | `name` varchar(200) NOT NULL COMMENT 'SKUåç§°', |
| | | `bar_code` varchar(100) DEFAULT NULL COMMENT 'SKUæ¡ç ', |
| | | `length` decimal(24,6) DEFAULT NULL COMMENT 'é¿åº¦ï¼cmï¼', |
| | | `width` decimal(24,6) DEFAULT NULL COMMENT '宽度ï¼cmï¼', |
| | | `height` decimal(24,6) DEFAULT NULL COMMENT 'é«åº¦ï¼cmï¼', |
| | | `gross_weight` decimal(24,6) DEFAULT NULL COMMENT 'æ¯éï¼kgï¼', |
| | | `net_weight` decimal(24,6) DEFAULT NULL COMMENT 'åéï¼kgï¼', |
| | | `cost_price` decimal(24,2) DEFAULT NULL COMMENT 'ææ¬ä»·', |
| | | `sale_price` decimal(24,2) 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`, `deleted`), |
| | | KEY `idx_item_id` (`item_id`), |
| | | KEY `idx_bar_code` (`bar_code`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='MDM ç©æSKU表'; |
| | | |
| | | -- ===================================================== |
| | | -- 06. ç©ææ¹æ¬¡å±æ§é
置表 |
| | | -- ===================================================== |
| | | DROP TABLE IF EXISTS `mdm_item_batch_config`; |
| | | CREATE TABLE `mdm_item_batch_config` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'é
ç½®ç¼å·', |
| | | `item_id` bigint NOT NULL COMMENT 'ç©æç¼å·', |
| | | `produce_date_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨çäº§æ¥æ', |
| | | `expire_date_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨å¤±ææ¥æ', |
| | | `receipt_date_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨å
¥åºæ¥æ', |
| | | `vendor_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨ä¾åºå', |
| | | `client_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨å®¢æ·', |
| | | `sales_order_code_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨éå®è®¢åå·', |
| | | `purchase_order_code_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨éè´è®¢åå·', |
| | | `work_order_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨ç产工å', |
| | | `task_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨ç产任å¡', |
| | | `workstation_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨å·¥ä½', |
| | | `tool_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨å·¥è£
夹å
·', |
| | | `mold_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨æ¨¡å
·', |
| | | `lot_number_flag` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¯ç¨æ¹æ¬¡å·', |
| | | `quality_status_flag` bit(1) NOT NULL 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`, `deleted`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='MDM ç©ææ¹æ¬¡å±æ§é
置表'; |
| | | |
| | | -- ===================================================== |
| | | -- 07. ä»åºè¡¨ |
| | | -- ===================================================== |
| | | DROP TABLE IF EXISTS `mdm_warehouse`; |
| | | CREATE TABLE `mdm_warehouse` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ä»åºç¼å·', |
| | | `code` varchar(50) NOT NULL COMMENT 'ä»åºç¼ç ', |
| | | `name` varchar(100) NOT NULL COMMENT 'ä»åºåç§°', |
| | | `type` tinyint DEFAULT NULL COMMENT 'ä»åºç±»å', |
| | | `address` varchar(500) DEFAULT NULL COMMENT 'ä»åºå°å', |
| | | `principal` varchar(64) 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`, `deleted`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='MDM ä»åºè¡¨'; |
| | |
| | | <!-- <module>yudao-module-pay</module>--> |
| | | <!-- <module>yudao-module-mall</module>--> |
| | | <module>yudao-module-crm</module> |
| | | <module>yudao-module-crm-api</module> |
| | | <module>yudao-module-erp</module> |
| | | <module>yudao-module-erp-api</module> |
| | | <!-- <module>yudao-module-iot</module>--> |
| | | <module>yudao-module-mes</module> |
| | | <module>yudao-module-wms</module> |
| | | <module>yudao-module-im</module> |
| | | <!-- MDM ä¸»æ°æ®ç®¡ç模å --> |
| | | <module>yudao-module-mdm-api</module> |
| | | <module>yudao-module-mdm</module> |
| | | <!-- 请åè https://doc.iocoder.cn/ai/build/ ææ¡£ï¼å®æ AI 模åçå¯å¨ï¼ï¼ï¼ --> |
| | | <!-- <module>yudao-module-ai</module>--> |
| | | </modules> |
| | |
| | | package cn.iocoder.yudao.framework.common.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum TerminalEnum implements ArrayValuable<Integer> { |
| | | |
| | | UNKNOWN(0, "æªç¥"), // ç®çï¼å¨æ æ³è§£æå° terminal æ¶ï¼ä½¿ç¨å® |
| | |
| | | */ |
| | | private final String name; |
| | | |
| | | TerminalEnum(Integer terminal, String name) { |
| | | this.terminal = terminal; |
| | | this.name = name; |
| | | } |
| | | |
| | | public Integer getTerminal() { |
| | | return terminal; |
| | | } |
| | | |
| | | public String getName() { |
| | | return name; |
| | | } |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | |
| | | new LambdaQueryWrapperX<BpmProcessDefinitionInfoDO>().eq(BpmProcessDefinitionInfoDO::getModelId, modelId)); |
| | | } |
| | | |
| | | default List<BpmProcessDefinitionInfoDO> selectListByCategory(String category) { |
| | | return selectList(new LambdaQueryWrapperX<BpmProcessDefinitionInfoDO>() |
| | | .eq(BpmProcessDefinitionInfoDO::getCategory, category) |
| | | .eq(BpmProcessDefinitionInfoDO::getVisible, true)); |
| | | } |
| | | |
| | | } |
| | |
| | | */ |
| | | Deployment getDeployment(String id); |
| | | |
| | | /** |
| | | * è·å¾æå®åç±»ä¸çæµç¨å®ä¹ä¿¡æ¯å表 |
| | | * |
| | | * @param category åç±»ç¼ç |
| | | * @return æµç¨å®ä¹ä¿¡æ¯å表 |
| | | */ |
| | | List<BpmProcessDefinitionInfoDO> getProcessDefinitionInfoListByCategory(String category); |
| | | |
| | | } |
| | |
| | | return query.list(); |
| | | } |
| | | |
| | | @Override |
| | | public List<BpmProcessDefinitionInfoDO> getProcessDefinitionInfoListByCategory(String category) { |
| | | return processDefinitionMapper.selectListByCategory(category); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?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-crm-api</artifactId> |
| | | <packaging>jar</packaging> |
| | | |
| | | <name>${project.artifactId}</name> |
| | | <description> |
| | | crm 模åä¸ï¼å®¢æ·å
³ç³»ç®¡çç API æ¥å£å®ä¹ï¼ä¾å
¶ä»æ¨¡åå¼ç¨ |
| | | </description> |
| | | |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-common</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Swagger 注解 --> |
| | | <dependency> |
| | | <groupId>org.springdoc</groupId> |
| | | <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> |
| | | <scope>provided</scope> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | </project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.customer; |
| | | |
| | | import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * CRM å®¢æ· API æ¥å£ |
| | | * |
| | | * æä¾ç»å
¶å®æ¨¡åï¼å¦ ERPï¼è°ç¨ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface CrmCustomerApi { |
| | | |
| | | /** |
| | | * è·å¾å®¢æ·ä¿¡æ¯ |
| | | * |
| | | * @param id 客æ·ç¼å· |
| | | * @return 客æ·ä¿¡æ¯ |
| | | */ |
| | | CrmCustomerRespDTO getCustomer(Long id); |
| | | |
| | | /** |
| | | * è·å¾å®¢æ·ä¿¡æ¯å表 |
| | | * |
| | | * @param ids 客æ·ç¼å·å表 |
| | | * @return 客æ·ä¿¡æ¯å表 |
| | | */ |
| | | List<CrmCustomerRespDTO> getCustomerList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾å®¢æ·ä¿¡æ¯ Map |
| | | * |
| | | * @param ids 客æ·ç¼å·å表 |
| | | * @return 客æ·ä¿¡æ¯ Map |
| | | */ |
| | | Map<Long, CrmCustomerRespDTO> getCustomerMap(Collection<Long> ids); |
| | | |
| | | /** |
| | | * æ ¡éªå®¢æ·æ¯å¦åå¨ |
| | | * |
| | | * @param id 客æ·ç¼å· |
| | | * @return 客æ·ä¿¡æ¯ï¼æ ¡éªéè¿ï¼ |
| | | */ |
| | | CrmCustomerRespDTO validateCustomer(Long id); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.customer.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * CRM å®¢æ· Response DTO |
| | | * |
| | | * æä¾ç»å
¶å®æ¨¡åï¼å¦ ERPï¼ä½¿ç¨ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Data |
| | | public class CrmCustomerRespDTO { |
| | | |
| | | /** |
| | | * ç¼å· |
| | | */ |
| | | private Long id; |
| | | |
| | | /** |
| | | * 客æ·åç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * ææº |
| | | */ |
| | | private String mobile; |
| | | /** |
| | | * çµè¯ |
| | | */ |
| | | private String telephone; |
| | | /** |
| | | * QQ |
| | | */ |
| | | private String qq; |
| | | /** |
| | | * wechat |
| | | */ |
| | | private String wechat; |
| | | /** |
| | | * email |
| | | */ |
| | | private String email; |
| | | |
| | | /** |
| | | * æå¨å° |
| | | */ |
| | | private Integer areaId; |
| | | /** |
| | | * 详ç»å°å |
| | | */ |
| | | private String detailAddress; |
| | | |
| | | /** |
| | | * æå±è¡ä¸ |
| | | */ |
| | | private Integer industryId; |
| | | /** |
| | | * 客æ·ç级 |
| | | */ |
| | | private Integer level; |
| | | /** |
| | | * å®¢æ·æ¥æº |
| | | */ |
| | | private Integer source; |
| | | |
| | | /** |
| | | * è´è´£äººçç¨æ·ç¼å· |
| | | */ |
| | | private Long ownerUserId; |
| | | /** |
| | | * æä¸ºè´è´£äººçæ¶é´ |
| | | */ |
| | | private LocalDateTime ownerTime; |
| | | |
| | | /** |
| | | * éå®ç¶æ |
| | | */ |
| | | private Boolean lockStatus; |
| | | /** |
| | | * æäº¤ç¶æ |
| | | */ |
| | | private Boolean dealStatus; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.report; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.crm.api.report.dto.CrmBusinessAnalyzeRespDTO; |
| | | import cn.iocoder.yudao.module.crm.api.report.dto.CrmContractAnalyzeRespDTO; |
| | | import cn.iocoder.yudao.module.crm.api.report.dto.CrmCustomerAnalyzeRespDTO; |
| | | import cn.iocoder.yudao.module.crm.api.report.dto.CrmSalesFunnelRespDTO; |
| | | import cn.iocoder.yudao.module.crm.api.report.dto.CrmSalesPerformanceRespDTO; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * CRM è¥éæ¥è¡¨ API æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface CrmReportApi { |
| | | |
| | | String PREFIX = "/rpc-api/crm/report"; |
| | | |
| | | /** |
| | | * è·å客æ·åæç»è®¡ |
| | | * |
| | | * @param startTime å¼å§æ¶é´ |
| | | * @param endTime ç»ææ¶é´ |
| | | * @return ç»è®¡æ°æ® |
| | | */ |
| | | CommonResult<CrmCustomerAnalyzeRespDTO> getCustomerAnalyze(LocalDateTime startTime, LocalDateTime endTime); |
| | | |
| | | /** |
| | | * è·ååæºåæç»è®¡ |
| | | * |
| | | * @param startTime å¼å§æ¶é´ |
| | | * @param endTime ç»ææ¶é´ |
| | | * @return ç»è®¡æ°æ® |
| | | */ |
| | | CommonResult<CrmBusinessAnalyzeRespDTO> getBusinessAnalyze(LocalDateTime startTime, LocalDateTime endTime); |
| | | |
| | | /** |
| | | * è·ååååæç»è®¡ |
| | | * |
| | | * @param startTime å¼å§æ¶é´ |
| | | * @param endTime ç»ææ¶é´ |
| | | * @return ç»è®¡æ°æ® |
| | | */ |
| | | CommonResult<CrmContractAnalyzeRespDTO> getContractAnalyze(LocalDateTime startTime, LocalDateTime endTime); |
| | | |
| | | /** |
| | | * è·åé宿¼æç»è®¡ |
| | | * |
| | | * @return ç»è®¡æ°æ® |
| | | */ |
| | | CommonResult<CrmSalesFunnelRespDTO> getSalesFunnel(); |
| | | |
| | | /** |
| | | * è·åéå®ä¸ç»©ç»è®¡ |
| | | * |
| | | * @param startTime å¼å§æ¶é´ |
| | | * @param endTime ç»ææ¶é´ |
| | | * @return ç»è®¡æ°æ® |
| | | */ |
| | | CommonResult<CrmSalesPerformanceRespDTO> getSalesPerformance(LocalDateTime startTime, LocalDateTime endTime); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.report.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * CRM åæºåæç»è®¡ Response DTO |
| | | */ |
| | | @Schema(description = "RPC æå¡ - CRM åæºåæç»è®¡ Response DTO") |
| | | @Data |
| | | public class CrmBusinessAnalyzeRespDTO { |
| | | |
| | | @Schema(description = "åæºæ»æ°") |
| | | private Long totalCount; |
| | | |
| | | @Schema(description = "æ°å¢åæºæ°ï¼ä»æ¥ï¼") |
| | | private Long todayCount; |
| | | |
| | | @Schema(description = "åæºæ»éé¢") |
| | | private BigDecimal totalPrice; |
| | | |
| | | @Schema(description = "æäº¤åæºæ°") |
| | | private Long successCount; |
| | | |
| | | @Schema(description = "æäº¤åæºéé¢") |
| | | private BigDecimal successPrice; |
| | | |
| | | @Schema(description = "åæºè½¬åçï¼ç¾åæ¯ï¼") |
| | | private BigDecimal successRate; |
| | | |
| | | @Schema(description = "è¿è¡ä¸åæºæ°") |
| | | private Long processingCount; |
| | | |
| | | @Schema(description = "å¤±è´¥åæºæ°") |
| | | private Long failCount; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.report.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * CRM åååæç»è®¡ Response DTO |
| | | */ |
| | | @Schema(description = "RPC æå¡ - CRM åååæç»è®¡ Response DTO") |
| | | @Data |
| | | public class CrmContractAnalyzeRespDTO { |
| | | |
| | | @Schema(description = "ååæ»æ°") |
| | | private Long totalCount; |
| | | |
| | | @Schema(description = "æ°å¢ååæ°ï¼ä»æ¥ï¼") |
| | | private Long todayCount; |
| | | |
| | | @Schema(description = "ååæ»éé¢") |
| | | private BigDecimal totalPrice; |
| | | |
| | | @Schema(description = "审æ¹éè¿ååæ°") |
| | | private Long approveCount; |
| | | |
| | | @Schema(description = "审æ¹éè¿ååéé¢") |
| | | private BigDecimal approvePrice; |
| | | |
| | | @Schema(description = "审æ¹ä¸ååæ°") |
| | | private Long processCount; |
| | | |
| | | @Schema(description = "已忬¾éé¢") |
| | | private BigDecimal receivablePrice; |
| | | |
| | | @Schema(description = "忬¾çï¼ç¾åæ¯ï¼") |
| | | private BigDecimal receivableRate; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.report.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * CRM 客æ·åæç»è®¡ Response DTO |
| | | */ |
| | | @Schema(description = "RPC æå¡ - CRM 客æ·åæç»è®¡ Response DTO") |
| | | @Data |
| | | public class CrmCustomerAnalyzeRespDTO { |
| | | |
| | | @Schema(description = "å®¢æ·æ»æ°") |
| | | private Long totalCount; |
| | | |
| | | @Schema(description = "æ°å¢å®¢æ·æ°ï¼ä»æ¥ï¼") |
| | | private Long todayCount; |
| | | |
| | | @Schema(description = "æäº¤å®¢æ·æ°") |
| | | private Long dealCount; |
| | | |
| | | @Schema(description = "æäº¤çï¼ç¾åæ¯ï¼") |
| | | private BigDecimal dealRate; |
| | | |
| | | @Schema(description = "éå®å®¢æ·æ°") |
| | | private Long lockCount; |
| | | |
| | | @Schema(description = "å
¬æµ·å®¢æ·æ°") |
| | | private Long poolCount; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.report.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * CRM é宿¼æç»è®¡ Response DTO |
| | | */ |
| | | @Schema(description = "RPC æå¡ - CRM é宿¼æç»è®¡ Response DTO") |
| | | @Data |
| | | public class CrmSalesFunnelRespDTO { |
| | | |
| | | @Schema(description = "æ¼æé¶æ®µå表") |
| | | private List<FunnelStage> stages; |
| | | |
| | | @Schema(description = "æ¼æé¶æ®µ") |
| | | @Data |
| | | public static class FunnelStage { |
| | | |
| | | @Schema(description = "é¶æ®µåç§°") |
| | | private String name; |
| | | |
| | | @Schema(description = "æ°é") |
| | | private Long count; |
| | | |
| | | @Schema(description = "éé¢") |
| | | private BigDecimal price; |
| | | |
| | | @Schema(description = "转åçï¼ç¾åæ¯ï¼") |
| | | private BigDecimal conversionRate; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.report.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * CRM éå®ä¸ç»©ç»è®¡ Response DTO |
| | | */ |
| | | @Schema(description = "RPC æå¡ - CRM éå®ä¸ç»©ç»è®¡ Response DTO") |
| | | @Data |
| | | public class CrmSalesPerformanceRespDTO { |
| | | |
| | | @Schema(description = "éå®äººåä¸ç»©å表") |
| | | private List<SalesItem> items; |
| | | |
| | | @Schema(description = "éå®ä¸ç»©é¡¹") |
| | | @Data |
| | | public static class SalesItem { |
| | | |
| | | @Schema(description = "éå®äººåç¼å·") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "éå®äººåå§å") |
| | | private String userName; |
| | | |
| | | @Schema(description = "é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "ååæ°é") |
| | | private Long contractCount; |
| | | |
| | | @Schema(description = "ååéé¢") |
| | | private BigDecimal contractPrice; |
| | | |
| | | @Schema(description = "忬¾éé¢") |
| | | private BigDecimal receivablePrice; |
| | | |
| | | @Schema(description = "åæºæ°é") |
| | | private Long businessCount; |
| | | |
| | | @Schema(description = "åæºéé¢") |
| | | private BigDecimal businessPrice; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.trace; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.crm.api.trace.dto.CrmSaleTraceRespDTO; |
| | | |
| | | /** |
| | | * CRM éå®è¿½æº¯ API æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface CrmSaleTraceApi { |
| | | |
| | | String PREFIX = "/rpc-api/crm/sale-trace"; |
| | | |
| | | /** |
| | | * æ ¹æ®åæºç¼å·è·åé宿µç¨è¿½æº¯ä¿¡æ¯ |
| | | * |
| | | * @param businessId åæºç¼å· |
| | | * @return è¿½æº¯ä¿¡æ¯ |
| | | */ |
| | | CommonResult<CrmSaleTraceRespDTO> getTraceByBusinessId(Long businessId); |
| | | |
| | | /** |
| | | * æ ¹æ®ååç¼å·è·åé宿µç¨è¿½æº¯ä¿¡æ¯ |
| | | * |
| | | * @param contractId ååç¼å· |
| | | * @return è¿½æº¯ä¿¡æ¯ |
| | | */ |
| | | CommonResult<CrmSaleTraceRespDTO> getTraceByContractId(Long contractId); |
| | | |
| | | /** |
| | | * æ ¹æ®å®¢æ·ç¼å·è·åé宿µç¨è¿½æº¯ä¿¡æ¯å表 |
| | | * |
| | | * @param customerId 客æ·ç¼å· |
| | | * @return 追溯信æ¯å表 |
| | | */ |
| | | CommonResult<java.util.List<CrmSaleTraceRespDTO>> getTraceListByCustomerId(Long customerId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.trace.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * CRM é宿µç¨è¿½æº¯ Response DTO |
| | | */ |
| | | @Schema(description = "RPC æå¡ - CRM é宿µç¨è¿½æº¯ Response DTO") |
| | | @Data |
| | | public class CrmSaleTraceRespDTO { |
| | | |
| | | // ========== åæºä¿¡æ¯ ========== |
| | | |
| | | @Schema(description = "åæºç¼å·") |
| | | private Long businessId; |
| | | |
| | | @Schema(description = "åæºåç§°") |
| | | private String businessName; |
| | | |
| | | @Schema(description = "åæºéé¢") |
| | | private BigDecimal businessPrice; |
| | | |
| | | @Schema(description = "åæºç¶æ") |
| | | private String businessStatus; |
| | | |
| | | @Schema(description = "åæºå建æ¶é´") |
| | | private LocalDateTime businessCreateTime; |
| | | |
| | | // ========== 客æ·ä¿¡æ¯ ========== |
| | | |
| | | @Schema(description = "客æ·ç¼å·") |
| | | private Long customerId; |
| | | |
| | | @Schema(description = "客æ·åç§°") |
| | | private String customerName; |
| | | |
| | | // ========== ååä¿¡æ¯ ========== |
| | | |
| | | @Schema(description = "ååç¼å·") |
| | | private Long contractId; |
| | | |
| | | @Schema(description = "åååç§°") |
| | | private String contractName; |
| | | |
| | | @Schema(description = "ååéé¢") |
| | | private BigDecimal contractPrice; |
| | | |
| | | @Schema(description = "ååç¶æ") |
| | | private Integer contractStatus; |
| | | |
| | | @Schema(description = "ååå建æ¶é´") |
| | | private LocalDateTime contractCreateTime; |
| | | |
| | | // ========== éå®è®¢åä¿¡æ¯ ========== |
| | | |
| | | @Schema(description = "éå®è®¢åç¼å·") |
| | | private Long orderId; |
| | | |
| | | @Schema(description = "éå®è®¢ååå·") |
| | | private String orderNo; |
| | | |
| | | @Schema(description = "订åéé¢") |
| | | private BigDecimal orderPrice; |
| | | |
| | | @Schema(description = "订åç¶æ") |
| | | private Integer orderStatus; |
| | | |
| | | @Schema(description = "订åå建æ¶é´") |
| | | private LocalDateTime orderCreateTime; |
| | | |
| | | // ========== åºåºä¿¡æ¯ ========== |
| | | |
| | | @Schema(description = "åºåºåç¼å·") |
| | | private Long outId; |
| | | |
| | | @Schema(description = "åºåºåå·") |
| | | private String outNo; |
| | | |
| | | @Schema(description = "åºåºéé¢") |
| | | private BigDecimal outPrice; |
| | | |
| | | @Schema(description = "åºåºç¶æ") |
| | | private Integer outStatus; |
| | | |
| | | @Schema(description = "åºåºæ¶é´") |
| | | private LocalDateTime outTime; |
| | | |
| | | // ========== 忬¾ä¿¡æ¯ ========== |
| | | |
| | | @Schema(description = "忬¾éé¢") |
| | | private BigDecimal receivablePrice; |
| | | |
| | | @Schema(description = "忬¾è®°å½å表") |
| | | private List<ReceivableItem> receivableItems; |
| | | |
| | | // ========== éè´§ä¿¡æ¯ ========== |
| | | |
| | | @Schema(description = "éè´§éé¢") |
| | | private BigDecimal returnPrice; |
| | | |
| | | /** |
| | | * 忬¾è®°å½é¡¹ |
| | | */ |
| | | @Data |
| | | public static class ReceivableItem { |
| | | |
| | | @Schema(description = "忬¾ç¼å·") |
| | | private Long receivableId; |
| | | |
| | | @Schema(description = "忬¾åå·") |
| | | private String receivableNo; |
| | | |
| | | @Schema(description = "忬¾éé¢") |
| | | private BigDecimal price; |
| | | |
| | | @Schema(description = "忬¾æ¶é´") |
| | | private LocalDateTime receivableTime; |
| | | } |
| | | |
| | | } |
| | |
| | | </description> |
| | | |
| | | <dependencies> |
| | | <!-- CRM API 模å --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-crm-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-system</artifactId> |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- MDM ä¸»æ°æ®ç®¡ç API --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-mdm-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ERP éå®è®¢å API --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-erp-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ä¸å¡ç»ä»¶ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.customer; |
| | | |
| | | import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * CRM å®¢æ· API æ¥å£ |
| | | * |
| | | * æä¾ç»å
¶å®æ¨¡åï¼å¦ ERPï¼è°ç¨ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface CrmCustomerApi { |
| | | |
| | | /** |
| | | * è·å¾å®¢æ·ä¿¡æ¯ |
| | | * |
| | | * @param id 客æ·ç¼å· |
| | | * @return 客æ·ä¿¡æ¯ |
| | | */ |
| | | CrmCustomerRespDTO getCustomer(Long id); |
| | | |
| | | /** |
| | | * è·å¾å®¢æ·ä¿¡æ¯å表 |
| | | * |
| | | * @param ids 客æ·ç¼å·å表 |
| | | * @return 客æ·ä¿¡æ¯å表 |
| | | */ |
| | | List<CrmCustomerRespDTO> getCustomerList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾å®¢æ·ä¿¡æ¯ Map |
| | | * |
| | | * @param ids 客æ·ç¼å·å表 |
| | | * @return 客æ·ä¿¡æ¯ Map |
| | | */ |
| | | Map<Long, CrmCustomerRespDTO> getCustomerMap(Collection<Long> ids); |
| | | |
| | | /** |
| | | * æ ¡éªå®¢æ·æ¯å¦åå¨ |
| | | * |
| | | * @param id 客æ·ç¼å· |
| | | * @return 客æ·ä¿¡æ¯ï¼æ ¡éªéè¿ï¼ |
| | | */ |
| | | CrmCustomerRespDTO validateCustomer(Long id); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.customer; |
| | | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; |
| | | import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * CRM å®¢æ· API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | public class CrmCustomerApiImpl implements CrmCustomerApi { |
| | | |
| | | @Resource |
| | | private CrmCustomerService customerService; |
| | | |
| | | @Override |
| | | public CrmCustomerRespDTO getCustomer(Long id) { |
| | | CrmCustomerDO customer = customerService.getCustomer(id); |
| | | return BeanUtils.toBean(customer, CrmCustomerRespDTO.class); |
| | | } |
| | | |
| | | @Override |
| | | public List<CrmCustomerRespDTO> getCustomerList(Collection<Long> ids) { |
| | | List<CrmCustomerDO> customers = customerService.getCustomerList(ids); |
| | | return BeanUtils.toBean(customers, CrmCustomerRespDTO.class); |
| | | } |
| | | |
| | | @Override |
| | | public Map<Long, CrmCustomerRespDTO> getCustomerMap(Collection<Long> ids) { |
| | | List<CrmCustomerDO> customers = customerService.getCustomerList(ids); |
| | | return customers.stream() |
| | | .collect(java.util.stream.Collectors.toMap( |
| | | CrmCustomerDO::getId, |
| | | customer -> BeanUtils.toBean(customer, CrmCustomerRespDTO.class))); |
| | | } |
| | | |
| | | @Override |
| | | public CrmCustomerRespDTO validateCustomer(Long id) { |
| | | customerService.validateCustomer(id); |
| | | return getCustomer(id); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.customer.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * CRM å®¢æ· Response DTO |
| | | * |
| | | * æä¾ç»å
¶å®æ¨¡åï¼å¦ ERPï¼ä½¿ç¨ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Data |
| | | public class CrmCustomerRespDTO { |
| | | |
| | | /** |
| | | * ç¼å· |
| | | */ |
| | | private Long id; |
| | | |
| | | /** |
| | | * 客æ·åç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * ææº |
| | | */ |
| | | private String mobile; |
| | | /** |
| | | * çµè¯ |
| | | */ |
| | | private String telephone; |
| | | /** |
| | | * QQ |
| | | */ |
| | | private String qq; |
| | | /** |
| | | * wechat |
| | | */ |
| | | private String wechat; |
| | | /** |
| | | * email |
| | | */ |
| | | private String email; |
| | | |
| | | /** |
| | | * æå¨å° |
| | | */ |
| | | private Integer areaId; |
| | | /** |
| | | * 详ç»å°å |
| | | */ |
| | | private String detailAddress; |
| | | |
| | | /** |
| | | * æå±è¡ä¸ |
| | | */ |
| | | private Integer industryId; |
| | | /** |
| | | * 客æ·ç级 |
| | | */ |
| | | private Integer level; |
| | | /** |
| | | * å®¢æ·æ¥æº |
| | | */ |
| | | private Integer source; |
| | | |
| | | /** |
| | | * è´è´£äººçç¨æ·ç¼å· |
| | | */ |
| | | private Long ownerUserId; |
| | | /** |
| | | * æä¸ºè´è´£äººçæ¶é´ |
| | | */ |
| | | private LocalDateTime ownerTime; |
| | | |
| | | /** |
| | | * éå®ç¶æ |
| | | */ |
| | | private Boolean lockStatus; |
| | | /** |
| | | * æäº¤ç¶æ |
| | | */ |
| | | private Boolean dealStatus; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.report; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.crm.api.report.dto.CrmBusinessAnalyzeRespDTO; |
| | | import cn.iocoder.yudao.module.crm.api.report.dto.CrmContractAnalyzeRespDTO; |
| | | import cn.iocoder.yudao.module.crm.api.report.dto.CrmCustomerAnalyzeRespDTO; |
| | | import cn.iocoder.yudao.module.crm.api.report.dto.CrmSalesFunnelRespDTO; |
| | | import cn.iocoder.yudao.module.crm.api.report.dto.CrmSalesPerformanceRespDTO; |
| | | import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessMapper; |
| | | import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper; |
| | | import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper; |
| | | import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | 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.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.time.LocalDateTime; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * CRM è¥éæ¥è¡¨ API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RestController |
| | | @RequestMapping(CrmReportApi.PREFIX) |
| | | @Validated |
| | | public class CrmReportApiImpl implements CrmReportApi { |
| | | |
| | | @Resource |
| | | private CrmCustomerMapper customerMapper; |
| | | @Resource |
| | | private CrmBusinessMapper businessMapper; |
| | | @Resource |
| | | private CrmContractMapper contractMapper; |
| | | @Resource |
| | | private CrmReceivableService receivableService; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | |
| | | @Override |
| | | public CommonResult<CrmCustomerAnalyzeRespDTO> getCustomerAnalyze(LocalDateTime startTime, LocalDateTime endTime) { |
| | | CrmCustomerAnalyzeRespDTO result = new CrmCustomerAnalyzeRespDTO(); |
| | | // å®¢æ·æ»æ° |
| | | result.setTotalCount(customerMapper.selectCount()); |
| | | // 仿¥æ°å¢ |
| | | result.setTodayCount(customerMapper.selectTodayCount()); |
| | | // æäº¤å®¢æ·æ° |
| | | result.setDealCount(customerMapper.selectDealCount()); |
| | | // æäº¤ç |
| | | if (result.getTotalCount() > 0) { |
| | | result.setDealRate(BigDecimal.valueOf(result.getDealCount()) |
| | | .divide(BigDecimal.valueOf(result.getTotalCount()), 4, RoundingMode.HALF_UP) |
| | | .multiply(BigDecimal.valueOf(100))); |
| | | } else { |
| | | result.setDealRate(BigDecimal.ZERO); |
| | | } |
| | | // éå®å®¢æ·æ° |
| | | result.setLockCount(customerMapper.selectLockCount()); |
| | | // å
¬æµ·å®¢æ·æ° |
| | | result.setPoolCount(customerMapper.selectPoolCount()); |
| | | return success(result); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<CrmBusinessAnalyzeRespDTO> getBusinessAnalyze(LocalDateTime startTime, LocalDateTime endTime) { |
| | | CrmBusinessAnalyzeRespDTO result = new CrmBusinessAnalyzeRespDTO(); |
| | | // åæºæ»æ° |
| | | result.setTotalCount(businessMapper.selectCount()); |
| | | // 仿¥æ°å¢ |
| | | result.setTodayCount(businessMapper.selectTodayCount()); |
| | | // åæºæ»éé¢ |
| | | result.setTotalPrice(businessMapper.selectTotalPriceSum()); |
| | | // æäº¤åæºæ° |
| | | result.setSuccessCount(businessMapper.selectSuccessCount()); |
| | | // æäº¤åæºéé¢ |
| | | result.setSuccessPrice(businessMapper.selectSuccessPriceSum()); |
| | | // åæºè½¬åç |
| | | if (result.getTotalCount() > 0) { |
| | | result.setSuccessRate(BigDecimal.valueOf(result.getSuccessCount()) |
| | | .divide(BigDecimal.valueOf(result.getTotalCount()), 4, RoundingMode.HALF_UP) |
| | | .multiply(BigDecimal.valueOf(100))); |
| | | } else { |
| | | result.setSuccessRate(BigDecimal.ZERO); |
| | | } |
| | | // è¿è¡ä¸åæºæ° |
| | | result.setProcessingCount(businessMapper.selectProcessingCount()); |
| | | // å¤±è´¥åæºæ° |
| | | result.setFailCount(businessMapper.selectFailCount()); |
| | | return success(result); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<CrmContractAnalyzeRespDTO> getContractAnalyze(LocalDateTime startTime, LocalDateTime endTime) { |
| | | CrmContractAnalyzeRespDTO result = new CrmContractAnalyzeRespDTO(); |
| | | // ååæ»æ° |
| | | result.setTotalCount(contractMapper.selectCount()); |
| | | // 仿¥æ°å¢ |
| | | result.setTodayCount(contractMapper.selectTodayCount()); |
| | | // ååæ»éé¢ |
| | | result.setTotalPrice(contractMapper.selectTotalPriceSum()); |
| | | // 审æ¹éè¿ååæ° |
| | | result.setApproveCount(contractMapper.selectApproveCount()); |
| | | // 审æ¹éè¿ååéé¢ |
| | | result.setApprovePrice(contractMapper.selectApprovePriceSum()); |
| | | // 审æ¹ä¸ååæ° |
| | | result.setProcessCount(contractMapper.selectProcessCount()); |
| | | // 已忬¾éé¢ |
| | | BigDecimal receivablePrice = receivableService.getReceivablePriceSum(); |
| | | result.setReceivablePrice(receivablePrice != null ? receivablePrice : BigDecimal.ZERO); |
| | | // 忬¾ç |
| | | if (result.getApprovePrice() != null && result.getApprovePrice().compareTo(BigDecimal.ZERO) > 0) { |
| | | result.setReceivableRate(result.getReceivablePrice() |
| | | .divide(result.getApprovePrice(), 4, RoundingMode.HALF_UP) |
| | | .multiply(BigDecimal.valueOf(100))); |
| | | } else { |
| | | result.setReceivableRate(BigDecimal.ZERO); |
| | | } |
| | | return success(result); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<CrmSalesFunnelRespDTO> getSalesFunnel() { |
| | | CrmSalesFunnelRespDTO result = new CrmSalesFunnelRespDTO(); |
| | | List<CrmSalesFunnelRespDTO.FunnelStage> stages = new ArrayList<>(); |
| | | |
| | | // é¶æ®µ1ï¼çº¿ç´¢/å®¢æ· |
| | | Long customerCount = customerMapper.selectCount(); |
| | | stages.add(createStage("客æ·", customerCount, BigDecimal.ZERO)); |
| | | |
| | | // é¶æ®µ2ï¼åæº |
| | | Long businessCount = businessMapper.selectCount(); |
| | | BigDecimal businessPrice = businessMapper.selectTotalPriceSum(); |
| | | stages.add(createStage("åæº", businessCount, businessPrice)); |
| | | |
| | | // é¶æ®µ3ï¼åå |
| | | Long contractCount = contractMapper.selectApproveCount(); |
| | | BigDecimal contractPrice = contractMapper.selectApprovePriceSum(); |
| | | stages.add(createStage("åå", contractCount, contractPrice)); |
| | | |
| | | // é¶æ®µ4ï¼å款 |
| | | BigDecimal receivablePrice = receivableService.getReceivablePriceSum(); |
| | | stages.add(createStage("忬¾", null, receivablePrice)); |
| | | |
| | | // 计ç®è½¬åç |
| | | for (int i = 0; i < stages.size(); i++) { |
| | | if (i == 0) { |
| | | stages.get(i).setConversionRate(BigDecimal.valueOf(100)); |
| | | } else if (customerCount > 0 && stages.get(i).getCount() != null) { |
| | | stages.get(i).setConversionRate(BigDecimal.valueOf(stages.get(i).getCount()) |
| | | .divide(BigDecimal.valueOf(customerCount), 4, RoundingMode.HALF_UP) |
| | | .multiply(BigDecimal.valueOf(100))); |
| | | } else { |
| | | stages.get(i).setConversionRate(BigDecimal.ZERO); |
| | | } |
| | | } |
| | | |
| | | result.setStages(stages); |
| | | return success(result); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<CrmSalesPerformanceRespDTO> getSalesPerformance(LocalDateTime startTime, LocalDateTime endTime) { |
| | | CrmSalesPerformanceRespDTO result = new CrmSalesPerformanceRespDTO(); |
| | | List<CrmSalesPerformanceRespDTO.SalesItem> items = new ArrayList<>(); |
| | | |
| | | // è·åææéå®äººåï¼æååæåæºçè´è´£äººï¼ |
| | | List<Long> userIds = contractMapper.selectOwnerUserIds(); |
| | | userIds.addAll(businessMapper.selectOwnerUserIds()); |
| | | userIds = userIds.stream().distinct().collect(Collectors.toList()); |
| | | |
| | | if (CollUtil.isEmpty(userIds)) { |
| | | result.setItems(items); |
| | | return success(result); |
| | | } |
| | | |
| | | // è·åç¨æ·ä¿¡æ¯ |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); |
| | | |
| | | // è·åé¨é¨ä¿¡æ¯ |
| | | List<Long> deptIds = userMap.values().stream() |
| | | .map(AdminUserRespDTO::getDeptId) |
| | | .filter(id -> id != null) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(deptIds); |
| | | |
| | | for (Long userId : userIds) { |
| | | AdminUserRespDTO user = userMap.get(userId); |
| | | if (user == null) { |
| | | continue; |
| | | } |
| | | |
| | | CrmSalesPerformanceRespDTO.SalesItem item = new CrmSalesPerformanceRespDTO.SalesItem(); |
| | | item.setUserId(userId); |
| | | item.setUserName(user.getNickname()); |
| | | // è·åé¨é¨åç§° |
| | | if (user.getDeptId() != null) { |
| | | DeptRespDTO dept = deptMap.get(user.getDeptId()); |
| | | item.setDeptName(dept != null ? dept.getName() : ""); |
| | | } |
| | | |
| | | // ååæ°éåéé¢ |
| | | item.setContractCount(contractMapper.selectCountByOwnerUserId(userId)); |
| | | item.setContractPrice(contractMapper.selectPriceSumByOwnerUserId(userId)); |
| | | |
| | | // 忬¾éé¢ |
| | | item.setReceivablePrice(receivableService.getReceivablePriceByOwnerUserId(userId)); |
| | | |
| | | // åæºæ°éåéé¢ |
| | | item.setBusinessCount(businessMapper.selectCountByOwnerUserId(userId)); |
| | | item.setBusinessPrice(businessMapper.selectPriceSumByOwnerUserId(userId)); |
| | | |
| | | items.add(item); |
| | | } |
| | | |
| | | result.setItems(items); |
| | | return success(result); |
| | | } |
| | | |
| | | private CrmSalesFunnelRespDTO.FunnelStage createStage(String name, Long count, BigDecimal price) { |
| | | CrmSalesFunnelRespDTO.FunnelStage stage = new CrmSalesFunnelRespDTO.FunnelStage(); |
| | | stage.setName(name); |
| | | stage.setCount(count); |
| | | stage.setPrice(price != null ? price : BigDecimal.ZERO); |
| | | return stage; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.crm.api.trace; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.crm.api.trace.dto.CrmSaleTraceRespDTO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; |
| | | import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessMapper; |
| | | import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper; |
| | | import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; |
| | | import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService; |
| | | import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO; |
| | | 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.math.BigDecimal; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * CRM éå®è¿½æº¯ API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RestController |
| | | @RequestMapping(CrmSaleTraceApi.PREFIX) |
| | | @Validated |
| | | public class CrmSaleTraceApiImpl implements CrmSaleTraceApi { |
| | | |
| | | @Resource |
| | | private CrmBusinessMapper businessMapper; |
| | | @Resource |
| | | private CrmContractMapper contractMapper; |
| | | @Resource |
| | | private CrmCustomerService customerService; |
| | | @Resource |
| | | private CrmReceivableService receivableService; |
| | | @Resource |
| | | private ErpSaleOrderApi saleOrderApi; |
| | | |
| | | @Override |
| | | public CommonResult<CrmSaleTraceRespDTO> getTraceByBusinessId(Long businessId) { |
| | | CrmBusinessDO business = businessMapper.selectById(businessId); |
| | | if (business == null) { |
| | | return success(null); |
| | | } |
| | | CrmSaleTraceRespDTO trace = buildBaseTrace(business.getCustomerId()); |
| | | |
| | | // å¡«å
åæºä¿¡æ¯ |
| | | trace.setBusinessId(business.getId()); |
| | | trace.setBusinessName(business.getName()); |
| | | trace.setBusinessPrice(business.getTotalPrice()); |
| | | trace.setBusinessCreateTime(business.getCreateTime()); |
| | | |
| | | // æ¥è¯¢å
³èåå |
| | | CrmContractDO contract = contractMapper.selectByBusinessId(businessId); |
| | | if (contract != null) { |
| | | fillContractInfo(trace, contract); |
| | | // æ¥è¯¢å
³è订å |
| | | if (contract.getOrderId() != null) { |
| | | fillOrderInfo(trace, contract.getOrderId()); |
| | | } |
| | | } |
| | | |
| | | return success(trace); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<CrmSaleTraceRespDTO> getTraceByContractId(Long contractId) { |
| | | CrmContractDO contract = contractMapper.selectById(contractId); |
| | | if (contract == null) { |
| | | return success(null); |
| | | } |
| | | CrmSaleTraceRespDTO trace = buildBaseTrace(contract.getCustomerId()); |
| | | |
| | | // å¡«å
ååä¿¡æ¯ |
| | | fillContractInfo(trace, contract); |
| | | |
| | | // å¡«å
åæºä¿¡æ¯ |
| | | if (contract.getBusinessId() != null) { |
| | | CrmBusinessDO business = businessMapper.selectById(contract.getBusinessId()); |
| | | if (business != null) { |
| | | trace.setBusinessId(business.getId()); |
| | | trace.setBusinessName(business.getName()); |
| | | trace.setBusinessPrice(business.getTotalPrice()); |
| | | trace.setBusinessCreateTime(business.getCreateTime()); |
| | | } |
| | | } |
| | | |
| | | // æ¥è¯¢å
³è订å |
| | | if (contract.getOrderId() != null) { |
| | | fillOrderInfo(trace, contract.getOrderId()); |
| | | } |
| | | |
| | | return success(trace); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<CrmSaleTraceRespDTO>> getTraceListByCustomerId(Long customerId) { |
| | | CrmCustomerDO customer = customerService.getCustomer(customerId); |
| | | if (customer == null) { |
| | | return success(new ArrayList<>()); |
| | | } |
| | | |
| | | // æ¥è¯¢å®¢æ·ææåå |
| | | List<CrmContractDO> contracts = contractMapper.selectListByCustomerId(customerId); |
| | | if (CollUtil.isEmpty(contracts)) { |
| | | return success(new ArrayList<>()); |
| | | } |
| | | |
| | | List<CrmSaleTraceRespDTO> traces = new ArrayList<>(); |
| | | for (CrmContractDO contract : contracts) { |
| | | CrmSaleTraceRespDTO trace = new CrmSaleTraceRespDTO(); |
| | | trace.setCustomerId(customerId); |
| | | trace.setCustomerName(customer.getName()); |
| | | |
| | | fillContractInfo(trace, contract); |
| | | |
| | | // å¡«å
åæºä¿¡æ¯ |
| | | if (contract.getBusinessId() != null) { |
| | | CrmBusinessDO business = businessMapper.selectById(contract.getBusinessId()); |
| | | if (business != null) { |
| | | trace.setBusinessId(business.getId()); |
| | | trace.setBusinessName(business.getName()); |
| | | trace.setBusinessPrice(business.getTotalPrice()); |
| | | trace.setBusinessCreateTime(business.getCreateTime()); |
| | | } |
| | | } |
| | | |
| | | // æ¥è¯¢å
³è订å |
| | | if (contract.getOrderId() != null) { |
| | | fillOrderInfo(trace, contract.getOrderId()); |
| | | } |
| | | |
| | | traces.add(trace); |
| | | } |
| | | |
| | | return success(traces); |
| | | } |
| | | |
| | | /** |
| | | * æå»ºåºç¡è¿½æº¯ä¿¡æ¯ |
| | | */ |
| | | private CrmSaleTraceRespDTO buildBaseTrace(Long customerId) { |
| | | CrmSaleTraceRespDTO trace = new CrmSaleTraceRespDTO(); |
| | | if (customerId != null) { |
| | | CrmCustomerDO customer = customerService.getCustomer(customerId); |
| | | if (customer != null) { |
| | | trace.setCustomerId(customerId); |
| | | trace.setCustomerName(customer.getName()); |
| | | } |
| | | } |
| | | return trace; |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
ååä¿¡æ¯ |
| | | */ |
| | | private void fillContractInfo(CrmSaleTraceRespDTO trace, CrmContractDO contract) { |
| | | trace.setContractId(contract.getId()); |
| | | trace.setContractName(contract.getName()); |
| | | trace.setContractPrice(contract.getTotalPrice()); |
| | | trace.setContractStatus(contract.getAuditStatus()); |
| | | trace.setContractCreateTime(contract.getCreateTime()); |
| | | |
| | | // 计ç®å款éé¢ |
| | | BigDecimal receivablePrice = receivableService.getReceivablePriceByContractId(contract.getId()); |
| | | trace.setReceivablePrice(receivablePrice != null ? receivablePrice : BigDecimal.ZERO); |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
订åä¿¡æ¯ |
| | | */ |
| | | private void fillOrderInfo(CrmSaleTraceRespDTO trace, Long orderId) { |
| | | ErpSaleOrderRespDTO order = saleOrderApi.getSaleOrder(orderId).getCheckedData(); |
| | | if (order != null) { |
| | | trace.setOrderId(orderId); |
| | | trace.setOrderNo(order.getNo()); |
| | | trace.setOrderPrice(order.getTotalPrice()); |
| | | trace.setOrderStatus(order.getStatus()); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | @ExcelProperty("åæºæ»éé¢") |
| | | private BigDecimal totalPrice; |
| | | |
| | | @Schema(description = "å
³è ERP éå®è®¢åç¼å·", example = "12345") |
| | | private Long orderId; |
| | | @Schema(description = "ERP éå®è®¢ååå·", example = "SO001") |
| | | @ExcelProperty("éå®è®¢ååå·") |
| | | private String orderNo; |
| | | |
| | | @Schema(description = "夿³¨", example = "é便") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | |
| | | .setTotalReceivablePrice(receivablePriceMap.getOrDefault(contract.getId(), BigDecimal.ZERO)))); |
| | | } |
| | | |
| | | @PostMapping("/generate-sale-order") |
| | | @Operation(summary = "æ ¹æ®ååçæéå®è®¢å") |
| | | @Parameter(name = "id", description = "ååç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('crm:contract:update')") |
| | | public CommonResult<Long> generateSaleOrder(@RequestParam("id") Long id) { |
| | | return success(contractService.generateSaleOrder(id, getLoginUserId())); |
| | | } |
| | | |
| | | } |
| | |
| | | @ExcelProperty("已忬¾éé¢") |
| | | private BigDecimal totalReceivablePrice; |
| | | |
| | | @Schema(description = "å
³è ERP éå®è®¢åç¼å·", example = "12345") |
| | | private Long orderId; |
| | | @Schema(description = "ERP éå®è®¢ååå·", example = "SO001") |
| | | @ExcelProperty("éå®è®¢ååå·") |
| | | private String orderNo; |
| | | |
| | | @Schema(description = "客æ·ç¾çº¦äººç¼å·", example = "18546") |
| | | private Long signContactId; |
| | | @Schema(description = "客æ·ç¾çº¦äºº", example = "å°è±") |
| | |
| | | */ |
| | | private BigDecimal totalPrice; |
| | | /** |
| | | * å
³è ERP éå®è®¢åç¼å· |
| | | */ |
| | | private Long orderId; |
| | | /** |
| | | * ERP éå®è®¢ååå· |
| | | */ |
| | | private String orderNo; |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | |
| | | */ |
| | | private BigDecimal totalPrice; |
| | | /** |
| | | * å
³è ERP éå®è®¢åç¼å· |
| | | */ |
| | | private Long orderId; |
| | | /** |
| | | * ERP éå®è®¢ååå· |
| | | */ |
| | | private String orderNo; |
| | | /** |
| | | * 客æ·ç¾çº¦äººï¼éå¿
é¡» |
| | | * |
| | | * å
³è {@link CrmContactDO#getId()} |
| | |
| | | package cn.iocoder.yudao.module.crm.dal.mysql.business; |
| | | |
| | | import cn.hutool.core.date.LocalDateTimeUtil; |
| | | 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.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO; |
| | | import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsFunnelReqVO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; |
| | | import cn.iocoder.yudao.module.crm.enums.business.CrmBusinessEndStatusEnum; |
| | | import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; |
| | | import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | |
| | | .betweenIfPresent(CrmBusinessDO::getCreateTime, pageVO.getTimes())); |
| | | } |
| | | |
| | | // ========== ç»è®¡æ¹æ³ ========== |
| | | |
| | | default Long selectTodayCount() { |
| | | LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); |
| | | LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now()); |
| | | return selectCount(new LambdaQueryWrapperX<CrmBusinessDO>() |
| | | .between(CrmBusinessDO::getCreateTime, beginOfToday, endOfToday)); |
| | | } |
| | | |
| | | default BigDecimal selectTotalPriceSum() { |
| | | LambdaQueryWrapperX<CrmBusinessDO> query = new LambdaQueryWrapperX<>(); |
| | | query.select(CrmBusinessDO::getTotalPrice); |
| | | List<CrmBusinessDO> list = selectList(query); |
| | | return list.stream() |
| | | .map(CrmBusinessDO::getTotalPrice) |
| | | .filter(p -> p != null) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | default Long selectSuccessCount() { |
| | | return selectCount(new LambdaQueryWrapperX<CrmBusinessDO>() |
| | | .eq(CrmBusinessDO::getEndStatus, CrmBusinessEndStatusEnum.WIN.getStatus())); |
| | | } |
| | | |
| | | default BigDecimal selectSuccessPriceSum() { |
| | | LambdaQueryWrapperX<CrmBusinessDO> query = new LambdaQueryWrapperX<>(); |
| | | query.eq(CrmBusinessDO::getEndStatus, CrmBusinessEndStatusEnum.WIN.getStatus()) |
| | | .select(CrmBusinessDO::getTotalPrice); |
| | | List<CrmBusinessDO> list = selectList(query); |
| | | return list.stream() |
| | | .map(CrmBusinessDO::getTotalPrice) |
| | | .filter(p -> p != null) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | default Long selectProcessingCount() { |
| | | return selectCount(new LambdaQueryWrapperX<CrmBusinessDO>() |
| | | .isNull(CrmBusinessDO::getEndStatus)); |
| | | } |
| | | |
| | | default Long selectFailCount() { |
| | | return selectCount(new LambdaQueryWrapperX<CrmBusinessDO>() |
| | | .eq(CrmBusinessDO::getEndStatus, CrmBusinessEndStatusEnum.LOSE.getStatus())); |
| | | } |
| | | |
| | | default List<Long> selectOwnerUserIds() { |
| | | LambdaQueryWrapperX<CrmBusinessDO> query = new LambdaQueryWrapperX<>(); |
| | | query.select(CrmBusinessDO::getOwnerUserId).isNotNull(CrmBusinessDO::getOwnerUserId); |
| | | List<CrmBusinessDO> list = selectList(query); |
| | | return list.stream().map(CrmBusinessDO::getOwnerUserId).distinct().toList(); |
| | | } |
| | | |
| | | default Long selectCountByOwnerUserId(Long ownerUserId) { |
| | | return selectCount(CrmBusinessDO::getOwnerUserId, ownerUserId); |
| | | } |
| | | |
| | | default BigDecimal selectPriceSumByOwnerUserId(Long ownerUserId) { |
| | | LambdaQueryWrapperX<CrmBusinessDO> query = new LambdaQueryWrapperX<>(); |
| | | query.eq(CrmBusinessDO::getOwnerUserId, ownerUserId).select(CrmBusinessDO::getTotalPrice); |
| | | List<CrmBusinessDO> list = selectList(query); |
| | | return list.stream() |
| | | .map(CrmBusinessDO::getTotalPrice) |
| | | .filter(p -> p != null) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | |
| | | .eq(CrmContractDO::getOwnerUserId, ownerUserId)); |
| | | } |
| | | |
| | | default CrmContractDO selectByBusinessId(Long businessId) { |
| | | return selectOne(CrmContractDO::getBusinessId, businessId); |
| | | } |
| | | |
| | | default List<CrmContractDO> selectListByCustomerId(Long customerId) { |
| | | return selectList(CrmContractDO::getCustomerId, customerId); |
| | | } |
| | | |
| | | // ========== ç»è®¡æ¹æ³ ========== |
| | | |
| | | default Long selectTodayCount() { |
| | | LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); |
| | | LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now()); |
| | | return selectCount(new LambdaQueryWrapperX<CrmContractDO>() |
| | | .between(CrmContractDO::getCreateTime, beginOfToday, endOfToday)); |
| | | } |
| | | |
| | | default BigDecimal selectTotalPriceSum() { |
| | | LambdaQueryWrapperX<CrmContractDO> query = new LambdaQueryWrapperX<>(); |
| | | query.select(CrmContractDO::getTotalPrice); |
| | | List<CrmContractDO> list = selectList(query); |
| | | return list.stream() |
| | | .map(CrmContractDO::getTotalPrice) |
| | | .filter(p -> p != null) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | default Long selectApproveCount() { |
| | | return selectCount(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()); |
| | | } |
| | | |
| | | default BigDecimal selectApprovePriceSum() { |
| | | LambdaQueryWrapperX<CrmContractDO> query = new LambdaQueryWrapperX<>(); |
| | | query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()) |
| | | .select(CrmContractDO::getTotalPrice); |
| | | List<CrmContractDO> list = selectList(query); |
| | | return list.stream() |
| | | .map(CrmContractDO::getTotalPrice) |
| | | .filter(p -> p != null) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | default Long selectProcessCount() { |
| | | return selectCount(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus()); |
| | | } |
| | | |
| | | default List<Long> selectOwnerUserIds() { |
| | | LambdaQueryWrapperX<CrmContractDO> query = new LambdaQueryWrapperX<>(); |
| | | query.select(CrmContractDO::getOwnerUserId).isNotNull(CrmContractDO::getOwnerUserId); |
| | | List<CrmContractDO> list = selectList(query); |
| | | return list.stream().map(CrmContractDO::getOwnerUserId).distinct().toList(); |
| | | } |
| | | |
| | | default Long selectCountByOwnerUserId(Long ownerUserId) { |
| | | return selectCount(CrmContractDO::getOwnerUserId, ownerUserId); |
| | | } |
| | | |
| | | default BigDecimal selectPriceSumByOwnerUserId(Long ownerUserId) { |
| | | LambdaQueryWrapperX<CrmContractDO> query = new LambdaQueryWrapperX<>(); |
| | | query.eq(CrmContractDO::getOwnerUserId, ownerUserId).select(CrmContractDO::getTotalPrice); |
| | | List<CrmContractDO> list = selectList(query); |
| | | return list.stream() |
| | | .map(CrmContractDO::getTotalPrice) |
| | | .filter(p -> p != null) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | } |
| | |
| | | return selectCount(query); |
| | | } |
| | | |
| | | // ========== ç»è®¡æ¹æ³ ========== |
| | | |
| | | default Long selectTodayCount() { |
| | | LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); |
| | | LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now()); |
| | | return selectCount(new LambdaQueryWrapperX<CrmCustomerDO>() |
| | | .between(CrmCustomerDO::getCreateTime, beginOfToday, endOfToday)); |
| | | } |
| | | |
| | | default Long selectDealCount() { |
| | | return selectCount(CrmCustomerDO::getDealStatus, true); |
| | | } |
| | | |
| | | default Long selectLockCount() { |
| | | return selectCount(CrmCustomerDO::getLockStatus, true); |
| | | } |
| | | |
| | | default Long selectPoolCount() { |
| | | return selectCount(new LambdaQueryWrapperX<CrmCustomerDO>() |
| | | .isNull(CrmCustomerDO::getOwnerUserId)); |
| | | } |
| | | |
| | | } |
| | |
| | | return selectCount(CrmReceivableDO::getContractId, contractId); |
| | | } |
| | | |
| | | // ========== ç»è®¡æ¹æ³ ========== |
| | | |
| | | default BigDecimal selectReceivablePriceSum() { |
| | | LambdaQueryWrapperX<CrmReceivableDO> query = new LambdaQueryWrapperX<>(); |
| | | query.in(CrmReceivableDO::getAuditStatus, |
| | | CrmAuditStatusEnum.DRAFT.getStatus(), |
| | | CrmAuditStatusEnum.PROCESS.getStatus(), |
| | | CrmAuditStatusEnum.APPROVE.getStatus()) |
| | | .select(CrmReceivableDO::getPrice); |
| | | List<CrmReceivableDO> list = selectList(query); |
| | | return list.stream() |
| | | .map(CrmReceivableDO::getPrice) |
| | | .filter(p -> p != null) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | default BigDecimal selectReceivablePriceSumByOwnerUserId(Long ownerUserId) { |
| | | LambdaQueryWrapperX<CrmReceivableDO> query = new LambdaQueryWrapperX<>(); |
| | | query.eq(CrmReceivableDO::getOwnerUserId, ownerUserId) |
| | | .in(CrmReceivableDO::getAuditStatus, |
| | | CrmAuditStatusEnum.DRAFT.getStatus(), |
| | | CrmAuditStatusEnum.PROCESS.getStatus(), |
| | | CrmAuditStatusEnum.APPROVE.getStatus()) |
| | | .select(CrmReceivableDO::getPrice); |
| | | List<CrmReceivableDO> list = selectList(query); |
| | | return list.stream() |
| | | .map(CrmReceivableDO::getPrice) |
| | | .filter(p -> p != null) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | } |
| | |
| | | ErrorCode CONTRACT_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS = new ErrorCode(1_020_000_003, "æ´æ°ååå®¡æ ¸ç¶æå¤±è´¥ï¼åå ï¼åå䏿¯å®¡æ ¸ä¸ç¶æ"); |
| | | ErrorCode CONTRACT_NO_EXISTS = new ErrorCode(1_020_000_004, "çæåååºåå·éå¤ï¼è¯·éè¯"); |
| | | ErrorCode CONTRACT_DELETE_FAIL = new ErrorCode(1_020_000_005, "å é¤åå失败ï¼åå ï¼æè¢«åæ¬¾æä½¿ç¨"); |
| | | ErrorCode CONTRACT_GENERATE_ORDER_FAIL_NOT_APPROVE = new ErrorCode(1_020_000_006, "çæéå®è®¢å失败ï¼åå ï¼ååæªå®¡æ¹éè¿"); |
| | | ErrorCode CONTRACT_GENERATE_ORDER_FAIL_EXISTS_ORDER = new ErrorCode(1_020_000_007, "çæéå®è®¢å失败ï¼åå ï¼å·²å
³èéå®è®¢åã{}ã"); |
| | | ErrorCode CONTRACT_GENERATE_ORDER_FAIL_NO_PRODUCT = new ErrorCode(1_020_000_008, "çæéå®è®¢å失败ï¼åå ï¼ååæ²¡æäº§åä¿¡æ¯"); |
| | | |
| | | // ========== 线索管ç 1-020-001-000 ========== |
| | | ErrorCode CLUE_NOT_EXISTS = new ErrorCode(1_020_001_000, "线索ä¸åå¨"); |
| | |
| | | */ |
| | | List<CrmContractDO> getContractListByCustomerIdOwnerUserId(Long customerId, Long ownerUserId); |
| | | |
| | | /** |
| | | * æ ¹æ®ååçæéå®è®¢å |
| | | * |
| | | * @param id ååç¼å· |
| | | * @param userId ç¨æ·ç¼å· |
| | | * @return éå®è®¢åç¼å· |
| | | */ |
| | | Long generateSaleOrder(Long id, Long userId); |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; |
| | | import cn.iocoder.yudao.module.crm.service.product.CrmProductService; |
| | | import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService; |
| | | import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderCreateReqDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import com.mzt.logapi.context.LogRecordContext; |
| | | import com.mzt.logapi.service.impl.DiffParseFunction; |
| | |
| | | private AdminUserApi adminUserApi; |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | @Resource |
| | | private ErpSaleOrderApi saleOrderApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | return contractMapper.selectListByCustomerIdOwnerUserId(customerId, ownerUserId); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @LogRecord(type = CRM_CONTRACT_TYPE, subType = "çæéå®è®¢å", bizNo = "{{#id}}", |
| | | success = "ååã{{#contractName}}ãçæéå®è®¢åã{{#orderNo}}ãæå") |
| | | @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#id", level = CrmPermissionLevelEnum.WRITE) |
| | | public Long generateSaleOrder(Long id, Long userId) { |
| | | // 1. æ ¡éªåååå¨ä¸å·²å®¡æ¹éè¿ |
| | | CrmContractDO contract = validateContractExists(id); |
| | | if (!CrmAuditStatusEnum.APPROVE.getStatus().equals(contract.getAuditStatus())) { |
| | | throw exception(CONTRACT_GENERATE_ORDER_FAIL_NOT_APPROVE); |
| | | } |
| | | // 2. æ ¡éªæ¯å¦å·²çæéå®è®¢å |
| | | ErpSaleOrderRespDTO existOrder = saleOrderApi.getSaleOrderByContractId(id).getCheckedData(); |
| | | if (existOrder != null) { |
| | | throw exception(CONTRACT_GENERATE_ORDER_FAIL_EXISTS_ORDER, existOrder.getNo()); |
| | | } |
| | | |
| | | // 3. è·ååå产åå表 |
| | | List<CrmContractProductDO> contractProducts = contractProductMapper.selectListByContractId(id); |
| | | if (CollUtil.isEmpty(contractProducts)) { |
| | | throw exception(CONTRACT_GENERATE_ORDER_FAIL_NO_PRODUCT); |
| | | } |
| | | |
| | | // 4. æå»ºéå®è®¢ååå»ºè¯·æ± |
| | | ErpSaleOrderCreateReqDTO createReqDTO = new ErpSaleOrderCreateReqDTO(); |
| | | createReqDTO.setCustomerId(contract.getCustomerId()); |
| | | createReqDTO.setContractId(contract.getId()); |
| | | createReqDTO.setContractNo(contract.getNo()); |
| | | createReqDTO.setSaleUserId(contract.getOwnerUserId()); |
| | | createReqDTO.setOrderTime(LocalDateTime.now().toString()); |
| | | createReqDTO.setDiscountPercent(contract.getDiscountPercent()); |
| | | createReqDTO.setRemark("ç±ååã" + contract.getNo() + "ãèªå¨çæ"); |
| | | |
| | | // 5. æå»ºè®¢å项 |
| | | List<ErpSaleOrderCreateReqDTO.Item> items = contractProducts.stream() |
| | | .map(cp -> { |
| | | ErpSaleOrderCreateReqDTO.Item item = new ErpSaleOrderCreateReqDTO.Item(); |
| | | item.setProductId(cp.getProductId()); |
| | | item.setProductPrice(cp.getContractPrice()); |
| | | item.setCount(cp.getCount()); |
| | | return item; |
| | | }) |
| | | .toList(); |
| | | createReqDTO.setItems(items); |
| | | |
| | | // 6. å建éå®è®¢å |
| | | Long orderId = saleOrderApi.createSaleOrder(createReqDTO).getCheckedData(); |
| | | ErpSaleOrderRespDTO order = saleOrderApi.getSaleOrder(orderId).getCheckedData(); |
| | | |
| | | // 7. æ´æ°ååå
³è订åä¿¡æ¯ |
| | | contractMapper.updateById(new CrmContractDO() |
| | | .setId(id) |
| | | .setOrderId(orderId) |
| | | .setOrderNo(order.getNo())); |
| | | |
| | | // 8. è®°å½æä½æ¥å¿ |
| | | LogRecordContext.putVariable("contractName", contract.getName()); |
| | | LogRecordContext.putVariable("orderNo", order.getNo()); |
| | | |
| | | return orderId; |
| | | } |
| | | |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.crm.service.product; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | 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.crm.controller.admin.product.vo.product.CrmProductPageReqVO; |
| | |
| | | import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission; |
| | | import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; |
| | | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; |
| | | 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.enums.MdmItemTypeEnum; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import com.mzt.logapi.context.LogRecordContext; |
| | | import com.mzt.logapi.service.impl.DiffParseFunction; |
| | |
| | | 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.Map; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| | |
| | | |
| | | /** |
| | | * CRM 产å Service å®ç°ç±» |
| | | * |
| | | * æ¹é 说æï¼äº§åæ°æ®ç»ä¸ä½¿ç¨ MDM ä¸»æ°æ®ç®¡çï¼itemType=2 产åç±»åï¼ |
| | | * - åå»ºãæ´æ°æä½éè¿ MDM API è¿è¡ |
| | | * - æ¥è¯¢æä½ä» MDM è·åæ°æ® |
| | | * - CRM 产å表ä¿çç¨äºæé管ç |
| | | * |
| | | * @author ZanGe丶 |
| | | */ |
| | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @Resource |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @LogRecord(type = CRM_PRODUCT_TYPE, subType = CRM_PRODUCT_CREATE_SUB_TYPE, bizNo = "{{#productId}}", |
| | |
| | | validateProductNoDuplicate(null, createReqVO.getNo()); |
| | | validateProductCategoryExists(createReqVO.getCategoryId()); |
| | | |
| | | // 2. æå
¥äº§å |
| | | CrmProductDO product = BeanUtils.toBean(createReqVO, CrmProductDO.class); |
| | | // 2. éè¿ MDM API å建产å |
| | | MdmItemCreateReqDTO createReqDTO = new MdmItemCreateReqDTO(); |
| | | createReqDTO.setCode(createReqVO.getNo()); |
| | | createReqDTO.setName(createReqVO.getName()); |
| | | createReqDTO.setBarCode(createReqVO.getNo()); // 使ç¨ç¼ç ä½ä¸ºæ¡ç |
| | | createReqDTO.setCategoryId(createReqVO.getCategoryId()); |
| | | createReqDTO.setUnitMeasureId(createReqVO.getUnit() != null ? createReqVO.getUnit().longValue() : null); |
| | | createReqDTO.setItemType(MdmItemTypeEnum.PRODUCT.getType()); // 产åç±»å |
| | | createReqDTO.setStatus(createReqVO.getStatus() != null ? createReqVO.getStatus() : CommonStatusEnum.ENABLE.getStatus()); |
| | | createReqDTO.setSalesPrice(createReqVO.getPrice()); |
| | | createReqDTO.setRemark(createReqVO.getDescription()); |
| | | Long itemId = mdmItemApi.createItem(createReqDTO).getCheckedData(); |
| | | |
| | | // 3. æå
¥æ¬å°äº§åè®°å½ï¼ç¨äºæé管çï¼ |
| | | CrmProductDO product = new CrmProductDO(); |
| | | product.setId(itemId); |
| | | product.setName(createReqVO.getName()); |
| | | product.setNo(createReqVO.getNo()); |
| | | product.setUnit(createReqVO.getUnit()); |
| | | product.setPrice(createReqVO.getPrice()); |
| | | product.setStatus(createReqVO.getStatus()); |
| | | product.setCategoryId(createReqVO.getCategoryId()); |
| | | product.setDescription(createReqVO.getDescription()); |
| | | product.setOwnerUserId(createReqVO.getOwnerUserId()); |
| | | productMapper.insert(product); |
| | | |
| | | // 3. æå
¥æ°æ®æé |
| | | // 4. æå
¥æ°æ®æé |
| | | permissionService.createPermission(new CrmPermissionCreateReqBO().setUserId(product.getOwnerUserId()) |
| | | .setBizType(CrmBizTypeEnum.CRM_PRODUCT.getType()).setBizId(product.getId()) |
| | | .setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); |
| | | |
| | | // 4. è®°å½æä½æ¥å¿ä¸ä¸æ |
| | | // 5. è®°å½æä½æ¥å¿ä¸ä¸æ |
| | | LogRecordContext.putVariable("productId", product.getId()); |
| | | return product.getId(); |
| | | } |
| | |
| | | validateProductNoDuplicate(updateReqVO.getId(), updateReqVO.getNo()); |
| | | validateProductCategoryExists(updateReqVO.getCategoryId()); |
| | | |
| | | // 2. æ´æ°äº§å |
| | | // 2. éè¿ MDM API æ´æ°äº§å |
| | | MdmItemUpdateReqDTO updateReqDTO = new MdmItemUpdateReqDTO(); |
| | | updateReqDTO.setId(updateReqVO.getId()); |
| | | updateReqDTO.setCode(updateReqVO.getNo()); |
| | | updateReqDTO.setName(updateReqVO.getName()); |
| | | updateReqDTO.setBarCode(updateReqVO.getNo()); |
| | | updateReqDTO.setCategoryId(updateReqVO.getCategoryId()); |
| | | updateReqDTO.setUnitMeasureId(updateReqVO.getUnit() != null ? updateReqVO.getUnit().longValue() : null); |
| | | updateReqDTO.setItemType(MdmItemTypeEnum.PRODUCT.getType()); |
| | | updateReqDTO.setStatus(updateReqVO.getStatus()); |
| | | updateReqDTO.setSalesPrice(updateReqVO.getPrice()); |
| | | updateReqDTO.setRemark(updateReqVO.getDescription()); |
| | | mdmItemApi.updateItem(updateReqDTO); |
| | | |
| | | // 3. æ´æ°æ¬å°äº§åè®°å½ |
| | | CrmProductDO updateObj = BeanUtils.toBean(updateReqVO, CrmProductDO.class); |
| | | productMapper.updateById(updateObj); |
| | | |
| | | // 3. è®°å½æä½æ¥å¿ä¸ä¸æ |
| | | // 4. è®°å½æä½æ¥å¿ä¸ä¸æ |
| | | LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(crmProductDO, CrmProductSaveReqVO.class)); |
| | | } |
| | | |
| | | private CrmProductDO validateProductExists(Long id) { |
| | | // ä» MDM æ ¡éª |
| | | MdmItemRespDTO item = mdmItemApi.getItem(id).getCheckedData(); |
| | | if (item == null) { |
| | | throw exception(PRODUCT_NOT_EXISTS); |
| | | } |
| | | // 仿¬å°è·å CRM 产åè®°å½ |
| | | CrmProductDO product = productMapper.selectById(id); |
| | | if (product == null) { |
| | | throw exception(PRODUCT_NOT_EXISTS); |
| | | // 妿æ¬å°ä¸åå¨ï¼å建ä¸ä¸ªåæ¥è®°å½ |
| | | product = convertToCrmProduct(item); |
| | | productMapper.insert(product); |
| | | } |
| | | return product; |
| | | } |
| | | |
| | | private void validateProductNoDuplicate(Long id, String no) { |
| | | CrmProductDO product = productMapper.selectByNo(no); |
| | | if (product == null |
| | | || product.getId().equals(id)) { |
| | | MdmItemRespDTO item = mdmItemApi.getItemByCode(no).getCheckedData(); |
| | | if (item == null || item.getId().equals(id)) { |
| | | return; |
| | | } |
| | | throw exception(PRODUCT_NO_EXISTS); |
| | |
| | | public void deleteProduct(Long id) { |
| | | // æ ¡éªåå¨ |
| | | validateProductExists(id); |
| | | // å é¤ |
| | | // éè¿ MDM API å é¤ï¼æ´æ°ç¶æä¸ºç¦ç¨ï¼ |
| | | mdmItemApi.updateItemStatus(id, CommonStatusEnum.DISABLE.getStatus()); |
| | | // å 餿¬å°è®°å½ |
| | | productMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | @CrmPermission(bizType = CrmBizTypeEnum.CRM_PRODUCT, bizId = "#id", level = CrmPermissionLevelEnum.READ) |
| | | public CrmProductDO getProduct(Long id) { |
| | | return productMapper.selectById(id); |
| | | // ä» MDM è·åäº§åæ°æ® |
| | | MdmItemRespDTO item = mdmItemApi.getItem(id).getCheckedData(); |
| | | if (item == null || !MdmItemTypeEnum.PRODUCT.getType().equals(item.getItemType())) { |
| | | return null; |
| | | } |
| | | // è·åæ¬å° CRM 产åè®°å½ï¼ç¨äºæéï¼ |
| | | CrmProductDO product = productMapper.selectById(id); |
| | | if (product == null) { |
| | | // 忥å建æ¬å°è®°å½ |
| | | product = convertToCrmProduct(item); |
| | | productMapper.insert(product); |
| | | } else { |
| | | // æ´æ°æ¬å°è®°å½çæ°æ® |
| | | product.setName(item.getName()); |
| | | product.setNo(item.getCode()); |
| | | product.setPrice(item.getSalesPrice()); |
| | | product.setStatus(item.getStatus()); |
| | | product.setCategoryId(item.getCategoryId()); |
| | | product.setDescription(item.getRemark()); |
| | | } |
| | | return product; |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<CrmProductDO> getProductPage(CrmProductPageReqVO pageReqVO) { |
| | | return productMapper.selectPage(pageReqVO); |
| | | // ä» MDM è·å产ååé¡µæ°æ® |
| | | cn.iocoder.yudao.framework.common.pojo.PageResult<MdmItemRespDTO> mdmPageResult = |
| | | mdmItemApi.getItemPage(MdmItemTypeEnum.PRODUCT.getType(), null, |
| | | pageReqVO.getPageNo(), pageReqVO.getPageSize()).getCheckedData(); |
| | | // 转æ¢ä¸º CRM 产å |
| | | List<CrmProductDO> list = mdmPageResult.getList().stream() |
| | | .map(this::convertToCrmProduct) |
| | | .collect(Collectors.toList()); |
| | | return new PageResult<>(list, mdmPageResult.getTotal()); |
| | | } |
| | | |
| | | @Override |
| | | public Long getProductByCategoryId(Long categoryId) { |
| | | return productMapper.selectCountByCategoryId(categoryId); |
| | | return mdmItemApi.getItemCountByCategoryId(categoryId).getCheckedData(); |
| | | } |
| | | |
| | | @Override |
| | | public List<CrmProductDO> getProductListByStatus(Integer status) { |
| | | return productMapper.selectListByStatus(status); |
| | | // ä» MDM è·åäº§åæ°æ® |
| | | List<MdmItemRespDTO> items = mdmItemApi.getItemListByStatus(status).getCheckedData(); |
| | | // è¿æ»¤äº§åç±»åå¹¶è½¬æ¢ |
| | | return items.stream() |
| | | .filter(item -> MdmItemTypeEnum.PRODUCT.getType().equals(item.getItemType())) |
| | | .map(this::convertToCrmProduct) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | List<CrmProductDO> list = productMapper.selectByIds(ids); |
| | | Map<Long, CrmProductDO> productMap = convertMap(list, CrmProductDO::getId); |
| | | List<MdmItemRespDTO> items = mdmItemApi.getItemList(ids).getCheckedData(); |
| | | Map<Long, MdmItemRespDTO> itemMap = convertMap(items, MdmItemRespDTO::getId); |
| | | List<CrmProductDO> result = new ArrayList<>(); |
| | | for (Long id : ids) { |
| | | CrmProductDO product = productMap.get(id); |
| | | if (productMap.get(id) == null) { |
| | | MdmItemRespDTO item = itemMap.get(id); |
| | | if (item == null) { |
| | | throw exception(PRODUCT_NOT_EXISTS); |
| | | } |
| | | if (CrmProductStatusEnum.isDisable(product.getStatus())) { |
| | | throw exception(PRODUCT_NOT_ENABLE, product.getName()); |
| | | if (CrmProductStatusEnum.isDisable(item.getStatus())) { |
| | | throw exception(PRODUCT_NOT_ENABLE, item.getName()); |
| | | } |
| | | result.add(convertToCrmProduct(item)); |
| | | } |
| | | return list; |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return productMapper.selectByIds(ids); |
| | | List<MdmItemRespDTO> items = mdmItemApi.getItemList(ids).getCheckedData(); |
| | | return items.stream() |
| | | .filter(item -> MdmItemTypeEnum.PRODUCT.getType().equals(item.getItemType())) |
| | | .map(this::convertToCrmProduct) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | /** |
| | | * å° MDM ç©æè½¬æ¢ä¸º CRM 产å |
| | | */ |
| | | private CrmProductDO convertToCrmProduct(MdmItemRespDTO item) { |
| | | CrmProductDO product = new CrmProductDO(); |
| | | product.setId(item.getId()); |
| | | product.setName(item.getName()); |
| | | product.setNo(item.getCode()); |
| | | product.setUnit(item.getUnitMeasureId() != null ? item.getUnitMeasureId().intValue() : null); |
| | | product.setPrice(item.getSalesPrice()); |
| | | product.setStatus(item.getStatus()); |
| | | product.setCategoryId(item.getCategoryId()); |
| | | product.setDescription(item.getRemark()); |
| | | return product; |
| | | } |
| | | |
| | | } |
| | |
| | | */ |
| | | Long getReceivableCountByContractId(Long contractId); |
| | | |
| | | /** |
| | | * æ ¹æ®ååç¼å·æ¥è¯¢å·²å款éé¢ |
| | | * |
| | | * @param contractId ååç¼å· |
| | | * @return 已忬¾éé¢ |
| | | */ |
| | | BigDecimal getReceivablePriceByContractId(Long contractId); |
| | | |
| | | /** |
| | | * è·åæ»å款éé¢ |
| | | * |
| | | * @return æ»å款éé¢ |
| | | */ |
| | | BigDecimal getReceivablePriceSum(); |
| | | |
| | | /** |
| | | * æ ¹æ®è´è´£äººæ¥è¯¢å款éé¢ |
| | | * |
| | | * @param ownerUserId è´è´£äººç¼å· |
| | | * @return 忬¾éé¢ |
| | | */ |
| | | BigDecimal getReceivablePriceByOwnerUserId(Long ownerUserId); |
| | | |
| | | } |
| | |
| | | return receivableMapper.selectCountByContractId(contractId); |
| | | } |
| | | |
| | | @Override |
| | | public BigDecimal getReceivablePriceByContractId(Long contractId) { |
| | | Map<Long, BigDecimal> priceMap = receivableMapper.selectReceivablePriceMapByContractId( |
| | | java.util.Collections.singleton(contractId)); |
| | | return priceMap.getOrDefault(contractId, BigDecimal.ZERO); |
| | | } |
| | | |
| | | @Override |
| | | public BigDecimal getReceivablePriceSum() { |
| | | return receivableMapper.selectReceivablePriceSum(); |
| | | } |
| | | |
| | | @Override |
| | | public BigDecimal getReceivablePriceByOwnerUserId(Long ownerUserId) { |
| | | return receivableMapper.selectReceivablePriceSumByOwnerUserId(ownerUserId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?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-erp-api</artifactId> |
| | | <packaging>jar</packaging> |
| | | |
| | | <name>${project.artifactId}</name> |
| | | <description> |
| | | erp 模åä¸ï¼ä¼ä¸èµæºç®¡çç API æ¥å£å®ä¹ï¼ä¾å
¶ä»æ¨¡åå¼ç¨ |
| | | </description> |
| | | |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-common</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Swagger 注解 --> |
| | | <dependency> |
| | | <groupId>org.springdoc</groupId> |
| | | <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> |
| | | <scope>provided</scope> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | </project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.sale; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderCreateReqDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO; |
| | | |
| | | /** |
| | | * ERP éå®è®¢å API æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface ErpSaleOrderApi { |
| | | |
| | | String PREFIX = "/rpc-api/erp/sale-order"; |
| | | |
| | | /** |
| | | * å建éå®è®¢å |
| | | * |
| | | * @param createReqDTO åå»ºä¿¡æ¯ |
| | | * @return 订åç¼å· |
| | | */ |
| | | CommonResult<Long> createSaleOrder(ErpSaleOrderCreateReqDTO createReqDTO); |
| | | |
| | | /** |
| | | * è·åéå®è®¢å |
| | | * |
| | | * @param id 订åç¼å· |
| | | * @return éå®è®¢å |
| | | */ |
| | | CommonResult<ErpSaleOrderRespDTO> getSaleOrder(Long id); |
| | | |
| | | /** |
| | | * æ ¹æ®ååç¼å·è·åéå®è®¢å |
| | | * |
| | | * @param contractId ååç¼å· |
| | | * @return éå®è®¢å |
| | | */ |
| | | CommonResult<ErpSaleOrderRespDTO> getSaleOrderByContractId(Long contractId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.sale.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "RPC æå¡ - ERP éå®è®¢åå建 Request DTO") |
| | | @Data |
| | | public class ErpSaleOrderCreateReqDTO { |
| | | |
| | | @Schema(description = "客æ·ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long customerId; |
| | | |
| | | @Schema(description = "å
³èååç¼å·", example = "1") |
| | | private Long contractId; |
| | | |
| | | @Schema(description = "åååå·", example = "HT001") |
| | | private String contractNo; |
| | | |
| | | @Schema(description = "éå®åç¼å·", example = "1") |
| | | private Long saleUserId; |
| | | |
| | | @Schema(description = "ç»ç®è´¦æ·ç¼å·", example = "1") |
| | | private Long accountId; |
| | | |
| | | @Schema(description = "ä¸åæ¶é´") |
| | | private String orderTime; |
| | | |
| | | @Schema(description = "伿 çï¼ç¾åæ¯", example = "10") |
| | | private BigDecimal discountPercent; |
| | | |
| | | @Schema(description = "å®ééé¢ï¼åä½ï¼å
", example = "100") |
| | | private BigDecimal depositPrice; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | @Schema(description = "订å项å表") |
| | | private java.util.List<Item> items; |
| | | |
| | | @Schema(description = "订å项") |
| | | @Data |
| | | public static class Item { |
| | | |
| | | @Schema(description = "产åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long productId; |
| | | |
| | | @Schema(description = "产ååä½ç¼å·", example = "1") |
| | | private Long productUnitId; |
| | | |
| | | @Schema(description = "产ååä»·ï¼åä½ï¼å
", example = "100") |
| | | private BigDecimal productPrice; |
| | | |
| | | @Schema(description = "æ°é", example = "10") |
| | | private BigDecimal count; |
| | | |
| | | @Schema(description = "ç¨çï¼ç¾åæ¯", example = "10") |
| | | private BigDecimal taxPercent; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.sale.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | @Schema(description = "RPC æå¡ - ERP éå®è®¢å Response DTO") |
| | | @Data |
| | | public class ErpSaleOrderRespDTO { |
| | | |
| | | @Schema(description = "订åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "éå®è®¢åå·", requiredMode = Schema.RequiredMode.REQUIRED, example = "SO001") |
| | | private String no; |
| | | |
| | | @Schema(description = "客æ·ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long customerId; |
| | | |
| | | @Schema(description = "å
³èååç¼å·", example = "1") |
| | | private Long contractId; |
| | | |
| | | @Schema(description = "åååå·", example = "HT001") |
| | | private String contractNo; |
| | | |
| | | @Schema(description = "订åç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å计éé¢ï¼åä½ï¼å
", example = "1000") |
| | | private java.math.BigDecimal totalPrice; |
| | | |
| | | } |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- BPM 工使µ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-bpm</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- CRM å®¢æ· API --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-crm-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ERP éå®è®¢å APIï¼æ¬æ¨¡å APIï¼ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-erp-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- MDM ä¸»æ°æ®ç®¡ç API --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-mdm-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ä¸å¡ç»ä»¶ --> |
| | | |
| | | <!-- Web ç¸å
³ --> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.sale; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderCreateReqDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderMapper; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOrderService; |
| | | 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 static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * ERP éå®è®¢å API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RestController |
| | | @RequestMapping(ErpSaleOrderApi.PREFIX) |
| | | @Validated |
| | | public class ErpSaleOrderApiImpl implements ErpSaleOrderApi { |
| | | |
| | | @Resource |
| | | private ErpSaleOrderService saleOrderService; |
| | | |
| | | @Resource |
| | | private ErpSaleOrderMapper saleOrderMapper; |
| | | |
| | | @Override |
| | | public CommonResult<Long> createSaleOrder(ErpSaleOrderCreateReqDTO createReqDTO) { |
| | | // 转æ¢ä¸º SaveReqVO |
| | | ErpSaleOrderSaveReqVO saveReqVO = BeanUtils.toBean(createReqDTO, ErpSaleOrderSaveReqVO.class); |
| | | // 转æ¢è®¢å项 |
| | | if (createReqDTO.getItems() != null) { |
| | | saveReqVO.setItems(createReqDTO.getItems().stream() |
| | | .map(item -> BeanUtils.toBean(item, ErpSaleOrderSaveReqVO.Item.class)) |
| | | .toList()); |
| | | } |
| | | return success(saleOrderService.createSaleOrder(saveReqVO)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<ErpSaleOrderRespDTO> getSaleOrder(Long id) { |
| | | ErpSaleOrderDO order = saleOrderService.getSaleOrder(id); |
| | | return success(BeanUtils.toBean(order, ErpSaleOrderRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<ErpSaleOrderRespDTO> getSaleOrderByContractId(Long contractId) { |
| | | ErpSaleOrderDO order = saleOrderMapper.selectByContractId(contractId); |
| | | return success(BeanUtils.toBean(order, ErpSaleOrderRespDTO.class)); |
| | | } |
| | | |
| | | } |
| | |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('erp:product:query')") |
| | | public CommonResult<ErpProductRespVO> getProduct(@RequestParam("id") Long id) { |
| | | ErpProductDO product = productService.getProduct(id); |
| | | return success(BeanUtils.toBean(product, ErpProductRespVO.class)); |
| | | ErpProductRespVO product = productService.getProductVO(id); |
| | | return success(product); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.purchase; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestRespVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestItemDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpSupplierDO; |
| | | import cn.iocoder.yudao.module.erp.service.product.ErpProductService; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseRequestService; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | 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.servlet.http.HttpServletResponse; |
| | | 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.io.IOException; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | 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.convertMultiMap; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserDeptId; |
| | | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| | | |
| | | @Tag(name = "管çåå° - ERP éè´ç³è¯·") |
| | | @RestController |
| | | @RequestMapping("/erp/purchase-request") |
| | | @Validated |
| | | public class ErpPurchaseRequestController { |
| | | |
| | | @Resource |
| | | private ErpPurchaseRequestService purchaseRequestService; |
| | | @Resource |
| | | private ErpProductService productService; |
| | | @Resource |
| | | private ErpSupplierService supplierService; |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建éè´ç³è¯·") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:create')") |
| | | public CommonResult<Long> createPurchaseRequest(@Valid @RequestBody ErpPurchaseRequestSaveReqVO createReqVO) { |
| | | return success(purchaseRequestService.createPurchaseRequest(createReqVO, getLoginUserId(), getLoginUserDeptId())); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°éè´ç³è¯·") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:update')") |
| | | public CommonResult<Boolean> updatePurchaseRequest(@Valid @RequestBody ErpPurchaseRequestSaveReqVO updateReqVO) { |
| | | purchaseRequestService.updatePurchaseRequest(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/submit") |
| | | @Operation(summary = "æäº¤éè´ç³è¯·å®¡æ¹") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:submit')") |
| | | public CommonResult<Boolean> submitPurchaseRequest(@RequestParam("id") Long id, |
| | | @RequestParam("processDefinitionKey") String processDefinitionKey) { |
| | | purchaseRequestService.submitPurchaseRequest(id, processDefinitionKey, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤éè´ç³è¯·") |
| | | @Parameter(name = "ids", description = "ç¼å·æ°ç»", required = true) |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:delete')") |
| | | public CommonResult<Boolean> deletePurchaseRequest(@RequestParam("ids") List<Long> ids) { |
| | | purchaseRequestService.deletePurchaseRequest(ids); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾éè´ç³è¯·") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:query')") |
| | | public CommonResult<ErpPurchaseRequestRespVO> getPurchaseRequest(@RequestParam("id") Long id) { |
| | | ErpPurchaseRequestDO purchaseRequest = purchaseRequestService.getPurchaseRequest(id); |
| | | if (purchaseRequest == null) { |
| | | return success(null); |
| | | } |
| | | List<ErpPurchaseRequestItemDO> purchaseRequestItemList = purchaseRequestService.getPurchaseRequestItemListByRequestId(id); |
| | | Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( |
| | | convertSet(purchaseRequestItemList, ErpPurchaseRequestItemDO::getProductId)); |
| | | return success(BeanUtils.toBean(purchaseRequest, ErpPurchaseRequestRespVO.class, vo -> { |
| | | vo.setItems(BeanUtils.toBean(purchaseRequestItemList, ErpPurchaseRequestRespVO.Item.class, item -> |
| | | MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) |
| | | .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())))); |
| | | // å¡«å
å
³èåæ®µ |
| | | fillPurchaseRequestRelatedFields(vo); |
| | | })); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾éè´ç³è¯·å页") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:query')") |
| | | public CommonResult<PageResult<ErpPurchaseRequestRespVO>> getPurchaseRequestPage(@Valid ErpPurchaseRequestPageReqVO pageReqVO) { |
| | | PageResult<ErpPurchaseRequestDO> pageResult = purchaseRequestService.getPurchaseRequestPage(pageReqVO); |
| | | return success(buildPurchaseRequestVOPageResult(pageResult)); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºéè´ç³è¯· Excel") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportPurchaseRequestExcel(@Valid ErpPurchaseRequestPageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | List<ErpPurchaseRequestRespVO> list = buildPurchaseRequestVOPageResult( |
| | | purchaseRequestService.getPurchaseRequestPage(pageReqVO)).getList(); |
| | | ExcelUtils.write(response, "éè´ç³è¯·.xls", "æ°æ®", ErpPurchaseRequestRespVO.class, list); |
| | | } |
| | | |
| | | @PostMapping("/generate-order") |
| | | @Operation(summary = "çæéè´è®¢å") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:generate-order')") |
| | | public CommonResult<Long> generatePurchaseOrder(@RequestParam("id") Long id, |
| | | @RequestParam("supplierId") Long supplierId) { |
| | | return success(purchaseRequestService.generatePurchaseOrder(id, supplierId, getLoginUserId())); |
| | | } |
| | | |
| | | @GetMapping("/approve-process-list") |
| | | @Operation(summary = "è·åéè´ç³è¯·å®¡æ¹æµç¨å表") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:query')") |
| | | public CommonResult<List<Map<String, Object>>> getPurchaseRequestApproveProcessList() { |
| | | return success(purchaseRequestService.getPurchaseRequestApproveProcessDefinitionList()); |
| | | } |
| | | |
| | | private PageResult<ErpPurchaseRequestRespVO> buildPurchaseRequestVOPageResult(PageResult<ErpPurchaseRequestDO> pageResult) { |
| | | if (CollUtil.isEmpty(pageResult.getList())) { |
| | | return PageResult.empty(pageResult.getTotal()); |
| | | } |
| | | // 1.1 ç³è¯·æç» |
| | | List<ErpPurchaseRequestItemDO> purchaseRequestItemList = purchaseRequestService.getPurchaseRequestItemListByRequestIds( |
| | | convertSet(pageResult.getList(), ErpPurchaseRequestDO::getId)); |
| | | Map<Long, List<ErpPurchaseRequestItemDO>> purchaseRequestItemMap = convertMultiMap(purchaseRequestItemList, ErpPurchaseRequestItemDO::getRequestId); |
| | | // 1.2 产åä¿¡æ¯ |
| | | Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( |
| | | convertSet(purchaseRequestItemList, ErpPurchaseRequestItemDO::getProductId)); |
| | | // 1.3 ä¾åºåä¿¡æ¯ |
| | | Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap( |
| | | convertSet(pageResult.getList(), ErpPurchaseRequestDO::getSupplierId)); |
| | | // 1.4 ç¨æ·ä¿¡æ¯ |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( |
| | | convertSet(pageResult.getList(), ErpPurchaseRequestDO::getRequestUserId)); |
| | | // 1.5 é¨é¨ä¿¡æ¯ |
| | | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap( |
| | | convertSet(pageResult.getList(), ErpPurchaseRequestDO::getRequestDeptId)); |
| | | |
| | | // 2. å¼å§æ¼æ¥ |
| | | return BeanUtils.toBean(pageResult, ErpPurchaseRequestRespVO.class, vo -> { |
| | | vo.setItems(BeanUtils.toBean(purchaseRequestItemMap.get(vo.getId()), ErpPurchaseRequestRespVO.Item.class, |
| | | item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) |
| | | .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())))); |
| | | vo.setProductNames(CollUtil.join(vo.getItems(), "ï¼", ErpPurchaseRequestRespVO.Item::getProductName)); |
| | | MapUtils.findAndThen(supplierMap, vo.getSupplierId(), supplier -> vo.setSupplierName(supplier.getName())); |
| | | MapUtils.findAndThen(userMap, vo.getRequestUserId(), user -> vo.setRequestUserName(user.getNickname())); |
| | | MapUtils.findAndThen(deptMap, vo.getRequestDeptId(), dept -> vo.setRequestDeptName(dept.getName())); |
| | | }); |
| | | } |
| | | |
| | | private void fillPurchaseRequestRelatedFields(ErpPurchaseRequestRespVO vo) { |
| | | // å¡«å
ç³è¯·äººåç§° |
| | | if (vo.getRequestUserId() != null) { |
| | | AdminUserRespDTO user = adminUserApi.getUser(vo.getRequestUserId()); |
| | | if (user != null) { |
| | | vo.setRequestUserName(user.getNickname()); |
| | | } |
| | | } |
| | | // å¡«å
é¨é¨åç§° |
| | | if (vo.getRequestDeptId() != null) { |
| | | DeptRespDTO dept = deptApi.getDept(vo.getRequestDeptId()); |
| | | if (dept != null) { |
| | | vo.setRequestDeptName(dept.getName()); |
| | | } |
| | | } |
| | | // å¡«å
ä¾åºååç§° |
| | | if (vo.getSupplierId() != null) { |
| | | ErpSupplierDO supplier = supplierService.getSupplier(vo.getSupplierId()); |
| | | if (supplier != null) { |
| | | vo.setSupplierName(supplier.getName()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request; |
| | | |
| | | 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 org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| | | |
| | | @Schema(description = "管çåå° - ERP éè´ç³è¯·å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class ErpPurchaseRequestPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "éè´ç³è¯·åå·", example = "CGSQ001") |
| | | private String no; |
| | | |
| | | @Schema(description = "ç³è¯·äººç¼å·", example = "1") |
| | | private Long requestUserId; |
| | | |
| | | @Schema(description = "ç³è¯·é¨é¨ç¼å·", example = "1") |
| | | private Long requestDeptId; |
| | | |
| | | @Schema(description = "ç³è¯·æ¶é´") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| | | private LocalDateTime[] requestTime; |
| | | |
| | | @Schema(description = "审æ¹ç¶æ", example = "20") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "ç³è¯·çç±", example = "ç产éè¦") |
| | | private String requestReason; |
| | | |
| | | @Schema(description = "产åç¼å·", example = "1") |
| | | private Long productId; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request; |
| | | |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - ERP éè´ç³è¯· Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class ErpPurchaseRequestRespVO { |
| | | |
| | | @Schema(description = "ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "17386") |
| | | @ExcelProperty("ç¼å·") |
| | | private Long id; |
| | | |
| | | @Schema(description = "éè´ç³è¯·åå·", requiredMode = Schema.RequiredMode.REQUIRED, example = "CGSQ001") |
| | | @ExcelProperty("éè´ç³è¯·åå·") |
| | | private String no; |
| | | |
| | | @Schema(description = "审æ¹ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") |
| | | @ExcelProperty("审æ¹ç¶æ") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "ç³è¯·äººç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long requestUserId; |
| | | @Schema(description = "ç³è¯·äººåç§°", example = "å¼ ä¸") |
| | | @ExcelProperty("ç³è¯·äºº") |
| | | private String requestUserName; |
| | | |
| | | @Schema(description = "ç³è¯·é¨é¨ç¼å·", example = "1") |
| | | private Long requestDeptId; |
| | | @Schema(description = "ç³è¯·é¨é¨åç§°", example = "ç产é¨") |
| | | @ExcelProperty("ç³è¯·é¨é¨") |
| | | private String requestDeptName; |
| | | |
| | | @Schema(description = "ç³è¯·æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @ExcelProperty("ç³è¯·æ¶é´") |
| | | private LocalDateTime requestTime; |
| | | |
| | | @Schema(description = "ç³è¯·çç±", example = "ç产éè¦") |
| | | @ExcelProperty("ç³è¯·çç±") |
| | | private String requestReason; |
| | | |
| | | @Schema(description = "ä¾åºåç¼å·", example = "1724") |
| | | private Long supplierId; |
| | | @Schema(description = "ä¾åºååç§°", example = "ä¾åºåA") |
| | | @ExcelProperty("ä¾åºååç§°") |
| | | private String supplierName; |
| | | |
| | | @Schema(description = "å计æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") |
| | | @ExcelProperty("å计æ°é") |
| | | private BigDecimal totalCount; |
| | | |
| | | @Schema(description = "å计产åä»·æ ¼", example = "10000.00") |
| | | private BigDecimal totalProductPrice; |
| | | |
| | | @Schema(description = "å计ç¨é¢", example = "1300.00") |
| | | private BigDecimal totalTaxPrice; |
| | | |
| | | @Schema(description = "æç»åè®¡ä»·æ ¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "11300.00") |
| | | @ExcelProperty("æç»åè®¡ä»·æ ¼") |
| | | private BigDecimal totalPrice; |
| | | |
| | | @Schema(description = "伿 çï¼ç¾åæ¯", example = "10.00") |
| | | private BigDecimal discountPercent; |
| | | |
| | | @Schema(description = "伿 éé¢", example = "1130.00") |
| | | private BigDecimal discountPrice; |
| | | |
| | | @Schema(description = "工使µç¼å·", example = "xxx-xxx") |
| | | private String processInstanceId; |
| | | |
| | | @Schema(description = "å
³èéè´è®¢åç¼å·", example = "100") |
| | | private Long orderId; |
| | | @Schema(description = "å
³èéè´è®¢ååå·", example = "CGDD001") |
| | | @ExcelProperty("éè´è®¢ååå·") |
| | | private String orderNo; |
| | | |
| | | @Schema(description = "çæéè´è®¢åæ¶é´") |
| | | private LocalDateTime orderTime; |
| | | |
| | | @Schema(description = "éä»¶å°å", example = "https://www.iocoder.cn") |
| | | @ExcelProperty("éä»¶å°å") |
| | | private String fileUrl; |
| | | |
| | | @Schema(description = "夿³¨", example = "ä½ ç") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建人", example = "1") |
| | | private String creator; |
| | | @Schema(description = "å建人åç§°", example = "èé") |
| | | private String creatorName; |
| | | |
| | | @Schema(description = "å建æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | @Schema(description = "ç³è¯·æç»å表") |
| | | private List<Item> items; |
| | | |
| | | @Schema(description = "产åä¿¡æ¯") |
| | | @ExcelProperty("产åä¿¡æ¯") |
| | | private String productNames; |
| | | |
| | | @Data |
| | | public static class Item { |
| | | |
| | | @Schema(description = "ç³è¯·é¡¹ç¼å·", example = "11756") |
| | | private Long id; |
| | | |
| | | @Schema(description = "产åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "3113") |
| | | private Long productId; |
| | | |
| | | @Schema(description = "产ååä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "3113") |
| | | private Long productUnitId; |
| | | |
| | | @Schema(description = "产ååä»·ï¼åèä»·ï¼", example = "100.00") |
| | | private BigDecimal productPrice; |
| | | |
| | | @Schema(description = "æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") |
| | | private BigDecimal count; |
| | | |
| | | @Schema(description = "æ»ä»·", example = "10000.00") |
| | | private BigDecimal totalPrice; |
| | | |
| | | @Schema(description = "ç¨çï¼ç¾åæ¯", example = "13.00") |
| | | private BigDecimal taxPercent; |
| | | |
| | | @Schema(description = "ç¨é¢", example = "1300.00") |
| | | private BigDecimal taxPrice; |
| | | |
| | | @Schema(description = "éæ±æ¥æ", example = "2024-01-01") |
| | | private LocalDate demandTime; |
| | | |
| | | @Schema(description = "夿³¨", example = "é便") |
| | | private String remark; |
| | | |
| | | // ========== å
³èåæ®µ ========== |
| | | |
| | | @Schema(description = "产ååç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "å·§å
å") |
| | | private String productName; |
| | | @Schema(description = "äº§åæ¡ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "A9985") |
| | | private String productBarCode; |
| | | @Schema(description = "产ååä½åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ç") |
| | | private String productUnitName; |
| | | |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.Valid; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - ERP éè´ç³è¯·æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class ErpPurchaseRequestSaveReqVO { |
| | | |
| | | @Schema(description = "ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "17386") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç³è¯·æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "ç³è¯·æ¶é´ä¸è½ä¸ºç©º") |
| | | private LocalDateTime requestTime; |
| | | |
| | | @Schema(description = "ç³è¯·çç±", example = "ç产éè¦") |
| | | private String requestReason; |
| | | |
| | | @Schema(description = "ä¾åºåç¼å·ï¼å¯éï¼", example = "1724") |
| | | private Long supplierId; |
| | | |
| | | @Schema(description = "伿 çï¼ç¾åæ¯", example = "99.88") |
| | | private BigDecimal discountPercent; |
| | | |
| | | @Schema(description = "éä»¶å°å", example = "https://www.iocoder.cn") |
| | | private String fileUrl; |
| | | |
| | | @Schema(description = "夿³¨", example = "ä½ ç") |
| | | private String remark; |
| | | |
| | | @Schema(description = "ç³è¯·æç»å表") |
| | | @NotEmpty(message = "ç³è¯·æç»å表ä¸è½ä¸ºç©º") |
| | | @Valid |
| | | private List<Item> items; |
| | | |
| | | @Data |
| | | public static class Item { |
| | | |
| | | @Schema(description = "ç³è¯·é¡¹ç¼å·", example = "11756") |
| | | private Long id; |
| | | |
| | | @Schema(description = "产åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "3113") |
| | | @NotNull(message = "产åç¼å·ä¸è½ä¸ºç©º") |
| | | private Long productId; |
| | | |
| | | @Schema(description = "产ååä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "3113") |
| | | @NotNull(message = "产ååä½ç¼å·ä¸è½ä¸ºç©º") |
| | | private Long productUnitId; |
| | | |
| | | @Schema(description = "产ååä»·ï¼åèä»·ï¼", example = "100.00") |
| | | private BigDecimal productPrice; |
| | | |
| | | @Schema(description = "æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") |
| | | @NotNull(message = "æ°éä¸è½ä¸ºç©º") |
| | | private BigDecimal count; |
| | | |
| | | @Schema(description = "ç¨çï¼ç¾åæ¯", example = "13.00") |
| | | private BigDecimal taxPercent; |
| | | |
| | | @Schema(description = "éæ±æ¥æ", example = "2024-01-01") |
| | | private LocalDate demandTime; |
| | | |
| | | @Schema(description = "夿³¨", example = "é便") |
| | | private String remark; |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderRespVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpCustomerDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO; |
| | | import cn.iocoder.yudao.module.erp.service.product.ErpProductService; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpCustomerService; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOrderService; |
| | | import cn.iocoder.yudao.module.erp.service.stock.ErpStockService; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | |
| | | @Resource |
| | | private ErpProductService productService; |
| | | @Resource |
| | | private ErpCustomerService customerService; |
| | | private CrmCustomerApi customerApi; |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | |
| | | // 1.2 产åä¿¡æ¯ |
| | | Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( |
| | | convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductId)); |
| | | // 1.3 客æ·ä¿¡æ¯ |
| | | Map<Long, ErpCustomerDO> customerMap = customerService.getCustomerMap( |
| | | // 1.3 客æ·ä¿¡æ¯ï¼ä½¿ç¨ CRM å®¢æ· APIï¼ |
| | | Map<Long, CrmCustomerRespDTO> customerMap = customerApi.getCustomerMap( |
| | | convertSet(pageResult.getList(), ErpSaleOrderDO::getCustomerId)); |
| | | // 1.4 管çåä¿¡æ¯ |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( |
| | |
| | | @NotNull(message = "客æ·ç¼å·ä¸è½ä¸ºç©º") |
| | | private Long customerId; |
| | | |
| | | @Schema(description = "å
³èååç¼å·", example = "1") |
| | | private Long contractId; |
| | | |
| | | @Schema(description = "åååå·", example = "HT001") |
| | | private String contractNo; |
| | | |
| | | @Schema(description = "ä¸åæ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "ä¸åæ¶é´ä¸è½ä¸ºç©º") |
| | | private LocalDateTime orderTime; |
| | |
| | | /** |
| | | * 客æ·ç¼å· |
| | | * |
| | | * å
³è {@link ErpCustomerDO#getId()} |
| | | * å
³è CRM å®¢æ· {@link cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO#getId()} |
| | | */ |
| | | private Long customerId; |
| | | /** |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.dataobject.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAccountDO; |
| | | 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; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯· DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName(value = "erp_purchase_request") |
| | | @KeySequence("erp_purchase_request_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class ErpPurchaseRequestDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | /** |
| | | * éè´ç³è¯·åå· |
| | | */ |
| | | private String no; |
| | | /** |
| | | * 审æ¹ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.erp.enums.ErpPurchaseRequestStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * ç³è¯·äººç¼å· |
| | | */ |
| | | private Long requestUserId; |
| | | /** |
| | | * ç³è¯·é¨é¨ç¼å· |
| | | */ |
| | | private Long requestDeptId; |
| | | /** |
| | | * ç³è¯·æ¶é´ |
| | | */ |
| | | private LocalDateTime requestTime; |
| | | /** |
| | | * ç³è¯·çç± |
| | | */ |
| | | private String requestReason; |
| | | |
| | | /** |
| | | * ä¾åºåç¼å· |
| | | * |
| | | * å
³è {@link ErpSupplierDO#getId()} |
| | | */ |
| | | private Long supplierId; |
| | | |
| | | /** |
| | | * å计æ°é |
| | | */ |
| | | private BigDecimal totalCount; |
| | | /** |
| | | * å计产åä»·æ ¼ï¼åä½ï¼å
|
| | | */ |
| | | private BigDecimal totalProductPrice; |
| | | /** |
| | | * å计ç¨é¢ï¼åä½ï¼å
|
| | | */ |
| | | private BigDecimal totalTaxPrice; |
| | | /** |
| | | * æç»åè®¡ä»·æ ¼ï¼åä½ï¼å
|
| | | * |
| | | * totalPrice = totalProductPrice + totalTaxPrice - discountPrice |
| | | */ |
| | | private BigDecimal totalPrice; |
| | | /** |
| | | * 伿 çï¼ç¾åæ¯ |
| | | */ |
| | | private BigDecimal discountPercent; |
| | | /** |
| | | * 伿 éé¢ï¼åä½ï¼å
|
| | | * |
| | | * discountPrice = (totalProductPrice + totalTaxPrice) * discountPercent |
| | | */ |
| | | private BigDecimal discountPrice; |
| | | |
| | | /** |
| | | * 工使µç¼å· |
| | | */ |
| | | private String processInstanceId; |
| | | |
| | | /** |
| | | * å
³èéè´è®¢åç¼å·ï¼å®¡æ¹éè¿åçæï¼ |
| | | * |
| | | * å
³è {@link ErpPurchaseOrderDO#getId()} |
| | | */ |
| | | private Long orderId; |
| | | /** |
| | | * çæéè´è®¢åæ¶é´ |
| | | */ |
| | | private LocalDateTime orderTime; |
| | | |
| | | /** |
| | | * éä»¶å°å |
| | | */ |
| | | private String fileUrl; |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.dataobject.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; |
| | | 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.LocalDate; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯·æç» DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("erp_purchase_request_items") |
| | | @KeySequence("erp_purchase_request_items_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class ErpPurchaseRequestItemDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | /** |
| | | * éè´ç³è¯·ç¼å· |
| | | * |
| | | * å
³è {@link ErpPurchaseRequestDO#getId()} |
| | | */ |
| | | private Long requestId; |
| | | /** |
| | | * 产åç¼å· |
| | | * |
| | | * å
³è {@link ErpProductDO#getId()} |
| | | */ |
| | | private Long productId; |
| | | /** |
| | | * 产ååä½ç¼å· |
| | | * |
| | | * åä½ {@link ErpProductDO#getUnitId()} |
| | | */ |
| | | private Long productUnitId; |
| | | |
| | | /** |
| | | * 产ååä»·ï¼åèä»·ï¼ï¼åä½ï¼å
|
| | | */ |
| | | private BigDecimal productPrice; |
| | | /** |
| | | * æ°é |
| | | */ |
| | | private BigDecimal count; |
| | | /** |
| | | * æ»ä»·ï¼åä½ï¼å
|
| | | * |
| | | * totalPrice = productPrice * count |
| | | */ |
| | | private BigDecimal totalPrice; |
| | | /** |
| | | * ç¨çï¼ç¾åæ¯ |
| | | */ |
| | | private BigDecimal taxPercent; |
| | | /** |
| | | * ç¨é¢ï¼åä½ï¼å
|
| | | * |
| | | * taxPrice = totalPrice * taxPercent |
| | | */ |
| | | private BigDecimal taxPrice; |
| | | |
| | | /** |
| | | * éæ±æ¥æ |
| | | */ |
| | | private LocalDate demandTime; |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| | |
| | | /** |
| | | * 客æ·ç¼å· |
| | | * |
| | | * å
³è {@link ErpCustomerDO#getId()} |
| | | * å
³è CRM å®¢æ· {@link cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO#getId()} |
| | | */ |
| | | private Long customerId; |
| | | /** |
| | | * å
³è CRM ååç¼å· |
| | | */ |
| | | private Long contractId; |
| | | /** |
| | | * CRM åååå· |
| | | */ |
| | | private String contractNo; |
| | | /** |
| | | * ç»ç®è´¦æ·ç¼å· |
| | | * |
| | | * å
³è {@link ErpAccountDO#getId()} |
| | |
| | | /** |
| | | * 客æ·ç¼å· |
| | | * |
| | | * å
³è {@link ErpCustomerDO#getId()} |
| | | * å
³è CRM å®¢æ· {@link cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO#getId()} |
| | | */ |
| | | private Long customerId; |
| | | /** |
| | |
| | | /** |
| | | * 客æ·ç¼å· |
| | | * |
| | | * å
³è {@link ErpCustomerDO#getId()} |
| | | * å
³è CRM å®¢æ· {@link cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO#getId()} |
| | | */ |
| | | private Long customerId; |
| | | /** |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.mysql.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestItemDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯·æç» Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface ErpPurchaseRequestItemMapper extends BaseMapperX<ErpPurchaseRequestItemDO> { |
| | | |
| | | default List<ErpPurchaseRequestItemDO> selectListByRequestId(Long requestId) { |
| | | return selectList(ErpPurchaseRequestItemDO::getRequestId, requestId); |
| | | } |
| | | |
| | | default List<ErpPurchaseRequestItemDO> selectListByRequestIds(Collection<Long> requestIds) { |
| | | return selectList(ErpPurchaseRequestItemDO::getRequestId, requestIds); |
| | | } |
| | | |
| | | default int deleteByRequestId(Long requestId) { |
| | | return delete(ErpPurchaseRequestItemDO::getRequestId, requestId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.mysql.purchase; |
| | | |
| | | 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.MPJLambdaWrapperX; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestItemDO; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯· Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface ErpPurchaseRequestMapper extends BaseMapperX<ErpPurchaseRequestDO> { |
| | | |
| | | default PageResult<ErpPurchaseRequestDO> selectPage(ErpPurchaseRequestPageReqVO reqVO) { |
| | | MPJLambdaWrapperX<ErpPurchaseRequestDO> query = new MPJLambdaWrapperX<ErpPurchaseRequestDO>() |
| | | .likeIfPresent(ErpPurchaseRequestDO::getNo, reqVO.getNo()) |
| | | .eqIfPresent(ErpPurchaseRequestDO::getRequestUserId, reqVO.getRequestUserId()) |
| | | .eqIfPresent(ErpPurchaseRequestDO::getRequestDeptId, reqVO.getRequestDeptId()) |
| | | .betweenIfPresent(ErpPurchaseRequestDO::getRequestTime, reqVO.getRequestTime()) |
| | | .eqIfPresent(ErpPurchaseRequestDO::getStatus, reqVO.getStatus()) |
| | | .likeIfPresent(ErpPurchaseRequestDO::getRequestReason, reqVO.getRequestReason()) |
| | | .orderByDesc(ErpPurchaseRequestDO::getId); |
| | | if (reqVO.getProductId() != null) { |
| | | query.leftJoin(ErpPurchaseRequestItemDO.class, ErpPurchaseRequestItemDO::getRequestId, ErpPurchaseRequestDO::getId) |
| | | .eq(ErpPurchaseRequestItemDO::getProductId, reqVO.getProductId()) |
| | | .groupBy(ErpPurchaseRequestDO::getId); |
| | | } |
| | | return selectJoinPage(reqVO, ErpPurchaseRequestDO.class, query); |
| | | } |
| | | |
| | | default int updateByIdAndStatus(Long id, Integer status, ErpPurchaseRequestDO updateObj) { |
| | | return update(updateObj, new LambdaUpdateWrapper<ErpPurchaseRequestDO>() |
| | | .eq(ErpPurchaseRequestDO::getId, id).eq(ErpPurchaseRequestDO::getStatus, status)); |
| | | } |
| | | |
| | | default ErpPurchaseRequestDO selectByNo(String no) { |
| | | return selectOne(ErpPurchaseRequestDO::getNo, no); |
| | | } |
| | | |
| | | } |
| | |
| | | return selectOne(ErpSaleOrderDO::getNo, no); |
| | | } |
| | | |
| | | default ErpSaleOrderDO selectByContractId(Long contractId) { |
| | | return selectOne(ErpSaleOrderDO::getContractId, contractId); |
| | | } |
| | | |
| | | } |
| | |
| | | */ |
| | | public static final String PURCHASE_ORDER_NO_PREFIX = "CGDD"; |
| | | /** |
| | | * éè´ç³è¯· {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO} |
| | | */ |
| | | public static final String PURCHASE_REQUEST_NO_PREFIX = "CGSQ"; |
| | | /** |
| | | * éè´å
¥åº {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO} |
| | | */ |
| | | public static final String PURCHASE_IN_NO_PREFIX = "CGRK"; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯·å®¡æ¹ç¶ææä¸¾ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum ErpPurchaseRequestStatusEnum implements ArrayValuable<Integer> { |
| | | |
| | | DRAFT(0, "æªæäº¤"), |
| | | PROCESS(10, "审æ¹ä¸"), |
| | | APPROVE(20, "å®¡æ ¸éè¿"), |
| | | REJECT(30, "å®¡æ ¸ä¸éè¿"), |
| | | CANCEL(40, "已忶"); |
| | | |
| | | private final Integer status; |
| | | private final String name; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()) |
| | | .map(ErpPurchaseRequestStatusEnum::getStatus).toArray(Integer[]::new); |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| | |
| | | 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_BPM_CATEGORY_NOT_EXISTS = new ErrorCode(1_030_101_011, "éè´å®¡æ ¸åç±»ä¸åå¨ï¼è¯·å
å¨BPM模åå建éè´å®¡æ ¸æµç¨åç±»"); |
| | | ErrorCode PURCHASE_ORDER_BPM_PROCESS_DEFINITION_NOT_EXISTS = 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, "åå®¡æ ¸å¤±è´¥ï¼å·²åå¨å¯¹åºç仿¬¾å"); |
| | | |
| | | // ========== ERP éè´ç³è¯·ï¼1-030-104-000ï¼ ========== |
| | | ErrorCode PURCHASE_REQUEST_NOT_EXISTS = new ErrorCode(1_030_104_000, "éè´ç³è¯·åä¸åå¨"); |
| | | ErrorCode PURCHASE_REQUEST_DELETE_FAIL_NOT_DRAFT = new ErrorCode(1_030_104_001, "éè´ç³è¯·å({})䏿¯èç¨¿ç¶æï¼æ æ³å é¤"); |
| | | ErrorCode PURCHASE_REQUEST_UPDATE_FAIL_NOT_DRAFT = new ErrorCode(1_030_104_002, "éè´ç³è¯·å({})䏿¯èç¨¿ç¶æï¼æ æ³ä¿®æ¹"); |
| | | ErrorCode PURCHASE_REQUEST_SUBMIT_FAIL_NOT_DRAFT = new ErrorCode(1_030_104_003, "æäº¤å¤±è´¥ï¼åªæèç¨¿ç¶æçç³è¯·åæè½æäº¤"); |
| | | ErrorCode PURCHASE_REQUEST_NO_EXISTS = new ErrorCode(1_030_104_004, "çæç³è¯·åå·å¤±è´¥ï¼è¯·éæ°æäº¤"); |
| | | ErrorCode PURCHASE_REQUEST_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS = new ErrorCode(1_030_104_005, "æ´æ°å®¡æ¹ç¶æå¤±è´¥ï¼åªæå®¡æ¹ä¸çç³è¯·åæè½æ´æ°"); |
| | | ErrorCode PURCHASE_REQUEST_NOT_APPROVE = new ErrorCode(1_030_104_006, "éè´ç³è¯·åæªå®¡æ ¸éè¿ï¼æ æ³æä½"); |
| | | ErrorCode PURCHASE_REQUEST_ORDER_EXISTS = new ErrorCode(1_030_104_007, "éè´ç³è¯·åå·²çæéè´è®¢åï¼è¯·å¿é夿ä½"); |
| | | ErrorCode PURCHASE_REQUEST_BPM_CATEGORY_NOT_EXISTS = new ErrorCode(1_030_104_008, "éè´ç³è¯·å®¡æ¹åç±»ä¸åå¨ï¼è¯·å
å¨BPM模åå建éè´ç³è¯·å®¡æ¹æµç¨åç±»"); |
| | | ErrorCode PURCHASE_REQUEST_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_030_104_009, "éè´ç³è¯·å®¡æ¹åç±»ä¸æ²¡æå¯ç¨çæµç¨æ¨¡åï¼è¯·å
å建并å叿µç¨"); |
| | | |
| | | // ========== ERP éè´éè´§ï¼1-030-103-000ï¼ ========== |
| | | ErrorCode PURCHASE_RETURN_NOT_EXISTS = new ErrorCode(1_030_103_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.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.receipt.ErpFinanceReceiptPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.receipt.ErpFinanceReceiptSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinanceReceiptDO; |
| | |
| | | import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; |
| | | import cn.iocoder.yudao.module.erp.enums.common.ErpBizTypeEnum; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpCustomerService; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOutService; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpSaleReturnService; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | |
| | | private ErpNoRedisDAO noRedisDAO; |
| | | |
| | | @Resource |
| | | private ErpCustomerService customerService; |
| | | private CrmCustomerApi customerApi; |
| | | @Resource |
| | | private ErpAccountService accountService; |
| | | @Resource |
| | |
| | | // 1.1 æ ¡éªè®¢åé¡¹çæææ§ |
| | | List<ErpFinanceReceiptItemDO> receiptItems = validateFinanceReceiptItems( |
| | | createReqVO.getCustomerId(), createReqVO.getItems()); |
| | | // 1.2 æ ¡éªå®¢æ· |
| | | customerService.validateCustomer(createReqVO.getCustomerId()); |
| | | // 1.2 æ ¡éªå®¢æ·ï¼ä½¿ç¨ CRM å®¢æ· APIï¼ |
| | | customerApi.validateCustomer(createReqVO.getCustomerId()); |
| | | // 1.3 æ ¡éªç»ç®è´¦æ· |
| | | if (createReqVO.getAccountId() != null) { |
| | | accountService.validateAccount(createReqVO.getAccountId()); |
| | |
| | | if (ErpAuditStatus.APPROVE.getStatus().equals(receipt.getStatus())) { |
| | | throw exception(FINANCE_RECEIPT_UPDATE_FAIL_APPROVE, receipt.getNo()); |
| | | } |
| | | // 1.2 æ ¡éªå®¢æ· |
| | | customerService.validateCustomer(updateReqVO.getCustomerId()); |
| | | // 1.2 æ ¡éªå®¢æ·ï¼ä½¿ç¨ CRM å®¢æ· APIï¼ |
| | | customerApi.validateCustomer(updateReqVO.getCustomerId()); |
| | | // 1.3 æ ¡éªç»ç®è´¦æ· |
| | | if (updateReqVO.getAccountId() != null) { |
| | | accountService.validateAccount(updateReqVO.getAccountId()); |
| | |
| | | ErpProductDO getProduct(Long id); |
| | | |
| | | /** |
| | | * è·å¾äº§å VO |
| | | * |
| | | * @param id ç¼å· |
| | | * @return 产å VO |
| | | */ |
| | | ErpProductRespVO getProductVO(Long id); |
| | | |
| | | /** |
| | | * è·å¾æå®ç¶æç产å VO å表 |
| | | * |
| | | * @param status ç¶æ |
| | |
| | | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | 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.enums.MdmItemTypeEnum; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | |
| | | /** |
| | | * ERP 产å Service å®ç°ç±» |
| | | * |
| | | * æ¹é 说æï¼äº§åæ°æ®ç»ä¸ä½¿ç¨ MDM ä¸»æ°æ®ç®¡çï¼itemType=2 产åç±»åï¼ |
| | | * - åå»ºãæ´æ°ãå 餿ä½éè¿ MDM API è¿è¡ |
| | | * - æ¥è¯¢æä½ä» MDM è·åæ°æ® |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | |
| | | private ErpProductMapper productMapper; |
| | | |
| | | @Resource |
| | | private ErpProductCategoryService productCategoryService; |
| | | @Resource |
| | | private ErpProductUnitService productUnitService; |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | @Override |
| | | public Long createProduct(ProductSaveReqVO createReqVO) { |
| | | // TODO èè¿ï¼æ ¡éªåç±» |
| | | // æå
¥ |
| | | ErpProductDO product = BeanUtils.toBean(createReqVO, ErpProductDO.class); |
| | | productMapper.insert(product); |
| | | // è¿å |
| | | return product.getId(); |
| | | // 1. æ ¡éªæ¡ç æ¯å¦éå¤ |
| | | MdmItemRespDTO existItem = mdmItemApi.getItemByBarCode(createReqVO.getBarCode()).getCheckedData(); |
| | | if (existItem != null) { |
| | | throw exception(PRODUCT_BAR_CODE_EXISTS); |
| | | } |
| | | // 2. éè¿ MDM API å建产å |
| | | MdmItemCreateReqDTO createReqDTO = new MdmItemCreateReqDTO(); |
| | | createReqDTO.setCode(createReqVO.getBarCode()); // ä½¿ç¨æ¡ç ä½ä¸ºç¼ç |
| | | createReqDTO.setName(createReqVO.getName()); |
| | | createReqDTO.setBarCode(createReqVO.getBarCode()); |
| | | createReqDTO.setSpecification(createReqVO.getStandard()); |
| | | createReqDTO.setCategoryId(createReqVO.getCategoryId()); |
| | | createReqDTO.setUnitMeasureId(createReqVO.getUnitId()); |
| | | createReqDTO.setItemType(MdmItemTypeEnum.PRODUCT.getType()); // 产åç±»å |
| | | createReqDTO.setStatus(createReqVO.getStatus() != null ? createReqVO.getStatus() : CommonStatusEnum.ENABLE.getStatus()); |
| | | createReqDTO.setPurchasePrice(createReqVO.getPurchasePrice()); |
| | | createReqDTO.setSalesPrice(createReqVO.getSalePrice()); |
| | | createReqDTO.setCostPrice(createReqVO.getMinPrice()); |
| | | createReqDTO.setExpiryDay(createReqVO.getExpiryDay()); |
| | | createReqDTO.setWeight(createReqVO.getWeight()); |
| | | createReqDTO.setRemark(createReqVO.getRemark()); |
| | | return mdmItemApi.createItem(createReqDTO).getCheckedData(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateProduct(ProductSaveReqVO updateReqVO) { |
| | | // TODO èè¿ï¼æ ¡éªåç±» |
| | | // æ ¡éªåå¨ |
| | | validateProductExists(updateReqVO.getId()); |
| | | // æ´æ° |
| | | ErpProductDO updateObj = BeanUtils.toBean(updateReqVO, ErpProductDO.class); |
| | | productMapper.updateById(updateObj); |
| | | // 1. æ ¡éªåå¨ |
| | | MdmItemRespDTO existItem = mdmItemApi.getItem(updateReqVO.getId()).getCheckedData(); |
| | | if (existItem == null) { |
| | | throw exception(PRODUCT_NOT_EXISTS); |
| | | } |
| | | // 2. æ ¡éªæ¡ç æ¯å¦éå¤ |
| | | if (!existItem.getBarCode().equals(updateReqVO.getBarCode())) { |
| | | MdmItemRespDTO barCodeItem = mdmItemApi.getItemByBarCode(updateReqVO.getBarCode()).getCheckedData(); |
| | | if (barCodeItem != null) { |
| | | throw exception(PRODUCT_BAR_CODE_EXISTS); |
| | | } |
| | | } |
| | | // 3. éè¿ MDM API æ´æ°äº§å |
| | | MdmItemUpdateReqDTO updateReqDTO = new MdmItemUpdateReqDTO(); |
| | | updateReqDTO.setId(updateReqVO.getId()); |
| | | updateReqDTO.setCode(updateReqVO.getBarCode()); |
| | | updateReqDTO.setName(updateReqVO.getName()); |
| | | updateReqDTO.setBarCode(updateReqVO.getBarCode()); |
| | | updateReqDTO.setSpecification(updateReqVO.getStandard()); |
| | | updateReqDTO.setCategoryId(updateReqVO.getCategoryId()); |
| | | updateReqDTO.setUnitMeasureId(updateReqVO.getUnitId()); |
| | | updateReqDTO.setItemType(MdmItemTypeEnum.PRODUCT.getType()); |
| | | updateReqDTO.setStatus(updateReqVO.getStatus()); |
| | | updateReqDTO.setPurchasePrice(updateReqVO.getPurchasePrice()); |
| | | updateReqDTO.setSalesPrice(updateReqVO.getSalePrice()); |
| | | updateReqDTO.setCostPrice(updateReqVO.getMinPrice()); |
| | | updateReqDTO.setExpiryDay(updateReqVO.getExpiryDay()); |
| | | updateReqDTO.setWeight(updateReqVO.getWeight()); |
| | | updateReqDTO.setRemark(updateReqVO.getRemark()); |
| | | mdmItemApi.updateItem(updateReqDTO); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteProduct(Long id) { |
| | | // æ ¡éªåå¨ |
| | | validateProductExists(id); |
| | | // å é¤ |
| | | productMapper.deleteById(id); |
| | | MdmItemRespDTO item = mdmItemApi.getItem(id).getCheckedData(); |
| | | if (item == null) { |
| | | throw exception(PRODUCT_NOT_EXISTS); |
| | | } |
| | | // éè¿ MDM API å é¤ï¼æ´æ°ç¶æä¸ºç¦ç¨ï¼ |
| | | 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); |
| | | // ä» MDM è·åäº§åæ°æ® |
| | | List<MdmItemRespDTO> items = mdmItemApi.getItemList(ids).getCheckedData(); |
| | | Map<Long, MdmItemRespDTO> itemMap = convertMap(items, MdmItemRespDTO::getId); |
| | | List<ErpProductDO> result = new ArrayList<>(); |
| | | 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()); |
| | | } |
| | | // 转æ¢ä¸º ErpProductDO |
| | | result.add(convertToErpProduct(item)); |
| | | } |
| | | return list; |
| | | return result; |
| | | } |
| | | |
| | | private void validateProductExists(Long id) { |
| | | if (productMapper.selectById(id) == null) { |
| | | // ä» MDM æ ¡éª |
| | | MdmItemRespDTO item = mdmItemApi.getItem(id).getCheckedData(); |
| | | if (item == null) { |
| | | throw exception(PRODUCT_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public ErpProductDO getProduct(Long id) { |
| | | return productMapper.selectById(id); |
| | | // ä» MDM è·åäº§åæ°æ® |
| | | MdmItemRespDTO item = mdmItemApi.getItem(id).getCheckedData(); |
| | | if (item == null) { |
| | | return null; |
| | | } |
| | | // æ£æ¥æ¯å¦ä¸ºäº§åç±»å |
| | | if (!MdmItemTypeEnum.PRODUCT.getType().equals(item.getItemType())) { |
| | | return null; |
| | | } |
| | | return convertToErpProduct(item); |
| | | } |
| | | |
| | | @Override |
| | | public ErpProductRespVO getProductVO(Long id) { |
| | | // ä» MDM è·åäº§åæ°æ® |
| | | MdmItemRespDTO item = mdmItemApi.getItem(id).getCheckedData(); |
| | | if (item == null) { |
| | | return null; |
| | | } |
| | | // æ£æ¥æ¯å¦ä¸ºäº§åç±»å |
| | | if (!MdmItemTypeEnum.PRODUCT.getType().equals(item.getItemType())) { |
| | | return null; |
| | | } |
| | | return convertToErpProductVO(item); |
| | | } |
| | | |
| | | /** |
| | | * å° MDM ç©æè½¬æ¢ä¸º ERP 产å VO |
| | | */ |
| | | private ErpProductRespVO convertToErpProductVO(MdmItemRespDTO item) { |
| | | ErpProductRespVO vo = new ErpProductRespVO(); |
| | | vo.setId(item.getId()); |
| | | vo.setName(item.getName()); |
| | | vo.setBarCode(item.getBarCode()); |
| | | vo.setStandard(item.getSpecification()); |
| | | vo.setCategoryId(item.getCategoryId()); |
| | | vo.setUnitId(item.getUnitMeasureId()); |
| | | vo.setStatus(item.getStatus()); |
| | | vo.setExpiryDay(item.getExpiryDay()); |
| | | vo.setWeight(item.getWeight()); |
| | | vo.setPurchasePrice(item.getPurchasePrice()); |
| | | vo.setSalePrice(item.getSalesPrice()); |
| | | vo.setMinPrice(item.getCostPrice()); |
| | | vo.setRemark(item.getRemark()); |
| | | return vo; |
| | | } |
| | | |
| | | @Override |
| | | public List<ErpProductRespVO> getProductVOListByStatus(Integer status) { |
| | | List<ErpProductDO> list = productMapper.selectListByStatus(status); |
| | | return buildProductVOList(list); |
| | | // ä» MDM è·åäº§åæ°æ®ï¼itemType=2ï¼ |
| | | List<MdmItemRespDTO> items = mdmItemApi.getItemListByStatus(status).getCheckedData(); |
| | | // è¿æ»¤äº§åç±»å |
| | | items = items.stream() |
| | | .filter(item -> MdmItemTypeEnum.PRODUCT.getType().equals(item.getItemType())) |
| | | .toList(); |
| | | return buildProductVOListFromMdm(items); |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | List<ErpProductDO> list = productMapper.selectByIds(ids); |
| | | return buildProductVOList(list); |
| | | // ä» MDM è·åäº§åæ°æ® |
| | | List<MdmItemRespDTO> items = mdmItemApi.getItemList(ids).getCheckedData(); |
| | | return buildProductVOListFromMdm(items); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<ErpProductRespVO> getProductVOPage(ErpProductPageReqVO pageReqVO) { |
| | | PageResult<ErpProductDO> pageResult = productMapper.selectPage(pageReqVO); |
| | | return new PageResult<>(buildProductVOList(pageResult.getList()), pageResult.getTotal()); |
| | | // ä» MDM è·å产ååé¡µæ°æ® |
| | | cn.iocoder.yudao.framework.common.pojo.PageResult<MdmItemRespDTO> mdmPageResult = |
| | | mdmItemApi.getItemPage(MdmItemTypeEnum.PRODUCT.getType(), null, |
| | | pageReqVO.getPageNo(), pageReqVO.getPageSize()).getCheckedData(); |
| | | return new PageResult<>(buildProductVOListFromMdm(mdmPageResult.getList()), mdmPageResult.getTotal()); |
| | | } |
| | | |
| | | private List<ErpProductRespVO> buildProductVOList(List<ErpProductDO> list) { |
| | | if (CollUtil.isEmpty(list)) { |
| | | /** |
| | | * ä» MDM æ°æ®æå»º ERP 产å VO å表 |
| | | */ |
| | | private List<ErpProductRespVO> buildProductVOListFromMdm(List<MdmItemRespDTO> items) { |
| | | if (CollUtil.isEmpty(items)) { |
| | | 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> result = new ArrayList<>(); |
| | | for (MdmItemRespDTO item : items) { |
| | | ErpProductRespVO vo = new ErpProductRespVO(); |
| | | vo.setId(item.getId()); |
| | | vo.setName(item.getName()); |
| | | vo.setBarCode(item.getBarCode()); |
| | | vo.setStandard(item.getSpecification()); |
| | | vo.setCategoryId(item.getCategoryId()); |
| | | vo.setUnitId(item.getUnitMeasureId()); |
| | | vo.setStatus(item.getStatus()); |
| | | vo.setExpiryDay(item.getExpiryDay()); |
| | | vo.setWeight(item.getWeight()); |
| | | vo.setPurchasePrice(item.getPurchasePrice()); |
| | | vo.setSalePrice(item.getSalesPrice()); |
| | | vo.setMinPrice(item.getCostPrice()); // ä½¿ç¨ææ¬ä»·ä½ä¸ºæä½ä»· |
| | | vo.setRemark(item.getRemark()); |
| | | // åç±»åç§°ååä½åç§°éè¦é¢å¤æ¥è¯¢ï¼ç®åå¤çï¼åç»å¯ä¼åï¼ |
| | | result.add(vo); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * å° MDM ç©æè½¬æ¢ä¸º ERP 产å DO |
| | | */ |
| | | private ErpProductDO convertToErpProduct(MdmItemRespDTO item) { |
| | | ErpProductDO product = new ErpProductDO(); |
| | | product.setId(item.getId()); |
| | | product.setName(item.getName()); |
| | | product.setBarCode(item.getBarCode()); |
| | | product.setStandard(item.getSpecification()); |
| | | product.setCategoryId(item.getCategoryId()); |
| | | product.setUnitId(item.getUnitMeasureId()); |
| | | product.setStatus(item.getStatus()); |
| | | product.setExpiryDay(item.getExpiryDay()); |
| | | product.setWeight(item.getWeight()); |
| | | product.setPurchasePrice(item.getPurchasePrice()); |
| | | product.setSalePrice(item.getSalesPrice()); |
| | | product.setMinPrice(item.getCostPrice()); |
| | | product.setRemark(item.getRemark()); |
| | | return product; |
| | | } |
| | | |
| | | @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(); |
| | | } |
| | | |
| | | } |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.*; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| | | import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; |
| | | |
| | | // TODO èè¿ï¼è®°å½æä½æ¥å¿ |
| | | |
| | | /** |
| | | * ERP éè´è®¢å Service å®ç°ç±» |
| | | * |
| | | * 注æï¼éè´è®¢åä¸éè¦ BPM 审æ¹ï¼å®¡æ¹æµç¨å¨éè´ç³è¯·é¶æ®µå®æã |
| | | * éè´è®¢åç±éè´ç³è¯·çæï¼æç´æ¥å建ï¼ç¶æä¸ºå·²å®¡æ ¸ï¼ã |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | |
| | | throw exception(PURCHASE_ORDER_NO_EXISTS); |
| | | } |
| | | |
| | | // 2.1 æå
¥è®¢å |
| | | // 2.1 æå
¥è®¢åï¼éè´è®¢åä¸éè¦å®¡æ¹ï¼ç´æ¥ä¸ºå·²å®¡æ ¸ç¶æï¼ |
| | | ErpPurchaseOrderDO purchaseOrder = BeanUtils.toBean(createReqVO, ErpPurchaseOrderDO.class, in -> in |
| | | .setNo(no).setStatus(ErpAuditStatus.PROCESS.getStatus())); |
| | | .setNo(no).setStatus(ErpAuditStatus.APPROVE.getStatus())); |
| | | calculateTotalPrice(purchaseOrder, purchaseOrderItems); |
| | | purchaseOrderMapper.insert(purchaseOrder); |
| | | // 2.2 æå
¥è®¢å项 |
| | |
| | | public void updatePurchaseOrder(ErpPurchaseOrderSaveReqVO updateReqVO) { |
| | | // 1.1 æ ¡éªåå¨ |
| | | ErpPurchaseOrderDO purchaseOrder = validatePurchaseOrderExists(updateReqVO.getId()); |
| | | // éè´è®¢åä¸å
许修æ¹ï¼å·²å®¡æ ¸ç¶æï¼ |
| | | if (ErpAuditStatus.APPROVE.getStatus().equals(purchaseOrder.getStatus())) { |
| | | throw exception(PURCHASE_ORDER_UPDATE_FAIL_APPROVE, purchaseOrder.getNo()); |
| | | } |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updatePurchaseOrderStatus(Long id, Integer status) { |
| | | // éè´è®¢åä¸åæ¯æç¶ææµè½¬ï¼ä¸éè¦å®¡æ¹ï¼ |
| | | // æ¤æ¹æ³ä¿çç¨äºç¹æ®æ
åµï¼å¦åå®¡æ ¸åéæ°å®¡æ ¸ï¼ |
| | | boolean approve = ErpAuditStatus.APPROVE.getStatus().equals(status); |
| | | // 1.1 æ ¡éªåå¨ |
| | | ErpPurchaseOrderDO purchaseOrder = validatePurchaseOrderExists(id); |
| | |
| | | if (purchaseOrder.getStatus().equals(status)) { |
| | | throw exception(approve ? PURCHASE_ORDER_APPROVE_FAIL : PURCHASE_ORDER_PROCESS_FAIL); |
| | | } |
| | | // 1.3 åå¨éè´å
¥åï¼æ æ³åå®¡æ ¸ |
| | | if (!approve && purchaseOrder.getInCount().compareTo(BigDecimal.ZERO) > 0) { |
| | | // 1.3 åå¨éè´å
¥åºåï¼æ æ³åå®¡æ ¸ |
| | | BigDecimal inCount = purchaseOrder.getInCount(); |
| | | if (!approve && inCount != null && inCount.compareTo(BigDecimal.ZERO) > 0) { |
| | | throw exception(PURCHASE_ORDER_PROCESS_FAIL_EXISTS_IN); |
| | | } |
| | | // 1.4 åå¨éè´éè´§åï¼æ æ³åå®¡æ ¸ |
| | | if (!approve && purchaseOrder.getReturnCount().compareTo(BigDecimal.ZERO) > 0) { |
| | | BigDecimal returnCount = purchaseOrder.getReturnCount(); |
| | | if (!approve && returnCount != null && returnCount.compareTo(BigDecimal.ZERO) > 0) { |
| | | throw exception(PURCHASE_ORDER_PROCESS_FAIL_EXISTS_RETURN); |
| | | } |
| | | |
| | |
| | | private void updatePurchaseOrderItemList(Long id, List<ErpPurchaseOrderItemDO> newList) { |
| | | // ç¬¬ä¸æ¥ï¼å¯¹æ¯æ°èæ°æ®ï¼è·å¾æ·»å ãä¿®æ¹ãå é¤çå表 |
| | | List<ErpPurchaseOrderItemDO> oldList = purchaseOrderItemMapper.selectListByOrderId(id); |
| | | List<List<ErpPurchaseOrderItemDO>> diffList = diffList(oldList, newList, // id ä¸åï¼å°±è®¤ä¸ºæ¯ä¸åçè®°å½ |
| | | List<List<ErpPurchaseOrderItemDO>> diffList = diffList(oldList, newList, |
| | | (oldVal, newVal) -> oldVal.getId().equals(newVal.getId())); |
| | | |
| | | // ç¬¬äºæ¥ï¼æ¹éæ·»å ãä¿®æ¹ãå é¤ |
| | |
| | | } |
| | | }); |
| | | |
| | | // 2. éåå é¤ï¼å¹¶è®°å½æä½æ¥å¿ |
| | | // 2. éåå é¤ |
| | | purchaseOrders.forEach(purchaseOrder -> { |
| | | // 2.1 å é¤è®¢å |
| | | purchaseOrderMapper.deleteById(purchaseOrder.getId()); |
| | | // 2.2 å é¤è®¢å项 |
| | | purchaseOrderItemMapper.deleteByOrderId(purchaseOrder.getId()); |
| | | }); |
| | | } |
| | |
| | | return purchaseOrderItemMapper.selectListByOrderIds(orderIds); |
| | | } |
| | | |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestItemDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯· Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface ErpPurchaseRequestService { |
| | | |
| | | /** |
| | | * å建éè´ç³è¯· |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @param userId ç¨æ·ç¼å·ï¼ç³è¯·äººï¼ |
| | | * @param deptId é¨é¨ç¼å·ï¼ç³è¯·é¨é¨ï¼ |
| | | * @return ç¼å· |
| | | */ |
| | | Long createPurchaseRequest(@Valid ErpPurchaseRequestSaveReqVO createReqVO, Long userId, Long deptId); |
| | | |
| | | /** |
| | | * æ´æ°éè´ç³è¯· |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updatePurchaseRequest(@Valid ErpPurchaseRequestSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤éè´ç³è¯· |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | | */ |
| | | void deletePurchaseRequest(List<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾éè´ç³è¯· |
| | | * |
| | | * @param id ç¼å· |
| | | * @return éè´ç³è¯· |
| | | */ |
| | | ErpPurchaseRequestDO getPurchaseRequest(Long id); |
| | | |
| | | /** |
| | | * è·å¾éè´ç³è¯·å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return éè´ç³è¯·å页 |
| | | */ |
| | | PageResult<ErpPurchaseRequestDO> getPurchaseRequestPage(ErpPurchaseRequestPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾éè´ç³è¯·æç»å表 |
| | | * |
| | | * @param requestId éè´ç³è¯·ç¼å· |
| | | * @return éè´ç³è¯·æç»å表 |
| | | */ |
| | | List<ErpPurchaseRequestItemDO> getPurchaseRequestItemListByRequestId(Long requestId); |
| | | |
| | | /** |
| | | * è·å¾éè´ç³è¯·æç»å表 |
| | | * |
| | | * @param requestIds éè´ç³è¯·ç¼å·æ°ç» |
| | | * @return éè´ç³è¯·æç»å表 |
| | | */ |
| | | List<ErpPurchaseRequestItemDO> getPurchaseRequestItemListByRequestIds(Collection<Long> requestIds); |
| | | |
| | | /** |
| | | * æäº¤éè´ç³è¯·å®¡æ¹ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param processDefinitionKey æµç¨å®ä¹ Keyï¼ç¨æ·éæ©ï¼ |
| | | * @param userId ç¨æ·ç¼å· |
| | | */ |
| | | void submitPurchaseRequest(Long id, String processDefinitionKey, Long userId); |
| | | |
| | | /** |
| | | * æ´æ°éè´ç³è¯·å®¡æ¹ç¶æ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | */ |
| | | void updatePurchaseRequestAuditStatus(Long id, Integer bpmResult); |
| | | |
| | | /** |
| | | * æ ¹æ®éè´ç³è¯·çæéè´è®¢å |
| | | * |
| | | * @param id éè´ç³è¯·ç¼å· |
| | | * @param supplierId ä¾åºåç¼å· |
| | | * @param userId ç¨æ·ç¼å· |
| | | * @return éè´è®¢åç¼å· |
| | | */ |
| | | Long generatePurchaseOrder(Long id, Long supplierId, Long userId); |
| | | |
| | | /** |
| | | * è·åéè´ç³è¯·å®¡æ¹æµç¨å表 |
| | | * |
| | | * @return æµç¨å®ä¹å表 |
| | | */ |
| | | List<java.util.Map<String, Object>> getPurchaseRequestApproveProcessDefinitionList(); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.purchase; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.lang.Assert; |
| | | 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.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; |
| | | import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestItemDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseRequestItemMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseRequestMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpPurchaseRequestStatusEnum; |
| | | import cn.iocoder.yudao.module.erp.service.product.ErpProductService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.flowable.engine.repository.ProcessDefinition; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.*; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| | | import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯· Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class ErpPurchaseRequestServiceImpl implements ErpPurchaseRequestService { |
| | | |
| | | /** |
| | | * éè´ç³è¯· BPM åç±»ç¼ç |
| | | */ |
| | | private static final String PURCHASE_REQUEST_APPROVE_CATEGORY_CODE = "purchase_request_approve"; |
| | | |
| | | @Resource |
| | | private ErpPurchaseRequestMapper purchaseRequestMapper; |
| | | @Resource |
| | | private ErpPurchaseRequestItemMapper purchaseRequestItemMapper; |
| | | |
| | | @Resource |
| | | private ErpNoRedisDAO noRedisDAO; |
| | | |
| | | @Resource |
| | | private ErpProductService productService; |
| | | @Resource |
| | | private ErpSupplierService supplierService; |
| | | |
| | | @Resource |
| | | private BpmCategoryService bpmCategoryService; |
| | | @Resource |
| | | private BpmProcessDefinitionService bpmProcessDefinitionService; |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderService purchaseOrderService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createPurchaseRequest(ErpPurchaseRequestSaveReqVO createReqVO, Long userId, Long deptId) { |
| | | // 1.1 æ ¡éªè®¢åé¡¹çæææ§ |
| | | List<ErpPurchaseRequestItemDO> purchaseRequestItems = validatePurchaseRequestItems(createReqVO.getItems()); |
| | | // 1.2 çæç³è¯·åå·ï¼å¹¶æ ¡éªå¯ä¸æ§ |
| | | String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_REQUEST_NO_PREFIX); |
| | | if (purchaseRequestMapper.selectByNo(no) != null) { |
| | | throw exception(PURCHASE_REQUEST_NO_EXISTS); |
| | | } |
| | | |
| | | // æ¥å¿ï¼æ£æ¥é¨é¨åç¨æ·ä¿¡æ¯ |
| | | log.info("[createPurchaseRequest] å建éè´ç³è¯·ï¼userId={}, deptId={}", userId, deptId); |
| | | |
| | | // 2.1 æå
¥ç³è¯·å |
| | | ErpPurchaseRequestDO purchaseRequest = BeanUtils.toBean(createReqVO, ErpPurchaseRequestDO.class, req -> req |
| | | .setNo(no) |
| | | .setStatus(ErpPurchaseRequestStatusEnum.DRAFT.getStatus()) |
| | | .setRequestUserId(userId) |
| | | .setRequestDeptId(deptId)); |
| | | calculateTotalPrice(purchaseRequest, purchaseRequestItems); |
| | | purchaseRequestMapper.insert(purchaseRequest); |
| | | // 2.2 æå
¥ç³è¯·æç» |
| | | purchaseRequestItems.forEach(o -> o.setRequestId(purchaseRequest.getId())); |
| | | purchaseRequestItemMapper.insertBatch(purchaseRequestItems); |
| | | return purchaseRequest.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updatePurchaseRequest(ErpPurchaseRequestSaveReqVO updateReqVO) { |
| | | // 1.1 æ ¡éªåå¨ |
| | | ErpPurchaseRequestDO purchaseRequest = validatePurchaseRequestExists(updateReqVO.getId()); |
| | | // 1.2 æ ¡éªç¶æï¼åªæèç¨¿ç¶ææè½ä¿®æ¹ |
| | | if (!ErpPurchaseRequestStatusEnum.DRAFT.getStatus().equals(purchaseRequest.getStatus())) { |
| | | throw exception(PURCHASE_REQUEST_UPDATE_FAIL_NOT_DRAFT, purchaseRequest.getNo()); |
| | | } |
| | | // 1.3 æ ¡éªè®¢åé¡¹çæææ§ |
| | | List<ErpPurchaseRequestItemDO> purchaseRequestItems = validatePurchaseRequestItems(updateReqVO.getItems()); |
| | | |
| | | // 2.1 æ´æ°ç³è¯·å |
| | | ErpPurchaseRequestDO updateObj = BeanUtils.toBean(updateReqVO, ErpPurchaseRequestDO.class); |
| | | calculateTotalPrice(updateObj, purchaseRequestItems); |
| | | purchaseRequestMapper.updateById(updateObj); |
| | | // 2.2 æ´æ°ç³è¯·æç» |
| | | updatePurchaseRequestItemList(updateReqVO.getId(), purchaseRequestItems); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deletePurchaseRequest(List<Long> ids) { |
| | | // 1. æ ¡éªä¸å¤äºéèç¨¿ç¶æ |
| | | List<ErpPurchaseRequestDO> purchaseRequests = purchaseRequestMapper.selectByIds(ids); |
| | | if (CollUtil.isEmpty(purchaseRequests)) { |
| | | return; |
| | | } |
| | | purchaseRequests.forEach(purchaseRequest -> { |
| | | if (!ErpPurchaseRequestStatusEnum.DRAFT.getStatus().equals(purchaseRequest.getStatus())) { |
| | | throw exception(PURCHASE_REQUEST_DELETE_FAIL_NOT_DRAFT, purchaseRequest.getNo()); |
| | | } |
| | | }); |
| | | |
| | | // 2. éåå é¤ |
| | | purchaseRequests.forEach(purchaseRequest -> { |
| | | // 2.1 å é¤ç³è¯·å |
| | | purchaseRequestMapper.deleteById(purchaseRequest.getId()); |
| | | // 2.2 å é¤ç³è¯·æç» |
| | | purchaseRequestItemMapper.deleteByRequestId(purchaseRequest.getId()); |
| | | }); |
| | | } |
| | | |
| | | private ErpPurchaseRequestDO validatePurchaseRequestExists(Long id) { |
| | | ErpPurchaseRequestDO purchaseRequest = purchaseRequestMapper.selectById(id); |
| | | if (purchaseRequest == null) { |
| | | throw exception(PURCHASE_REQUEST_NOT_EXISTS); |
| | | } |
| | | return purchaseRequest; |
| | | } |
| | | |
| | | private List<ErpPurchaseRequestItemDO> validatePurchaseRequestItems(List<ErpPurchaseRequestSaveReqVO.Item> list) { |
| | | // 1. æ ¡éªäº§ååå¨ |
| | | List<ErpProductDO> productList = productService.validProductList( |
| | | convertSet(list, ErpPurchaseRequestSaveReqVO.Item::getProductId)); |
| | | Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId); |
| | | // 2. 转å为 ErpPurchaseRequestItemDO å表 |
| | | return convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseRequestItemDO.class, item -> { |
| | | item.setProductUnitId(productMap.get(item.getProductId()).getUnitId()); |
| | | if (item.getProductPrice() != null && item.getCount() != null) { |
| | | item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount())); |
| | | if (item.getTaxPercent() != null) { |
| | | item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent())); |
| | | } |
| | | } |
| | | })); |
| | | } |
| | | |
| | | private void updatePurchaseRequestItemList(Long id, List<ErpPurchaseRequestItemDO> newList) { |
| | | // ç¬¬ä¸æ¥ï¼å¯¹æ¯æ°èæ°æ®ï¼è·å¾æ·»å ãä¿®æ¹ãå é¤çå表 |
| | | List<ErpPurchaseRequestItemDO> oldList = purchaseRequestItemMapper.selectListByRequestId(id); |
| | | List<List<ErpPurchaseRequestItemDO>> diffList = diffList(oldList, newList, |
| | | (oldVal, newVal) -> oldVal.getId().equals(newVal.getId())); |
| | | |
| | | // ç¬¬äºæ¥ï¼æ¹éæ·»å ãä¿®æ¹ãå é¤ |
| | | if (CollUtil.isNotEmpty(diffList.get(0))) { |
| | | diffList.get(0).forEach(o -> o.setRequestId(id)); |
| | | purchaseRequestItemMapper.insertBatch(diffList.get(0)); |
| | | } |
| | | if (CollUtil.isNotEmpty(diffList.get(1))) { |
| | | purchaseRequestItemMapper.updateBatch(diffList.get(1)); |
| | | } |
| | | if (CollUtil.isNotEmpty(diffList.get(2))) { |
| | | purchaseRequestItemMapper.deleteByIds(convertList(diffList.get(2), ErpPurchaseRequestItemDO::getId)); |
| | | } |
| | | } |
| | | |
| | | private void calculateTotalPrice(ErpPurchaseRequestDO purchaseRequest, List<ErpPurchaseRequestItemDO> items) { |
| | | purchaseRequest.setTotalCount(getSumValue(items, ErpPurchaseRequestItemDO::getCount, BigDecimal::add)); |
| | | purchaseRequest.setTotalProductPrice(getSumValue(items, ErpPurchaseRequestItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)); |
| | | purchaseRequest.setTotalTaxPrice(getSumValue(items, ErpPurchaseRequestItemDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO)); |
| | | purchaseRequest.setTotalPrice(purchaseRequest.getTotalProductPrice().add(purchaseRequest.getTotalTaxPrice())); |
| | | // 计ç®ä¼æ ä»·æ ¼ |
| | | if (purchaseRequest.getDiscountPercent() == null) { |
| | | purchaseRequest.setDiscountPercent(BigDecimal.ZERO); |
| | | } |
| | | purchaseRequest.setDiscountPrice(MoneyUtils.priceMultiplyPercent(purchaseRequest.getTotalPrice(), purchaseRequest.getDiscountPercent())); |
| | | purchaseRequest.setTotalPrice(purchaseRequest.getTotalPrice().subtract(purchaseRequest.getDiscountPrice())); |
| | | } |
| | | |
| | | @Override |
| | | public ErpPurchaseRequestDO getPurchaseRequest(Long id) { |
| | | return purchaseRequestMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<ErpPurchaseRequestDO> getPurchaseRequestPage(ErpPurchaseRequestPageReqVO pageReqVO) { |
| | | return purchaseRequestMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public List<ErpPurchaseRequestItemDO> getPurchaseRequestItemListByRequestId(Long requestId) { |
| | | return purchaseRequestItemMapper.selectListByRequestId(requestId); |
| | | } |
| | | |
| | | @Override |
| | | public List<ErpPurchaseRequestItemDO> getPurchaseRequestItemListByRequestIds(Collection<Long> requestIds) { |
| | | if (CollUtil.isEmpty(requestIds)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return purchaseRequestItemMapper.selectListByRequestIds(requestIds); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitPurchaseRequest(Long id, String processDefinitionKey, Long userId) { |
| | | // 1. æ ¡éªç³è¯·ååå¨ä¸ä¸ºèç¨¿ç¶æ |
| | | ErpPurchaseRequestDO request = validatePurchaseRequestExists(id); |
| | | if (!ErpPurchaseRequestStatusEnum.DRAFT.getStatus().equals(request.getStatus())) { |
| | | throw exception(PURCHASE_REQUEST_SUBMIT_FAIL_NOT_DRAFT); |
| | | } |
| | | |
| | | // 2. æ ¡éªåç±»åæµç¨å®ä¹æ¯å¦åå¨ |
| | | validatePurchaseRequestApproveCategoryAndProcessDefinition(); |
| | | |
| | | // 3. æ ¡éªä¼ å
¥çæµç¨å®ä¹ Key æ¯å¦å±äºè¯¥åç±»ä¸å¤äºæ¿æ´»ç¶æ |
| | | ProcessDefinition processDefinition = bpmProcessDefinitionService.getActiveProcessDefinition(processDefinitionKey); |
| | | if (processDefinition == null) { |
| | | throw exception(PURCHASE_REQUEST_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | |
| | | // 4. å建æµç¨å®ä¾ï¼ä½¿ç¨ç¨æ·éæ©çæµç¨å®ä¹ Keyï¼ |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, |
| | | new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(processDefinitionKey) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | |
| | | // 5. æ´æ°ç³è¯·åç¶æ |
| | | purchaseRequestMapper.updateById(new ErpPurchaseRequestDO() |
| | | .setId(id) |
| | | .setProcessInstanceId(processInstanceId) |
| | | .setStatus(ErpPurchaseRequestStatusEnum.PROCESS.getStatus())); |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éª BPM éè´ç³è¯·å®¡æ¹åç±»åæµç¨å®ä¹æ¯å¦åå¨ |
| | | */ |
| | | private void validatePurchaseRequestApproveCategoryAndProcessDefinition() { |
| | | // 1. æ ¡éªåç±»æ¯å¦åå¨ |
| | | List<String> codes = Collections.singletonList(PURCHASE_REQUEST_APPROVE_CATEGORY_CODE); |
| | | Map<String, ?> categoryMap = bpmCategoryService.getCategoryMap(codes); |
| | | if (!categoryMap.containsKey(PURCHASE_REQUEST_APPROVE_CATEGORY_CODE)) { |
| | | throw exception(PURCHASE_REQUEST_BPM_CATEGORY_NOT_EXISTS); |
| | | } |
| | | |
| | | // 2. æ ¡éªåç±»ä¸æ¯å¦æå¯ç¨çæµç¨å®ä¹ |
| | | List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService |
| | | .getProcessDefinitionInfoListByCategory(PURCHASE_REQUEST_APPROVE_CATEGORY_CODE); |
| | | if (CollUtil.isEmpty(definitionInfoList)) { |
| | | throw exception(PURCHASE_REQUEST_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | |
| | | // 3. æ ¡éªæ¯å¦ææ¿æ´»ç¶æçæµç¨å®ä¹ |
| | | Set<String> processDefinitionIds = convertSet(definitionInfoList, BpmProcessDefinitionInfoDO::getProcessDefinitionId); |
| | | List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionList(processDefinitionIds); |
| | | boolean hasActiveDefinition = processDefinitions.stream() |
| | | .anyMatch(pd -> !pd.isSuspended()); |
| | | if (!hasActiveDefinition) { |
| | | throw exception(PURCHASE_REQUEST_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void updatePurchaseRequestAuditStatus(Long id, Integer bpmResult) { |
| | | // 1. æ ¡éªç³è¯·ååå¨ä¸ä¸ºå®¡æ¹ä¸ç¶æ |
| | | ErpPurchaseRequestDO request = validatePurchaseRequestExists(id); |
| | | if (!ErpPurchaseRequestStatusEnum.PROCESS.getStatus().equals(request.getStatus())) { |
| | | log.error("[updatePurchaseRequestAuditStatus] ç³è¯·å({}) ä¸å¤äºå®¡æ¹ä¸", id); |
| | | throw exception(PURCHASE_REQUEST_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS); |
| | | } |
| | | |
| | | // 2. 转æ¢å®¡æ¹ç»æ |
| | | Integer auditStatus = convertBpmResultToAuditStatus(bpmResult); |
| | | purchaseRequestMapper.updateById(new ErpPurchaseRequestDO() |
| | | .setId(id) |
| | | .setStatus(auditStatus)); |
| | | } |
| | | |
| | | /** |
| | | * BPM 审æ¹ç»æè½¬æ¢ |
| | | */ |
| | | private Integer convertBpmResultToAuditStatus(Integer bpmResult) { |
| | | Integer auditStatus = BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmResult) |
| | | ? ErpPurchaseRequestStatusEnum.APPROVE.getStatus() |
| | | : BpmTaskStatusEnum.REJECT.getStatus().equals(bpmResult) |
| | | ? ErpPurchaseRequestStatusEnum.REJECT.getStatus() |
| | | : BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmResult) |
| | | ? ErpPurchaseRequestStatusEnum.CANCEL.getStatus() : null; |
| | | Assert.notNull(auditStatus, "BPM 审æ¹ç»æ({}) 转æ¢å¤±è´¥", bpmResult); |
| | | return auditStatus; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long generatePurchaseOrder(Long id, Long supplierId, Long userId) { |
| | | // 1. æ ¡éªç³è¯·ååå¨ä¸å·²å®¡æ¹éè¿ |
| | | ErpPurchaseRequestDO request = validatePurchaseRequestExists(id); |
| | | if (!ErpPurchaseRequestStatusEnum.APPROVE.getStatus().equals(request.getStatus())) { |
| | | throw exception(PURCHASE_REQUEST_NOT_APPROVE); |
| | | } |
| | | // æ ¡éªæ¯å¦å·²çæéè´è®¢å |
| | | if (request.getOrderId() != null) { |
| | | throw exception(PURCHASE_REQUEST_ORDER_EXISTS); |
| | | } |
| | | |
| | | // 2. æ ¡éªä¾åºå |
| | | supplierService.validateSupplier(supplierId); |
| | | |
| | | // 3. è·åç³è¯·æç» |
| | | List<ErpPurchaseRequestItemDO> requestItems = purchaseRequestItemMapper.selectListByRequestId(id); |
| | | |
| | | // 4. æå»ºéè´è®¢å VO |
| | | ErpPurchaseOrderSaveReqVO orderVO = new ErpPurchaseOrderSaveReqVO(); |
| | | orderVO.setSupplierId(supplierId); |
| | | orderVO.setOrderTime(java.time.LocalDateTime.now()); |
| | | orderVO.setRemark("ç±éè´ç³è¯·å[" + request.getNo() + "]çæ"); |
| | | // è½¬æ¢æç»é¡¹ |
| | | orderVO.setItems(convertList(requestItems, item -> { |
| | | ErpPurchaseOrderSaveReqVO.Item orderItem = new ErpPurchaseOrderSaveReqVO.Item(); |
| | | orderItem.setProductId(item.getProductId()); |
| | | orderItem.setProductUnitId(item.getProductUnitId()); |
| | | orderItem.setProductPrice(item.getProductPrice()); |
| | | orderItem.setCount(item.getCount()); |
| | | orderItem.setTaxPercent(item.getTaxPercent()); |
| | | orderItem.setRemark(item.getRemark()); |
| | | return orderItem; |
| | | })); |
| | | |
| | | // 5. å建éè´è®¢å |
| | | Long orderId = purchaseOrderService.createPurchaseOrder(orderVO); |
| | | |
| | | // 6. æ´æ°ç³è¯·åå
³èä¿¡æ¯ |
| | | purchaseRequestMapper.updateById(new ErpPurchaseRequestDO() |
| | | .setId(id) |
| | | .setOrderId(orderId) |
| | | .setOrderTime(java.time.LocalDateTime.now())); |
| | | |
| | | return orderId; |
| | | } |
| | | |
| | | @Override |
| | | public List<Map<String, Object>> getPurchaseRequestApproveProcessDefinitionList() { |
| | | // 1. æ ¡éªåç±»åæµç¨å®ä¹æ¯å¦åå¨ |
| | | validatePurchaseRequestApproveCategoryAndProcessDefinition(); |
| | | |
| | | // 2. è·ååç±»ä¸çæµç¨å®ä¹ä¿¡æ¯ |
| | | List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService |
| | | .getProcessDefinitionInfoListByCategory(PURCHASE_REQUEST_APPROVE_CATEGORY_CODE); |
| | | |
| | | // 3. è·åæµç¨å®ä¹è¯¦æ
|
| | | Set<String> processDefinitionIds = convertSet(definitionInfoList, BpmProcessDefinitionInfoDO::getProcessDefinitionId); |
| | | List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionList(processDefinitionIds); |
| | | |
| | | // 4. è¿æ»¤ï¼åªä¿çæ¿æ´»ç¶æï¼ä¸ç¸å key åªä¿çææ°çæ¬ |
| | | Map<String, ProcessDefinition> latestVersionMap = new HashMap<>(); |
| | | for (ProcessDefinition pd : processDefinitions) { |
| | | if (pd.isSuspended()) { |
| | | continue; // è·³è¿æèµ·çæµç¨ |
| | | } |
| | | ProcessDefinition existing = latestVersionMap.get(pd.getKey()); |
| | | if (existing == null || pd.getVersion() > existing.getVersion()) { |
| | | latestVersionMap.put(pd.getKey(), pd); |
| | | } |
| | | } |
| | | |
| | | // 5. è¿åæµç¨å®ä¹å表 |
| | | List<Map<String, Object>> result = new ArrayList<>(); |
| | | for (ProcessDefinition pd : latestVersionMap.values()) { |
| | | Map<String, Object> item = new HashMap<>(); |
| | | item.put("id", pd.getId()); |
| | | item.put("key", pd.getKey()); |
| | | item.put("name", pd.getName()); |
| | | item.put("version", pd.getVersion()); |
| | | result.add(item); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.purchase.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseRequestMapper; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpPurchaseRequestStatusEnum; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseRequestService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.ApplicationListener; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * éè´ç³è¯·å®¡æ¹çç»æçå¬å¨å®ç°ç±» |
| | | * |
| | | * éè¿ businessKeyï¼éè´ç³è¯·IDï¼å¹é
ï¼è䏿¯åºå®çæµç¨å®ä¹ Keyï¼ |
| | | * è¿æ ·å¯ä»¥æ¯æåç±»ä¸ä»»æ Key çæµç¨æ¨¡åã |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class ErpPurchaseRequestStatusListener implements ApplicationListener<BpmProcessInstanceStatusEvent> { |
| | | |
| | | @Resource |
| | | private ErpPurchaseRequestService purchaseRequestService; |
| | | @Resource |
| | | private ErpPurchaseRequestMapper purchaseRequestMapper; |
| | | |
| | | @Override |
| | | public void onApplicationEvent(BpmProcessInstanceStatusEvent event) { |
| | | // éè¿ businessKey æ¥è¯¢éè´ç³è¯·å |
| | | Long requestId; |
| | | try { |
| | | requestId = Long.parseLong(event.getBusinessKey()); |
| | | } catch (NumberFormatException e) { |
| | | return; // businessKey 䏿¯æ°åï¼å¿½ç¥ |
| | | } |
| | | |
| | | ErpPurchaseRequestDO request = purchaseRequestMapper.selectById(requestId); |
| | | if (request == null) { |
| | | return; // 䏿¯éè´ç³è¯·ï¼å¿½ç¥ |
| | | } |
| | | |
| | | // åªæå®¡æ¹ä¸ç¶æçç³è¯·åæå¤ç |
| | | if (!ErpPurchaseRequestStatusEnum.PROCESS.getStatus().equals(request.getStatus())) { |
| | | log.warn("[onApplicationEvent] éè´ç³è¯·å({}) ä¸å¤äºå®¡æ¹ä¸ç¶æï¼å½åç¶æ: {}", requestId, request.getStatus()); |
| | | return; |
| | | } |
| | | |
| | | log.info("[onApplicationEvent] éè´ç³è¯·å({}) 审æ¹ç¶ææ´æ°: {}", requestId, event.getStatus()); |
| | | // æ´æ°å®¡æ¹ç¶æ |
| | | purchaseRequestService.updatePurchaseRequestAuditStatus(requestId, event.getStatus()); |
| | | } |
| | | |
| | | } |
| | |
| | | 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.crm.api.customer.CrmCustomerApi; |
| | | 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; |
| | |
| | | @Resource |
| | | private ErpProductService productService; |
| | | @Resource |
| | | private ErpCustomerService customerService; |
| | | private CrmCustomerApi customerApi; |
| | | @Resource |
| | | private ErpAccountService accountService; |
| | | |
| | |
| | | public Long createSaleOrder(ErpSaleOrderSaveReqVO createReqVO) { |
| | | // 1.1 æ ¡éªè®¢åé¡¹çæææ§ |
| | | List<ErpSaleOrderItemDO> saleOrderItems = validateSaleOrderItems(createReqVO.getItems()); |
| | | // 1.2 æ ¡éªå®¢æ· |
| | | customerService.validateCustomer(createReqVO.getCustomerId()); |
| | | // 1.2 æ ¡éªå®¢æ·ï¼ä½¿ç¨ CRM å®¢æ· APIï¼ |
| | | customerApi.validateCustomer(createReqVO.getCustomerId()); |
| | | // 1.3 æ ¡éªç»ç®è´¦æ· |
| | | if (createReqVO.getAccountId() != null) { |
| | | accountService.validateAccount(createReqVO.getAccountId()); |
| | |
| | | if (ErpAuditStatus.APPROVE.getStatus().equals(saleOrder.getStatus())) { |
| | | throw exception(SALE_ORDER_UPDATE_FAIL_APPROVE, saleOrder.getNo()); |
| | | } |
| | | // 1.2 æ ¡éªå®¢æ· |
| | | customerService.validateCustomer(updateReqVO.getCustomerId()); |
| | | // 1.2 æ ¡éªå®¢æ·ï¼ä½¿ç¨ CRM å®¢æ· APIï¼ |
| | | customerApi.validateCustomer(updateReqVO.getCustomerId()); |
| | | // 1.3 æ ¡éªç»ç®è´¦æ· |
| | | if (updateReqVO.getAccountId() != null) { |
| | | accountService.validateAccount(updateReqVO.getAccountId()); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?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> |
| | | |
| | | <!-- Swagger 注解 --> |
| | | <dependency> |
| | | <groupId>org.springdoc</groupId> |
| | | <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> |
| | | <scope>provided</scope> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | </project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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.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 = "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 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 ç©ææ´æ° 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.enums; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * MDM ç©æç±»åæä¸¾ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum MdmItemTypeEnum { |
| | | |
| | | MATERIAL(1, "ç©æ"), |
| | | PRODUCT(2, "产å"), |
| | | SEMI_FINISHED(3, "åæå"); |
| | | |
| | | /** |
| | | * ç±»åç¼ç |
| | | */ |
| | | 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; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?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-mdm-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <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 = "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 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)); |
| | | } |
| | | |
| | | @GetMapping("/list-by-ids") |
| | | @Operation(summary = "è·å¾åçå表") |
| | | @Parameter(name = "ids", description = "ç¼å·å表", required = true, example = "1,2,3") |
| | | @PreAuthorize("@ss.hasPermission('mdm:brand:query')") |
| | | public CommonResult<List<MdmBrandDO>> getBrandListByIds(@RequestParam("ids") List<Long> ids) { |
| | | return success(brandService.getBrandList(ids)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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/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)); |
| | | } |
| | | |
| | | @GetMapping("/list-all-simple") |
| | | @Operation(summary = "è·å¾å¯ç¨çåç±»å表") |
| | | public CommonResult<List<MdmItemCategoryRespVO>> getSimpleItemList() { |
| | | List<MdmItemCategoryDO> list = itemCategoryService.getSimpleItemList(); |
| | | 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.controller.admin.item.vo.MdmItemStatusUpdateReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mdm.service.item.MdmItemService; |
| | | 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 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 = "管çåå° - MDM ç©æä¸»æ°æ®") |
| | | @RestController |
| | | @RequestMapping("/mdm/item") |
| | | @Validated |
| | | public class MdmItemController { |
| | | |
| | | @Resource |
| | | private MdmItemService itemService; |
| | | |
| | | @Resource |
| | | private MdmUnitMeasureService unitMeasureService; |
| | | |
| | | @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 = "æ´æ°ç©æç¶æ") |
| | | @PreAuthorize("@ss.hasPermission('mdm:item:update')") |
| | | public CommonResult<Boolean> updateItemStatus(@RequestBody MdmItemStatusUpdateReqVO reqVO) { |
| | | itemService.updateItemStatus(reqVO.getId(), reqVO.getStatus()); |
| | | 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); |
| | | // å
³èæ¥è¯¢è®¡éåä½åç§° |
| | | Map<Long, MdmUnitMeasureDO> unitMap = unitMeasureService.getUnitMeasureMap( |
| | | convertSet(pageResult.getList(), MdmItemDO::getUnitMeasureId)); |
| | | // è½¬æ¢ |
| | | List<MdmItemRespVO> respList = BeanUtils.toBean(pageResult.getList(), MdmItemRespVO.class); |
| | | respList.forEach(resp -> { |
| | | MdmUnitMeasureDO unit = unitMap.get(resp.getUnitMeasureId()); |
| | | if (unit != null) { |
| | | resp.setUnitMeasureName(unit.getName()); |
| | | } |
| | | }); |
| | | return success(new PageResult<>(respList, pageResult.getTotal())); |
| | | } |
| | | |
| | | @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 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; |
| | | |
| | | @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 = "ç©æåç±»ç¼å·", example = "1") |
| | | private Long categoryId; |
| | | |
| | | @Schema(description = "计éåä½ç¼å·", example = "1") |
| | | private Long unitMeasureId; |
| | | |
| | | @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.item.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import jakarta.validation.constraints.NotNull; |
| | | |
| | | @Schema(description = "管çåå° - MDM ç©æç¶ææ´æ° Request VO") |
| | | @Data |
| | | public class MdmItemStatusUpdateReqVO { |
| | | |
| | | @Schema(description = "ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "ç©æç¼å·ä¸è½ä¸ºç©º") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | @NotNull(message = "ç¶æä¸è½ä¸ºç©º") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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") |
| | | @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)); |
| | | } |
| | | |
| | | @GetMapping("/list-by-ids") |
| | | @Operation(summary = "è·å¾è®¡éåä½å表") |
| | | @Parameter(name = "ids", description = "ç¼å·å表", required = true, example = "1,2,3") |
| | | @PreAuthorize("@ss.hasPermission('mdm:unit-measure:query')") |
| | | public CommonResult<List<MdmUnitMeasureDO>> getUnitMeasureListByIds(@RequestParam("ids") List<Long> ids) { |
| | | return success(unitMeasureService.getUnitMeasureList(ids)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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("mdm_brand") |
| | | @KeySequence("mdm_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("mdm_item_category") |
| | | @KeySequence("mdm_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: åæå |
| | | * 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("mdm_item_batch_config") |
| | | @KeySequence("mdm_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("mdm_item") |
| | | @KeySequence("mdm_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: åæå |
| | | */ |
| | | 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("mdm_unit_measure") |
| | | @KeySequence("mdm_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("mdm_warehouse") |
| | | @KeySequence("mdm_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 { |
| | | |
| | | MATERIAL(1, "ç©æ"), |
| | | PRODUCT(2, "产å"), |
| | | SEMI_FINISHED(3, "åæå"); |
| | | |
| | | /** |
| | | * ç±»åç¼ç |
| | | */ |
| | | 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); |
| | | |
| | | /** |
| | | * è·å¾å¯ç¨çåç±»å表 |
| | | * |
| | | * @return åç±»å表 |
| | | */ |
| | | List<MdmItemCategoryDO> getSimpleItemList(); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<MdmItemCategoryDO> getSimpleItemList() { |
| | | return itemCategoryMapper.selectList(new MdmItemCategoryDO().setStatus(0)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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()); |
| | | } |
| | | |
| | | @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 ä¸»æ°æ®ç®¡ç API --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-mdm</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ä¸å¡ç»ä»¶ --> |
| | | |
| | | <!-- Web ç¸å
³ --> |
| | |
| | | /** |
| | | * MES ç©æäº§å Service å®ç°ç±» |
| | | * |
| | | * 注æï¼å½åä¿æä½¿ç¨ MES æ¬å°è¡¨ï¼å¾
MDM æ°æ®è¿ç§»å®æåååæ¢å° MDM API |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | |
| | | return respVO; |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- MDM ä¸»æ°æ®ç®¡ç API --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-mdm</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ä¸å¡ç»ä»¶ --> |
| | | |
| | | <!-- Web ç¸å
³ --> |
| | |
| | | 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.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.enums.MdmItemTypeEnum; |
| | | 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 org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | |
| | | /** |
| | | * WMS åå Service å®ç°ç±» |
| | | * |
| | | * æ¹é 说æï¼åååºç¡æ°æ®ä» MDM 模åè·åï¼itemType=1 ç©æç±»åï¼ |
| | | * WMS ç¹æåè½ï¼SKUãåºåçï¼ä»ä¿ç WMS 管ç |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | |
| | | |
| | | @Resource |
| | | private WmsItemMapper itemMapper; |
| | | |
| | | @Resource |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | @Resource |
| | | @Lazy // å»¶è¿å è½½ï¼é¿å
循ç¯ä¾èµ |
| | | private WmsItemCategoryService categoryService; |
| | |
| | | // æ ¡éªæ°æ® |
| | | validateItemSaveData(createReqVO); |
| | | |
| | | // æå
¥åå |
| | | // æå
¥ååï¼ææ¶ä¿çåé»è¾ï¼åç»å¯å®å
¨è¿ç§»å° MDMï¼ |
| | | WmsItemDO item = BeanUtils.toBean(createReqVO, WmsItemDO.class); |
| | | itemMapper.insert(item); |
| | | // æå
¥ SKU |
| | |
| | | // æ ¡éªæ°æ® |
| | | validateItemSaveData(updateReqVO); |
| | | |
| | | // æ´æ°åå |
| | | // æ´æ°ååï¼ææ¶ä¿çåé»è¾ï¼ |
| | | WmsItemDO updateObj = BeanUtils.toBean(updateReqVO, WmsItemDO.class); |
| | | itemMapper.updateById(updateObj); |
| | | // æ´æ° SKU |
| | |
| | | } |
| | | |
| | | private void validateItemCodeUnique(Long id, String code) { |
| | | WmsItemDO item = itemMapper.selectByCode(code); |
| | | if (item == null) { |
| | | return; |
| | | } |
| | | if (id == null || ObjectUtil.notEqual(item.getId(), id)) { |
| | | // æ£æ¥ MDM ä¸ç¼ç å¯ä¸æ§ |
| | | MdmItemRespDTO item = mdmItemApi.getItemByCode(code).getCheckedData(); |
| | | if (item != null && ObjectUtil.notEqual(item.getId(), id)) { |
| | | throw exception(ITEM_CODE_DUPLICATE); |
| | | } |
| | | } |
| | |
| | | |
| | | @Override |
| | | public WmsItemDO validateItemExists(Long id) { |
| | | WmsItemDO item = itemMapper.selectById(id); |
| | | // ä» MDM æ ¡éªç©æåå¨ |
| | | MdmItemRespDTO item = mdmItemApi.validateItemExists(id).getCheckedData(); |
| | | if (item == null) { |
| | | throw exception(ITEM_NOT_EXISTS); |
| | | // 妿 MDM ä¸ä¸åå¨ï¼æ£æ¥æ¬å°è¡¨ |
| | | WmsItemDO localItem = itemMapper.selectById(id); |
| | | if (localItem == null) { |
| | | throw exception(ITEM_NOT_EXISTS); |
| | | } |
| | | return localItem; |
| | | } |
| | | return item; |
| | | return convertToWmsItem(item); |
| | | } |
| | | |
| | | @Override |
| | | public WmsItemDO getItem(Long id) { |
| | | return itemMapper.selectById(id); |
| | | // ä» MDM è·åç©ææ°æ®ï¼æ³¨æ WMS ID åç§» 30000ï¼ |
| | | MdmItemRespDTO item = mdmItemApi.getItem(id).getCheckedData(); |
| | | if (item == null) { |
| | | // 妿 MDM ä¸ä¸åå¨ï¼æ¥è¯¢æ¬å°è¡¨ |
| | | return itemMapper.selectById(id); |
| | | } |
| | | return convertToWmsItem(item); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<WmsItemDO> getItemPage(WmsItemPageReqVO pageReqVO) { |
| | | return itemMapper.selectPage(pageReqVO, |
| | | categoryService.getSelfAndChildItemCategoryIdList(pageReqVO.getCategoryId())); |
| | | // ä» MDM è·åç©æåé¡µæ°æ®ï¼itemType=1 ç©æç±»åï¼ |
| | | cn.iocoder.yudao.framework.common.pojo.PageResult<MdmItemRespDTO> mdmPageResult = |
| | | mdmItemApi.getItemPage(MdmItemTypeEnum.MATERIAL.getType(), null, |
| | | pageReqVO.getPageNo(), pageReqVO.getPageSize()).getCheckedData(); |
| | | |
| | | // 转æ¢ä¸º WMS åå DO |
| | | List<WmsItemDO> list = new ArrayList<>(); |
| | | for (MdmItemRespDTO item : mdmPageResult.getList()) { |
| | | list.add(convertToWmsItem(item)); |
| | | } |
| | | return new PageResult<>(list, mdmPageResult.getTotal()); |
| | | } |
| | | |
| | | @Override |
| | | public List<WmsItemDO> getItemList(WmsItemListReqVO listReqVO) { |
| | | return itemMapper.selectList(listReqVO, |
| | | categoryService.getSelfAndChildItemCategoryIdList(listReqVO.getCategoryId())); |
| | | // ä» MDM è·åç©æå表ï¼itemType=1 ç©æç±»åï¼ |
| | | List<MdmItemRespDTO> items = mdmItemApi.getItemListByStatus(null).getCheckedData(); |
| | | |
| | | List<WmsItemDO> result = new ArrayList<>(); |
| | | for (MdmItemRespDTO item : items) { |
| | | // åªè¿åç©æç±»å |
| | | if (MdmItemTypeEnum.MATERIAL.getType().equals(item.getItemType())) { |
| | | result.add(convertToWmsItem(item)); |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return itemMapper.selectByIds(ids); |
| | | // ä» MDM è·åç©æå表 |
| | | List<MdmItemRespDTO> items = mdmItemApi.getItemList(ids).getCheckedData(); |
| | | List<WmsItemDO> result = new ArrayList<>(); |
| | | for (MdmItemRespDTO item : items) { |
| | | result.add(convertToWmsItem(item)); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * å° MDM ç©æè½¬æ¢ä¸º WMS åå DO |
| | | */ |
| | | private WmsItemDO convertToWmsItem(MdmItemRespDTO item) { |
| | | WmsItemDO wmsItem = new WmsItemDO(); |
| | | wmsItem.setId(item.getId()); |
| | | wmsItem.setCode(item.getCode()); |
| | | wmsItem.setName(item.getName()); |
| | | // MDM categoryId æ å°å° WMS categoryIdï¼æ³¨æ ID åç§»ï¼ |
| | | wmsItem.setCategoryId(item.getCategoryId() != null ? item.getCategoryId() - 20000 : null); |
| | | wmsItem.setBrandId(item.getBrandId()); |
| | | // åä½åç§°éè¦ä» MDM åä½è¡¨è·åï¼è¿éææ¶ç空 |
| | | wmsItem.setRemark(item.getRemark()); |
| | | return wmsItem; |
| | | } |
| | | |
| | | @Override |
| | | public long getItemCountByCategoryId(Long categoryId) { |
| | | return itemMapper.selectCountByCategoryId(categoryId); |
| | | // ä» MDM è·ååç±»ç©ææ°éï¼æ³¨æ ID åç§»ï¼ |
| | | return mdmItemApi.getItemCountByCategoryId(categoryId + 20000).getCheckedData(); |
| | | } |
| | | |
| | | @Override |
| | | public long getItemCountByBrandId(Long brandId) { |
| | | // ä» MDM è·ååçç©ææ°é |
| | | // 注æï¼MDM ç®å没ææåçç»è®¡ç APIï¼ææ¶è¿åæ¬å°æ°æ® |
| | | return itemMapper.selectCountByBrandId(brandId); |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | <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> |