docs(api): 更新信托基金与代储台账及油品出库相关接口文档
- 在销售台账中新增 tonnage 字段用于代储吨位记录
- 添加代储台账吨位字段的详细说明包括选填规则和导出处理
- 更新油品出库文档支持多台账绑定和统一出库口径
- 修改代储出库流程使其与销售出库一致包括扣库存和批次要求
- 添加车辆照片字段支持多图上传功能
- 更新接口错误提示和参数校验规则
- 修正发货台账中油品出库的显示逻辑和状态同步机制
| | |
| | | |
| | | > **DDL æªæ§è¡å**ï¼å°è´¦çæ°å¢/ä¿®æ¹ä¼ç´æ¥æ¥ `Unknown column 'ledger_type'`ã |
| | | |
| | | > **2026-09-21 追å ä¸ä»½ DDL**ï¼`doc/20260921_add_tonnage_to_sales_ledger.sql` ââ `sales_ledger` åå ä¸å `tonnage decimal(16,4)`ï¼ä»£å¨çå¨ä½ï¼éå¡«ï¼ã**å·²å¨å¼ååºæ§è¡å®æ¯**ï¼åæ ·ï¼æªæ§è¡åå°è´¦ç**å表æ¥è¯¢å°±ä¼æ¥ `Unknown column 'T1.tonnage'`**ï¼æä»¥è¿ä»½ DDL æ¯ä»£å¨å°è´¦é¡µé¢ç硬åç½®ã |
| | | |
| | | --- |
| | | |
| | | ## 3. éå®å°è´¦ï¼ç±»ååºåï¼ç¬¬ 6 æ¡ 1ï¼ |
| | |
| | | | `oilDepotName` | String | æ²¹åºåç§°ï¼**å端æ id 忥ï¼ä¸éä¿¡åç«¯ä¼ å¼** | |
| | | | `tankId` | Long | å¨ç½ idï¼**代å¨å¿
å¡«** | |
| | | | `tankNo` | String | å¨ç½å·ï¼**åä¸ï¼åç«¯åæ¥** | |
| | | | `tonnage` | BigDecimal | å¨ä½ã**代å¨éå¡«**ï¼è§ 3.3.1ï¼ï¼åæ²¹ä¸ç¨ä¼ ï¼å端ä¼ç½®ç©º | |
| | | | `contractAmount` | BigDecimal | ååéé¢(å
)ã**代å¨å¿
å¡«ä¸ > 0**ï¼åæ²¹ä¸ç¨ä¼ | |
| | | | `approvalStatus` | String | 审æ¹ç¶æï¼**å端维æ¤ï¼å端ä¸è¦ä¼ ** | |
| | | |
| | |
| | | "entryDate": "2026-09-20", |
| | | "oilDepotId": 1, |
| | | "tankId": 3, |
| | | "tonnage": 500.5, |
| | | "contractAmount": 100000 |
| | | } |
| | | ``` |
| | |
| | | - **ä¸è¦ä¼ `productData`**ï¼ä»£å¨æ²¡æäº§åæç»ï¼å°±ç®ä¼ äºå端ä¹ä¼å¿½ç¥ï¼é¿å
æç»æ±æ»è¦çæå·¥å¡«çååéé¢ï¼ |
| | | - **ååéé¢å¿
é¡»å端æå·¥å¡«**ï¼å端ä¸ä¼ç® |
| | | - æ²¹åºä¸æååºç¡æ°æ®çæ²¹åºå表ï¼å¨ç½ä¸æåå¨ç½å表ï¼å¨ç½**䏿卿²¹åºä¸**ï¼ä¸¤ä¸ªä¸æäºç¸ç¬ç«ï¼ |
| | | |
| | | ### 3.3.1 代å¨çãå¨ä½ãï¼2026-09-21 追å ï¼ |
| | | |
| | | `sales_ledger` æ°å¢ä¸å `tonnage decimal(16,4)`ï¼èæ¬ `doc/20260921_add_tonnage_to_sales_ledger.sql`ï¼**éå
å¨ç®æ åºæ§è¡**ï¼ã |
| | | |
| | | | 项 | å£å¾ | |
| | | | --- | --- | |
| | | | åæ®µå | `tonnage`ï¼æ°åï¼å¨ï¼ | |
| | | | éç¨èå´ | **åªæä»£å¨ç¨**ãåæ²¹æäº¤æ¶åç«¯ä¼æ `tonnage` **置空**ï¼ä¸æ²¹åº/å¨ç½å款å¤çï¼ | |
| | | | æ¯å¦å¿
å¡« | **éå¡«**ãä¸å¡«ãä¼ `null` 齿¾è¡ï¼**没æ**ã代å¨å¿
须填åå¨ä½ãè¿éæ ¡éª | |
| | | | åæ¾ | å°è´¦å表ï¼`/sales/ledger/listPage`ï¼ä¸è¯¥è¡è¯¦æ
é½ä¼è¿å `tonnage`ï¼ä¸å¡«ä¸º `null` | |
| | | | å¯¼åº | Excel å¯¼åºæ°å¢ãå¨ä½ãå | |
| | | |
| | | > å端åªéå¨**代å¨**表åéå ä¸ä¸ªãå¨ä½ãè¾å
¥æ¡ï¼é主表ä¸èµ·æäº¤å³å¯ãåæ²¹è¡¨å**ä¸è¦æ¾**è¿ä¸ªå段ãèµ°çæ¯å第 3.1 èå
¶å®ä»£å¨å段å®å
¨ç¸åçééï¼**æ²¡ææ°æ¥å£**ã |
| | | |
| | | ### 3.4 â ï¸ è¿æ¯ç ´åæ§åæ´ï¼å端å¿
é¡»å
æ¹ |
| | | |
| | |
| | | |
| | | ### 6.2 æ¯è¡æ°å¢å段 |
| | | |
| | | `ledgerType`ã`oilDepotId`ã`oilDepotName`ã`tankId`ã`tankNo`ã`approvalStatus`ã`trustFund`ã`exceedsTrustFund`ã |
| | | `ledgerType`ã`oilDepotId`ã`oilDepotName`ã`tankId`ã`tankNo`ã`tonnage`ã`approvalStatus`ã`trustFund`ã`exceedsTrustFund`ã |
| | | |
| | | å¯¼åº Excelï¼`POST /sales/ledger/export`ï¼æ°å¢åï¼**éå®ç±»åãæ²¹åºãå¨ç½å·ã审æ¹ç¶æã客æ·ä¿¡æåºé**ã |
| | | å¯¼åº Excelï¼`POST /sales/ledger/export`ï¼æ°å¢åï¼**éå®ç±»åãæ²¹åºãå¨ç½å·ãå¨ä½ã审æ¹ç¶æã客æ·ä¿¡æåºé**ã |
| | | |
| | | ### 6.3 æ°å¢ä¸¤ä¸ªæ¥è¯¢æ¡ä»¶ï¼ç¬¬ 5 æ¡ãåå¼ä¸¤ä¸ªé¡µé¢ãçåç«¯æ¯æï¼ |
| | | |
| | |
| | | # æ²¹ååºåºç»å®éå®å°è´¦ å端èè°ææ¡£ |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-20 |
| | | æ´æ°æ¶é´ï¼2026-09-21ï¼åºåºç±»å«ç»ä¸å£å¾ï¼ |
| | | éç¨çæ¬ï¼æ¬æ¬¡åç«¯åæ´å |
| | | 对åºéæ±ï¼æ²¹ååºåºè¡¨åå¢å ãç»å®éå®å°è´¦ãââå
ééå®å°è´¦ï¼å¸¦å
¥å¯¹åºäº§åä¸å®¢æ· |
| | | |
| | | DDL è§ `doc/20260920_add_sales_ledger_to_stock_out_record.sql`ï¼**éå
å¨ç®æ åºæ§è¡**ã |
| | | |
| | | > ä¸ `doc/20260920_æ²¹ååºåºèå¨åè´§å°è´¦å端èè°ææ¡£.md` æ¯åä¸ååè½çåå两æï¼é£ä»½è®²ãåºåºæä¹è¿åè´§å°è´¦ãæä¹æ£åºåãï¼è¿ä»½è®²ãåºåºæä¹æå°éå®å°è´¦ä¸ããææ«çå·®å¼ç¹ä»¥æ¬æä¸ºåã |
| | | |
| | | --- |
| | | |
| | | > ## â ï¸ 2026-09-21 äºæåæ´ï¼åå°è´¦ â **å¤å°è´¦ç»å®** |
| | | > |
| | | > æ¬ææ¡£æè¿°çæ¯**䏿**ï¼`salesLedgerId` å个å°è´¦ï¼ãäºæå·²æ©æ **`ledgerList` å¤å°è´¦**ï¼ä¸è½¦æ²¹åéå¤ä¸ªå®¢æ·ï¼ï¼**以 `doc/20260921_æ²¹ååºåºå¤å°è´¦ç»å®ä¸å°è´§è®°å½å端èè°ææ¡£.md` 为å**ã |
| | | > |
| | | > äºæå¢éä¸è§ï¼ä¸ææªé奿¹åï¼å¡ä¸æ¤è¡¨å²çªç以æ¬è¡¨ä¸ºåï¼ï¼ |
| | | > |
| | | > | 项 | ä¸æï¼æ¬ææ¡£ï¼ | äºæï¼æ°å£å¾ï¼ | |
| | | > | --- | --- | --- | |
| | | > | å
¥å | `salesLedgerId`ï¼åä¸ªï¼ | **`ledgerList: [{salesLedgerId, quantity}]`**ï¼å¤ä¸ªï¼ï¼`salesLedgerId` ä»å
¼å®¹ï¼çä»·äºåªä¼ ä¸ä¸ªå°è´¦ | |
| | | > | æ°é | ä¸å¡«ï¼æ´åç»è¯¥å°è´¦ | **æ¯ä¸ªå°è´¦æå·¥å¡« `quantity`**ï¼**åå°è´¦ä¹åå¿
é¡»çäº `stockOutNum`**ï¼å¦åæ¥é | |
| | | > | 产å约æ | è§æ ¼é¡»å¨è¯¥å°è´¦ `type=1` æç»é | ä¸åï¼ä½**æ¯ä¸ª**å°è´¦é½è¦æ»¡è¶³ | |
| | | > | ä»£å¨ | å¯åç¬ç» | ä¸åï¼ä»£å¨**ä¸è½ä¸å
¶ä»å°è´¦æ··ç»**ï¼ï¼ä¸ä»£å¨**ä¸äº§ç»å®è¡** | |
| | | > | å®¢æ· | åå®¢æ· | å¤å®¢æ·ï¼è½å°æ°è¡¨ `stock_out_record_sales_ledger`ï¼ä¸ä¸ªå°è´¦ä¸è¡ï¼ | |
| | | > | åè´§å°è´¦ | `source='oilOut'` å¹³éº | ä» `source='oilOut'`ï¼ä½æ¹ä¸º**å±çº§ç¶è¡**ï¼`children` = å°è´§è®°å½ | |
| | | > | 审æ¹éè¿ | ~~çæçå®åè´§åãæ¹ `record_type='13'`~~ | **å·²åé**ï¼ä¸çæä»»ä½åè´§åï¼`record_type` æ `'1'`ã`record_id` æ `0` | |
| | | > | éå®å°è´¦ç¶æ | ä» `shipping_info` æ¨å¯¼ | æ¹ä¸ºä»**å°è´§è®°å½** `sales_ledger_arrival` æ¨å¯¼ | |
| | | > | å é¤åºåº | ä¸å¹¶å²éåè´§å | è¥æ**å°è´§è®°å½**å**æç»å é¤** | |
| | | > | è´¢å¡ç²åº¦ | åºåºå | ã**åºåºå à 客æ·**ãï¼åºåå¤ä¸ä¸ª `bindingId` | |
| | | > |
| | | > 䏿 **§5.3**ï¼èªå¨çæåè´§åï¼**æ´èä½åº**ï¼**§5.2 çãä¾å¤ã段**ã**§6.2 çãå追å ãæ®µ**åæ ·ä½åºã |
| | | |
| | | --- |
| | | |
| | |
| | | ââ éã代å¨ãå°è´¦ âââ åºåºç±»å« = 代å¨ï¼å端强å¶ï¼å端ä¸ç¨ä¼ ï¼ |
| | | å®¢æ· â å°è´¦ |
| | | æ²¹åº / å¨ç½ â å°è´¦ï¼å端带å
¥ï¼å端ä¸ç¨æéï¼ |
| | | â 䏿 ¡éªäº§åãä¸éè¦æ¹æ¬¡ã䏿£åºåãä¸è¿åè´§å°è´¦ |
| | | 产åè§æ ¼ â **å¿
é¡»é**ï¼åç«¯æ ¡éªï¼æ£åºåè¦æè§æ ¼å®ä½ï¼ |
| | | åºåºæ¹æ¬¡ â **å¿
å¡«**ï¼2026-09-21 èµ·ä¸éå®ä¸è´ï¼ |
| | | è½¦è¾ â ä¸è¦æ±ï¼åªæéå®ç±»è¦æ±é车è¾ï¼ |
| | | â 审æ¹éè¿æ¶æ£åºåãè¿åè´§å°è´¦ |
| | | ``` |
| | | |
| | | > â ï¸ **2026-09-21 å£å¾åæ´**ï¼ä¸é¢ã代å¨ã忝ç第 4 项以忝ã䏿 ¡éªäº§åãä¸éè¦æ¹æ¬¡ã䏿£åºåãä¸è¿åè´§å°è´¦ãï¼ç°å·²æ¹ä¸º**ä¸éå®åæ¯ä¸è´**ââåæ ·å¿
å¡«æ¹æ¬¡ãåæ ·æ£åºåãåæ ·è¿åè´§å°è´¦ï¼åªæ¯**ä¸è¦æ±é车è¾**ãè¯¦è§ `doc/20260921_æ²¹ååºåºç»ä¸åºåºå£å¾å端èè°ææ¡£.md`ã |
| | | |
| | | éä¸å°è´¦åå端å两件äºï¼ |
| | | |
| | | 1. æè¿åè¡éç `customerId` / `customerName` å¡«è¿å®¢æ·æ§ä»¶ï¼**åªè¯»å±ç¤ºå³å¯**ï¼å端ä¹ä¼ä»¥å°è´¦ä¸ºåè¦çï¼ï¼ |
| | | 2. æ `GET /sales/product/list?salesLedgerId=xx&type=1`ï¼æäº§åè§æ ¼ä¸æéå®ä¸ºè¯¥å°è´¦çæç»ã |
| | | 代å¨å°è´¦æ²¡ææç»ï¼è¿ä¸æ¥å¯ä»¥è·³è¿ã |
| | | **代å¨å°è´¦æ²¡ææç»ï¼è¯¥æ¥å£æ¿ä¸å°åéè§æ ¼** â 代å¨åºåºçè§æ ¼ä¸æè¯·æ¹ç¨éç¨äº§åè§æ ¼å表ï¼å¦æäº§å大类çè§æ ¼æ¥å£ï¼ï¼ä½**å¿
é¡»éä¸ä¸ª**ï¼å¦åæäº¤æ¥ `代å¨åºåºéè¦æ£ååºå,å¿
é¡»éæ©äº§åè§æ ¼,éå®ååå·:xxx`ã |
| | | |
| | | --- |
| | | |
| | |
| | | |
| | | ### 4.3 æ°å¢æ²¹ååºåºï¼**请æ±ä½æ°å¢ä¸ä¸ªå段**ï¼ |
| | | |
| | | > â ï¸ **äºæ**ï¼`salesLedgerId` ä»å
¼å®¹ï¼çä»·äºåªç»ä¸ä¸ªå°è´¦ï¼ï¼ä½æ°å端请æ¹ç¨ `ledgerList`ï¼è§ `doc/20260921_æ²¹ååºåºå¤å°è´¦ç»å®ä¸å°è´§è®°å½å端èè°ææ¡£.md` §3ã |
| | | |
| | | ``` |
| | | POST /stockInventory/addOilOutRecordOnly |
| | | ``` |
| | |
| | | } |
| | | ``` |
| | | |
| | | **ç»å®æ¶è¿ 4 ä¸ªåæ®µä¸ç¨ä¼ ï¼ä¼ äºä¹ä¼è¢«è¦çï¼**ï¼`outCategory`ã`customerId`ã`customerName`ï¼ä»£å¨å°è´¦è¿æ `oilDepotId` / `oilDepotName` / `tankId` / `tankNo`ï¼ã |
| | | äºæå½¢æï¼å¤å°è´¦ï¼`Σquantity` å¿
é¡» = `outTonnage`ï¼ï¼ |
| | | |
| | | ä¸ä¼ `salesLedgerId` æ¶æ¥å£è¡ä¸º**䏿¹å¨åå®å
¨ä¸è´**ï¼èåç«¯ä¸æ¹ä¹è½è·ã |
| | | ```json |
| | | { |
| | | "productModelId": 301, |
| | | "batchNo": "20260917-CY001-001", |
| | | "outTonnage": 9.00, |
| | | "ledgerList": [ |
| | | { "salesLedgerId": 88, "quantity": 5.00 }, |
| | | { "salesLedgerId": 96, "quantity": 4.00 } |
| | | ], |
| | | "vehicleId": 5, |
| | | "truckPlateNo": "èF12345", |
| | | "outDate": "2026-09-20", |
| | | "remark": "é¦è½¦" |
| | | } |
| | | ``` |
| | | |
| | | **ç»å®æ¶è¿ 4 ä¸ªåæ®µä¸ç¨ä¼ ï¼ä¼ äºä¹ä¼è¢«è¦çï¼**ï¼`outCategory`ã`customerId`ã`customerName`ï¼ä»£å¨å°è´¦è¿æ `oilDepotId` / `oilDepotName` / `tankId` / `tankNo`ï¼ã**å¤å°è´¦æ¶ `customerId` / `customerName` åé¦é¡¹**ï¼å表å±ç¤ºå·²æ¹ä¸ºæ±æ»å
¨é¨ååå·ï¼è§æ°ææ¡£ §3.5ï¼ã |
| | | |
| | | ä¸ä¼ `salesLedgerId` / `ledgerList` æ¶æ¥å£è¡ä¸º**䏿¹å¨åå®å
¨ä¸è´**ï¼èåç«¯ä¸æ¹ä¹è½è·ã |
| | | |
| | | --- |
| | | |
| | |
| | | | å°è´¦ç±»å | åºåºç±»å« | å®¢æ· | 产å | æ²¹åº/å¨ç½ | |
| | | | --- | --- | --- | --- | --- | |
| | | | åæ²¹ï¼å«ç±»åä¸ºç©ºï¼ | å¼ºå¶ `éå®` | å°è´¦è¦ç | **å¿
é¡»**å±äºè¯¥å°è´¦æç»ï¼`type=1`ï¼ï¼å¦åæ¥é | ä¸å¨ï¼å端èªå·±é | |
| | | | ä»£å¨ | å¼ºå¶ `代å¨` | å°è´¦è¦ç | **䏿 ¡éª**ï¼ä»£å¨å°è´¦æ²¡ææç»ï¼ | å°è´¦è¦ç | |
| | | | ä»£å¨ | å¼ºå¶ `代å¨` | å°è´¦è¦ç | **䏿 ¡éªãæ¯å¦å¨å°è´¦æç»éã**ï¼ä»£å¨å°è´¦æ²¡ææç»ï¼ï¼ä½ `productModelId` **å¿
é¡»ä¼ **ï¼å¦åæ¥é | å°è´¦è¦ç | |
| | | |
| | | > åæ²¹å°è´¦çãç±»å为空ã乿忲¹å¤ç ââ åéå°è´¦å¯è½æ `ledgerType` 为空çï¼ä¸ååå½åæ²¹ï¼æ¥éææ¡ä¹è½æç¤ºåºæ¥ã |
| | | |
| | |
| | | | `salesLedgerId` æ¥ä¸å°å°è´¦ | `æééå®å°è´¦ä¸åå¨,éå®å°è´¦id:88` | |
| | | | ç»åæ²¹å°è´¦ä½æ²¡ä¼ `productModelId` | `ç»å®éå®å°è´¦æ¶å¿
é¡»éæ©äº§åè§æ ¼,éå®ååå·:XS20260901-001` | |
| | | | ç»åæ²¹å°è´¦ä½äº§åä¸å¨è¯¥å°è´¦æç»é | `æé产åä¸å¨è¯¥éå®å°è´¦æç»ä¸,éå®ååå·:XS20260901-001` | |
| | | | ç»äºåæ²¹å°è´¦ä½æ²¡éåºåºæ¹æ¬¡ | `éå®ç±»åºåºå¿
须鿩åºåºæ¹æ¬¡`ï¼åææ ¡éªï¼ç»å®åä¼è§¦åï¼ | |
| | | | ç»**代å¨**å°è´¦ä½æ²¡ä¼ `productModelId` | `代å¨åºåºéè¦æ£ååºå,å¿
é¡»éæ©äº§åè§æ ¼,éå®ååå·:XS20260901-001` | |
| | | | ä»»ææ²¹ååºåºæ²¡éåºåºæ¹æ¬¡ | `æ²¹ååºåºå¿
须鿩åºåºæ¹æ¬¡`ï¼2026-09-21 èµ·ææ¡ç±ãéå®ç±»åºåºâ¦ãæ¹ä¸ºãæ²¹ååºåºâ¦ãï¼ä¸ä¸åéå®éå®ç±»ï¼ | |
| | | |
| | | é误ååºå½¢æï¼ä¸å¡å¼å¸¸ç»ä¸èµ°å
¨å±å¤çå¨ï¼ï¼ |
| | | |
| | |
| | | - è¥ç¼è¾æ¶ä¸ä¼ `salesLedgerId`ï¼**ç»å®ä¼è¢«æ¸
空**ï¼`outCategory` / 客æ·åçï¼ãè¿æ¯è¯¥æ¥å£çæ¢æè¯ä¹ï¼ææå段é½ä¸æ ·ï¼ä¸æ¯æ¬æ¬¡å¼å
¥çã |
| | | |
| | | åªæ³æ¹æ°é/夿³¨çè¯ï¼å»ºè®®å端å
å详æ
åæ´ä½æäº¤ã |
| | | |
| | | > **ä¾å¤ï¼2026-09-21 èµ·ï¼**ï¼`recordType` å `recordId` è¿ä¸¤ä¸ªå段**ä¸ä¼è¢«æ´ä½è¦çæ¸
空** ââ å®ä»¬æ¾ç¨äºãæ²¹ååºåºå®¡æ¹éè¿æ¶èªå¨çæåè´§å°è´¦ãçå
³èï¼è¯¥æ¹æ¡**å·²åé**ï¼ï¼åç«¯ä»æè¿ä¸¤ä¸ªå段çå¨å¿½ç¥å表éï¼å±äº**åå²ä¿æ¤**ãå端ç¼è¾è¡¨å**ä¸éè¦ï¼ä¹ä¸è¦ï¼åä¼ å®ä»¬**ã |
| | | |
| | | --- |
| | | |
| | | ## 5.3 审æ¹éè¿ä¼èªå¨çæåè´§åï¼2026-09-21 æ°å¢ï¼ |
| | | |
| | | > ## â ï¸ æ´èä½åº |
| | | > |
| | | > ãæ²¹ååºåºå®¡æ¹éè¿ â çæ `shipping_info` + æ¹ `record_type='13'`ãè¿å¥æ¹æ¡**å·²æ´ä½åé**ï¼å端ç¸å
³ä»£ç ï¼`createShippingForOilOut` / `deleteGeneratedShipping` / `resolveShippingDate`ï¼å·²å é¤ã |
| | | > |
| | | > ç°è¡å£å¾ï¼ |
| | | > - 审æ¹éè¿**åªæ£åºå**ï¼`deductOilOutStock`ï¼ï¼**ä¸çæä»»ä½åè´§å**ï¼`record_type` æä¸º `'1'`ã`record_id` æä¸º `0`ã |
| | | > - æ²¹ååºåºå¨åè´§å°è´¦é**æä¸º `source='oilOut'`**ï¼ä½ä¸º**å±çº§ç¶è¡**ï¼åè¡ = **å°è´§è®°å½**ï¼æ°åè½ï¼ã |
| | | > - éå®å°è´¦çãæ¯å¦åè´§ / åè´§ç¶æ / å·²åè´§æ°éãæ¹ä¸º**æå°è´§è®°å½ `sales_ledger_arrival` æ¨å¯¼**ã |
| | | > - å é¤åºåº**ä¸åå²éåè´§å**ï¼ä½**è¥å·²æå°è´§è®°å½åæç»å é¤**ã |
| | | > |
| | | > è¯¦è§ **`doc/20260921_æ²¹ååºåºå¤å°è´¦ç»å®ä¸å°è´§è®°å½å端èè°ææ¡£.md`**ã |
| | | |
| | | ~~æ²¹ååºåº**审æ¹éè¿æ¶**ï¼è¥æ»¡è¶³ãç»å®äºåæ²¹å°è´¦ + è§æ ¼å¨è¯¥å°è´¦æç»éãï¼å端ä¼é¡ºå¸¦çæä¸æ¡çå®ç `shipping_info`ï¼+ æç»ï¼ç¶æ=å·²åè´§ï¼ï¼å¹¶æè¯¥åºåºè®°å½æ¹æ `record_type='13'`ã`record_id` æååè´§åã~~ |
| | | |
| | | ~~- åæ²¹å°è´¦ç»å®çåºåº**ä¼çæ**ï¼ä»£å¨å°è´¦ï¼æ `type=1` æç»ï¼ãæªç»å°è´¦çåºåº**ä¸çæ**ï¼ä¿æåæ ·ã~~ |
| | | ~~- çæå该è¡å¨åè´§å°è´¦éä» `source='oilOut'` **åæ `source='shipping'`**ï¼è¯¦æ
è§ä¸é¢é£ä»½ææ¡£ã~~ |
| | | ~~- éå®å°è´¦çãæ¯å¦åè´§ / åè´§ç¶æ / å·²åè´§æ°éãä¼èªå¨åæ¥ï¼æ¨å¯¼é¾è·¯æªæ¹ä¸è¡ SQLï¼ã~~ |
| | | ~~- å é¤è¯¥åºåºè®°å½æ¶ä¼ä¸å¹¶å²éåè´§åï¼ä¸**åºååªå½è¿ä¸æ¬¡**ã~~ |
| | | |
| | | --- |
| | | |
| | |
| | | | `salesContractNo` | æåè´§åå
³èçååå·å¹é
| æä¸å¹é
â **æç»å®å°è´¦çååå·å¹é
**ï¼æªç»å®çè¡ä»ç¶ä¸ä¼è¢«çå° | |
| | | | `expressNumber` | æå¿«éåå·å¹é
| æä¸å¹é
ï¼æ ååï¼æ²¹ååºåºæ²¡æå¿«éåï¼ | |
| | | |
| | | > 代å¨åºåº**ä¸è¿**åè´§å°è´¦ï¼`WHERE out_category='éå®'`ï¼ï¼æä»¥ä»£å¨ç»å®ä¸ä¼å¨è¿éåºç°ã |
| | | > 2026-09-21 èµ·ï¼ä»£å¨åºåº**ä¹ä¼è¿**åè´§å°è´¦ï¼`WHERE` 已廿 `out_category='éå®'` æ¡ä»¶ï¼åªæ `approval_status=1` è¿æ»¤ï¼ï¼æä»¥ç»äºä»£å¨å°è´¦çåºåºè¡åæ ·åºç°å¨è¿éï¼`salesContractNo` å代å¨å°è´¦çååå·ã |
| | | > |
| | | > â ï¸ **å追å ï¼åä¸å¤©ï¼å·²ä¿®æ£ï¼**ï¼æ¾çæå®ç°å¨å®¡æ¹éè¿åçæçå®åè´§åå¹¶æ¹ `record_type='13'`ï¼è¯¥æ¹æ¡**å·²æ´ä½åé**ï¼ãç°å¨**å
¨é¨æ²¹ååºåºæä¸º `source='oilOut'`**ï¼**å䏿¹è´§åªæä¸è¡**ï¼æå åäºï¼ç»è®ºä¸åï¼ã**æ°å¢**ï¼`oilOut` è¡å¸¦ `children`ï¼å°è´§è®°å½ï¼ï¼æ¯åè´§å°è´¦ç**å±çº§ç¶è¡**ã |
| | | > |
| | | > â ï¸ **äºæï¼å¤å°è´¦ï¼**ï¼`salesContractNo` ç°å¨æ¯**éå·åéçå
¨é¨ååå·**ï¼`group_concat(distinct ...)`ï¼ï¼ä¸ååªæ¯é¦é¡¹ï¼æååå·çé乿¾å¼äºãè§ `doc/20260921_æ²¹ååºåºå¤å°è´¦ç»å®ä¸å°è´§è®°å½å端èè°ææ¡£.md` §3.5ã |
| | | |
| | | --- |
| | | |
| | |
| | | |
| | | ç»å°è´¦åªæ¯æåºåºæå°å°è´¦ä¸ï¼**䏿 ¡éªè¯¥å°è´¦å·²åäºå¤å°ãè¿å©å¤å°**ãå°è´¦æ¯ä¸ªè§æ ¼çãå·²åè´§ / å¾
åè´§ãæ¯å¦ä¸å¥ç»è®¡ï¼`/sales/product/list` ç `shippedQuantity` / `noQuantity`ï¼ï¼æ¬æ¥å£ä¸åä¸ï¼ä¹ä¸ä¼ååãæ¯å¦è¶
é¢åè´§ï¼å端è¥è¦æ¦ï¼è¯·èªè¡æ¯å¯¹ã |
| | | |
| | | **â¡ ã代å¨ãåºåºå®å
¨ä¸æ£åºå** |
| | | **â¡ ã代å¨ãåºåºä¹æ£åºåï¼2026-09-21 åæ´ï¼** |
| | | |
| | | 代å¨åºåºçè¯ä¹æ¯å®¢æ·æèªå·±çæ²¹æèµ°ï¼ä¸æ¶åéå®ãæä»¥å³ä½¿åºåºç±»å«æ¯ä»£å¨ï¼å®¡æ¹éè¿ä¹ä¸æ£ `stock_inventory`ãå é¤ä¹ä¸å½è¿ï¼ä¸ã客åãä¸è´ãåªæ **éå®** ç±»ææ£åºåãç»ä¸ç»å°è´¦é½ä¸æ¹åè¿ä¸ç¹ã |
| | | ~~代å¨åºåºå®å
¨ä¸æ£åºå~~ **å·²ä½åº**ã代å¨åºåºåæ ·æã产åè§æ ¼ + æ¹æ¬¡ãæ£ `stock_inventory`ãå 餿¶å½è¿ï¼ä¸éå®ç±»å®å
¨ä¸è´ãéå®ç±»å代å¨ç±»**å¯ä¸çåºå«**æ¯ï¼éå®ç±»å¿
é¡»é车è¾ï¼ç¨äºç®ä¸æ¬¡å©ä½æ²¹éï¼ï¼ä»£å¨ / 客åä¸è¦æ±é车è¾ã |
| | | |
| | | **⢠ä¸ä»£å¨å°è´¦æ²¡æäº§åæç»** |
| | | **⢠代å¨å°è´¦æ²¡æäº§åæç»** |
| | | |
| | | 代å¨å°è´¦æ¯ãååå¨ä½ç½®ãï¼ä¸»è¡¨ä¸åªææ²¹åº + å¨ç½ + æå·¥å¡«çååéé¢ï¼`sales_ledger_product` éæ²¡æå®çè¡ãæä»¥ä»£å¨ç»å®**è·³è¿äº§åæ ¡éª**ï¼ä¹**ä¸è¦**æ¿ `/sales/product/list?salesLedgerId=xx&type=1` å»ç»å®å¡«äº§å䏿ï¼ä¼è¿å空ï¼ã |
| | | 代å¨å°è´¦æ¯ãååå¨ä½ç½®ãï¼ä¸»è¡¨ä¸åªææ²¹åº + å¨ç½ + æå·¥å¡«çååéé¢ï¼`sales_ledger_product` éæ²¡æå®çè¡ãæä»¥ä»£å¨ç»å®**è·³è¿ãè§æ ¼æ¯å¦å¨å°è´¦æç»éãçæ ¡éª**ï¼ä¹**ä¸è¦**æ¿ `/sales/product/list?salesLedgerId=xx&type=1` å»ç»å®å¡«äº§å䏿ï¼ä¼è¿å空ï¼ã |
| | | > ä½**è§æ ¼æ¬èº«ä»å¿
é¡»é**ââæ£åºåè¦æ `product_model_id` å®ä½åºåè¡ãè§æ ¼åé请走éç¨äº§åè§æ ¼å表ã |
| | | |
| | | **⣠ç»å®å°è´¦çäº§åæ ¡éªåªå¨æäº¤æ¶çæ** |
| | | |
| | | å端æäº§å䏿éå®ä¸ºå°è´¦æç»åªæ¯ä½éªä¼åï¼çæ£çæ¦æªå¨å端ãä½**代å¨è·³è¿äºè¿éæ ¡éª**ï¼å¦æä»£å¨å°è´¦è¢«è¯¯å½æåæ²¹å°è´¦ç¨ï¼æ¯å¦å°è´¦ç±»åæ¹äºï¼ï¼æäº¤æ¶æä¼æ¥ãæé产åä¸å¨è¯¥éå®å°è´¦æç»ä¸ãã |
| | | å端æäº§å䏿éå®ä¸ºå°è´¦æç»åªæ¯ä½éªä¼åï¼çæ£çæ¦æªå¨å端ã代å¨è·³è¿çæ¯ãæ¯å¦å¨æç»éãï¼è·³ä¸è¿ãå¿
é¡»ä¼ è§æ ¼ãè¿éã妿代å¨å°è´¦è¢«è¯¯å½æåæ²¹å°è´¦ç¨ï¼æ¯å¦å°è´¦ç±»åæ¹äºï¼ï¼æäº¤æ¶æä¼æ¥ãæé产åä¸å¨è¯¥éå®å°è´¦æç»ä¸ãã |
| | | |
| | | **⤠åºåºè®°å½çå
¶å®å段没å** |
| | | |
| | | `outCategory` é¤äºè¢«ç»å®è¦çå¤ï¼å
¶ä½éå¼é»è¾ãæ¹æ¬¡å¿
å¡«ãæ£åºåæ¶æºãè¿åè´§å°è´¦çæ¡ä»¶é½æ²¿ç¨åå®ç°ï¼è§ `doc/20260920_æ²¹ååºåºèå¨åè´§å°è´¦å端èè°ææ¡£.md`ã |
| | | `outCategory` é¤äºè¢«ç»å®è¦çå¤ï¼å
¶ä½éå¼é»è¾ãæ¹æ¬¡å¿
å¡«ãæ£åºåæ¶æºãè¿åè´§å°è´¦çæ¡ä»¶é½æ²¿ç¨åå®ç°ï¼è§ `doc/20260920_æ²¹ååºåºèå¨åè´§å°è´¦å端èè°ææ¡£.md`ã**注æ**ï¼è¿ä»½ææ¡£çãéå®ç±»ãéå®å·²äº 2026-09-21 æ¾å¼ä¸ºãå
¨é¨æ²¹ååºåºãï¼ä»¥ `doc/20260921_æ²¹ååºåºç»ä¸åºåºå£å¾å端èè°ææ¡£.md` 为åã |
| | | |
| | | --- |
| | | |
| | | ## 8. èè°èªæ¥æ¸
å |
| | | |
| | | > â ï¸ **äºæ**ï¼ä¸é¢ 3 项已æåéåçå£å¾æ´æ£ï¼å°è´§è®°å½ç¸å
³çèªæ¥é¡¹è§ `doc/20260921_æ²¹ååºåºå¤å°è´¦ç»å®ä¸å°è´§è®°å½å端èè°ææ¡£.md` §10ã |
| | | |
| | | - [ ] `/stockOutRecord/bindableSalesLedger` è½è¿åå°è´¦å表ï¼åæ²¹å代å¨é½å¨ |
| | | - [ ] ç¨æ²¹åº/åè´§è§è²çè´¦å·ï¼ééå®ï¼ä¹è½çå°å°è´¦ï¼éªè¯æ°æ®æéç¡®å®è¢«è·³è¿ï¼ |
| | | - [ ] æååå· / 客æ·å / 项ç®åæç´¢ï¼ç»ææ£ç¡® |
| | | - [ ] éåæ²¹å°è´¦ â 客æ·èªå¨å¸¦å
¥ï¼äº§å䏿åªå©è¯¥å°è´¦æç»çè§æ ¼ |
| | | - [ ] éåæ²¹å°è´¦ + å°è´¦å¤çè§æ ¼æäº¤ â æ¥ãæé产åä¸å¨è¯¥éå®å°è´¦æç»ä¸ã |
| | | - [ ] éåæ²¹å°è´¦ + å°è´¦å
è§æ ¼ + ç©ºæ¹æ¬¡æäº¤ â æ¥ãéå®ç±»åºåºå¿
须鿩åºåºæ¹æ¬¡ã |
| | | - [ ] éåæ²¹å°è´¦ + å°è´¦å
è§æ ¼ + ç©ºæ¹æ¬¡æäº¤ â æ¥ãæ²¹ååºåºå¿
须鿩åºåºæ¹æ¬¡ã |
| | | - [ ] éåæ²¹å°è´¦æäº¤æå â åºåºå°è´¦è¯¥è¡ `salesLedgerId` / `salesContractNo` æå¼ |
| | | - [ ] 该è¡å®¡æ¹éè¿ â `stock_inventory` ææ¹æ¬¡æ£åï¼åè´§å°è´¦åºç°è¯¥è¡ä¸ `salesContractNo` æå¼ |
| | | - [ ] é代å¨å°è´¦ â åºåºç±»å«èªå¨åã代å¨ãï¼æ²¹åº/å¨ç½èªå¨å¸¦å
¥ï¼äº§åä¸ç¨éä¹è½æäº¤ |
| | | - [ ] 代å¨å°è´¦ç»å®æ¶ä¸ä¼ 产å â æäº¤æåï¼éªè¯è·³è¿äºäº§åæ ¡éªï¼ |
| | | - [ ] 代å¨åºåºå®¡æ¹éè¿ â åºåä¸åï¼åè´§å°è´¦**ä¸åºç°**è¯¥è¡ |
| | | - [ ] ~~该è¡å®¡æ¹éè¿ â åè´§å°è´¦æ°å¢ä¸è¡ `source='shipping'`~~ â **æ´æ£**ï¼å®¡æ¹éè¿ â `stock_inventory` ææ¹æ¬¡æ£åï¼**åè´§å°è´¦è¯¥è¡ä»æ¯ `source='oilOut'`**ï¼ä¸ `recordType` ä»ä¸º `1`ã`recordId` ä»ä¸º `0`ï¼è¯¥ CK å·**åªåºç°ä¸è¡** |
| | | - [ ] ~~审æ¹éè¿å³åæ¥éå®å°è´¦ç¶æ~~ â **æ´æ£**ï¼å®¡æ¹éè¿**ä¸ä¼**æ¹éå®å°è´¦ç¶æï¼**æ°å¢ä¸æ¡å°è´§è®°å½å**ï¼å¯¹åºéå®å°è´¦çãæ¯å¦åè´§ / åè´§ç¶æ / å·²åè´§æ°éãæé乿´æ° |
| | | - [ ] é代å¨å°è´¦ â åºåºç±»å«èªå¨åã代å¨ãï¼æ²¹åº/å¨ç½èªå¨å¸¦å
¥ï¼ä¸éè¦éè½¦è¾ |
| | | - [ ] 代å¨å°è´¦ç»å® + **ä¸ä¼ 产åè§æ ¼** â æ¥ã代å¨åºåºéè¦æ£ååºå,å¿
é¡»éæ©äº§åè§æ ¼,éå®ååå·:xxxã |
| | | - [ ] 代å¨å°è´¦ç»å® + ä¼ è§æ ¼ï¼ä¸å¨å°è´¦æç»é乿¾è¡ï¼+ ä¼ æ¹æ¬¡ â æäº¤æå |
| | | - [ ] 代å¨åºåºå®¡æ¹éè¿ â åºå**ææ¹æ¬¡æ£å**ï¼åè´§å°è´¦**åºç°**该è¡ä¸ `salesContractNo` æå¼ |
| | | - [ ] `salesLedgerId` ä¼ ä¸ä¸ªä¸åå¨ç id â æ¥ãæééå®å°è´¦ä¸åå¨ã |
| | | - [ ] ä¸ä¼ `salesLedgerId` èµ°åæçéå®/代å¨/客ååºåº â è¡ä¸ºä¸æ¹å¨åä¸è´ï¼åå½ï¼ |
| | | - [ ] åè´§å°è´¦æååå·çéï¼`oilOut` è¡éç»äºè¯¥ååçè½è¢«çå°ï¼æªç»å®çä¸åºç° |
| | | - [ ] åè´§å°è´¦æå¿«éåå·çéï¼ä»ç¶ä¸è¿åä»»ä½ `oilOut` è¡ |
| | | - [ ] ç¼è¾ä¸æ¡å·²ç»å®çåºåºè®°å½ï¼**åä¼ äº `salesLedgerId`** â ç»å®è¿å¨ |
| | | - [ ] ç¼è¾æ¶ä¸åä¼ `salesLedgerId` â ç»å®è¢«æ¸
空ï¼ç¡®è®¤è¿æ¯æ¥å£çæ´ä½è¦çè¯ä¹ï¼èé丢äºï¼ |
| | | - [ ] ~~ç¼è¾å·²çæåè´§åçåºåº â åè´§å°è´¦å
³èä¸è¢«å²æ~~ â **æ´æ£**ï¼æ¹ä¸ºã**å é¤ä¸æ¡å·²æå°è´§è®°å½çåºåº â æ¥éæç»å é¤**ï¼ææ¡è§æ°ææ¡£ §9ã |
| | |
| | | # æ²¹ååºåºèå¨åè´§å°è´¦ å端èè°ææ¡£ |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-20 |
| | | æ´æ°æ¶é´ï¼2026-09-21ï¼åºåºç±»å«ç»ä¸å£å¾ï¼ |
| | | éç¨çæ¬ï¼æ¬æ¬¡åç«¯åæ´å |
| | | éæ±æ¥æºï¼èè°åé¦ãåºåºäºä¸æ¡ï¼åºåºç±»å«=éå®ï¼ï¼ä½ `/shippingInfo/listPage` åè´§å°è´¦æ²¡ææ°æ®ã |
| | | |
| | | --- |
| | | |
| | | > ## â ï¸ 2026-09-21 äºæ¬¡å£å¾åæ´ï¼å¤å°è´¦ç»å® + å°è´§è®°å½ï¼ |
| | | > |
| | | > æ¬ææ¡£åäºãæ²¹ååºåº**çæåè´§å / æ¹æ `record_type='13'`**ãæ¹æ¡ä¹åï¼è¯¥æ¹æ¡**å·²æ´ä½åé**ãæ¬ææ¡£ä»¥ä¸å
容**ä»ç¶ææ**ï¼ä¸åéæ å
³ï¼ï¼ |
| | | > - `source` 忝ï¼`shipping` / `oilOut`ï¼çåºåä¸ãæ `source` å³å®æé®ãçç»è®º |
| | | > - `id` æå·ãå¿
é¡»ç¨ `stockOutRecordId` å®ä½çæé |
| | | > - `oilOut` è¡çåæ®µæ å°è¡¨ã`outBatchNo` / `batchNoList` çæ¹å·å±ç¤º |
| | | > - ãåºåºæ¹æ¬¡ãå¿
å¡«ãæ£åºåçæ¶æºï¼å®¡æ¹éè¿æ£ãå é¤å½è¿ï¼ |
| | | > - æ²¹ååºåº**ä¸å¨åè´§å°è´¦**â¦â¦**注æï¼è¿ä¸æ¡å·²è¢«æ¨ç¿»** â æ°å£å¾æ¯æ²¹ååºåºå¨åè´§å°è´¦éä½ä¸º**å±çº§ç¶è¡**å±ç¤ºï¼åè¡ = å°è´§è®°å½ |
| | | > |
| | | > **å·²ä½åº/éä¿®æ£çç¹**ï¼è¯¦è§ **`doc/20260921_æ²¹ååºåºå¤å°è´¦ç»å®ä¸å°è´§è®°å½å端èè°ææ¡£.md`**ï¼ï¼ |
| | | > - ~~ãæ²¹ååºåºæ°æ®å±ç¤ºå¨åºåºå°è´¦ä¸å¨åè´§å°è´¦å±ç¤ºäºã~~ â **é**ãåºåºæ°æ®å¨**åºåºç®¡çå表**ï¼`GET /stockOutRecord/listPage`ï¼å±ç¤ºï¼åè´§å°è´¦é**仿**æ²¹ååºåºçç¶è¡ã |
| | | > - æ¬ææ¡£ç¬¬ 2 èè¡¨æ ¼é `oilOut` è¡ãå·²çæåè´§åç飿¡ä¼è¢«æé¤ãâ **ä¸åå¨äº**ï¼ä¸åçæï¼ã |
| | | > - è¿å¸¦ä½åºï¼`doc/20260921_æ²¹ååºåºçæåè´§å°è´¦ä¸éå®å°è´¦ç¶æåæ¥å端èè°ææ¡£.md`ï¼æ´ç¯ä½åºï¼ã |
| | | > - **`listPageAccountSales` çè´¢å¡/éè´æ´¾çå£å¾å·²æãåºåºå à 客æ·ãéå**ï¼å¦è§æ°ææ¡£ç¬¬ 8 èã |
| | | |
| | | --- |
| | | |
| | |
| | | | å£å¾ | å®ç° | |
| | | | --- | --- | |
| | | | åè´§å°è´¦**ç´æ¥è¯»** `stock_out_record` | `/shippingInfo/listPage` æ¹ä¸º `shipping_info UNION ALL stock_out_record` | |
| | | | éå®ç±»åºåº**è¦æ£åºå** | åºåºå®¡æ¹éè¿æ¶æã产åè§æ ¼ + æ¹æ¬¡ãæ£å `stock_inventory` | |
| | | | æ²¹ååºåº**è¦æ£åºå** | åºåºå®¡æ¹éè¿æ¶æã产åè§æ ¼ + æ¹æ¬¡ãæ£å `stock_inventory` | |
| | | |
| | | > â ï¸ **2026-09-21 å£å¾åæ´**ï¼æ¬èåå
æãæ£åºå / è¿åè´§å°è´¦ / æ¹æ¬¡å¿
å¡«ãéå®å¨ `out_category='éå®'`ãç°æ¹ä¸º**æææ²¹ååºåºï¼`type` 为空ï¼ä¸è§åä»**ï¼`outCategory` åªå½±å**è¦ä¸è¦é车è¾**ï¼éå®è¦ã代å¨/客åä¸è¦ï¼ãæ¬ææ¡£ä¸æ¹å¡å¸¦ãéå®ç±»ãåæ ·çæ¡ç®åå·²ææ°å£å¾æ´æ£ï¼ç»èè§ **`doc/20260921_æ²¹ååºåºç»ä¸åºåºå£å¾å端èè°ææ¡£.md`**ã |
| | | |
| | | **æ¬æ¬¡æ²¡æä»»ä½ DDL**ï¼ç¨å°ç `stock_out_record.batch_no`ã`out_category`ã`tank_no`ã`truck_plate_no` çåé½å·²åå¨ã |
| | | |
| | |
| | | |
| | | | `source` | æ¥æºè¡¨ | 说æ | |
| | | | --- | --- | --- | |
| | | | `shipping` | `shipping_info` | åæçåè´§åï¼éå®å°è´¦åè´§ / éè´è®°å½åºåºèªå¨çæï¼ | |
| | | | `oilOut` | `stock_out_record` | æ¬æ¬¡æ°å¢ï¼`out_category='éå®'` ä¸ `approval_status=1` çæ²¹ååºåº | |
| | | | `shipping` | `shipping_info` | åæçåè´§åï¼éå®å°è´¦åè´§ / éè´è®°å½åºåºèªå¨çæï¼ã~~以åç±æ²¹ååºåºèªå¨çæçåè´§å~~ | |
| | | | `oilOut` | `stock_out_record` | `type` ä¸ºç©ºï¼æ²¹ååºåºï¼ä¸ `approval_status=1`ï¼**ä¸åæ `out_category` è¿æ»¤**ï¼**å
¨é¨æ²¹ååºåºé½å¨è¿é**ï¼ä¸åæè¢«æé¤çï¼ | |
| | | |
| | | > â ï¸ **2026-09-21 追å ï¼å·²ä¿®æ£ï¼**ï¼æ¾çæå®ç°å¨æ²¹ååºåºå®¡æ¹éè¿æ¶çæçå®åè´§åå¹¶æ¹ `record_type='13'`ï¼**è¯¥æ¹æ¡å·²æ´ä½åé**ãç°å¨ `oilOut` 忝ç `record_id` æä¸º `0`ã`record_type` æä¸º `'1'`ï¼**ä¸åå¨**被 `shipping_info` åæ¯ãæ¥ç®¡ãçæ²¹åè¡ï¼**å䏿¹è´§ä»ç¶åªæä¸è¡**ï¼æå åäºï¼ç»è®ºä¸åï¼ã |
| | | > **æ°å¢**ï¼`oilOut` è¡ç°å¨å¸¦ `children` æ°ç»ï¼å°è´§è®°å½ï¼ï¼æ¯åè´§å°è´¦ç**å±çº§ç¶è¡**ï¼è§ **`doc/20260921_æ²¹ååºåºå¤å°è´¦ç»å®ä¸å°è´§è®°å½å端èè°ææ¡£.md`** 第 5 èã |
| | | |
| | | ### 2.1 â ï¸ `id` 伿å·ï¼ç»ä¸è½æ `id` ç´æ¥æä½ |
| | | |
| | |
| | | |
| | | ## 3. æ²¹ååºåºè¡¨åï¼**ãåºåºæ¹æ¬¡ãå¿
å¡«** |
| | | |
| | | æ°å¢æ ¡éªï¼`out_category='éå®'` æ¶ `batchNo` ä¸è½ä¸ºç©ºï¼å¦åæ°å¢æ¥å£ç´æ¥è¿åé误 **ãéå®ç±»åºåºå¿
须鿩åºåºæ¹æ¬¡ã**ã |
| | | æ°å¢æ ¡éªï¼**åªè¦ `type` ä¸ºç©ºï¼æ²¹ååºåºï¼ï¼`batchNo` å°±ä¸è½ä¸ºç©º**ï¼å¦åæ°å¢æ¥å£ç´æ¥è¿åé误 **ãæ²¹ååºåºå¿
须鿩åºåºæ¹æ¬¡ã**ã |
| | | |
| | | > 注æï¼è¿ä¸ªæ ¡éªå¨**æ°å¢æ¶**å°±çæï¼ä¸æ¯ç审æ¹ãå端请æãåºåºæ¹æ¬¡ãå¨åºåºç±»å«=é宿¶åæå¿
å¡«ï¼é¿å
ç¨æ·æäº¤åæåç°ã |
| | | > 注æï¼è¿ä¸ªæ ¡éªå¨**æ°å¢æ¶**å°±çæï¼ä¸æ¯ç审æ¹ãå端请æãåºåºæ¹æ¬¡ãåæå¿
å¡«ï¼**ä¸åºååºåºç±»å«**ã |
| | | > |
| | | > åºåºç±»å«æ¯ã代å¨ãã客åãæ¶**ä¸éè¦**æ¹æ¬¡ï¼ä¹ä¸æ£åºåã |
| | | > 2026-09-21 èµ·ï¼åºåºç±»å«ã代å¨ãã客åã**åæ ·éè¦**æ¹æ¬¡ãåæ ·æ£åºåãåæ ·è¿åè´§å°è´¦ãç±»å«ä¹é´**å¯ä¸çå·®å«**æ¯ãéå®ãå¿
é¡»é车è¾ï¼ä»£å¨/客åä¸è¦æ±ã |
| | | > |
| | | > 代å¨åºåºè¿è¦**é产åè§æ ¼**ï¼æ£åºåè¦æè§æ ¼å®ä½ï¼ãç»äºä»£å¨å°è´¦å´æ²¡éè§æ ¼æ¶ï¼æ°å¢æ¥ **ã代å¨åºåºéè¦æ£ååºå,å¿
é¡»éæ©äº§åè§æ ¼,éå®ååå·:xxxã**ã |
| | | |
| | | æ¹æ¬¡åé建议ä¸è¯¥è§æ ¼çå
¥åºæ¹æ¬¡ä¸è´ï¼`GET /stockInventory/getBatchNoQty?productModelId=xxx`ã |
| | | |
| | |
| | | |
| | | | å¨ä½ | `stock_inventory` åå¨ | |
| | | | --- | --- | |
| | | | æ°å¢éå®ç±»æ²¹ååºåº | ä¸åï¼åªå¨å¾
审æ¹ï¼ | |
| | | | æ°å¢æ²¹ååºåºï¼ä»»æåºåºç±»å«ï¼ | ä¸åï¼åªå¨å¾
审æ¹ï¼ | |
| | | | `POST /stockOutRecord/approve` 审æ¹**éè¿** | æã`product_model_id` + `batch_no`ãæ£å `stock_out_num` | |
| | | | 审æ¹**驳å** | ä¸åï¼æ¬æ¥å°±æ²¡æ£ï¼ | |
| | | | å é¤**å·²éè¿**çéå®ç±»åºåºè®°å½ | æåæ¹æ¬¡**å½è¿** | |
| | | | å é¤**å¾
审æ¹**çéå®ç±»åºåºè®°å½ | ä¸å | |
| | | | å é¤**å·²éè¿**çæ²¹ååºåºè®°å½ | æåæ¹æ¬¡**å½è¿** | |
| | | | å é¤**å¾
审æ¹**çæ²¹ååºåºè®°å½ | ä¸å | |
| | | |
| | | > 2026-09-21 èµ·ï¼ä¸è¡¨çãæ²¹ååºåºã**æ¶µçå
¨é¨åºåºç±»å«**ï¼éå® / ä»£å¨ / 客åï¼ï¼ä¸ååªæéå®ç±»ãåæ ¼åºåºï¼`type='0'`ï¼ãä¸åæ ¼åºåºï¼`type='1'`ï¼èµ°åèªåæåæ¯ï¼ä¸åå½±åã |
| | | |
| | | 失败æ
å½¢ï¼åºåä¸è¶³æ¶å®¡æ¹ä¼æ¥ **ãåºåä¸è¶³æ æ³åºåº,åºåºæ¹æ¬¡:CKâ¦ã**ï¼ä¸æ´æ¡å®¡æ¹äºå¡åæ»ï¼`approval_status` ä¸ä¼åæ 1ï¼ã |
| | | |
| | | åºåºæ°éå¿
é¡» > 0ï¼å¦åå®¡æ¹æ¥ãéå®ç±»åºåºæ°éå¿
须大äº0ãã |
| | | åºåºæ°éå¿
é¡» > 0ï¼å¦åå®¡æ¹æ¥ãæ²¹ååºåºæ°éå¿
须大äº0ãã |
| | | |
| | | --- |
| | | |
| | |
| | | 1. **å岿°æ®ä¸ä¼è¡¥æ£**ãæ¹å飿¡ `CK20260920001`ï¼`batch_no` 为空ã已审æ¹éè¿ï¼ä»æªæ£è¿åºåï¼ç°å¨ä¹ä¸ä¼è¡¥æ£ãå®ä¼åºç°å¨åè´§å°è´¦ï¼æ¾ç¤ºãå·²åè´§ãï¼ï¼ä½**è´¦å®ä¸ç¬¦**ãè¦ä¹è®©ä¸å¡è¡¥å½æ¹æ¬¡åéå¼ä¸æ¡ï¼è¦ä¹æ¥åè¿æ¡å岿°æ®ä¸æ£ã |
| | | 2. **ä¸è¦åç»éå®ç±»æ²¹ååºåºæå·¥å»ºåè´§å**ãå¦ååè´§å°è´¦ä¼åæ¶åºç° `shipping_info` è¡å `stock_out_record` è¡ï¼å䏿¹è´§æ¾ç¤ºä¸¤æ¬¡ã |
| | | 3. **åè´§å°è´¦çãå é¤ããéè´§ã对 `oilOut` è¡ä¸å¯ç¨**ãéè´§æµç¨ï¼`ReturnManagementServiceImpl`ï¼ä¾èµ `shipping_info` + `record_type='13'`ï¼æ²¹ååºåºä¸æ»¡è¶³ãéå®ç±»åºåºçé货请走ãåºåºå°è´¦ãå é¤ï¼ä¼å½è¿åºåï¼ã |
| | | 4. **åºåºç±»å«ä¸ºã代å¨ãã客åãçåºåº**æ¢ä¸æ£åºåãä¹ä¸è¿åè´§å°è´¦ã |
| | | 4. **ä»£å¨ / 客ååºåºä¸éå®åºåºè¡ä¸ºä¸è´**ï¼é½è¦éæ¹æ¬¡ã齿£åºåãé½è¿åè´§å°è´¦ã**å¯ä¸å·®å«æ¯éå®ç±»å¿
é¡»é车è¾**ï¼ä»£å¨ / 客åä¸è¦æ±ï¼ä¸ä¸çæ¬ã代å¨å®¢å䏿£åºåãä¸è¿åè´§å°è´¦ãçå£å¾å·²äº 2026-09-21 ä½åºï¼ã |
| | | 5. **审æ¹éè¿ååç¨ `PUT /stockOutRecord/{id}` æ¹æ°é/æ¹æ¬¡ï¼ä¸ä¼åæ¥è°æ´åºå**ï¼æ¢æå®ç°æªè¦çï¼æ¬æ¬¡æªæ¹ï¼ãè¦æ¹æ°é请å
å é¤ï¼ä¼å½è¿ï¼åéå¼ã |
| | | 6. **æ£ååªæ ¡éª `qualitity >= åºåºæ°é`ï¼æªèè `locked_quantity`ï¼å»ç»éï¼**ãè¿ä¸ç°æãåæ ¼åºåºã忝çè¡ä¸ºä¸è´ï¼è¥ä¸å¡è¦æ±å»ç»éä¸å¯å¨ç¨ï¼éå¦è¡ç¡®è®¤ã |
| | | |
| | |
| | | - [ ] å页 `total` ä¸å®é
è¡æ°ä¸è´ï¼æ¬æ¬¡æ¹äº UNIONï¼éç¹åå½é¡¹ï¼ |
| | | - [ ] æãåè´§åå·ãçéï¼`shipping` å `oilOut` 两类è¡é½è½è¢«çå° |
| | | - [ ] æãéå®ååå·ãçéï¼ç»å®äºè¯¥ååçæ²¹åè¡ä¹è½è¢«çå°ï¼**æªç»å®**çæ²¹åè¡ä¸åºç° |
| | | - [ ] æ²¹ååºåºè¡¨åï¼åºåºç±»å«=é宿¶ä¸å¡«æ¹æ¬¡ï¼æäº¤æ¥ãéå®ç±»åºåºå¿
须鿩åºåºæ¹æ¬¡ã |
| | | - [ ] æ²¹ååºåºè¡¨åï¼åºåºç±»å«=代å¨/客忶ä¸å¡«æ¹æ¬¡è½æ£å¸¸æäº¤ |
| | | - [ ] æ²¹ååºåºè¡¨åï¼**ä»»æåºåºç±»å«**ä¸å¡«æ¹æ¬¡ï¼æäº¤æ¥ãæ²¹ååºåºå¿
须鿩åºåºæ¹æ¬¡ã |
| | | - [ ] æ²¹ååºåºè¡¨åï¼ä»£å¨/客åä¸é车è¾ä¹è½æäº¤ï¼ä½æ¹æ¬¡å¿
å¡«ãè§æ ¼å¿
éï¼ |
| | | - [ ] 代å¨åºåºå®¡æ¹éè¿ â `stock_inventory.qualitity` æ£åï¼åè´§å°è´¦**åºç°**该è¡ï¼`source='oilOut'`ï¼ |
| | | - [ ] æ°å»ºéå®ç±»åºåºï¼æ¹æ¬¡ `CG20260815005-187`ãæ°é 10ï¼â 审æ¹éè¿ â `stock_inventory.qualitity` ç± 1000 å 990 |
| | | - [ ] åå é¤è¯¥åºåºè®°å½ â åºååå° 1000 |
| | | - [ ] æ°éå¡« 99999 â å®¡æ¹æ¥ãåºåä¸è¶³æ æ³åºåºãï¼ä¸è¯¥è®°å½ `approval_status` ä»ä¸º 0 |
| | |
| | | # 车è¾ç®¡çä¸åºåºæ®æ²¹èå¨ å端èè°ææ¡£ |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-20 |
| | | æ´æ°æ¶é´ï¼2026-09-21 |
| | | éç¨çæ¬ï¼æ¬æ¬¡åç«¯åæ´å |
| | | 对åºéæ±ï¼éæ±æ¸
å第 7 æ¡ãåè´§ï¼ç»è½¦è¾åå¯ä¸æ è¯ï¼ååºåºç¼ç ï¼å ä¸ä¸ªè½¦è¾ç®¡ç页é¢ï¼è®°å½æ¯æ¬¡æåéå®è´§åå©ä½çæ²¹éï¼ä¸æ¬¡åè´§è¿æ¯è¦ç»§ç»ä½¿ç¨ï¼ä¸æ¬¡åè´§ä¸ºä¸æ¬¡å©ä½é+åºåéã |
| | | |
| | |
| | | | å
容 | å½±åé¢ | |
| | | | --- | --- | |
| | | | æ°å»ºè½¦è¾ä¸»æ°æ®æ¨¡å `/basic/vehicle` | 车è¾ç®¡ç页é¢ï¼å端æ°å»ºï¼å端æ¥å£å·²å°±ç»ªï¼ | |
| | | | **è½¦è¾æ°å¢ `vehiclePhotos` ç
§çåæ®µï¼å¤å¾ï¼** | 车è¾ç®¡ç页é¢çæ°å¢/ç¼è¾è¡¨åã详æ
| |
| | | | åºåºè¡¨åã车è¾ãç±æå¡«è½¦çå·æ¹ä¸ºä¸æ | æ²¹ååºåºæ°å¢è¡¨å | |
| | | | æ°å¢å¯ç¨éæ¥è¯¢æ¥å£ | æ²¹ååºåºè¡¨åçã䏿¬¡å©ä½ / å½ååºå / å¯ç¨éãæç¤º | |
| | | | æ°å¢æ®æ²¹å½å
¥æ¥å£ | åºåºå°è´¦è¡æä½ï¼éå®è´§ååå¡«å©ä½æ²¹éï¼ | |
| | |
| | | - `stock_out_record` å 3 åï¼`vehicle_id`ã`residual_oil`ã`deduct_quantity` |
| | | |
| | | **该 DDL å·²äº 2026-09-20 å¨å¼ååº `product-inventory-management-rbhb` æ§è¡å®æ¯**ï¼`vehicle` 表 13 å + `plate_number` å¯ä¸ç´¢å¼ã`stock_out_record` ä¸ååå·²æ ¸å¯¹ï¼ãå
¶ä»ç¯å¢ä¸çº¿æ¶æåä¸ä¸ªæä»¶æ§è¡å³å¯ã |
| | | |
| | | > ð **车è¾ç
§çï¼2026-09-21 追å ï¼**ï¼æä»¶ `doc/20260921_vehicle_photos.sql`ï¼ç» `vehicle` 表å ä¸å |
| | | > `vehicle_photos text null comment '车è¾ç
§çï¼JSONæ°ç»ï¼'`ã**è¿ä¸åæ¯è½¦è¾æææ¥å£ç硬åç½®**ââ |
| | | > `Vehicle` å®ä½å·²ç»æå®æ å°è¿äºç»æéï¼**没æ§è¡è¿æ¡ DDL çè¯ï¼è½¦è¾å表ãåºåºè¡¨åç车è¾ä¸æã |
| | | > éå®ç±»åºåºçè½¦è¾æ ¡éªä¼å
¨é¨æ¥ `Unknown column 'vehicle_photos'`**ï¼ä¸åªæ¯ç
§çä¼ ä¸äºã |
| | | > æä»¥ä¸çº¿é¡ºåºä»ç¶æ¯ï¼**å
æ§è¡ DDLï¼åä¸å端**ã |
| | | |
| | | æä»¶ç¬¬ 3 段çèå SQLï¼`车è¾ä¿¡æ¯`ï¼`parent_id=2000`ï¼`component=basicData/vehicle/index`ï¼**å·²äº 2026-09-20 å¨å¼ååºæ§è¡**ï¼`menu_id=2377`ï¼`order_num=4`ï¼å¹¶å·²ææç»ãææ¯è´¨éãè§è² `role_id=2`ï¼ä¸åçº§çæ²¹åºä¿¡æ¯/å¨ç½ä¿¡æ¯ä¸è´ï¼ã |
| | | |
| | |
| | | | `loadCapacity` | BigDecimal | æ ¸å®è½½é(å¨) | |
| | | | `status` | String | `å¯ç¨` / `åç¨`ï¼é»è®¤ `å¯ç¨`ï¼**åç¨åä¸ååºç°å¨ä¸æéï¼åå²è®°å½ä¸åå½±å** | |
| | | | `remark` | String | 夿³¨ | |
| | | | `vehiclePhotos` | String[] | **车è¾ç
§çï¼å¤å¾**ãå
¥åæ¯å符串æ°ç»ãè¿å乿¯å符串æ°ç»ï¼åºéå JSON å符串ï¼ï¼æ²¡æå¾çæ¶è¿å `null`ãè¯¦è§ 2.4 | |
| | | |
| | | > è½¦è¾æ¯å
¬å¸çº§ä¸»æ°æ®ï¼`vehicle` å·²å å
¥ `IgnoreTableConfig`ï¼**ä¸åé¨é¨/åå»ºäººè¿æ»¤**ï¼åºåºè¡¨åç䏿è½çå°å
¨é¨è½¦è¾ã |
| | | > 建议ç¨ãåç¨ãè䏿¯ãå é¤ãæ¥ä¸çº¿ä¸è¾è½¦ââå é¤ä¸ä¼æ ¡éªæ¯å¦å·²è¢«åºåºè®°å½å¼ç¨ã |
| | |
| | | "driverPhone": "13800000000", |
| | | "loadCapacity": 30, |
| | | "status": "å¯ç¨", |
| | | "remark": "" |
| | | "remark": "", |
| | | "vehiclePhotos": [ |
| | | "http://36.213.90.123:9018/prod-api/common/preview/3d9c285e-xxxx_æ°D20298.jpg?publicKey=b967354721dc46ae8f905b9c51292b01" |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | |
| | | |
| | | æä»¥ä¸çº¿é¡ºåºæ¯ï¼**æ§è¡ DDL â å½å
¥è½¦è¾ â æè½èµ°åºåº**ã |
| | | |
| | | ### 2.4 车è¾ç
§çä¸ä¼ ï¼ð 2026-09-21ï¼ |
| | | |
| | | 车è¾ç
§ç**ä¸èµ° `/basic/vehicle/*`**ï¼èæ¯å¤ç¨å¹³å°éç¨ç两个æ¥å£ï¼å
ä¸ä¼ æ¿å°åï¼åæå°åæ°ç»å¡è¿ `vehiclePhotos` ä¸èµ·æäº¤ãåç«¯ä¸æ¥æ¶æä»¶æµã |
| | | |
| | | **ç¬¬ä¸æ¥ï¼ä¸ä¼ å¾ç** |
| | | |
| | | ``` |
| | | POST /common/public/upload |
| | | Content-Type: multipart/form-data |
| | | 表ååæ®µåï¼filesï¼å¯å¤ä¸ªååï¼ |
| | | ``` |
| | | |
| | | > â ï¸ **å¿
é¡»ç¨ `/common/public/upload`ï¼ä¸è¦ç¨ `/common/upload`ã** |
| | | > |
| | | > 两个æ¥å£é½ä¼è¿å `previewURL`ï¼ä½ï¼ |
| | | > |
| | | > - `/common/upload` ç `previewURL` æ¯**带 `token` ç临æ¶å°åï¼120 åéï¼2 å°æ¶ï¼åå°±ç¾å¤±æ** |
| | | > - `/common/public/upload` ç `previewURL` æ¯**带 `publicKey` çæ°¸ä¹
å°å** |
| | | > |
| | | > è½¦è¾æ¯**ä¸»æ°æ®**ï¼ç
§çè¦é¿æè½çã妿å¾çäºç¨äº `/common/upload` å¹¶æè¿åç URL åè¿åºï¼ |
| | | > **2 å°æ¶åææè½¦è¾ç
§çé½ä¼åææä¸å¼çè£å¾**ï¼åºåºè®°å½æ¨¡åç°å¨å°±æ¯è¿ä¸ªæ¯ç
ï¼å±äºåå²éçï¼å«ç
§æï¼ã |
| | | > |
| | | > å¦å¤ `/common/public/upload` çæ¥å£æ³¨éåçãæ°¸ä¹
ææï¼æ
ç¨ãââè¿éæ£æ¯è¯¥ç¨çåºæ¯ã |
| | | |
| | | è¿åï¼å `data[].previewURL` å³å¯ï¼å
¶å®å段å端ç¨ä¸ä¸ï¼ï¼ |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": [ |
| | | { |
| | | "id": 322, |
| | | "originalFilename": "æ°D20298.jpg", |
| | | "uidFilename": "3d9c285e-9c9c-4ceb-a610-6052962fe8ab_æ°D20298.jpg", |
| | | "path": "2026/0921", |
| | | "contentType": "image/jpeg", |
| | | "byteSize": 225007, |
| | | "resourceKey": "b967354721dc46ae8f905b9c51292b01", |
| | | "previewURL": "http://36.213.90.123:9018/prod-api/common/preview/3d9c285e-9c9c-4ceb-a610-6052962fe8ab_æ°D20298.jpg?publicKey=b967354721dc46ae8f905b9c51292b01", |
| | | "downloadURL": "http://36.213.90.123:9018/prod-api/common/download/3d9c285e-...jpg?publicKey=b967354721dc46ae8f905b9c51292b01" |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | **ç¬¬äºæ¥ï¼æ URL æ°ç»åè¿è½¦è¾** |
| | | |
| | | ```json |
| | | POST /basic/vehicle/add |
| | | { |
| | | "plateNumber": "èA12345", |
| | | "vehiclePhotos": [ |
| | | "http://36.213.90.123:9018/prod-api/common/preview/3d9c285e-..._æ°D20298.jpg?publicKey=b967354721dc46ae8f905b9c51292b01", |
| | | "http://36.213.90.123:9018/prod-api/common/preview/e51897ac-..._20298.jpg?publicKey=4f5c71aa46574c0f925a662b50e738b4" |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | **å£å¾ä¸æ³¨æäºé¡¹** |
| | | |
| | | | äºé¡¹ | å£å¾ | |
| | | | --- | --- | |
| | | | åæ®µç±»å | `vehiclePhotos` æ¯**å符串æ°ç»**ï¼**ä¸è¦ä¼ 对象æ°ç»** | |
| | | | åä»ä¹ | åªå `previewURL` å符串ã**ä¸è¦**ç
§æåºåºè®°å½é£æ ·ææ´ä¸ªä¸ä¼ 对象ï¼`id`/`uidFilename`/`resourceKey`â¦ï¼JSON è¿å»ââæ¬æ¨¡ååºéåªå URL æ°ç» | |
| | | | ä¼ å¯¹è±¡ä¼ææ · | `vehiclePhotos` 声æä¸º `List<String>`ï¼å¡å¯¹è±¡ä¼ç´æ¥ **JSON è§£æå¤±è´¥æ¥ 400** | |
| | | | ç¼è¾æ¶åæ¾ | `GET /basic/vehicle/{id}`ã`GET /basic/vehicle/list` è¿åç `vehiclePhotos` å°±æ¯æ°ç»ï¼ç´æ¥åç» `el-upload` ç `file-list`ï¼`url` ç¨æ°ç»å
ç´ ï¼ | |
| | | | æ¸
空å¾ç | ä¼ `"vehiclePhotos": []`ã**注æ `update` èµ°çæ¯ MyBatis-Plus ç `updateById`ï¼ä¼ `null` æ¯ä¸æ´æ°ç**ï¼ç
§çä¼ä¿çï¼ï¼æ³å å
å¿
é¡»æ¾å¼ä¼ 空æ°ç» | |
| | | | å表æ¥å£ä¹ä¼å¸¦ | `GET /basic/vehicle/list` ååºåºä¸æç¨ç `GET /basic/vehicle/all` é½ä¼è¿å `vehiclePhotos`ï¼ä¸æå¦æåªæ¾ç¤ºè½¦çå·ï¼å¿½ç¥è¯¥å段å³å¯ | |
| | | | å端ä¸ä¼ ç»ä»¶ | 项ç®ééç¨çä¸ä¼ ç»ä»¶è¿åçæ¯**对象æ°ç»**ï¼å¦åºåºè®°å½é£ä¸ªï¼ï¼æ¥å°æ¬æ¨¡åæ¶è¦ `.map(f => f.previewURL)` ä¹ååæäº¤ | |
| | | |
| | | --- |
| | | |
| | | ## 3. æ°å¢åºåºï¼å
ææ¸
èµ°åªä¸ªæ¥å£ï¼**å¿
ç**ï¼ |
| | |
| | | å¦å¤ä¸æ¡ï¼ |
| | | |
| | | - **ä¸å¨åºå**ï¼è¿ä¸ªæ¥å£åªå»º `stock_out_record` è®°å½ï¼åºåæ£ååçå¨**审æ¹éè¿æ¶**ï¼è§ 4.3ï¼ |
| | | - **`outCategory` å¿
é¡»æ¯ `éå®`**ï¼è½¦è¾æ ¡éªãå¯ç¨éæ ¡éªãæ®æ²¹å£å¾**å
¨é¨åªå¯¹ `outCategory = 'éå®'` çæ**ãä¼ ã客åãã代å¨ã䏿 ¡éªãå®¡æ¹æ¶ä¹ä¸æ£åºå |
| | | - **è½¦è¾æ ¡éª / æ®æ²¹å£å¾åªå¯¹ `outCategory = 'éå®'` çæ**ï¼ä¼ ã客åãã代å¨ãä¸è¦æ±é车è¾ï¼æ®æ²¹æ 0 å¤çãä½ **`batchNo`ï¼æ¹æ¬¡ï¼å `productModelId`ï¼è§æ ¼ï¼å¯¹å
¨é¨åºåºç±»å«é½æ¯å¿
å¡«**ï¼å¯ç¨éæ ¡éªä¹ä¸è§åä»ï¼2026-09-21 èµ·ï¼è§ `doc/20260921_æ²¹ååºåºç»ä¸åºåºå£å¾å端èè°ææ¡£.md`ï¼ |
| | | - åºåºç¼ç `outboundBatches`ï¼`CK` å¼å¤´ï¼ç±å端èªå¨çæï¼å端ä¸ç¨ä¼ |
| | | |
| | | 请æ±ç¤ºä¾ï¼ |
| | |
| | | |
| | | ### 4.4 æ ¡éªä¸æ¥éææ¡ |
| | | |
| | | éå®ç±»åºåºå¨**æ°å¢**å**审æ¹éè¿**两æ¥é½æ ¡éªã |
| | | æ²¹ååºåºå¨**æ°å¢**å**审æ¹éè¿**两æ¥é½æ ¡éªãä¸è¡¨é¤å两è¡çã车è¾ãç¸å
³é¡¹åªå¯¹ `outCategory='éå®'` çæå¤ï¼å
¶ä½å¯¹ææåºåºç±»å«ä¸è§åä»ï¼2026-09-21 å£å¾åæ´ï¼ã |
| | | |
| | | | åºæ¯ | æ¥é | |
| | | | --- | --- | |
| | | | 没é车è¾ã乿²¡å¡«è½¦çå· | `éå®ç±»åºåºå¿
é¡»éæ©è½¦è¾` | |
| | | | 车çå·ä¸å¨è½¦è¾ç®¡çé | `车çå· X ä¸å¨è½¦è¾ç®¡çä¸ï¼è¯·å
å°è½¦è¾ç®¡çæ·»å ` | |
| | | | 没éåºåºæ¹æ¬¡ | `éå®ç±»åºåºå¿
须鿩åºåºæ¹æ¬¡` | |
| | | | æ°é为空æ ⤠0 | `éå®ç±»åºåºæ°éå¿
须大äº0` | |
| | | | éå®ç±»æ²¡é车è¾ã乿²¡å¡«è½¦çå· | `éå®ç±»åºåºå¿
é¡»éæ©è½¦è¾` | |
| | | | éå®ç±»è½¦çå·ä¸å¨è½¦è¾ç®¡çé | `车çå· X ä¸å¨è½¦è¾ç®¡çä¸ï¼è¯·å
å°è½¦è¾ç®¡çæ·»å ` | |
| | | | 没éåºåºæ¹æ¬¡ï¼ä»»æç±»å«ï¼ | `æ²¹ååºåºå¿
须鿩åºåºæ¹æ¬¡` | |
| | | | æ°é为空æ ⤠0ï¼ä»»æç±»å«ï¼ | `æ²¹ååºåºæ°éå¿
须大äº0` | |
| | | | 没é产åè§æ ¼ï¼ä»»æç±»å«ï¼ | `æ²¹ååºåºå¿
é¡»éæ©äº§åè§æ ¼` | |
| | | | æ°é < 䏿¬¡å©ä½æ²¹é | `åºåºæ°éä¸è½å°äºè¯¥è½¦ä¸æ¬¡å©ä½æ²¹é5` | |
| | | | æ°é > 䏿¬¡å©ä½ + åºå | `åºåºæ°éè¶
åºå¯ç¨é(䏿¬¡å©ä½5,åºå10,å¯ç¨15)` | |
| | | | å®¡æ¹æ¶åºå被å«å¤æ£æäº | `åºåä¸è¶³æ æ³åºåº` | |
| | |
| | | ## 8. å·²ç¥å½±å䏿³¨æç¹ |
| | | |
| | | 1. **éå®ç±»åºåºå¤äºä¸¤ä¸ªåç½®æ¡ä»¶**ï¼å¿
é¡»æè½¦è¾ãå¿
é¡»éæ¹æ¬¡ãå岿°æ®ä¸åå½±åââ`vehicleId` 为空çèè®°å½ï¼å
¶ã䏿¬¡å©ä½æ²¹éãæ 0 å¤çï¼æ£åééå为ãåºåºæ°éãï¼ä¸æ¹é åè¡ä¸ºä¸è´ã |
| | | > 2026-09-21 èµ·ï¼ãå¿
é¡»éæ¹æ¬¡ã**对ææåºåºç±»å«é½æç«**ï¼ä¸ååªæéå®ç±»ï¼ï¼ä¸ä»£å¨/客ååæ ·æ£åºåãè¿åè´§å°è´¦ãè¯¦è§ `doc/20260921_æ²¹ååºåºç»ä¸åºåºå£å¾å端èè°ææ¡£.md`ã |
| | | 2. **åå²å·²å®¡æ¹è®°å½ä¸è¡¥ç®**ï¼ä¾å¦ `CK20260920002`ï¼å·²å®¡æ¹ãå½åæ£äºå
¨é¢ï¼`deduct_quantity` 为 nullï¼å 餿¶æå
¨é¢å½è¿ï¼ä¸å®å½åçæ£åä¸è´ï¼å®æ²¡æè½¦è¾ï¼ä¸å䏿®æ²¹é¾ã |
| | | > 2026-09-21 追å ï¼æ²¹ååºåºå®¡æ¹éè¿æ¶ï¼**ç»å®äºåæ²¹å°è´¦ä¸è§æ ¼å¨å°è´¦æç»é**çä¼é¡ºå¸¦çæåè´§åï¼è¯¥åºåºç `record_type` æ¹æ `'13'`ã`record_id` æååè´§åï¼ï¼å¹¶åæ¥éå®å°è´¦ç¶æãéå®ç±»åºåºï¼æè½¦è¾ãç®æ®æ²¹ï¼æ£æ¯æå
¸åä¼å½ä¸è¿æ¡çåºåºãå é¤è¯¥åºåºæ¶åè´§åä¸å¹¶å²éï¼**åºååªå½è¿ä¸æ¬¡**ï¼æ®æ²¹é¾ä¸åå½±åãè¯¦è§ `doc/20260921_æ²¹ååºåºçæåè´§å°è´¦ä¸éå®å°è´¦ç¶æåæ¥å端èè°ææ¡£.md`ã |
| | | 3. **ä¸è¾è½¦çæ®æ²¹ææ²¹åè§æ ¼åå¼ç®**ï¼åä¸è¾è½¦æä¸åæ²¹åäºä¸å¹²æ°ã |
| | | 4. **审æ¹éè¿ååæ¹ `residualOil` ä¸ä¼éç® `deduct_quantity`**ï¼ä¸å¹³å°æ¢æçãæ¹æ°éä¸åæ¥åºåãæ¯åä¸ç±»é®é¢ï¼æ¬æ¬¡ä¸åæ¥ï¼ã |
| | | 5. **åºåå®å«åªç `qualitity`ï¼ä¸èè `locked_quantity`ï¼å»ç»éï¼**ï¼ä¸æ¢æ `type='0'/'1'` 忝è¡ä¸ºä¸è´ã |
| | |
| | | |
| | | ## 9. åç«¯èªæ¥æ¸
å |
| | | |
| | | - [ ] DDL å·²æ§è¡ï¼`vehicle` 表åå¨ã`stock_out_record` æ `vehicle_id`/`residual_oil`/`deduct_quantity` ä¸åï¼ |
| | | - [ ] DDL å·²æ§è¡ï¼`vehicle` 表åå¨ä¸æ `vehicle_photos` åã`stock_out_record` æ `vehicle_id`/`residual_oil`/`deduct_quantity` ä¸åï¼ |
| | | - [ ] 车è¾ç®¡ç页é¢å·²å»ºå¥½ï¼`src/views/basicData/vehicle/index.vue`ï¼ââ**èåå·²é
好ï¼é¡µé¢æ¯å¯ä¸ç¼ºçé¨åï¼å»ºå¥½åèåç¹è¿å»å°±ä¸å 404** |
| | | - [ ] 车è¾ç®¡çè½æ°å¢ï¼éå¤è½¦çå·ä¼æ¥ `车çå·å·²åå¨:X` |
| | | - [ ] 车è¾è¡¨åè½ä¼ å¤å¼ ç
§çï¼èµ°çæ¯ `/common/public/upload`ï¼**䏿¯ `/common/upload`**ï¼ï¼æäº¤ç `vehiclePhotos` æ¯ URL å符串æ°ç» |
| | | - [ ] 车è¾è¯¦æ
/ç¼è¾è½åæ¾å·²åç
§çï¼ä¸**é天åæå¼ç
§çä»è½æ¾ç¤º**ï¼éªä¸´æ¶ token é£ä¸ªåï¼ |
| | | - [ ] è³å°å½å
¥äºä¸è¾æµè¯è½¦ |
| | | - [ ] åºåºè¡¨åçã车è¾ãæ¯ä¸æï¼æ°æ®æ¥èª `/basic/vehicle/all`ï¼æäº¤å¸¦ `vehicleId` |
| | | - [ ] åºåºè¡¨åæäº¤çæ¯ `outTonnage`ï¼è£
车æ»éï¼ï¼ä¸ `outCategory` ä¼ çæ¯ `éå®` |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- éè´ç³è¯·å¯¹é½éè´å°è´¦åæ®µï¼æ°å¢/ç¼è¾ç³è¯·åè¦ä¸æ°å¢éè´å°è´¦å段ä¸è´ |
| | | -- æ§è¡åºï¼product-inventory-managementï¼åç§æ·åºåï¼ |
| | | ALTER TABLE `purchase_application` |
| | | ADD COLUMN `purchase_contract_number` varchar(50) DEFAULT NULL COMMENT 'éè´ååå·' AFTER `convert_time`, |
| | | ADD COLUMN `recorder_id` bigint DEFAULT NULL COMMENT 'å½å
¥äººid' AFTER `purchase_contract_number`, |
| | | ADD COLUMN `entry_date` date DEFAULT NULL COMMENT 'å½å
¥æ¥æ' AFTER `recorder_id`, |
| | | ADD COLUMN `execution_date` date DEFAULT NULL COMMENT 'ç¾è®¢æ¥æ' AFTER `entry_date`, |
| | | ADD COLUMN `best_arrival_date` date DEFAULT NULL COMMENT 'æä½³å°ç«æ¥æ' AFTER `execution_date`, |
| | | ADD COLUMN `application_submit_time` datetime DEFAULT NULL COMMENT 'ç³è¯·æäº¤æ¶é´' AFTER `best_arrival_date`, |
| | | ADD COLUMN `purchase_category` varchar(50) DEFAULT NULL COMMENT 'éè´ç±»å«ï¼å®¢åã代å¨ãéè´å
¥åºãéè´ç´é' AFTER `application_submit_time`, |
| | | ADD COLUMN `logistics_method` varchar(50) DEFAULT NULL COMMENT 'ç©æµæ¹å¼ï¼åå®¶é
éãå§å¤ç©æµã客æ·èªæ' AFTER `purchase_category`, |
| | | ADD COLUMN `pickup_method` varchar(50) DEFAULT NULL COMMENT 'æè´§æ¹å¼ï¼æä¸æè´§ãæè´§' AFTER `logistics_method`, |
| | | ADD COLUMN `oil_depot_id` bigint DEFAULT NULL COMMENT 'éè´æ²¹åºid' AFTER `pickup_method`, |
| | | ADD COLUMN `customer_name` varchar(100) DEFAULT NULL COMMENT '客æ·åç§°' AFTER `oil_depot_id`, |
| | | ADD COLUMN `purchase_quantity` int DEFAULT NULL COMMENT 'éè´æ°éï¼å¨ï¼' AFTER `customer_name`, |
| | | ADD COLUMN `purchase_order_status` varchar(50) DEFAULT NULL COMMENT 'éè´ç³è¯·è®¢åç¶æ' AFTER `purchase_quantity`; |
| | | |
| | | -- éè´ç³è¯·äº§åæç»æ°å¢é¢è¦æ°éï¼ä¸éè´å°è´¦æç» warn_num 对é½ï¼ |
| | | ALTER TABLE `purchase_application_product` |
| | | ADD COLUMN `warn_num` decimal(10, 2) DEFAULT NULL COMMENT 'é¢è¦æ°é' AFTER `quantity`; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- å
¥åºè®°å½è¡¨æ°å¢ãç»å®çéå®è®¢åï¼éå®å°è´¦ï¼ã |
| | | -- æ§è¡åºï¼product-inventory-managementï¼åç§æ·åºåï¼ |
| | | -- æ²¹åå
¥åºçå
¥åºç±»å«éã代å¨å
¥åºãæ¶å¿
é¡»ç»å®ä¸å¼ ã代å¨ãç±»åçéå®å°è´¦ã |
| | | -- åéæ°æ®ä¸º NULLï¼æªç»å®ï¼ï¼èªè´å
¥åºä¸æ¹å¨åå®å
¨ä¸è´ã |
| | | ALTER TABLE `stock_in_record` |
| | | ADD COLUMN `sales_ledger_id` bigint NULL DEFAULT NULL COMMENT 'ç»å®çéå®å°è´¦id(éå®è®¢å)ï¼ä»£å¨å
¥åºå¿
å¡«' AFTER `inbound_category`, |
| | | ADD INDEX `idx_stock_in_sales_ledger_id` (`sales_ledger_id`); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #éå®å°è´¦å ãå¨ä½ãåæ®µï¼ä»
éå®ç±»å=代卿¶ä½¿ç¨ï¼ |
| | | #对åºéæ±ï¼éå®ç±»åæ¯ä»£å¨çå 个å¨ä½å段 |
| | | #ç®æ åºï¼product-inventory-management-rbhb |
| | | #说æï¼çº¯æ°å¢åï¼ä¸æ¹å¨ä»»ä½æ¢æåãéå¡«ï¼ä¸åå¿
å¡«æ ¡éªï¼åæ²¹å°è´¦åç«¯ä¼æè¯¥å置空 |
| | | |
| | | alter table sales_ledger |
| | | add column tonnage decimal(16, 4) null comment 'å¨ä½ï¼ç±»å=代卿¶ä½¿ç¨ï¼' after tank_no; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #æ²¹ååºåºå¤éå®å°è´¦ç»å® + éå®å°è´¦å°è´§è®°å½ |
| | | #对åºéæ±ï¼ä¸æ¬¡æ²¹ååºåºå¯ç»å®å¤ä¸ªéå®å°è´¦ï¼å¯¹åºå¤ä¸ªå®¢æ·ï¼ä¸åå°è´¦é¡»å«åä¸äº§åè§æ ¼ï¼ï¼ |
| | | # éå®å°è´¦æ°å¢ãå°è´§è®°å½ãï¼å°è´§æ°é/å·²åºåºè½¦è¾/éä»¶ï¼ï¼åè´§å°è´¦æ®æ¤æ¹ä¸ºå±çº§å±ç¤º |
| | | #ç®æ åºï¼product-inventory-management-rbhb |
| | | #说æï¼çº¯æ°å¢ä¸¤å¼ 表ï¼ç¬¬ 3 段çå鿏
çæ¯å¹ççï¼æ¬å°/线ä¸è¥æ æ°æ®å为 no-op |
| | | |
| | | #1. åºåºå â éå®å°è´¦ ç»å®è¡¨ï¼ä¸ä¸ªåºåºåå¯ç»å¤ä¸ªå°è´¦ï¼åå¸¦æ¬æ¬¡åææ°éï¼ |
| | | # åç±»å对é½åéåºï¼stock_out_record.id / sales_ledger.id / sales_ledger_product.id / customer.id å为 int |
| | | create table stock_out_record_sales_ledger |
| | | ( |
| | | id bigint not null auto_increment comment '主é®', |
| | | stock_out_record_id int not null comment 'åºåºè®°å½idï¼stock_out_record.idï¼', |
| | | sales_ledger_id int not null comment 'éå®å°è´¦idï¼sales_ledger.idï¼', |
| | | sales_ledger_product_id int null comment 'éå®å°è´¦é宿ç»idï¼sales_ledger_product.idï¼type=1ï¼', |
| | | customer_id int null comment '客æ·idï¼åä½èªå°è´¦ï¼', |
| | | customer_name varchar(100) null comment '客æ·åç§°ï¼åä½èªå°è´¦ï¼', |
| | | quantity decimal(16, 4) null comment 'æ¬å°è´¦å¯¹åºçåºåºæ°é(å¨)', |
| | | create_time datetime null comment 'å建æ¶é´', |
| | | create_user bigint null comment 'å建人', |
| | | update_time datetime null comment 'æ´æ°æ¶é´', |
| | | update_user bigint null comment 'æ´æ°äºº', |
| | | tenant_id bigint null comment 'ç§æ·id', |
| | | dept_id bigint null comment 'é¨é¨id', |
| | | primary key (id), |
| | | key idx_sosl_record (stock_out_record_id), |
| | | key idx_sosl_ledger (sales_ledger_id) |
| | | ) engine = InnoDB |
| | | default charset = utf8mb4 |
| | | row_format = DYNAMIC comment ='åºåºè®°å½-éå®å°è´¦ç»å®è¡¨'; |
| | | |
| | | #2. éå®å°è´¦å°è´§è®°å½è¡¨ï¼åè´§å°è´¦éçåè¡ï¼ |
| | | # attachments å /common/public/upload è¿å previewURL ç JSON æ°ç»ï¼æ°¸ä¹
龿¥ï¼ä¸èµ° storage_blob ç¾åä½ç³»ï¼ |
| | | # vehicle.id æ¯ bigintï¼ä¸ä¸é¢å å¼ int 表ä¸åï¼å«ææ·· |
| | | create table sales_ledger_arrival |
| | | ( |
| | | id bigint not null auto_increment comment '主é®', |
| | | sales_ledger_id int not null comment 'éå®å°è´¦idï¼sales_ledger.idï¼', |
| | | sales_ledger_product_id int null comment 'éå®å°è´¦é宿ç»idï¼sales_ledger_product.idï¼type=1ï¼', |
| | | stock_out_record_id int not null comment 'åºåºè®°å½idï¼stock_out_record.idï¼ï¼åè´§å°è´¦çç¶è¡', |
| | | vehicle_id bigint null comment '车è¾idï¼vehicle.idï¼', |
| | | truck_plate_no varchar(20) null comment 'å°è´§è½¦çå·', |
| | | arrival_quantity decimal(16, 4) null comment 'å°è´§æ°é(å¨)', |
| | | arrival_date date null comment 'å°è´§æ¥æ', |
| | | attachments text null comment 'éä»¶ï¼JSONæ°ç»ï¼URLå表ï¼', |
| | | remark varchar(255) null comment '夿³¨', |
| | | create_time datetime null comment 'å建æ¶é´', |
| | | create_user bigint null comment 'å建人', |
| | | update_time datetime null comment 'æ´æ°æ¶é´', |
| | | update_user bigint null comment 'æ´æ°äºº', |
| | | tenant_id bigint null comment 'ç§æ·id', |
| | | dept_id bigint null comment 'é¨é¨id', |
| | | primary key (id), |
| | | key idx_sla_ledger (sales_ledger_id), |
| | | key idx_sla_record (stock_out_record_id) |
| | | ) engine = InnoDB |
| | | default charset = utf8mb4 |
| | | row_format = DYNAMIC comment ='éå®å°è´¦å°è´§è®°å½è¡¨'; |
| | | |
| | | #3. å鿏
çï¼å¹çï¼ï¼ä¸ä¸è½®ãæ²¹ååºåºå®¡æ¹éè¿èªå¨çæåè´§åãçä¸çæ°æ® |
| | | # æ¬è½®åé该çæé»è¾ï¼æ¹ä¸ºç±ãå°è´§è®°å½ã驱å¨éå®å°è´¦ç¶æï¼æ
æå·²çæçåè´§åå æãåªæ¸
record_id |
| | | # æ²¹ååºåºç record_type ä¿æåæ ·ï¼ã1ãï¼ï¼ä¸æ¹æã13ãââ æ¹äºä¼è®©åºåºç®¡çå表æåºåºç±»åçéæ¶çä¸å°å® |
| | | delete |
| | | from shipping_product_detail |
| | | where shipping_info_id in |
| | | (select record_id |
| | | from stock_out_record |
| | | where record_type = '13' and record_id > 0 and (type is null or type = '')); |
| | | |
| | | delete |
| | | from shipping_info |
| | | where id in |
| | | (select record_id |
| | | from stock_out_record |
| | | where record_type = '13' and record_id > 0 and (type is null or type = '')); |
| | | |
| | | update stock_out_record |
| | | set record_id = 0 |
| | | where record_type = '13' and record_id > 0 and (type is null or type = ''); |
| | | |
| | | #4. åéåå¡«ï¼å¹çï¼ï¼ä¸ä¸è½®ãä¸ä¸ªåºåºåç»ä¸ä¸ªéå®å°è´¦ãåå¨ stock_out_record.sales_ledger_id åå¼åéï¼ |
| | | # æ¬è½®æ¹æç»å®è¡¨ï¼ä¸åå¡«çè¯è¿äºèæ°æ®å¨è´¢å¡/å¼ç¥¨/æ¶æ¬¾ä»¥åãå¯å°è´§è½¦è¾ãé伿´æ¹æ¶å¤±ã |
| | | # æ°éå stock_out_numï¼æç» id å该å°è´¦åè§æ ¼ type=1 æç»ä¸ id æå°ç飿¡ï¼æ°é<=0 ææ å¹é
æç»çèåè·³è¿ |
| | | # stock_out_record 没æ tenant_id åï¼æ
tenant_id ä¸å¡«ï¼è¯¥è¡¨ä¹ä¸æ¯ç§æ·ç»´åº¦ï¼ |
| | | insert into stock_out_record_sales_ledger |
| | | (stock_out_record_id, sales_ledger_id, sales_ledger_product_id, customer_id, customer_name, quantity, |
| | | create_time, create_user, update_time, update_user, dept_id) |
| | | select sor.id, |
| | | sl.id, |
| | | slp.id, |
| | | sl.customer_id, |
| | | sl.customer_name, |
| | | sor.stock_out_num, |
| | | ifnull(sor.create_time, now()), |
| | | ifnull(sor.create_user, 0), |
| | | now(), |
| | | ifnull(sor.create_user, 0), |
| | | sor.dept_id |
| | | from stock_out_record sor |
| | | join sales_ledger sl on sl.id = sor.sales_ledger_id and ifnull(sl.ledger_type, '') <> '代å¨' |
| | | join sales_ledger_product slp on slp.sales_ledger_id = sl.id |
| | | and slp.type = 1 |
| | | and slp.id = (select min(x.id) |
| | | from sales_ledger_product x |
| | | where x.sales_ledger_id = sl.id |
| | | and x.type = 1 |
| | | and x.product_model_id = sor.product_model_id) |
| | | where (sor.type is null or sor.type = '') |
| | | and ifnull(sor.stock_out_num, 0) > 0 |
| | | and not exists (select 1 |
| | | from stock_out_record_sales_ledger b |
| | | where b.stock_out_record_id = sor.id); |
| | | |
| | | #5. å¼ç¥¨ç³è¯· / æ¶æ¬¾å å¢å ãå
³èå°è´§ç»å®è¡ idãåã |
| | | # èæ¯ï¼ä¸æ¬¡æ²¹ååºåºå¯æå®¢æ·ææå¤æ¡ç»å®è¡ï¼stock_out_record_sales_ledgerï¼ï¼è´¢å¡åéå表çç²åº¦ |
| | | # å æ¤ä»ãåºåºåã䏿²å°ãåºåºåÃ客æ·ããä½ stock_out_record_ids éåçæ¯åºåºå idï¼ä¸¤ç§ id |
| | | # 空é´é½æ¯ä»å°èªå¢çæ´æ°ï¼æ··å¨ä¸ä¸ªåéå¿
ç¶æå·ï¼ç»å®è¡ 1 ä¸åºåºå 1 é½ä¼è¢« FIND_IN_SET å½ä¸ï¼ï¼ |
| | | # æä»¥å¦å¼ä¸åï¼stock_out_record_ids çè¯ä¹åç±»åä¿æä¸åï¼åéæ°æ®ä¸åå½±åã |
| | | # 精度 255 ä¸ stock_out_record_ids ä¿æä¸è´ï¼å¤å约 40 个 idï¼ã |
| | | alter table account_invoice_application |
| | | add column stock_out_binding_ids varchar(255) null comment 'å
³èåºåºç»å®è¡id(å¤éï¼stock_out_record_sales_ledger.id)' after stock_out_record_ids; |
| | | |
| | | alter table account_sales_collection |
| | | add column stock_out_binding_ids varchar(255) null comment 'å
³èåºåºç»å®è¡id(å¤éï¼stock_out_record_sales_ledger.id)' after stock_out_record_ids; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #车è¾ä¿¡æ¯ï¼æ°å¢è½¦è¾ç
§çå |
| | | #对åºéæ±ï¼è½¦è¾ä¿¡æ¯å ä¸ä¸ªå¾çä¸ä¼ |
| | | #ç®æ åºï¼product-inventory-management-rbhb |
| | | #说æï¼çº¯æ°å¢ï¼ä¸æ¹å¨ä»»ä½æ¢æåï¼å¯é夿§è¡æ¶è¯·å
夿æ¯å¦åå¨ |
| | | |
| | | alter table vehicle |
| | | add column vehicle_photos text null comment '车è¾ç
§çï¼JSONæ°ç»ï¼' after remark; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # 代å¨å
¥åºç»å®éå®è®¢å å端èè°ææ¡£ |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-21 |
| | | éç¨çæ¬ï¼æ¬æ¬¡åç«¯åæ´å |
| | | 对åºéæ±ï¼æ²¹åå
¥åºç**å
¥åºç±»å«éã代å¨å
¥åºãæ¶å¿
é¡»ç»å®éå®è®¢å** |
| | | |
| | | DDL è§ `doc/20260921_add_sales_ledger_to_stock_in_record.sql`ï¼**éå
å¨ç®æ åºæ§è¡**ã |
| | | |
| | | > ãéå®è®¢åã卿¬ç³»ç»éå°±æ¯**éå®å°è´¦ `sales_ledger`**ï¼ä¸æ²¹ååºåºçãç»å®éå®å°è´¦ãæ¯åä¸å¼ 表ï¼ãå
¨åºæ²¡æç¬ç«çéå®è®¢å表ã |
| | | |
| | | --- |
| | | |
| | | ## 1. åæ´èå´ |
| | | |
| | | | å
容 | å½±åé¢ | |
| | | | --- | --- | |
| | | | `stock_in_record` æ°å¢ `sales_ledger_id` | å
¥åºè®°å½è¡¨ | |
| | | | æ°å¢ãå¯ç»å®éå®è®¢åã䏿æ¥å£ | æ²¹åå
¥åºè¡¨å | |
| | | | 代å¨å
¥åºæäº¤æ¶æ ¡éªå¿
é¡»ç»å®ã代å¨ãç±»åå°è´¦ | æ²¹åå
¥åºè¡¨å | |
| | | | å
¥åºå°è´¦å表æ°å¢åºå `salesLedgerId` / `salesContractNo` | å
¥åºå°è´¦å表 | |
| | | |
| | | **æ¬æ¬¡ä¸è¦ç客æ·/æ²¹åº/å¨ç½**ï¼ç»å®çå°è´¦**åªä½ä¸ºå
³èå
³ç³»å䏿¥**ï¼`sales_ledger_id`ï¼ï¼å
¥åºåä¸ç客æ·ãæ²¹åºãå¨ç½**ä»ä»¥å端填ç为å**ï¼å端ä¸ä¼ç¨å°è´¦å»çãè¿ä¸ç¹ä¸æ²¹ååºåºä¾§çç»å®è¡ä¸º**ä¸å**ï¼ä¸è¦ç
§æ¬åºåºçç»éªã |
| | | |
| | | --- |
| | | |
| | | ## 2. è¡¨ç»æåæ´ |
| | | |
| | | `stock_in_record` æ°å¢ä¸åï¼ |
| | | |
| | | | å | ç±»å | é»è®¤å¼ | 说æ | |
| | | | --- | --- | --- | --- | |
| | | | `sales_ledger_id` | `bigint NULL` | `NULL` | ç»å®çéå®å°è´¦idï¼éå®è®¢åï¼ï¼ä»£å¨å
¥åºå¿
å¡« | |
| | | |
| | | > åéæ°æ®å
¨ä¸º `NULL`ï¼æªç»å®ï¼ã**å级åèªè´å
¥åºè¡ä¸ºä¸æ¹å¨åå®å
¨ä¸è´**ï¼åéçã代å¨å
¥åºãèæ°æ®ä¹æ¯ `NULL`ï¼å 为å
¥åºè®°å½**没æç¼è¾æ¥å£**ï¼å®ä»¬ä¸ä¼è¢«éæ°æäº¤ï¼æä»¥**ä¸ä¼æ¥éãä¸ç¨å·æ°æ®**ã |
| | | |
| | | --- |
| | | |
| | | ## 3. å端æµç¨ |
| | | |
| | | ``` |
| | | æ°å¢æ²¹åå
¥åº |
| | | â |
| | | ââ å
¥åºç±»å« = èªè´å
¥åº âââ ä¸ç»éå®è®¢åï¼ä¼ äº salesLedgerId ä¹ä¼è¢«å端丢å¼ï¼ |
| | | â |
| | | ââ å
¥åºç±»å« = 代å¨å
¥åº âââ å¿
é¡»éä¸å¼ ã代å¨ãç±»åçéå®è®¢å |
| | | ä¸æèµ° GET /stockInRecord/bindableSalesLedger |
| | | ï¼åªåºä»£å¨å°è´¦ï¼åæ²¹å°è´¦ä¸ä¼åºç°å¨åééï¼ |
| | | ``` |
| | | |
| | | å端å¨ãå
¥åºç±»å« = 代å¨å
¥åºãæ¶æä¸æå¼åºæ¥ã并设为å¿
å¡«ï¼ååãèªè´å
¥åºãæ¶æ¸
空该æ§ä»¶å¼å³å¯ã |
| | | |
| | | --- |
| | | |
| | | ## 4. æ¥å£ |
| | | |
| | | ### 4.1 å¯ç»å®éå®è®¢å䏿ï¼**æ°å¢**ï¼ |
| | | |
| | | ``` |
| | | GET /stockInRecord/bindableSalesLedger |
| | | ``` |
| | | |
| | | | åæ° | ç±»å | 说æ | |
| | | | --- | --- | --- | |
| | | | `salesContractNo` | String | éå®ååå·ï¼æ¨¡ç³å¹é
| |
| | | | `customerName` | String | 客æ·åç§°ï¼æ¨¡ç³å¹é
| |
| | | | `projectName` | String | 项ç®åç§°ï¼æ¨¡ç³å¹é
| |
| | | | å页忰 | - | **ä¸åºåºå°è´¦å表 `/stockOutRecord/listPage` ä¼ æ³å®å
¨ä¸è´**ï¼åä¸ä¸ª `Page` å½¢åï¼ï¼ç
§æé£é¡µå³å¯ | |
| | | |
| | | è¿å `{code, msg, data}`ï¼å `data.records`ï¼ |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "records": [ |
| | | { |
| | | "id": 98, |
| | | "salesContractNo": "CW220260921001", |
| | | "projectName": "åéæé¡¹ç®", |
| | | "entryDate": "2026-09-21", |
| | | "salesman": "å¼ ä¸", |
| | | "customerId": 12, |
| | | "customerName": "æ°çææ©çç¯å¢ç§ææéå
¬å¸", |
| | | "ledgerType": "代å¨", |
| | | "oilDepotId": 3, |
| | | "oilDepotName": "è馿²¹åº", |
| | | "tankId": 7, |
| | | "tankNo": "01#", |
| | | "tonnage": 99.0000, |
| | | "approvalStatus": "å¾
审æ¹", |
| | | "contractAmount": 100000.00 |
| | | } |
| | | ], |
| | | "total": 2, |
| | | "size": 10, |
| | | "current": 1 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | **两ç¹å£å¾ï¼å端è¦ç¥é**ï¼ |
| | | |
| | | 1. **åªåºã代å¨ãç±»åå°è´¦**ï¼`WHERE ledger_type = '代å¨'` åæ»å¨ SQL éãåæ²¹å°è´¦æ¯ãæä»¬åç»å®¢æ·ãï¼æ²¡æå
¥åºè¯ä¹ï¼ä¸ä¼åºç°å¨åééï¼å端**ä¸éè¦**ååç±»åè¿æ»¤ã |
| | | 2. **ä¸åæ°æ®æéè¿æ»¤**ï¼è¯¥æ¥å£è·³è¿äº `create_user` / `dept_id` è¿æ»¤ ââ å¦åæ²¹åºè§è²ä¼çä¸å°éå®å»ºçå°è´¦ï¼ä¸æç´æ¥æ¯ç©ºçãè¿æ¯å»æçï¼**ä¸è¦**æ®æ¤è®¤ä¸ºéå®å°è´¦é¡µçå¯è§èå´ä¹æ¾å¼äºã |
| | | |
| | | ### 4.2 æ°å¢æ²¹åå
¥åºï¼**请æ±ä½æ°å¢ä¸ä¸ªå段**ï¼ |
| | | |
| | | ``` |
| | | POST /stockInventory/addStockInRecordOnly |
| | | ``` |
| | | |
| | | 请æ±ä½å¨åæå段åºç¡ä¸**å¤ä¼ ä¸ä¸ª `salesLedgerId`**ï¼ |
| | | |
| | | ```json |
| | | { |
| | | "inboundCategory": "代å¨å
¥åº", |
| | | "salesLedgerId": 98, |
| | | "productModelId": 407, |
| | | "batchNo": "20260917-CY001-001", |
| | | "qualitity": 10.0000, |
| | | "oilDepotId": 3, |
| | | "tankId": 7, |
| | | "oilProduct": "æ´#0", |
| | | "truckPlateNo": "èF12345", |
| | | "inboundTime": "2026-09-21 10:00:00" |
| | | } |
| | | ``` |
| | | |
| | | **`inboundCategory` 为ãèªè´å
¥åºãæä¸ºç©ºæ¶ï¼`salesLedgerId` ä¸ç¨ä¼ **ï¼ä¼ äºå端ä¹ä¼ç½®ç©ºï¼ä¸è½åºï¼ã |
| | | |
| | | --- |
| | | |
| | | ## 5. åç«¯æ ¡éªè§å |
| | | |
| | | æ ¡éªåªå¨ `inboundCategory = '代å¨å
¥åº'` æ¶çæï¼æä¸æåé¢éæ¯å¯¹ï¼ï¼ |
| | | |
| | | | åºæ¯ | ç»æ | |
| | | | --- | --- | |
| | | | 代å¨å
¥åº + æ²¡ä¼ `salesLedgerId` | **æ¥é** | |
| | | | 代å¨å
¥åº + `salesLedgerId` æ¥ä¸å°å°è´¦ | **æ¥é** | |
| | | | 代å¨å
¥åº + å°è´¦ç `ledgerType` 䏿¯ã代å¨ã | **æ¥é** | |
| | | | 代å¨å
¥åº + ç»çæ¯ã代å¨ãå°è´¦ | éè¿ï¼åä¸ `sales_ledger_id` | |
| | | | èªè´å
¥åº + ä¼ /ä¸ä¼ `salesLedgerId` | éè¿ï¼è¯¥å段ä¸å¾è½ `NULL` | |
| | | |
| | | > â ï¸ `ledgerType` **为空**çå°è´¦ä¹**ä¸ç®ä»£å¨** ââ åºåºä¾§æç©ºå¼ä¸ååå½åæ²¹ï¼å
¥åºä¾§è¿éæ´ä¸¥ï¼åªææç¡®åçã代å¨ãçææ¾è¡ã |
| | | |
| | | ### 5.1 æ ¡éªéè¯¯ææ¡ |
| | | |
| | | | åºæ¯ | `msg` | |
| | | | --- | --- | |
| | | | 代å¨å
¥åºæ²¡ä¼ éå®è®¢å | `代å¨å
¥åºå¿
é¡»ç»å®éå®è®¢å` | |
| | | | `salesLedgerId` æ¥ä¸å°å°è´¦ | `æééå®è®¢åä¸åå¨,éå®è®¢åid:98` | |
| | | | ç»ç䏿¯ä»£å¨å°è´¦ | `代å¨å
¥åºåªè½ç»å®ä»£å¨ç±»åçéå®è®¢å,éå®ååå·:XS20260901-001` | |
| | | |
| | | é误ååºå½¢æï¼ä¸å¡å¼å¸¸ç»ä¸èµ°å
¨å±å¤çå¨ï¼ï¼ |
| | | |
| | | ```json |
| | | { "code": 500, "msg": "代å¨å
¥åºåªè½ç»å®ä»£å¨ç±»åçéå®è®¢å,éå®ååå·:XS20260901-001" } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 6. åºååå |
| | | |
| | | å
¥åºå°è´¦å表 ââ `GET /stockInRecord/listPage` |
| | | |
| | | `R.data.records` æ°å¢ä¸¤åï¼**åªå¤ä¸å°**ï¼ï¼ |
| | | |
| | | | åæ®µ | 说æ | |
| | | | --- | --- | |
| | | | `salesLedgerId` | ç»å®çéå®å°è´¦idï¼éå®è®¢åï¼ï¼æªç»å®ä¸º `null` | |
| | | | `salesContractNo` | éå®ååå·ï¼ç± `sales_ledger` å
³è带åºï¼ï¼æªç»å®ä¸º `null` | |
| | | |
| | | è¥å表è¦å±ç¤ºãéå®è®¢åãåï¼ç»å® `salesContractNo` å³å¯ã |
| | | |
| | | --- |
| | | |
| | | ## 7. 注æäºé¡¹ |
| | | |
| | | **â åéçã代å¨å
¥åºãèæ°æ®æ²¡æéå®è®¢åï¼è¿ä¸ç®å¼å¸¸** |
| | | |
| | | å
¥åºè®°å½**没æç¼è¾/ä¿åæ¥å£**ï¼èæ°æ®ä¸ä¼è¢«éæ°æäº¤ï¼æä»¥å端ä¸ä¼æ¿æ°è§åå»å¡å®ä»¬ãå表éè¿äºè¡ç `salesLedgerId` / `salesContractNo` å°±æ¯ `null`ï¼å端ç
§å¸¸å±ç¤ºï¼å¯æ¾ç¤ºä¸ºç©ºæã-ãï¼ã |
| | | |
| | | **â¡ ç»å®ä¸æ ¡éªå°è´¦ä½é** |
| | | |
| | | ç»å°è´¦åªæ¯æå
¥åºæå°å°è´¦ä¸ï¼**䏿 ¡éªè¯¥å°è´¦çå¨ä½/ååéé¢è¿å©å¤å°**ï¼ä¹ä¸ååä»»ä½å°è´¦å段ã`tonnage`ã`contractAmount` æ¯å°è´¦èªå·±çåæ®µï¼å
¥åºå䏿¦ä¸ç¢°ã |
| | | |
| | | **⢠ä¸è¦çå®¢æ· / æ²¹åº / å¨ç½** |
| | | |
| | | ä¸åºåºä¾§ä¸åï¼è¿é**ä¸åå½ä¸åè¦ç**ã妿åç«¯å¸æãéäºå°è´¦å°±èªå¨å¸¦åºæ²¹åº/å¨ç½ãï¼é£æ¯**å端èªå·±**ä»ä¸æè¿åç `oilDepotId` / `oilDepotName` / `tankId` / `tankNo` å¡«è¿æ§ä»¶çäºï¼å端ä¸åä¸ãä¹ä¸ä¼ä»¥å°è´¦ä¸ºåè¦çã |
| | | |
| | | **⣠审æ¹ç¯è没å** |
| | | |
| | | ç»å®éå®è®¢å**ä¸å½±å**å
¥åºç审æ¹é¾è·¯ï¼å®¡æ¹éè¿ä»ç¶åªå¾ `stock_inventory` å åºåï¼ä¸ä¼å»å¨éå®å°è´¦ã |
| | | |
| | | **â¤ è¿æ¡å
¥åºè¿ä¸äºéå®å°è´¦çä»»ä½ç»è®¡** |
| | | |
| | | ç»å®åªæ¯çäºä¸ªå
³è idï¼éå®å°è´¦çã代å¨éé¢ããæ¯å¦åè´§ãçç»è®¡**å®å
¨ä¸ç `stock_in_record`**ï¼ä¸åå½±åã |
| | | |
| | | --- |
| | | |
| | | ## 8. èè°èªæ¥æ¸
å |
| | | |
| | | - [ ] `/stockInRecord/bindableSalesLedger` è½è¿åå°è´¦å表ï¼**åªæ `ledgerType='代å¨'` çè¡**ï¼åæ²¹å°è´¦ä¸åºç°ï¼ |
| | | - [ ] ç¨æ²¹åºè§è²çè´¦å·ï¼ééå®ï¼ä¹è½çå°å°è´¦ï¼éªè¯æ°æ®æéç¡®å®è¢«è·³è¿ï¼ |
| | | - [ ] æååå· / 客æ·å / 项ç®åæç´¢ï¼ç»ææ£ç¡® |
| | | - [ ] å页第 2 页è¿åæ£å¸¸ï¼`total` ä¸å®é
æ¡æ°ä¸è´ï¼éªè¯ count æ²¡è¢«æ°æ®æéæªæï¼ |
| | | - [ ] å
¥åºç±»å«éã代å¨å
¥åºãä½ä¸ééå®è®¢å â æ¥ã代å¨å
¥åºå¿
é¡»ç»å®éå®è®¢åã |
| | | - [ ] ä¼ ä¸ä¸ªä¸åå¨ç `salesLedgerId` â æ¥ãæééå®è®¢åä¸åå¨ã |
| | | - [ ] ä¼ ä¸ä¸ª**åæ²¹**å°è´¦ç id â æ¥ã代å¨å
¥åºåªè½ç»å®ä»£å¨ç±»åçéå®è®¢åã |
| | | - [ ] ä¼ ä¸ä¸ª `ledgerType` 为空çå°è´¦ id â åæ ·æ¥ä¸é¢é£æ¡ï¼ç©ºä¸ç®ä»£å¨ï¼ |
| | | - [ ] éã代å¨å
¥åºã+ éã代å¨ãå°è´¦ â æäº¤æåï¼å
¥åºå°è´¦åè¡¨è¯¥è¡ `salesLedgerId` / `salesContractNo` æå¼ |
| | | - [ ] éãèªè´å
¥åºã+ ä¼ ä¸ä¸ª `salesLedgerId` â æäº¤æåï¼ä¸è¯¥è¡ `salesLedgerId` 为 `null`ï¼è¢«å端丢å¼ï¼ |
| | | - [ ] éãèªè´å
¥åºã + ä¸ä¼ `salesLedgerId` â è¡ä¸ºä¸æ¹å¨åä¸è´ï¼åå½ï¼ |
| | | - [ ] å®¢æ· / æ²¹åº / å¨ç½å¡«çæ¯ Aï¼ç»å®å°è´¦éæ¯ B â å
¥åºåå䏿¥ç仿¯ **A**ï¼éªè¯ä¸è¦çï¼ |
| | | - [ ] åéçèã代å¨å
¥åºãè®°å½å¨å表é `salesLedgerId` 为 `null`ï¼æ æ¥é |
| | | |
| | | --- |
| | | |
| | | ## 9. ç¸å
³ææ¡£ |
| | | |
| | | - `doc/20260920_æ²¹ååºåºç»å®éå®å°è´¦å端èè°ææ¡£.md` ââ åºåºä¾§ç»å®ï¼**ä¼**è¦ç客æ·/æ²¹åº/å¨ç½ï¼ä¸æ¬ç¯å£å¾ç¸åï¼æ³¨æåºåï¼ |
| | | - `doc/20260920_å¨ç½å·å¸¦å
¥åºåå端èè°ææ¡£.md` ââ æ²¹åå
¥åºè¡¨åå
¶å®åæ®µçæ¥é¾å»è |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # å
¬æµ·å®¢æ·ä¿¡æåºé å端èè°ææ¡£ |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-21 |
| | | éç¨çæ¬ï¼æ¬æ¬¡åæ´å |
| | | 对åºéæ±ï¼å®¢æ·å
¬æµ·ä¹è¦å 个信æåºéï¼å¸¦å
¥ç§æµ·æ¶è¦å¸¦ä¸ |
| | | |
| | | --- |
| | | |
| | | ## 0. ä¸å¥è¯ç»è®º |
| | | |
| | | **åç«¯æ¬æ¬¡é¶æ¹å¨ï¼çº¯å端å åæ®µã** |
| | | |
| | | å
¬æµ·å®¢æ·åç§æµ·å®¢æ·æ¯ `customer` 表ç**åä¸è¡æ°æ®**ï¼`type=1` å
¬æµ· / `type=0` ç§æµ·ï¼å¦ç¨ `is_assigned`ã`usage_status` æ è®°é¢ç¨ç¶æï¼ï¼`trust_fund` è¿ä¸åå
¬æµ·ç§æµ·**å
±ç¨**ï¼æ©å¨ç¬¬ 5 æ¡ï¼`doc/20260920_trust_fund_and_deposit_ledger.sql`ï¼å°±å·²å å°è¡¨ä¸ã |
| | | |
| | | æä»¥ã带å
¥ç§æµ·æ¶è¦å¸¦ä¸ãè¿ä»¶äº**åç«¯å¤©ç¶æç«**ââåé
æ¥å£æ¯ã读æ´è¡ â æ¹é¢ç¨å段 â ååãï¼åæ ¹æ²¡ç¢° `trustFund`ãå端åªéè¦å¨**å
¬æµ·é¡µé¢çæ°å¢/ç¼è¾è¡¨å**éè¡¥ä¸ä¸ªãä¿¡æåºé(å
)ãè¾å
¥æ¡ï¼åé
åç§æµ·ä¾§çå°çå°±æ¯åä¸ä¸ªå¼ã |
| | | |
| | | --- |
| | | |
| | | ## 1. ç°ç¶æ ¸å¯¹ï¼ä¸ºä»ä¹ä¸ç¨æ¹åç«¯ï¼ |
| | | |
| | | | ç¯è | æ¥å£ | ç°ç¶ | |
| | | | --- | --- | --- | |
| | | | å
¬æµ·å表 | `GET /basic/customer/list`ï¼`type=1`ï¼ | SQL æ¯ `select c.*`ï¼**å·²ç»è¿å `trustFund`** | |
| | | | å
¬æµ·è¯¦æ
ï¼ç¼è¾åæ¾ï¼ | `GET /basic/customer/{id}` | åä¸ï¼**å·²è¿å `trustFund`** | |
| | | | å
¬æµ·æ°å¢ | `POST /basic/customer/addCustomer` | æ¶çå°±æ¯å®¢æ·å¯¹è±¡ï¼`trustFund` ç´æ¥éä¼ è½åº | |
| | | | å
¬æµ·ç¼è¾ | `POST /basic/customer/updateCustomer` | åä¸ | |
| | | | **åé
ï¼å¸¦å
¥ç§æµ·ï¼** | `POST /basic/customer/assignCustomer` | å端 `selectById` 读æ´è¡ â `updateById`ï¼**åªæ¹ `isAssigned`/`usageStatus`/`usageUser`ï¼`trustFund` åæ ·ä¿ç** | |
| | | | åæ¶ / æµå
¥å
¬æµ· | `recycleCustomer` / `back/{id}` | åæ ·ä¸å¨ `trustFund` | |
| | | | å¯¼åº / 导å
¥ | `GET /basic/customer/export`ã`importData` | `trustFund` å·²å¨ **Excel 模æ¿**éï¼å®ä½ä¸æ¯ `@Excel(name = "ä¿¡æåºé")`ï¼ï¼å
¬æµ·é¡µé¢ç导å
¥å¯¼åºæ éæ¹å端 | |
| | | |
| | | > åé
åç§æµ·ä¾§ï¼å®¢æ·æ¡£æ¡é¡µï¼è½çå°åä¸ä¸ª `trustFund`ï¼æ¯å 为两边æ¥çæ¯åä¸è¡ ââ **䏿¯é åé
æ¥å£æ¬è¿**ã |
| | | |
| | | --- |
| | | |
| | | ## 2. åç«¯è¦æ¹çä¸¤å¤ |
| | | |
| | | ### 2.1 å
¬æµ·ãæ°å¢/ç¼è¾å®¢æ·ã表åå è¾å
¥æ¡ |
| | | |
| | | æä»¶ï¼`src/views/basicData/customerFileOpenSea/index.vue` |
| | | |
| | | ç
§æç§æµ·æ¡£æ¡é¡µé¢ï¼`src/views/basicData/customerFile/index.vue:150-158`ï¼çåæ³å³å¯ï¼ |
| | | |
| | | ```vue |
| | | <el-form-item label="ä¿¡æåºé(å
)ï¼" |
| | | prop="trustFund"> |
| | | <el-input-number v-model="form.trustFund" |
| | | :min="0" |
| | | :precision="2" |
| | | :controls="false" |
| | | placeholder="请è¾å
¥ï¼å¯ä¸ºç©º" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | - **ä¸è¦å å¿
å¡«æ ¡éª**ï¼`rules` éä¸è¦å `trustFund`ï¼ï¼å¯ä»¥æ¯ç©º |
| | | - æäº¤é»è¾**ä¸ç¨å¨**ï¼æ°å¢èµ° `addCustomer(form.value)`ãç¼è¾èµ° `updateCustomer(form.value)`ï¼`form` éå¸¦ä¸ `trustFund` å°±è¡ |
| | | - `form.trustFund` ä¿æåºæ¬ç±»åï¼ä¸è¦ä¼ `""` 空串ï¼ä¼ 500ï¼è§ 4.1ï¼ |
| | | |
| | | ç¼è¾åæ¾æ¯ç½æ¡çï¼`openForm('edit', row)` 鿝 `form.value = { ...res.data }`ï¼è `GET /basic/customer/{id}` çååºéå·²ç»å¸¦ `trustFund`ï¼ç»ä¸ `v-model` å°±æå¼ã |
| | | |
| | | ### 2.2 å
¬æµ·å表å ä¸å |
| | | |
| | | å䏿件ï¼`tableColumn` éè¡¥ä¸æ¡ï¼åç
§ç§æµ·é¡µé¢çåå®ä¹ï¼ï¼ |
| | | |
| | | ```js |
| | | { |
| | | label: "ä¿¡æåºé(å
)", |
| | | prop: "trustFund", |
| | | width: 140, |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 3. åé
æ¥å£ï¼ç
§ç°ç¶è°ç¨ï¼**ä¸è¦ä¼ `trustFund`** |
| | | |
| | | `POST /basic/customer/assignCustomer` åªè®¤ä¸¤ä¸ªåæ®µï¼ |
| | | |
| | | ```json |
| | | { "id": 12, "usageUser": 105 } |
| | | ``` |
| | | |
| | | - `id`ï¼å®¢æ· id |
| | | - `usageUser`ï¼è¢«åé
人ç `user_id` |
| | | |
| | | **å端ç°ç¶å·²ç»æ¯è¿æ ·åçï¼ä¸ç¨å¨ã** å°±ç®å¤ä¼ äº `trustFund`ï¼å端ä¹ä¼å¿½ç¥å®ï¼å端ç¨çæ¯åºéè¯»åºæ¥çæ´è¡ï¼ä¸é信请æ±ä½éç `trustFund`ï¼ââæä»¥å«ææç¨åé
æ¥å£æ¥æ¹ä¿¡æåºéã |
| | | |
| | | --- |
| | | |
| | | ## 4. 顺带说æ |
| | | |
| | | ### 4.1 `trustFund` çç±»å |
| | | |
| | | `decimal(16,2)` â ååºéæ¯ JSON æ°åï¼å¦ `200000.00`ï¼ã**é»è®¤ç©ºå¼è¿å `null`**ï¼åç«¯å¤æç¨ `trustFund == null`ï¼ä¸è¦ç¨ `!trustFund`ï¼`0` 乿¯åæ³å¼ï¼è½ç¶ä¸å¡ä¸æ²¡ä»ä¹æä¹ï¼ã |
| | | |
| | | > 妿å端æç©ºè¾å
¥æ¡ä¼ æ**空å符串** `""`ï¼å端ååºåå BigDecimal 伿¥éï¼æ´ä½è¿å `{code:500, msg:"..."}`ãç¨ `el-input-number` æ¶çç©ºæ¯ `undefined`/`null`ï¼ä¸ä¼æè¿ä¸ªé®é¢ã |
| | | |
| | | ### 4.2 å
¬æµ·åè¡¨ä¹æè¶
éæ è®°ï¼å¯ç´æ¥å¤ç¨ |
| | | |
| | | å
¬æµ·å表æ¯è¡**åæ ·è¿å**ä¸é¢ä¸¤ä¸ªåªè¯»å段ï¼åç§æµ·å表æ¯åä¸å¥é»è¾ï¼ï¼ |
| | | |
| | | | åæ®µ | 说æ | |
| | | | --- | --- | |
| | | | `depositTotalAmount` | 该客æ·**代å¨éé¢å计**ï¼ææ `ledgerType='代å¨'` å°è´¦çååéé¢ä¹åï¼æ è®°å½ä¸º `0`ï¼ | |
| | | | `exceedsTrustFund` | `depositTotalAmount > trustFund` æ¶ä¸º `true`ï¼`trustFund` ä¸ºç©ºæ¶æä¸º `false` | |
| | | |
| | | æä»¥å
¬æµ·é¡µé¢æ³è·ç§æµ·ä¸æ ·å¨è¶
éæ¶æ 红æç¤ºï¼**ä¸ç¨æ°æ¥å£**ï¼ç´æ¥å¤ç¨ç§æµ·é¡µé¢çåæ³ï¼ |
| | | |
| | | ``` |
| | | 代å¨éé¢å计已è¶
åºè¯¥å®¢æ·ä¿¡æåºéï¼ä¿¡æåºéï¼${row.trustFund}ï¼ |
| | | ``` |
| | | |
| | | ### 4.3 两个ãè¶
éãå£å¾å«æ·· |
| | | |
| | | - å®¢æ·æ¡£æ¡/å
¬æµ·å表ç `exceedsTrustFund` æ¯çæ¯**代å¨éé¢å计**ï¼å¤ç¬å æ»ï¼â åè¡¨è¡æé |
| | | - éå®å°è´¦å表ç `exceedsTrustFund` æ¯çæ¯**æ¬ç¬ååéé¢**ï¼åç¬ï¼â å°è´¦è¡æ 红 |
| | | |
| | | è¿ä¸¤å¥æ¯å»æçï¼ä¸è¦ç»ä¸ã |
| | | |
| | | --- |
| | | |
| | | ## 5. 注æç¹ |
| | | |
| | | 1. **å«ä¸¢ `type=1`**ï¼å
¬æµ·æ°å¢è¡¨åéç `type: 1` å¿
é¡»ä¿çï¼å¦å客æ·ä¼å»ºæç§æµ·å®¢æ·ï¼`openForm` éå·²ç»èµäº `form.value.type = 1`ï¼å åæ®µæ¶å«é¡ºææ `form` æ´ä½è¦çæï¼ã |
| | | 2. **å使¯å
**ï¼ä¸æ¯ä¸å
ï¼æ ç¾åãä¿¡æåºé(å
)ãè·ç§æµ·ä¿æä¸è´ã |
| | | 3. **å¯ä»¥ä¸å¡«**ï¼`trustFund` 为空åä¸å任使éï¼ä¸æ 红ãå®¡æ¹æ é¢ä¸å¸¦æéåç¼ï¼ï¼åè½éé»å¯ç¨ ââ ä¸ä¼å 为å
¬æµ·å®¢æ·æ²¡ç»´æ¤å°±è¯¯æ¥ã |
| | | 4. **å
¬æµ·å®¢æ·è¢«åé
å `type` 仿¯ 1**ï¼åªæ¯ `is_assigned=1`ï¼ï¼æä»¥å®åæ¶åºç°å¨ãå
¬æµ·ï¼å·²é¢ç¨ï¼ãåãç§æµ·ã两个页é¢ï¼ä¸¤è¾¹çå°ç `trustFund` å¿
ç¶æ¯åä¸ä¸ªå¼ã |
| | | 5. æ¬è½®**没æ DDL**ï¼ä¹ä¸éè¦å¨å¼ååº/é¨ç½²åºã |
| | | |
| | | --- |
| | | |
| | | ## 6. åç«¯èªæ¥æ¸
å |
| | | |
| | | - [ ] å
¬æµ·é¡µé¢ãæ°å¢å®¢æ·ã表åæãä¿¡æåºé(å
)ãè¾å
¥æ¡ï¼ç空ä¹è½æäº¤ |
| | | - [ ] æ°å¢ä¸ä¸ªå¸¦ä¿¡æåºéçå
¬æµ·å®¢æ·ï¼éè¿ç¼è¾è½æ£ç¡®åæ¾ |
| | | - [ ] å
¬æµ·å表è½çå°ãä¿¡æåºé(å
)ãå |
| | | - [ ] æè¯¥å®¢æ·ãåé
ãç»æä¸ªéå®ï¼**åé
å¼¹çªéä¸ç¨å¡«ä¿¡æåºé** |
| | | - [ ] åé
åå°ãå®¢æ·æ¡£æ¡ï¼ç§æµ·ï¼ã页é¢ç该客æ·ï¼`trustFund` ä¸å
¬æµ·ä¾§ä¸è´ |
| | | - [ ] å
¬æµ·å表 / ç§æµ·å表å¨ä»£å¨éé¢å计è¶
ä¿¡æåºéæ¶é½æè¶
éæé |
| | | - [ ] å
¬æµ·é¡µé¢çå¯¼åº Excel éæãä¿¡æåºéãå |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # æ²¹ååºåºå¤å°è´¦ç»å® + å°è´§è®°å½ + åè´§å°è´¦å±çº§å å端èè°ææ¡£ |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-21 |
| | | éç¨çæ¬ï¼æ¬æ¬¡åç«¯åæ´å |
| | | 对åºéæ±ï¼ä¸æ¬¡æ²¹ååºåºç»å®å¤ä¸ªéå®å°è´¦ï¼å¯¹åºå¤ä¸ªå®¢æ·ï¼åå°è´¦é¡»å«åä¸äº§åè§æ ¼ï¼ï¼éå®å°è´¦æ°å¢ãå°è´§è®°å½ãï¼åè´§å°è´¦æ¹ä¸ºå±çº§å±ç¤º |
| | | |
| | | DDL è§ `doc/20260921_multi_ledger_and_arrival.sql`ï¼**éå
å¨ç®æ åºæ§è¡**ã |
| | | |
| | | > â ï¸ **æ¬æä½åºäºä¸ä¸è½®çä¸¤ä»½ææ¡£**ï¼ |
| | | > - `doc/20260921_æ²¹ååºåºçæåè´§å°è´¦ä¸éå®å°è´¦ç¶æåæ¥å端èè°ææ¡£.md` ââ **æ´ç¯ä½åº**ããæ²¹ååºåºå®¡æ¹éè¿èªå¨çæåè´§å°è´¦ / æ `record_type` æ¹æ `13`ãè¿å¥é»è¾**å·²æ´ä½åé**ãç°å¨æ²¹ååºåºä¸çæåè´§åï¼éå®å°è´¦ç¶ææ¹ç±**å°è´§è®°å½**驱å¨ã |
| | | > - `doc/20260920_æ²¹ååºåºç»å®éå®å°è´¦å端èè°ææ¡£.md` ââ 第 4.3ã5ã5.3 èçãåªç»ä¸ä¸ª `salesLedgerId`ãå
¥å**ä»ç¶å
¼å®¹**ï¼ä½æ°å端请æ¹ç¨æ¬æç `ledgerList`ãè¯¥ææ¡£ç¬¬ 6.2 èå
³äº `oilOut` è¡ãæ¹é ååæ `source='shipping'`ãç追述**ä½åº**ã |
| | | |
| | | --- |
| | | |
| | | ## 1. ä¸å¥è¯å£å¾ |
| | | |
| | | | ä¸»é¢ | å£å¾ | |
| | | | --- | --- | |
| | | | å¤å°è´¦ç»å® | 䏿¬¡æ²¹ååºåºå¯ä»¥ç»å®**å¤ä¸ª**éå®å°è´¦ï¼= å¤ä¸ªå®¢æ·ï¼ï¼æ¯ä¸ªå°è´¦æå·¥å¡«æ¬æ¬¡åææ°éï¼**ä¹åå¿
é¡»çäºæ¬æ¬¡åºåºæ»é** | |
| | | | åä¸äº§å约æ | ææè¢«ç»å°è´¦ç `type=1` æç»é**é½å¿
é¡»å«**æ¬æ¬¡åºåºçè§æ ¼ï¼`productModelId`ï¼ | |
| | | | å°è´§è®°å½ | æå¨ã**åºåºå à å°è´¦**ãä¸ï¼å¡«å°è´§æ°é(å¨)ã车è¾ãéä»¶ï¼**车è¾/车ç/æç» id ä¸å¾ä»¥åºåºå为åï¼ä¸ä¿¡å端** | |
| | | | åè´§å°è´¦ | æ¹ä¸º**å±çº§**ï¼ç¶è¡ = æ²¹ååºåºåï¼`source='oilOut'`ï¼ï¼åè¡ = å°è´§è®°å½ï¼`children`ï¼ | |
| | | | åºåºå°è´¦ | ãæ²¹ååºåºãç**åºåºç®¡çå表** `GET /stockOutRecord/listPage`ï¼æ¬æ¥å°±å¨é£éï¼**ä¸éè¦æ°é¾è·¯** | |
| | | | éå®å°è´¦ç¶æ | ãå·²åè´§æ°é / åè´§ç¶æ / æ¯å¦åè´§ã**æ¹ä¸ºæå°è´§è®°å½æ¨å¯¼**ï¼å段åä¸åï¼åªæ¢æ°æ®æºï¼ | |
| | | | è´¢å¡å£å¾ | å¼ç¥¨/æ¶æ¬¾åéææ²¹ååºåº**æãåºåºåÃ客æ·ãæå¼**ï¼ä¸ä¸ª CK å·å¤å®¢æ· = å¤è¡ï¼ | |
| | | | éè´å£å¾ | éè´å°è´¦ãå·²é宿°éã/ éè´éè´§ãå¯éæ°éã**æ¹ææ²¹ååºåºéæ°æ¨å¯¼** | |
| | | |
| | | --- |
| | | |
| | | ## 2. è¡¨ç»æåæ´ |
| | | |
| | | ### 2.1 ä¸¤å¼ æ°è¡¨ |
| | | |
| | | | 表 | ç¨é | |
| | | | --- | --- | |
| | | | `stock_out_record_sales_ledger` | åºåºå â éå®å°è´¦ç»å®è¡¨ï¼ä¸è¡ = ä¸ä¸ªå°è´¦ + æ¬æ¬¡åææ°éï¼ï¼**å代** `stock_out_record.sales_ledger_id` åå¼å | |
| | | | `sales_ledger_arrival` | å°è´§è®°å½è¡¨ï¼åè´§å°è´¦çåè¡ï¼ | |
| | | |
| | | `stock_out_record.sales_ledger_id` / `customer_id` / `customer_name` **ä¿ç**ï¼ç»§ç»å**é¦ä¸ª**å°è´¦çå¼ï¼åºåºç®¡çå表ãåºåæ¥è¡¨æå®å±ç¤ºï¼ã**夿ãä¸ä¸ªåºåºåç»äºåªäºå°è´¦ãä¸å¾æ¥ç»å®è¡¨**ï¼ä¸è¦çåå¼åã |
| | | |
| | | ### 2.2 两个æ°å¢å |
| | | |
| | | | 表 | å | ç¨é | |
| | | | --- | --- | --- | |
| | | | `account_invoice_application` | `stock_out_binding_ids varchar(255)` | å¼ç¥¨ç³è¯·å
³èç**ç»å®è¡** idï¼éå·ä¸²ï¼ | |
| | | | `account_sales_collection` | `stock_out_binding_ids varchar(255)` | æ¶æ¬¾åå
³èç**ç»å®è¡** idï¼éå·ä¸²ï¼ | |
| | | |
| | | > **为ä»ä¹è¦å¦å¼ä¸å**ï¼ç»å®è¡ id ååºåºå id 齿¯ä»å°èªå¢çæ´æ°ï¼æ··è¿åä¸ä¸ª `stock_out_record_ids` å¿
ç¶æå·ï¼`FIND_IN_SET` åä¸åºãç»å®è¡ 1ãåãåºåºå 1ãï¼ãæä»¥ `stock_out_record_ids` çè¯ä¹**ä¿æä¸å**ï¼åæå·¥åè´§ååºåºçåºåºå idï¼ï¼ç»å®è¡å¦åä¸åã |
| | | |
| | | ### 2.3 å鿏
çä¸åå¡«ï¼å¹çï¼è§ DDL 第 3ã4 èï¼ |
| | | |
| | | 1. å æä¸ä¸è½®ãçæåè´§åãçä¸ç `shipping_info` / `shipping_product_detail`ï¼å¹¶æ `stock_out_record.record_id` æ¸
0ï¼ |
| | | 2. æèçãåå°è´¦ã`stock_out_record.sales_ledger_id` **åå¡«**æç»å®è¡ã**ä¸åå¡«çè¯**ï¼èæ°æ®å¨è´¢å¡å¼ç¥¨/æ¶æ¬¾ã客æ·å¾æ¥ã以åãå¯å°è´§è½¦è¾ã䏿éä¼**æ´æ¹æ¶å¤±**ã |
| | | |
| | | > `record_type` **ä¸ç»æ²¹ååºåºæ¹æ `'13'`**ï¼åå è§ç¬¬ 7 èã |
| | | |
| | | --- |
| | | |
| | | ## 3. å¤å°è´¦ç»å® |
| | | |
| | | ### 3.1 å
¥åï¼`POST /stockInventory/addOilOutRecordOnly` |
| | | |
| | | å¨åæå段åºç¡ä¸**å¤ä¼ ä¸ä¸ª `ledgerList`**ï¼ |
| | | |
| | | ```json |
| | | { |
| | | "productModelId": 407, |
| | | "batchNo": "20260917-CY001-001", |
| | | "stockOutNum": 4.00, |
| | | "vehicleId": 5, |
| | | "truckPlateNo": "èF12345", |
| | | "outDate": "2026-09-20", |
| | | "remark": "ä¸è½¦å两家", |
| | | "ledgerList": [ |
| | | { "salesLedgerId": 96, "quantity": 2.50 }, |
| | | { "salesLedgerId": 97, "quantity": 1.50 } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | | åæ®µ | å¿
å¡« | 说æ | |
| | | | --- | --- | --- | |
| | | | `ledgerList[].salesLedgerId` | æ¯ | éå®å°è´¦ id | |
| | | | `ledgerList[].quantity` | æ¯ | æ¬å°è´¦**æ¬æ¬¡åæ**çåºåºæ°é(å¨)ï¼å¿
é¡» > 0 | |
| | | | `ledgerList[].salesLedgerProductId` / `customerId` / `customerName` | å¦ | **ä¼ äºä¹ä¼è¢«å端è¦ç**ï¼æç» id å该å°è´¦åè§æ ¼ `type=1` æç»ä¸ `id` æå°ç飿¡ï¼ | |
| | | |
| | | **ä¸é¢è¿å ä¸ªåæ®µä¸ç¨ä¼ ï¼ä¼ äºä¹ä¼è¢«è¦çï¼**ï¼`outCategory`ï¼å端æå°è´¦ç±»åå®ï¼ã`customerId` / `customerName`ï¼å**é¦ä¸ª**å°è´¦ï¼ã |
| | | |
| | | ### 3.2 ä¸ç§å
¥åå½¢æ |
| | | |
| | | | `ledgerList` | è¡ä¸º | |
| | | | --- | --- | |
| | | | ä¸ä¼ ï¼`null`ï¼ä¸æ²¡ä¼ `salesLedgerId` | **å®å
¨ä¸ç¢°ç»å®**ï¼è¡ä¸ºä¸æ¹é å**ä¸åä¸å·®**ï¼èåç«¯ä¸æ¹ä¹è½è·ï¼ | |
| | | | ä¸ä¼ ï¼`null`ï¼ä½ä¼ äº `salesLedgerId` | å
¼å®¹æ§å
¥åï¼è§ä½ãç»ä¸ä¸ªå°è´¦ï¼æ°é = æ¬æ¬¡åºåºæ»éã | |
| | | | ä¼ `[]`ï¼ç©ºæ°ç»ï¼ | æç¡®çã**ä¸ç»å°è´¦**ãï¼ä¼æ `salesLedgerId` / å®¢æ·æ¸
空 | |
| | | |
| | | ### 3.3 æ ¡éªè§åä¸éè¯¯ææ¡ |
| | | |
| | | | åºæ¯ | `msg` | |
| | | | --- | --- | |
| | | | å°è´¦ä¸åå¨ | `æééå®å°è´¦ä¸åå¨,éå®å°è´¦id:96` | |
| | | | åºåºéæªå¡« / ⤠0 | `è¯·å¡«åæ¬æ¬¡åºåºæ°é(å¨)` | |
| | | | æå°è´¦æ°éæªå¡« / ⤠0 | `æ¯ä¸ªéå®å°è´¦çç»å®æ°éå¿
须大äº0,éå®ååå·:RB120260831001` | |
| | | | 没éè§æ ¼ | `ç»å®éå®å°è´¦æ¶å¿
é¡»éæ©äº§åè§æ ¼,éå®ååå·:RB120260831001` | |
| | | | è§æ ¼ä¸å¨è¯¥å°è´¦ `type=1` æç»é | `æé产åä¸å¨è¯¥éå®å°è´¦æç»ä¸,éå®ååå·:RB120260831001` | |
| | | | åå°è´¦æ°éä¹å â åºåºæ»é | `åéå®å°è´¦ç»å®æ°éä¹åå¿
é¡»çäºæ¬æ¬¡åºåºæ°é,åºåºæ°é:4,ç»å®æ°éä¹å:3.5` | |
| | | | 代å¨å°è´¦ä¸å
¶ä»å°è´¦æ··ç» | `代å¨å°è´¦ä¸è½ä¸å
¶ä»éå®å°è´¦ä¸èµ·ç»å®,䏿¬¡åºåºåªè½ç»ä¸ä¸ªä»£å¨å°è´¦` | |
| | | | ç»ä»£å¨å°è´¦ä½æ²¡éè§æ ¼ | `代å¨åºåºéè¦æ£ååºå,å¿
é¡»éæ©äº§åè§æ ¼,éå®ååå·:CW220260921001` | |
| | | |
| | | é误ååºå½¢æï¼ä¸å¡å¼å¸¸ç»ä¸èµ°å
¨å±å¤çå¨ï¼ï¼ |
| | | |
| | | ```json |
| | | { "code": 500, "msg": "åéå®å°è´¦ç»å®æ°éä¹åå¿
é¡»çäºæ¬æ¬¡åºåºæ°é,åºåºæ°é:4,ç»å®æ°éä¹å:3.5" } |
| | | ``` |
| | | |
| | | ### 3.4 代å¨äºæ¥ |
| | | |
| | | `ledgerList` éåªè¦æ**ä¸ä¸ª** `ledgerType='代å¨'` çå°è´¦ï¼ |
| | | |
| | | - å表é¿åº¦**å¿
须为 1**ï¼æ··ç»ç´æ¥æ¥éï¼ï¼ |
| | | - 走代å¨åæ¯ï¼å¸¦å
¥å°è´¦çæ²¹åº/å¨ç½ï¼`outCategory=代å¨`ï¼ |
| | | - **ä¸äº§ç»å®è¡**ï¼ç»å®è¡åæ¶æ¯å¼ç¥¨/æ¶æ¬¾åéçæ°æ®æºï¼ä»£å¨çæ²¹æ¯å®¢æ·èªå·±çï¼ä¸è½è¿ï¼ï¼æä»¥ä»£å¨åºåºå¨è´¢å¡åéé**ä¸åºç°**ã |
| | | |
| | | > **代å¨åæ ·æ¯æç»è®°å°è´§è®°å½**ï¼è§ §4.5ï¼ï¼å¯¹åºå
³ç³»ä¸çç»å®è¡¨ãæ¹ç `stock_out_record.sales_ledger_id` åå¼å ââ 代å¨ã䏿¬¡åºåºåªè½ç»ä¸ä¸ªå°è´¦ãï¼åå¼åæ°å¥½æ¯æå¨çã |
| | | |
| | | ### 3.5 å±å¼å£å¾ï¼**å端è¦ç¥é**ï¼ |
| | | |
| | | `stock_out_record.sales_ledger_id` / `customer_id` / `customer_name` æ¯**åå¼å**ï¼å¤å°è´¦åºåºæ¶**åªåå
¥é¦é¡¹**ï¼å
¶ä½ SQL 沿ç¨å®ä»¬åå±ç¤ºï¼å«ä¹æªåï¼ã |
| | | |
| | | ä½**两å¤å表å±ç¤ºå·²æ¹ä¸ºæ±æ»å
¨é¨**ï¼å端**ä¸éè¦åä»»ä½äº**ï¼ |
| | | |
| | | | ä½ç½® | éå®ååå·åºå | |
| | | | --- | --- | |
| | | | åºåºç®¡çå表 `GET /stockOutRecord/listPage` | `salesContractNo` = 该åºåºç»å®ç**å
¨é¨**ååå·ï¼éå·åéï¼`group_concat(distinct ...)`ï¼ï¼æªäº§ç»å®è¡çåéè¡éå `sales_ledger_id` å
³èçå个ååå· | |
| | | | åè´§å°è´¦ `GET /shippingInfo/listPage` ç `oilOut` ç¶è¡ | åä¸ï¼`sales_contract_no`ï¼ | |
| | | | å
¶ä½ï¼å°è´¦è¯¦æ
ã`stock_out_record` å表åºåï¼ | 仿¯**é¦é¡¹**ï¼`salesLedgerId` / `customerId` / `customerName` å妿¤ | |
| | | |
| | | çéè¡ä¸ºåæ¥æ¾å¼ï¼åè´§å°è´¦æãéå®ååå·ãçéæ¶ï¼**å½ä¸ä»»ä¸ç»å®å°è´¦çååå·å³è¿å该è¡**ï¼ä¸ååªçé¦é¡¹ï¼ã |
| | | |
| | | > å端注æï¼ååå·æ¯**éå·åéçå符串**ï¼è¥å表è¦ç²¾ç¡®å®ä½å°æä¸ªå®¢æ·ï¼è¯·ç¨å°è´¦è¯¦æ
/å°è´§è®°å½ä¾§ç客æ·å段ï¼ä¸è¦ split ååå·å符串å解客æ·ã |
| | | |
| | | --- |
| | | |
| | | ## 4. å°è´§è®°å½ |
| | | |
| | | ### 4.1 æ¥å£ |
| | | |
| | | | æ¥å£ | 说æ | |
| | | | --- | --- | |
| | | | `GET /salesLedgerArrival/listPage` | å°è´§è®°å½å页åè¡¨ãæ¯æ `salesLedgerId` / `stockOutRecordId` / `truckPlateNo` / `salesContractNo` / `customerName` / `arrivalDate` çé | |
| | | | `GET /salesLedgerArrival/bindableVehicles?salesLedgerId=96` | **å¯å°è´§è½¦è¾ä¸æ** | |
| | | | `POST /salesLedgerArrival/add` | æ°å¢ | |
| | | | `POST /salesLedgerArrival/update` | ä¿®æ¹ | |
| | | | `DELETE /salesLedgerArrival/delete` | æ¹éå é¤ï¼Body æ¯ `[id, id]` | |
| | | |
| | | `add` 请æ±ä½ï¼ |
| | | |
| | | ```json |
| | | { |
| | | "stockOutRecordId": 260, |
| | | "salesLedgerId": 96, |
| | | "vehicleId": 5, |
| | | "arrivalQuantity": 2.50, |
| | | "arrivalDate": "2026-09-21", |
| | | "attachments": [ |
| | | "https://.../common/public/upload/2026/09/21/xxx.jpg" |
| | | ], |
| | | "remark": "第ä¸è½¦" |
| | | } |
| | | ``` |
| | | |
| | | | åæ®µ | å¿
å¡« | 说æ | |
| | | | --- | --- | --- | |
| | | | `stockOutRecordId` | æ¯ | åºåºå idï¼åè´§å°è´¦ç**ç¶è¡**ï¼ | |
| | | | `salesLedgerId` | æ¯ | 该å°è´§å±äºåªä¸ªå®¢æ·/å°è´¦ | |
| | | | `arrivalQuantity` | æ¯ | å°è´§æ°é(å¨)ï¼å¿
é¡» > 0 | |
| | | | `vehicleId` / `truckPlateNo` | å¦ | **ä¼ äºåªä¸ºæ¯å¯¹**ï¼å端ä¸å¾ååºåºåä¸ç»è®°ç车è¾/车çè¦ç | |
| | | | `salesLedgerProductId` | å¦ | å端æç»å®è¡è¦çï¼**代卿 æç»ï¼æä¸º `null`** | |
| | | | `attachments` | å¦ | éä»¶ URL æ°ç»ï¼**å¿
é¡»ç¨ `previewURL`**ï¼è§ 4.4ï¼ | |
| | | | `arrivalDate` / `remark` | å¦ | å°è´§æ¥æ / 夿³¨ | |
| | | |
| | | ### 4.2 åºåºåï¼å«è½¦è¾ï¼ä¸æ `bindableVehicles` |
| | | |
| | | æ¥å£å没åï¼è¯ä¹æ¯**ã该å°è´¦å¯ç»è®°å°è´§çåºåºåï¼é¡ºå¸¦å¸¦åºè½¦è¾ã**ï¼æä»¥**ä¸æè½¦è¾æ¯å¦ä¸ºç©ºè¿æ»¤**ï¼ |
| | | |
| | | ```sql |
| | | from stock_out_record sor |
| | | left join stock_out_record_sales_ledger b |
| | | on b.stock_out_record_id = sor.id and b.sales_ledger_id = #{salesLedgerId} |
| | | left join sales_ledger self_ledger on self_ledger.id = sor.sales_ledger_id |
| | | where sor.approval_status = 1 and (sor.type is null or sor.type = '') |
| | | -- åæ²¹ï¼å¿
é¡»æç»å®è¡ï¼ä»£å¨ï¼ä¸äº§ç»å®è¡ï¼éåé¦é¡¹åå¼å |
| | | and (b.id is not null |
| | | or (self_ledger.id = #{salesLedgerId} and self_ledger.ledger_type = '代å¨')) |
| | | ``` |
| | | |
| | | - åæ²¹ç `outQuantity` = ç»å®è¡ç `quantity`ï¼ |
| | | - 代卿²¡æç»å®è¡ï¼`outQuantity` = **æ´å `stock_out_num`**ã |
| | | |
| | | è¿åè¡ï¼`BigDecimal`ï¼ï¼ |
| | | |
| | | | åæ®µ | 说æ | |
| | | | --- | --- | |
| | | | `stockOutRecordId` | åºåºå id | |
| | | | `outboundBatches` | åºåºåå·ï¼CK å·ï¼ | |
| | | | `vehicleId` | è½¦è¾ idï¼**å¯è½ä¸º `null`**ï¼ä»£å¨/客ååºåºä¸å¼ºå¶éè½¦ï¼ | |
| | | | `truckPlateNo` | 车çå·ï¼**å¯è½ä¸º `null`** | |
| | | | `outQuantity` | 该å°è´¦å¨è¯¥åºåºåä¸åæå°çåºåºæ°é(å¨) | |
| | | | `arrivedQuantity` | 该åºåºå**该å°è´¦**已累计å°è´§æ°é(å¨) | |
| | | |
| | | > **å¿
é¡»å
éåºåºåï¼CK å·ï¼ï¼è½¦è¾ä¸æéåºåºåèå¨**ãåä¸å°è´¦åä¸è¾è½¦å¯è½è·å¤è¶ï¼åªç车è¾å®ä½ä¸åºç¶è¡ã |
| | | |
| | | ### 4.3 æ ¡éªè§åä¸éè¯¯ææ¡ |
| | | |
| | | | åºæ¯ | `msg` | |
| | | | --- | --- | |
| | | | æ²¡ä¼ `salesLedgerId` | `è¯·éæ©éå®å°è´¦` | |
| | | | å°è´¦ä¸åå¨ | `æééå®å°è´¦ä¸åå¨,éå®å°è´¦id:96` | |
| | | | æ²¡ä¼ `stockOutRecordId` | `è¯·éæ©åºåºå` | |
| | | | åºåºåä¸åå¨ | `æéåºåºåä¸åå¨,åºåºåid:999` | |
| | | | åºåºåæªå®¡æ¹éè¿ | `åºåºåæªå®¡æ¹éè¿,ä¸è½ç»è®°å°è´§,åºåºåå·:CK20260920007` | |
| | | | åºåºå䏿¯æ²¹ååºåºï¼`type='0'/'1'`ï¼ | `该åºåºå䏿¯æ²¹ååºåº,ä¸è½ç»è®°å°è´§,åºåºåå·:...` | |
| | | | 该åºåºå没ç»è¿ä¸ªå°è´¦ï¼ä¸ä¸æ¯ä»£å¨ï¼ | `该åºåºåæªç»å®æ¤éå®å°è´¦,ä¸è½ç»è®°å°è´§` | |
| | | | ä¼ ç车è¾ä¸åºåºåä¸ä¸è´ | `æé车è¾ä¸è¯¥åºåºåç»è®°ç车è¾ä¸ä¸è´,åºåºåå·:CK20260920007` | |
| | | | å°è´§æ°éæªå¡« / ⤠0 | `å°è´§æ°éå¿
须大äº0` | |
| | | | 累计å°è´§è¶
è¿è¯¥å°è´¦åæé | `å°è´§æ°éè¶
åºè¯¥å°è´¦æ¬æ¬¡åºåºæ°é,åºåºæ°é:2.5,å·²å°è´§:2` | |
| | | |
| | | **å°è´§ä¸é = 该å°è´¦å¨è¯¥åºåºåä¸åæå°çæ°é**ï¼ç»å®è¡ç `quantity`ï¼ä»£å¨æ²¡æç»å®è¡ï¼åæ´å `stock_out_num`ï¼ï¼**䏿¯**å°è´¦æç»çååæ°é ââ å¦åæ¡ä¸ä½ãå°è´§è¶
è¿å®åãã |
| | | |
| | | **车è¾ä¸å强å¶**ï¼åºåºå**æ**ç»è®°è½¦è¾ â å°è´§è®°å½ç车è¾/车çä¸å¾åç¨åºåºåçï¼åºåºå**没**ç»è®°è½¦è¾ï¼ä»£å¨/客ååºåºä¸å¼ºå¶é车ï¼â å°è´§è®°å½è½¦è¾/车ç**ç空**ï¼ä¸åæ¥éï¼æ§ææ¡ `该åºåºåæªç»è®°è½¦è¾,ä¸è½ç»è®°å°è´§...` å·²åºå¼ï¼ã |
| | | |
| | | 累计å£å¾æ¯ã**该åºåºå à 该å°è´¦**ãçå·²å°è´§ä¹åï¼ç¼è¾æ¶æé¤èªå·±é£ä¸æ¡ã |
| | | |
| | | ### 4.4 éä»¶ï¼**éç¹**ï¼ |
| | | |
| | | `attachments` å `text` åç **JSON æ°ç»**ï¼å
ç´ æ¯**æ°¸ä¹
龿¥**ï¼ |
| | | |
| | | - **å¿
é¡»ç¨ `/common/public/upload`**ï¼åååº `data[].previewURL`ï¼ |
| | | - **ä¸è¦**ç¨ `/common/upload` ââ å®è¿åçæ¯ **2 å°æ¶è¿æ**çç¾å URLï¼è¿æåéä»¶å
¨é¨æä¸å¼ï¼è¯¥åå·²æåç§ï¼ã |
| | | |
| | | ### 4.5 ä¿®æ¹è¯ä¹ |
| | | |
| | | `POST /salesLedgerArrival/update` éè¦ä¼ `id`ï¼ |
| | | |
| | | - `stockOutRecordId` / `salesLedgerId` **ä¸ä¼ åæ²¿ç¨åå¼**ï¼å®ä»¬æ¯è®°å½ç身份ï¼ï¼ä¼ äºåææ°èº«ä»½éæ°æ ¡éªï¼ |
| | | - `arrivalQuantity` ä¸ä¼ åæ²¿ç¨åå¼ï¼ |
| | | - 车è¾/车ç/æç» id ä»ä»¥å端ç®åºä¸ºåã |
| | | |
| | | --- |
| | | |
| | | ## 5. åè´§å°è´¦å±çº§å |
| | | |
| | | ### 5.1 ç»æ |
| | | |
| | | `GET /shippingInfo/listPage` ç `records[]` **å¤äºä¸ä¸ª `children`**ï¼ |
| | | |
| | | ```json |
| | | { |
| | | "id": 260, |
| | | "source": "oilOut", |
| | | "stockOutRecordId": 260, |
| | | "outboundBatches": "CK20260920007", |
| | | "salesContractNo": "RB120260831001", |
| | | "children": [ |
| | | { |
| | | "id": 1, |
| | | "stockOutRecordId": 260, |
| | | "salesLedgerId": 96, |
| | | "customerName": "åéææè¿è¾æéå
¬å¸", |
| | | "truckPlateNo": "èF12345", |
| | | "arrivalQuantity": 2.5, |
| | | "arrivalDate": "2026-09-21", |
| | | "attachments": ["https://.../common/public/upload/..."], |
| | | "remark": "第ä¸è½¦" |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | | è¡ | æ¥æº | `children` | |
| | | | --- | --- | --- | |
| | | | ç¶è¡ = **æ²¹ååºåºå** | 忝 Bï¼`stock_out_record`ï¼`type` 为空ã`approval_status=1`ï¼ | 该åºåºåä¸çå°è´§è®°å½ï¼æ `arrival_date desc, id desc` | |
| | | | ç¶è¡ = **æå·¥åè´§å** | 忝 Aï¼`shipping_info`ï¼ | æä¸º `[]`ï¼ç©ºæ°ç»ï¼ä¸æ¯ `null`ï¼ | |
| | | |
| | | ### 5.2 å®ç°æ¹å¼ï¼**å³å®äºå页为ä»ä¹æ¯å¯¹ç**ï¼ |
| | | |
| | | **没æ**æå°è´§è®°å½ UNION è¿ SQLï¼èæ¯ä¿æå UNION å页ä¸å¨ï¼å¨ **Service å±åç½®ç»è£
**åè¡ï¼ |
| | | |
| | | 1. `shippingInfoMapper.listPage(page, req)` ç
§æ§èµ°ï¼ |
| | | 2. ä» `records` éæ `source='oilOut' && stockOutRecordId != null` çè¡ï¼æ¶é idï¼ |
| | | 3. **䏿¬¡**æ¹éæ¥ `sales_ledger_arrival where stock_out_record_id in (...)`ï¼æ `stock_out_record_id` åç»å set è¿ `children`ã |
| | | |
| | | è¿æ ·**ç¶è¡ç»´åº¦çå页å `total` å¤©ç¶æ£ç¡®**ï¼æ¯ä¸è¡æ¬æ¥å°±æ¯ä¸ä¸ªç¶è¡ï¼ï¼ä¸ `GET /shippingInfo/getDateilByShippingNo` å¤ç¨åä¸ `listPage` å¹¶å `getRecords().get(0)` æ¶**ä¸ä¼éé»åå°åè¡**ã |
| | | |
| | | ### 5.3 ä¸¤ä¸ªæ¢æç¼ºé·é¡ºæä¿®äº |
| | | |
| | | 1. **`oilOut` è¡ä¸å廿¥ `storage_blob`**ï¼æ²¹ååºåºè¡ç `id` æ¯ `stock_out_record.id`ï¼ä¸ `shipping_info.id` ååä¼**æå·**ï¼ä»¥åæ¿å®å»æ¥é件伿å**å«çåè´§åçå¾**ãç°å¨ `oilOut` è¡ç´æ¥è·³è¿è¿æ¬¡æ¥è¯¢ï¼éä»¶æå¨ `children[]` ä¸ã |
| | | 2. `ShippingInfoDto.batchNoList` è¡¥äº `@TableField(exist = false)` ââ 该 DTO è¢«å½ `@RequestBody` ç¨å¨ `POST /shippingInfo/add`ï¼æ²¡ææ³¨è§£ MyBatis-Plus ä¼å»åä¸åå¨ç `batchNoList` åã |
| | | |
| | | --- |
| | | |
| | | ## 6. éå®å°è´¦ç¶ææ¹æå°è´§ç® |
| | | |
| | | **åæ®µåä¸å**ï¼`shippedQuantity` / `shippingStatus` / `isFh`ï¼ï¼åªæ¢æ°æ®æºã |
| | | |
| | | | åæ®µ | æ¹é å | æ¹é å | |
| | | | --- | --- | --- | |
| | | | ãå·²åè´§æ°éã`shippedQuantity` | `shipping_info` + `shipping_product_detail` + é
对 `record_type='13'` åºåº | **`sales_ledger_arrival.arrival_quantity`** æ `sales_ledger_product_id` æ±æ» | |
| | | | ãåè´§ç¶æã`shippingStatus` | åä¸ | åä¸ï¼æ´¾çåé»è¾æ²¡å¨ï¼åªæ¢æ°æ®æºï¼ | |
| | | | ãæ¯å¦åè´§ã`is_fh` | è¦æ±è¯¥å°è´¦ä¸å
¨é¨åè´§å齿¯ãå·²åè´§ã | åæ²¹ï¼**该å°è´¦ `type=1` æç» `quantity` ä¹å ⤠å°è´§æ°éä¹å**ï¼ä»£å¨ï¼**å·²å®¡æ¹æ²¹ååºåºéä¹å ⤠å°è´§æ°éä¹å**ï¼è§ 6.1ï¼ | |
| | | | ãå¾
åè´§æ°éã`noQuantity` | åæ `t5` | **æ°å¢ä¸ä¸ª UNION 忝**ï¼æãæ²¹ååºåºå¾
å®¡æ¹ / å¾
确认ãï¼`approval_status IN (0,3)`ï¼çç»å®è¡æ°éä¹ç®ä½ã审æ¹ä¸ãï¼ä¸å°è´§éäºè¡¥ | |
| | | |
| | | ### 6.1 `is_fh` çè¾¹çï¼**å¿
须忻**ï¼ |
| | | |
| | | å两ç§å°è´¦ï¼**æ¯ç§é½è¦æ±èªå·±çåºå线 > 0**ï¼å¦å `SUM=0 <= 0` ä¼è¢«å¤æ `true`ï¼ |
| | | |
| | | ```sql |
| | | CASE |
| | | -- åæ²¹ï¼åºå线 = type=1 æç»ååæ°éä¹å |
| | | WHEN IFNULL(d.total_qty,0) > 0 AND IFNULL(d.total_qty,0) <= IFNULL(a.total_arrival,0) THEN TRUE |
| | | -- 代å¨ï¼æ²¡æ type=1 æç»ï¼åºå线 = 该å°è´¦å
¨é¨å·²å®¡æ¹æ²¹ååºåºåç stock_out_num ä¹å |
| | | WHEN IFNULL(d.total_qty,0) = 0 AND IFNULL(o.total_out,0) > 0 |
| | | AND IFNULL(o.total_out,0) <= IFNULL(a.total_arrival,0) THEN TRUE |
| | | ELSE FALSE |
| | | END |
| | | ``` |
| | | |
| | | - 代卿²¡æç»å®è¡¨ï¼`o` åæ¥è¯¢ç´æ¥ä» `stock_out_record` æåå¼å `sales_ledger_id` æ±æ»ï¼ä»£å¨ã䏿¬¡åºåºåªè½ç»ä¸ä¸ªå°è´¦ãï¼åå¼åæ¯æå¨çï¼ï¼ |
| | | - æä»¥**代å¨å°è´¦å¿
é¡»æ´ååºåºéå
¨é¨ç»è®°å°è´§**ï¼`is_fh` æä¼ç¿»æ `true`ï¼ |
| | | - `sales_ledger_arrival` 对代å¨çæ±æ»æ `sales_ledger_id`ï¼æç» id 为 `null`ï¼ä¸è½ææç»æ±æ»ï¼ã |
| | | |
| | | ### 6.2 Java ä¾§åæºé»è¾ |
| | | |
| | | | ä½ç½® | åå | |
| | | | --- | --- | |
| | | | `SalesLedgerProductServiceImpl.selectSalesLedgerProductList` | éè¡æå°è´§è®°å½å¡« `shippingDate`ï¼åææ°ä¸æ¡ç `arrival_date`ï¼ä¸ `shippingCarNumber`ï¼ææå°è´§è½¦çå»éåéå·æ¼æ¥ï¼ã**å¿«éåæ®µå¯¹æ´è½¦æ²¹åæ æä¹ï¼ç空** | |
| | | | `SalesLedgerServiceImpl.getSalesLedgerWithProducts` | æ `sales_ledger_product_id` åææ°å°è´§è®°å½å¡« `shippingStatus` | |
| | | | `SalesLedgerServiceImpl.listSalesLedger` | åä¸ï¼å¹¶**ä¿®æä¸ä¸ªæ¢æ NPE**ï¼æ§ä»£ç å¨ `shippingInfo` 为 null æ¶å
è§£å¼ç¨ãåå¤ç©ºï¼ | |
| | | |
| | | --- |
| | | |
| | | ## 7. `record_type='13'` çå£å¾ï¼**æå®¹æè¸©ç䏿¡**ï¼ |
| | | |
| | | | ç»è®º | 说æ | |
| | | | --- | --- | |
| | | | æ²¹ååºåºç `record_type` **ä¸ç´æ¯ `'1'`**ï¼æ¬è½®**䏿¹** | æ¹æ `'13'` ä¼è®©**åºåºç®¡çå表æåºåºç±»åçéæ¶çä¸å°å®**ï¼ç´æ¥è¿åãæ²¹ååºåºæ°æ®å±ç¤ºå¨åºåºå°è´¦ãè¿æ¡éæ± | |
| | | | 夿ã**æ¯ä¸æ¯éå®ç±»æ²¹ååºåº**ãä¸å¾ä»¥**ç»å®è¡¨**为å | `sor.approval_status=1 AND (sor.type IS NULL OR sor.type='')` + `INNER JOIN stock_out_record_sales_ledger` | |
| | | | `record_type='13'` çå«ä¹æ¶çªä¸ºã**æå·¥åè´§åçåºåº**ã | ç± `ShippingInfoServiceImpl` æ `SALE_SHIP_STOCK_OUT` çæï¼`record_id` = `shipping_info.id` | |
| | | |
| | | **å鿏
çå**ï¼DDL 第 3 èï¼ï¼`record_id>0` çæ²¹ååºåºå·²ç»ä¸åå¨ãå æ¤ï¼ |
| | | |
| | | - è´¢å¡/éè´åé**ä¸å**æ `record_type='13'` è¿æ»¤æ²¹ååºåºï¼ |
| | | - `ShippingInfoServiceImpl.cancelByOutbound` å äº `recordId > 0` å®å« ââ `record_id=0` çæ²¹ååºåº `record_type` åæ ·æ¯ `'13'`ï¼ä¼ 0 è¿æ¥ä¼æ**åç±»åçæ²¹ååºåº**彿æ¬åè´§åçé
对åºåº**æ´æ¹å æ**ï¼ |
| | | - `ShippingInfoMapper` 忝 A ç `oor` join ä¸åæ¯ B çæé¤æ¡ä»¶**åªæå¡åéå·²æ¹é è¡**ï¼**线ä¸ç¡®è®¤æ¸
ç宿åä¸è¦å **ã |
| | | |
| | | --- |
| | | |
| | | ## 8. è´¢å¡ / éè´ç²åº¦åå |
| | | |
| | | ### 8.1 å¼ç¥¨ç³è¯· & æ¶æ¬¾åéï¼**å
¥åå¤ä¸ä¸ªå段**ï¼ |
| | | |
| | | ç²åº¦ä»ãåºåºåã䏿²å°ã**åºåºå à 客æ·**ããåä¸ä¸ª CK å·åéä¸¤ä¸ªå®¢æ· â **å表åºä¸¤è¡**ï¼éé¢åç®åçã |
| | | |
| | | | è¡ | `id` | `bindingId` | `outboundAmount` | |
| | | | --- | --- | --- | --- | |
| | | | æå·¥åè´§ååºåº | åºåºå id | `null` | `stock_out_num à åä»·` | |
| | | | æ²¹ååºåºï¼æå®¢æ·æï¼ | åºåºå id | **ç»å®è¡ id** | `binding.quantity à åä»·` | |
| | | |
| | | **å端è¦åç**ï¼å¾éè¡å**æ `bindingId` æ¯å¦ä¸ºç©ºåå¼åä¼ **ï¼ |
| | | |
| | | | åæ®µ | åä»ä¹ | |
| | | | --- | --- | |
| | | | `stockOutRecordIds` | éä¸çã`bindingId` 为 `null` çè¡ç `id`ï¼éå·ä¸²ï¼ | |
| | | | `stockOutBindingIds` | éä¸çã`bindingId` ä¸ä¸º `null` çè¡ç **`bindingId`**ï¼éå·ä¸²ï¼ | |
| | | |
| | | > **为ä»ä¹ä¸è½æ··çå**ï¼ä¸¤ä¸ª id 空é´é½æ¯å°æ´æ°ï¼æ··å伿å·ï¼`FIND_IN_SET` åä¸åºæ¥ â ãå·²å¼ç¥¨/å·²æ¶æ¬¾ãçæé¤æ¡ä»¶å¤±æã**å䏿¹è´§è¢«éå¤å¼ç¥¨**ãæä»¥å端æ°å¼äº `stock_out_binding_ids` åï¼å¤é乿䏤åå嫿¥ã |
| | | |
| | | `POST /accountInvoiceApplication/add` çå¤éè¦çä¸¤ä¸ªåæ®µï¼é夿¶ä»æ¥ `åå¨éå¤çåºåºå`ã |
| | | |
| | | ### 8.2 éè´å°è´¦ãå·²é宿°éã/ éè´éè´§ãå¯éæ°éã |
| | | |
| | | æ²¹ååºåº**ä¸å产 `shipping_product_detail`** â æ¹æã**åºåºåçè§æ ¼ + æ¹æ¬¡**ã对ä¸éè´å
¥åºæ¹æ¬¡ï¼æ±æ»ç»å®è¡çåææ°éï¼ |
| | | |
| | | ```sql |
| | | from stock_out_record_sales_ledger b |
| | | inner join stock_out_record sor on sor.id = b.stock_out_record_id |
| | | and sor.approval_status in (0,1,3) and (sor.type is null or sor.type = '') |
| | | group by sor.batch_no, sor.product_model_id |
| | | ``` |
| | | |
| | | 䏿¡åºåºåç»å¤ä¸ªå°è´¦æ¶ï¼ç»å®è¡æ°éä¹å = æ´ååºåºéï¼æä»¥æ±æ»ç»æä¸æ¹é åä¸è´ã |
| | | |
| | | ### 8.3 客æ·å¾æ¥è¯¦æ
|
| | | |
| | | `CustomerMapper.customewTransactionsDetails` çæ¶æ¬¾é¢æ±æ»å äºæ²¹ååºåºåæ¯ï¼æ¶æ¬¾åç» `stock_out_binding_ids` æ¾å°ç»å®è¡ï¼å°è´¦ç´æ¥ä»ç»å®è¡åï¼ä¸ç» `shipping_info`ï¼ã |
| | | |
| | | --- |
| | | |
| | | ## 9. å é¤ / ç¼è¾çº¦æ |
| | | |
| | | | å¨ä½ | 约æ | |
| | | | --- | --- | |
| | | | å åºåºåï¼`DELETE /stockOutRecord/{ids}`ï¼ | **å·²æå°è´§è®°å½æ¶æç»å é¤**ï¼æ¥ `åºåºåå·²ç»è®°å°è´§è®°å½,æ æ³å é¤,åºåºæ¹æ¬¡:CK20260920007`ï¼æ²¡å°è´§è®°å½åä¸å¹¶å æç»å®è¡ | |
| | | | æ¹ç»å®ï¼`PUT /stockOutRecord/{id}` æ¢äº `ledgerList`ï¼ | **å·²æå°è´§è®°å½æ¶æç»æ¹ç»**ï¼æ¥ `该åºåºåå·²ç»è®°å°è´§è®°å½,æ æ³ä¿®æ¹ç»å®çéå®å°è´¦,åºåºåid:260`ï¼ç»å®**没å**ååæ ·ä¿çï¼**ä¿ä½ç»å®è¡ id**ï¼ä¸ä¼å¯¼è´è´¢å¡å
³è失æï¼ | |
| | | | ç¼è¾åºåºå | æ²¿ç¨æ¢æå£å¾ï¼æ¹æ°é**请å
å åéå¼** | |
| | | | å°è´§è®°å½å é¤ | æ å®¡æ¹æµï¼å¯ç´æ¥å ï¼å æåéå®å°è´¦ç¶æ**èªå¨åé**ï¼æ¨å¯¼èªç¶åå°ï¼ | |
| | | |
| | | > ç¼è¾åºåºè®°å½æ¶**ä¸è¦åä¼ ** `recordType` / `recordId` ââ å端已æè¿ä¸¤ä¸ªå段å å
¥å¿½ç¥å表ã |
| | | |
| | | --- |
| | | |
| | | ## 10. èè°èªæ¥æ¸
å |
| | | |
| | | **DDL** |
| | | - [ ] ç®æ åºæ§è¡ `doc/20260921_multi_ledger_and_arrival.sql`ï¼å 5 段ï¼å»ºè¡¨ / å鿏
ç / åéåå¡« / 两个æ°å¢åï¼ |
| | | - [ ] åå¡«å `select count(*) from stock_out_record_sales_ledger` > 0ï¼è¥æèçåå°è´¦ç»å®æ°æ®ï¼ |
| | | |
| | | **å¤å°è´¦ç»å®** |
| | | - [ ] ä¼ **两个**é½å«è¯¥è§æ ¼çåæ²¹å°è´¦ï¼æ°éä¹å = åºåºæ»é â æäº¤æåï¼ç»å®è¡¨ä¸¤è¡ã`Σquantity = stock_out_num` |
| | | - [ ] ä¼ ä¸ä¸ª**ä¸å«è¯¥è§æ ¼**çå°è´¦ â æ¥ãæé产åä¸å¨è¯¥éå®å°è´¦æç»ä¸ã |
| | | - [ ] æ°éä¹å â åºåºæ»é â æ¥ãåéå®å°è´¦ç»å®æ°éä¹åå¿
é¡»çäºæ¬æ¬¡åºåºæ°éã |
| | | - [ ] ç»**代å¨**å°è´¦ + å¦ä¸ä¸ªå°è´¦ â æ¥ã代å¨å°è´¦ä¸è½ä¸å
¶ä»éå®å°è´¦ä¸èµ·ç»å®ã |
| | | - [ ] **åªæ¬ä»£å¨å°è´¦** â åºåºç±»å« = 代å¨ï¼æ²¹åº/å¨ç½å¸¦å
¥ï¼**ç»å®è¡¨æ è¡** |
| | | - [ ] ä¸ä¼ `ledgerList` ä¹ä¸ä¼ `salesLedgerId` â è¡ä¸ºä¸æ¹é åä¸è´ï¼åå½ï¼ |
| | | - [ ] ä¼ `ledgerList: []` â ç»å®è¢«æ¸
空 |
| | | - [ ] åºåºç®¡çåè¡¨è¯¥è¡ `salesContractNo` = **两个ååå·éå·åé**ï¼åè´§å°è´¦è¯¥ç¶è¡ `sales_contract_no` å |
| | | - [ ] åè´§å°è´¦æå
¶ä¸ä¸ä¸ªååå·çé â **è½çå°è¯¥è¡**ï¼ä¸ååªçé¦é¡¹ï¼ |
| | | |
| | | **å°è´§è®°å½** |
| | | - [ ] `bindableVehicles?salesLedgerId=96` â åªåºãç»äºè¯¥å°è´¦ä¸å®¡æ¹éè¿ãçåºåºåç |
| | | - [ ] `add`ï¼æ°é ⤠该å°è´¦åæéï¼â æåï¼`arrivalQuantity` è¶
ä¸é â æ¥ãå°è´§æ°éè¶
åºè¯¥å°è´¦æ¬æ¬¡åºåºæ°éã |
| | | - [ ] ä¼ ä¸ä¸ª**没ç»è¯¥å°è´¦**çåºåºåï¼é代å¨ï¼â æ¥ã该åºåºåæªç»å®æ¤éå®å°è´¦ã |
| | | - [ ] ä¼ **æªå®¡æ¹éè¿**çåºåºå â æ¥ãåºåºåæªå®¡æ¹éè¿ã |
| | | - [ ] éä»¶ç¨ `/common/public/upload` ç `previewURL` â åè¡¨è½æ£å¸¸åæ¾ä¸**æ°¸ä¸è¿æ** |
| | | - [ ] `listPage` å页 `total` ä¸å®é
è¡æ°ä¸è´ï¼**éç¹**ï¼è¯¥æ¥è¯¢å¸¦ `/*data_scope*/`ï¼å·² `setOptimizeCountSql(false)`ï¼ |
| | | |
| | | **å°è´§è®°å½ï¼ä»£å¨ï¼** |
| | | - [ ] `bindableVehicles?salesLedgerId=<代å¨å°è´¦>` â åºè¯¥å°è´¦çå·²å®¡æ¹æ²¹ååºåºåï¼**ä¸äº§ç»å®è¡ä¹è½åº**ï¼ |
| | | - [ ] 代å¨åºåºå**没ç»è®°è½¦è¾** â ä¸æè¡ `vehicleId` / `truckPlateNo` 为 `null`ï¼`add` **䏿¥é**ãå°è´§è®°å½è½¦è¾ç空 |
| | | - [ ] 代å¨åºåºå**æ**ç»è®°è½¦è¾ â `add` æ¶è½¦è¾/车ç被åºåºåçå¼è¦ç |
| | | - [ ] 代å¨å°è´§ä¸é = **æ´å `stock_out_num`**ï¼ä¸æ¯æç»æ°éï¼ |
| | | - [ ] æ¿ä¸ä¸ª**鿬å°è´¦**ç代å¨åºåºå â æ¥ã该åºåºåæªç»å®æ¤éå®å°è´¦ã |
| | | |
| | | **åè´§å°è´¦** |
| | | - [ ] 该åºåºåä½ä¸º**ç¶è¡**åºç°ï¼`source='oilOut'`ï¼`children` 为空æ°ç» |
| | | - [ ] å 䏿¡å°è´§è®°å½å â ç¶è¡ `children` æ 1 æ¡ï¼**åä¸ CK å·ä»åªåºç°ä¸è¡** |
| | | - [ ] æå·¥åè´§åçè¡ â `children` 为 `[]` |
| | | - [ ] `oilOut` ç¶è¡**ä¸å**è¿åå«çåè´§åçéä»¶ |
| | | |
| | | **éå®å°è´¦ç¶æ** |
| | | - [ ] æå°è´§è®°å½å â 该å°è´¦æç»çãå·²åè´§æ°éã> 0ããåè´§ç¶æãä¸åæ¯ãå¾
åè´§ã |
| | | - [ ] åæ²¹å°è´¦ï¼å°è´§é ⥠å°è´¦æç»æ°éä¹å â `isFh = true` |
| | | - [ ] 代å¨å°è´¦ï¼å°è´§é ⥠**该å°è´¦å
¨é¨å·²å®¡æ¹æ²¹ååºåºéä¹å** ä¸ > 0 â `isFh = true`ï¼æªç»è®°å°è´§ / å°è´§ä¸è¶³ â `false`ï¼ä¸è½åºç° `0 <= 0` è¢«å¤ `true`ï¼ |
| | | - [ ] åºåºåå·²æäº¤å¾
å®¡æ¹ â 该å°è´¦ã审æ¹ä¸ãæ°éå¢å |
| | | |
| | | **è´¢å¡ / éè´** |
| | | - [ ] `GET /accountSales/listPageAccountSales`ï¼å¤å®¢æ·åºåº**æå®¢æ·ææ 2 è¡**ï¼éé¢ = åèªåæé à åä»· |
| | | - [ ] å¼ç¥¨/æ¶æ¬¾åéå¾éæ²¹åè¡ â åä¼ çæ¯ **`bindingId`**ï¼è¿ `stockOutBindingIds`ï¼ |
| | | - [ ] 对åä¸ä¸ª CK å·ç»å®¢æ· A å¼ç¥¨åï¼å®¢æ· B çé£è¡**ä»è½çå°** |
| | | - [ ] éè´éè´§ãå¯éæ°éãï¼æ²¹ååºåºå**åå°**ï¼ä¸åèå¢ï¼ |
| | | |
| | | **åå½** |
| | | - [ ] åæ ¼åºåºï¼`type='0'`ï¼/ ä¸åæ ¼åºåºï¼`type='1'`ï¼æµç¨ä¸åå½±å |
| | | - [ ] æå·¥å»ºçéå®åè´§åï¼å表ã详æ
ãåè´§ãå é¤ä¸åå½±å |
| | | - [ ] åºåºç®¡çå表æ**åºåºç±»å**çéï¼æ²¹ååºåºä»ç¶è½çå°ï¼éªè¯ç¬¬ 7 èï¼ |
| | | |
| | | --- |
| | | |
| | | ## 11. ç¸å
³ææ¡£ |
| | | |
| | | - `doc/20260921_multi_ledger_and_arrival.sql` ââ æ¬æ¬¡ DDLï¼å»ºè¡¨ + æ¸
ç + åå¡« + 两个æ°å¢åï¼ |
| | | - `doc/20260921_æ²¹ååºåºç»ä¸åºåºå£å¾å端èè°ææ¡£.md` ââ æ²¹ååºåºä¸åæåºåºç±»å«åæ¯ï¼**ä»ç¶ææ**ï¼ |
| | | - `doc/20260920_æ²¹ååºåºèå¨åè´§å°è´¦å端èè°ææ¡£.md` ââ åè´§å°è´¦å¥çº¦ã`source` åæ¯ãæ¹å·å±ç¤º |
| | | - `doc/20260920_æ²¹ååºåºç»å®éå®å°è´¦å端èè°ææ¡£.md` ââ `salesLedgerId` ç»å®ä¸ä»£å¨å°è´¦å£å¾ï¼`ledgerList` å·²å代å
¶ 4.3 èï¼ |
| | | - `doc/20260921_æ²¹ååºåºçæåè´§å°è´¦ä¸éå®å°è´¦ç¶æåæ¥å端èè°ææ¡£.md` ââ **æ´ç¯ä½åº**ï¼ä»
ä½åå²çæ¡£ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # æ²¹ååºåºçæåè´§å°è´¦ä¸éå®å°è´¦ç¶æåæ¥ å端èè°ææ¡£ï¼**å·²ä½åº**ï¼ |
| | | |
| | | > ## â ï¸â ï¸ æ´ç¯ä½åºï¼ä¸è¦ææ¬ææ¡£èè° â ï¸â ï¸ |
| | | > |
| | | > **ä½åºæ¶é´**ï¼2026-09-21 |
| | | > **ä½åºåå **ï¼æ¬ææ¡£æè¿°çãæ²¹ååºåºå®¡æ¹éè¿ â çæçå®åè´§åï¼`shipping_info` + `shipping_product_detail`ï¼+ æ `record_type` æ¹æ `'13'`ãè¿å¥æ¹æ¡**å·²æ´ä½åé**ï¼å端 `StockOutRecordServiceImpl.createShippingForOilOut` / `deleteGeneratedShipping` / `resolveShippingDate` å·²å é¤ï¼ã |
| | | > |
| | | > æ°å£å¾è§ï¼**`doc/20260921_æ²¹ååºåºå¤å°è´¦ç»å®ä¸å°è´§è®°å½å端èè°ææ¡£.md`** |
| | | > |
| | | > ä¸å¥è¯æ¦æ¬æ°å£å¾ï¼ |
| | | > 1. æ²¹ååºåº**ä¸åçæä»»ä½åè´§å**ï¼`record_type` æä¸º `'1'`ã`record_id` æä¸º `0`ï¼æ²¹ååºåºæ°æ®åªå¨**åºåºç®¡çå表**ï¼`GET /stockOutRecord/listPage`ï¼å±ç¤ºã |
| | | > 2. åè´§å°è´¦æ¹ä¸º**å±çº§ç»æ**ï¼ç¶è¡ = æ²¹ååºåºåï¼åè¡ = **å°è´§è®°å½**ï¼æ°å¢åè½ï¼å
¥å£å¨éå®å°è´¦é¡µï¼ã |
| | | > 3. éå®å°è´¦çãå·²åè´§æ°é / åè´§ç¶æ / æ¯å¦åè´§ãæ¹ä¸º**æå°è´§è®°å½ `sales_ledger_arrival` æ¨å¯¼**ï¼ä¸åä» `shipping_info` æ¨å¯¼ã |
| | | > |
| | | > æ¬ææ¡£**ä»
ä½åå²çæ¡£**ï¼ä¿çåæä»¥ä¾¿å¯¹ç
§åéåç设计ã䏿æ¯ä¸èå齿 äº â ï¸ã |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-21ï¼åæï¼å·²ä½åºï¼ |
| | | éç¨çæ¬ï¼~~æ¬æ¬¡åç«¯åæ´å~~ â å·²è¢«æ°æ¹æ¡å代 |
| | | éæ±æ¥æºï¼ã线ä¸ç¯å¢éè¦ä½ å¸®ææ ¹æ®åºåºå°è´¦è¡¥å
åè´§å°è´¦ã+ãåè´§å°è´¦çæä¹åéè¦å°ç¶æåæ¥å°å¯¹åºçéå®å°è´¦ã |
| | | |
| | | --- |
| | | |
| | | ## 1. ä¸å¥è¯å£å¾ |
| | | |
| | | > â ï¸ **ä½åº**ï¼æ²¹ååºåºå®¡æ¹éè¿**ä¸åçæåè´§å**ï¼`record_type` ä¹ä¸åæ¹ `'13'`ãæ°å£å¾è§æ»æ¨ªå¹
æåçææ¡£ã |
| | | |
| | | **æ²¹ååºåºï¼`stock_out_record.type` 为空ï¼å®¡æ¹éè¿æ¶ï¼å端顺带çæä¸æ¡çå®çåè´§å°è´¦**ï¼`shipping_info` + `shipping_product_detail`ï¼ç¶æ=`å·²åè´§`ï¼ï¼å¹¶æè¿æ¡åºåºè®°å½**æ¹é ææ£ç»çãéå®-åè´§åºåºã**ï¼`record_type` ç± `1` æ¹æ `13`ã`record_id` æåæ°åè´§åï¼ã |
| | | |
| | | éå®å°è´¦çãæ¯å¦åè´§ / åè´§ç¶æ / å·²åè´§æ°éãæ¬æ¥å°±æ¯ä» `shipping_info` æ¨å¯¼çï¼**æä»¥é£æ¡æ¨å¯¼é¾è·¯ä¸è¡ SQL 齿²¡æ¹ï¼èªå¨å°±åæ¥äº**ã |
| | | |
| | | **æ¬æ¬¡æ²¡æ DDL**ï¼ç°æåè¶³å¤ã |
| | | |
| | | --- |
| | | |
| | | ## 2. çææ¶æºä¸åæ |
| | | |
| | | > â ï¸ **ä½åº**ï¼çæé»è¾å·²æ´ä½å é¤ï¼ä¸æææãçææ¶æº / çæåæ / åæ®µæ å°ãåä¸åå¨ã |
| | | |
| | | | 项 | å£å¾ | |
| | | | --- | --- | |
| | | | çææ¶æº | **åºåºå®¡æ¹éè¿æ¶**ï¼`POST /stockOutRecord/approve`ï¼`approvalStatus=1`ï¼ | |
| | | | çæåæ | 该åºåº**ç»å®äºéå®å°è´¦**ï¼`sales_ledger_id` é空ï¼**ä¸**è½æ `(sales_ledger_id, product_model_id, type=1)` å®ä½å°éå®å°è´¦æç»è¡ | |
| | | | ä¸çæçæ
å½¢ | æªç»å°è´¦ã代å¨å°è´¦ï¼ä»£å¨å°è´¦å¤©ç¶æ²¡æ `type=1` æç»ï¼ãç»äºå°è´¦ä½è§æ ¼ä¸å¨æç»é | |
| | | | 驳å / å审 | **ä¸çæ**ãçæåªåçå¨ã审æ¹éè¿ã忝 | |
| | | | åè´§æç»æ°é | `stock_out_num`ï¼æ¬æ¬¡è£
车æ»éï¼ | |
| | | | åè´§æç»æ¹æ¬¡ | `batch_no` | |
| | | | åè´§æç»åºå id | æ `(product_model_id, batch_no)` 忥 `stock_inventory.id` åå¡«ï¼æ¥ä¸å°ç `null` | |
| | | |
| | | **æªçææ¶åºåºè®°å½ä¿æåæ ·**ï¼`record_type='1'`ã`record_id=0`ï¼ï¼ç»§ç»ä»¥ `source='oilOut'` åºç°å¨åè´§å°è´¦é ââ 䏿¬æ¬¡æ¹å¨å**ä¸åä¸å·®**ã |
| | | |
| | | --- |
| | | |
| | | ## 3. çæçåè´§ååæ®µæ å° |
| | | |
| | | > â ï¸ **ä½åº**ï¼ä¸åæä»»ä½çæå¨ä½ï¼æ åæ®µæ å°å¯è°ã |
| | | |
| | | `shipping_info`ï¼ |
| | | |
| | | | å | åå¼ | |
| | | | --- | --- | |
| | | | `sales_ledger_id` | `stock_out_record.sales_ledger_id` | |
| | | | `sales_ledger_product_id` | æ `(sales_ledger_id, product_model_id, type=1)` æ¥ `sales_ledger_product`ï¼å `id` æå°ç䏿¡ | |
| | | | `status` | åºå® `å·²åè´§` | |
| | | | `shipping_no` | èªå¨çæç `SH...` å·ï¼ä¸è¯¥æ¥å·²æ `shipping_no` é¡ºå»¶ï¼ | |
| | | | `shipping_date` | `out_date`ï¼ä¸ºç©ºåå `create_time` çæ¥æï¼å空ååä»å¤© | |
| | | | `shipping_car_number` | `truck_plate_no` | |
| | | | `type` | ç空 | |
| | | | `express_number` / `express_company` | çç©ºï¼æ²¹ååºåºæ²¡æå¿«éåï¼ | |
| | | | `create_user` / `dept_id` | ä»åºåºè®°å½å¤å¶ï¼**ä¿è¯åè´§å°è´¦åè¡¨çæ°æ®æé䏿¹é åçåºåºåæ¯çå°å䏿¹è¡** | |
| | | |
| | | `shipping_product_detail`ï¼ |
| | | |
| | | | å | åå¼ | |
| | | | --- | --- | |
| | | | `shipping_info_id` | æ°åè´§å id | |
| | | | `product_model_id` | `stock_out_record.product_model_id` | |
| | | | `batch_no` | `stock_out_record.batch_no` | |
| | | | `quantity` | `stock_out_record.stock_out_num` | |
| | | | `stock_inventory_id` | 忥 `stock_inventory.id`ï¼æ¥ä¸å°ä¸º `null` | |
| | | |
| | | --- |
| | | |
| | | ## 4. åè´§å°è´¦å表çè¡ä¸ºååï¼**å端éç¹**ï¼ |
| | | |
| | | > â ï¸ **æ´èä½åº**ï¼ä¸åå¨ `source='shipping'` çæ²¹åè¡ãæ²¹ååºåºå¨åè´§å°è´¦é**æä¸º `source='oilOut'`**ï¼ä¸æ¹ä¸º**å±çº§ç¶è¡**ï¼åè¡ = å°è´§è®°å½ï¼è§æ°ææ¡£ç¬¬ 5 èï¼ããå䏿¹è´§åªåºç°ä¸è¡ãçç»è®º**仿ç«**ï¼ä½æå ä¸åï¼ä¸åæ `shipping_info` 忝éå¤ï¼ã |
| | | |
| | | `GET /shippingInfo/listPage` 仿¯ `shipping_info` UNION `stock_out_record` çå¹¶éï¼ä½**被æ¹é è¿ç飿¡æ²¹ååºåºç°å¨åªä» `shipping_info` åæ¯åºæ¥**ï¼ |
| | | |
| | | | è¡ | æ¹é å | æ¹é å | |
| | | | --- | --- | --- | |
| | | | å·²ç»å®åæ²¹å°è´¦ + 审æ¹éè¿çæ²¹ååºåº | `source='oilOut'`ï¼`stockOutRecordId` = åºåºè®°å½ id | **`source='shipping'`**ï¼`id` = æ°åè´§å idï¼`stockOutRecordId` = åºåºè®°å½ id | |
| | | | æªç»å°è´¦ / ä»£å¨ / åå²éç | `source='oilOut'` | **ä¸å**ï¼ä» `source='oilOut'` | |
| | | |
| | | **å䏿¹è´§åªä¼åºç°ä¸è¡**ï¼æ¹é åçè¡ç± `shipping_info` 忝å±ç¤ºï¼`stock_out_record` 忝已æå®æé¤ï¼ã`outboundBatches`ï¼CK åºåºåå·ï¼å¨æ°ç `shipping` è¡ä¸**ä»ç¶æå¼**ã |
| | | |
| | | æ¹é åè¡ç `outCategory` / `tankNo` / `oilProduct` / `oilDepotName` / `driverName` / `contactPerson` / `contactPhone` / `outBatchNo` **ç
§æ§æå¼**ï¼åç«¯å¨ `shipping_info` åæ¯è¡¥äºé
对åºåºè®°å½çå
³èï¼ï¼å端å±ç¤ºé»è¾ä¸ç¨æ¹ã |
| | | |
| | | ### 4.1 å端è¦è·çæ¹çå°æ¹ |
| | | |
| | | 1. **`source` 忝夿è¦éæ°å®¡è§**ãæ¹é åçæ²¹åè¡ `source` åæäº `'shipping'`ï¼ãåè´§ / å é¤ / éè´§ãæé®ä¼éæ°åºç°ãä½å 为åºå±ç°å¨æ¯**çå®ç `shipping_info`**ï¼è¿äºæé®**ä¸ä¼åæä½éåæ®**ï¼`id` å°±æ¯åè´§å idï¼ã |
| | | - â ï¸ **ä½ãå é¤ãä¸éç¨äºå®**ï¼`DELETE /shippingInfo/delete` è¦æ±ç¶ææ¯ãå¾
å®¡æ ¸ãï¼èçæçæ¯ãå·²åè´§ãï¼ä¼æ¥ãåªæå¾
å®¡æ ¸ç¶ææè½å é¤ããè¦å 请å»ãåºåºå°è´¦ãå åºåºè®°å½ï¼ä¼å½è¿åºåå¹¶èªå¨å²éåè´§åï¼è§ç¬¬ 5 èï¼ã |
| | | - ãåè´§ãæé®ï¼`POST /shippingInfo/deductStock`ï¼å ä¸ºç¶æå·²æ¯ãå·²åè´§ãï¼æ£åºå飿®µä¼è¢«è·³è¿ï¼ä¸ä¼é夿£åºåãä½å®ä¼æè¯·æ±ä½**è¦çå** `expressNumber` / `expressCompany` / `shippingCarNumber` / `shippingDate`ã |
| | | 2. **详æ
å¼¹æ¡**ï¼æ¹é åçè¡ `id` æ¯åè´§å idï¼`GET /shippingInfo/getDateil/{id}` è½æ£å¸¸è¿åæç»ï¼ä¸åæãæ `oilOut` è¡ç id æä¸å«çåè´§åãçé®é¢ã |
| | | 3. **ä¸è¦ä¸ºè¿æ¹æ²¹ååºåºåæå·¥å»ºåè´§å**ï¼å¦åå䏿¹è´§ä¼åºç°ä¸¤è¡ã |
| | | |
| | | --- |
| | | |
| | | ## 5. ååè·¯å¾ï¼å é¤åºåº = å²éåè´§åï¼ |
| | | |
| | | > â ï¸ **æ´èä½åº**ï¼å é¤åºåº**ä¸åå²éåè´§å**ï¼æ¬æ¥ä¹æ²¡çæï¼ãæ°çº¦ææ¯ï¼**该åºåºåè¥å·²æå°è´§è®°å½ï¼æç»å é¤**ï¼å°è´§è®°å½çå é¤èµ° `DELETE /salesLedgerArrival/delete`ã |
| | | |
| | | | å¨ä½ | åºå | åè´§å | éå®å°è´¦ç¶æ | |
| | | | --- | --- | --- | --- | |
| | | | å é¤**已审æ¹éè¿**çæ²¹ååºåºï¼`DELETE /stockOutRecord/{ids}`ï¼ | æåæ¹æ¬¡**å½è¿ä¸æ¬¡** | **èªå¨å é¤**ï¼æç» + 主åï¼ | èªå¨åéï¼åè´§åæ²¡äºï¼æ¨å¯¼èªç¶ååãå¾
åè´§ãï¼ | |
| | | | å é¤**å¾
审æ¹**çæ²¹ååºåºï¼`batchDeletePending`ï¼ | ä¸å | æ åè´§å | ä¸å | |
| | | | 审æ¹**驳å** / å审 | ä¸å | æ åè´§å | ä¸å | |
| | | | `PUT /stockOutRecord/{id}` ç¼è¾ | ä¸åï¼æ¢æå£å¾ï¼æ¹æ°é请å
å åéå¼ï¼ | **ä¸ä¼åæ¥æ´æ°åè´§æç»** | ä¸å | |
| | | |
| | | å 餿¶**åºååªå½è¿ä¸æ¬¡**ï¼å½è¿ç±åºåºä¾§è´è´£ï¼å åè´§åçå¨ä½ä¸ç¢°åºåã |
| | | |
| | | `PUT /stockOutRecord/{id}` å·²å ä¿æ¤ï¼å端ç¼è¾è¡¨å**ä¸åä¼ ** `recordType` / `recordId` ä¹ä¸ä¼æåè´§å°è´¦å
³è岿ã |
| | | |
| | | --- |
| | | |
| | | ## 6. éå®å°è´¦ä¾§ï¼ä»ä¹åäº |
| | | |
| | | > â ï¸ **æ´èä½åº**ï¼ä¸ä¸ªå段ç**æ°æ®æºå
¨é¨æ¹æ**ââç°å¨æ `sales_ledger_arrival` æ±æ»å°è´§éæ¨å¯¼ï¼ä¸åç `shipping_info`ãã`is_fh` è¦æ±æ²¡æä»»ä½éå·²åè´§åè´§åãè¿æ¡ä¹å·²ä¸éç¨ï¼è¯¦è§æ°ææ¡£ç¬¬ 6 èï¼ãåæ®µåä¿æä¸åã |
| | | |
| | | **å端å¨éå®å°è´¦ä¾§ä¸è¡ä»£ç 齿²¡æ¹ã** 以ä¸å段èªå¨å为æ£ç¡®å¼ï¼ |
| | | |
| | | | éå®å°è´¦å段 | æ¥æº | æ¹é å | |
| | | | --- | --- | --- | |
| | | | ãå·²åè´§æ°éã`shippedQuantity` | `SalesLedgerProductMapper` æ `shipping_info + shipping_product_detail + é
对 record_type='13' åºåº` æ±æ» | ææ¬æ¬¡åºåºç `stock_out_num` 计å
¥ | |
| | | | ãåè´§ç¶æã`shippingStatus` | åä¸ï¼ä¸å°è´¦æç» `quantity` æ¯è¾ | `å¾
åè´§` â `é¨ååè´§` / `å·²åè´§` | |
| | | | ãæ¯å¦åè´§ã`is_fh` | `SalesLedgerMapper` æ `sales_ledger_id` åç»ï¼è¦æ±å
¨é¨ `status='å·²åè´§'` | 该å°è´¦ä¸ææåè´§åé½å·²æ¯ãå·²åè´§ãâ `true` | |
| | | |
| | | > **注æ**ï¼`is_fh` è¦æ±è¯¥å°è´¦ä¸**没æä»»ä½**éãå·²åè´§ãçåè´§åãå¦æè¯¥å°è´¦è¿æä¸æ¡æå·¥å»ºçãç¶ææ¯ãå¾
å®¡æ ¸ / å®¡æ ¸ä¸ãçåè´§åï¼`is_fh` ä»ç¶æ¯ `false`ï¼è¿æ¯æ¢æé»è¾ï¼ä¸æ¯æ¬æ¬¡å¼å
¥çã |
| | | |
| | | --- |
| | | |
| | | ## 7. 跨模åå¯ä½ç¨ï¼**å·²ç¥ä¸å·²ç¡®è®¤**ï¼ |
| | | |
| | | > â ï¸ **æ´èä½åº**ï¼æ²¹ååºåº**ä¸ä¼**å ä¸ºæ¹æ `record_type='13'` èæ··è¿è´¢å¡æ¨¡åãæ°å£å¾æ¯**è´¢å¡/éè´æãåºåºå à 客æ·ãç»å®è¡éå**ï¼è§æ°ææ¡£ç¬¬ 8 èã |
| | | |
| | | æ¹é å `record_type='13'`ï¼è¿æ¡åºåºè®°å½ä¼**æ°å¢è¿å
¥**è¿äºæ `record_type='13'` çéçæ¨¡åï¼ |
| | | |
| | | - è´¢å¡éå®åºåºå°è´¦ |
| | | - å¼ç¥¨ç³è¯·åé |
| | | - æ¶æ¬¾åé |
| | | - 客æ·éå®ç»è®¡ |
| | | |
| | | åæ®µé½å
¨ï¼ä¸ä¼æ¥éãå¦å¤ï¼å 为åè´§æç»åå¡«äº `stock_inventory_id`ï¼éè´éè´§çãéè´æ¹æ¬¡å·²éå® / å¯éæ°éãå£å¾ä¼éä¹ååï¼è¯ä¹æ´åãæ°ååå°ï¼ã |
| | | |
| | | `stock_inventory` ç¸å
³çåºåç»è®¡è¦æ± `type='0'`ï¼**ä¸åå½±å**ã |
| | | |
| | | --- |
| | | |
| | | ## 8. å·²ç¥ä¸å½±åçæ
å½¢ |
| | | |
| | | > â ï¸ **ä½åº**ï¼ç¬¬ 3ã6 æ¡å°¤å
¶ä¸æç«ï¼æ²¹ååºåºçç¼è¾/å é¤çº¦æå·²æ¹ä¸ºãæå°è´§è®°å½åç¦æ¢å é¤ãï¼`record_type` ä¸ååæ´ï¼ã第 1ã2ã5 æ¡æè¿°çç°è±¡å¤§ä½ä»æç«ã |
| | | |
| | | 1. **åæ ¼åºåºï¼`type='0'`ï¼/ ä¸åæ ¼åºåºï¼`type='1'`ï¼** å®å
¨ä¸åå½±åï¼èµ°åèªåæåæ¯ã |
| | | 2. **æå·¥å»ºçéå®åè´§å**ï¼èµ°åè´§å®¡æ¹æµç¨ï¼ï¼å®ä»¬çé
对åºåºè®°å½ `type='0'`ï¼ä¸ä¼å½ä¸æ°å¢çåºåºä¾§å
³èï¼é£äºåºåºä¿¡æ¯åä»ä¸ºç©ºï¼è¡ä¸ºä¸æ¹åä¸è´ã |
| | | 3. **å岿°æ®**ï¼çæè§¦åç¹æ¯ã审æ¹éè¿æ¶ãï¼ä¸æ¯æ°æ®è¿ç§»ã**线ä¸ç°æçæ²¹ååºåºï¼æ å°è´¦ç»å®ãæ æ¹æ¬¡ï¼æ°¸è¿ä¸ä¼è¢«æ¹é **ã |
| | | 4. **çº¿ä¸æ²¡æå¯åå¡«çå岿°æ®**ï¼å æ¤**没æé
å¥çåå¡«èæ¬**ï¼å·²æ ¸å¯¹çº¿ä¸åºï¼æ²¹ååºåºå
± 1 æ¡ï¼ç»å®éå®å°è´¦ 0 æ¡ï¼æ»¡è¶³çæåæç 0 æ¡ï¼ã |
| | | 5. **æå®¢æ·åååè´§åçéè´§å鿥å£**ï¼`getShippingInfoByCustomerName`ï¼è¦æ± `shipping_info.status='å®¡æ ¸éè¿'`ï¼åä¸å°æä»¬çæçãå·²åè´§ãè¡ ââ 使£å¸¸èµ°å®æµç¨çå·²åè´§ååæ ·åä¸å°ï¼å±**æ¢æè¡ä¸º**ï¼æ¬æ¬¡ä¸æ¹ã |
| | | 6. **ç¼è¾åºåºä¸ä¼åæ¥æ´æ°å·²çæçåè´§æç»**ï¼æ¹æ°é/æ¹æ¬¡ååè´§å仿¯æ§å¼ï¼ãè¦æ¹è¯·å
å é¤åºåºï¼ä¼ä¸å¹¶å²éåè´§åï¼åéå¼ï¼ä¸æ¢æãæ¹æ°éä¸åæ¥åºåãæ¯åä¸å£å¾ã |
| | | |
| | | --- |
| | | |
| | | ## 9. èè°èªæ¥æ¸
å |
| | | |
| | | > â ï¸ **æ´èä½åº**ï¼è¯·æ¹ç¨æ°ææ¡£ç¬¬ 10 èçèè°èªæ¥æ¸
åï¼å
¶ä¸çæè¨ä¸æ¬è**å®å
¨ç¸å**ï¼ä¾å¦ã审æ¹éè¿å `recordType` ä»ä¸º `1`ã`recordId` ä»ä¸º `0`ãï¼ã |
| | | |
| | | - [ ] æ°å»ºä¸æ¡æ²¹ååºåºï¼`outCategory=éå®`ãç»å®ä¸ä¸ª**åæ²¹**éå®å°è´¦ãè§æ ¼å¨è¯¥å°è´¦æç»éãå¡«æ¹æ¬¡ãæ°éä¸è¶
è¿å¯ç¨é |
| | | - [ ] 审æ¹éè¿ â 该åºåºè®°å½ `recordType` å `13`ã`recordId` æåæ°åè´§å |
| | | - [ ] 审æ¹éè¿ â åè´§å°è´¦å表**æ°å¢ä¸è¡**ï¼`source='shipping'`ã`stockOutRecordId` æå¼ã`outBatchNo` æå¼ã`outboundBatches` = 该 CK å· |
| | | - [ ] **该 CK å·å¨åè´§å°è´¦éåªåºç°ä¸è¡**ï¼éç¹åå½é¡¹ï¼ä¸è½ `shipping` å `oilOut` 忥ä¸è¡ï¼ |
| | | - [ ] 该 CK å·**ä¸å**以 `source='oilOut'` åºç° |
| | | - [ ] 对åºéå®å°è´¦çãå·²åè´§æ°éãå¢å ããåè´§ç¶æãä¸åæ¯ãå¾
åè´§ã |
| | | - [ ] 对åºéå®å°è´¦çãæ¯å¦åè´§ãåæãæ¯ã |
| | | - [ ] 代å¨åºåºï¼ç»ä»£å¨å°è´¦ï¼å®¡æ¹éè¿ â **ä¸çæ**åè´§åï¼ä»ä»¥ `source='oilOut'` åºç° |
| | | - [ ] æªç»å°è´¦çæ²¹ååºåºå®¡æ¹éè¿ â **ä¸çæ**åè´§åï¼ä»ä»¥ `source='oilOut'` åºç° |
| | | - [ ] å é¤è¿æ¡å·²éè¿çåºåº â åºå**åªå½è¿ä¸æ¬¡**ï¼åå°åºåºåï¼ï¼åè´§å°è´¦éé£ä¸è¡**æ¶å¤±** |
| | | - [ ] å é¤åéå®å°è´¦çãå·²åè´§æ°éãåéããæ¯å¦åè´§ãåé |
| | | - [ ] `PUT /stockOutRecord/{id}` ç¼è¾è¯¥åºåºï¼è¡¨åä¸å¸¦ `recordType`/`recordId`ï¼â åè´§å°è´¦å
³è**ä¸è¢«å²æ** |
| | | - [ ] åæ ¼åºåºï¼`type='0'`ï¼/ ä¸åæ ¼åºåºï¼`type='1'`ï¼æµç¨åå½ä¸åå½±å |
| | | - [ ] æå·¥å»ºçéå®åè´§åï¼å表ã详æ
ãåè´§ãå é¤åè½ä¸åå½±å |
| | | - [ ] åè´§å°è´¦å页 `total` ä¸å®é
è¡æ°ä¸è´ |
| | | |
| | | --- |
| | | |
| | | ## 10. ç¸å
³ææ¡£ |
| | | |
| | | - **`doc/20260921_æ²¹ååºåºå¤å°è´¦ç»å®ä¸å°è´§è®°å½å端èè°ææ¡£.md`** ââ **æ¬ææ¡£çæ¿ä»£ææ¡£ï¼ä»¥æ¤ä¸ºå** |
| | | - `doc/20260921_æ²¹ååºåºç»ä¸åºåºå£å¾å端èè°ææ¡£.md` ââ æ²¹ååºåºä¸åæåºåºç±»å«åæ¯ |
| | | - `doc/20260920_æ²¹ååºåºèå¨åè´§å°è´¦å端èè°ææ¡£.md` ââ åè´§å°è´¦å¥çº¦ã`source` åæ¯ãæ¹å·å±ç¤º |
| | | - `doc/20260920_æ²¹ååºåºç»å®éå®å°è´¦å端èè°ææ¡£.md` ââ `salesLedgerId` ç»å®ä¸ä»£å¨å°è´¦å£å¾ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # æ²¹ååºåºç»ä¸åºåºå£å¾ å端èè°ææ¡£ |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-21 |
| | | éç¨çæ¬ï¼æ¬æ¬¡åç«¯åæ´å |
| | | éæ±æ¥æºï¼ãæ²¹ååºåºå°±çæåºåºå°è´¦ï¼ä¸ç¨åºååºåºç±»å«äºã+ã代å¨åºåºä¹éè¦åºåºæ£åºåï¼éæ¹å·ï¼çæåè´§å°è´¦ã |
| | | |
| | | --- |
| | | |
| | | ## 1. å£å¾åæ´ä¸å¥è¯ |
| | | |
| | | **æ²¹ååºåºï¼`stock_out_record.type` 为空ï¼ä¸åæ `outCategory` 忝**ãéå® / ä»£å¨ / 客åä¸ç±»èµ°**åä¸å¥**è§åï¼ |
| | | |
| | | - å¿
éåºåºæ¹æ¬¡ï¼`batchNo`ï¼ |
| | | - å¿
é产åè§æ ¼ï¼`productModelId`ï¼ |
| | | - æ°å¢æ¶æ ¡éªå¯ç¨é |
| | | - 审æ¹éè¿æ¶æãè§æ ¼ + æ¹æ¬¡ãæ£ `stock_inventory` |
| | | - å é¤å·²éè¿è®°å½æ¶æåæ¹æ¬¡å½è¿ |
| | | - åºç°å¨åè´§å°è´¦ï¼`/shippingInfo/listPage`ï¼`source='oilOut'`ï¼ |
| | | |
| | | **å¯ä¸ä¿ççç±»å«å·®å¼**ï¼`outCategory='éå®'` æ¶å¿
é¡»é车è¾ï¼ç¨äºç®ã䏿¬¡å©ä½æ²¹éãï¼ï¼ä»£å¨ / 客å**ä¸è¦æ±**é车è¾ï¼æ®æ²¹æ 0 å¤çï¼å¯ç¨é = å½ååºåã |
| | | |
| | | > åæ ¼åºåºï¼`type='0'`ï¼ãä¸åæ ¼åºåºï¼`type='1'`ï¼ã以å `recordType=13` çåè´§å åºæµç¨**å®å
¨ä¸åæ¬æ¬¡å½±å**ï¼èµ°åèªåæåæ¯ã |
| | | |
| | | --- |
| | | |
| | | ## 2. åæ´èå´ |
| | | |
| | | **æ¬æ¬¡æ²¡æ DDL**ï¼æ¹çå
¨æ¯ä»£ç é»è¾ï¼ |
| | | |
| | | | æä»¶ | æ¹å¨ | |
| | | | --- | --- | |
| | | | `StockOutRecordServiceImpl#add` | æ¹æ¬¡å¿
å¡« / å¯ç¨éæ ¡éªä»ãä»
éå®ãæ¾å¼å°ãå
¨é¨æ²¹ååºåºãï¼ä»£å¨ç»å®å°è´¦æ¶è¦æ±ä¼ è§æ ¼ | |
| | | | `StockOutRecordServiceImpl#batchApprove` | æ£åºåä¸åéå®éå®ç±» | |
| | | | `StockOutRecordServiceImpl#batchDelete` | å½è¿åºåä¸åéå®éå®ç±»ï¼é¡ºå¸¦ä¿®æä¸ä¸ª `getType()` 空æé | |
| | | | `StockOutRecordServiceImpl#getOilOutAvailableQty` | å
许ä¸ä¼ `vehicleId`ï¼ä»£å¨/客忲¡æè½¦è¾ï¼ | |
| | | | `ShippingInfoMapper.xml#listPage` | åè´§å°è´¦çæ²¹ååºåºåæ¯å»æ `o.out_category = 'éå®'` è¿æ»¤ | |
| | | |
| | | --- |
| | | |
| | | ## 3. è¡ä¸ºç©éµï¼æ¹å¨å â æ¹å¨åï¼ |
| | | |
| | | | åºåºç±»å« | æ¹æ¬¡å¿
å¡« | è§æ ¼å¿
å¡« | éè½¦è¾ | æ°å¢æ ¡éªå¯ç¨é | å®¡æ¹æ£åºå | å é¤å½è¿ | è¿åè´§å°è´¦ | |
| | | | --- | --- | --- | --- | --- | --- | --- | --- | |
| | | | éå® | å¿
é¡» â **å¿
é¡»** | å¿
é¡» â **å¿
é¡»** | å¿
é¡» â **å¿
é¡»** | æ¯ â **æ¯** | æ¯ â **æ¯** | æ¯ â **æ¯** | æ¯ â **æ¯** | |
| | | | ä»£å¨ | ä¸å¿
â **å¿
é¡»** | ä¸å¿
â **å¿
é¡»** | ä¸å¿
â ä¸å¿
| å¦ â **æ¯** | å¦ â **æ¯** | å¦ â **æ¯** | å¦ â **æ¯** | |
| | | | 客å | ä¸å¿
â **å¿
é¡»** | ä¸å¿
â **å¿
é¡»** | ä¸å¿
â ä¸å¿
| å¦ â **æ¯** | å¦ â **æ¯** | å¦ â **æ¯** | å¦ â **æ¯** | |
| | | |
| | | --- |
| | | |
| | | ## 4. æ¥å£å½±å |
| | | |
| | | ### 4.1 æ°å¢æ²¹ååºåº ââ `POST /stockInventory/addOilOutRecordOnly` |
| | | |
| | | 馿¬¡è½å°ãæ²¹ååºåºãçè¯ä¹ä¸ãå端è¦ä¿è¯ï¼ |
| | | |
| | | 1. **åºåºæ¹æ¬¡ `batchNo` å¿
å¡«**ï¼ä¸åç±»å«ãåéæ¥èª `GET /stockInventory/getBatchNoQty?productModelId=xxx`ã |
| | | 2. **产åè§æ ¼ `productModelId` å¿
å¡«**ï¼ä¸åç±»å«ã |
| | | 3. **车è¾åªå¨ `outCategory='éå®'` æ¶å¿
å¡«**ï¼ä»£å¨/客åç䏿å¯éèã |
| | | 4. 代å¨åºåºè¥ç»å®äºéå®å°è´¦ï¼èµ° `salesLedgerId`ï¼ï¼**è§æ ¼ä¸å¨å°è´¦æç»é乿¾è¡**ï¼ä»£å¨å°è´¦æ¬èº«æ²¡æäº§åæç»ï¼ï¼ä½**å¿
é¡»ä¼ ä¸ä¸ªè§æ ¼**ã |
| | | |
| | | 代å¨ç»å®å°è´¦ä¸ä¼ è§æ ¼æ¶çæ¥éï¼ |
| | | |
| | | ``` |
| | | 代å¨åºåºéè¦æ£ååºå,å¿
é¡»éæ©äº§åè§æ ¼,éå®ååå·:XS20260901-001 |
| | | ``` |
| | | |
| | | ### 4.2 å¯ç¨éæ¥è¯¢ ââ `GET /stockOutRecord/oilOutAvailableQty` |
| | | |
| | | `vehicleId` å为**å¯é**ï¼ |
| | | |
| | | - ä¼ äºè½¦è¾ï¼éå®ç±»ï¼â å¯ç¨é = 䏿¬¡å©ä½æ²¹é + å½ååºå |
| | | - ä¸ä¼ 车è¾ï¼ä»£å¨/客åï¼â 䏿¬¡å©ä½æ 0 â å¯ç¨é = å½ååºå |
| | | |
| | | `productModelId` **ä»ç¶æ¯å¿
å¡«**ï¼ä¸ä¼ æ¥ `请å
éæ©äº§åè§æ ¼`ã |
| | | |
| | | ### 4.3 å®¡æ¹ ââ `POST /stockOutRecord/approve` |
| | | |
| | | 审æ¹éè¿æ¶æã`product_model_id` + `batch_no`ãæ£ `stock_inventory.qualitity`ï¼æ£åéåè¿ `deduct_quantity`ã**ææåºåºç±»å«é½æ£**ï¼ä¸ååªæéå®ç±»ã |
| | | |
| | | åºåä¸è¶³æ¶æ´æ¹åæ»æ¥ `åºåä¸è¶³æ æ³åºåº,åºåºæ¹æ¬¡:CKâ¦`ã |
| | | |
| | | ### 4.4 å é¤ ââ `DELETE /stockOutRecord/{ids}` |
| | | |
| | | å é¤**å·²éè¿**çæ²¹ååºåºè®°å½æ¶ï¼æåæ¹æ¬¡å½è¿åºåï¼å½è¿éå `deduct_quantity`ï¼æ¹é å审æ¹éè¿çè®°å½æ²¡æè¯¥å¼ï¼æå
¨é¢å½è¿ï¼ã |
| | | |
| | | > **顺带修ç Bug**ï¼å `batchDelete` ç¨ `stockOutRecord.getType().equals("0")` 夿忝ï¼èæ²¹ååºåºç `type` æ¯ **NULL** â å é¤ä»»ä½æ²¹ååºåºé½ä¼æ `NullPointerException`ãå·²æ¹ä¸ºå¸¸éå¨åç `"0".equals(...)`ï¼åæ¶æå
åº `else` 忝æåæ²¹ååºåºå½è¿é»è¾ã**è¿æ¯æ¬æ¬¡ä¿®å¤çæ¢æç¼ºé·ï¼å端æ¤ååºçå°è¿å 餿¥ 500ã** |
| | | |
| | | ### 4.5 åè´§å°è´¦ ââ `GET /shippingInfo/listPage` |
| | | |
| | | `source='oilOut'` çè¡**ä¸åéå® `out_category='éå®'`**ï¼åªæ `approval_status = 1` è¿æ»¤ãå æ¤ï¼ |
| | | |
| | | - 代å¨ã客ååºåº**ç°å¨ä¼åºç°**å¨åè´§å°è´¦é |
| | | - è¿äºè¡ç `salesContractNo` åç»å®å°è´¦çååå·ï¼æªç»å®å°è´¦å为 `null` |
| | | - è¯¥åæ¯åæç `createUser` / `deptId` / `deptIds` æ°æ®æéè¿æ»¤**ä¿æä¸å** |
| | | |
| | | > â ï¸ **2026-09-21 追å ï¼åä¸å¤©ï¼**ï¼æ²¹ååºåº**审æ¹éè¿æ¶**ï¼è¥å®ç»å®äºéå®å°è´¦ä¸è§æ ¼å¨è¯¥å°è´¦æç»éï¼å端ä¼**çæçå®åè´§å**å¹¶æè¿æ¡åºåºæ¹é æ `record_type='13'`ãè¿ç±»è¡ä»æ¤èµ°**åè´§å忝**ï¼`source='shipping'`ï¼`id` æ¯åè´§å idï¼ï¼ä¸åæ¯ `source='oilOut'`ï¼`stock_record` 忝已æå®æé¤ï¼**å䏿¹è´§åªæä¸è¡**ãæªç»å°è´¦ / ä»£å¨ / åå²éççè¡**è¡ä¸ºä¸å**ãè¯¦è§ **`doc/20260921_æ²¹ååºåºçæåè´§å°è´¦ä¸éå®å°è´¦ç¶æåæ¥å端èè°ææ¡£.md`**ã |
| | | |
| | | --- |
| | | |
| | | ## 5. æ¥éææ¡å¯¹ç
§ |
| | | |
| | | | åºæ¯ | æ§ææ¡ | æ°ææ¡ | |
| | | | --- | --- | --- | |
| | | | 没éåºåºæ¹æ¬¡ | `éå®ç±»åºåºå¿
须鿩åºåºæ¹æ¬¡` | `æ²¹ååºåºå¿
须鿩åºåºæ¹æ¬¡` | |
| | | | æ°é为空æ ⤠0 | `éå®ç±»åºåºæ°éå¿
须大äº0` | `æ²¹ååºåºæ°éå¿
须大äº0` | |
| | | | 没é产åè§æ ¼ | ï¼æ ï¼åä»
éå®ç±»èµ°å°è´¦æ ¡éªï¼ | `æ²¹ååºåºå¿
é¡»éæ©äº§åè§æ ¼` | |
| | | | 代å¨ç»å°è´¦æ²¡éè§æ ¼ | ï¼æ ï¼å䏿 ¡éªï¼ | `代å¨åºåºéè¦æ£ååºå,å¿
é¡»éæ©äº§åè§æ ¼,éå®ååå·:xxx` | |
| | | | å¯ç¨éæ¥è¯¢æ²¡ä¼ è§æ ¼ | `请å
éæ©äº§åè§æ ¼` | `请å
éæ©äº§åè§æ ¼`ï¼ä¸åï¼ | |
| | | | 没é车è¾ï¼ä»
éå®ç±»ï¼ | `éå®ç±»åºåºå¿
é¡»éæ©è½¦è¾` | `éå®ç±»åºåºå¿
é¡»éæ©è½¦è¾`ï¼ä¸åï¼ | |
| | | |
| | | 失败ååºä»æ¯ `code=500` + HTTP 200ï¼å端å¤å¤±è´¥è¦ç `code`ã |
| | | |
| | | --- |
| | | |
| | | ## 6. å·²ç¥å½±å |
| | | |
| | | 1. **åå²ä»£å¨/客ååºåºä¸ä¼è¢«è¡¥æ£åºå**ãå®ä»¬å½å没æ£è¿ï¼ç°å¨ä¹ä¸ä¼è¡¥ãå
¶ä¸å·²å®¡æ¹éè¿çè¡ä¼**çªç¶åºç°å¨åè´§å°è´¦é**ï¼æ¹å被 `out_category` è¿æ»¤æäºï¼ï¼å¯è½é æä¸å¡ä¾§ãæä¹å¤äºå æ¡ãççé®ã |
| | | 2. **代å¨åºåºç°å¨å¿
é¡»æè§æ ¼**ãåå²ä»£å¨åºåºè®°å½å¤§å¤æ²¡æ `product_model_id`ï¼è¿äºèè®°å½**å 餿¶ä¼èµ°å½è¿é»è¾ä½åä¸å°æ¹æ¬¡/è§æ ¼èç´æ¥è·³è¿**ï¼`returnOilOutStock` æ `batchNo` ä¸ºç©ºå³ return çä¿æ¤ï¼ï¼ä¸ä¼æ¥éï¼ä¹ä¸ä¼è¯¯å åºåã |
| | | 3. **代å¨/客ååºåºç°å¨ä¼æ£åºå**ãè¥ä¸å¡ä¸ã客åãæ¯å®¢æ·èªå·±çæ²¹ãä¸åºè¯¥å¨ææ¹å¯å®åºåï¼éè¦å¨æ°æ®ä¸åºåââå½åå®ç°ä¸è§åä»ï¼è¿æ¯æ¬æ¬¡ç¡®è®¤è¿çå£å¾ã |
| | | 4. **审æ¹éè¿ååæ¹æ°é/æ¹æ¬¡ä¸åæ¥åºå**ï¼æ¢æå®ç°ï¼æ¬æ¬¡æªæ¹ï¼ãè¦æ¹æ°é请å
å é¤ï¼ä¼å½è¿ï¼åéå¼ã |
| | | 5. **æ£ååªæ ¡éª `qualitity >= åºåºæ°é`ï¼ä¸èè `locked_quantity`ï¼å»ç»éï¼**ï¼ä¸æ¢æ `type=0/1` 忝ä¸è´ã |
| | | 6. **审æ¹éè¿æ¶ä¼é¡ºå¸¦çæåè´§å**ï¼ä»
éç»å®äºåæ²¹å°è´¦ä¸è§æ ¼å¨æç»éçåºåºï¼ï¼è¯¥åºåºè®°å½ `record_type` å为 `'13'`ã`record_id` æååè´§åï¼å¹¶å æ¤è¿å
¥è´¢å¡éå®åºåºå°è´¦ / å¼ç¥¨ç³è¯·åé / æ¶æ¬¾åé / 客æ·éå®ç»è®¡çæ `record_type='13'` çéçæ¨¡åãå é¤è¿æ¡åºåºæ¶ä¼ä¸å¹¶å²éåè´§åï¼**åºååªå½è¿ä¸æ¬¡**ãè¯¦è§ `doc/20260921_æ²¹ååºåºçæåè´§å°è´¦ä¸éå®å°è´¦ç¶æåæ¥å端èè°ææ¡£.md`ã |
| | | |
| | | --- |
| | | |
| | | ## 7. èè°èªæ¥æ¸
å |
| | | |
| | | - [ ] **éå®ç±»**åºåºä¸å¡«æ¹æ¬¡ â æäº¤æ¥ãæ²¹ååºåºå¿
须鿩åºåºæ¹æ¬¡ã |
| | | - [ ] **代å¨ç±»**åºåºä¸å¡«æ¹æ¬¡ â æäº¤æ¥ãæ²¹ååºåºå¿
须鿩åºåºæ¹æ¬¡ãï¼ä¸åæ¯ãè½æäº¤ãï¼ |
| | | - [ ] **客åç±»**åºåºä¸å¡«æ¹æ¬¡ â åä¸ |
| | | - [ ] ä»£å¨ / 客ååºåº**ä¸é车è¾**ãéäºè§æ ¼åæ¹æ¬¡ â æäº¤æå |
| | | - [ ] 代å¨ç»å®éå®å°è´¦ä½ä¸ä¼ è§æ ¼ â æ¥ã代å¨åºåºéè¦æ£ååºå,å¿
é¡»éæ©äº§åè§æ ¼,éå®ååå·:xxxã |
| | | - [ ] 代å¨ç»å®éå®å°è´¦ + ä¼ è§æ ¼ + ä¼ æ¹æ¬¡ â æäº¤æåï¼`outCategory` 为ã代å¨ã |
| | | - [ ] è° `/stockOutRecord/oilOutAvailableQty` æ¶**ä¸ä¼ `vehicleId`** â è¿åå¯ç¨é = å½ååºåï¼ä¸åæ¥éï¼ |
| | | - [ ] 代å¨åºåºå®¡æ¹éè¿ â `stock_inventory.qualitity` ææ¹æ¬¡æ£åï¼`deduct_quantity` æå¼ |
| | | - [ ] å é¤è¯¥ä»£å¨åºåºè®°å½ â åºåå½è¿å°æ£åå |
| | | - [ ] 代å¨åºåºå®¡æ¹éè¿å â **åè´§å°è´¦åºç°è¯¥è¡**ï¼`source='oilOut'`ï¼ |
| | | - [ ] å é¤ä¸æ¡**已审æ¹éè¿**çæ²¹ååºåº â **ä¸åæ¥ 500ï¼NPEï¼**ï¼åºåæ£ç¡®å½è¿ |
| | | - [ ] åæ ¼åºåºï¼`type='0'`ï¼/ ä¸åæ ¼åºåºï¼`type='1'`ï¼æµç¨**åå½ä¸åå½±å**ï¼æ°å¢ã审æ¹ãå é¤é½è¦è¯ï¼ |
| | | - [ ] åè´§å°è´¦çéå®ç±»æ²¹ååºè¡**ä»å¨**ï¼æªå å»æè¿æ»¤è丢失 |
| | | - [ ] åè´§å°è´¦å页 `total` ä¸è¡æ°ä¸è´ï¼UNION 忝æ¹å¨ï¼éç¹åå½é¡¹ï¼ |
| | | |
| | | --- |
| | | |
| | | ## 8. ç¸å
³ææ¡£ |
| | | |
| | | - `doc/20260920_æ²¹ååºåºèå¨åè´§å°è´¦å端èè°ææ¡£.md` ââ åè´§å°è´¦å¥çº¦ã`source` åæ¯ãæ¹å·å±ç¤º |
| | | - `doc/20260920_æ²¹ååºåºç»å®éå®å°è´¦å端èè°ææ¡£.md` ââ `salesLedgerId` ç»å®ä¸ä»£å¨å°è´¦å£å¾ |
| | | - `doc/20260920_车è¾ç®¡ç䏿®æ²¹èå¨å端èè°ææ¡£.md` ââ 车è¾å¯ä¸æ è¯ãæ®æ²¹èå¨ã`addOilOutRecordOnly` æ¥å£ç»è |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # éè´ç³è¯·è¡¥é½éè´å°è´¦å段 å端èè°ææ¡£ |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-21 |
| | | éç¨çæ¬ï¼æ¬æ¬¡åç«¯åæ´å |
| | | éæ±æ¥æºï¼ãæ°å¢éè´ç³è¯·è¦åæ°å¢éè´å°è´¦åæ®µä¸æ ·çåï¼ã |
| | | 对åºåç«¯ææ¡£ï¼`20260921_éè´ç³è¯·è¡¥é½éè´å°è´¦å段å端èè°ææ¡£.md` |
| | | |
| | | --- |
| | | |
| | | ## 1. ä¸å¥è¯å£å¾ |
| | | |
| | | åç«¯å¤æäº¤ç 14 ä¸ªä¸»è¡¨åæ®µãæç» `warnNum`ãéä»¶ `storageBlobDTOS` **å端已å
¨é¨æ¥æ¶å¹¶è½åº**ï¼`getById` ä¼å
¨é¨åä¼ ï¼è½¬è®¢åæ¶ä¼ä¸å¯¹ä¸æ¬å°éè´å°è´¦ã |
| | | |
| | | åæ®µåãç±»åä¸ `purchase_ledger` ä¿æä¸è´ï¼å端æäº¤çæ¥æ**ä¸ç¨æ¹**ï¼åæ ·æäº¤å³å¯ã |
| | | |
| | | **DDL å·²è¿ä»åº**ï¼`doc/20260921_add_ledger_fields_to_purchase_application.sql`ï¼å¼ååº / é¨ç½²åºé½è¦æ§è¡ï¼æªæ§è¡æ¶æ°å¢ä¼æ¥ Unknown columnï¼ã |
| | | |
| | | --- |
| | | |
| | | ## 2. æ°å¢çè½åºå段 |
| | | |
| | | ### 2.1 主表 `purchase_application` |
| | | |
| | | | åæ®µ | ç±»å | åå | 说æ | |
| | | | --- | --- | --- | --- | |
| | | | `purchaseContractNumber` | String | `purchase_contract_number` | éè´ååå·ï¼ç空ç±éè´å°è´¦ä¾§å¨è½¬è®¢åæ¶çæ | |
| | | | `recorderId` | Long | `recorder_id` | å½å
¥äºº idï¼**è½¬è®¢åæ¶ç¨ä½éè´å°è´¦çå½å
¥äºº**ï¼ä¸ä¼ ååéåç³è¯·äºº | |
| | | | `entryDate` | LocalDate `yyyy-MM-dd` | `entry_date` | å½å
¥æ¥æï¼ä¸ä¼ æ¶åéå `applyDate`ï¼ååéå½å¤© | |
| | | | `executionDate` | LocalDate `yyyy-MM-dd` | `execution_date` | ç¾è®¢æ¥æ | |
| | | | `bestArrivalDate` | LocalDate `yyyy-MM-dd` | `best_arrival_date` | æä½³å°ç«æ¥æï¼ä¸ `expectedArrivalDate` æ¯ä¸¤ä¸ªå段ï¼åèªç¬ç«ä¿å | |
| | | | `applicationSubmitTime` | DateTime `yyyy-MM-dd HH:mm:ss` | `application_submit_time` | ç³è¯·æäº¤æ¶é´ | |
| | | | `purchaseCategory` | String | `purchase_category` | 客å / ä»£å¨ / éè´å
¥åº / éè´ç´é | |
| | | | `logisticsMethod` | String | `logistics_method` | åå®¶é
é / å§å¤ç©æµ / 客æ·èªæ | |
| | | | `pickupMethod` | String | `pickup_method` | æä¸æè´§ / æè´§ | |
| | | | `oilDepotId` | Long | `oil_depot_id` | éè´æ²¹åº idï¼è½¬è®¢åæ¶éè´å°è´¦ä¼æå®åå¡«æ²¹åºåç§° | |
| | | | `customerName` | String | `customer_name` | 客æ·åç§° | |
| | | | `purchaseQuantity` | Integer | `purchase_quantity` | éè´æ°éï¼å¨ï¼ï¼æ´æ° | |
| | | | `purchaseOrderStatus` | String | `purchase_order_status` | å·²ç³è¯·ï¼æªè£
车 / 以åºåï¼æªå
¥åº / å·²å
¥åºï¼æ²¿ç¨å°è´¦éå«åå£å¾ï¼ | |
| | | |
| | | ### 2.2 æç» `purchase_application_product` |
| | | |
| | | | åæ®µ | ç±»å | åå | |
| | | | --- | --- | --- | |
| | | | `warnNum` | BigDecimal | `warn_num` | |
| | | |
| | | > æç»ç `productCategory` / `specificationModel` ä»ç±å端æ `productId` / `productModelId` 忥è¦çï¼åç«¯ä¼ äºä¹ä¼è¢«è¦çï¼æ²¿ç¨å约å®ï¼ã |
| | | |
| | | ### 2.3 éä»¶ |
| | | |
| | | ä¸éè´å°è´¦å®å
¨ä¸è´ï¼ |
| | | |
| | | - **æäº¤**ï¼`storageBlobDTOS`ï¼æ°ç»ï¼ç©ºä¼ `[]`ï¼ç¼è¾æ¶å
¨éæäº¤ï¼å端å
æ¸
æ§å
³èåé建ï¼ï¼å·²ä¸ä¼ çæä»¶è¯·å¸¦ä¸å
¶ `id`ã |
| | | - **åå¡«**ï¼`getById` ååºéç **`storageBlobVOS`**ï¼æ³¨ææ¯ `VOS`ï¼ï¼æ éä»¶æ¶ä¸º `null`ã |
| | | |
| | | --- |
| | | |
| | | ## 3. æ¥å£åå |
| | | |
| | | | æ¥å£ | åå | |
| | | | --- | --- | |
| | | | `POST /purchase/application/add` | æ¥æ¶ä¸è¿°å
¨é¨åæ®µä¸ `storageBlobDTOS`ï¼è½åº | |
| | | | `POST /purchase/application/edit` | åä¸ï¼éä»¶æå
¨éæ¿æ¢å¤ç | |
| | | | `GET /purchase/application/getById` | åä¼ ä¸è¿°å
¨é¨å段 + `storageBlobVOS` | |
| | | | `GET /purchase/application/list` | **æ åå**ï¼æ¥è¯¢åæ°ä¸è¿ååæ®µåæªæ°å¢ | |
| | | | `POST /purchase/application/convertToOrder` | è§ç¬¬ 4 è | |
| | | |
| | | --- |
| | | |
| | | ## 4. 转订åï¼éç¹ï¼ |
| | | |
| | | `POST /purchase/application/convertToOrder?id={id}` 伿ç³è¯·ååæ®µä¸å¯¹ä¸æ¬å°éè´å°è´¦ï¼ |
| | | |
| | | | ç³è¯·å | â éè´å°è´¦ | |
| | | | --- | --- | |
| | | | `purchaseContractNumber` | `purchaseContractNumber`ï¼ä¸ºç©ºåæå°è´¦è§åçæï¼ | |
| | | | `recorderId` | `recorderId`ï¼æªå¡«åéç³è¯·äººï¼ | |
| | | | `entryDate` | `entryDate`ï¼æªå¡«åé `applyDate`ï¼ | |
| | | | `executionDate` | `executionDate` | |
| | | | `bestArrivalDate` | `bestArrivalDate` | |
| | | | `applicationSubmitTime` | `applicationSubmitTime` | |
| | | | `purchaseCategory` | `purchaseCategory` | |
| | | | `logisticsMethod` | `logisticsMethod` | |
| | | | `pickupMethod` | `pickupMethod` | |
| | | | `oilDepotId` | `oilDepotId` + åå¡« `oilDepotName` | |
| | | | `customerName` | `customerName` | |
| | | | `purchaseQuantity` | `purchaseQuantity` | |
| | | | `purchaseOrderStatus` | `purchaseOrderStatus` | |
| | | | æç» `warnNum` | éè´å°è´¦æç» `warnNum` | |
| | | | éä»¶ | éè´å°è´¦éä»¶ï¼å¤ç¨åä¸ä»½æä»¶ï¼åªæ¹å
³èè®°å½ï¼ | |
| | | |
| | | > 转订åä¸ååªæ¬ä¾åºå + 产åæç»ï¼ç³è¯·åéå¡«çéè´ç±»å« / æ²¹åº / æ°é / ç©æµæ¹å¼ / æè´§æ¹å¼ / å½å
¥äºº / ç¾è®¢æ¥æ / æä½³å°ç«æ¥æ / éä»¶é½ä¼åºç°å¨çæçéè´å°è´¦ä¸ã |
| | | |
| | | --- |
| | | |
| | | ## 5. èè°èªæ¥æ¸
å |
| | | |
| | | - [ ] `POST /purchase/application/add` 带å
¨é¨æ°å段 â 200ï¼ä¸**åºéè½æ¥å°å¼** |
| | | - [ ] `GET /purchase/application/getById` åä¼ `purchaseCategory` / `oilDepotId` / `purchaseQuantity` / `executionDate` / `entryDate` / `bestArrivalDate` / `recorderId` / `applicationSubmitTime` / `logisticsMethod` / `pickupMethod` / `customerName` / `purchaseOrderStatus` / `purchaseContractNumber` |
| | | - [ ] ç¼è¾é¡µæå¼ â ä¸è¿°å段å
¨é¨åå¡«ï¼ä¸åç©ºç½ |
| | | - [ ] ä¸ä¼ éä»¶ â ä¿å â éæ°æå¼ï¼`storageBlobVOS` æå¼ |
| | | - [ ] æç» `warnNum` ä¿åååæå¼æå¼ |
| | | - [ ] `purchaseQuantity` ä¼ 30 è½åï¼ä¼ `null` 䏿¥é |
| | | - [ ] `bestArrivalDate` ä¸ `expectedArrivalDate` å¡«ä¸åæ¥æ â åèªç¬ç«ä¿å |
| | | - [ ] ä¸ä¼ æ°å段ï¼èå端 / ç´æ¥è°æ¥å£ï¼â ä»ç¶ 200ï¼ä¸å æ°å段缺失æ¥é |
| | | - [ ] `POST /purchase/application/convertToOrder` â çæçéè´å°è´¦å¸¦ä¸ç¬¬ 4 èåæ®µï¼**éç¹åå½é¡¹**ï¼ï¼ä¸éä»¶å¨éè´å°è´¦è¯¦æ
éè½çå° |
| | | - [ ] éè´å°è´¦åææ°å¢ / ç¼è¾ / è½¬è®¢åæµç¨åå½ä¸åå½±å |
| | |
| | | @Schema(description = "åºåºåid") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åºåºç»å®è¡idãæ²¹ååºåºæå®¢æ·æåçè¡ææå¼ï¼ä¸ id æ¯ä¸¤ä¸ªç¬ç« id 空é´ï¼æå·¥åè´§ååºåºä¸º null") |
| | | @ExcelIgnore |
| | | private Long bindingId; |
| | | |
| | | @Schema(description = "åºåºåå·") |
| | | @Excel(name = "åºåºåå·") |
| | | private String outboundBatches; |
| | |
| | | //å¤æè¯¥åºåºè®°å½æ¯å¦æå¼ç¥¨ç³è¯· |
| | | boolean existsByStockOutRecordId(@Param("stockOutRecordIds") List<Long> stockOutRecordIds); |
| | | |
| | | //å¤æè¯¥åºåºç»å®è¡ï¼æ²¹ååºåºæå®¢æ·æåï¼æ¯å¦æå¼ç¥¨ç³è¯· |
| | | boolean existsByStockOutBindingId(@Param("stockOutBindingIds") List<Long> stockOutBindingIds); |
| | | |
| | | List<AccountInvoiceApplicationVo> selectAccountInvoiceApplicationList(@Param("customerId") Integer customerId); |
| | | } |
| | |
| | | //å¤æè¯¥åºåºè®°å½æ¯å¦ææ¶æ¬¾å |
| | | boolean existsByStockOutRecordId(@Param("stockOutRecordIds") List<Long> stockOutRecordIds); |
| | | |
| | | //å¤æè¯¥åºåºç»å®è¡ï¼æ²¹ååºåºæå®¢æ·æåï¼æ¯å¦ææ¶æ¬¾å |
| | | boolean existsByStockOutBindingId(@Param("stockOutBindingIds") List<Long> stockOutBindingIds); |
| | | |
| | | List<SalesOutboundVo> getOutboundBatchesByCustomer(@Param("customerId") Integer customerId); |
| | | |
| | | List<IncomeExpenseAnalysisDto> selectIncomeStats(@Param("startStr") String startStr, @Param("endStr") String endStr, @Param("dateFormat") String dateFormat); |
| | |
| | | private String stockOutRecordIds; |
| | | |
| | | /** |
| | | * å
³èåºåºç»å®è¡id(å¤é)ãæ²¹ååºåºæå®¢æ·ææå¤æ¡ç»å®è¡ï¼ä¸ stockOutRecordIds æ¯ä¸¤ä¸ªç¬ç«ç id 空é´ï¼ä¸è½æ··å |
| | | */ |
| | | @ApiModelProperty("å
³èåºåºç»å®è¡id(å¤é)") |
| | | private String stockOutBindingIds; |
| | | |
| | | /** |
| | | * å¼ç¥¨ç³è¯·åå· |
| | | */ |
| | | @ApiModelProperty("å¼ç¥¨ç³è¯·åå·") |
| | |
| | | private String stockOutRecordIds; |
| | | |
| | | /** |
| | | * å
³èåºåºç»å®è¡id(å¤é)ãæ²¹ååºåºæå®¢æ·ææå¤æ¡ç»å®è¡ï¼ä¸ stockOutRecordIds æ¯ä¸¤ä¸ªç¬ç«ç id 空é´ï¼ä¸è½æ··å |
| | | */ |
| | | @ApiModelProperty("å
³èåºåºç»å®è¡id(å¤é)") |
| | | private String stockOutBindingIds; |
| | | |
| | | /** |
| | | * å建人 |
| | | */ |
| | | @ApiModelProperty("å建人") |
| | |
| | | throw new ServiceException("åå¨éå¤çåºåºå"); |
| | | } |
| | | } |
| | | // æ²¹ååºåºæå®¢æ·ææå¤æ¡ç»å®è¡ï¼ä¸åºåºåæ¯ä¸¤ä¸ªç¬ç«ç id 空é´ï¼å¿
é¡»åå¼å¤é |
| | | String stockOutBindingIds = accountInvoiceApplication.getStockOutBindingIds(); |
| | | if (stockOutBindingIds != null && !stockOutBindingIds.isEmpty()) { |
| | | List<Long> bindingIds = Arrays.stream(stockOutBindingIds.split(",")) |
| | | .map(Long::valueOf) |
| | | .toList(); |
| | | if (accountInvoiceApplicationMapper.existsByStockOutBindingId(bindingIds)){ |
| | | throw new ServiceException("åå¨éå¤çåºåºå"); |
| | | } |
| | | } |
| | | return save(accountInvoiceApplication); |
| | | } |
| | | |
| | |
| | | import com.ruoyi.sales.mapper.SalesLedgerMapper; |
| | | import com.ruoyi.sales.mapper.SalesQuotationMapper; |
| | | import com.ruoyi.sales.mapper.ShippingInfoMapper; |
| | | import com.ruoyi.sales.mapper.StockOutRecordSalesLedgerMapper; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | | import com.ruoyi.sales.pojo.SalesQuotation; |
| | | import com.ruoyi.sales.pojo.ShippingInfo; |
| | | import com.ruoyi.sales.pojo.StockOutRecordSalesLedger; |
| | | import com.ruoyi.stock.mapper.StockOutRecordMapper; |
| | | import com.ruoyi.stock.pojo.StockOutRecord; |
| | | import dev.langchain4j.agent.tool.P; |
| | |
| | | private final ShippingInfoMapper shippingInfoMapper; |
| | | private final AccountSalesCollectionMapper accountSalesCollectionMapper; |
| | | private final StockOutRecordMapper stockOutRecordMapper; |
| | | private final StockOutRecordSalesLedgerMapper stockOutRecordSalesLedgerMapper; |
| | | private final AiSessionUserContext aiSessionUserContext; |
| | | |
| | | public SalesAgentTools(CustomerMapper customerMapper, |
| | |
| | | ShippingInfoMapper shippingInfoMapper, |
| | | AccountSalesCollectionMapper accountSalesCollectionMapper, |
| | | StockOutRecordMapper stockOutRecordMapper, |
| | | StockOutRecordSalesLedgerMapper stockOutRecordSalesLedgerMapper, |
| | | AiSessionUserContext aiSessionUserContext) { |
| | | this.customerMapper = customerMapper; |
| | | this.salesLedgerMapper = salesLedgerMapper; |
| | |
| | | this.shippingInfoMapper = shippingInfoMapper; |
| | | this.accountSalesCollectionMapper = accountSalesCollectionMapper; |
| | | this.stockOutRecordMapper = stockOutRecordMapper; |
| | | this.stockOutRecordSalesLedgerMapper = stockOutRecordSalesLedgerMapper; |
| | | this.aiSessionUserContext = aiSessionUserContext; |
| | | } |
| | | |
| | |
| | | result.put(entry.getKey(), ledgerIds); |
| | | } |
| | | } |
| | | mergeOilOutBindingLedgerIds(collections, result); |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * æ²¹ååºåºçæ¶æ¬¾åä¸ååºåºå idï¼åçæ¯ç»å®è¡ idï¼ä¸ä¸ªåºåºåå¯è½æå®¢æ·æç»å¤ä¸ªå°è´¦ï¼ã |
| | | * ç»å®è¡ä¸ç´æ¥å¸¦ sales_ledger_idï¼ä¸éè¦åç» shipping_info ä¸è½¬ã |
| | | */ |
| | | private void mergeOilOutBindingLedgerIds(List<AccountSalesCollection> collections, Map<Integer, Set<Long>> result) { |
| | | Map<Integer, List<Long>> bindingIdsByCollection = new HashMap<>(); |
| | | Set<Long> allBindingIds = new HashSet<>(); |
| | | for (AccountSalesCollection collection : collections) { |
| | | if (collection.getId() == null) { |
| | | continue; |
| | | } |
| | | List<Long> bindingIds = parseLongIds(collection.getStockOutBindingIds()); |
| | | if (bindingIds.isEmpty()) { |
| | | continue; |
| | | } |
| | | bindingIdsByCollection.put(collection.getId(), bindingIds); |
| | | allBindingIds.addAll(bindingIds); |
| | | } |
| | | if (allBindingIds.isEmpty()) { |
| | | return; |
| | | } |
| | | Map<Long, Long> ledgerIdByBindingId = defaultList(stockOutRecordSalesLedgerMapper.selectByIds(allBindingIds)).stream() |
| | | .filter(item -> item.getId() != null && item.getSalesLedgerId() != null) |
| | | .collect(Collectors.toMap(StockOutRecordSalesLedger::getId, StockOutRecordSalesLedger::getSalesLedgerId, (a, b) -> a)); |
| | | |
| | | for (Map.Entry<Integer, List<Long>> entry : bindingIdsByCollection.entrySet()) { |
| | | Set<Long> ledgerIds = result.computeIfAbsent(entry.getKey(), key -> new LinkedHashSet<>()); |
| | | for (Long bindingId : entry.getValue()) { |
| | | Long ledgerId = ledgerIdByBindingId.get(bindingId); |
| | | if (ledgerId != null) { |
| | | ledgerIds.add(ledgerId); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | private boolean isSalesOutboundRecord(StockOutRecord stockOutRecord) { |
| | | if (stockOutRecord == null || !StringUtils.hasText(stockOutRecord.getRecordType())) { |
| | | return false; |
| | |
| | | SALES_LEDGER_PRODUCT_TEMPLATE("sales_ledger_product_template"), |
| | | PURCHASE_LEDGER("purchase_ledger"), |
| | | PURCHASE_LEDGER_TEMPLATE("purchase_ledger_template"), |
| | | PURCHASE_APPLICATION("purchase_application"), |
| | | // Project Management |
| | | SHIPPING_ADDRESS("shipping_address"), |
| | | ROLES("roles"), |
| | |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 车è¾ä¿¡æ¯å¯¹è±¡ vehicle |
| | |
| | | * @author ruoyi |
| | | * @date 2026-09-20 |
| | | */ |
| | | @TableName(value = "vehicle") |
| | | @TableName(value = "vehicle", autoResultMap = true) |
| | | @Data |
| | | public class Vehicle implements Serializable { |
| | | private static final long serialVersionUID = 1L; |
| | |
| | | private String remark; |
| | | |
| | | /** |
| | | * 车è¾ç
§çï¼JSONæ°ç»ï¼å
¥åä¸è¿åå为æ°ç»ï¼ |
| | | */ |
| | | @TableField(value = "vehicle_photos", typeHandler = JacksonTypeHandler.class) |
| | | private List<String> vehiclePhotos; |
| | | |
| | | /** |
| | | * å建æ¶é´ |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | |
| | | package com.ruoyi.purchase.dto; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.basic.dto.StorageBlobDTO; |
| | | import com.ruoyi.basic.dto.StorageBlobVO; |
| | | import com.ruoyi.purchase.pojo.PurchaseApplicationProduct; |
| | | 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 = "转订ååçæçéè´å°è´¦id") |
| | | private Long purchaseLedgerId; |
| | | |
| | | @Schema(description = "éè´ååå·") |
| | | private String purchaseContractNumber; |
| | | |
| | | @Schema(description = "å½å
¥äººid") |
| | | private Long recorderId; |
| | | |
| | | @Schema(description = "å½å
¥æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate entryDate; |
| | | |
| | | @Schema(description = "ç¾è®¢æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate executionDate; |
| | | |
| | | @Schema(description = "æä½³å°ç«æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate bestArrivalDate; |
| | | |
| | | @Schema(description = "ç³è¯·æäº¤æ¶é´") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime applicationSubmitTime; |
| | | |
| | | @Schema(description = "éè´ç±»å«ï¼å®¢åã代å¨ãéè´å
¥åºãéè´ç´é") |
| | | private String purchaseCategory; |
| | | |
| | | @Schema(description = "ç©æµæ¹å¼ï¼åå®¶é
éãå§å¤ç©æµã客æ·èªæ") |
| | | private String logisticsMethod; |
| | | |
| | | @Schema(description = "æè´§æ¹å¼ï¼æä¸æè´§ãæè´§") |
| | | private String pickupMethod; |
| | | |
| | | @Schema(description = "éè´æ²¹åºid") |
| | | private Long oilDepotId; |
| | | |
| | | @Schema(description = "客æ·åç§°") |
| | | private String customerName; |
| | | |
| | | @Schema(description = "éè´æ°éï¼å¨ï¼") |
| | | private Integer purchaseQuantity; |
| | | |
| | | @Schema(description = "éè´ç³è¯·è®¢åç¶æï¼å·²ç³è¯·ï¼æªè£
车 / 以åºåï¼æªå
¥åº / å·²å
¥åº") |
| | | private String purchaseOrderStatus; |
| | | |
| | | @Schema(description = "éä»¶ææ") |
| | | private List<StorageBlobDTO> storageBlobDTOS; |
| | | |
| | | @Schema(description = "éä»¶ææï¼è¯¦æ
åå¡«ï¼") |
| | | private List<StorageBlobVO> storageBlobVOS; |
| | | |
| | | @Schema(description = "ç³è¯·æ¥ææ¥è¯¢å¼å§ï¼yyyy-MM-ddï¼") |
| | | private String startDate; |
| | | |
| | |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime convertTime; |
| | | |
| | | @Schema(description = "éè´ååå·") |
| | | private String purchaseContractNumber; |
| | | |
| | | @Schema(description = "å½å
¥äººid") |
| | | private Long recorderId; |
| | | |
| | | @Schema(description = "å½å
¥æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate entryDate; |
| | | |
| | | @Schema(description = "ç¾è®¢æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate executionDate; |
| | | |
| | | @Schema(description = "æä½³å°ç«æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate bestArrivalDate; |
| | | |
| | | @Schema(description = "ç³è¯·æäº¤æ¶é´") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime applicationSubmitTime; |
| | | |
| | | @Schema(description = "éè´ç±»å«ï¼å®¢åã代å¨ãéè´å
¥åºãéè´ç´é") |
| | | private String purchaseCategory; |
| | | |
| | | @Schema(description = "ç©æµæ¹å¼ï¼åå®¶é
éãå§å¤ç©æµã客æ·èªæ") |
| | | private String logisticsMethod; |
| | | |
| | | @Schema(description = "æè´§æ¹å¼ï¼æä¸æè´§ãæè´§") |
| | | private String pickupMethod; |
| | | |
| | | @Schema(description = "éè´æ²¹åºid") |
| | | private Long oilDepotId; |
| | | |
| | | @Schema(description = "客æ·åç§°") |
| | | private String customerName; |
| | | |
| | | @Schema(description = "éè´æ°éï¼å¨ï¼") |
| | | private Integer purchaseQuantity; |
| | | |
| | | @Schema(description = "éè´ç³è¯·è®¢åç¶æï¼å·²ç³è¯·ï¼æªè£
车 / 以åºåï¼æªå
¥åº / å·²å
¥åº") |
| | | private String purchaseOrderStatus; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | |
| | | @Schema(description = "æ°é") |
| | | private BigDecimal quantity; |
| | | |
| | | @Schema(description = "é¢è¦æ°é") |
| | | private BigDecimal warnNum; |
| | | |
| | | @Schema(description = "ç¨ç") |
| | | private BigDecimal taxRate; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.basic.dto.StorageBlobDTO; |
| | | import com.ruoyi.basic.dto.StorageBlobVO; |
| | | import com.ruoyi.basic.enums.ApplicationTypeEnum; |
| | | import com.ruoyi.basic.enums.RecordTypeEnum; |
| | | import com.ruoyi.basic.mapper.ProductMapper; |
| | | import com.ruoyi.basic.mapper.ProductModelMapper; |
| | | import com.ruoyi.basic.mapper.SupplierManageMapper; |
| | | import com.ruoyi.basic.pojo.Product; |
| | | import com.ruoyi.basic.pojo.ProductModel; |
| | | import com.ruoyi.basic.pojo.SupplierManage; |
| | | import com.ruoyi.basic.utils.FileUtil; |
| | | import com.ruoyi.common.enums.PurchaseApplicationStatusEnum; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.Collections; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | |
| | | private final SysUserMapper sysUserMapper; |
| | | private final ProductMapper productMapper; |
| | | private final ProductModelMapper productModelMapper; |
| | | private final FileUtil fileUtil; |
| | | |
| | | @Override |
| | | public List<PurchaseApplication> selectApplicationList(PurchaseApplicationDto purchaseApplicationDto) { |
| | |
| | | PurchaseApplicationDto resultDto = new PurchaseApplicationDto(); |
| | | BeanUtils.copyProperties(application, resultDto); |
| | | resultDto.setProductData(listProducts(id)); |
| | | resultDto.setStorageBlobVOS(listAttachments(id)); |
| | | return resultDto; |
| | | } |
| | | |
| | |
| | | this.save(application); |
| | | |
| | | saveProducts(application.getId(), purchaseApplicationDto.getProductData()); |
| | | saveAttachments(application.getId(), purchaseApplicationDto.getStorageBlobDTOS()); |
| | | return application.getId(); |
| | | } |
| | | |
| | |
| | | purchaseApplicationProductMapper.delete(Wrappers.<PurchaseApplicationProduct>lambdaQuery() |
| | | .eq(PurchaseApplicationProduct::getPurchaseApplicationId, purchaseApplicationDto.getId())); |
| | | saveProducts(purchaseApplicationDto.getId(), purchaseApplicationDto.getProductData()); |
| | | saveAttachments(purchaseApplicationDto.getId(), purchaseApplicationDto.getStorageBlobDTOS()); |
| | | } |
| | | return updated; |
| | | } |
| | |
| | | .set(PurchaseApplication::getPurchaseLedgerId, purchaseLedgerId) |
| | | .set(PurchaseApplication::getConvertTime, LocalDateTime.now())); |
| | | return purchaseLedgerId; |
| | | } |
| | | |
| | | /** |
| | | * ä¿åéä»¶ï¼å
æ¸
空该ç³è¯·åçæ§å
³èï¼åæå端æäº¤çæä»¶å
¨éé建 |
| | | */ |
| | | private void saveAttachments(Long applicationId, List<StorageBlobDTO> storageBlobDTOS) { |
| | | fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.PURCHASE_APPLICATION, |
| | | applicationId, storageBlobDTOS); |
| | | } |
| | | |
| | | private List<StorageBlobVO> listAttachments(Long applicationId) { |
| | | return fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId( |
| | | ApplicationTypeEnum.FILE, RecordTypeEnum.PURCHASE_APPLICATION, applicationId); |
| | | } |
| | | |
| | | private List<PurchaseApplicationProduct> listProducts(Long applicationId) { |
| | |
| | | PurchaseLedgerDto purchaseLedgerDto = new PurchaseLedgerDto(); |
| | | purchaseLedgerDto.setSupplierId(application.getSupplierId()); |
| | | purchaseLedgerDto.setSupplierName(supplierManage.getSupplierName()); |
| | | purchaseLedgerDto.setRecorderId(application.getApplicantId()); |
| | | purchaseLedgerDto.setRecorderId(application.getRecorderId() != null |
| | | ? application.getRecorderId() : application.getApplicantId()); |
| | | purchaseLedgerDto.setRecorderName(application.getApplicantName()); |
| | | purchaseLedgerDto.setSalesContractNo(application.getSalesContractNo()); |
| | | purchaseLedgerDto.setSalesLedgerId(application.getSalesLedgerId()); |
| | |
| | | purchaseLedgerDto.setRemarks(application.getRemarks()); |
| | | purchaseLedgerDto.setPaymentMethod(application.getPaymentMethod()); |
| | | purchaseLedgerDto.setContractAmount(application.getContractAmount()); |
| | | LocalDate entryDate = application.getApplyDate() != null ? application.getApplyDate() : LocalDate.now(); |
| | | purchaseLedgerDto.setPurchaseContractNumber(application.getPurchaseContractNumber()); |
| | | purchaseLedgerDto.setExecutionDate(toDateOrNull(application.getExecutionDate())); |
| | | purchaseLedgerDto.setBestArrivalDate(toDateOrNull(application.getBestArrivalDate())); |
| | | purchaseLedgerDto.setApplicationSubmitTime(toDateOrNull(application.getApplicationSubmitTime())); |
| | | purchaseLedgerDto.setPurchaseCategory(application.getPurchaseCategory()); |
| | | purchaseLedgerDto.setLogisticsMethod(application.getLogisticsMethod()); |
| | | purchaseLedgerDto.setPickupMethod(application.getPickupMethod()); |
| | | purchaseLedgerDto.setOilDepotId(application.getOilDepotId()); |
| | | purchaseLedgerDto.setCustomerName(application.getCustomerName()); |
| | | purchaseLedgerDto.setPurchaseQuantity(application.getPurchaseQuantity()); |
| | | purchaseLedgerDto.setPurchaseOrderStatus(application.getPurchaseOrderStatus()); |
| | | |
| | | LocalDate entryDate = application.getEntryDate() != null ? application.getEntryDate() |
| | | : (application.getApplyDate() != null ? application.getApplyDate() : LocalDate.now()); |
| | | purchaseLedgerDto.setEntryDate(DateUtils.toDate(entryDate)); |
| | | |
| | | purchaseLedgerDto.setProductData(products.stream() |
| | | .map(this::toSalesLedgerProduct) |
| | | .collect(Collectors.toList())); |
| | | purchaseLedgerDto.setStorageBlobDTOS(toStorageBlobDtos(listAttachments(application.getId()))); |
| | | return purchaseLedgerDto; |
| | | } |
| | | |
| | | private static Date toDateOrNull(LocalDate date) { |
| | | return date == null ? null : DateUtils.toDate(date); |
| | | } |
| | | |
| | | private static Date toDateOrNull(LocalDateTime dateTime) { |
| | | return dateTime == null ? null : DateUtils.toDate(dateTime); |
| | | } |
| | | |
| | | /** |
| | | * ç³è¯·åéä»¶åæ ·å
³èå°çæçéè´å°è´¦ï¼å¤ç¨åä¸ä»½ storage_blobï¼åªæ¹å
³èè®°å½ |
| | | */ |
| | | private List<StorageBlobDTO> toStorageBlobDtos(List<StorageBlobVO> storageBlobVOS) { |
| | | if (storageBlobVOS == null || storageBlobVOS.isEmpty()) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return storageBlobVOS.stream() |
| | | .map(vo -> { |
| | | StorageBlobDTO dto = new StorageBlobDTO(); |
| | | dto.setId(vo.getId()); |
| | | return dto; |
| | | }) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | private SalesLedgerProduct toSalesLedgerProduct(PurchaseApplicationProduct source) { |
| | |
| | | target.setSpecificationModel(source.getSpecificationModel()); |
| | | target.setUnit(source.getUnit()); |
| | | target.setQuantity(source.getQuantity()); |
| | | target.setWarnNum(source.getWarnNum()); |
| | | target.setTaxRate(source.getTaxRate()); |
| | | target.setTaxInclusiveUnitPrice(source.getTaxInclusiveUnitPrice()); |
| | | target.setTaxInclusiveTotalPrice(source.getTaxInclusiveTotalPrice()); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.sales.controller; |
| | | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Log; |
| | | import com.ruoyi.framework.aspectj.lang.enums.BusinessType; |
| | | import com.ruoyi.framework.web.controller.BaseController; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.sales.dto.SalesLedgerArrivalDto; |
| | | import com.ruoyi.sales.service.ISalesLedgerArrivalService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.web.bind.annotation.DeleteMapping; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * éå®å°è´¦å°è´§è®°å½Controller |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-09-21 |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/salesLedgerArrival") |
| | | @Tag(name = "éå®å°è´¦å°è´§è®°å½") |
| | | @AllArgsConstructor |
| | | public class SalesLedgerArrivalController extends BaseController { |
| | | |
| | | private final ISalesLedgerArrivalService salesLedgerArrivalService; |
| | | |
| | | @GetMapping("/listPage") |
| | | @Operation(summary = "å°è´§è®°å½å表") |
| | | public AjaxResult listPage(Page page, SalesLedgerArrivalDto req) { |
| | | return AjaxResult.success(salesLedgerArrivalService.listPage(page, req)); |
| | | } |
| | | |
| | | @GetMapping("/bindableVehicles") |
| | | @Operation(summary = "å¯å°è´§è½¦è¾ä¸æ") |
| | | public AjaxResult bindableVehicles(Long salesLedgerId) { |
| | | return AjaxResult.success(salesLedgerArrivalService.bindableVehicles(salesLedgerId)); |
| | | } |
| | | |
| | | @PostMapping("/add") |
| | | @Operation(summary = "æ°å¢å°è´§è®°å½") |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @Log(title = "éå®å°è´¦å°è´§è®°å½", businessType = BusinessType.INSERT) |
| | | public AjaxResult add(@RequestBody SalesLedgerArrivalDto req) { |
| | | return salesLedgerArrivalService.addArrival(req) |
| | | ? AjaxResult.success("æ·»å æå") : AjaxResult.error("æ·»å 失败"); |
| | | } |
| | | |
| | | @PostMapping("/update") |
| | | @Operation(summary = "ä¿®æ¹å°è´§è®°å½") |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @Log(title = "éå®å°è´¦å°è´§è®°å½", businessType = BusinessType.UPDATE) |
| | | public AjaxResult update(@RequestBody SalesLedgerArrivalDto req) { |
| | | return salesLedgerArrivalService.updateArrival(req) |
| | | ? AjaxResult.success("ä¿®æ¹æå") : AjaxResult.error("ä¿®æ¹å¤±è´¥"); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤å°è´§è®°å½") |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @Log(title = "éå®å°è´¦å°è´§è®°å½", businessType = BusinessType.DELETE) |
| | | public AjaxResult delete(@RequestBody List<Long> ids) { |
| | | return salesLedgerArrivalService.deleteArrivals(ids) |
| | | ? AjaxResult.success("å 餿å") : AjaxResult.error("å é¤å¤±è´¥"); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.sales.dto; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.ruoyi.sales.pojo.SalesLedgerArrival; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * å°è´§è®°å½ æ¥è¯¢/å±ç¤ºåºåï¼åæ¶ç¨äºå
¥åï¼å端å¤ä¼ çå±ç¤ºå段ä¼è¢«å¿½ç¥ï¼ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-09-21 |
| | | */ |
| | | @Data |
| | | public class SalesLedgerArrivalDto extends SalesLedgerArrival { |
| | | |
| | | /** |
| | | * éå®ååå· |
| | | */ |
| | | @TableField(exist = false) |
| | | private String salesContractNo; |
| | | |
| | | /** |
| | | * 客æ·åç§° |
| | | */ |
| | | @TableField(exist = false) |
| | | private String customerName; |
| | | |
| | | /** |
| | | * åºåºåå·ï¼stock_out_record.outbound_batchesï¼ |
| | | */ |
| | | @TableField(exist = false) |
| | | private String outboundBatches; |
| | | |
| | | /** |
| | | * è§æ ¼åå· |
| | | */ |
| | | @TableField(exist = false) |
| | | private String specificationModel; |
| | | |
| | | /** |
| | | * 产ååç§° |
| | | */ |
| | | @TableField(exist = false) |
| | | private String productName; |
| | | |
| | | /** |
| | | * åä½ |
| | | */ |
| | | @TableField(exist = false) |
| | | private String unit; |
| | | |
| | | /** |
| | | * 该å°è´¦å¨è¯¥åºåºåä¸åæå°çåºåºæ°é(å¨)ï¼è½¦è¾ä¸æç¨ |
| | | */ |
| | | @TableField(exist = false) |
| | | private BigDecimal outQuantity; |
| | | |
| | | /** |
| | | * 该åºåºå累计已å°è´§æ°é(å¨)ï¼è½¦è¾ä¸æç¨ |
| | | */ |
| | | @TableField(exist = false) |
| | | private BigDecimal arrivedQuantity; |
| | | |
| | | /** |
| | | * å建人æµç§° |
| | | */ |
| | | @TableField(exist = false) |
| | | private String createBy; |
| | | } |
| | |
| | | @Schema(description = "å¨ç½å·") |
| | | private String tankNo; |
| | | |
| | | @Schema(description = "å¨ä½ï¼ç±»å=代卿¶ä½¿ç¨ï¼éå¡«ï¼") |
| | | private BigDecimal tonnage; |
| | | |
| | | @Schema(description = "审æ¹ç¶æï¼å¾
审æ¹/å®¡æ ¸ä¸/éè¿/æç»") |
| | | private String approvalStatus; |
| | | |
| | |
| | | * æ¹å·æç»ï¼ä»
source=oilOut æå¼ï¼ï¼ä¸æ¡æ²¹ååºåºå¯¹åºä¸ä¸ªæ¹å·ï¼ |
| | | * ä¾åè´§å°è´¦è¯¦æ
å¼¹æ¡çãæ¹å·ãæç»è¡¨å±ç¤º |
| | | */ |
| | | @TableField(exist = false) |
| | | private List<ShippingProductDetailDto> batchNoList; |
| | | |
| | | /** |
| | | * å°è´§è®°å½åè¡ï¼ä»
source=oilOut æå¼ï¼ï¼ä¸æ¬¡åè´§å¯ä»¥åå¤è¶å°è´§ï¼ |
| | | * ç¶è¡æ¯æ²¹ååºåºåï¼åè¡å°±æ¯å®ä¸é¢çå°è´§è®°å½ |
| | | */ |
| | | @TableField(exist = false) |
| | | private List<SalesLedgerArrivalDto> children; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.sales.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.sales.dto.SalesLedgerArrivalDto; |
| | | import com.ruoyi.sales.pojo.SalesLedgerArrival; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * éå®å°è´¦å°è´§è®°å½Mapperæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-09-21 |
| | | */ |
| | | public interface SalesLedgerArrivalMapper extends BaseMapper<SalesLedgerArrival> { |
| | | |
| | | /** |
| | | * å°è´§è®°å½å表 |
| | | */ |
| | | IPage<SalesLedgerArrivalDto> listPage(Page page, @Param("req") SalesLedgerArrivalDto req); |
| | | |
| | | /** |
| | | * åæ¡å°è´§è®°å½ï¼ä¿®æ¹æ¶åèº«ä»½åæ®µï¼å£å¾ä¸å表ä¸è´ï¼è·³è¿æ°æ®æéï¼ |
| | | */ |
| | | SalesLedgerArrivalDto selectArrivalById(@Param("id") Long id); |
| | | |
| | | /** |
| | | * æå°è´¦å¨æåºåºåä¸ç´¯è®¡å·²å°è´§æ°é(å¨)ï¼ç¨äºå°è´§ä¸éæ ¡éªã |
| | | * å¿
é¡»è·³è¿æ°æ®æéï¼å¦å伿¼æä»äººå½å
¥çå°è´§è®°å½ï¼å¯¼è´ä¸é被ç»è¿ |
| | | */ |
| | | BigDecimal sumArrivedQuantity(@Param("stockOutRecordId") Long stockOutRecordId, |
| | | @Param("salesLedgerId") Long salesLedgerId, |
| | | @Param("excludeId") Long excludeId); |
| | | |
| | | /** |
| | | * æåºåºåæ¹éåå°è´§è®°å½ï¼åè´§å°è´¦ç»è£
åè¡ç¨ï¼ |
| | | */ |
| | | List<SalesLedgerArrivalDto> listByStockOutRecordIds(@Param("stockOutRecordIds") List<Long> stockOutRecordIds); |
| | | |
| | | /** |
| | | * å¯å°è´§ç车è¾ä¸æï¼åªåºç»å®äºè¯¥å°è´¦ãä¸å®¡æ¹éè¿çåºåºè®°å½éç¨è¿ç车 |
| | | */ |
| | | List<SalesLedgerArrivalDto> bindableVehicles(@Param("salesLedgerId") Long salesLedgerId); |
| | | |
| | | /** |
| | | * 该åºåºåä¸å·²æå¤å°æ¡å°è´§è®°å½ãå é¤åºåºå / æ¹ç»å°è´¦çå®å«ï¼å¿
é¡»è·³è¿æ°æ®æéï¼ |
| | | * å¦åçä¸å°å«äººå½çå°è´§è®°å½ï¼å®å«ä¼è¢«ç»è¿ |
| | | */ |
| | | Long countByStockOutRecordId(@Param("stockOutRecordId") Long stockOutRecordId); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.sales.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.sales.pojo.StockOutRecordSalesLedger; |
| | | |
| | | /** |
| | | * åºåºè®°å½-éå®å°è´¦ç»å®Mapperæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-09-21 |
| | | */ |
| | | public interface StockOutRecordSalesLedgerMapper extends BaseMapper<StockOutRecordSalesLedger> { |
| | | } |
| | |
| | | @Excel(name = "å¨ç½å·") |
| | | private String tankNo; |
| | | |
| | | @Schema(description = "å¨ä½ï¼ç±»å=代卿¶ä½¿ç¨ï¼éå¡«ï¼") |
| | | @Excel(name = "å¨ä½") |
| | | private BigDecimal tonnage; |
| | | |
| | | @Schema(description = "审æ¹ç¶æï¼å¾
审æ¹/å®¡æ ¸ä¸/éè¿/æç»") |
| | | @Excel(name = "审æ¹ç¶æ") |
| | | private String approvalStatus; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.sales.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.FieldFill; |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * éå®å°è´¦å°è´§è®°å½å¯¹è±¡ sales_ledger_arrival |
| | | * <p> |
| | | * æå¨ã䏿¬¡åè´§ãï¼æ²¹ååºåºåï¼ä¸ï¼éå®å°è´¦çãå·²åè´§æ°é / æ¯å¦åè´§ãç±æ¬è¡¨æ¨å¯¼ã |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-09-21 |
| | | */ |
| | | @TableName(value = "sales_ledger_arrival", autoResultMap = true) |
| | | @Data |
| | | public class SalesLedgerArrival implements Serializable { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @TableId(type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | /** |
| | | * éå®å°è´¦idï¼sales_ledger.idï¼ |
| | | */ |
| | | private Long salesLedgerId; |
| | | |
| | | /** |
| | | * éå®å°è´¦é宿ç»idï¼sales_ledger_product.idï¼type=1ï¼ |
| | | */ |
| | | private Long salesLedgerProductId; |
| | | |
| | | /** |
| | | * åºåºè®°å½idï¼stock_out_record.idï¼ï¼å³åè´§å°è´¦çç¶è¡ |
| | | */ |
| | | private Long stockOutRecordId; |
| | | |
| | | /** |
| | | * 车è¾idï¼vehicle.idï¼ |
| | | */ |
| | | private Long vehicleId; |
| | | |
| | | /** |
| | | * å°è´§è½¦çå· |
| | | */ |
| | | private String truckPlateNo; |
| | | |
| | | /** |
| | | * å°è´§æ°é(å¨) |
| | | */ |
| | | private BigDecimal arrivalQuantity; |
| | | |
| | | /** |
| | | * å°è´§æ¥æ |
| | | */ |
| | | private LocalDate arrivalDate; |
| | | |
| | | /** |
| | | * éä»¶ï¼JSONæ°ç»ï¼å /common/public/upload çæ°¸ä¹
previewURLï¼ |
| | | */ |
| | | @TableField(value = "attachments", typeHandler = JacksonTypeHandler.class) |
| | | private List<String> attachments; |
| | | |
| | | private String remark; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private LocalDateTime createTime; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long createUser; |
| | | |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private LocalDateTime updateTime; |
| | | |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Long updateUser; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.sales.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.FieldFill; |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * åºåºè®°å½-éå®å°è´¦ç»å®å¯¹è±¡ stock_out_record_sales_ledger |
| | | * <p> |
| | | * 䏿¬¡æ²¹ååºåºå¯ç»å®å¤ä¸ªéå®å°è´¦ï¼å¯¹åºå¤ä¸ªå®¢æ·ï¼ï¼æ¯è¡å¸¦æ¬å°è´¦åæå°çåºåºæ°éã |
| | | * ç»å®è¡¨ææ¯æå¨æ°æ®æºï¼{@code stock_out_record.sales_ledger_id/customer_id/customer_name} |
| | | * åªåä½é¦é¡¹ï¼ä¾æ¢æåå°è´¦æ¥è¯¢å±ç¤ºç¨ã |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-09-21 |
| | | */ |
| | | @TableName("stock_out_record_sales_ledger") |
| | | @Data |
| | | public class StockOutRecordSalesLedger implements Serializable { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @TableId(type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | /** |
| | | * åºåºè®°å½idï¼stock_out_record.idï¼ |
| | | */ |
| | | private Long stockOutRecordId; |
| | | |
| | | /** |
| | | * éå®å°è´¦idï¼sales_ledger.idï¼ |
| | | */ |
| | | private Long salesLedgerId; |
| | | |
| | | /** |
| | | * éå®å°è´¦é宿ç»idï¼sales_ledger_product.idï¼type=1ï¼ |
| | | */ |
| | | private Long salesLedgerProductId; |
| | | |
| | | /** |
| | | * 客æ·idï¼åä½èªå°è´¦ï¼ |
| | | */ |
| | | private Long customerId; |
| | | |
| | | /** |
| | | * 客æ·åç§°ï¼åä½èªå°è´¦ï¼ |
| | | */ |
| | | private String customerName; |
| | | |
| | | /** |
| | | * æ¬å°è´¦å¯¹åºçåºåºæ°é(å¨) |
| | | */ |
| | | private BigDecimal quantity; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private LocalDateTime createTime; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long createUser; |
| | | |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private LocalDateTime updateTime; |
| | | |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Long updateUser; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.sales.service; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.sales.dto.SalesLedgerArrivalDto; |
| | | import com.ruoyi.sales.pojo.SalesLedgerArrival; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * éå®å°è´¦å°è´§è®°å½Serviceæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-09-21 |
| | | */ |
| | | public interface ISalesLedgerArrivalService extends IService<SalesLedgerArrival> { |
| | | |
| | | /** |
| | | * å°è´§è®°å½å表 |
| | | */ |
| | | IPage<SalesLedgerArrivalDto> listPage(Page page, SalesLedgerArrivalDto req); |
| | | |
| | | /** |
| | | * å¯å°è´§ç车è¾ä¸æï¼åªåºç»å®äºè¯¥å°è´¦ãä¸å®¡æ¹éè¿çåºåºè®°å½éç¨è¿ç车 |
| | | */ |
| | | List<SalesLedgerArrivalDto> bindableVehicles(Long salesLedgerId); |
| | | |
| | | /** |
| | | * æ°å¢å°è´§è®°å½ |
| | | */ |
| | | boolean addArrival(SalesLedgerArrivalDto req); |
| | | |
| | | /** |
| | | * ä¿®æ¹å°è´§è®°å½ |
| | | */ |
| | | boolean updateArrival(SalesLedgerArrivalDto req); |
| | | |
| | | /** |
| | | * æ¹éå é¤å°è´§è®°å½ |
| | | */ |
| | | boolean deleteArrivals(List<Long> ids); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.sales.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.enums.ReviewStatusEnum; |
| | | import com.ruoyi.common.exception.base.BaseException; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.sales.dto.SalesLedgerArrivalDto; |
| | | import com.ruoyi.sales.mapper.SalesLedgerArrivalMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerMapper; |
| | | import com.ruoyi.sales.mapper.StockOutRecordSalesLedgerMapper; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | | import com.ruoyi.sales.pojo.SalesLedgerArrival; |
| | | import com.ruoyi.sales.pojo.StockOutRecordSalesLedger; |
| | | import com.ruoyi.sales.service.ISalesLedgerArrivalService; |
| | | import com.ruoyi.stock.mapper.StockOutRecordMapper; |
| | | import com.ruoyi.stock.pojo.StockOutRecord; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * éå®å°è´¦å°è´§è®°å½Serviceä¸å¡å±å¤ç |
| | | * <p> |
| | | * å°è´§è®°å½æå¨ã䏿¬¡åè´§ãï¼æ²¹ååºåºåï¼ä¸ï¼åºåºåä¸éå®å°è´¦ç对åºå
³ç³»ç±ç»å®è¡¨ |
| | | * stock_out_record_sales_ledger ç»åºï¼æç» idã车è¾ã车çä¸å¾ä»¥åºåºå为åï¼ä¸ä¿¡åç«¯ä¼ å
¥ã |
| | | * 代å¨å°è´¦ä¸äº§ç»å®è¡ï¼åºåºåçåå¼å sales_ledger_id å³ä¸ºæå¨å¯¹åºå
³ç³»ï¼è§ requireBindingï¼ã |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-09-21 |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class SalesLedgerArrivalServiceImpl extends ServiceImpl<SalesLedgerArrivalMapper, SalesLedgerArrival> |
| | | implements ISalesLedgerArrivalService { |
| | | |
| | | private static final String LEDGER_TYPE_DEPOSIT = "代å¨"; |
| | | |
| | | private final SalesLedgerArrivalMapper salesLedgerArrivalMapper; |
| | | private final StockOutRecordSalesLedgerMapper stockOutRecordSalesLedgerMapper; |
| | | private final StockOutRecordMapper stockOutRecordMapper; |
| | | private final SalesLedgerMapper salesLedgerMapper; |
| | | |
| | | @Override |
| | | public IPage<SalesLedgerArrivalDto> listPage(Page page, SalesLedgerArrivalDto req) { |
| | | // 该æ¥è¯¢ç¨ /*data_scope*/ è·³è¿æ°æ®æéï¼è MP é»è®¤ä¼æ count è¯å¥ä¼åæãSELECT COUNT(*) FROM 主表 WHERE ...ãï¼ |
| | | // ä¼ååæ è®°ä¸¢å¤±ãcount åè¢«è¿½å æéæ¡ä»¶ï¼total 伿¯å®é
å°ãå
³æ count ä¼ååéåæãSELECT COUNT(*) FROM (åå¥) TOTALã |
| | | page.setOptimizeCountSql(false); |
| | | return salesLedgerArrivalMapper.listPage(page, req); |
| | | } |
| | | |
| | | @Override |
| | | public List<SalesLedgerArrivalDto> bindableVehicles(Long salesLedgerId) { |
| | | if (salesLedgerId == null) { |
| | | throw new BaseException("è¯·ä¼ å
¥éå®å°è´¦id"); |
| | | } |
| | | return salesLedgerArrivalMapper.bindableVehicles(salesLedgerId); |
| | | } |
| | | |
| | | @Override |
| | | public boolean addArrival(SalesLedgerArrivalDto req) { |
| | | if (req == null) { |
| | | throw new BaseException("å°è´§è®°å½ä¸è½ä¸ºç©º"); |
| | | } |
| | | StockOutRecord outRecord = requireApprovedOilOut(req.getStockOutRecordId()); |
| | | StockOutRecordSalesLedger binding = requireBinding(outRecord, req.getSalesLedgerId()); |
| | | applyOutRecordVehicle(req, outRecord); |
| | | req.setSalesLedgerProductId(binding.getSalesLedgerProductId()); |
| | | checkArrivalQuantity(req, binding, null); |
| | | req.setId(null); |
| | | return save(req); |
| | | } |
| | | |
| | | @Override |
| | | public boolean updateArrival(SalesLedgerArrivalDto req) { |
| | | if (req == null || req.getId() == null) { |
| | | throw new BaseException("è¯·ä¼ æ¥å°è´§è®°å½id"); |
| | | } |
| | | SalesLedgerArrivalDto existing = salesLedgerArrivalMapper.selectArrivalById(req.getId()); |
| | | if (existing == null) { |
| | | throw new BaseException("该å°è´§è®°å½ä¸åå¨,æ æ³ä¿®æ¹,id:" + req.getId()); |
| | | } |
| | | // åºåºå/å°è´¦æ¯è®°å½ç身份ï¼å端ä¸åä¼ å°±æ²¿ç¨åå¼ï¼æ¹äºåææ°èº«ä»½éæ°æ ¡éª |
| | | Long stockOutRecordId = req.getStockOutRecordId() != null |
| | | ? req.getStockOutRecordId() : existing.getStockOutRecordId(); |
| | | Long salesLedgerId = req.getSalesLedgerId() != null |
| | | ? req.getSalesLedgerId() : existing.getSalesLedgerId(); |
| | | StockOutRecord outRecord = requireApprovedOilOut(stockOutRecordId); |
| | | StockOutRecordSalesLedger binding = requireBinding(outRecord, salesLedgerId); |
| | | req.setStockOutRecordId(stockOutRecordId); |
| | | req.setSalesLedgerId(salesLedgerId); |
| | | req.setSalesLedgerProductId(binding.getSalesLedgerProductId()); |
| | | applyOutRecordVehicle(req, outRecord); |
| | | if (req.getArrivalQuantity() == null) { |
| | | req.setArrivalQuantity(existing.getArrivalQuantity()); |
| | | } |
| | | checkArrivalQuantity(req, binding, req.getId()); |
| | | return updateById(req); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean deleteArrivals(List<Long> ids) { |
| | | if (CollectionUtils.isEmpty(ids)) { |
| | | throw new BaseException("è¯·ä¼ å
¥è¦å é¤çå°è´§è®°å½id"); |
| | | } |
| | | return removeByIds(ids); |
| | | } |
| | | |
| | | /** |
| | | * åºåºåå¿
é¡»æ¯ã审æ¹éè¿çæ²¹ååºåºãï¼type 为空ï¼ï¼å¦åå®ä¸æ¯åè´§å°è´¦çç¶è¡ï¼æå°è´§è®°å½ä¼åæå¤å¿ |
| | | */ |
| | | private StockOutRecord requireApprovedOilOut(Long stockOutRecordId) { |
| | | if (stockOutRecordId == null) { |
| | | throw new BaseException("è¯·éæ©åºåºå"); |
| | | } |
| | | StockOutRecord outRecord = stockOutRecordMapper.selectById(stockOutRecordId); |
| | | if (outRecord == null) { |
| | | throw new BaseException("æéåºåºåä¸åå¨,åºåºåid:" + stockOutRecordId); |
| | | } |
| | | if (!ReviewStatusEnum.APPROVED.getCode().equals(outRecord.getApprovalStatus())) { |
| | | throw new BaseException("åºåºåæªå®¡æ¹éè¿,ä¸è½ç»è®°å°è´§,åºåºåå·:" + outRecord.getOutboundBatches()); |
| | | } |
| | | if (StringUtils.isNotEmpty(outRecord.getType())) { |
| | | throw new BaseException("该åºåºå䏿¯æ²¹ååºåº,ä¸è½ç»è®°å°è´§,åºåºåå·:" + outRecord.getOutboundBatches()); |
| | | } |
| | | return outRecord; |
| | | } |
| | | |
| | | /** |
| | | * å°è´¦å¿
é¡»ä¸è¯¥åºåºåæç»å®å
³ç³» ââ ç»å®è¡åæ¶ç»åºæç» id 忬å°è´¦åæå°çåºåºæ°éï¼å°è´§ä¸éï¼ã |
| | | * ä¸è½ç stock_out_record.sales_ledger_idï¼é£ä¸ååªåäºé¦é¡¹å°è´¦ã |
| | | * 代å¨ä¾å¤ï¼ä»£å¨ä¸äº§ç»å®è¡ï¼ç»å®è¡åæ¶æ¯å¼ç¥¨/æ¶æ¬¾åéçæ°æ®æºï¼ä»£å¨ä¸è½è¿ï¼ï¼ä½å®ã䏿¬¡åºåºåªè½ç»ä¸ä¸ªå°è´¦ãï¼ |
| | | * åå¼ååèæå¨ï¼æ
ææ´ååºåºéé ä¸è¡ä¸´æ¶çç»å®ï¼ä¸è½åºï¼ç¨äºåç»æ ¡éª |
| | | */ |
| | | private StockOutRecordSalesLedger requireBinding(StockOutRecord outRecord, Long salesLedgerId) { |
| | | if (salesLedgerId == null) { |
| | | throw new BaseException("è¯·éæ©éå®å°è´¦"); |
| | | } |
| | | SalesLedger salesLedger = salesLedgerMapper.selectById(salesLedgerId); |
| | | if (salesLedger == null) { |
| | | throw new BaseException("æééå®å°è´¦ä¸åå¨,éå®å°è´¦id:" + salesLedgerId); |
| | | } |
| | | StockOutRecordSalesLedger binding = stockOutRecordSalesLedgerMapper.selectOne( |
| | | Wrappers.<StockOutRecordSalesLedger>lambdaQuery() |
| | | .eq(StockOutRecordSalesLedger::getStockOutRecordId, outRecord.getId()) |
| | | .eq(StockOutRecordSalesLedger::getSalesLedgerId, salesLedgerId)); |
| | | if (binding != null) { |
| | | return binding; |
| | | } |
| | | if (LEDGER_TYPE_DEPOSIT.equals(salesLedger.getLedgerType()) |
| | | && salesLedgerId.equals(outRecord.getSalesLedgerId())) { |
| | | StockOutRecordSalesLedger deposit = new StockOutRecordSalesLedger(); |
| | | deposit.setStockOutRecordId(outRecord.getId()); |
| | | deposit.setSalesLedgerId(salesLedgerId); |
| | | deposit.setQuantity(outRecord.getStockOutNum()); |
| | | return deposit; |
| | | } |
| | | throw new BaseException("该åºåºåæªç»å®æ¤éå®å°è´¦,ä¸è½ç»è®°å°è´§"); |
| | | } |
| | | |
| | | /** |
| | | * 䏿¬¡åºåºåªå¯¹åºä¸è¾è½¦ï¼è½¦è¾ä¸è½¦çä¸å¾ååºåºåä¸ç»è®°çï¼åç«¯ä¼ çåªç¨äºæ¯å¯¹ã |
| | | * åºåºå没ç»è®°è½¦è¾æ¶ï¼ä»£å¨/客ååºåºä¸å¼ºå¶é车ï¼å
许ç空ï¼ä¸é»å¡ç»è®° |
| | | */ |
| | | private void applyOutRecordVehicle(SalesLedgerArrivalDto req, StockOutRecord outRecord) { |
| | | if (outRecord.getVehicleId() == null) { |
| | | req.setVehicleId(null); |
| | | req.setTruckPlateNo(null); |
| | | return; |
| | | } |
| | | if (req.getVehicleId() != null && !req.getVehicleId().equals(outRecord.getVehicleId())) { |
| | | throw new BaseException("æé车è¾ä¸è¯¥åºåºåç»è®°ç车è¾ä¸ä¸è´,åºåºåå·:" + outRecord.getOutboundBatches()); |
| | | } |
| | | req.setVehicleId(outRecord.getVehicleId()); |
| | | req.setTruckPlateNo(outRecord.getTruckPlateNo()); |
| | | } |
| | | |
| | | /** |
| | | * å°è´§æ°éä¸é = 该å°è´¦å¨æ¬åºåºåä¸åæå°çæ°éï¼ä¸æ¯å°è´¦æç»çååæ°éï¼å¦åæ¡ä¸ä½ãå°è´§è¶
è¿å®åãï¼ |
| | | */ |
| | | private void checkArrivalQuantity(SalesLedgerArrivalDto req, StockOutRecordSalesLedger binding, Long excludeId) { |
| | | BigDecimal quantity = req.getArrivalQuantity(); |
| | | if (quantity == null || quantity.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new BaseException("å°è´§æ°éå¿
须大äº0"); |
| | | } |
| | | BigDecimal limit = binding.getQuantity() == null ? BigDecimal.ZERO : binding.getQuantity(); |
| | | BigDecimal arrived = salesLedgerArrivalMapper.sumArrivedQuantity( |
| | | binding.getStockOutRecordId(), binding.getSalesLedgerId(), excludeId); |
| | | if (arrived.add(quantity).compareTo(limit) > 0) { |
| | | throw new BaseException("å°è´§æ°éè¶
åºè¯¥å°è´¦æ¬æ¬¡åºåºæ°é,åºåºæ°é:" + limit.toPlainString() |
| | | + ",å·²å°è´§:" + arrived.toPlainString()); |
| | | } |
| | | } |
| | | } |
| | |
| | | import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; |
| | | import com.ruoyi.purchase.pojo.PurchaseLedger; |
| | | import com.ruoyi.quality.mapper.QualityInspectMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerArrivalMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerProductMapper; |
| | | import com.ruoyi.sales.mapper.ShippingInfoMapper; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | | import com.ruoyi.sales.pojo.SalesLedgerArrival; |
| | | import com.ruoyi.sales.pojo.SalesLedgerProduct; |
| | | import com.ruoyi.sales.pojo.ShippingInfo; |
| | | import com.ruoyi.sales.service.ISalesLedgerProductService; |
| | |
| | | @Autowired |
| | | private SalesLedgerMapper salesLedgerMapper; |
| | | @Autowired |
| | | private SalesLedgerArrivalMapper salesLedgerArrivalMapper; |
| | | @Autowired |
| | | private PurchaseLedgerMapper purchaseLedgerMapper; |
| | | @Autowired |
| | | private ProductionPlanMapper productionPlanMapper; |
| | |
| | | List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectSalesLedgerProductList(salesLedgerProduct); |
| | | if(!CollectionUtils.isEmpty(salesLedgerProducts)){ |
| | | salesLedgerProducts.forEach(item -> { |
| | | // åè´§ä¿¡æ¯ï¼åææ°ä¸æ¡ï¼åªæ¥è¯¢å®¡æ ¸éè¿æå·²åè´§çè®°å½ï¼ |
| | | ShippingInfo latestShippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>() |
| | | .eq(ShippingInfo::getSalesLedgerProductId, item.getId()) |
| | | .in(ShippingInfo::getStatus, "å®¡æ ¸éè¿", "å·²åè´§") |
| | | .orderByDesc(ShippingInfo::getCreateTime) |
| | | .last("limit 1")); |
| | | if(latestShippingInfo != null){ |
| | | item.setShippingDate(latestShippingInfo.getShippingDate()); |
| | | item.setExpressCompany(latestShippingInfo.getExpressCompany()); |
| | | item.setExpressNumber(latestShippingInfo.getExpressNumber()); |
| | | // åè´§ä¿¡æ¯ï¼æ²¹ååºåºä¸å产åè´§åï¼æ¹æå°è´§è®°å½åå¡«ï¼å°è´§æ¥æåææ°ä¸æ¡ï¼å¿«éåæ®µå¯¹æ´è½¦æ²¹åæ æä¹ï¼çç©ºï¼ |
| | | List<SalesLedgerArrival> arrivals = salesLedgerArrivalMapper.selectList(new LambdaQueryWrapper<SalesLedgerArrival>() |
| | | .eq(SalesLedgerArrival::getSalesLedgerProductId, item.getId()) |
| | | .orderByAsc(SalesLedgerArrival::getArrivalDate) |
| | | .orderByAsc(SalesLedgerArrival::getId)); |
| | | if(CollectionUtils.isEmpty(arrivals)){ |
| | | return; |
| | | } |
| | | // 车çå·ï¼åææå®¡æ ¸éè¿æå·²åè´§è®°å½ç车çå·ï¼éå·æ¼æ¥ |
| | | List<ShippingInfo> allShippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>() |
| | | .eq(ShippingInfo::getSalesLedgerProductId, item.getId()) |
| | | .in(ShippingInfo::getStatus, "å®¡æ ¸éè¿", "å·²åè´§") |
| | | .orderByAsc(ShippingInfo::getCreateTime)); |
| | | if(!CollectionUtils.isEmpty(allShippingInfos)){ |
| | | String carNumbers = allShippingInfos.stream() |
| | | .map(ShippingInfo::getShippingCarNumber) |
| | | SalesLedgerArrival latest = arrivals.get(arrivals.size() - 1); |
| | | item.setShippingDate(latest.getArrivalDate() == null ? null : java.sql.Date.valueOf(latest.getArrivalDate())); |
| | | // 车çå·ï¼ææå°è´§è®°å½ç车çå·ï¼å»éåéå·æ¼æ¥ |
| | | String carNumbers = arrivals.stream() |
| | | .map(SalesLedgerArrival::getTruckPlateNo) |
| | | .filter(carNo -> carNo != null && !carNo.trim().isEmpty()) |
| | | .distinct() |
| | | .collect(Collectors.joining(",")); |
| | | item.setShippingCarNumber(carNumbers); |
| | | } |
| | | }); |
| | | } |
| | | return salesLedgerProducts; |
| | |
| | | import com.ruoyi.quality.mapper.QualityInspectMapper; |
| | | import com.ruoyi.sales.dto.*; |
| | | import com.ruoyi.sales.mapper.CommonFileMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerArrivalMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerProductMapper; |
| | | import com.ruoyi.sales.mapper.ShippingInfoMapper; |
| | | import com.ruoyi.sales.pojo.CommonFile; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | | import com.ruoyi.sales.pojo.SalesLedgerArrival; |
| | | import com.ruoyi.sales.pojo.SalesLedgerProduct; |
| | | import com.ruoyi.sales.pojo.ShippingInfo; |
| | | import com.ruoyi.sales.service.ISalesLedgerService; |
| | |
| | | private static final String LEDGER_TYPE_OIL = "åæ²¹"; |
| | | /** éå®ç±»åï¼ä»£å¨ï¼ååå¨ä½ç½®ï¼èµ°æ²¹åº+å¨ç½+æå·¥ååéé¢ï¼ */ |
| | | private static final String LEDGER_TYPE_DEPOSIT = "代å¨"; |
| | | /** åè´§ç¶æï¼æå°è´§è®°å½å³è§ä¸ºå·²åè´§ï¼æ²¹ååºåºä¸å产åè´§åï¼ */ |
| | | private static final String SHIPPING_STATUS_SHIPPED = "å·²åè´§"; |
| | | private final SalesLedgerMapper salesLedgerMapper; |
| | | private final SalesLedgerArrivalMapper salesLedgerArrivalMapper; |
| | | private final CustomerMapper customerMapper; |
| | | private final SalesLedgerProductMapper salesLedgerProductMapper; |
| | | private final SalesLedgerProductServiceImpl salesLedgerProductServiceImpl; |
| | |
| | | for (SalesLedgerProduct product : products) { |
| | | product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName()); |
| | | product.setRegisterDate(LocalDateTime.now()); |
| | | // åè´§ä¿¡æ¯ |
| | | ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>() |
| | | .eq(ShippingInfo::getSalesLedgerProductId, product.getId()) |
| | | .orderByDesc(ShippingInfo::getCreateTime) |
| | | // åè´§ç¶æï¼æ²¹ååºåºä¸å产åè´§åï¼æ¹ä¸ºãæå°è´§è®°å½å³å·²åè´§ã |
| | | SalesLedgerArrival arrival = salesLedgerArrivalMapper.selectOne(new LambdaQueryWrapper<SalesLedgerArrival>() |
| | | .eq(SalesLedgerArrival::getSalesLedgerProductId, product.getId()) |
| | | .orderByDesc(SalesLedgerArrival::getArrivalDate) |
| | | .orderByDesc(SalesLedgerArrival::getId) |
| | | .last("limit 1")); |
| | | if (shippingInfo != null) { |
| | | product.setShippingStatus(shippingInfo.getStatus()); |
| | | if (arrival != null) { |
| | | product.setShippingStatus(SHIPPING_STATUS_SHIPPED); |
| | | } |
| | | } |
| | | |
| | |
| | | for (SalesLedgerProduct product : products) { |
| | | product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName()); |
| | | product.setRegisterDate(LocalDateTime.now()); |
| | | // åè´§ä¿¡æ¯ |
| | | ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>() |
| | | .eq(ShippingInfo::getSalesLedgerProductId, product.getId()) |
| | | .orderByDesc(ShippingInfo::getCreateTime) |
| | | // åè´§ä¿¡æ¯ï¼æ²¹ååºåºä¸å产åè´§åï¼æ¹æææ°ä¸æ¡å°è´§è®°å½åå¡« |
| | | SalesLedgerArrival arrival = salesLedgerArrivalMapper.selectOne(new LambdaQueryWrapper<SalesLedgerArrival>() |
| | | .eq(SalesLedgerArrival::getSalesLedgerProductId, product.getId()) |
| | | .orderByDesc(SalesLedgerArrival::getArrivalDate) |
| | | .orderByDesc(SalesLedgerArrival::getId) |
| | | .last("limit 1")); |
| | | product.setShippingCarNumber(shippingInfo.getShippingCarNumber()); |
| | | product.setShippingDate(shippingInfo.getShippingDate()); |
| | | if (shippingInfo != null) { |
| | | product.setShippingStatus(shippingInfo.getStatus()); |
| | | if (arrival != null) { |
| | | product.setShippingCarNumber(arrival.getTruckPlateNo()); |
| | | product.setShippingDate(arrival.getArrivalDate() == null ? null : java.sql.Date.valueOf(arrival.getArrivalDate())); |
| | | product.setShippingStatus(SHIPPING_STATUS_SHIPPED); |
| | | } |
| | | } |
| | | // è¿æ»¤åªä¿çåè´§è®°å½ |
| | |
| | | salesLedger.setOilDepotName(null); |
| | | salesLedger.setTankId(null); |
| | | salesLedger.setTankNo(null); |
| | | salesLedger.setTonnage(null); |
| | | // updateById ä¼è·³è¿ nullï¼å¯¹ä¿®æ¹æ¯ç©ºæä½ï¼æ°å¢æ¶ä¸æ¹é åä¸è´ï¼æ¬å°±ä¸º nullï¼ |
| | | salesLedger.setContractAmount(null); |
| | | return; |
| | |
| | | import com.ruoyi.framework.security.LoginUser; |
| | | import com.ruoyi.procurementrecord.bean.vo.ShippingProductVo; |
| | | import com.ruoyi.procurementrecord.utils.StockUtils; |
| | | import com.ruoyi.sales.dto.SalesLedgerArrivalDto; |
| | | import com.ruoyi.sales.dto.ShippingApproveDto; |
| | | import com.ruoyi.sales.dto.ShippingInfoDto; |
| | | import com.ruoyi.sales.dto.ShippingProductDetailDto; |
| | | import com.ruoyi.sales.mapper.SalesLedgerArrivalMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerProductMapper; |
| | | import com.ruoyi.sales.mapper.ShippingInfoMapper; |
| | | import com.ruoyi.sales.mapper.ShippingProductDetailMapper; |
| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @author :yys |
| | |
| | | |
| | | private final ShippingInfoMapper shippingInfoMapper; |
| | | |
| | | private final SalesLedgerArrivalMapper salesLedgerArrivalMapper; |
| | | |
| | | private final SalesLedgerProductMapper salesLedgerProductMapper; |
| | | |
| | |
| | | public IPage<ShippingInfoDto> listPage(Page page, ShippingInfo req) { |
| | | IPage<ShippingInfoDto> listPage = shippingInfoMapper.listPage(page, req); |
| | | listPage.getRecords().forEach(item -> { |
| | | item.setStorageBlobVOs(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, item.getId())); |
| | | // æ²¹ååºåºè¡æ²¡æ shipping_product_detailï¼æ¹å·æç»åªè½ç±åºåºè®°å½èªèº«å段æé |
| | | if (SOURCE_OIL_OUT.equals(item.getSource())) { |
| | | // æ²¹ååºåºè¡ç id æ¯ stock_out_record.idï¼ä¸ shipping_info.id åå伿å·ï¼ |
| | | // ç¨å®å»æ¥éä»¶åªä¼æåºå«çåè´§åçå¾ï¼ç´¢æ§ä¸æ¥ï¼éä»¶æå¨å°è´§è®°å½åè¡ä¸ |
| | | // æ²¹ååºåºè¡æ²¡æ shipping_product_detailï¼æ¹å·æç»åªè½ç±åºåºè®°å½èªèº«å段æé |
| | | item.setBatchNoList(buildOilOutBatchNoList(item)); |
| | | return; |
| | | } |
| | | item.setStorageBlobVOs(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, item.getId())); |
| | | }); |
| | | assembleArrivals(listPage.getRecords()); |
| | | return listPage; |
| | | } |
| | | |
| | | /** |
| | | * åè´§å°è´¦å±çº§åï¼ç¶è¡ = 䏿¬¡åè´§ï¼åè´§å / æ²¹ååºåºåï¼ï¼åè¡ = 该åºåºåä¸çå°è´§è®°å½ã |
| | | * <p> |
| | | * 廿䏿å°è´§è®°å½ UNION è¿å页 SQLï¼ç°æ UNION çæ¯ä¸è¡å¤©ç¶å°±æ¯ä¸ä¸ªç¶è¡ï¼ç¶è¡ç»´åº¦çåé¡µä¸ |
| | | * total å·²ç»æ£ç¡®ï¼æ··å
¥åè¡ä¼æå¤§æ¡æ°ï¼ä¸ {@code getDateilByShippingNo} å¤ç¨åä¸ listPage å |
| | | * 第ä¸è¡æ¶ä¼éé»åéãæ¹æä»å·²å页çç¶è¡éæ¶é idï¼ä¸æ¬¡æ¹éæ¥åè¡ï¼é¿å
N+1ã |
| | | */ |
| | | private void assembleArrivals(List<ShippingInfoDto> records) { |
| | | List<Long> stockOutRecordIds = records.stream() |
| | | .filter(item -> SOURCE_OIL_OUT.equals(item.getSource()) && item.getStockOutRecordId() != null) |
| | | .map(ShippingInfoDto::getStockOutRecordId) |
| | | .toList(); |
| | | if (stockOutRecordIds.isEmpty()) { |
| | | return; |
| | | } |
| | | Map<Long, List<SalesLedgerArrivalDto>> arrivalMap = salesLedgerArrivalMapper |
| | | .listByStockOutRecordIds(stockOutRecordIds).stream() |
| | | .collect(Collectors.groupingBy(SalesLedgerArrivalDto::getStockOutRecordId)); |
| | | records.forEach(item -> { |
| | | if (!SOURCE_OIL_OUT.equals(item.getSource()) || item.getStockOutRecordId() == null) { |
| | | return; |
| | | } |
| | | List<SalesLedgerArrivalDto> arrivals = arrivalMap.get(item.getStockOutRecordId()); |
| | | item.setChildren(arrivals == null ? new ArrayList<>() : new ArrayList<>(arrivals)); |
| | | }); |
| | | } |
| | | |
| | | /** |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void cancelByOutbound(Long shippingInfoId) { |
| | | if (shippingInfoId == null) { |
| | | // <=0 å¿
é¡»æ¡ä½ï¼æ²¹ååºåºç record_id æ¯ 0 è record_type åæ ·æ¯ã13ãï¼ |
| | | // ä¼ 0 è¿æ¥ä¼æåç±»åçæ²¹ååºåºè®°å½å½ææ¬åè´§åçé
对åºåºæ´æ¹å æ |
| | | if (shippingInfoId == null || shippingInfoId <= 0) { |
| | | return; |
| | | } |
| | | // åæ»è¯¥åè´§åå ç¨çåºå |
| | |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Log; |
| | | import com.ruoyi.framework.aspectj.lang.enums.BusinessType; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.sales.dto.SalesLedgerDto; |
| | | import com.ruoyi.stock.dto.StockInRecordDto; |
| | | import com.ruoyi.stock.service.StockInRecordService; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | |
| | | return AjaxResult.success(); |
| | | } |
| | | |
| | | @GetMapping("/bindableSalesLedger") |
| | | @Operation(summary = "代å¨å
¥åº-å¯ç»å®çéå®è®¢åï¼ä»£å¨ç±»åéå®å°è´¦ï¼ä¸æ") |
| | | public AjaxResult bindableSalesLedger(Page page, SalesLedgerDto salesLedgerDto) { |
| | | return AjaxResult.success(stockInRecordService.listBindableSalesLedger(page, salesLedgerDto)); |
| | | } |
| | | |
| | | } |
| | |
| | | @Schema(description = "æºåå·") |
| | | private String sourceOrderNo; |
| | | |
| | | @Schema(description = "ç»å®çéå®å°è´¦ååå·ï¼ç± sales_ledger_id å
³è带åºï¼") |
| | | private String salesContractNo; |
| | | |
| | | } |
| | |
| | | private Long oilDepotId; |
| | | private String oilDepotName; |
| | | private String inboundCategory; |
| | | private Long salesLedgerId; |
| | | private Long tankId; |
| | | private String tankNo; |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | |
| | | package com.ruoyi.stock.dto; |
| | | |
| | | import com.ruoyi.sales.pojo.StockOutRecordSalesLedger; |
| | | import com.ruoyi.stock.pojo.StockOutRecord; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.AllArgsConstructor; |
| | |
| | | |
| | | @Schema(description = "è®°å½IDå表") |
| | | private List<Long> ids; |
| | | |
| | | /** |
| | | * ç»å®çéå®å°è´¦å表ï¼ä¸æ¬¡åºåºåéå¤ä¸ªå®¢æ·ï¼ãå端åªéç» salesLedgerId + quantityï¼ |
| | | * æç» id / å®¢æ· / 车ççä¸å¾ç±å端æå°è´¦ä¸åºåºåè¡¥é½ |
| | | */ |
| | | @Schema(description = "ç»å®çéå®å°è´¦å表ï¼åå°è´¦æ°éä¹åé¡»çäºæ¬æ¬¡åºåºæ°é(å¨)") |
| | | private List<StockOutRecordSalesLedger> ledgerList; |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.account.bean.dto.purchase.PurchaseInboundDto; |
| | | import com.ruoyi.account.bean.vo.purchase.PurchaseInboundVo; |
| | | import com.ruoyi.sales.dto.SalesLedgerDto; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | | import com.ruoyi.stock.dto.StockInRecordDto; |
| | | import com.ruoyi.stock.execl.StockInRecordExportData; |
| | | import com.ruoyi.stock.pojo.StockInRecord; |
| | |
| | | List<StockInRecordExportData> listStockInRecordExportData(@Param("params") StockInRecordDto stockInRecordDto); |
| | | |
| | | IPage<PurchaseInboundVo> listPageAccountPurchase(Page page, @Param("req") PurchaseInboundDto purchaseInboundDto); |
| | | |
| | | /** |
| | | * 代å¨å
¥åºå¯ç»å®çéå®è®¢åï¼éå®å°è´¦ï¼ä¸æï¼åªåº ledger_type='代å¨' çå°è´¦ã |
| | | * |
| | | * <p>éå®å°è´¦æ¯å
¥åºåè¦å¼ç¨çä¸»æ°æ®ï¼è {@code sales_ledger} ä¸å¨ {@code IgnoreTableConfig.IGNORE_TABLES} |
| | | * ç½ååéï¼æ create_user/dept_id è¿æ»¤ä¼è®©æ²¹åºè§è²éä¸å°éå®å»ºçå°è´¦ï¼æä»¥è¿éæ¾å¼è·³è¿æ°æ®æéï¼åªè¯»æ¥è¯¢ï¼ã</p> |
| | | */ |
| | | IPage<SalesLedger> bindableSalesLedgerPage(Page page, @Param("req") SalesLedgerDto salesLedgerDto); |
| | | } |
| | |
| | | @Schema(description = "å
¥åºç±»å«ï¼èªè´å
¥åº/代å¨å
¥åº") |
| | | private String inboundCategory; |
| | | |
| | | @Schema(description = "ç»å®çéå®å°è´¦idï¼éå®è®¢åï¼ï¼ä»£å¨å
¥åºå¿
å¡«") |
| | | private Long salesLedgerId; |
| | | |
| | | @Schema(description = "å¨ç½id") |
| | | private Long tankId; |
| | | |
| | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.sales.dto.SalesLedgerDto; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | | import com.ruoyi.stock.dto.StockInRecordDto; |
| | | import com.ruoyi.stock.pojo.StockInRecord; |
| | | |
| | |
| | | int batchApprove(List<Long> ids, Integer approvalStatus); |
| | | |
| | | int batchReAudit(List<Long> ids); |
| | | |
| | | /** |
| | | * 代å¨å
¥åºå¯ç»å®çéå®è®¢åï¼éå®å°è´¦ï¼ä¸æï¼åªåºã代å¨ãç±»åçå°è´¦ã |
| | | * |
| | | * @see com.ruoyi.stock.mapper.StockInRecordMapper#bindableSalesLedgerPage |
| | | */ |
| | | IPage<SalesLedger> listBindableSalesLedger(Page page, SalesLedgerDto salesLedgerDto); |
| | | } |
| | |
| | | import com.ruoyi.procurementrecord.mapper.ReturnSaleProductMapper; |
| | | import com.ruoyi.procurementrecord.pojo.ReturnManagement; |
| | | import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct; |
| | | import com.ruoyi.sales.dto.SalesLedgerDto; |
| | | import com.ruoyi.sales.mapper.SalesLedgerMapper; |
| | | import com.ruoyi.sales.mapper.ShippingInfoMapper; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | |
| | | private ShippingInfoMapper shippingInfoMapper; |
| | | private SalesLedgerMapper salesLedgerMapper; |
| | | |
| | | /** |
| | | * å
¥åºç±»å«ï¼ä»£å¨å
¥åºãåªæè¿ä¸ªç±»å«è¦æ±ç»å®éå®è®¢å |
| | | */ |
| | | private static final String INBOUND_CATEGORY_DEPOSIT = "代å¨å
¥åº"; |
| | | |
| | | /** |
| | | * éå®å°è´¦çéå®ç±»åï¼ä»£å¨ã代å¨å
¥åºåªè½ç»è¿ä¸ªç±»åçå°è´¦ |
| | | */ |
| | | private static final String LEDGER_TYPE_DEPOSIT = "代å¨"; |
| | | |
| | | @Override |
| | | public IPage<StockInRecordDto> listPage(Page page, StockInRecordDto stockInRecordDto) { |
| | | return stockInRecordMapper.listPage(page, stockInRecordDto); |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int add(StockInRecordDto stockInRecordDto) { |
| | | resolveDepositSalesLedger(stockInRecordDto); |
| | | LocalDateTime createTime = stockInRecordDto.getCreateTime(); |
| | | if (createTime == null) { |
| | | createTime = LocalDateTime.now(); |
| | |
| | | return stockInRecordMapper.insert(stockInRecord); |
| | | } |
| | | |
| | | /** |
| | | * 代å¨å
¥åºï¼inboundCategory=代å¨å
¥åºï¼å¿
é¡»ç»å®ä¸å¼ ã代å¨ãç±»åçéå®å°è´¦ï¼éå®è®¢åï¼ã |
| | | * åªåæ ¡éªä¸è½åºï¼**ä¸ç¨å°è´¦è¦ç**å
¥åºåä¸ç客æ·/æ²¹åº/å¨ç½ ââ é£å 项ä»ä»¥ç°åºå¡«å为åã |
| | | * é代å¨å
¥åºä¸ç»å°è´¦ï¼å³ä½¿åç«¯ä¼ äºä¹ç½®ç©ºï¼é¿å
è½ä¸æ æä¹çå
³èã |
| | | */ |
| | | private void resolveDepositSalesLedger(StockInRecordDto stockInRecordDto) { |
| | | if (!INBOUND_CATEGORY_DEPOSIT.equals(stockInRecordDto.getInboundCategory())) { |
| | | stockInRecordDto.setSalesLedgerId(null); |
| | | return; |
| | | } |
| | | Long salesLedgerId = stockInRecordDto.getSalesLedgerId(); |
| | | if (salesLedgerId == null) { |
| | | throw new BaseException("代å¨å
¥åºå¿
é¡»ç»å®éå®è®¢å"); |
| | | } |
| | | SalesLedger salesLedger = salesLedgerMapper.selectById(salesLedgerId); |
| | | if (salesLedger == null) { |
| | | throw new BaseException("æééå®è®¢åä¸åå¨,éå®è®¢åid:" + salesLedgerId); |
| | | } |
| | | if (!LEDGER_TYPE_DEPOSIT.equals(salesLedger.getLedgerType())) { |
| | | throw new BaseException("代å¨å
¥åºåªè½ç»å®ä»£å¨ç±»åçéå®è®¢å,éå®ååå·:" + salesLedger.getSalesContractNo()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public IPage<SalesLedger> listBindableSalesLedger(Page page, SalesLedgerDto salesLedgerDto) { |
| | | // 该æ¥è¯¢ç¨ /*data_scope*/ è·³è¿æ°æ®æéï¼è MP é»è®¤ä¼æ count è¯å¥ä¼åæãSELECT COUNT(*) FROM sales_ledger |
| | | // WHERE ...ãï¼ä¼ååæ è®°ä¸¢å¤±ï¼count åèè¢«è¿½å æéæ¡ä»¶ï¼total 伿¯å®é
è®°å½å°ãå
³æ count ä¼åå |
| | | // count éåæãSELECT COUNT(*) FROM (åå¥) TOTALãï¼æ è®°åæ ·ä¿ç |
| | | page.setOptimizeCountSql(false); |
| | | return stockInRecordMapper.bindableSalesLedgerPage(page, salesLedgerDto); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int update(Long id, StockInRecordDto stockInRecordDto) { |
| | |
| | | stockInRecordDto.setOilDepotId(stockInventoryDto.getOilDepotId()); |
| | | stockInRecordDto.setOilDepotName(stockInventoryDto.getOilDepotName()); |
| | | stockInRecordDto.setInboundCategory(stockInventoryDto.getInboundCategory()); |
| | | stockInRecordDto.setSalesLedgerId(stockInventoryDto.getSalesLedgerId()); |
| | | if (stockInventoryDto.getOilDepotId() != null && StringUtils.isEmpty(stockInRecordDto.getOilDepotName())) { |
| | | OilDepot oilDepot = oilDepotMapper.selectById(stockInventoryDto.getOilDepotId()); |
| | | if (oilDepot != null) { |
| | |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingOrder; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingOrderProduct; |
| | | import com.ruoyi.sales.dto.SalesLedgerDto; |
| | | import com.ruoyi.sales.mapper.SalesLedgerArrivalMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerProductMapper; |
| | | import com.ruoyi.sales.mapper.StockOutRecordSalesLedgerMapper; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | | import com.ruoyi.sales.pojo.SalesLedgerProduct; |
| | | import com.ruoyi.sales.pojo.StockOutRecordSalesLedger; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import com.ruoyi.stock.dto.OilOutAvailableDto; |
| | |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class StockOutRecordServiceImpl extends ServiceImpl<StockOutRecordMapper, StockOutRecord> implements StockOutRecordService { |
| | | |
| | | /** |
| | | * åºåºç±»å«ï¼éå®ãéå®ç±»æ²¹ååºåºå¨å®¡æ¹éè¿æ¶ææ¹æ¬¡æ£ååºå |
| | | * åºåºç±»å«ï¼éå®ãå¯ä¸çåºå«æ¯éå®ç±»åºåºå¿
é¡»é车è¾ãæè½¦è¾ç®ä¸æ¬¡å©ä½æ²¹éï¼ |
| | | * æ£åºåãè¿åè´§å°è´¦è¿äºå¯¹ææåºåºç±»å«ä¸è§åä» |
| | | */ |
| | | private static final String OUT_CATEGORY_SALE = "éå®"; |
| | | |
| | | /** |
| | | * åºåºç±»å«ï¼ä»£å¨ãå®¢æ·æèªå·±çæ²¹å¯å卿们çç½éï¼æèµ°åªæ¯è®°å½ä¸ç¬ï¼ä¸æ£åºåãä¸è¿åè´§å°è´¦ |
| | | * åºåºç±»å«ï¼ä»£å¨ãå®¢æ·æèªå·±çæ²¹å¯å卿们çç½éã |
| | | * åºåºè¦æ±ä¸éå®ä¸è´ï¼éæ¹æ¬¡ãå®¡æ¹æ£åºåãå é¤å½è¿ãè¿åè´§å°è´¦ï¼ï¼åªæ¯ä¸è¦æ±éè½¦è¾ |
| | | */ |
| | | private static final String OUT_CATEGORY_DEPOSIT = "代å¨"; |
| | | |
| | |
| | | private final OutsourcingOrderMapper outsourcingOrderMapper; |
| | | private final SalesLedgerMapper salesLedgerMapper; |
| | | private final SalesLedgerProductMapper salesLedgerProductMapper; |
| | | private final StockOutRecordSalesLedgerMapper stockOutRecordSalesLedgerMapper; |
| | | private final SalesLedgerArrivalMapper salesLedgerArrivalMapper; |
| | | |
| | | @Override |
| | | public IPage<StockOutRecordDto> listPage(Page page, StockOutRecordDto stockOutRecordDto) { |
| | |
| | | |
| | | @Override |
| | | public int add(StockOutRecordDto stockOutRecordDto) { |
| | | resolveSalesLedgerBinding(stockOutRecordDto); |
| | | if (OUT_CATEGORY_SALE.equals(stockOutRecordDto.getOutCategory())) { |
| | | // éå®ç±»æ²¹ååºåºå®¡æ¹éè¿æ¶è¦ææ¹æ¬¡æ£ååºåï¼æ¹æ¬¡ä¸è½ä¸ºç©º |
| | | if (StringUtils.isEmpty(stockOutRecordDto.getBatchNo())) { |
| | | throw new BaseException("éå®ç±»åºåºå¿
须鿩åºåºæ¹æ¬¡"); |
| | | } |
| | | resolveVehicle(stockOutRecordDto); |
| | | checkSaleOutAvailable(stockOutRecordDto); |
| | | } |
| | | List<StockOutRecordSalesLedger> ledgerBindings = resolveSalesLedgerBinding(stockOutRecordDto); |
| | | LocalDateTime createTime = stockOutRecordDto.getCreateTime(); |
| | | if (createTime == null) { |
| | | createTime = LocalDateTime.now(); |
| | | } |
| | | // åºåºåå·å
äºæ ¡éªçæï¼å¥½è®©æ ¡éªå¤±è´¥æ¶çæ¥é带ä¸åºåºæ¹æ¬¡ |
| | | String no = OrderUtils.countTodayByCreateTime(stockOutRecordMapper, "CK","outbound_batches", createTime); |
| | | stockOutRecordDto.setOutboundBatches(no); |
| | | stockOutRecordDto.setCreateTime(createTime); |
| | | // æ²¹ååºåºï¼type 为空ï¼å®¡æ¹éè¿æ¶ä¸å¾ææ¹æ¬¡æ£ååºåï¼æ¹æ¬¡ä¸è½ä¸ºç©ºã |
| | | // type=0/1 çåæ ¼ãä¸åæ ¼åºåºèµ°åèªåæ¯ï¼ä¸åè¿é约æ |
| | | if (StringUtils.isEmpty(stockOutRecordDto.getType())) { |
| | | if (StringUtils.isEmpty(stockOutRecordDto.getBatchNo())) { |
| | | throw new BaseException("æ²¹ååºåºå¿
须鿩åºåºæ¹æ¬¡"); |
| | | } |
| | | if (OUT_CATEGORY_SALE.equals(stockOutRecordDto.getOutCategory())) { |
| | | // åªæéå®ç±»æè½¦è¾ç®æ®æ²¹ï¼ä»£å¨/客åä¸è¦æ±éè½¦è¾ |
| | | resolveVehicle(stockOutRecordDto); |
| | | } |
| | | checkOilOutAvailable(stockOutRecordDto); |
| | | } |
| | | if (StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode().equals(stockOutRecordDto.getRecordType())){ |
| | | stockOutRecordDto.setApprovalStatus(3); |
| | | } |
| | | return stockOutRecordMapper.insert(stockOutRecordDto); |
| | | int rows = stockOutRecordMapper.insert(stockOutRecordDto); |
| | | // åºåºå id ç±èªå¢ä¸»é®åå¡«ï¼æ¿å°åæè½è½ç»å®è¡ |
| | | saveLedgerBindings(stockOutRecordDto.getId(), ledgerBindings); |
| | | return rows; |
| | | } |
| | | |
| | | @Override |
| | |
| | | throw new BaseException("该åºåºè®°å½ä¸åå¨,æ æ³æ´æ°!!!"); |
| | | } |
| | | |
| | | resolveSalesLedgerBinding(stockOutRecordDto); |
| | | String[] ignoreProperties = {"id", "outbound_batches"};//æé¤id屿§ |
| | | List<StockOutRecordSalesLedger> ledgerBindings = resolveSalesLedgerBinding(stockOutRecordDto); |
| | | // æé¤ id 屿§ï¼recordType/recordId ç±å端维æ¤ï¼æ²¹ååºåºæä¸º '1' / 0ï¼æå·¥åè´§ååºåºç±åè´§æµç¨åå
¥ï¼ï¼ |
| | | // å端ç¼è¾è¡¨åä¸åä¼ ä¼æå®ä»¬å²æ nullï¼ç ´ååºåºè®°å½çæ¥æºæ è¯ |
| | | String[] ignoreProperties = {"id", "outbound_batches", "recordType", "recordId"}; |
| | | BeanUtils.copyProperties(stockOutRecordDto, stockOutRecord, ignoreProperties); |
| | | return stockOutRecordMapper.updateById(stockOutRecord); |
| | | int rows = stockOutRecordMapper.updateById(stockOutRecord); |
| | | rebindLedger(id, ledgerBindings); |
| | | return rows; |
| | | } |
| | | |
| | | /** |
| | | * ç»å®éå®å°è´¦ï¼å®¢æ·ä¸å¾ä»¥å°è´¦ä¸ºåè¦çï¼é¿å
åºåºè®°å½ä¸å°è´¦ç客æ·å¯¹ä¸ä¸ï¼åºåºç±»å«æå°è´¦çéå®ç±»åèªå¨å®ï¼ |
| | | * å
å¾åºç°ãç»äºåæ²¹å°è´¦å´æä»£å¨ä¸æ£åºåãè¿ç±»çç¾æ°æ®ã |
| | | * ç»å®éå®å°è´¦ï¼ä¸æ¬¡åºåºå¯ä»¥åéå¤ä¸ªå®¢æ·ï¼æä»¥å°è´¦æ¯ä¸ªåè¡¨ï¼æ¯ä¸ªå°è´¦æå·¥å¡«æ¬æ¬¡åæå°çæ°éï¼ |
| | | * åå°è´¦æ°éä¹åå¿
é¡»çäºæ¬æ¬¡åºåºæ»éã客æ·ä¸å¾ä»¥å°è´¦ä¸ºåè¦çï¼åºåºç±»å«æå°è´¦çéå®ç±»åèªå¨å®ï¼ |
| | | * å
å¾åºç°ãç»äºä»£å¨å°è´¦å´æéå®è¦æ±é车è¾ãè¿ç±»çç¾æ°æ®ã |
| | | * <ul> |
| | | * <li>åæ²¹ï¼å« ledgerType 为空ï¼ï¼åºåºç±»å«ç½®ãéå®ãï¼å¹¶æ ¡éªæéè§æ ¼ç¡®å®å¨è¯¥å°è´¦çé宿ç»é</li> |
| | | * <li>代å¨ï¼åºåºç±»å«ç½®ã代å¨ãï¼å¸¦å
¥å°è´¦çæ²¹åº/å¨ç½ï¼è·³è¿äº§åæ ¡éª ââ |
| | | * 代å¨å°è´¦æ¬èº«å°±æ¯ååå¨ä½ç½®ï¼æ²¡æäº§åæç»</li> |
| | | * <li>åæ²¹ï¼å« ledgerType 为空ï¼ï¼åºåºç±»å«ç½®ãéå®ãï¼éä¸ªæ ¡éªæéè§æ ¼ç¡®å®å¨è¯¥å°è´¦çé宿ç»éï¼ |
| | | * å¹¶æå½ä¸çæç» id è½è¿ç»å®è¡ï¼åä¸å°è´¦åè§æ ¼å¤è¡æ¶åºå®å id æå°ç飿¡ï¼</li> |
| | | * <li>代å¨ï¼åºåºç±»å«ç½®ã代å¨ãï¼å¸¦å
¥å°è´¦çæ²¹åº/å¨ç½ï¼è·³è¿ãè§æ ¼æ¯å¦å¨å°è´¦æç»éãçæ ¡éª ââ |
| | | * 代å¨å°è´¦æ¬èº«å°±æ¯ååå¨ä½ç½®ã没æäº§åæç»ï¼ä½æ£åºåè¦æè§æ ¼å®ä½ï¼è§æ ¼ä»å¿
é¡»éã |
| | | * 代å¨ä¸è½ä¸å
¶ä»å°è´¦æ··ç»ï¼ä¹ä¸äº§ç»å®è¡ï¼å®çæ²¹æ¯å®¢æ·èªå·±çï¼ä¸èµ°å°è´§ï¼</li> |
| | | * </ul> |
| | | * salesLedgerId ä¸ºç©ºæ¶æ´ä½è·³è¿ï¼ä¸ç»å°è´¦çåºåºè¡ä¸ºä¸æ¹å¨åå®å
¨ä¸è´ |
| | | * |
| | | * @return å¾
è½åºçç»å®è¡ï¼null è¡¨ç¤ºæ¬æ¬¡è¯·æ±æ²¡å¸¦å°è´¦ä¿¡æ¯ï¼è°ç¨æ¹åºä¿æå·²æç»å®ä¸å |
| | | */ |
| | | private void resolveSalesLedgerBinding(StockOutRecordDto stockOutRecordDto) { |
| | | if (stockOutRecordDto.getSalesLedgerId() == null) { |
| | | return; |
| | | private List<StockOutRecordSalesLedger> resolveSalesLedgerBinding(StockOutRecordDto stockOutRecordDto) { |
| | | List<StockOutRecordSalesLedger> ledgerList = stockOutRecordDto.getLedgerList(); |
| | | if (ledgerList == null && stockOutRecordDto.getSalesLedgerId() != null) { |
| | | // å
¼å®¹åªä¼ salesLedgerId çæ§å
¥åï¼è§ä½ãç»ä¸ä¸ªå°è´¦ãæ°éå°±æ¯æ¬æ¬¡åºåºæ»éã |
| | | StockOutRecordSalesLedger single = new StockOutRecordSalesLedger(); |
| | | single.setSalesLedgerId(stockOutRecordDto.getSalesLedgerId()); |
| | | single.setQuantity(stockOutRecordDto.getStockOutNum()); |
| | | ledgerList = new ArrayList<>(); |
| | | ledgerList.add(single); |
| | | } else if (ledgerList == null) { |
| | | return null; |
| | | } |
| | | SalesLedger salesLedger = salesLedgerMapper.selectById(stockOutRecordDto.getSalesLedgerId()); |
| | | if (ledgerList.isEmpty()) { |
| | | // æç¡®çãä¸ç»å°è´¦ã |
| | | stockOutRecordDto.setSalesLedgerId(null); |
| | | return ledgerList; |
| | | } |
| | | List<SalesLedger> ledgers = new ArrayList<>(ledgerList.size()); |
| | | for (StockOutRecordSalesLedger item : ledgerList) { |
| | | if (item == null || item.getSalesLedgerId() == null) { |
| | | throw new BaseException("ç»å®çéå®å°è´¦ä¸è½ä¸ºç©º"); |
| | | } |
| | | SalesLedger salesLedger = salesLedgerMapper.selectById(item.getSalesLedgerId()); |
| | | if (salesLedger == null) { |
| | | throw new BaseException("æééå®å°è´¦ä¸åå¨,éå®å°è´¦id:" + stockOutRecordDto.getSalesLedgerId()); |
| | | throw new BaseException("æééå®å°è´¦ä¸åå¨,éå®å°è´¦id:" + item.getSalesLedgerId()); |
| | | } |
| | | stockOutRecordDto.setCustomerId(salesLedger.getCustomerId()); |
| | | stockOutRecordDto.setCustomerName(salesLedger.getCustomerName()); |
| | | if (LEDGER_TYPE_DEPOSIT.equals(salesLedger.getLedgerType())) { |
| | | ledgers.add(salesLedger); |
| | | } |
| | | // é¦é¡¹å°è´¦ç»§ç»åè¿åºåºè®°å½çåå¼åï¼åºåºç®¡çå表ãåºåæ¥è¡¨é½æå®å±ç¤º |
| | | SalesLedger first = ledgers.get(0); |
| | | stockOutRecordDto.setSalesLedgerId(first.getId()); |
| | | stockOutRecordDto.setCustomerId(first.getCustomerId()); |
| | | stockOutRecordDto.setCustomerName(first.getCustomerName()); |
| | | |
| | | boolean hasDeposit = ledgers.stream().anyMatch(item -> LEDGER_TYPE_DEPOSIT.equals(item.getLedgerType())); |
| | | if (hasDeposit) { |
| | | if (ledgers.size() > 1) { |
| | | throw new BaseException("代å¨å°è´¦ä¸è½ä¸å
¶ä»éå®å°è´¦ä¸èµ·ç»å®,䏿¬¡åºåºåªè½ç»ä¸ä¸ªä»£å¨å°è´¦"); |
| | | } |
| | | applyDepositLedger(stockOutRecordDto, first); |
| | | return new ArrayList<>(); |
| | | } |
| | | stockOutRecordDto.setOutCategory(OUT_CATEGORY_SALE); |
| | | if (stockOutRecordDto.getProductModelId() == null) { |
| | | throw new BaseException("ç»å®éå®å°è´¦æ¶å¿
é¡»éæ©äº§åè§æ ¼,éå®ååå·:" + first.getSalesContractNo()); |
| | | } |
| | | BigDecimal stockOutNum = stockOutRecordDto.getStockOutNum(); |
| | | if (stockOutNum == null || stockOutNum.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new BaseException("è¯·å¡«åæ¬æ¬¡åºåºæ°é(å¨)"); |
| | | } |
| | | BigDecimal total = BigDecimal.ZERO; |
| | | for (int index = 0; index < ledgerList.size(); index++) { |
| | | StockOutRecordSalesLedger item = ledgerList.get(index); |
| | | SalesLedger salesLedger = ledgers.get(index); |
| | | BigDecimal quantity = item.getQuantity(); |
| | | if (quantity == null || quantity.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new BaseException("æ¯ä¸ªéå®å°è´¦çç»å®æ°éå¿
须大äº0,éå®ååå·:" + salesLedger.getSalesContractNo()); |
| | | } |
| | | SalesLedgerProduct detail = findLedgerSaleDetail(salesLedger.getId(), stockOutRecordDto.getProductModelId()); |
| | | if (detail == null) { |
| | | throw new BaseException("æé产åä¸å¨è¯¥éå®å°è´¦æç»ä¸,éå®ååå·:" + salesLedger.getSalesContractNo()); |
| | | } |
| | | item.setSalesLedgerProductId(detail.getId()); |
| | | item.setCustomerId(salesLedger.getCustomerId()); |
| | | item.setCustomerName(salesLedger.getCustomerName()); |
| | | total = total.add(quantity); |
| | | } |
| | | if (total.compareTo(stockOutNum) != 0) { |
| | | throw new BaseException("åéå®å°è´¦ç»å®æ°éä¹åå¿
é¡»çäºæ¬æ¬¡åºåºæ°é,åºåºæ°é:" + toPlain(stockOutNum) |
| | | + ",ç»å®æ°éä¹å:" + toPlain(total)); |
| | | } |
| | | return ledgerList; |
| | | } |
| | | |
| | | /** |
| | | * åä¸å°è´¦å¯è½æå¤è¡åè§æ ¼çé宿ç»ï¼åºå®å id æå°ç飿¡ï¼ä¿è¯æ¯æ¬¡ç»å®çæç» id ç¨³å® |
| | | */ |
| | | private SalesLedgerProduct findLedgerSaleDetail(Long salesLedgerId, Long productModelId) { |
| | | List<SalesLedgerProduct> details = salesLedgerProductMapper.selectList( |
| | | Wrappers.<SalesLedgerProduct>lambdaQuery() |
| | | .eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId) |
| | | .eq(SalesLedgerProduct::getType, LEDGER_PRODUCT_TYPE_SALE) |
| | | .eq(SalesLedgerProduct::getProductModelId, productModelId) |
| | | .orderByAsc(SalesLedgerProduct::getId)); |
| | | return details.isEmpty() ? null : details.get(0); |
| | | } |
| | | |
| | | /** |
| | | * 代å¨å°è´¦ï¼åçæ¯åå¨ä½ç½®ã没æäº§åæç»ï¼ä½æ£åºåè¦æè§æ ¼å®ä½ï¼è§æ ¼ä»å¿
é¡»é |
| | | */ |
| | | private void applyDepositLedger(StockOutRecordDto stockOutRecordDto, SalesLedger salesLedger) { |
| | | stockOutRecordDto.setOutCategory(OUT_CATEGORY_DEPOSIT); |
| | | stockOutRecordDto.setOilDepotId(salesLedger.getOilDepotId()); |
| | | stockOutRecordDto.setOilDepotName(salesLedger.getOilDepotName()); |
| | | stockOutRecordDto.setTankId(salesLedger.getTankId()); |
| | | stockOutRecordDto.setTankNo(salesLedger.getTankNo()); |
| | | if (stockOutRecordDto.getProductModelId() == null) { |
| | | throw new BaseException("代å¨åºåºéè¦æ£ååºå,å¿
é¡»éæ©äº§åè§æ ¼,éå®ååå·:" + salesLedger.getSalesContractNo()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è½åºç»å®è¡ãæç» id / å®¢æ· / åºåºå id ä¸å¾ç¨åç«¯æ ¡éªæ¶ç®åºçå¼ï¼åç«¯ä¼ ç被è¦çã |
| | | * éæ¡ insertï¼æ¬è¡¨ä¸æ¬¡åºåºåªæå è¡ï¼ä¸ MyBaseMapper ç insertBatchSomeColumn |
| | | * 项ç®é没é
èªå®ä¹ SqlInjectorï¼æ¹æ³æ ¹æ¬æ²¡æ³¨åï¼è°ç¨ä¼æ¥ Invalid bound statementï¼ |
| | | */ |
| | | private void saveLedgerBindings(Long stockOutRecordId, List<StockOutRecordSalesLedger> bindings) { |
| | | if (stockOutRecordId == null || CollectionUtils.isEmpty(bindings)) { |
| | | return; |
| | | } |
| | | stockOutRecordDto.setOutCategory(OUT_CATEGORY_SALE); |
| | | if (stockOutRecordDto.getProductModelId() == null) { |
| | | throw new BaseException("ç»å®éå®å°è´¦æ¶å¿
é¡»éæ©äº§åè§æ ¼,éå®ååå·:" + salesLedger.getSalesContractNo()); |
| | | for (StockOutRecordSalesLedger binding : bindings) { |
| | | binding.setId(null); |
| | | binding.setStockOutRecordId(stockOutRecordId); |
| | | stockOutRecordSalesLedgerMapper.insert(binding); |
| | | } |
| | | boolean belongsToLedger = salesLedgerProductMapper.selectList( |
| | | Wrappers.<SalesLedgerProduct>lambdaQuery() |
| | | .eq(SalesLedgerProduct::getSalesLedgerId, stockOutRecordDto.getSalesLedgerId()) |
| | | .eq(SalesLedgerProduct::getType, LEDGER_PRODUCT_TYPE_SALE)) |
| | | .stream() |
| | | .anyMatch(item -> stockOutRecordDto.getProductModelId().equals(item.getProductModelId())); |
| | | if (!belongsToLedger) { |
| | | throw new BaseException("æé产åä¸å¨è¯¥éå®å°è´¦æç»ä¸,éå®ååå·:" + salesLedger.getSalesContractNo()); |
| | | } |
| | | |
| | | /** |
| | | * éæ°ç»å®å°è´¦ï¼ç»å®æ²¡åå°±åæ ·ä¸å¨ï¼ä¿ä½ç»å®è¡ idï¼ï¼åäºåå
æåºåºåç©çå æ§åéæã |
| | | * å·²ç»è®°å°è´§è®°å½æ¶ä¸å
è®¸æ¹ ââ å°è´§è®°å½æå¨ãå°è´¦Ãåºåºåãä¸ï¼æ¹ç»ä¼è®©å®æåä¸åå¨çåææ°é |
| | | */ |
| | | private void rebindLedger(Long stockOutRecordId, List<StockOutRecordSalesLedger> bindings) { |
| | | if (bindings == null) { |
| | | return; |
| | | } |
| | | List<StockOutRecordSalesLedger> existing = stockOutRecordSalesLedgerMapper.selectList( |
| | | Wrappers.<StockOutRecordSalesLedger>lambdaQuery() |
| | | .eq(StockOutRecordSalesLedger::getStockOutRecordId, stockOutRecordId)); |
| | | if (sameBinding(existing, bindings)) { |
| | | return; |
| | | } |
| | | if (salesLedgerArrivalMapper.countByStockOutRecordId(stockOutRecordId) > 0) { |
| | | throw new BaseException("该åºåºåå·²ç»è®°å°è´§è®°å½,æ æ³ä¿®æ¹ç»å®çéå®å°è´¦,åºåºåid:" + stockOutRecordId); |
| | | } |
| | | stockOutRecordSalesLedgerMapper.delete(Wrappers.<StockOutRecordSalesLedger>lambdaQuery() |
| | | .eq(StockOutRecordSalesLedger::getStockOutRecordId, stockOutRecordId)); |
| | | saveLedgerBindings(stockOutRecordId, bindings); |
| | | } |
| | | |
| | | /** |
| | | * å°è´¦ä¸åææ°éæ¯å¦å®å
¨ä¸è´ï¼é¡ºåºæ å
³ï¼ |
| | | */ |
| | | private boolean sameBinding(List<StockOutRecordSalesLedger> existing, List<StockOutRecordSalesLedger> incoming) { |
| | | if (existing.size() != incoming.size()) { |
| | | return false; |
| | | } |
| | | Map<Long, BigDecimal> existingQuantity = new HashMap<>(existing.size()); |
| | | for (StockOutRecordSalesLedger item : existing) { |
| | | existingQuantity.put(item.getSalesLedgerId(), item.getQuantity()); |
| | | } |
| | | for (StockOutRecordSalesLedger item : incoming) { |
| | | BigDecimal quantity = existingQuantity.get(item.getSalesLedgerId()); |
| | | if (quantity == null || quantity.compareTo(item.getQuantity()) != 0) { |
| | | return false; |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | |
| | | accountInvoiceApplicationMapper.existsByStockOutRecordId(ids)) { |
| | | throw new BaseException("åºåºè®°å½åå¨å¼ç¥¨æ¶æ¬¾å
³èæ°æ®,æ æ³å é¤!!!"); |
| | | } |
| | | // æ²¹ååºåºçå¼ç¥¨/æ¶æ¬¾å
³èåçæ¯ç»å®è¡ idï¼ä¸åºåºå id æ¯ä¸¤ä¸ªç¬ç« id 空é´ï¼ï¼å¿
é¡»åç¬å¤ï¼ |
| | | // å¦åç»äºå°è´¦çæ²¹ååºåºè¢«å¼ç¥¨åè¿è½å æï¼ç䏿åä¸åå¨ç»å®è¡çå
³èæ°æ® |
| | | if (!CollectionUtils.isEmpty(ids)) { |
| | | List<Long> bindingIds = stockOutRecordSalesLedgerMapper.selectList( |
| | | Wrappers.<StockOutRecordSalesLedger>lambdaQuery() |
| | | .in(StockOutRecordSalesLedger::getStockOutRecordId, ids)) |
| | | .stream().map(StockOutRecordSalesLedger::getId).toList(); |
| | | if (!CollectionUtils.isEmpty(bindingIds) |
| | | && (accountSalesCollectionMapper.existsByStockOutBindingId(bindingIds) |
| | | || accountInvoiceApplicationMapper.existsByStockOutBindingId(bindingIds))) { |
| | | throw new BaseException("åºåºè®°å½åå¨å¼ç¥¨æ¶æ¬¾å
³èæ°æ®,æ æ³å é¤!!!"); |
| | | } |
| | | } |
| | | for (Long id : ids) { |
| | | StockOutRecord stockOutRecord = stockOutRecordMapper.selectById(id); |
| | | if (stockOutRecord.getType().equals("0")) { |
| | | // å°è´§è®°å½æå¨åºåºåä¸ï¼å äºä¼åæå¤å¿ï¼éå®å°è´¦çå·²åè´§æ°éä¹å°±è¯´ä¸æ¸
äº |
| | | if (salesLedgerArrivalMapper.countByStockOutRecordId(id) > 0) { |
| | | throw new BaseException("åºåºåå·²ç»è®°å°è´§è®°å½,æ æ³å é¤,åºåºæ¹æ¬¡:" + stockOutRecord.getOutboundBatches()); |
| | | } |
| | | // ç»å®è¡æ¯åºåºåçé屿°æ®ï¼ä¸å¹¶æ¸
æï¼ä¸çæåå·²å åºåºåçå¤å¿è¡ |
| | | stockOutRecordSalesLedgerMapper.delete(Wrappers.<StockOutRecordSalesLedger>lambdaQuery() |
| | | .eq(StockOutRecordSalesLedger::getStockOutRecordId, id)); |
| | | // type 对油ååºåºæ¯ nullï¼å¸¸éåå¨åé¢é¿å
NPE |
| | | if ("0".equals(stockOutRecord.getType())) { |
| | | LambdaQueryWrapper<StockInventory> wrapper = new LambdaQueryWrapper<StockInventory>() |
| | | .eq(StockInventory::getProductModelId, stockOutRecord.getProductModelId()); |
| | | if (StringUtils.isEmpty(stockOutRecord.getBatchNo())) { |
| | |
| | | stockInventoryMapper.updateAddStockInventory(stockInRecordDto); |
| | | } |
| | | } |
| | | else if (stockOutRecord.getType().equals("1")) { |
| | | else if ("1".equals(stockOutRecord.getType())) { |
| | | LambdaQueryWrapper<StockUninventory> wrapper = new LambdaQueryWrapper<StockUninventory>() |
| | | .eq(StockUninventory::getProductModelId, stockOutRecord.getProductModelId()); |
| | | if (StringUtils.isEmpty(stockOutRecord.getBatchNo())) { |
| | |
| | | stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto); |
| | | } |
| | | } |
| | | else if (OUT_CATEGORY_SALE.equals(stockOutRecord.getOutCategory())) { |
| | | // éå®ç±»æ²¹ååºåºåªæå®¡æ¹éè¿æ¶ææ£è¿åºåï¼å é¤å·²éè¿çè®°å½éæåæ¹æ¬¡å½è¿ |
| | | returnSaleOilOutStock(stockOutRecord); |
| | | else { |
| | | // æ²¹ååºåºåªæå®¡æ¹éè¿æ¶ææ£è¿åºåï¼å é¤å·²éè¿çè®°å½éæåæ¹æ¬¡å½è¿ |
| | | returnOilOutStock(stockOutRecord); |
| | | } |
| | | } |
| | | return stockOutRecordMapper.deleteBatchIds(ids); |
| | | } |
| | | |
| | | /** |
| | | * éå®ç±»æ²¹ååºåºå½è¿åºåï¼ä»
对审æ¹éè¿ï¼å³æ£è¿åºåï¼çè®°å½çæã |
| | | * æ²¹ååºåºå½è¿åºåï¼ä»
对审æ¹éè¿ï¼å³æ£è¿åºåï¼çè®°å½çæã |
| | | * å½è¿éå deduct_quantityï¼å®é
æ£åéï¼ï¼æ¹é å审æ¹éè¿çè®°å½æ²¡æè¯¥å¼ï¼æå
¨é¢å½è¿ |
| | | */ |
| | | private void returnSaleOilOutStock(StockOutRecord stockOutRecord) { |
| | | private void returnOilOutStock(StockOutRecord stockOutRecord) { |
| | | if (!ReviewStatusEnum.APPROVED.getCode().equals(stockOutRecord.getApprovalStatus()) |
| | | || StringUtils.isEmpty(stockOutRecord.getBatchNo()) |
| | | || stockOutRecord.getStockOutNum() == null) { |
| | |
| | | stockUninventoryDto.setBatchNo(stockOutRecord.getBatchNo()); |
| | | stockUninventoryDto.setQualitity(stockOutRecord.getStockOutNum()); |
| | | stockUninventoryMapper.updateSubtractStockUnInventory(stockUninventoryDto); |
| | | } else if (OUT_CATEGORY_SALE.equals(stockOutRecord.getOutCategory())) { |
| | | // éå®ç±»æ²¹ååºåºï¼type 为空ï¼å®¡æ¹éè¿æ¶ææ¹æ¬¡æ£ååºå |
| | | deductSaleOilOutStock(stockOutRecord); |
| | | } else { |
| | | // æ²¹ååºåºï¼type 为空ï¼å®¡æ¹éè¿æ¶ææ¹æ¬¡æ£ååºåã |
| | | // ä¸åçæåè´§åï¼ä¹ä¸æ¹ record_typeï¼æ²¹ååºåºç record_type ä¸ç´æ¯ã1ãï¼ |
| | | // æ¹æã13ãä¼è®©åºåºç®¡çå表æåºåºç±»åçéæ¶çä¸å°å®ãå¤æãæ¯ä¸æ¯éå®ç±»æ²¹ååºåºã |
| | | // ä¸å¾ä»¥ binding 表ï¼stock_out_record_sales_ledgerï¼ä¸ºå |
| | | deductOilOutStock(stockOutRecord); |
| | | } |
| | | } |
| | | stockOutRecord.setApprovalStatus(approvalStatus); |
| | |
| | | } |
| | | |
| | | /** |
| | | * éå®ç±»æ²¹ååºåºæ£ååºåãåºåºæ°éæ¯æ¬æ¬¡è£
车æ»éï¼è½¦ä¸ä¸æ¬¡å©çæ²¹æ¬æ¬¡ç»§ç»ç¨ï¼ |
| | | * æä»¥åªä»åºå补足ãåºåºæ°é â 䏿¬¡å©ä½æ²¹éãçå·®é¢ã |
| | | * æ²¹ååºåºæ£ååºåãåºåºæ°éæ¯æ¬æ¬¡è£
车æ»éï¼è½¦ä¸ä¸æ¬¡å©çæ²¹æ¬æ¬¡ç»§ç»ç¨ï¼ |
| | | * æä»¥åªä»åºå补足ãåºåºæ°é â 䏿¬¡å©ä½æ²¹éãçå·®é¢ï¼ä»£å¨/客忲¡é车è¾ï¼ |
| | | * 䏿¬¡å©ä½æ²¹éæ 0 ç®ï¼å³å
¨é¢æ£åã |
| | | * updateSubtractStockInventory èªå¸¦ qualitity >= æ°é çå®å«ï¼å½±åè¡æ°ä¸º 0 å³åºåä¸è¶³ï¼ |
| | | * æéç±å¤å±äºå¡åæ» |
| | | */ |
| | | private void deductSaleOilOutStock(StockOutRecord stockOutRecord) { |
| | | private void deductOilOutStock(StockOutRecord stockOutRecord) { |
| | | String suffix = ",åºåºæ¹æ¬¡:" + stockOutRecord.getOutboundBatches(); |
| | | if (StringUtils.isEmpty(stockOutRecord.getBatchNo())) { |
| | | throw new BaseException("éå®ç±»åºåºå¿
须鿩åºåºæ¹æ¬¡" + suffix); |
| | | throw new BaseException("æ²¹ååºåºå¿
须鿩åºåºæ¹æ¬¡" + suffix); |
| | | } |
| | | if (stockOutRecord.getProductModelId() == null) { |
| | | throw new BaseException("æ²¹ååºåºå¿
é¡»éæ©äº§åè§æ ¼" + suffix); |
| | | } |
| | | BigDecimal quantity = stockOutRecord.getStockOutNum(); |
| | | if (quantity == null || quantity.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new BaseException("éå®ç±»åºåºæ°éå¿
须大äº0" + suffix); |
| | | throw new BaseException("æ²¹ååºåºæ°éå¿
须大äº0" + suffix); |
| | | } |
| | | BigDecimal lastResidual = getLastResidualOil(stockOutRecord.getVehicleId(), stockOutRecord.getProductModelId(), stockOutRecord.getId()); |
| | | if (lastResidual.compareTo(quantity) > 0) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * åºåºæ°éæ¯æ¬æ¬¡è£
车æ»éï¼å¿
é¡»è½å¨ã䏿¬¡å©ä½æ²¹é ~ 䏿¬¡å©ä½æ²¹é + åºåãåºé´å
|
| | | * åºåºæ°éæ¯æ¬æ¬¡è£
车æ»éï¼å¿
é¡»è½å¨ã䏿¬¡å©ä½æ²¹é ~ 䏿¬¡å©ä½æ²¹é + åºåãåºé´å
ã |
| | | * 代å¨/客åä¸é车è¾ï¼ä¸æ¬¡å©ä½æ²¹éæ 0 ç®ï¼éåæãä¸è¶
è¿å½ååºåã |
| | | */ |
| | | private void checkSaleOutAvailable(StockOutRecordDto stockOutRecordDto) { |
| | | private void checkOilOutAvailable(StockOutRecordDto stockOutRecordDto) { |
| | | String suffix = ",åºåºæ¹æ¬¡:" + stockOutRecordDto.getOutboundBatches(); |
| | | if (stockOutRecordDto.getProductModelId() == null) { |
| | | throw new BaseException("æ²¹ååºåºå¿
é¡»éæ©äº§åè§æ ¼" + suffix); |
| | | } |
| | | BigDecimal quantity = stockOutRecordDto.getStockOutNum(); |
| | | if (quantity == null || quantity.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new BaseException("éå®ç±»åºåºæ°éå¿
须大äº0" + suffix); |
| | | throw new BaseException("æ²¹ååºåºæ°éå¿
须大äº0" + suffix); |
| | | } |
| | | BigDecimal lastResidual = getLastResidualOil(stockOutRecordDto.getVehicleId(), stockOutRecordDto.getProductModelId(), null); |
| | | if (lastResidual.compareTo(quantity) > 0) { |
| | |
| | | |
| | | @Override |
| | | public OilOutAvailableDto getOilOutAvailableQty(StockOutRecordDto query) { |
| | | if (query == null || query.getVehicleId() == null || query.getProductModelId() == null) { |
| | | throw new BaseException("请å
éæ©è½¦è¾å产åè§æ ¼"); |
| | | if (query == null || query.getProductModelId() == null) { |
| | | throw new BaseException("请å
éæ©äº§åè§æ ¼"); |
| | | } |
| | | // 代å¨/客åä¸é车è¾ï¼ä¸æ¬¡å©ä½åä¸å°ï¼æ 0 ç®ï¼å¯ç¨éå°±çäºå½ååºå |
| | | BigDecimal lastResidualOil = getLastResidualOil(query.getVehicleId(), query.getProductModelId(), query.getId()); |
| | | BigDecimal stockQuantity = getStockQuantity(query.getProductModelId(), query.getBatchNo()); |
| | | OilOutAvailableDto result = new OilOutAvailableDto(); |
| | |
| | | GROUP_CONCAT(sour.outbound_batches SEPARATOR ',') AS outboundBatches |
| | | from account_invoice_application aia |
| | | left join customer c on aia.customer_id = c.id |
| | | <!-- æå·¥åè´§ååºåºæ stock_out_record_ids æ¾ï¼æ²¹ååºåºæç»å®è¡ stock_out_binding_ids 忥æå¨çåºåºå --> |
| | | left join stock_out_record sour on FIND_IN_SET(sour.id, aia.stock_out_record_ids) > 0 |
| | | OR EXISTS (select 1 from stock_out_record_sales_ledger b |
| | | where b.stock_out_record_id = sour.id |
| | | and FIND_IN_SET(b.id, aia.stock_out_binding_ids) > 0) |
| | | GROUP BY aia.id)A |
| | | <where> |
| | | <if test="req.customerId != null"> |
| | |
| | | </where> |
| | | order by A.id desc |
| | | </select> |
| | | <!-- å¯å¼ç¥¨çéå®åºåºåéã |
| | | â record_type='13' çæå·¥åè´§ååºåº â b.id 为 NULLï¼ç¨ stock_out_record_ids å¤éï¼ |
| | | â¡ æ²¹ååºåºï¼type ä¸ºç©ºï¼æãåºåºåÃ客æ·ãæå°ç»å®è¡ â ç¨ stock_out_binding_ids å¤éã |
| | | 两个 id 空é´é½æ¯å°æ´æ°ï¼æ··å¨ä¸åé伿å·ï¼æä»¥å¿
é¡»æ b.id æ¯å¦ä¸ºç©ºå弿¯ã --> |
| | | <select id="getOutboundBatchesByCustomer" |
| | | resultType="com.ruoyi.account.bean.vo.sales.SalesOutboundVo"> |
| | | SELECT |
| | | sor.id, |
| | | sor.outbound_batches, |
| | | sl.customer_name, |
| | | IFNULL(b.customer_name, sl.customer_name) AS customerName, |
| | | sor.create_time as shippingDate, |
| | | p.product_name, |
| | | pm.model as specification_model, |
| | | slp.tax_rate, |
| | | sor.stock_out_num * slp.tax_inclusive_unit_price as outboundAmount, |
| | | IFNULL(pb.product_name, p.product_name) AS productName, |
| | | IFNULL(pmb.model, pm.model) as specification_model, |
| | | IFNULL(slpb.tax_rate, slp.tax_rate) as tax_rate, |
| | | CASE |
| | | WHEN b.id IS NOT NULL THEN b.quantity * slpb.tax_inclusive_unit_price |
| | | ELSE sor.stock_out_num * slp.tax_inclusive_unit_price |
| | | END as outboundAmount, |
| | | s.shipping_no, |
| | | sl.sales_contract_no |
| | | IFNULL(slb.sales_contract_no, sl.sales_contract_no) as sales_contract_no, |
| | | b.id AS bindingId, |
| | | IFNULL(b.customer_id, sl.customer_id) AS customer_id |
| | | FROM stock_out_record sor |
| | | LEFT JOIN stock_out_record_sales_ledger b ON b.stock_out_record_id = sor.id |
| | | left join shipping_info s on sor.record_id = s.id |
| | | LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id |
| | | LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id and slp.type = 1 |
| | | LEFT JOIN sales_ledger slb ON slb.id = b.sales_ledger_id |
| | | LEFT JOIN sales_ledger_product slpb ON slpb.id = b.sales_ledger_product_id and slpb.type = 1 |
| | | left join product_model pm on slp.product_model_id = pm.id |
| | | left join product p on pm.product_id = p.id |
| | | WHERE sor.record_type='13' and sor.approval_status=1 |
| | | and sl.customer_id=#{customerId} |
| | | |
| | | and sor.id NOT IN ( |
| | | SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(a.stock_out_record_ids, ',', n.n), ',', -1) |
| | | FROM account_invoice_application a |
| | | CROSS JOIN ( |
| | | SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL |
| | | SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 |
| | | ) n |
| | | WHERE n.n <= CHAR_LENGTH(a.stock_out_record_ids) - CHAR_LENGTH(REPLACE(a.stock_out_record_ids, ',', '')) + 1 |
| | | and a.status!=2 |
| | | left join product_model pmb on sor.product_model_id = pmb.id |
| | | left join product pb on pmb.product_id = pb.id |
| | | WHERE sor.approval_status=1 |
| | | AND ( |
| | | sor.record_type='13' |
| | | OR (b.id IS NOT NULL AND (sor.type IS NULL OR sor.type = '')) |
| | | ) |
| | | |
| | | order by sor.id DESC |
| | | AND IFNULL(b.customer_id, sl.customer_id) = #{customerId} |
| | | AND NOT EXISTS ( |
| | | SELECT 1 |
| | | FROM account_invoice_application a |
| | | WHERE a.status != 2 |
| | | AND ( |
| | | (b.id IS NULL AND FIND_IN_SET(sor.id, a.stock_out_record_ids) > 0) |
| | | OR (b.id IS NOT NULL AND FIND_IN_SET(b.id, a.stock_out_binding_ids) > 0) |
| | | ) |
| | | ) |
| | | order by sor.id DESC, IFNULL(b.id, 0) |
| | | </select> |
| | | <select id="existsByStockOutRecordId" resultType="java.lang.Boolean"> |
| | | SELECT COUNT(*) > 0 |
| | |
| | | AND ( |
| | | <foreach collection="stockOutRecordIds" item="id" separator=" OR "> |
| | | FIND_IN_SET(#{id}, stock_out_record_ids) > 0 |
| | | </foreach> |
| | | ) |
| | | </select> |
| | | <!-- æ²¹ååºåºçç»å®è¡ä¸åºåºåæ¯ä¸¤ä¸ªç¬ç« id 空é´ï¼å¤éè¦å弿¥ --> |
| | | <select id="existsByStockOutBindingId" resultType="java.lang.Boolean"> |
| | | SELECT COUNT(*) > 0 |
| | | FROM account_invoice_application |
| | | WHERE status != 2 |
| | | AND ( |
| | | <foreach collection="stockOutBindingIds" item="id" separator=" OR "> |
| | | FIND_IN_SET(#{id}, stock_out_binding_ids) > 0 |
| | | </foreach> |
| | | ) |
| | | </select> |
| | |
| | | from account_invoice_application aia |
| | | left join customer c on aia.customer_id = c.id |
| | | left join stock_out_record sour on FIND_IN_SET(sour.id, aia.stock_out_record_ids) > 0 |
| | | OR EXISTS (select 1 from stock_out_record_sales_ledger b |
| | | where b.stock_out_record_id = sour.id |
| | | and FIND_IN_SET(b.id, aia.stock_out_binding_ids) > 0) |
| | | left join account_sales_invoice asi on aia.id = asi.account_invoice_application_id |
| | | GROUP BY aia.id |
| | | )A |
| | |
| | | GROUP_CONCAT(sour.outbound_batches SEPARATOR ',') AS outboundBatches |
| | | from account_sales_collection ascc |
| | | left join customer c on ascc.customer_id = c.id |
| | | <!-- æå·¥åè´§ååºåºæ stock_out_record_ids æ¾ï¼æ²¹ååºåºæç»å®è¡ stock_out_binding_ids 忥æå¨çåºåºå --> |
| | | left join stock_out_record sour on FIND_IN_SET(sour.id, ascc.stock_out_record_ids) > 0 |
| | | OR EXISTS (select 1 from stock_out_record_sales_ledger b |
| | | where b.stock_out_record_id = sour.id |
| | | and FIND_IN_SET(b.id, ascc.stock_out_binding_ids) > 0) |
| | | GROUP BY ascc.id)A |
| | | left join account_statement_details asd on A.collection_number = asd.receipt_number |
| | | <where> |
| | |
| | | FIND_IN_SET(#{id}, stock_out_record_ids) |
| | | </foreach> |
| | | </select> |
| | | <!-- 坿¶æ¬¾çéå®åºåºåéã |
| | | â record_type='13' çæå·¥åè´§ååºåº â b.id 为 NULLï¼å·²æ¶æ¬¾é¢æ stock_out_record_ids æ±æ»ï¼ |
| | | â¡ æ²¹ååºåºï¼type ä¸ºç©ºï¼æãåºåºåÃ客æ·ãæå°ç»å®è¡ â å·²æ¶æ¬¾é¢æ stock_out_binding_ids æ±æ»ï¼ |
| | | éé¢åªç®è¯¥å®¢æ·åæçé£é¨åã两个 id 空é´ä¸è½æ··æ¯ï¼æ
æ b.id æ¯å¦ä¸ºç©ºåå¼ã |
| | | å·²æ¶æ¬¾é¢æ¹ææ éåæ¥è¯¢ï¼åæ¥ç¨ LEFT JOIN + GROUP BY outbound_batches èåï¼ä¸æ¡ä»¶åæ |
| | | acsc.stock_out_record_ids = sor.idï¼ç弿¯éå·ä¸²ï¼ï¼ä¸ä¸ªåºåºåæ¶è¿æ¬¾åé¢çå°±åä¹å¹é
ä¸ä¸ã --> |
| | | <select id="getOutboundBatchesByCustomer" |
| | | resultType="com.ruoyi.account.bean.vo.sales.SalesOutboundVo"> |
| | | SELECT |
| | |
| | | SELECT |
| | | sor.id, |
| | | sor.outbound_batches, |
| | | sl.customer_name, |
| | | IFNULL(b.customer_name, sl.customer_name) AS customer_name, |
| | | sor.create_time AS shipping_date, |
| | | p.product_name, |
| | | pm.model AS specification_model, |
| | | slp.tax_rate, |
| | | sor.stock_out_num * slp.tax_inclusive_unit_price AS outbound_amount, |
| | | IFNULL(pb.product_name, p.product_name) AS product_name, |
| | | IFNULL(pmb.model, pm.model) AS specification_model, |
| | | IFNULL(slpb.tax_rate, slp.tax_rate) AS tax_rate, |
| | | CASE |
| | | WHEN b.id IS NOT NULL THEN b.quantity * slpb.tax_inclusive_unit_price |
| | | ELSE sor.stock_out_num * slp.tax_inclusive_unit_price |
| | | END AS outbound_amount, |
| | | s.shipping_no, |
| | | sl.sales_contract_no, |
| | | COALESCE ( SUM( acsc.collection_amount ), 0 ) AS amount_received |
| | | IFNULL(slb.sales_contract_no, sl.sales_contract_no) AS sales_contract_no, |
| | | (SELECT COALESCE(SUM(acsc.collection_amount), 0) |
| | | FROM account_sales_collection acsc |
| | | WHERE (b.id IS NULL AND FIND_IN_SET(sor.id, acsc.stock_out_record_ids) > 0) |
| | | OR (b.id IS NOT NULL AND FIND_IN_SET(b.id, acsc.stock_out_binding_ids) > 0) |
| | | ) AS amount_received |
| | | FROM |
| | | stock_out_record sor |
| | | LEFT JOIN stock_out_record_sales_ledger b ON b.stock_out_record_id = sor.id |
| | | LEFT JOIN shipping_info s ON sor.record_id = s.id |
| | | LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id |
| | | LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id |
| | | AND slp.type = 1 |
| | | LEFT JOIN sales_ledger slb ON slb.id = b.sales_ledger_id |
| | | LEFT JOIN sales_ledger_product slpb ON slpb.id = b.sales_ledger_product_id |
| | | AND slpb.type = 1 |
| | | LEFT JOIN product_model pm ON slp.product_model_id = pm.id |
| | | LEFT JOIN product p ON pm.product_id = p.id |
| | | LEFT JOIN account_sales_collection acsc ON acsc.stock_out_record_ids = sor.id |
| | | LEFT JOIN product_model pmb ON sor.product_model_id = pmb.id |
| | | LEFT JOIN product pb ON pmb.product_id = pb.id |
| | | WHERE |
| | | sor.approval_status = 1 |
| | | AND ( |
| | | sor.record_type = '13' |
| | | AND sor.approval_status = 1 |
| | | AND sl.customer_id = #{customerId} |
| | | GROUP BY |
| | | sor.outbound_batches |
| | | OR (b.id IS NOT NULL AND (sor.type IS NULL OR sor.type = '')) |
| | | ) |
| | | AND IFNULL(b.customer_id, sl.customer_id) = #{customerId} |
| | | ORDER BY |
| | | sor.id |
| | | sor.id, IFNULL(b.id, 0) |
| | | ) tempA |
| | | WHERE |
| | | amount_received < outbound_amount |
| | | </select> |
| | | <!-- æ²¹ååºåºçç»å®è¡ä¸åºåºåæ¯ä¸¤ä¸ªç¬ç« id 空é´ï¼å¤éè¦å弿¥ --> |
| | | <select id="existsByStockOutBindingId" resultType="java.lang.Boolean"> |
| | | SELECT COUNT(*) > 0 |
| | | FROM account_sales_collection |
| | | WHERE |
| | | <foreach collection="stockOutBindingIds" item="id" open="(" separator=" OR " close=")"> |
| | | FIND_IN_SET(#{id}, stock_out_binding_ids) |
| | | </foreach> |
| | | </select> |
| | | <select id="selectIncomeStats" resultType="com.ruoyi.home.dto.IncomeExpenseAnalysisDto"> |
| | | SELECT DATE_FORMAT(collection_date, #{dateFormat}) AS dateStr, |
| | | IFNULL(SUM(collection_amount), 0) AS amount |
| | |
| | | IFNULL(T3.returnAmount, 0) AS returnAmount |
| | | from sales_ledger sl |
| | | left join ( |
| | | select x.id, sum(x.receiptPaymentAmount) as receiptPaymentAmount |
| | | from ( |
| | | <!-- æå·¥åè´§ååºåºï¼æ¶æ¬¾åæ stock_out_record_ids å
³èåºåºåï¼åç» shipping_info æ¾å°éå®å°è´¦ --> |
| | | select |
| | | sl.id, |
| | | sum(ascc.collection_amount) as receiptPaymentAmount |
| | |
| | | WHERE sor.record_type='13' |
| | | and sor.approval_status=1 |
| | | group by sl.id |
| | | |
| | | UNION ALL |
| | | |
| | | <!-- æ²¹ååºåºï¼æ¶æ¬¾ååçæ¯ç»å®è¡ idï¼å°è´¦ç´æ¥ä»ç»å®è¡ä¸åï¼ä¸ä¸ªåºåºåå¯è½æç»å¤ä¸ªå°è´¦ï¼ --> |
| | | select |
| | | slb.id, |
| | | sum(ascc.collection_amount) as receiptPaymentAmount |
| | | from account_sales_collection ascc |
| | | inner join stock_out_record_sales_ledger b on FIND_IN_SET(b.id, ascc.stock_out_binding_ids) > 0 |
| | | inner join stock_out_record sor on sor.id = b.stock_out_record_id |
| | | and sor.approval_status = 1 |
| | | and (sor.type is null or sor.type = '') |
| | | inner join sales_ledger slb on slb.id = b.sales_ledger_id |
| | | group by slb.id |
| | | ) x |
| | | group by x.id |
| | | )T1 on T1.id = sl.id |
| | | left join ( |
| | | select sl.id, |
| | |
| | | GROUP BY stock_in_record_id |
| | | ) rs ON rs.stock_in_record_id = sir.id |
| | | LEFT JOIN ( |
| | | <!-- å·²é宿°éï¼â æå·¥åè´§ååºåºä»èµ° shipping_product_detailï¼ |
| | | â¡ æ²¹ååºåºä¸å产 shipping_product_detailï¼æ¹æãåºåºåçè§æ ¼+æ¹æ¬¡ã对ä¸éè´å
¥åºæ¹æ¬¡ï¼ |
| | | æ±æ»ç»å®è¡çåææ°éï¼ä¸ä¸ªåºåºåç»å¤ä¸ªå°è´¦æ¶ï¼ç»å®è¡æ°éä¹å=æ´ååºåºéï¼ --> |
| | | SELECT |
| | | x.batch_no, |
| | | x.product_model_id, |
| | | SUM(x.total_sale_out_num) AS total_sale_out_num |
| | | FROM ( |
| | | SELECT |
| | | inv.batch_no, |
| | | inv.product_model_id, |
| | |
| | | INNER JOIN stock_inventory inv |
| | | ON inv.id = spd.stock_inventory_id |
| | | GROUP BY inv.batch_no, inv.product_model_id |
| | | |
| | | UNION ALL |
| | | |
| | | SELECT |
| | | sor.batch_no, |
| | | sor.product_model_id, |
| | | SUM(b.quantity) AS total_sale_out_num |
| | | FROM stock_out_record_sales_ledger b |
| | | INNER JOIN stock_out_record sor |
| | | ON sor.id = b.stock_out_record_id |
| | | AND sor.approval_status IN (0, 1, 3) |
| | | AND (sor.type IS NULL OR sor.type = '') |
| | | GROUP BY sor.batch_no, sor.product_model_id |
| | | ) x |
| | | GROUP BY x.batch_no, x.product_model_id |
| | | ) so ON so.product_model_id = sir.product_model_id |
| | | AND (so.batch_no = sir.batch_no OR (so.batch_no IS NULL AND sir.batch_no IS NULL)) |
| | | WHERE sir.approval_status = 1 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.sales.mapper.SalesLedgerArrivalMapper"> |
| | | |
| | | <!-- attachments æ¯ JSON æ°ç»åï¼èªå®ä¹ select ä¸ä¼èªå¨å¥ JacksonTypeHandlerï¼å¿
é¡»æ¾å¼å£°æï¼ |
| | | å¦åè¿åç»åç«¯çæ¯è£¸ JSON å符串è䏿¯æ°ç» --> |
| | | <resultMap id="ArrivalDtoMap" type="com.ruoyi.sales.dto.SalesLedgerArrivalDto"> |
| | | <id column="id" property="id"/> |
| | | <result column="sales_ledger_id" property="salesLedgerId"/> |
| | | <result column="sales_ledger_product_id" property="salesLedgerProductId"/> |
| | | <result column="stock_out_record_id" property="stockOutRecordId"/> |
| | | <result column="vehicle_id" property="vehicleId"/> |
| | | <result column="truck_plate_no" property="truckPlateNo"/> |
| | | <result column="arrival_quantity" property="arrivalQuantity"/> |
| | | <result column="arrival_date" property="arrivalDate"/> |
| | | <result column="attachments" property="attachments" |
| | | typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/> |
| | | <result column="remark" property="remark"/> |
| | | <result column="create_time" property="createTime"/> |
| | | <result column="create_user" property="createUser"/> |
| | | <result column="update_time" property="updateTime"/> |
| | | <result column="update_user" property="updateUser"/> |
| | | <result column="tenant_id" property="tenantId"/> |
| | | <result column="dept_id" property="deptId"/> |
| | | <result column="sales_contract_no" property="salesContractNo"/> |
| | | <result column="customer_name" property="customerName"/> |
| | | <result column="outbound_batches" property="outboundBatches"/> |
| | | <result column="specification_model" property="specificationModel"/> |
| | | <result column="product_name" property="productName"/> |
| | | <result column="unit" property="unit"/> |
| | | <result column="out_quantity" property="outQuantity"/> |
| | | <result column="arrived_quantity" property="arrivedQuantity"/> |
| | | <result column="create_by" property="createBy"/> |
| | | </resultMap> |
| | | |
| | | <sql id="arrivalColumns"> |
| | | sla.*, |
| | | sl.sales_contract_no, |
| | | sl.customer_name, |
| | | sor.outbound_batches, |
| | | pm.model as specification_model, |
| | | p.product_name, |
| | | pm.unit, |
| | | u.nick_name as create_by |
| | | </sql> |
| | | |
| | | <sql id="arrivalJoins"> |
| | | from sales_ledger_arrival sla |
| | | left join sales_ledger sl on sl.id = sla.sales_ledger_id |
| | | left join stock_out_record sor on sor.id = sla.stock_out_record_id |
| | | left join sales_ledger_product slp on slp.id = sla.sales_ledger_product_id |
| | | left join product_model pm on pm.id = slp.product_model_id |
| | | left join product p on p.id = pm.product_id |
| | | left join sys_user u on u.user_id = sla.create_user |
| | | </sql> |
| | | |
| | | <!-- å°è´§è®°å½æ¯åè´§å°è´¦çåè¡ï¼å¯è§æ§å¿
é¡»ä¸ç¶è¡ï¼åºåºåï¼ä¸è´ï¼å¦åä¼åºç°ãæç¶æ åãçéè§ï¼ |
| | | æ
ä¸ StockOutRecordMapper#bindableSalesLedgerPage 䏿 ·ç¨ /*data_scope*/ è·³è¿æ°æ®æéè¿æ»¤ --> |
| | | <select id="listPage" resultMap="ArrivalDtoMap"> |
| | | select /*data_scope*/ |
| | | <include refid="arrivalColumns"/> |
| | | <include refid="arrivalJoins"/> |
| | | <where> |
| | | <if test="req.salesLedgerId != null"> |
| | | and sla.sales_ledger_id = #{req.salesLedgerId} |
| | | </if> |
| | | <if test="req.stockOutRecordId != null"> |
| | | and sla.stock_out_record_id = #{req.stockOutRecordId} |
| | | </if> |
| | | <if test="req.truckPlateNo != null and req.truckPlateNo != ''"> |
| | | and sla.truck_plate_no like concat('%',#{req.truckPlateNo},'%') |
| | | </if> |
| | | <if test="req.salesContractNo != null and req.salesContractNo != ''"> |
| | | and sl.sales_contract_no like concat('%',#{req.salesContractNo},'%') |
| | | </if> |
| | | <if test="req.customerName != null and req.customerName != ''"> |
| | | and sl.customer_name like concat('%',#{req.customerName},'%') |
| | | </if> |
| | | <if test="req.arrivalDate != null"> |
| | | and sla.arrival_date = #{req.arrivalDate} |
| | | </if> |
| | | </where> |
| | | order by sla.id desc |
| | | </select> |
| | | |
| | | <!-- åæ¡å°è´§è®°å½ï¼ä¸å表åä¸å£å¾è·³è¿æ°æ®æéï¼å¯è§æ§è·éç¶è¡åºåºåï¼ --> |
| | | <select id="selectArrivalById" resultMap="ArrivalDtoMap"> |
| | | select /*data_scope*/ |
| | | <include refid="arrivalColumns"/> |
| | | <include refid="arrivalJoins"/> |
| | | where sla.id = #{id} |
| | | </select> |
| | | |
| | | <!-- æå°è´¦å¨æåºåºåä¸ç´¯è®¡å·²å°è´§æ°éï¼ä¸éæ ¡éªç¨ã |
| | | å¿
é¡»è·³è¿æ°æ®æéï¼å¦åæ¼æä»äººå½å
¥çå°è´§è®°å½ä¼è®©ã累计å°è´§ ⤠åºåºæ°éãå½¢åè设 --> |
| | | <select id="sumArrivedQuantity" resultType="java.math.BigDecimal"> |
| | | select /*data_scope*/ |
| | | ifnull(sum(sla.arrival_quantity), 0) |
| | | from sales_ledger_arrival sla |
| | | where sla.stock_out_record_id = #{stockOutRecordId} |
| | | and sla.sales_ledger_id = #{salesLedgerId} |
| | | <if test="excludeId != null"> |
| | | and sla.id != #{excludeId} |
| | | </if> |
| | | </select> |
| | | |
| | | <!-- åºåºåä¸çå°è´§è®°å½æ¡æ°ï¼å é¤åºåºå / æ¹ç»å°è´¦çå®å«ç¨ï¼åæ ·è¦è·³è¿æ°æ®æé --> |
| | | <select id="countByStockOutRecordId" resultType="java.lang.Long"> |
| | | select /*data_scope*/ |
| | | count(1) |
| | | from sales_ledger_arrival |
| | | where stock_out_record_id = #{stockOutRecordId} |
| | | </select> |
| | | |
| | | <!-- åè´§å°è´¦ç»è£
åè¡ï¼ä¸æ¬¡æ¹éåï¼é¿å
N+1 --> |
| | | <select id="listByStockOutRecordIds" resultMap="ArrivalDtoMap"> |
| | | select /*data_scope*/ |
| | | <include refid="arrivalColumns"/> |
| | | <include refid="arrivalJoins"/> |
| | | where sla.stock_out_record_id in |
| | | <foreach collection="stockOutRecordIds" item="recordId" open="(" separator="," close=")"> |
| | | #{recordId} |
| | | </foreach> |
| | | order by sla.arrival_date desc, sla.id desc |
| | | </select> |
| | | |
| | | <!-- å¯å°è´§çåºåºåï¼å«è½¦è¾ï¼ä¸æï¼åªè½é该å°è´¦å
³èçã审æ¹éè¿çæ²¹ååºåºã |
| | | åæ²¹èµ°ç»å®è¡¨ ââ stock_out_record.sales_ledger_id åªåäºé¦é¡¹å°è´¦ï¼å¤å°è´¦æ¶ä¸å¯ç¨ï¼ |
| | | 代å¨ä¸äº§ç»å®è¡ï¼ç»å®è¡åæ¶æ¯å¼ç¥¨/æ¶æ¬¾åéçæ°æ®æºï¼ä»£å¨ä¸è½è¿ï¼ï¼ä½å®ã䏿¬¡åºåºåªè½ç»ä¸ä¸ªå°è´¦ãï¼ |
| | | åå¼ååèæ¯æå¨çï¼åºåºéåæ´å stock_out_numã |
| | | 䏿 sor.vehicle_id is not null è¿æ»¤ï¼ä»£å¨/客ååºåºä¸å¼ºå¶éè½¦ï¼æ»¤æä¼è®©è¿ç±»åºåºåæ°¸è¿ç»è®°ä¸äºå°è´§ --> |
| | | <select id="bindableVehicles" resultMap="ArrivalDtoMap"> |
| | | select /*data_scope*/ |
| | | sor.id as stock_out_record_id, |
| | | sor.outbound_batches, |
| | | sor.vehicle_id, |
| | | sor.truck_plate_no, |
| | | ifnull(max(b.quantity), max(sor.stock_out_num)) as out_quantity, |
| | | ifnull(max(a.arrived), 0) as arrived_quantity |
| | | from stock_out_record sor |
| | | left join stock_out_record_sales_ledger b |
| | | on b.stock_out_record_id = sor.id and b.sales_ledger_id = #{salesLedgerId} |
| | | left join sales_ledger self_ledger on self_ledger.id = sor.sales_ledger_id |
| | | left join ( |
| | | select stock_out_record_id, sales_ledger_id, sum(arrival_quantity) as arrived |
| | | from sales_ledger_arrival |
| | | group by stock_out_record_id, sales_ledger_id |
| | | ) a on a.stock_out_record_id = sor.id and a.sales_ledger_id = #{salesLedgerId} |
| | | where sor.approval_status = 1 |
| | | and (sor.type is null or sor.type = '') |
| | | and (b.id is not null |
| | | or (self_ledger.id = #{salesLedgerId} and ifnull(self_ledger.ledger_type, '') = '代å¨')) |
| | | group by sor.id, sor.outbound_batches, sor.vehicle_id, sor.truck_plate_no |
| | | order by sor.id desc |
| | | </select> |
| | | |
| | | </mapper> |
| | |
| | | T1.oil_depot_name, |
| | | T1.tank_id, |
| | | T1.tank_no, |
| | | T1.tonnage, |
| | | T1.approval_status, |
| | | T1.entry_person, |
| | | T1.remarks, |
| | |
| | | T1.oil_depot_name, |
| | | T1.tank_id, |
| | | T1.tank_no, |
| | | T1.tonnage, |
| | | T1.approval_status, |
| | | T1.entry_person, |
| | | T1.remarks, |
| | |
| | | IFNULL(shipping_status_counts.is_all_shipped, FALSE) AS is_fh |
| | | FROM sales_ledger T1 |
| | | LEFT JOIN sys_user T2 ON T1.entry_person = T2.user_id |
| | | <!-- æ¯å¦åè´§æ¹æå°è´§è®°å½ç®ï¼å两ç§å°è´¦ï¼ |
| | | åæ²¹ï¼è¯¥å°è´¦ type=1 æç»çååæ°éæ»å <= å·²å°è´§æ°éæ»å æç®åå®ï¼ |
| | | 代å¨ï¼æ²¡æ type=1 æç»ï¼åºå线æ¹ä¸ºã该å°è´¦å
¨é¨å·²å®¡æ¹æ²¹ååºåºåçåºåºéæ»åãï¼åæ ·ãå
¨é¨å°è´§ãæç®åå®ã |
| | | ä¸¤ä¸ªåæ¯åèªé½è¦æ±åºå线 > 0ï¼å¦å 0 <= 0 ä¼è¢«å¤æãå·²åè´§ã --> |
| | | LEFT JOIN ( |
| | | SELECT sales_ledger_id, |
| | | SELECT sl.id AS sales_ledger_id, |
| | | CASE |
| | | WHEN SUM(CASE WHEN status != 'å·²åè´§' THEN 1 ELSE 0 END) = 0 THEN TRUE |
| | | WHEN IFNULL(d.total_qty, 0) > 0 AND IFNULL(d.total_qty, 0) <= IFNULL(a.total_arrival, 0) THEN TRUE |
| | | WHEN IFNULL(d.total_qty, 0) = 0 AND IFNULL(o.total_out, 0) > 0 |
| | | AND IFNULL(o.total_out, 0) <= IFNULL(a.total_arrival, 0) THEN TRUE |
| | | ELSE FALSE |
| | | END AS is_all_shipped |
| | | FROM shipping_info |
| | | FROM sales_ledger sl |
| | | LEFT JOIN ( |
| | | SELECT sales_ledger_id, SUM(quantity) AS total_qty |
| | | FROM sales_ledger_product |
| | | WHERE type = 1 |
| | | GROUP BY sales_ledger_id |
| | | ) d ON d.sales_ledger_id = sl.id |
| | | LEFT JOIN ( |
| | | SELECT sales_ledger_id, SUM(arrival_quantity) AS total_arrival |
| | | FROM sales_ledger_arrival |
| | | GROUP BY sales_ledger_id |
| | | ) a ON a.sales_ledger_id = sl.id |
| | | <!-- 代卿²¡æç»å®è¡¨ï¼åºåºåçåå¼å sales_ledger_id å³ä¸ºæå¨å¯¹åºå
³ç³» --> |
| | | LEFT JOIN ( |
| | | SELECT sor.sales_ledger_id, SUM(sor.stock_out_num) AS total_out |
| | | FROM stock_out_record sor |
| | | WHERE sor.approval_status = 1 |
| | | AND (sor.type IS NULL OR sor.type = '') |
| | | AND sor.sales_ledger_id IS NOT NULL |
| | | GROUP BY sor.sales_ledger_id |
| | | ) o ON o.sales_ledger_id = sl.id |
| | | ) shipping_status_counts ON T1.id = shipping_status_counts.sales_ledger_id |
| | | |
| | | <where> |
| | |
| | | FROM sales_ledger |
| | | GROUP BY customer_name |
| | | </select> |
| | | <!-- å·²åè´§çå°è´¦ï¼å£å¾ä¸ is_fh ä¸è´ï¼æ¹ä¸ºãæå°è´§è®°å½çå°è´¦ã --> |
| | | <select id="listSalesLedgerAndShipped" resultType="com.ruoyi.sales.dto.SalesLedgerDto"> |
| | | select distinct sl.id as 'disId', sl.* from |
| | | sales_ledger sl |
| | | left join sales_ledger_product slp on sl.id = slp.sales_ledger_id |
| | | left join shipping_info si on slp.id = si.sales_ledger_product_id |
| | | where si.status = 'å·²åè´§' |
| | | inner join sales_ledger_product slp on sl.id = slp.sales_ledger_id |
| | | inner join sales_ledger_arrival sla on sla.sales_ledger_product_id = slp.id |
| | | <where> |
| | | <if test="ew.customerName != null and ew.customerName != '' "> |
| | | and sl.customer_name like concat('%',#{ew.customerName},'%') |
| | | sl.customer_name like concat('%',#{ew.customerName},'%') |
| | | </if> |
| | | </where> |
| | | order by sl.execution_date desc |
| | | </select> |
| | | <select id="selectPurchaseReportVoPage" resultType="com.ruoyi.purchase.vo.PurchaseReportVo"> |
| | |
| | | IFNULL(SUM(so.total_sale_out_num), 0) AS shipped_quantity |
| | | FROM sales_ledger_product slp |
| | | LEFT JOIN ( |
| | | -- éè´å°è´¦çãå·²é宿°éãï¼æ²¹ååºåºä¸å产 shipping_product_detailï¼ |
| | | -- æ¹ç±ç»å®è¡çåææ°é忍 ââ åºåºåç è§æ ¼+æ¹æ¬¡ 对ä¸éè´å
¥åºæ¹æ¬¡ï¼å³ä¸ºè¯¥éè´å°è´¦åæçé |
| | | SELECT |
| | | pl.id AS purchase_ledger_id, |
| | | sir.product_model_id, |
| | | SUM(spd.quantity) AS total_sale_out_num |
| | | FROM shipping_product_detail spd |
| | | INNER JOIN shipping_info si |
| | | ON si.id = spd.shipping_info_id |
| | | SUM(b.quantity) AS total_sale_out_num |
| | | FROM stock_out_record_sales_ledger b |
| | | INNER JOIN stock_out_record sor |
| | | ON sor.record_id = si.id |
| | | AND TRIM(sor.record_type) = '13' |
| | | AND sor.approval_status IN (0, 1, 3) |
| | | INNER JOIN stock_inventory inv |
| | | ON inv.id = spd.stock_inventory_id |
| | | ON sor.id = b.stock_out_record_id |
| | | AND sor.approval_status = 1 |
| | | AND (sor.type IS NULL OR sor.type = '') |
| | | INNER JOIN stock_in_record sir |
| | | ON sir.product_model_id = inv.product_model_id |
| | | ON sir.product_model_id = sor.product_model_id |
| | | AND ( |
| | | (sir.batch_no IS NOT NULL AND sir.batch_no = inv.batch_no) |
| | | OR (sir.batch_no IS NULL AND inv.batch_no IS NULL) |
| | | (sir.batch_no IS NOT NULL AND sir.batch_no = sor.batch_no) |
| | | OR (sir.batch_no IS NULL AND sor.batch_no IS NULL) |
| | | ) |
| | | AND sir.approval_status = 1 |
| | | AND sir.record_type IN ('7', '10') |
| | |
| | | AND sir.record_id = qi.id |
| | | LEFT JOIN purchase_ledger pl |
| | | ON pl.id = IF(sir.record_type = '7', sir.record_id, qi.purchase_ledger_id) |
| | | WHERE si.status IN ('å®¡æ ¸éè¿', 'å·²åè´§') |
| | | AND pl.id IS NOT NULL |
| | | WHERE pl.id IS NOT NULL |
| | | GROUP BY pl.id, sir.product_model_id |
| | | ) so ON so.purchase_ledger_id = slp.sales_ledger_id |
| | | AND so.product_model_id = slp.product_model_id |
| | |
| | | |
| | | UNION ALL |
| | | |
| | | -- éå®å°è´¦(type=1): shipping_info ç´æ¥æ sales_ledger_product_id,åªç»è®¡åºåºå®¡æ ¸éè¿(approval_status=1)çåè´§é,ä¸ t5 ç pending é»è¾äºè¡¥ |
| | | -- éå®å°è´¦(type=1): å·²åè´§éç´æ¥æå°è´§è®°å½æ±æ»ãå°è´§è®°å½æ¬èº«å°±æ¯ãå®é
å°äºå¤å°ãçäºå®ï¼ |
| | | -- ä¸åç» shipping_info + shipping_product_detail |
| | | SELECT |
| | | si.sales_ledger_product_id AS sales_ledger_product_id, |
| | | IFNULL(SUM(spd.quantity), 0) AS shipped_quantity |
| | | FROM shipping_info si |
| | | INNER JOIN shipping_product_detail spd ON si.id = spd.shipping_info_id |
| | | INNER JOIN stock_out_record sor |
| | | ON sor.record_id = si.id |
| | | AND TRIM(sor.record_type) = '13' |
| | | AND sor.approval_status = 1 |
| | | WHERE si.status IN ('å®¡æ ¸éè¿', 'å·²åè´§') |
| | | AND si.sales_ledger_product_id IS NOT NULL |
| | | GROUP BY si.sales_ledger_product_id |
| | | sla.sales_ledger_product_id AS sales_ledger_product_id, |
| | | IFNULL(SUM(sla.arrival_quantity), 0) AS shipped_quantity |
| | | FROM sales_ledger_arrival sla |
| | | WHERE sla.sales_ledger_product_id IS NOT NULL |
| | | GROUP BY sla.sales_ledger_product_id |
| | | ) t3 ON t3.sales_ledger_product_id = T1.id |
| | | LEFT JOIN ( |
| | | SELECT rel.sales_ledger_product_id, |
| | |
| | | AND sor.approval_status = 1 |
| | | )) |
| | | GROUP BY si.sales_ledger_product_id |
| | | |
| | | UNION ALL |
| | | |
| | | -- æ²¹ååºåºå¾
å®¡æ¹ / å¾
确认ï¼è¿æ²¡å°è´§ï¼ç®ã审æ¹ä¸ãï¼ä¸ t3 çå°è´§éäºè¡¥ã |
| | | -- åªæç»å®äºåæ²¹å°è´¦çåºåºæå è¿æ¡åæ¯ï¼ä»£å¨ã客åä¸äº§ç»å®è¡ï¼ |
| | | SELECT b.sales_ledger_product_id AS sales_ledger_product_id, |
| | | IFNULL(SUM(b.quantity), 0) AS pending_approval_quantity |
| | | FROM stock_out_record_sales_ledger b |
| | | INNER JOIN stock_out_record sor |
| | | ON sor.id = b.stock_out_record_id |
| | | AND sor.approval_status IN (0, 3) |
| | | AND (sor.type IS NULL OR sor.type = '') |
| | | WHERE b.sales_ledger_product_id IS NOT NULL |
| | | GROUP BY b.sales_ledger_product_id |
| | | ) t5 ON t5.sales_ledger_product_id = T1.id |
| | | LEFT JOIN ( |
| | | SELECT |
| | |
| | | spd.totalQuantity, |
| | | sor.outboundBatches, |
| | | 'shipping' as source, |
| | | NULL as stockOutRecordId, |
| | | NULL as outCategory, |
| | | NULL as tankNo, |
| | | NULL as oilProduct, |
| | | NULL as oilDepotName, |
| | | NULL as driverName, |
| | | NULL as contactPerson, |
| | | NULL as contactPhone, |
| | | NULL as outBatchNo |
| | | oor.id as stockOutRecordId, |
| | | oor.out_category as outCategory, |
| | | oor.tank_no as tankNo, |
| | | oor.oil_product as oilProduct, |
| | | oor.oil_depot_name as oilDepotName, |
| | | oor.driver_name as driverName, |
| | | oor.contact_person as contactPerson, |
| | | oor.contact_phone as contactPhone, |
| | | oor.batch_no as outBatchNo |
| | | FROM shipping_info s |
| | | LEFT JOIN (select shipping_info_id,sum(quantity) totalQuantity from shipping_product_detail GROUP BY shipping_info_id) spd ON spd.shipping_info_id = s.id |
| | | LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id |
| | |
| | | from stock_out_record |
| | | where record_type='13'and approval_status=1 |
| | | group by record_id)sor on sor.record_id= s.id |
| | | <!-- ç±æ²¹ååºåºå®¡æ¹éè¿æ¶çæçåè´§åï¼ä¸æ¡åºåºå¯¹åºä¸æ¡èªå·±ç shipping_infoï¼ |
| | | æ
è³å¤å½ä¸ä¸è¡ï¼ä¸ä¼æ¾å¤§è¡æ°ãæå»ºçåè´§åæ²¡æé
对油ååºåºï¼è¿äºå为空 --> |
| | | left join stock_out_record oor |
| | | on oor.record_id = s.id |
| | | and TRIM(IFNULL(oor.record_type,'')) = '13' |
| | | and (oor.type IS NULL or oor.type = '') |
| | | WHERE 1=1 |
| | | <if test="req.salesContractNo != null and req.salesContractNo != ''"> |
| | | AND sl.sales_contract_no LIKE CONCAT('%',#{req.salesContractNo},'%') |
| | |
| | | o.create_user, |
| | | o.update_user, |
| | | NULL as tenant_id, |
| | | sl2.sales_contract_no, |
| | | <!-- æ²¹ååºåºå¯ç»å¤ä¸ªéå®å°è´¦ï¼å¤å®¢æ·ï¼ï¼o.sales_ledger_id åªåé¦é¡¹ï¼æ
ä»ç»å®è¡¨æ±æ»å
¨é¨ååå· --> |
| | | IFNULL( |
| | | (select group_concat(distinct slb.sales_contract_no separator ',') |
| | | from stock_out_record_sales_ledger b |
| | | join sales_ledger slb on slb.id = b.sales_ledger_id |
| | | where b.stock_out_record_id = o.id), |
| | | sl2.sales_contract_no) as sales_contract_no, |
| | | pm2.model as specification_model, |
| | | pm2.unit, |
| | | p2.product_name, |
| | |
| | | left join product p2 on p2.id = pm2.product_id |
| | | <!-- ç»å®äºéå®å°è´¦çæ²¹ååºåºå¸¦åºååå·ï¼æ²¡ç»çè¡è¯¥åä»ä¸ºç©º --> |
| | | left join sales_ledger sl2 on sl2.id = o.sales_ledger_id |
| | | WHERE o.out_category = 'éå®' AND o.approval_status = 1 |
| | | <!-- åªåæ²¹ååºåºï¼type 为空ï¼å
¨é¨åºåºç±»å«ï¼ï¼type=0/1 çåæ ¼ãä¸åæ ¼åºåºä¸è¿åè´§å°è´¦ --> |
| | | WHERE (o.type IS NULL OR o.type = '') AND o.approval_status = 1 |
| | | <!-- å·²æ¹é æãéå®-åè´§åºåºãçæ²¹åè¡ç±åæ¯ A ç shipping_info å±ç¤ºï¼æ¤å¤æé¤é¿å
å䏿¹è´§ä¸¤è¡ã |
| | | IFNULL å¿
é¡»å ï¼record_type 为 NULL æ¶ä¸å¼é»è¾ä¼ææ´è¡æ»¤æ --> |
| | | AND NOT (TRIM(IFNULL(o.record_type,'')) = '13' AND IFNULL(o.record_id,0) > 0) |
| | | <if test="req.salesContractNo != null and req.salesContractNo != ''"> |
| | | AND sl2.sales_contract_no LIKE CONCAT('%',#{req.salesContractNo},'%') |
| | | <!-- å¤å°è´¦åºåºè¦æãä»»ä¸ç»å®å°è´¦çååå·ãé½è½çå°ï¼ä¸è½åªçé¦é¡¹ --> |
| | | AND (sl2.sales_contract_no LIKE CONCAT('%',#{req.salesContractNo},'%') |
| | | OR EXISTS (select 1 |
| | | from stock_out_record_sales_ledger b |
| | | join sales_ledger slb on slb.id = b.sales_ledger_id |
| | | where b.stock_out_record_id = o.id |
| | | and slb.sales_contract_no LIKE CONCAT('%',#{req.salesContractNo},'%'))) |
| | | </if> |
| | | <!-- æ²¹ååºåºæ²¡æå¿«éåï¼æå¿«éåå·çéæ¶ä¸åºè¿å任使²¹åè¡ --> |
| | | <if test="req.expressNumber != null and req.expressNumber != ''"> |
| | |
| | | ELSE NULL |
| | | END |
| | | ELSE NULL |
| | | END AS sourceOrderNo |
| | | END AS sourceOrderNo, |
| | | sl_bound.sales_contract_no as salesContractNo |
| | | FROM stock_in_record as sir |
| | | LEFT JOIN product_model as pm on sir.product_model_id = pm.id |
| | | LEFT JOIN product as p on pm.product_id = p.id |
| | | LEFT JOIN sys_user as u on sir.create_user = u.user_id |
| | | <!-- 代å¨å
¥åºç»å®çéå®è®¢åï¼éå®å°è´¦ï¼ï¼sales_ledger_id æ¬èº«å·²é sir.* è¿å --> |
| | | LEFT JOIN sales_ledger as sl_bound on sl_bound.id = sir.sales_ledger_id |
| | | LEFT JOIN quality_inspect as qi_purchase on TRIM(sir.record_type) = '10' and sir.record_id = qi_purchase.id |
| | | LEFT JOIN sales_ledger_product as slp on TRIM(sir.record_type) = '7' and slp.id = sir.record_id and slp.type = 2 |
| | | LEFT JOIN purchase_ledger as pl_by_product on TRIM(sir.record_type) = '7' and pl_by_product.id = slp.sales_ledger_id |
| | |
| | | </if> |
| | | order by sir.id DESC |
| | | </select> |
| | | |
| | | <!-- 代å¨å
¥åºå¯ç»å®çéå®è®¢å䏿ã/*data_scope*/ è·³è¿æ°æ®æéï¼çç±è§ StockInRecordMapper#bindableSalesLedgerPageã |
| | | åªåºã代å¨ãç±»åå°è´¦ï¼åæ²¹å°è´¦æ¯ãæä»¬åç»å®¢æ·ãï¼æ²¡æå
¥åºè¯ä¹ --> |
| | | <select id="bindableSalesLedgerPage" resultType="com.ruoyi.sales.pojo.SalesLedger"> |
| | | select /*data_scope*/ id, |
| | | sales_contract_no, |
| | | customer_contract_no, |
| | | project_name, |
| | | entry_date, |
| | | salesman, |
| | | customer_id, |
| | | customer_name, |
| | | ledger_type, |
| | | oil_depot_id, |
| | | oil_depot_name, |
| | | tank_id, |
| | | tank_no, |
| | | tonnage, |
| | | approval_status, |
| | | contract_amount |
| | | from sales_ledger |
| | | where ledger_type = '代å¨' |
| | | <if test="req.salesContractNo != null and req.salesContractNo != ''"> |
| | | and sales_contract_no like concat('%',#{req.salesContractNo},'%') |
| | | </if> |
| | | <if test="req.customerName != null and req.customerName != ''"> |
| | | and customer_name like concat('%',#{req.customerName},'%') |
| | | </if> |
| | | <if test="req.projectName != null and req.projectName != ''"> |
| | | and project_name like concat('%',#{req.projectName},'%') |
| | | </if> |
| | | order by id desc |
| | | </select> |
| | | </mapper> |
| | |
| | | pm.model, |
| | | pm.unit, |
| | | u.nick_name as createBy, |
| | | sl.sales_contract_no as salesContractNo |
| | | <!-- æ²¹ååºåºå¯ç»å¤ä¸ªéå®å°è´¦ï¼å¤å®¢æ·ï¼ï¼sor.sales_ledger_id åªåé¦é¡¹ï¼æ
ä»ç»å®è¡¨æ±æ»å
¨é¨ååå·ï¼ |
| | | æªç»å®ç»å®è¡¨çåéè¡ä»éå sor.sales_ledger_id å
³èçå个ååå· --> |
| | | IFNULL( |
| | | (select group_concat(distinct slb.sales_contract_no separator ',') |
| | | from stock_out_record_sales_ledger b |
| | | join sales_ledger slb on slb.id = b.sales_ledger_id |
| | | where b.stock_out_record_id = sor.id), |
| | | sl.sales_contract_no) as salesContractNo |
| | | FROM stock_out_record as sor |
| | | LEFT JOIN product_model as pm on sor.product_model_id = pm.id |
| | | LEFT JOIN product as p on pm.product_id = p.id |
| | | LEFT JOIN sys_user as u on sor.create_user = u.user_id |
| | | <!-- ç»å®äºéå®å°è´¦çåºåºå¸¦åºååå·ï¼sales_ledger_id æ¬èº«å·²é sor.* è¿å --> |
| | | LEFT JOIN sales_ledger as sl on sl.id = sor.sales_ledger_id |
| | | <where> |
| | | <if test="params.timeStr != null and params.timeStr != ''"> |
| | |
| | | order by sor.id desc |
| | | </select> |
| | | |
| | | <!-- è´¢å¡ç®¡ç · éå®åºåºå°è´¦ï¼æ¶æ¬¾/å¼ç¥¨åéï¼ã |
| | | ä¸¤ç±»æ¥æºï¼â record_type='13' çæå·¥åè´§ååºåºï¼å®¢æ·/æç»/åè´§ç¼å·é½èµ° shipping_infoï¼ |
| | | â¡ æ²¹ååºåºï¼type ä¸ºç©ºï¼æãåºåºåÃ客æ·ãæå°ç»å®è¡ï¼ä¸ä¸ªåºåºåç»å 个å°è´¦å°±åºå è¡ï¼ |
| | | éé¢åªç®è¯¥å®¢æ·åæçé£é¨åï¼b.quantity à åä»·ï¼ï¼ä¸åæ¯æ´åæ°éã |
| | | ç¨ LEFT JOIN è䏿¯ UNION ALLï¼DataScopeSqlInterceptor çå° from åé¢ç´§è· '(' 伿´æ¡æ¾è¡ï¼ |
| | | æä¸¤æ¡åæ¯å
ææ´¾ç表ä¼è®©åºåºåçæ°æ®æééé»å¤±æã --> |
| | | <select id="listPageAccountSales" resultType="com.ruoyi.account.bean.vo.sales.SalesOutboundVo"> |
| | | SELECT |
| | | sor.id, |
| | | sor.outbound_batches, |
| | | sl.customer_name, |
| | | IFNULL(b.customer_name, sl.customer_name) AS customerName, |
| | | sor.create_time as shippingDate, |
| | | p.product_name, |
| | | pm.model as specification_model, |
| | | slp.tax_rate, |
| | | sor.stock_out_num * slp.tax_inclusive_unit_price as outboundAmount, |
| | | IFNULL(pb.product_name, p.product_name) AS productName, |
| | | IFNULL(pmb.model, pm.model) as specification_model, |
| | | IFNULL(slpb.tax_rate, slp.tax_rate) as tax_rate, |
| | | CASE |
| | | WHEN b.id IS NOT NULL THEN b.quantity * slpb.tax_inclusive_unit_price |
| | | ELSE sor.stock_out_num * slp.tax_inclusive_unit_price |
| | | END as outboundAmount, |
| | | s.shipping_no, |
| | | sl.sales_contract_no |
| | | IFNULL(slb.sales_contract_no, sl.sales_contract_no) as sales_contract_no, |
| | | b.id AS bindingId, |
| | | IFNULL(b.customer_id, sl.customer_id) AS customer_id |
| | | FROM stock_out_record sor |
| | | <!-- åªææ²¹ååºåºæå»ç»ç»å®è¡¨ï¼æå·¥åè´§ååºåºç type 乿¯ç©ºï¼ä½å® record_type='13' 䏿²¡æç»å®è¡ï¼ |
| | | b.id 为 NULL æ¶ä¸é¢ç»ä¸åè½å° shipping_info é£ä¸å¥ --> |
| | | LEFT JOIN stock_out_record_sales_ledger b ON b.stock_out_record_id = sor.id |
| | | left join shipping_info s on sor.record_id = s.id |
| | | LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id |
| | | LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id and slp.type = 1 |
| | | LEFT JOIN sales_ledger slb ON slb.id = b.sales_ledger_id |
| | | LEFT JOIN sales_ledger_product slpb ON slpb.id = b.sales_ledger_product_id and slpb.type = 1 |
| | | left join product_model pm on slp.product_model_id = pm.id |
| | | left join product p on pm.product_id = p.id |
| | | WHERE sor.record_type='13' and sor.approval_status=1 |
| | | left join product_model pmb on sor.product_model_id = pmb.id |
| | | left join product pb on pmb.product_id = pb.id |
| | | WHERE sor.approval_status=1 |
| | | AND ( |
| | | sor.record_type='13' |
| | | OR (b.id IS NOT NULL AND (sor.type IS NULL OR sor.type = '')) |
| | | ) |
| | | <if test="req.outboundBatches != null and req.outboundBatches != ''"> |
| | | AND sor.outbound_batches LIKE CONCAT('%',#{req.outboundBatches},'%') |
| | | </if> |
| | | <if test="req.customerName != null and req.customerName != ''"> |
| | | AND sl.customer_name LIKE CONCAT('%',#{req.customerName},'%') |
| | | AND IFNULL(b.customer_name, sl.customer_name) LIKE CONCAT('%',#{req.customerName},'%') |
| | | </if> |
| | | <if test="req.customerId != null "> |
| | | AND sl.customer_id = #{req.customerId} |
| | | AND IFNULL(b.customer_id, sl.customer_id) = #{req.customerId} |
| | | </if> |
| | | <if test="req.startDate != null and req.endDate != null"> |
| | | AND s.shipping_date BETWEEN #{req.startDate} AND #{req.endDate} |
| | | AND IFNULL(s.shipping_date, sor.create_time) BETWEEN #{req.startDate} AND #{req.endDate} |
| | | </if> |
| | | order by sor.id DESC |
| | | order by sor.id DESC, IFNULL(b.id, 0) |
| | | </select> |
| | | </mapper> |