Files
MES_Manage_View_V20/doc/生产报工至工时校验数据走向_20260728.html

134 lines
17 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">
<title>生产报工工时计算规则</title>
<style>
:root{--ink:#182633;--muted:#5d6b78;--line:#d7e0e7;--blue:#0f668b;--blue-bg:#ecf7fb;--green:#16734b;--green-bg:#edf8f1;--amber:#966000;--amber-bg:#fff5df;--red:#aa3f37;--red-bg:#fff1ef}
*{box-sizing:border-box} body{margin:0;background:#f1f5f7;color:var(--ink);font:14px/1.7 "Microsoft YaHei",Arial,sans-serif}.page{width:min(1180px,calc(100% - 32px));margin:24px auto 48px;background:#fff;border:1px solid var(--line);box-shadow:0 8px 26px rgba(23,48,65,.08)}header{padding:34px 40px 26px;border-bottom:4px solid var(--blue);background:#f6fbfd}main{padding:0 40px 42px}h1{margin:0 0 8px;font-size:28px;line-height:1.35;letter-spacing:0}h2{margin:34px 0 14px;padding-bottom:8px;border-bottom:1px solid var(--line);color:#123f57;font-size:20px;letter-spacing:0}h3{margin:22px 0 8px;color:#135374;font-size:16px;letter-spacing:0}p{margin:8px 0}.meta{color:var(--muted)}.nav{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}.nav a{padding:4px 9px;border:1px solid #b8d5e0;color:#0d5779;text-decoration:none;background:#fff}.nav a:hover{background:var(--blue-bg)}.summary{margin:18px 0;padding:13px 16px;border-left:4px solid var(--blue);background:var(--blue-bg)}.warn{margin:16px 0;padding:13px 16px;border-left:4px solid var(--amber);background:var(--amber-bg)}.risk{margin:16px 0;padding:13px 16px;border-left:4px solid var(--red);background:var(--red-bg)}.formula{margin:12px 0;padding:14px 16px;border:1px solid #b9d6e2;background:#f7fcfe;font:14px/1.8 Consolas,"Courier New",monospace;white-space:pre-wrap}.flow{display:grid;grid-template-columns:1fr 36px 1fr 36px 1fr;gap:8px;align-items:stretch;margin:16px 0}.box{padding:12px;border:1px solid #b9d7e1;background:var(--blue-bg)}.box.green{border-color:#bddbc9;background:var(--green-bg)}.box.amber{border-color:#ead39e;background:var(--amber-bg)}.box strong{display:block;color:#11465f}.arrow{display:flex;align-items:center;justify-content:center;color:#337995;font-size:24px}table{width:100%;border-collapse:collapse;margin:12px 0 18px}th,td{padding:9px 10px;vertical-align:top;border:1px solid var(--line);text-align:left}th{background:#eef4f6;color:#173b4c}code{padding:1px 4px;border-radius:2px;background:#eef1f3;color:#8a3025;font:12px Consolas,"Courier New",monospace}ol,ul{margin:8px 0;padding-left:24px}li{margin:5px 0}.pill{display:inline-block;margin:2px 4px 2px 0;padding:2px 7px;border:1px solid #c4d5dd;background:#f8fbfc;color:#35515f}.small{font-size:12px;color:var(--muted)}.example{padding:12px 15px;border:1px dashed #aacbd8;background:#fbfeff}.example strong{color:#126086}footer{margin-top:30px;padding-top:14px;border-top:1px solid var(--line);font-size:12px;color:var(--muted)}@media(max-width:760px){.page{width:100%;margin:0;border:0}header,main{padding-left:18px;padding-right:18px}.flow{grid-template-columns:1fr}.arrow{min-height:20px;transform:rotate(90deg)}table{display:block;overflow-x:auto}}@media print{body{background:#fff}.page{width:100%;margin:0;border:0;box-shadow:none}.nav{display:none}table,.formula,.example{break-inside:avoid}}
</style>
</head>
<body>
<div class="page">
<header>
<h1>生产报工工时计算规则</h1>
<div class="meta">范围:加工中心、装配中心报工产生的工时,以及工时校验计算出的 SAP 上传分钟</div>
<div class="meta">版本2026-07-28 | 依据:线上 YL_MESDB 当前过程定义与当前页面代码的只读核验</div>
<nav class="nav"><a href="#input">输入</a><a href="#machine">加工中心</a><a href="#assembly">装配中心</a><a href="#people">人员工时</a><a href="#validation">工时校验</a><a href="#examples">示例</a><a href="#rules">速查</a></nav>
</header>
<main>
<section id="input">
<h2>1. 先区分四类数字</h2>
<div class="summary"><strong>核心结论:</strong>报工数量、设备实际工时、人员总时长、校验上传分钟是四个不同口径。页面上都可能显示为“工时”或“数量”,但不能互相代入计算。</div>
<table>
<tr><th>数值</th><th>来源和计算</th><th>单位</th><th>用途</th></tr>
<tr><td>报工数量</td><td>用户录入 <code>partCount</code>,累计写入任务 <code>完成数量</code></td><td>件/业务单位</td><td>判断任务完成,和秒、分钟没有换算关系。</td></tr>
<tr><td>总时长</td><td><code>结束时间 - 开始时间</code></td><td></td><td>人员时间、校验比例和上传计算的基础。</td></tr>
<tr><td>实际工时</td><td><code>总时长 - 暂停总时长</code></td><td></td><td>加工中心设备实际运转工时。</td></tr>
<tr><td>UploadMinutes</td><td>由校验过程按工时类型、班次和当日比例系数换算。</td><td>分钟</td><td>SAP 资源消耗单据的 <code>Quantity</code></td></tr>
</table>
<div class="flow"><div class="box"><strong>输入</strong>开始/结束时间<br>暂停记录<br>人员、班次、加班类型</div><div class="arrow"></div><div class="box green"><strong>原始计算</strong>总时长、实际工时<br>人员工时、加班工时</div><div class="arrow"></div><div class="box amber"><strong>校验计算</strong>比例系数<br>UploadMinutes分钟</div></div>
</section>
<section id="machine">
<h2>2. 加工中心:设备工时怎么算</h2>
<p>过程 <code>MES_ProductTask_WorkingStart</code>产生“开始加工”记录;报工或辅助结束最终经 <code>MES_ProductCenter_OptRecord_Save</code>闭合一个工作周期。该过程使用同一 <code>TaskAID + 工位名称</code>的开始、暂停、结束记录计算。</p>
<div class="formula">周期总时长(秒) = DATEDIFF(SECOND, 周期开始时间, 本次结束时间)
暂停总时长(秒) = Σ DATEDIFF(SECOND, 每次暂停开始时间, 对应恢复/结束时间)
设备实际工时(秒) = 周期总时长 - 暂停总时长</div>
<table>
<tr><th>动作</th><th>计算影响</th><th>写入/更新字段</th></tr>
<tr><td>开始加工</td><td>记录周期起点,不立即形成完整工时。</td><td>开始时间,结束时间为空。</td></tr>
<tr><td>暂停</td><td>开始记录先按开始到暂停的差值闭合;暂停本身等待后续恢复或结束来确定暂停时长。</td><td>暂停时间、暂停时长、关联记录。</td></tr>
<tr><td>报工/辅助结束</td><td>找到周期开始,汇总周期内已闭合暂停,计算总时长和设备实际工时。</td><td>结束时间、总时长、暂停总时长、实际工时。</td></tr>
</table>
<div class="warn"><strong>关键差异:</strong>设备工时使用“扣暂停后的实际工时”;下节的人员工时使用“开始到结束的总时长”,不扣暂停。两者不必相等,这是当前过程实现的既有口径。</div>
</section>
<section id="assembly">
<h2>3. 装配中心:普通工时和加班工时怎么算</h2>
<p><code>MES_人员工时记录_开始</code>写入当前用户的未结束“开始加工”记录。<code>MES_人员工时记录_结束</code>找到同 <code>TaskAID + 操作人</code>最近的未结束记录,以数据库当前时间为结束时间:</p>
<div class="formula">总工时(秒) = DATEDIFF(SECOND, 开始时间, 结束时间)</div>
<table>
<tr><th>日期和选择</th><th>普通工作时间(秒)</th><th>加班时间(秒)</th><th>规则</th></tr>
<tr><td>工作日,未选择加班</td><td>总工时</td><td>0</td><td>整段作为普通报工时间。</td></tr>
<tr><td>工作日,选择加班,且跨过白班结束点</td><td>白班结束时间 - 开始时间</td><td>结束时间 - 白班结束时间</td><td>白班结束时间从 <code>班次表</code>中“白班”取得,缺失时默认 <code>16:30</code></td></tr>
<tr><td>工作日,选择加班,开始已在白班结束后</td><td>0</td><td>总工时</td><td>整段作为工作日加班。</td></tr>
<tr><td>休息日/法定休息日,选择加班</td><td>0</td><td>总工时</td><td>整段按“休息日加班”或“法定休息日加班”生成加班人员记录。</td></tr>
<tr><td>休息日/法定休息日,未选择加班</td><td>过程变量先取总工时</td><td>0</td><td>随后原开始记录的 <code>工时、总时长</code>会被置为 0同时写入“休息日工作/法定休息日工作”报工记录。</td></tr>
</table>
<div class="risk"><strong>需注意的现状:</strong>休息日未选择加班时,结束过程内部先计算普通工作时间,但随后又将原操作记录的 <code>工时</code><code>总时长</code>置零,报工记录保留该工作时间。这会造成操作记录表与报工记录表的工时口径不同,追溯时必须同时检查两张表。</div>
</section>
<section id="people">
<h2>4. 加工中心:人员工时怎么算</h2>
<p>加工中心在<strong>非休息日、非法定休息日</strong>的报工/辅助结束周期,调用 <code>计算人员工时</code>。过程将工位绑定人员与有效班次组合,计算每名人员在可用班次内的时间重叠。</p>
<div class="formula">班次重叠秒数 = max(0, min(结束时间, 班次结束) - max(开始时间, 班次开始))
人员计算工时(秒) = 班次重叠秒数</div>
<ul>
<li>仅保留已绑定到对应班次且重叠秒数大于 0 的人员-班次组合。</li>
<li>指定实际干活人员有班次绑定时,只保留其绑定班次;没有班次绑定时,保留重叠最长的班次。若所有班次均无重叠,过程会给该指定人员 <code>1 秒</code>最小值。</li>
<li>当前实际公式<strong>不再</strong>除以绑定设备数。旧的 <code>重叠秒数 / 绑定设备数</code>逻辑在过程里已注释,现行代码直接使用重叠秒数。</li>
<li>每个满足条件的人员-班次组合都会向 <code>YL_加工中心_操作记录表</code>插入一条人员工时分摊记录,字段 <code>总时长</code>写入该人员的计算工时秒数。</li>
</ul>
</section>
<section id="validation">
<h2>5. 工时校验:上传分钟怎么算</h2>
<h3>5.1 先判定是否参与计算</h3>
<table>
<tr><th>条件</th><th>实际行为</th></tr>
<tr><td>校验列表</td><td><code>开始时间 &lt; 当天 00:00:00</code>,当天开始的记录不进入该最终校验列表。</td></tr>
<tr><td>单条上传分钟计算</td><td><code>总时长 &lt; 300 秒</code>,返回 <code>UploadMinutes=0</code>、工时类型“跳过SAP”。过程注释/提示写“总时长为0”但实际判断阈值是 300 秒。</td></tr>
<tr><td>批量校验的加班类别</td><td><code>加班、休息日加班、法定休息日加班、休息日工作、法定休息日工作</code><code>usp_BatchValidateWorkTime</code>直接按总时长转分钟,不进入单条上传分钟过程。</td></tr>
</table>
<h3>5.2 当日比例系数</h3>
<p>正常记录需要先调用 <code>usp_CalculateDailyRatio</code>。统计范围是同一操作人、同一开始日期的 <code>View_生产工时视图</code>记录,且满足以下条件:</p>
<ul><li>总时长大于 300 秒;</li><li>阶段标识不等于 -1</li><li>订单号不等于 3886</li><li>操作类别不是“加班、休息日工作、法定休息日工作”。</li></ul>
<div class="formula">当日总分钟 = Σ 合格记录的总时长(秒) / 60
比例系数 Ratio = (标准工时(小时) × 60) / 当日总分钟
当日总分钟 ≤ 0 或标准工时 ≤ 0 时Ratio = 1</div>
<p>标准工时优先取 <code>当日班次最小标准工时</code>,该值不大于 0 时再取该记录的 <code>班次标准工时</code>;两者都不可用时视图默认值为 8。</p>
<h3>5.3 班次内外拆分</h3>
<p><code>usp_CalculateUploadMinutes</code>优先按操作人,再按工位名称读取班次;找不到时默认白班 <code>07:45-16:30</code>。跨天班次由 <code>usp_CalculateShiftTime</code>逐日切段计算。</p>
<div class="formula">班次内分钟 = 班次内秒数 / 60
班次外分钟 = 班次外秒数 / 60
基础分钟 BaseMinutes = 总时长 / 60</div>
<h3>5.4 单条计算过程的最终公式</h3>
<table>
<tr><th>操作类别</th><th>usp_CalculateUploadMinutes 的公式</th></tr>
<tr><td>报工、开始加工、辅助结束、辅助开始及其他普通类别</td><td><code>UploadMinutes = BaseMinutes × Ratio</code></td></tr>
<tr><td>工作日加班</td><td><code>UploadMinutes = BaseMinutes</code>,不乘比例系数。</td></tr>
<tr><td>休息日加班、法定休息日加班</td><td><code>UploadMinutes = 班次内分钟 × Ratio + 班次外分钟</code></td></tr>
</table>
<div class="warn"><strong>批量入口优先级:</strong>当前工时校验页面使用 <code>usp_BatchValidateWorkTime</code>。它先识别所有加班/休息日类别并直接设定 <code>UploadMinutes = 总时长 / 60</code>。因此,上表中的“休息日加班按班次内外拆分”是单条 <code>usp_CalculateUploadMinutes</code>的能力;在当前批量校验页面路径中,会被批量过程的直接换算规则覆盖。</div>
</section>
<section id="examples">
<h2>6. 计算示例</h2>
<div class="example"><strong>示例一:加工中心设备工时</strong><br>开始 08:00暂停 10:00-10:20结束/报工 12:00。<br><code>总时长 = 4 × 3600 = 14,400 秒</code><br><code>暂停总时长 = 20 × 60 = 1,200 秒</code><br><code>设备实际工时 = 14,400 - 1,200 = 13,200 秒 = 220 分钟</code></div>
<div class="example"><strong>示例二:加工中心人员工时</strong><br>同一周期为 08:00-12:00某绑定人员的有效班次为 07:45-16:30。<br><code>班次重叠 = 12:00 - 08:00 = 14,400 秒</code><br><code>该人员计算工时 = 14,400 秒</code><br>即使该人员绑定多台设备,现行代码也不再除以设备数。</div>
<div class="example"><strong>示例三:装配工作日跨白班结束点</strong><br>开始 15:30结束 18:00选择加班白班结束 16:30。<br><code>普通工作时间 = 16:30 - 15:30 = 3,600 秒</code><br><code>加班时间 = 18:00 - 16:30 = 5,400 秒</code></div>
<div class="example"><strong>示例四:正常工时上传分钟</strong><br>某人员当日有效总时长为 600 分钟,标准工时为 8 小时,当前一条普通报工总时长为 120 分钟。<br><code>Ratio = (8 × 60) / 600 = 0.8</code><br><code>UploadMinutes = 120 × 0.8 = 96 分钟</code></div>
<div class="example"><strong>示例五:当前批量校验中的加班</strong><br>一条“工作日加班”原始记录总时长为 5,400 秒。<br><code>UploadMinutes = 5,400 / 60 = 90 分钟</code><br>当前批量过程直接采用此结果,不再应用当日比例系数。</div>
</section>
<section id="rules">
<h2>7. 计算速查与校验结束条件</h2>
<table>
<tr><th>要确认什么</th><th>先看哪个字段/对象</th><th>计算或判断</th></tr>
<tr><td>设备实际运行多久</td><td>原操作记录:开始时间、结束时间、暂停总时长</td><td><code>实际工时 = 总时长 - 暂停总时长</code></td></tr>
<tr><td>装配人员正常/加班多久</td><td>装配开始记录、班次表、是否加班/休息日参数</td><td>按白班结束点或休息日规则切分。</td></tr>
<tr><td>加工人员分到多久</td><td>工位人员绑定、班次人员绑定、起止时间</td><td><code>人员工时 = 班次重叠秒数</code></td></tr>
<tr><td>SAP 会上传几分钟</td><td>总时长、操作类别、标准工时、同人同日记录</td><td>普通记录乘 Ratio当前批量加班直接 <code>总时长/60</code></td></tr>
<tr><td>是否已完成工时校验</td><td><code>生产管理_工时校验_校验工时表</code></td><td>存在 <code>报工记录id = 原始操作记录.AID</code> 的副本即已校验。</td></tr>
</table>
<div class="risk"><strong>不要混用字段:</strong><code>实际工时</code>适合看设备扣暂停后的运行时间;<code>总时长</code>是人员与上传分钟计算基础;<code>UploadMinutes</code>是经过规则换算后的 SAP 数量。若需核算差异,应在同一条原始记录 AID 上同时比对这三个值,而不是用报工数量推算工时。</div>
</section>
<footer>主要核验对象:<code>MES_ProductCenter_OptRecord_Save</code><code>MES_人员工时记录_结束</code><code>计算人员工时</code><code>usp_CalculateDailyRatio</code><code>usp_CalculateShiftTime</code><code>usp_CalculateUploadMinutes</code><code>usp_BatchValidateWorkTime</code><code>View_生产工时视图</code>。本文未执行生产数据写入。</footer>
</main>
</div>
</body>
</html>