Files
MES_Manage_View_V20/doc/SAP接口调用说明.html

589 lines
53 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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=&lt;SessionId&gt;;</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=PATCHpatchB1('/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(&quot;/Resources('工位号')&quot;, { 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: &lt;AccessToken&gt;</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>系统管理 &gt; 工位管理。</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>工艺管理 &gt; 工序管理。</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>计划排产 &gt; 工位任务汇总。</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>生产管理 &gt; 外协管理,或采购外协管理。</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>生产管理 &gt; 加工中心或装配中心。</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>生产管理 &gt; 工时校验。</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>质量管理 &gt; 序检收检。</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>质量管理 &gt; 原材料退库检验。</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=POSTB1 新增工位资源
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=PATCHB1 更新工位名称
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=PATCHB1 更新工艺阶段
POST {{mes_b1_gateway}}
{
"func": "PATCH",
"cmd": "RouteStages(10)",
"content": "{\"Description\":\"装配\",\"DateOfUpdate\":\"2026-08-03\"}"
}
// 禁止调用func=PATCHB1 排产日期回写生产订单
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=PATCHB1 关闭生产订单
POST {{mes_b1_gateway}}
{
"func": "PATCH",
"cmd": "ProductionOrders(7316)",
"content": "{\"AbsoluteEntry\":7316,\"ProductionOrderStatus\":\"boposClosed\"}"
}</code></pre>
<pre><code>// 禁止调用func=POSTB1 装配派工创建采购申请
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=POSTB1 外协派工创建采购申请(增加工序关联字段)
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=POSTB1 工时校验的生产反馈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=POSTB1 外协收检前查询采购订单及行项目
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=POSTB1 外协收检创建采购收货单
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=POSTTM 创建领料出库任务
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=POSTTM 创建不合格品/退库入库任务
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>