feat: 同步全部系统改动与文档
This commit is contained in:
133
doc/生产报工至工时校验数据走向_20260728.html
Normal file
133
doc/生产报工至工时校验数据走向_20260728.html
Normal file
@@ -0,0 +1,133 @@
|
||||
<!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>开始时间 < 当天 00:00:00</code>,当天开始的记录不进入该最终校验列表。</td></tr>
|
||||
<tr><td>单条上传分钟计算</td><td>若 <code>总时长 < 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>
|
||||
Reference in New Issue
Block a user