5 小时以前 38b7b5add8824914d85c58eceb6d7498d62556c8
docs(mes): 添加报工倒计时和产品入库单自动生成功能文档

- 新增报工等待时长倒计时功能说明,包括工序配置、倒计时开始和状态展示
- 添加报工数量可选配置,支持报工数量为空的业务场景
- 实现报工倒计时系统消息提醒功能,支持10分钟、5分钟和结束提醒
- 添加报工自动生成产品入库单功能,支持勾选入库和不合格仓库兜底
- 完善相关API接口文档,包括新增接口和现有接口字段扩展
- 更新业务规则说明和注意事项,确保前后端联调一致性
已添加3个文件
274 ■■■■■ 文件已修改
docs/process_feedback_wait_countdown_integration.md 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/process_feedback_wait_countdown_remind_integration.md 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/product_receipt_auto_stock_integration.md 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/process_feedback_wait_countdown_integration.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,116 @@
# æŠ¥å·¥ç­‰å¾…时长倒计时 + æŠ¥å·¥æ•°é‡å¯é€‰ - å‰ç«¯è”调方案
## æ¶‰åŠé¡µé¢
- å·¥åºç®¡ç†ï¼ˆ`src/views/mes/pro/process`,表单 `modules/form.vue`)
- å¿«é€ŸæŠ¥å·¥ï¼ˆ`src/views/mes/pro/workorder-center/modules/quick-feedback.vue`)
- æŠ¥å·¥è¡¨å•(`src/views/mes/pro/feedback/modules/form.vue`)
- ç”Ÿäº§ä»»åŠ¡ç›¸å…³å±•ç¤ºï¼ˆåˆ—è¡¨/详情,报工倒计时状态展示)
## ä¸šåŠ¡æµç¨‹ä¸Žæ•°æ®å¸¦å…¥
1. **工序主数据配置**:在工序管理页面为工序配置「等待时长(小时)」与「是否需要填写报工数量」两个新字段。字段保存到工序主数据(`mes_pro_process`),所有引用该工序的工艺路线共用。
2. **报工界面读取工序配置**:报工表单(新增/编辑)选择任务后,通过 `getRouteProcessByRouteAndProcess(routeId, processId)`(现有调用)拉取工序配置,响应新增返回 `waitDuration`、`needReportQuantity`。
   - `waitDuration > 0`:该工序报工前必须先点击「开始倒计时」,倒计时结束才能报工。
   - `needReportQuantity = false`:报工数量允许为空(不显示数量输入项、不做"必须大于 0"校验)。
3. **开始倒计时**:操作员点击「开始倒计时」→ è°ƒç”¨æ–°æŽ¥å£ `startWaitCountdown` â†’ åŽç«¯æŠŠå½“前时间写入任务(`mes_pro_task.wait_start_time`)。
4. **任务状态回显**:任务列表/详情响应新增 `waitStartTime` å­—段,前端用于展示倒计时状态(已开始/进行中/已结束)。
5. **提交报工**:报工提交(快速报工 / æŠ¥å·¥è¡¨å•提交 / å®¡æ‰¹é€šè¿‡ï¼‰æ—¶ï¼ŒåŽç«¯ç»Ÿä¸€æ ¡éªŒç­‰å¾…时长与数量规则。
## API
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | `/mes/pro/task/start-wait-countdown` | å¼€å§‹æŠ¥å·¥å€’计时(记录开始时间到任务) |
| GET | `/mes/pro/route/process/get-by-route-and-process` | çŽ°æœ‰æŽ¥å£ï¼Œå“åº”æ–°å¢ž `waitDuration`/`needReportQuantity` |
### æ–°å¢žæŽ¥å£ï¼šå¼€å§‹æŠ¥å·¥å€’计时
**请求参数:**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|------|------|------|------|
| taskId | Long | æ˜¯ | ç”Ÿäº§ä»»åŠ¡ç¼–å·ï¼ˆPOST body JSON ä¼ é€’) |
**请求示例:**
```json
{
  "taskId": 35
}
```
**响应:** è¿”回倒计时开始时间(`yyyy-MM-dd HH:mm:ss`)。
**响应示例:**
```json
{
  "code": 0,
  "data": "2026-08-29 10:30:00"
}
```
**业务前置校验(后端):**
| åœºæ™¯ | ç»“æžœ |
|------|------|
| ä»»åŠ¡ä¸å­˜åœ¨ / å·²ç»ˆæ€ï¼ˆå®Œæˆã€å–消) | æŠ¥é”™ï¼ˆä»»åŠ¡å¼‚å¸¸ï¼‰ |
| ä»»åŠ¡å·²åœå·¥ | æŠ¥é”™ï¼ˆåœå·¥ä¸èƒ½æŠ¥å·¥ï¼‰ |
| å·¥åºæœªé…ç½®ç­‰å¾…时长(为空或 0) | æŠ¥é”™ã€Œè¯¥å·¥åºæœªé…ç½®ç­‰å¾…时长,无需倒计时」 |
| å·¥åºå·²é…ç½®ç­‰å¾…æ—¶é•¿ | æˆåŠŸï¼Œè®°å½•å¼€å§‹æ—¶é—´ï¼›é‡å¤ç‚¹å‡»ä¼šé‡ç½®ä¸ºå½“å‰æ—¶é—´ |
### çŽ°æœ‰æŽ¥å£å“åº”å­—æ®µæ–°å¢ž
**`get-by-route-and-process` å“åº”新增字段:**
| å­—段 | ç±»åž‹ | è¯´æ˜Ž |
|------|------|------|
| waitDuration | BigDecimal | ç­‰å¾…时长(小时)。>0 è¡¨ç¤ºæŠ¥å·¥å‰éœ€å€’计时等待 |
| needReportQuantity | Boolean | æ˜¯å¦éœ€è¦å¡«å†™æŠ¥å·¥æ•°é‡ã€‚`false`=报工数量允许为空 |
**生产任务相关响应新增字段(列表/详情/任务选择组件):**
| å­—段 | ç±»åž‹ | è¯´æ˜Ž |
|------|------|------|
| waitStartTime | LocalDateTime | æŠ¥å·¥å€’计时开始时间。为空表示尚未开始倒计时 |
**工序主数据保存/响应新增字段:**
| å­—段 | ç±»åž‹ | è¯´æ˜Ž |
|------|------|------|
| waitDuration | BigDecimal | ç­‰å¾…时长(小时),报工前需倒计时等待 |
| needReportQuantity | Boolean | æ˜¯å¦éœ€è¦å¡«å†™æŠ¥å·¥æ•°é‡ |
## å­—段展示规则
| å­—段 | å±•示位置 | è¯´æ˜Ž |
|------|----------|------|
| ç­‰å¾…时长(小时) | å·¥åºç®¡ç†è¡¨å• | æ•°å­—输入,小数最多 2 ä½ï¼›ç•™ç©º/0 è¡¨ç¤ºè¯¥å·¥åºæŠ¥å·¥æ— éœ€å€’计时 |
| æ˜¯å¦éœ€è¦å¡«å†™æŠ¥å·¥æ•°é‡ | å·¥åºç®¡ç†è¡¨å• | å¼€å…³ã€‚关闭后该工序报工数量允许为空 |
| å¾…报工数量 | å¿«é€ŸæŠ¥å·¥ / æŠ¥å·¥è¡¨å• | çŽ°æœ‰å­—æ®µã€‚è‹¥å·¥åºæ— éœ€å¡«å†™æ•°é‡ï¼ŒæŠ¥å·¥æ•°é‡è¾“å…¥é¡¹å¯ä¸æ˜¾ç¤º |
| æœ¬æ¬¡æŠ¥å·¥æ•°é‡ | å¿«é€ŸæŠ¥å·¥ / æŠ¥å·¥è¡¨å• | æŒ‰å·¥åºé…ç½®å†³å®šæ˜¯å¦å¿…å¡«/可空 |
| å¼€å§‹å€’计时 æŒ‰é’® + å€’计时剩余时间 | å¿«é€ŸæŠ¥å·¥ / æŠ¥å·¥è¡¨å• | å·¥åºé…ç½®ç­‰å¾…时长时展示;点击后展示倒计时剩余时间 |
| å€’计时状态 | ç”Ÿäº§ä»»åŠ¡åˆ—è¡¨/详情(可选) | ä¾æ® `waitStartTime` ä¸Žå½“前时间计算剩余时间 |
## ä¸šåŠ¡è§„åˆ™è¯´æ˜Ž
| åœºæ™¯ | è§„则 |
|------|------|
| å·¥åº `waitDuration` ä¸ºç©ºæˆ– 0 | æŠ¥å·¥æ— éœ€å€’计时,原流程不变 |
| å·¥åº `waitDuration > 0`,任务未点「开始倒计时」 | æŠ¥å·¥æŠ¥é”™ã€Œè¯¥å·¥åºè®¾ç½®äº†ç­‰å¾…时长,请先点击"开始倒计时"」 |
| å·¥åº `waitDuration > 0`,倒计时未结束 | æŠ¥å·¥æŠ¥é”™ã€Œç­‰å¾…倒计时未结束,还需等待 X小时X分钟」 |
| å·¥åº `waitDuration > 0`,倒计时已结束 | å¯æ­£å¸¸æŠ¥å·¥ï¼›å¼€å§‹æ—¶é—´è®°å½•在任务上,每任务一次 |
| é‡å¤ç‚¹å‡»ã€Œå¼€å§‹å€’计时」 | é‡ç½®å¼€å§‹æ—¶é—´ä¸ºå½“前时间 |
| å·¥åº `needReportQuantity = true` æˆ–未配置 | æŠ¥å·¥æ•°é‡å¿…é¡» > 0(原逻辑) |
| å·¥åº `needReportQuantity = false` | æŠ¥å·¥æ•°é‡å…è®¸ä¸ºç©º/0;后端跳过数量校验,审批时不生成产出单/批次,不扣倒冲物料,仅完成报工 |
| å€’计时适用范围 | æŒ‰å·¥åºåˆ¤æ–­ï¼Œå¼€å§‹æ—¶é—´è®°å½•到生产任务,每任务一次 |
## æ³¨æ„äº‹é¡¹
- ç­‰å¾…时长单位固定为**小时**,前端输入时注意单位提示(示例 `2.00` è¡¨ç¤º 2 å°æ—¶ï¼›`0.5` è¡¨ç¤º 30 åˆ†é’Ÿï¼‰ã€‚
- å€’计时开始时间记录在**生产任务**上,与工序等待时长(主数据)分开维护;修改工序等待时长不影响已开始的任务倒计时。
- è‹¥å·¥åºé…ç½®äº†ç­‰å¾…时长但任务未开始倒计时,直接提交报工会被后端拦截(创建、快速报工、审批通过三处入口都校验)。
- å¿«é€ŸæŠ¥å·¥å½“前为数量必填,接入后需按 `needReportQuantity` è°ƒæ•´ã€Œè¯·è¾“入报工数量」的必填校验与数量输入框展示。
- æŠ¥å·¥æ•°é‡ä¸ºç©º/0 çš„æŠ¥å·¥ï¼šä¸ä¼šç”Ÿæˆäº§å‡ºå•/批次、不会倒冲扣料,仅把报工标记为已完成并更新任务进度;请在前端相应隐藏数量相关展示,避免误导。
- æŠ¥å·¥è¡¨å•编辑/审批时任务可能已过等待期,此时无需再倒计时即可提交。
docs/process_feedback_wait_countdown_remind_integration.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
# æŠ¥å·¥å€’计时系统消息提醒(10分钟 / 5分钟 / ç»“束) - å‰ç«¯è”调方案
## æ¶‰åŠé¡µé¢
- æ— å‰ç«¯é¡µé¢æ”¹åŠ¨ã€‚æé†’ç”±**后端定时任务**自动发送到**系统站内信(消息中心)**,操作员在站内信列表查看即可。
## è¯´æ˜Ž
报工倒计时设置系统消息提醒,分三个等级自动发送站内信:
| ç­‰çº§ | è§¦å‘时机 | ç«™å†…信模板 code |
|------|----------|-----------------|
| 1 | å€’计时剩余 â‰¤ 10 åˆ†é’Ÿ | `mes_task_wait_remind_10` |
| 2 | å€’计时剩余 â‰¤ 5 åˆ†é’Ÿ | `mes_task_wait_remind_5` |
| 3 | å€’计时结束(剩余 â‰¤ 0) | `mes_task_wait_remind_end` |
后端新增定时任务,**每分钟扫描一次**所有已开始倒计时(`waitStartTime` éžç©ºï¼‰ä¸”未终态、未停工的报工任务,到达对应时间点自动发送站内信。
## ç«™å†…信内容
| æ¨¡æ¿ code | å†…容示例 |
|-----------|----------|
| `mes_task_wait_remind_10` | ç”Ÿäº§ä»»åŠ¡ã€{taskCode}】{taskName} æŠ¥å·¥å€’计时剩余 10 åˆ†é’Ÿï¼Œè¯·å‡†å¤‡æŠ¥å·¥ã€‚ |
| `mes_task_wait_remind_5` | ç”Ÿäº§ä»»åŠ¡ã€{taskCode}】{taskName} æŠ¥å·¥å€’计时剩余 5 åˆ†é’Ÿï¼Œå³å°†å¯ä»¥æŠ¥å·¥ã€‚ |
| `mes_task_wait_remind_end` | ç”Ÿäº§ä»»åŠ¡ã€{taskCode}】{taskName} æŠ¥å·¥å€’计时已结束,可以进行报工。 |
占位符:`taskCode`(任务编码)、`taskName`(任务名称)、`processName`(工序名称)。
## æŽ¥æ”¶äºº
1. **优先**:任务指定的报工人员(`mes_pro_task_assignee`),全部发送。
2. **兜底**:任务未指定报工人员时,发给任务创建人。
## ä¸šåŠ¡è§„åˆ™è¯´æ˜Ž
| åœºæ™¯ | è§„则 |
|------|------|
| å·¥åºç­‰å¾…时长不足 10 åˆ†é’Ÿï¼ˆå¦‚ 5 åˆ†é’Ÿï¼‰ | å¼€å§‹å€’计时后立即触发"10 åˆ†é’Ÿ"与"5 åˆ†é’Ÿ"提醒(剩余不足即提醒) |
| é‡å¤ç‚¹å‡»"开始倒计时"重置时间 | æé†’按新的开始时间重新计算,重新触发一轮提醒 |
| ä»»åŠ¡å·²å®Œæˆ / å·²å–消 / å·²åœå·¥ | ä¸å†æ‰«ææé†’ |
| åŒä¸€ç­‰çº§åŒä¸€è½®å€’计时 | åªæé†’一次(Redis åŽ»é‡ï¼Œ24 å°æ—¶ï¼‰ |
## æ³¨æ„äº‹é¡¹
- æé†’为**系统站内信**,操作员在系统消息中心查看,无弹窗/无前端接口调用。
- ç«™å†…信模板可在「系统管理 â†’ ç«™å†…信模板」中按 code æŸ¥çœ‹/修改内容。
- è¯¥åŠŸèƒ½ä¸ºæ–°å¢žï¼Œä¸å½±å“åŽŸæœ‰æŠ¥å·¥å€’è®¡æ—¶æŠ¥å·¥æ ¡éªŒé€»è¾‘ã€‚
docs/product_receipt_auto_stock_integration.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
# æŠ¥å·¥è‡ªåŠ¨ç”Ÿæˆäº§å“å…¥åº“å• + å‹¾é€‰å…¥åº“ + ä¸åˆæ ¼ä»“库兜底 - å‰ç«¯è”调方案
## æ¶‰åŠé¡µé¢
- äº§å“å…¥åº“(`src/views/wls/productreceipt`,列表 `index.vue` + è¡¨å• `modules/form.vue`、行 `modules/line-list.vue`、上架明细 `modules/detail-form.vue`)
- æŠ¥å·¥å®¡æ‰¹ï¼ˆä»…数据来源,无需改动,审批通过后自动生成入库单)
## ä¸šåŠ¡æµç¨‹ä¸Žæ•°æ®å¸¦å…¥
1. **报工审批 â†’ è‡ªåŠ¨ç”Ÿæˆå…¥åº“å•**:报工审批通过后,后端自动生成一条产品入库单(`mes_wm_product_receipt`),一次报工=一条入库单(幂等)。
2. **行 = äº§å‡ºè¡Œ**:入库单行来自生产入库单产出行(`mes_wm_product_produce_line`),按合格/不合格分行,每行自动带入 `itemId`、`quantity`(产出数量)、`batchId/batchCode`、`qualityStatus`(质量状态合格/不合格),默认 `isStock=false`(未勾选入库)。
3. **一个数量一行**:产品入库页表格按"一行=一个数量"展示,行即本次报工的一个产出数量(合格行/不合格行各一条)。
4. **执行入库前勾选**:在「待上架」状态的入库单上,每行勾选"是否入库";勾选入库的行展开三级(仓库→库区→库位)多选并分配数量。
5. **执行上架保存**:调用新接口 `submit-stock` ä¿å­˜æ¯è¡Œçš„勾选状态与仓库/库区/库位分配。
6. **执行入库兜底**:执行入库时,未勾选入库的行或分配数量不足的行,剩余数量自动进「不合格仓库」(三级:DEFECT_WAREHOUSE / DEFECT_LOCATION / DEFECT_AREA),每个数量生成一条流水(出虚拟线边库 + å…¥å®žé™…/不合格仓库)。
## API
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | `/mes/wm/product-receipt/submit-stock` | æ‰¹é‡ä¸Šæž¶ï¼ˆå‹¾é€‰æ˜¯å¦å…¥åº“ + ä»“库/库区/库位分配数量),新增 |
| PUT | `/mes/wm/product-receipt/submit` | æäº¤ï¼ˆè‰ç¨¿ â†’ å¾…上架),现有 |
| PUT | `/mes/wm/product-receipt/stock` | æ‰§è¡Œä¸Šæž¶ï¼ˆå¾…上架 â†’ å¾…执行入库),现有 |
| PUT | `/mes/wm/product-receipt/finish` | æ‰§è¡Œå…¥åº“(待执行入库 â†’ å·²å®Œæˆï¼‰ï¼ŒçŽ°æœ‰ |
### æ–°å¢žæŽ¥å£ï¼šæ‰¹é‡ä¸Šæž¶
**请求参数(`submit-stock`):**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|------|------|------|------|
| receiptId | Long | æ˜¯ | äº§å“å…¥åº“单编号 |
| rows | List\<Row\> | æ˜¯ | è¡Œä¸Šæž¶åˆ—表 |
| rows[].lineId | Long | æ˜¯ | å…¥åº“单行编号 |
| rows[].isStock | Boolean | æ˜¯ | æ˜¯å¦å…¥åº“(true=勾选入库并分配仓库/库位;false=执行入库时自动进不合格仓库) |
| rows[].details | List\<Detail\> | æ¡ä»¶ | isStock=true æ—¶å¿…须;每个分配一条,数量之和=行收货数量 |
| details[].warehouseId | Long | æ˜¯ | ä»“库编号 |
| details[].locationId | Long | æ˜¯ | åº“区编号 |
| details[].areaId | Long | æ˜¯ | åº“位编号 |
| details[].quantity | BigDecimal | æ˜¯ | åˆ†é…æ•°é‡ |
**请求示例:**
```json
{
  "receiptId": 1,
  "rows": [
    {
      "lineId": 11,
      "isStock": true,
      "details": [
        { "warehouseId": 1, "locationId": 1, "areaId": 1, "quantity": 60 },
        { "warehouseId": 1, "locationId": 2, "areaId": 2, "quantity": 40 }
      ]
    },
    {
      "lineId": 12,
      "isStock": false
    }
  ]
}
```
**响应:** `{ "code": 0, "data": true }`
### çŽ°æœ‰æŽ¥å£å“åº”å­—æ®µæ–°å¢ž
**产品入库单详情/分页响应(RespVO)新增:**
| å­—段 | ç±»åž‹ | è¯´æ˜Ž |
|------|------|------|
| feedbackId | Long | æ¥æºæŠ¥å·¥ç¼–号。非空表示由报工自动生成,不可手工改行 |
**产品入库单行响应(LineRespVO)新增:**
| å­—段 | ç±»åž‹ | è¯´æ˜Ž |
|------|------|------|
| qualityStatus | Integer | è´¨é‡çŠ¶æ€ã€‚å­—å…¸ `MES_WM_QUALITY_STATUS`(合格/不合格),自动生成的入库单行带入 |
| isStock | Boolean | æ˜¯å¦å…¥åº“(false/空=执行入库时默认进不合格仓库) |
## å­—段展示规则
| å­—段 | å±•示位置 | è¯´æ˜Ž |
|------|----------|------|
| æŠ¥å·¥æ¥æº | åˆ—表 | æœ‰ `feedbackId` çš„入库单可展示"自动生成"标识 |
| è´¨é‡çŠ¶æ€ | è¡Œè¡¨æ ¼ | å±•示合格/不合格,来自产出 |
| æ˜¯å¦å…¥åº“ | è¡Œè¡¨æ ¼ | æ¯è¡Œä¸€ä¸ªå‹¾é€‰ï¼ˆä»…待上架状态可改);勾选后展开仓库/库区/库位分配 |
| ä»“库/库区/库位 | è¡Œå±•开明细 | ä¸‰çº§çº§è”选择,可多选;每条明细一个数量 |
| åˆ†é…æ•°é‡ | è¡Œå±•开明细 | å‹¾é€‰å…¥åº“的行要求分配数量之和 = è¡Œæ”¶è´§æ•°é‡ |
| å‰©ä½™æ•°é‡ | è¡Œå±•开明细 | è¡Œæ”¶è´§æ•°é‡ - å·²åˆ†é…æ•°é‡ï¼›æ‰§è¡Œå…¥åº“时剩余自动进不合格仓库 |
## ä¸šåŠ¡è§„åˆ™è¯´æ˜Ž
| åœºæ™¯ | è§„则 |
|------|------|
| æŠ¥å·¥å®¡æ‰¹é€šè¿‡ï¼ˆæ— è´¨æ£€ï¼‰ | è‡ªåŠ¨ç”Ÿæˆå…¥åº“å•ï¼Œè¡Œ=合格/不合格产出行,状态=草稿 |
| æŠ¥å·¥å®¡æ‰¹é€šè¿‡ï¼ˆè´¨æ£€ï¼ŒIPQC å®ŒæˆåŽï¼‰ | è‡ªåŠ¨ç”Ÿæˆå…¥åº“å•ï¼Œè¡Œ=合格/不合格拆分行 |
| é‡å¤è§¦å‘同一报工 | å¹‚等:已存在则不再生成第二条 |
| isStock=false æˆ–未分配完 | æ‰§è¡Œå…¥åº“时剩余数量自动进不合格仓库 |
| isStock=true ä½†åˆ†é…æ•°é‡ä¹‹å’Œ â‰  è¡Œæ”¶è´§æ•°é‡ | æŠ¥é”™ã€Œå‹¾é€‰å…¥åº“的分配数量与行收货数量不一致」 |
| ä¸åˆæ ¼ä»“库未配置 | æ‰§è¡Œå…¥åº“报错「未配置不合格仓库,请先创建 DEFECT_WAREHOUSE ä»“库」 |
| æ‰§è¡Œå…¥åº“ | æ¯æ¡æ˜Žç»†ç”Ÿæˆä¸€æ¡æµæ°´ï¼ˆå‡ºè™šæ‹Ÿçº¿è¾¹åº“ + å…¥å®žé™…/不合格仓库),一个数量=一条流水 |
| è‡ªåŠ¨ç”Ÿæˆçš„å…¥åº“å• | è¡Œä¸å¯æ‰‹å·¥å¢žåˆ æ”¹ï¼ˆå¯æ•´å•取消);手工创建的入库单不受影响 |
## æ³¨æ„äº‹é¡¹
- å¾…上架状态才允许勾选"是否入库"与分配仓库/库位;执行上架保存后状态变为待执行入库。
- å‹¾é€‰å…¥åº“的行必须分配完整数量;只分配一部分时,剩余部分执行入库仍会进不合格仓库。
- ä¸åˆæ ¼æ•°é‡é»˜è®¤ä¸å‹¾é€‰å…¥åº“(进不合格仓库);合格数量由操作员决定是否入库及入哪个仓库。
- è‡ªåŠ¨ç”Ÿæˆçš„å…¥åº“å• `qualityStatus` ç”±äº§å‡ºè¡Œå¸¦å…¥ï¼Œè¡Œæœ¬èº«ä¸å¯ä¿®æ”¹ï¼›å¦‚需调整入库去向,通过勾选与分配实现。
- å…¥åº“流水以"数量"为单位:同一行分到不同仓库/库位,一条明细对应一条 OUT(虚拟线边库)+ IN(实际仓库)流水。