| .. | ||
| README.md | ||
ND3 阶段性产品报表 — 前端对接说明
一、基础约定
| 项 | 说明 |
|---|---|
| 服务地址 | 本系统(若依) http://{host}:8033,context-path: / |
| 统一响应 | { code, msg, data },code === 200 为成功 |
| 鉴权 | 须登录;请求头 Authorization: Bearer {token} |
| 模块前缀 | /system/nd3/phased-product |
勿用
http://xxx:8081/api/login:那是配置里的 PLM 外部接口 地址,不是本后端登录;字段也不是UserName/Password。
〇、登录(调 ND3 接口前必做)
0.1 验证码(若后台开启)
GET http://{host}:8033/captchaImage
data.captchaEnabled === true 时,记下 data.uuid,按图片算出 code(数学验证码为算式结果)。
0.2 登录
POST /login(无 /api 前缀)
Body(JSON,小写字段名)
{
"username": "admin",
"password": "admin123",
"code": "8",
"uuid": "从 captchaImage 返回的 uuid"
}
验证码关闭时 code、uuid 可省略。
成功示例
{
"code": 200,
"msg": "操作成功",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
后续 ND3 请求头:
Authorization: Bearer {data.token}
Apifox 正确示例
POST http://192.168.31.195:8033/login
Content-Type: application/json
{"username":"叮叮","password":"123456","code":"","uuid":""}
(用户名须为系统 sys_user 里的 user_name,不是昵称;密码与库中一致。)
二、接口列表
1. 检索 ND 项目(选令号 / 切换项目)
GET /system/nd3/phased-product/search
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| keyword | string | 是 | 物料编码、BOM 父项或 ND3 生产令号关键字 |
示例
GET http://localhost:8033/system/nd3/phased-product/search?keyword=LTBZE
data 结构
interface Nd3PhasedProductProjectVo {
productionOrderNo: string; // 生产令号,切换项目用
productCode: string; // 默认主产品图号,可传给 report
productName: string;
}
2. 报表(页面主数据)
GET /system/nd3/phased-product/report
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| productionOrderNo | string | 否* | ND3 生产令号;有令号时发货/在途可按令号过滤 |
| materialCode | string | 否* | 主产品物料编码;只填此项可查金蝶 BOM + 库存/在途 |
| inputQty | number | 否 | 计划投产量;大于 0 时返回 deployRows |
* productionOrderNo 与 materialCode 至少填一项(二选一或都填)。
示例
# 只填物料号(不必填令号)
GET .../report?materialCode=LTBZE/L.01.0-MP
# 按令号查(可再指定主产品)
GET .../report?productionOrderNo=ND3-26-009-LT
GET .../report?productionOrderNo=ND3-26-009-LT&materialCode=KP14E(B)-45C-180B-42T-R
# 带投产量试算
GET .../report?materialCode=LTBZE/L.01.0-MP&inputQty=10
data 结构
interface Nd3PhasedProductReportVo {
productionOrderNo: string;
bomHeader: Nd3BomHeaderVo;
mainProduct: Nd3MainProductVo;
subItems: { selfMade: Nd3SubMaterialRowVo[]; purchase: Nd3SubMaterialRowVo[] };
deployRows: Nd3DeployRowVo[]; // 仅传 inputQty 时有数据
}
interface Nd3SubMaterialRowVo {
materialCode: string;
materialName: string;
materialType: string; // 自制 | 外购
requiredQty: number; // 单台用量
stockQty: number;
noPickedQty: number;
transitMoQty: number;
transitPoQty: number;
expectedAvailableQty: number; // 库存 + 在途 − 未领料
transitMoRows: Nd3TransitMoRowVo[]; // productionOrderNo / sclh, planFinishDate
transitPoRows: Nd3TransitPoRowVo[]; // productionOrderNo / projectOrderNo, deliveryDate(到货日期)
}
interface Nd3MainProductVo {
productCode: string;
productName: string;
stockQty: number;
deliverQty: number;
transitQty: number; // 在途合计
stockDrillRows: Nd3QuantityDrillRowVo[];
deliverDrillRows: Nd3QuantityDrillRowVo[];
transitDrillRows: Nd3QuantityDrillRowVo[];
transitMoRows: Nd3TransitMoRowVo[];
}
interface Nd3DeployRowVo {
materialCode: string;
materialName: string;
needQty: number; // 单台用量 × inputQty
remainDeployQty: number; // max(0, 需投 − 可用)
}
三、页面流程(建议)
1. 产品检索框 [keyword] → 调 /search → 列表展示(可能有令号,也可能只有 productCode)
2. 用户选中一条 → 记录 productCode;有 productionOrderNo 则一并带上
3. 调 /report:**至少传 materialCode 或 productionOrderNo**(只搜到 BOM 时只传 materialCode 即可)
4. 用户切换项目 → 有令号则改 productionOrderNo 重查;无令号则改 materialCode 重查
5. 用户改投产量 → 带上 inputQty 再调 /report → 展示 deployRows
四、界面布局建议
4.1 顶部筛选区
| 控件 | 绑定 | 行为 |
|---|---|---|
| 项目产品检索 | keyword | 失焦/搜索按钮 → /search |
| 当前生产令号 | productionOrderNo | 来自 search 选中项,只读或可下拉切换 |
| 主产品图号 | materialCode | 可选;默认用 search 返回的 productCode 作为 materialCode |
| 投产量 | inputQty | 数字输入;变更后重新 /report |
4.2 主产品卡片
展示 data.mainProduct:
| 列名 | 字段 | 交互 |
|---|---|---|
| 主产品编码 | productCode | 文本 |
| 主产品名称 | productName | 文本 |
| 库存数量 | stockQty | 可点击 → 弹窗/展开 stockDrillRows |
| 发货数量 | deliverQty | 可点击 → deliverDrillRows |
| 在途数量 | transitQty | 可点击 → transitDrillRows / transitMoRows |
下钻表列:sclh | orderNo | qty | planStartDate | planFinishDate | instockQty | notInstockQty
4.3 BOM 子项表(主体)
数据源:data.subItems.selfMade + data.subItems.purchase
| 列名 | 字段 | 说明 |
|---|---|---|
| 物料编码 | materialCode | |
| 物料名称 | materialName | |
| 类型 | materialType | 自制 / 外购 |
| 单台用量 | requiredQty | |
| 库存 | stockQty | |
| 未领料 | noPickedQty | |
| 在途(MO) | transitMoQty | |
| 在途(PO) | transitPoQty | |
| 预计可用 | expectedAvailableQty | 库存 + 在途 − 未领料 |
| 操作 | — | MO → transitMoRows,PO → transitPoRows |
采购在途明细弹窗(数据源:row.transitPoRows,不要用 MO 的 sclh / planFinishDate 列名)
| 列名 | 字段 | 说明 |
|---|---|---|
| 采购单号 | billNo | |
| 生产令号 | productionOrderNo 或 projectOrderNo | 金蝶 F_UCHN_Text2 |
| 到货日期 | deliveryDate | 金蝶 FDeliveryDate,展示时建议 slice(0,10) |
| 订单日期 | orderDate | |
| 订单数量 | orderQty | |
| 剩余未入库 | remainStockInQty |
生产在途明细弹窗(数据源:row.transitMoRows)
| 列名 | 字段 |
|---|---|
| 生产单号 | billNo |
| 生产令号 | productionOrderNo 或 sclh |
| 计划完工 | planFinishDate |
| 未入库数量 | notInstockQty |
在途扁平列表(row.transitDrillRows,含 MO+PO 混合):按 sourceType 分列——采购在途 用 productionOrderNo + deliveryDate;生产在途 用 productionOrderNo + planFinishDate。
4.4 投产量区(可选)
当 inputQty > 0 且重新请求后,展示 data.deployRows:
| 列名 | 字段 |
|---|---|
| 物料编码 | materialCode |
| 物料名称 | materialName |
| 需投数量 | needQty |
| 剩余投放 | remainDeployQty |
五、前端注意点(联调必读)
- 不必填令号:只传
materialCode即可查 BOM 及指标。 - 有令号时:传
productionOrderNo可把发货/在途按该令号收窄。 - 在途下钻:MO/PO 明细中可能出现其它令号(QB 等),勿假设全部等于当前令号。
- deployRows:未传
inputQty时恒为[]。 - 图号特殊字符:
materialCode含/、()等须 URL 编码。
六、错误处理
| code / msg | 处理 |
|---|---|
| 非 200 | 展示 msg |
请输入物料编码或生产令号 |
search 未填 keyword |
请填写物料编码或生产令号 |
report 两个参数都未填 |
| 401 | 重新登录拿 Token |