589 lines
53 KiB
HTML
589 lines
53 KiB
HTML
<!doctype html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<meta name="description" content="MES 系统调用 SAP Business One 与 TM 条码系统接口的开发与联调说明">
|
||
<title>MES - SAP B1 与 TM 接口调用说明</title>
|
||
<style>
|
||
:root { --ink: #17212b; --muted: #5e6b78; --line: #d7dee5; --paper: #fff; --page: #edf2f4; --nav: #122b3d; --blue: #0d6b96; --teal: #008073; --red: #b93829; --amber: #9b6700; --code: #102433; }
|
||
* { box-sizing: border-box; }
|
||
html { scroll-behavior: smooth; }
|
||
body { margin: 0; background: var(--page); color: var(--ink); font: 14px/1.65 "Microsoft YaHei", "PingFang SC", Arial, sans-serif; }
|
||
.topbar { min-height: 64px; background: var(--nav); color: #fff; display: flex; align-items: center; justify-content: space-between; padding: 0 34px; }
|
||
.brand { font-size: 17px; font-weight: 700; letter-spacing: 0; }
|
||
.topbar button { border: 1px solid #91a6b4; border-radius: 4px; background: transparent; color: #fff; padding: 7px 12px; cursor: pointer; font: inherit; }
|
||
.layout { display: grid; grid-template-columns: 224px minmax(0, 980px); gap: 24px; max-width: 1260px; margin: 28px auto; padding: 0 24px; align-items: start; }
|
||
aside { position: sticky; top: 20px; background: #fff; border: 1px solid var(--line); border-radius: 6px; padding: 14px 10px; }
|
||
aside p { margin: 0 10px 8px; font-size: 12px; font-weight: 700; color: var(--muted); }
|
||
nav a { display: block; padding: 7px 10px; color: #34495a; text-decoration: none; border-radius: 4px; }
|
||
nav a:hover { background: #e8f3f6; color: var(--blue); }
|
||
main { min-width: 0; }
|
||
.doc-head { background: var(--paper); border: 1px solid var(--line); border-radius: 6px; padding: 36px 42px 28px; border-top: 5px solid var(--teal); }
|
||
.eyebrow { margin: 0 0 10px; color: var(--teal); font-size: 12px; font-weight: 700; letter-spacing: .08em; }
|
||
h1, h2, h3 { line-height: 1.28; margin: 0; }
|
||
h1 { font-size: 30px; }
|
||
h2 { font-size: 20px; padding-bottom: 9px; border-bottom: 1px solid var(--line); margin-bottom: 17px; }
|
||
h3 { font-size: 15px; margin: 20px 0 8px; }
|
||
.subtitle { margin: 12px 0 0; color: var(--muted); font-size: 15px; }
|
||
.meta { display: flex; flex-wrap: wrap; gap: 8px 24px; margin-top: 23px; padding-top: 15px; border-top: 1px solid var(--line); color: var(--muted); font-size: 12px; }
|
||
section { background: var(--paper); border: 1px solid var(--line); border-radius: 6px; padding: 28px 32px; margin-top: 18px; }
|
||
p { margin: 8px 0; }
|
||
ul, ol { margin: 8px 0; padding-left: 22px; }
|
||
li { margin: 4px 0; }
|
||
.notice { padding: 13px 15px; border-left: 4px solid var(--amber); background: #fff8e8; color: #654900; margin: 16px 0; }
|
||
.risk { border-left-color: var(--red); background: #fff3f1; color: #7b241c; }
|
||
.flow { display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px; align-items: center; margin: 18px 0; }
|
||
.flow-node { min-height: 70px; padding: 10px; display: flex; align-items: center; justify-content: center; text-align: center; border: 1px solid #b7ccd4; border-radius: 4px; background: #f5fbfc; font-weight: 700; }
|
||
.arrow { color: var(--teal); text-align: center; font-size: 22px; }
|
||
table { width: 100%; border-collapse: collapse; margin: 13px 0; font-size: 13px; }
|
||
th, td { border: 1px solid var(--line); padding: 9px 10px; vertical-align: top; text-align: left; }
|
||
th { color: #243b4b; background: #edf5f6; font-weight: 700; }
|
||
code { color: #9a3a21; font: 12px/1.5 Consolas, "Courier New", monospace; word-break: break-word; }
|
||
pre { overflow: auto; margin: 12px 0; padding: 15px; border-radius: 4px; background: var(--code); color: #e8f3f5; font: 12px/1.6 Consolas, "Courier New", monospace; }
|
||
pre code { color: inherit; word-break: normal; }
|
||
.tag { display: inline-block; padding: 1px 7px; border-radius: 3px; font: 700 11px/1.7 Arial, sans-serif; white-space: nowrap; }
|
||
.read { background: #e3f3f0; color: #006d61; }
|
||
.write { background: #ffe9e6; color: #a42e21; }
|
||
.write::after { content: " 禁止调用"; }
|
||
.checklist { list-style: none; padding: 0; }
|
||
.checklist li { padding: 8px 0 8px 28px; position: relative; border-bottom: 1px solid #edf0f2; }
|
||
.checklist li::before { content: "□"; position: absolute; left: 4px; color: var(--teal); font-size: 18px; line-height: 1.2; }
|
||
.small { font-size: 12px; color: var(--muted); }
|
||
.operation-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; margin: 14px 0 6px; }
|
||
.operation-card { border: 1px solid var(--line); border-top: 3px solid var(--teal); border-radius: 5px; padding: 14px; min-width: 0; }
|
||
.operation-card h4 { margin: 0 0 7px; font-size: 15px; }
|
||
.operation-heading { margin: 22px 0 8px; font-size: 16px; }
|
||
.operation-card p { margin: 6px 0; }
|
||
.operation-card ol { margin: 7px 0 10px; padding-left: 20px; }
|
||
.operation-card figure { margin: 12px 0 0; }
|
||
.operation-card img { display: block; width: 100%; height: auto; border: 1px solid #cbd7de; border-radius: 3px; background: #f6f8f9; }
|
||
.operation-card figcaption { margin-top: 5px; color: var(--muted); font-size: 12px; }
|
||
.operation-trigger { padding: 8px 10px; border-left: 3px solid #b7ccd4; background: #f5f8fa; font-size: 12px; }
|
||
.footer { color: var(--muted); padding: 17px 0 40px; font-size: 12px; }
|
||
@media (max-width: 820px) { .topbar { padding: 0 18px; } .layout { display: block; margin: 16px auto; padding: 0 14px; } aside { position: static; margin-bottom: 16px; } .doc-head, section { padding: 24px 20px; } .flow { grid-template-columns: 1fr; } .arrow { transform: rotate(90deg); } h1 { font-size: 25px; } table { display: block; overflow-x: auto; white-space: nowrap; } }
|
||
@media (max-width: 820px) { .operation-grid { grid-template-columns: 1fr; } }
|
||
@media print { @page { margin: 15mm; } body { background: #fff; font-size: 10pt; } .topbar, aside { display: none; } .layout { display: block; max-width: none; margin: 0; padding: 0; } .doc-head, section { border: 0; padding: 0; margin: 0 0 18px; } .doc-head { border-top: 4px solid var(--teal); padding-top: 15px; } section { break-inside: avoid; } pre { white-space: pre-wrap; font-size: 8.5pt; } }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<header class="topbar">
|
||
<div class="brand">MES / SAP B1 / TM 集成说明</div>
|
||
<button type="button" onclick="window.print()" title="打印或另存为 PDF">打印 / 导出 PDF</button>
|
||
</header>
|
||
<div class="layout">
|
||
<aside aria-label="文档目录">
|
||
<p>目录</p>
|
||
<nav>
|
||
<a href="#overview">1. 概述与边界</a>
|
||
<a href="#architecture">2. 调用架构</a>
|
||
<a href="#login">3. B1 登录与会话</a>
|
||
<a href="#protocol">4. 网关报文协议</a>
|
||
<a href="#services">5. B1 查询与更新</a>
|
||
<a href="#tm">6. TM 条码任务</a>
|
||
<a href="#sql">7. SAP 只读数据查询</a>
|
||
<a href="#mytask">8. 定时同步 update_MyTask</a>
|
||
<a href="#pagecalls">9. 页面接口调用清单</a>
|
||
</nav>
|
||
</aside>
|
||
<main>
|
||
<header class="doc-head">
|
||
<p class="eyebrow">TECHNICAL INTEGRATION GUIDE</p>
|
||
<h1>MES 调用 SAP B1 与 TM 接口说明</h1>
|
||
<p class="subtitle">适用于 SAP Business One Service Layer、TM 条码任务,以及 SQL Server 链接服务器只读查询。</p>
|
||
<div class="meta"><span>文档版本:V1.0</span><span>编制日期:2026-08-03</span><span>适用系统:MES 管理端</span><span>状态:实施参考</span></div>
|
||
</header>
|
||
|
||
<section id="overview">
|
||
<h2>1. 概述与边界</h2>
|
||
<p>本项目存在三类 SAP/TM 集成方式,必须按各自的数据方向和调用边界实施:</p>
|
||
<table>
|
||
<thead><tr><th>集成方式</th><th>用途</th><th>方向</th><th>项目位置</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>SAP B1 Service Layer 网关</td><td>工位、工艺、生产订单、采购申请、生产发料等业务对象的查询或写入</td><td>MES 调用 SAP</td><td><code>src/api/b1s.js</code></td></tr>
|
||
<tr><td>TM 条码网关</td><td>生产领料出库任务、质检/退库入库任务的创建与状态反馈</td><td>MES 调用 TM</td><td><code>src/api/tm.js</code></td></tr>
|
||
<tr><td>SQL Server 链接服务器 <code>[SAP]</code></td><td>物料、项目、缺件、发货等报表的只读查询</td><td>MES 数据库读取 SAP 视图</td><td>数据库存储过程与 <code>db_backups/*.sql</code></td></tr>
|
||
</tbody>
|
||
</table>
|
||
<div class="notice">浏览器端的 B1、TM 调用均经项目网关转发。业务代码应只使用 B1 的 <code>getB1</code>、<code>postB1</code>、<code>patchB1</code> 或 TM 的 <code>gettm</code>、<code>posttm</code>、<code>patchtm</code>,不要在 Vue 页面保存 B1 密码、SessionId 或 TM AccessToken。</div>
|
||
<div class="notice risk"><strong>写入边界:</strong>生产订单关闭、采购申请、工位和工艺同步均会改变 SAP 数据。写操作须经业务权限、数据校验和二次确认;测试环境设置 <code>externalReadOnly: true</code> 时,封装会阻止 <code>POST</code> 与 <code>PATCH</code>。</div>
|
||
</section>
|
||
|
||
<section id="architecture">
|
||
<h2>2. 调用架构</h2>
|
||
<div class="flow" aria-label="MES 到 SAP 的调用链">
|
||
<div class="flow-node">Vue 页面<br>业务操作</div><div class="arrow">→</div>
|
||
<div class="flow-node"><code>src/api/b1s.js</code><br>统一封装</div><div class="arrow">→</div>
|
||
<div class="flow-node">B1 网关<br><code>baseURLB1</code></div><div class="arrow">→</div>
|
||
<div class="flow-node">SAP B1<br>Service Layer</div>
|
||
</div>
|
||
<h3>2.1 运行时配置</h3>
|
||
<p>当前部署配置位于 <code>static/config.js</code>:<code>baseURLB1</code> 指向 B1 网关 <code>/b1s</code>,<code>baseURLtm</code> 指向 TM 网关 <code>/openapi</code>。地址由运行环境配置提供,前端源码不应硬编码 SAP 地址、账号、密码、SessionId 或 TM Token。</p>
|
||
<p>开发环境代理将 <code>/api/b1s</code> 转至 SAP Service Layer 的 <code>/b1s/v1</code>,将 <code>/api/tm</code> 转至条码系统的 <code>/openapi/v1</code>。生产调用实际以运行时 <code>baseURLB1</code> 与 <code>baseURLtm</code> 为准。</p>
|
||
<h3>2.2 认证与会话</h3>
|
||
<p>前端封装未在每个业务调用中传递 SAP 用户名和密码,认证与 SAP 会话应由 B1 网关统一管理。登录信息、会话 Cookie、证书及跨域策略均不得写入页面代码、接口参数、浏览器日志或本说明文档。</p>
|
||
</section>
|
||
|
||
<section id="login">
|
||
<h2>3. B1 登录与会话</h2>
|
||
<p>对接方案规定:每次直接调用 SAP Service Layer 前,先登录取得响应体中的 <code>SessionId</code>;后续请求在 Header 中携带 <code>Cookie: B1SESSION=<SessionId>;</code>。方案样例的会话有效期为 30 分钟,具体以登录响应的 <code>SessionTimeout</code> 为准。</p>
|
||
<div class="notice"><strong>项目当前模式:</strong>Vue 页面并没有直接调用 <code>/Login</code>,也没有给每次请求附加 <code>B1SESSION</code>。这是正确的浏览器安全边界,B1 网关必须负责登录、缓存/续期会话并转发请求。下列直接调用示例只适用于网关服务端或 Postman 联调,不能将账号密码搬到前端。</div>
|
||
<h3>3.1 直接登录 B1 Service Layer</h3>
|
||
<pre><code>POST https://{b1-host}:50000/b1s/v1/Login
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"CompanyDB": "TEST_YL 或 SBO_YL",
|
||
"UserName": "${B1_USER}",
|
||
"Password": "${B1_PASSWORD}",
|
||
"Language": "15"
|
||
}
|
||
|
||
// 成功响应必须读取并安全保存 SessionId;不要写入浏览器 localStorage。
|
||
{
|
||
"SessionId": "...",
|
||
"Version": "...",
|
||
"SessionTimeout": 30
|
||
}</code></pre>
|
||
<h3>3.2 后续查询/更新 Header</h3>
|
||
<pre><code>GET https://{b1-host}:50000/b1s/v1/ProductionOrders?$filter=AbsoluteEntry eq 1234
|
||
Cookie: B1SESSION=${SESSION_ID};
|
||
Accept: application/json</code></pre>
|
||
<p>收到 401、会话过期或 “not connected to a company” 类错误时,网关应只重登录一次后重试原请求;仍失败则返回失败给 MES。禁止在前端静默无限重试,避免重复创建采购申请、生产发料单等外部单据。</p>
|
||
</section>
|
||
|
||
<section id="protocol">
|
||
<h2>4. MES 网关报文协议</h2>
|
||
<p><code>b1s.js</code> 与 <code>tm.js</code> 均向各自网关根路径发送 HTTP <code>POST</code>。网关请求体为 JSON,实际下游动词由 <code>func</code> 指定;B1 或 TM 的认证 Header 由网关维护。</p>
|
||
<table>
|
||
<thead><tr><th>字段</th><th>类型</th><th>说明</th><th>示例</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><code>func</code></td><td>string</td><td>目标 Service Layer 动词</td><td><code>GET</code> 可查询;<code>POST</code>、<code>PATCH</code> 禁止调用</td></tr>
|
||
<tr><td><code>cmd</code></td><td>string</td><td>SAP 对象路径,封装会移除传入路径中的首个 <code>/</code></td><td><code>ProductionOrders(1234)</code></td></tr>
|
||
<tr><td><code>content</code></td><td>string</td><td>业务参数或请求体的 JSON 字符串</td><td><code>{"ProductionOrderStatus":"boposClosed"}</code></td></tr>
|
||
</tbody>
|
||
</table>
|
||
<pre><code>// 读取:getB1('/ProductionOrders', { "$filter": "AbsoluteEntry eq 1234" })
|
||
POST {baseURLB1}
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"func": "GET",
|
||
"cmd": "ProductionOrders",
|
||
"content": "{\"$filter\":\"AbsoluteEntry eq 1234\"}"
|
||
}
|
||
|
||
// 禁止调用(func=PATCH):patchB1('/ProductionOrders(1234)', { ProductionOrderStatus: 'boposClosed' })
|
||
{
|
||
"func": "PATCH",
|
||
"cmd": "ProductionOrders(1234)",
|
||
"content": "{\"ProductionOrderStatus\":\"boposClosed\"}"
|
||
}</code></pre>
|
||
<p class="small">封装默认超时为 100 秒。调用结果统一为 <code>{ success: true, data }</code> 或 <code>{ success: false, message }</code>;页面必须检查 <code>success</code> 后再提示用户或更新本地状态。</p>
|
||
</section>
|
||
|
||
<section id="services">
|
||
<h2>5. B1 查询、更新与生产反馈</h2>
|
||
<h3>5.1 生产订单 <code>ProductionOrders</code></h3>
|
||
<table>
|
||
<thead><tr><th>操作</th><th>调用</th><th>用途</th><th>写入风险</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><span class="tag read">GET</span></td><td><code>getB1('/ProductionOrders', { '$filter': 'AbsoluteEntry eq 订单号' })</code></td><td>读取订单、工序阶段、资源行等数据。</td><td>无写入;结果为空时不可直接取 <code>value[0]</code>。</td></tr>
|
||
<tr><td><span class="tag write">PATCH</span></td><td><code>patchB1('/ProductionOrders(订单号)', { ProductionOrderStatus: 'boposClosed' })</code></td><td>关闭生产订单。</td><td>高。须逐单记录结果,处理部分成功和重复关闭。</td></tr>
|
||
<tr><td><span class="tag write">PATCH</span></td><td><code>patchB1('ProductionOrders(订单号)', { ProductionOrderLines, ProductionOrdersStages })</code></td><td>工时校验场景更新订单工序与资源。</td><td>高。先读取最新订单,再合并工序/资源,不能用陈旧的整单数组覆盖 SAP 数据。</td></tr>
|
||
</tbody>
|
||
</table>
|
||
<p>生产订单是 MES 与 SAP 的主关联对象。以 <code>AbsoluteEntry</code>(MES 中的订单号/计划号)查询;订单状态使用 <code>boposPlanned</code>、<code>boposReleased</code>、<code>boposClosed</code>、<code>boposCancelled</code>。更新 <code>ProductionOrderLines</code> 或 <code>ProductionOrdersStages</code> 后,SAP 不保证返回完整订单,必须立即按 <code>AbsoluteEntry</code> 重查,并将实际的 <code>LineNumber</code>、<code>StgEntry</code>、<code>StgSeqNum</code> 回写到 MES 的关联记录。</p>
|
||
<pre><code>// 当前项目可直接使用的查询方式:由 B1 网关持有会话
|
||
const orderResult = await getB1('/ProductionOrders', {
|
||
'$filter': 'AbsoluteEntry eq ' + orderNo,
|
||
'$select': 'AbsoluteEntry,ProductionOrderStatus,ItemNo,PlannedQuantity,Project'
|
||
});
|
||
if (!orderResult.success || !orderResult.data?.value?.length) {
|
||
throw new Error(orderResult.message || '未找到 SAP 生产订单');
|
||
}
|
||
const order = orderResult.data.value[0];</code></pre>
|
||
<h3>5.2 工位资源 <code>Resources</code></h3>
|
||
<table><thead><tr><th>操作</th><th>调用与关键字段</th><th>业务场景</th></tr></thead><tbody>
|
||
<tr><td><span class="tag write">POST</span></td><td><code>postB1('/Resources', { VisCode, Name, Type: 'rtMachine', Group: 1, Active: 'tYES', ... })</code></td><td>新增 MES 工位后同步创建 SAP 资源。</td></tr>
|
||
<tr><td><span class="tag write">PATCH</span></td><td><code>patchB1("/Resources('工位号')", { Name })</code></td><td>工位名称变更后同步 SAP 资源名称。</td></tr>
|
||
</tbody></table>
|
||
<h3>5.3 工艺阶段 <code>RouteStages</code></h3>
|
||
<table><thead><tr><th>操作</th><th>调用与关键字段</th><th>业务场景</th></tr></thead><tbody>
|
||
<tr><td><span class="tag write">POST</span></td><td><code>postB1('/RouteStages', { Code, Description, CreationDate, DateOfUpdate })</code></td><td>新增 MES 工艺后同步创建 SAP 工艺阶段。</td></tr>
|
||
<tr><td><span class="tag read">GET</span> + <span class="tag write">PATCH</span></td><td>先用 <code>Code</code> 过滤查询得到 <code>InternalNumber</code>,再 <code>patchB1('/RouteStages(' + InternalNumber + ')', {...})</code>。</td><td>编辑 MES 工艺时更新 SAP 描述和更新时间。</td></tr>
|
||
</tbody></table>
|
||
<h3>5.4 采购申请 <code>PurchaseRequests</code></h3>
|
||
<table><thead><tr><th>操作</th><th>调用与关键字段</th><th>业务场景</th></tr></thead><tbody>
|
||
<tr><td><span class="tag write">POST</span></td><td><code>postB1('/PurchaseRequests', { ReqType, Requester, DocDate, RequredDate, DocumentLines })</code></td><td>外协派工并同步 SAP 时创建采购申请;<code>DocumentLines</code> 中包含物料、数量、仓库、生产订单及工序关联字段。</td></tr>
|
||
</tbody></table>
|
||
<p>采购申请创建成功后,必须从返回数据取得并保存 SAP <code>DocEntry</code> 及 <code>DocNum</code>。表头至少维护 <code>ReqType</code>、<code>Requester</code>、<code>DocDate</code>、<code>DocDueDate</code>、<code>TaxDate</code>、<code>RequriedDate</code>;每个 <code>DocumentLines</code> 行至少维护 <code>ItemCode</code>、<code>Quantity</code>、<code>WarehouseCode</code>。日期按 <code>YYYY-MM-DD</code> 传递,数量按业务精度处理。</p>
|
||
<h3>5.5 生产报工反馈 <code>InventoryGenExits</code></h3>
|
||
<p>项目的工时校验页面会先同步生产订单工序/资源,再创建 SAP 生产发料单,以回传设备或人工报工。单据头使用 <code>DocDate</code>、<code>DocDueDate</code>、<code>Comments</code>;行项目基于生产订单使用 <code>BaseType: 202</code>、<code>BaseEntry</code>(生产订单号)、<code>BaseLine</code>(SAP 生产订单行号),并携带资源/物料行、数量、仓库及工序阶段关联。</p>
|
||
<pre><code>const feedback = await postB1('/InventoryGenExits', {
|
||
DocDate: '2026-08-03',
|
||
DocDueDate: '2026-08-03',
|
||
Comments: 'MES报工 AID:12345; 项目:HT-0001',
|
||
DocumentLines: [{
|
||
BaseType: 202,
|
||
BaseEntry: 1234,
|
||
BaseLine: 2,
|
||
LineType: 'dlt_Resource',
|
||
WarehouseCode: '',
|
||
U_ResName: '数控车床A',
|
||
Quantity: 1.5
|
||
}]
|
||
});
|
||
if (!feedback.success) throw new Error(feedback.message || 'SAP 生产反馈失败');
|
||
// 保存返回的 DocEntry,作为 MES 报工与 SAP 发料单的追溯键。</code></pre>
|
||
</section>
|
||
|
||
<section id="tm">
|
||
<h2>6. TM 条码任务:认证、创建与反馈</h2>
|
||
<h3>6.1 当前可调用链路</h3>
|
||
<p>项目使用 <code>src/api/tm.js</code>,运行时入口为 <code>window.dt_Config.baseURLtm</code>。现有页面已实际调用以下路径:<code>posttm('/stocktask/task/issueordertask', payload)</code> 创建领料出库任务;<code>posttm('/stocktask/task/receiptordertask', payload)</code> 创建收货/退库入库任务。网关把 <code>func</code>、<code>cmd</code>、<code>content</code> 转发至 TM OpenAPI。</p>
|
||
<table><thead><tr><th>TM 业务接口</th><th>下游 OpenAPI 路径</th><th>项目触发场景</th><th>核心请求字段</th></tr></thead><tbody>
|
||
<tr><td>创建出库任务</td><td><code>POST /openapi/v1/stocktask/task/issueordertask</code></td><td>加工中心、装配中心、质量中心领料。</td><td><code>doc_date</code>、<code>doc_type</code>、<code>external_num</code>、<code>task_items[]</code></td></tr>
|
||
<tr><td>创建入库任务</td><td><code>POST /openapi/v1/stocktask/task/receiptordertask</code></td><td>不合格品入库、退库质检后入库。</td><td><code>doc_date</code>、<code>doc_type</code>、<code>external_num</code>、<code>task_items[]</code></td></tr>
|
||
</tbody></table>
|
||
<h3>6.2 TM 怎么登录</h3>
|
||
<div class="notice risk"><strong>当前事实:</strong>提供的 TM OpenAPI 资料只列出 Header <code>Authorization: AccessToken</code>,并定义 401/403 响应;没有给出“登录/换取 AccessToken”的 URL、请求体、Token 有效期或刷新协议。项目源码也没有实现 <code>logintm</code>,虽然仪表盘调用了该名称。因此当前代码不能作为 TM 登录实现的依据。</div>
|
||
<p>要使 TM 调用可用,必须由条码系统供应方提供并确认以下五项,再由网关实现,前端不保存 Token:登录/换取 Token 地址与方法、账号认证字段、Header 格式、有效期与刷新方式、401 后的重试规则。网关应将 Token 写入服务端安全存储,并在转发 TM 请求时增加 <code>Authorization: <AccessToken></code> 和需要时的 <code>Accept-Language: zh_CN</code>。</p>
|
||
<h3>6.3 实际任务报文与成功判定</h3>
|
||
<pre><code>const payload = {
|
||
doc_date: '2026-08-03',
|
||
doc_type: '202-60', // 现有领料页面使用的业务类型;变更前需与 TM 数据字典核对
|
||
external_num: '1234', // MES/SAP 关联单据号
|
||
task_items: [{
|
||
base_type: '202',
|
||
base_entry: '1234',
|
||
base_line_num: 2,
|
||
external_num: '1234',
|
||
item_code: 'ITEM-001',
|
||
item_name: '物料名称',
|
||
line_memo: 'MES领料任务',
|
||
whs_code: 'W03',
|
||
manage_type: 'B',
|
||
price: 0,
|
||
quantity: 2
|
||
}]
|
||
};
|
||
|
||
const tmResult = await posttm('/stocktask/task/issueordertask', payload);
|
||
if (!tmResult.success) throw new Error(tmResult.message || 'TM 网关请求失败');
|
||
// TM 接口返回结构为 { code, data, message }。
|
||
// 必须按供应方确认的成功 code 判断,并保存 data 中的任务标识;不能仅凭 HTTP 2xx 提示“请求成功”。
|
||
if (!isTmBusinessSuccess(tmResult.data)) throw new Error(tmResult.data?.message || 'TM 创建任务失败');</code></pre>
|
||
<p>TM 入库任务同样使用 <code>receiptordertask</code>;入库明细必须至少包含物料编码与数量,涉及批次时还需传 <code>batch_number</code>。条码接口文档定义的返回结构为 <code>{ code, data, message }</code>,HTTP 200/201 才代表传输成功,401 表示 Token 无效,403 表示无权限,404 表示路径/资源不存在。业务成功码需由 TM 供应方确认后配置到网关。</p>
|
||
<div class="notice risk"><strong>现有代码需注意:</strong>多个页面在 <code>await posttm(...)</code> 后不检查 <code>result2.success</code> 和 <code>result2.data.code</code> 即弹出“请求成功”。联调或正式上线前,必须改为以上述两层校验为准,并把 TM 的任务 ID、返回码、返回信息和请求流水号落库,才能支持查询、重推与对账。</div>
|
||
</section>
|
||
|
||
<section id="sql">
|
||
<h2>7. SAP 只读数据查询</h2>
|
||
<p>以下数据通过 SQL Server 链接服务器 <code>[SAP]</code> 读取,不属于 Service Layer 写接口。存储过程只能使用最小字段集,避免无条件跨库大范围查询。</p>
|
||
<table>
|
||
<thead><tr><th>SAP 视图</th><th>项目用途</th><th>代表字段/关联口径</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><code>SBO_YL.dbo.UBT_OITM</code></td><td>物料下拉查询、设计报工物料查询。</td><td>物料编码、物料名称、物料描述、规格型号、自制件属性。</td></tr>
|
||
<tr><td><code>SBO_YL.dbo.VIEW_OPRJ</code></td><td>设计报工项目号查询。</td><td>项目代码、项目名称;项目号必须从 SAP 项目视图读取。</td></tr>
|
||
<tr><td><code>SBO_YL.dbo.VIEW_Jijiankukc</code></td><td>及时齐套跟踪的缺件和库存查询。</td><td>ItemCode、DocEntry、Project、未发货数量、在制采购、采购预计交货日期、库存量等。</td></tr>
|
||
<tr><td><code>SBO_YL.dbo.UBT_ODRF_ODLNMES</code></td><td>发货通知与发货瓶颈看板。</td><td>生产单号、项目号、物料、交货数量、要求发货时间、单据状态。</td></tr>
|
||
</tbody>
|
||
</table>
|
||
<pre><code>-- 只读示例:以参数限定、显式转换数据类型
|
||
SELECT TOP (100)
|
||
CAST([物料编码] AS nvarchar(100)) AS [物料编码],
|
||
CAST([物料名称] AS nvarchar(200)) AS [物料名称]
|
||
FROM [SAP].[SBO_YL].[dbo].[UBT_OITM]
|
||
WHERE CAST([物料编码] AS nvarchar(100)) LIKE N'%' + @过滤 + N'%'
|
||
ORDER BY CAST([物料编码] AS nvarchar(100));</code></pre>
|
||
<div class="notice">当四段名称跨库查询出现性能问题,应优先采用受控的 <code>OPENQUERY([SAP], ...)</code> 或将目标集先落入临时表,再与 MES 数据关联。不要在页面主列表中循环逐行查询 SAP。</div>
|
||
</section>
|
||
|
||
<section id="mytask">
|
||
<h2>8. 定时同步存储过程 <code>dbo.update_MyTask</code></h2>
|
||
<p>该过程运行在 <code>YL_MESDB</code>,不接收参数。它通过 SQL Server 链接服务器 <code>[SAP].[SBO_YL].[dbo]</code> 读取 SAP 视图,再更新 MES 本地表;过程本身不调用 Service Layer,也不向 SAP 写入数据。</p>
|
||
<h3>8.1 SQL Agent 定时作业</h3>
|
||
<table><thead><tr><th>项目</th><th>实际配置</th></tr></thead><tbody>
|
||
<tr><td>作业名称</td><td><code>更新</code>,已启用</td></tr>
|
||
<tr><td>作业步骤</td><td><code>执行更新</code>,数据库 <code>YL_MESDB</code></td></tr>
|
||
<tr><td>执行命令</td><td><code>EXEC update_MyTask</code></td></tr>
|
||
<tr><td>计划</td><td><code>定时1min</code>,已启用;每日按 1 分钟间隔执行,起始时间 00:00:00。</td></tr>
|
||
</tbody></table>
|
||
<h3>8.2 实际同步内容</h3>
|
||
<table><thead><tr><th>MES 本地表</th><th>SAP 来源</th><th>更新字段与业务含义</th></tr></thead><tbody>
|
||
<tr><td><code>质量检验_质检任务_SAP</code></td><td><code>ubt_OPKL_UrgentMaterials</code></td><td>按物料编码更新 <code>加急总数</code>、<code>加急状态</code>。</td></tr>
|
||
<tr><td><code>MES_接口_生产计划</code></td><td><code>UBT_OWOR_OIGN</code></td><td>按订单编号更新 <code>入库数量</code>(来源已完工数量)。</td></tr>
|
||
<tr><td><code>MES_接口_生产计划</code></td><td><code>UBT_ODRF_ODLNMES</code></td><td>按生产单号更新 <code>发货状态</code> 与 <code>要求发货日期</code>。</td></tr>
|
||
<tr><td><code>MES_接口_生产计划</code></td><td><code>ubt_OPKL_UrgentMaterials</code></td><td>按物料编号更新 <code>加急总数</code>、<code>加急状态</code>。</td></tr>
|
||
<tr><td><code>MES_接口_生产计划</code></td><td><code>UBT_OPKL_CompleteSet</code></td><td>按生产订单号更新 <code>齐套</code>、<code>发料状态</code>、<code>齐套时间</code>、<code>拣配状态</code>。</td></tr>
|
||
<tr><td><code>MES_接口_生产计划_生产任务</code></td><td><code>UBT_OPKL_CompleteSet</code></td><td>当 SAP 执行状态为“可执行”且订单行号为 1 时,将 <code>任务状态</code> 更新为 1。</td></tr>
|
||
<tr><td><code>MES_接口_生产计划</code></td><td><code>UBT_OWOR</code>、<code>UBT_MES_ISSUEPRINT</code></td><td>将已取消/已结算订单标记为“已取消”,并同步 <code>派工时间</code>(打印时间)。</td></tr>
|
||
</tbody></table>
|
||
<h3>8.3 执行方式</h3>
|
||
<pre><code>-- SQL Agent 当前每分钟执行一次的命令
|
||
USE [YL_MESDB];
|
||
GO
|
||
EXEC [dbo].[update_MyTask];
|
||
GO</code></pre>
|
||
<p>过程将同步分为三个独立事务块,每个块使用 <code>TRY...CATCH</code>:发生错误即回滚当前事务并重新抛出错误。所有同步结果以 MES 本地表更新为准,页面查询应读取相应 MES 字段,不应把此过程误认为直接更新 SAP 单据的接口。</p>
|
||
</section>
|
||
|
||
<section id="pagecalls">
|
||
<h2>9. 页面 SAP / TM 接口调用清单</h2>
|
||
<p>本节按当前 <code>src/views</code> 中的有效调用整理,未计入注释代码和“副本”页面。所有前端调用均是向 MES 网关发送 HTTP <code>POST</code>;以下 <code>func</code> 才是网关转发给 B1/TM 的实际方法。</p>
|
||
<div class="notice risk"><strong>调用限制:</strong>本说明中所有 <code>"func": "POST"</code> 和 <code>"func": "PATCH"</code> 的网关请求均为<strong>禁止调用</strong>,不得在 Postman、浏览器控制台或其他客户端执行。即使 <code>QueryService_PostQuery</code> 的业务用途为查询,它的网关 <code>func</code> 仍为 <code>POST</code>,同样禁止调用。仅 <code>"func": "GET"</code> 可用于只读查询。</div>
|
||
<h3>9.1 Postman 网关环境</h3>
|
||
<table><thead><tr><th>Postman 变量</th><th>当前项目配置</th><th>用途</th></tr></thead><tbody>
|
||
<tr><td><code>{{mes_b1_gateway}}</code></td><td><code>https://192.168.2.92:9996/b1s</code></td><td>SAP B1 网关</td></tr>
|
||
<tr><td><code>{{mes_tm_gateway}}</code></td><td><code>https://192.168.2.92:9996/openapi</code></td><td>TM 条码网关</td></tr>
|
||
</tbody></table>
|
||
<pre><code>POST {{mes_b1_gateway}}
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"func": "GET",
|
||
"cmd": "ProductionOrders",
|
||
"content": "{\"$filter\":\"AbsoluteEntry eq 7316\"}"
|
||
}</code></pre>
|
||
<p>这是页面 <code>getB1('/ProductionOrders', { '$filter': 'AbsoluteEntry eq 7316' })</code> 发出的实际网关格式。将 <code>cmd</code> 填为下表对象路径,<code>content</code> 必须是 JSON 字符串而不是 JSON 对象。</p>
|
||
|
||
<h3>9.2 页面与功能映射、操作与截图</h3>
|
||
<table><thead><tr><th>页面</th><th>功能入口</th><th>系统 / func</th><th>cmd</th><th>页面实际传入参数</th></tr></thead><tbody>
|
||
<tr><td><code>SystemMaintenance/WorkstationManagement</code></td><td>新增工位</td><td>B1 / <span class="tag write">POST</span></td><td><code>Resources</code></td><td><code>VisCode</code> 工位号、<code>Name</code> 工位名、<code>ForeignName</code>、<code>Type=rtMachine</code>、<code>Group=1</code>、<code>UnitOfMeasure</code>、<code>IssueMethod=rimManual</code>、<code>Active=tYES</code>、<code>Inactive=tNO</code>、<code>Remarks</code>、<code>Allocation=raOnStartDate</code>。</td></tr>
|
||
<tr><td><code>SystemMaintenance/WorkstationManagement</code></td><td>编辑工位</td><td>B1 / <span class="tag write">PATCH</span></td><td><code>Resources('工位号')</code></td><td><code>Name</code>。</td></tr>
|
||
<tr><td><code>ProcessManagement/ProcedureManagement</code></td><td>新增工艺</td><td>B1 / <span class="tag write">POST</span></td><td><code>RouteStages</code></td><td><code>Code</code>(MES 工艺编号)、<code>Description</code>(工艺名称)、<code>CreationDate</code>、<code>DateOfUpdate</code>。</td></tr>
|
||
<tr><td><code>ProcessManagement/ProcedureManagement</code></td><td>编辑工艺</td><td>B1 / <span class="tag read">GET</span> 后 <span class="tag write">PATCH</span></td><td><code>RouteStages</code>;<code>RouteStages(InternalNumber)</code></td><td>先以 <code>$filter: Code eq '工艺编号'</code> 查询;从返回行取得 <code>InternalNumber</code> 后更新 <code>Description</code>、<code>DateOfUpdate</code>。</td></tr>
|
||
<tr><td><code>PlanManagement/PlannOrderClose</code></td><td>关闭生产订单</td><td>B1 / <span class="tag write">PATCH</span></td><td><code>ProductionOrders(订单编号)</code></td><td><code>AbsoluteEntry</code>、<code>ProductionOrderStatus=boposClosed</code>。</td></tr>
|
||
<tr><td><code>PlanManagement/WorkstationPlan</code>、<code>SelfMakePlan</code>、<code>SelfMakePlando</code>、<code>SelfMakePlandone</code></td><td>排产完成</td><td>B1 / <span class="tag write">PATCH</span></td><td><code>ProductionOrders(订单号)</code></td><td><code>AbsoluteEntry</code>、<code>U_MODueDate</code>(最晚完成)、<code>U_MOStartDate</code>(最早开始)。</td></tr>
|
||
<tr><td><code>PlanManagement/InstallMakePlan</code>、<code>InstallMakePlanDo</code>、<code>InstallMakePlanDone</code>、<code>SystemInstallTask</code>、<code>ValueInstallTask</code></td><td>派工</td><td>B1 / <span class="tag write">POST</span></td><td><code>PurchaseRequests</code></td><td><code>ReqType=12</code>、<code>Requester</code>、<code>PriceMode=G</code>、<code>RequesterBranch=-2</code>、<code>RequesterDepartment=-2</code>、<code>DocDate</code>、<code>DocDueDate</code>、<code>TaxDate</code>、<code>RequriedDate</code>、<code>Comments</code>、<code>DocumentLines[ItemCode, Quantity, WarehouseCode, U_WWOworID]</code>。</td></tr>
|
||
<tr><td>上述 5 个装配排产页</td><td>排产完成</td><td>B1 / <span class="tag write">PATCH</span></td><td><code>ProductionOrders(订单号)</code></td><td><code>AbsoluteEntry</code>、<code>U_MODueDate</code>、<code>U_MOStartDate</code>、<code>U_YJQTdate</code>(均使用页面计算出的开始/完成日期)。</td></tr>
|
||
<tr><td><code>ProductionManagement/OutsourceMange</code>、<code>SaleOutsourceMange</code></td><td>派工并同步 SAP</td><td>B1 / <span class="tag write">POST</span></td><td><code>PurchaseRequests</code></td><td>表头同派工;行项目实际含 <code>ItemCode</code>、<code>Quantity=指派数量</code>、<code>WarehouseCode</code>、<code>U_WWOworID</code>(订单号)、<code>U_WWOrst</code>(工序)、<code>U_WWOrstHS</code>(最后工序)、<code>U_WWOrstID</code>(最后 TaskAID)。</td></tr>
|
||
<tr><td><code>ProductionManagement/AssemblyCenter</code>、<code>MachiningCenter</code>、<code>QualityManagement/QualityCenter</code></td><td>领料弹窗</td><td>B1 / <span class="tag read">GET</span></td><td><code>ProductionOrders</code></td><td><code>$filter=AbsoluteEntry eq 当前订单号</code>;页面使用返回的 <code>ProductionOrderLines</code> 作为领料明细。</td></tr>
|
||
<tr><td><code>QualityManagement/CheckTask/materialReturn</code></td><td>退库质检后入库</td><td>B1 / <span class="tag read">GET</span></td><td><code>ProductionOrders</code></td><td><code>$filter=AbsoluteEntry eq 计划号</code>;按零件编码从 <code>ProductionOrderLines</code> 取得 <code>LineNumber</code>,作为 TM <code>base_line_num</code>。</td></tr>
|
||
<tr><td><code>ProductionManagement/WorkHoursCheck</code></td><td>工时校验上传 SAP</td><td>B1 / <span class="tag read">GET</span>、<span class="tag write">PATCH</span>、<span class="tag write">POST</span></td><td><code>ProductionOrders</code>;<code>InventoryGenExits</code></td><td>按 <code>AbsoluteEntry</code> 查询订单;更新 <code>ProductionOrderLines</code>、<code>ProductionOrdersStages</code>;再提交 <code>DocDate</code>、<code>DocDueDate</code>、<code>Comments</code>、<code>DocumentLines</code>(资源报工行)。</td></tr>
|
||
<tr><td><code>QualityManagement/CheckTask/processReceive</code></td><td>外协收检</td><td>B1 / <span class="tag write">POST</span></td><td><code>QueryService_PostQuery</code>;<code>PurchaseDeliveryNotes</code></td><td>先传 <code>QueryPath=$crossjoin(PurchaseOrders,PurchaseOrders/DocumentLines)</code> 和 <code>QueryOption</code>(订单号、工序和行状态筛选);匹配后传 <code>CardCode</code>、<code>CardName</code>、<code>DocDate</code>、<code>DocumentLines[BaseEntry, BaseLine, BaseType=22, Quantity, U_WWPassedQty]</code> 创建采购收货单。</td></tr>
|
||
<tr><td><code>ProductionManagement/AssemblyCenter</code>、<code>MachiningCenter</code>、<code>QualityManagement/QualityCenter</code>、<code>CheckTask/salesReturn</code></td><td>领料/销售退货出库任务</td><td>TM / <span class="tag write">POST</span></td><td><code>stocktask/task/issueordertask</code></td><td><code>doc_date</code>、<code>doc_type=202-60</code>、<code>external_num</code>、<code>task_items[base_type=202, base_entry, base_line_num, external_num, item_code, item_name, line_memo, whs_code, manage_type=B, price=0, quantity]</code>。</td></tr>
|
||
<tr><td><code>ProductionManagement/MachiningCenter</code></td><td>不合格品入库任务</td><td>TM / <span class="tag write">POST</span></td><td><code>stocktask/task/receiptordertask</code></td><td><code>doc_date</code>、<code>doc_type=202-59</code>、<code>external_num=计划号</code>、<code>task_items[base_entry, base_type=202, external_num, item_code, item_name, whs_code, manage_type=B, price=0, quantity=不合格数]</code>。</td></tr>
|
||
<tr><td><code>QualityManagement/CheckTask/materialReturn</code></td><td>退库质检合格后入库任务</td><td>TM / <span class="tag write">POST</span></td><td><code>stocktask/task/receiptordertask</code></td><td><code>doc_date</code>、<code>doc_type=202-60</code>、<code>external_num</code>、<code>target_type=202-59</code>,行项目含 <code>external_line_id</code>、<code>batch_number</code>、<code>task_materials_items[item_code, batch_number, quantity, open_quantity]</code> 及领料任务通用字段。</td></tr>
|
||
</tbody></table>
|
||
|
||
<h4 class="operation-heading">9.2.1 页面实际操作与系统截图</h4>
|
||
<p>以下为 MES 页面中的实际操作入口。截图来自系统操作手册中的真实页面;请先在 MES 页面完成业务操作。涉及 <span class="tag write">POST</span> 或 <span class="tag write">PATCH</span> 的接口均由系统受控流程触发,禁止在 Postman 中直接调用。</p>
|
||
<div class="operation-grid">
|
||
<article class="operation-card">
|
||
<h4>1. 工位资源维护</h4>
|
||
<p><strong>页面入口:</strong>系统管理 > 工位管理。</p>
|
||
<ol>
|
||
<li>按工位名称输入查询条件,点击“查询”确认现有记录。</li>
|
||
<li>点击“新增”维护工位号、工位名称及资源属性;已有工位点击所在行“编辑”。</li>
|
||
<li>核对工位号无重复后,在 MES 页面提交保存。</li>
|
||
</ol>
|
||
<p class="operation-trigger"><strong>接口触发:</strong>B1 <span class="tag write">POST</span> <code>Resources</code>(新增)或 <span class="tag write">PATCH</span> <code>Resources('工位号')</code>(编辑)。禁止直接调用。</p>
|
||
<figure><a href="../static/user-manual/workstation-list.png" target="_blank"><img src="../static/user-manual/workstation-list.png" alt="MES 工位管理页面"></a><figcaption>系统管理 - 工位管理:查询、新增、编辑入口。</figcaption></figure>
|
||
</article>
|
||
|
||
<article class="operation-card">
|
||
<h4>2. 工艺阶段维护</h4>
|
||
<p><strong>页面入口:</strong>工艺管理 > 工序管理。</p>
|
||
<ol>
|
||
<li>输入工艺名称,点击“查询”定位工序。</li>
|
||
<li>点击“新增”录入工序编码、工序名称;修改时点击对应行“编辑”。</li>
|
||
<li>提交前确认工序编码与 SAP B1 的 <code>RouteStages.Code</code> 对应。</li>
|
||
</ol>
|
||
<p class="operation-trigger"><strong>接口触发:</strong>查询为 B1 <span class="tag read">GET</span> <code>RouteStages</code>;新增/编辑为 <span class="tag write">POST</span>/<span class="tag write">PATCH</span> <code>RouteStages</code>。禁止直接调用写请求。</p>
|
||
<figure><a href="../static/user-manual/process-procedure.png" target="_blank"><img src="../static/user-manual/process-procedure.png" alt="MES 工序管理页面"></a><figcaption>工艺管理 - 工序管理:按工序进行查询和维护。</figcaption></figure>
|
||
</article>
|
||
|
||
<article class="operation-card">
|
||
<h4>3. 工位排产与日期回写</h4>
|
||
<p><strong>页面入口:</strong>计划排产 > 工位任务汇总。</p>
|
||
<ol>
|
||
<li>使用生产订单、销售订单、物料和工序等条件筛选任务。</li>
|
||
<li>切换至“日程”视图,选择待排产任务并调整计划开始、计划完成日期。</li>
|
||
<li>在 MES 完成排产;关闭订单时须进入计划排产的订单关闭页面执行确认。</li>
|
||
</ol>
|
||
<p class="operation-trigger"><strong>接口触发:</strong>排产和订单关闭均使用 B1 <span class="tag write">PATCH</span> <code>ProductionOrders(订单号)</code>。禁止直接调用。</p>
|
||
<figure><a href="../static/user-manual/plan-workstation-schedule.png" target="_blank"><img src="../static/user-manual/plan-workstation-schedule.png" alt="MES 工位排产日程页面"></a><figcaption>计划排产 - 工位任务汇总:日程视图中的任务排产。</figcaption></figure>
|
||
</article>
|
||
|
||
<article class="operation-card">
|
||
<h4>4. 外协派工</h4>
|
||
<p><strong>页面入口:</strong>生产管理 > 外协管理,或采购外协管理。</p>
|
||
<ol>
|
||
<li>按生产订单、供应商或工序查询待派工记录。</li>
|
||
<li>选择待派工行,填写或确认派工数量、仓库和计划日期。</li>
|
||
<li>在页面点击“派工并同步 SAP”,由 MES 创建对应采购申请。</li>
|
||
</ol>
|
||
<p class="operation-trigger"><strong>接口触发:</strong>B1 <span class="tag write">POST</span> <code>PurchaseRequests</code>,行项目含物料、数量、仓库、订单号和工序。禁止直接调用。</p>
|
||
<figure><a href="../static/user-manual/production-outsource.png" target="_blank"><img src="../static/user-manual/production-outsource.png" alt="MES 外协管理页面"></a><figcaption>生产管理 - 外协管理:筛选待派工任务后在页面执行派工。</figcaption></figure>
|
||
</article>
|
||
|
||
<article class="operation-card">
|
||
<h4>5. 加工/装配领料条码任务</h4>
|
||
<p><strong>页面入口:</strong>生产管理 > 加工中心或装配中心。</p>
|
||
<ol>
|
||
<li>按生产订单筛选并选中当前加工或装配任务。</li>
|
||
<li>点击“领料”,在弹窗中核对生产订单物料明细、批次、仓库和数量。</li>
|
||
<li>确认后由 MES 创建条码出库任务;在 TM 端按条码任务继续执行。</li>
|
||
</ol>
|
||
<p class="operation-trigger"><strong>接口触发:</strong>明细读取为 B1 <span class="tag read">GET</span> <code>ProductionOrders</code>;TM 出库任务为 <span class="tag write">POST</span> <code>stocktask/task/issueordertask</code>。禁止直接调用写请求。</p>
|
||
<figure><a href="../static/user-manual/production-machining-center.png" target="_blank"><img src="../static/user-manual/production-machining-center.png" alt="MES 加工中心页面"></a><figcaption>生产管理 - 加工中心:从任务列表进入领料业务。</figcaption></figure>
|
||
</article>
|
||
|
||
<article class="operation-card">
|
||
<h4>6. 工时校验与 SAP 生产反馈</h4>
|
||
<p><strong>页面入口:</strong>生产管理 > 工时校验。</p>
|
||
<ol>
|
||
<li>按任务 ID、生产订单、操作人、时间范围和校验状态查询报工记录。</li>
|
||
<li>选中待处理记录后使用“一键校验”;仅在业务授权的情况下使用“直接校验”。</li>
|
||
<li>由 MES 根据校验结果更新订单工序并提交资源报工反馈,不在 Postman 重放请求。</li>
|
||
</ol>
|
||
<p class="operation-trigger"><strong>接口触发:</strong>B1 <span class="tag read">GET</span> <code>ProductionOrders</code>,以及 <span class="tag write">PATCH</span> <code>ProductionOrders</code>、<span class="tag write">POST</span> <code>InventoryGenExits</code>。禁止直接调用写请求。</p>
|
||
<figure><a href="../static/user-manual/production-work-hours-check.png" target="_blank"><img src="../static/user-manual/production-work-hours-check.png" alt="MES 工时校验页面"></a><figcaption>生产管理 - 工时校验:通过筛选、勾选和校验按钮处理报工。</figcaption></figure>
|
||
</article>
|
||
|
||
<article class="operation-card">
|
||
<h4>7. 序检收检与采购收货</h4>
|
||
<p><strong>页面入口:</strong>质量管理 > 序检收检。</p>
|
||
<ol>
|
||
<li>切换至“序检收检”页签,按生产订单、物料、检验结果或状态查询。</li>
|
||
<li>选择待收检任务,点击该行“收检”,在收检界面填写合格数量等结果。</li>
|
||
<li>提交后由系统匹配采购订单行并生成采购收货单。</li>
|
||
</ol>
|
||
<p class="operation-trigger"><strong>接口触发:</strong>B1 <span class="tag write">POST</span> <code>QueryService_PostQuery</code> 查询采购订单行,随后 <span class="tag write">POST</span> <code>PurchaseDeliveryNotes</code> 收货。两项均禁止直接调用。</p>
|
||
<figure><a href="../static/user-manual/quality-process-receive.png" target="_blank"><img src="../static/user-manual/quality-process-receive.png" alt="MES 序检收检页面"></a><figcaption>质量管理 - 序检收检:选择任务行后点击“收检”。</figcaption></figure>
|
||
</article>
|
||
|
||
<article class="operation-card">
|
||
<h4>8. 退库质检与条码入库</h4>
|
||
<p><strong>页面入口:</strong>质量管理 > 原材料退库检验。</p>
|
||
<ol>
|
||
<li>按单据码、生产订单、物料和检验状态查询待处理记录,点击行内“退库检”。</li>
|
||
<li>录入合格数量和批次信息,确认退库质检结论。</li>
|
||
<li>系统读取生产订单行号后创建 TM 入库任务,TM 端扫码完成实物入库。</li>
|
||
</ol>
|
||
<p class="operation-trigger"><strong>接口触发:</strong>B1 <span class="tag read">GET</span> <code>ProductionOrders</code> 取得行号;TM <span class="tag write">POST</span> <code>stocktask/task/receiptordertask</code> 创建入库任务。禁止直接调用写请求。</p>
|
||
<figure><a href="../static/user-manual/quality-material-return.png" target="_blank"><img src="../static/user-manual/quality-material-return.png" alt="MES 原材料退库检验页面"></a><figcaption>质量管理 - 原材料退库检验:完成检验后由系统创建条码入库任务。</figcaption></figure>
|
||
</article>
|
||
</div>
|
||
|
||
<h3>9.3 可直接提交的 Postman 请求体</h3>
|
||
<p>以下请求体用于识别实际页面参数。仅标记为 <code>func=GET</code> 的请求可在 Postman 的 <strong>Body / raw / JSON</strong> 中执行;所有 <code>func=POST</code>、<code>func=PATCH</code> 请求均禁止调用。</p>
|
||
<pre><code>// 1. B1:查询生产订单,供领料、工时校验、退库页面使用
|
||
POST {{mes_b1_gateway}}
|
||
{
|
||
"func": "GET",
|
||
"cmd": "ProductionOrders",
|
||
"content": "{\"$filter\":\"AbsoluteEntry eq 7316\"}"
|
||
}
|
||
|
||
// 禁止调用(func=POST):B1 新增工位资源
|
||
POST {{mes_b1_gateway}}
|
||
{
|
||
"func": "POST",
|
||
"cmd": "Resources",
|
||
"content": "{\"VisCode\":\"WC-001\",\"Name\":\"测试工位\",\"ForeignName\":\"\",\"Type\":\"rtMachine\",\"Group\":1,\"UnitOfMeasure\":\"\",\"IssueMethod\":\"rimManual\",\"Active\":\"tYES\",\"Inactive\":\"tNO\",\"Remarks\":\"\",\"Allocation\":\"raOnStartDate\"}"
|
||
}
|
||
|
||
// 禁止调用(func=PATCH):B1 更新工位名称
|
||
POST {{mes_b1_gateway}}
|
||
{
|
||
"func": "PATCH",
|
||
"cmd": "Resources('WC-001')",
|
||
"content": "{\"Name\":\"测试工位(已更新)\"}"
|
||
}
|
||
|
||
// 4. B1:按工艺代码查询,再用返回的 InternalNumber 更新
|
||
POST {{mes_b1_gateway}}
|
||
{
|
||
"func": "GET",
|
||
"cmd": "RouteStages",
|
||
"content": "{\"$filter\":\"Code eq '10'\"}"
|
||
}
|
||
|
||
// 禁止调用(func=PATCH):B1 更新工艺阶段
|
||
POST {{mes_b1_gateway}}
|
||
{
|
||
"func": "PATCH",
|
||
"cmd": "RouteStages(10)",
|
||
"content": "{\"Description\":\"装配\",\"DateOfUpdate\":\"2026-08-03\"}"
|
||
}
|
||
|
||
// 禁止调用(func=PATCH):B1 排产日期回写生产订单
|
||
POST {{mes_b1_gateway}}
|
||
{
|
||
"func": "PATCH",
|
||
"cmd": "ProductionOrders(7316)",
|
||
"content": "{\"AbsoluteEntry\":7316,\"U_MODueDate\":\"2026-08-10\",\"U_MOStartDate\":\"2026-08-05\",\"U_YJQTdate\":\"2026-08-05\"}"
|
||
}
|
||
|
||
// 禁止调用(func=PATCH):B1 关闭生产订单
|
||
POST {{mes_b1_gateway}}
|
||
{
|
||
"func": "PATCH",
|
||
"cmd": "ProductionOrders(7316)",
|
||
"content": "{\"AbsoluteEntry\":7316,\"ProductionOrderStatus\":\"boposClosed\"}"
|
||
}</code></pre>
|
||
<pre><code>// 禁止调用(func=POST):B1 装配派工创建采购申请
|
||
POST {{mes_b1_gateway}}
|
||
{
|
||
"func": "POST",
|
||
"cmd": "PurchaseRequests",
|
||
"content": "{\"ReqType\":12,\"Requester\":\"SAPJK001\",\"PriceMode\":\"G\",\"RequesterBranch\":-2,\"RequesterDepartment\":-2,\"DocDate\":\"2026-08-03\",\"DocDueDate\":\"2026-08-03\",\"TaxDate\":\"2026-08-03\",\"RequriedDate\":\"2026-08-03\",\"Comments\":\"MES派工\",\"DocumentLines\":[{\"ItemCode\":\"108-001\",\"Quantity\":1,\"WarehouseCode\":\"W03\",\"U_WWOworID\":7316}]}"
|
||
}
|
||
|
||
// 禁止调用(func=POST):B1 外协派工创建采购申请(增加工序关联字段)
|
||
POST {{mes_b1_gateway}}
|
||
{
|
||
"func": "POST",
|
||
"cmd": "PurchaseRequests",
|
||
"content": "{\"ReqType\":12,\"Requester\":\"SAPJK001\",\"PriceMode\":\"G\",\"RequesterBranch\":-2,\"RequesterDepartment\":-2,\"DocDate\":\"2026-08-03\",\"DocDueDate\":\"2026-08-03\",\"TaxDate\":\"2026-08-03\",\"RequriedDate\":\"2026-08-10\",\"Comments\":\"MES外协派工\",\"DocumentLines\":[{\"ItemCode\":\"108-001\",\"Quantity\":3,\"WarehouseCode\":\"W03\",\"U_WWOworID\":7316,\"U_WWOrst\":\"外协工序\",\"U_WWOrstHS\":\"最后工序\",\"U_WWOrstID\":999}]}"
|
||
}
|
||
|
||
// 禁止调用(func=POST):B1 工时校验的生产反馈,DocumentLines 必须来自已查询到的 SAP 订单行
|
||
POST {{mes_b1_gateway}}
|
||
{
|
||
"func": "POST",
|
||
"cmd": "InventoryGenExits",
|
||
"content": "{\"DocDate\":\"2026-08-03\",\"DocDueDate\":\"2026-08-03\",\"Comments\":\"MES报工 AID:12345\",\"DocumentLines\":[{\"Quantity\":1.5,\"BaseType\":202,\"BaseEntry\":7316,\"BaseLine\":2,\"LineType\":\"dlt_Resource\",\"WarehouseCode\":\"\",\"U_ResName\":\"数控车床A\"}]}"
|
||
}
|
||
|
||
// 禁止调用(func=POST):B1 外协收检前查询采购订单及行项目
|
||
POST {{mes_b1_gateway}}
|
||
{
|
||
"func": "POST",
|
||
"cmd": "QueryService_PostQuery",
|
||
"content": "{\"QueryPath\":\"$crossjoin(PurchaseOrders,PurchaseOrders/DocumentLines)\",\"QueryOption\":\"$expand=PurchaseOrders($select=DocEntry,DocNum,CardCode,CardName),PurchaseOrders/DocumentLines($select=ItemCode,LineNum,Price,U_WWOworID,U_WWOrstHS,LineStatus)&$filter=PurchaseOrders/DocEntry eq PurchaseOrders/DocumentLines/DocEntry and PurchaseOrders/DocumentLines/U_WWOworID eq 7316\"}"
|
||
}
|
||
|
||
// 禁止调用(func=POST):B1 外协收检创建采购收货单
|
||
POST {{mes_b1_gateway}}
|
||
{
|
||
"func": "POST",
|
||
"cmd": "PurchaseDeliveryNotes",
|
||
"content": "{\"CardCode\":\"V001\",\"CardName\":\"供应商名称\",\"DocDate\":\"2026-08-03\",\"DocumentLines\":[{\"BaseEntry\":100,\"BaseLine\":0,\"BaseType\":22,\"Quantity\":5,\"U_WWPassedQty\":0}]}"
|
||
}</code></pre>
|
||
<pre><code>// 禁止调用(func=POST):TM 创建领料出库任务
|
||
POST {{mes_tm_gateway}}
|
||
{
|
||
"func": "POST",
|
||
"cmd": "stocktask/task/issueordertask",
|
||
"content": "{\"doc_date\":\"2026-08-03\",\"doc_type\":\"202-60\",\"external_num\":7316,\"task_items\":[{\"base_type\":\"202\",\"base_entry\":7316,\"base_line_num\":2,\"external_num\":7316,\"item_code\":\"ITEM-001\",\"item_name\":\"物料名称\",\"line_memo\":\"MES领料\",\"whs_code\":\"\",\"manage_type\":\"B\",\"price\":0,\"quantity\":2}]}"
|
||
}
|
||
|
||
// 禁止调用(func=POST):TM 创建不合格品/退库入库任务
|
||
POST {{mes_tm_gateway}}
|
||
{
|
||
"func": "POST",
|
||
"cmd": "stocktask/task/receiptordertask",
|
||
"content": "{\"doc_date\":\"2026-08-03\",\"doc_type\":\"202-59\",\"external_num\":7316,\"task_items\":[{\"base_type\":\"202\",\"base_entry\":7316,\"base_line_num\":2,\"external_num\":7316,\"item_code\":\"ITEM-001\",\"item_name\":\"物料名称\",\"whs_code\":\"\",\"manage_type\":\"B\",\"price\":0,\"quantity\":1}]}"
|
||
}</code></pre>
|
||
<p class="small">TM 返回为 <code>{ code, data, message }</code>;B1 返回为网关透传的 Service Layer 响应。上面的请求体只用于已具备业务权限的测试/联调环境,订单号、行号、供应商、资源和物料均必须先从业务数据或前置查询结果获得。</p>
|
||
</section>
|
||
<p class="footer">依据当前前端封装与项目内 SQL 脚本整理。SAP 对象字段、网关认证方式和生产地址发生调整时,应同步修订本说明并完成回归验证。</p>
|
||
</main>
|
||
</div>
|
||
</body>
|
||
</html>
|