刀具换刀,以及刀具寿命输入 关系梳理
换刀与刀具寿命输入 — 关系与场景梳理一、两件事各自在做什么1. 换刀刀具更换表yims_knife_exchange_record刀具更换台账含义记录「某台设备、某刀位」在什么时间换上哪把刀、在什么时间换下。关键字段是谁production_line_id生产线、model_id机种、project_equipment_id机号哪把刀knife_id→ 指向yims_knife_info.id时间exchange_start_time换上开始、exchange_end_time换下结束NULL 表示还在用本质换刀表回答的是 —在某个时间段这台设备生产线机种机号上装的是哪把刀。2. 刀具寿命输入表yims_knife_life_input主表yims_knife_life_input_item子表含义按「生产线 日期段」录入这段时间里某台设备的累计生产数不是按刀录入是按设备录入。关键字段主表start_time、end_time、production_line_id子表model_id机种、project_equipment_id机号、product_num生产数/本次录入值本质寿命输入回答的是 —某台设备在 [开始日期, 结束日期] 内一共生产了多少件。需求里说「数量赋值给对应设备下的全部刀具」— 意思是这段生产数要算到「在这段时间内在这台设备上干活的那几把刀」头上。3. 刀具寿命输入分摊表建议新增当前库可能没有表名yims_knife_life_input_apply非现有主表/子表是为实现「修改/删除时扣回 used_times」而建议新增的表用途记录「每条寿命录入主表 id 子表 id对哪把刀knife_id加了多少product_num」。这样在用户修改或删除某条录入时能按 apply 表知道当初给哪些刀加了多少才能准确扣回。若库里没有此表方案 A执行database/yims_knife_life_used_times_update.sql里的建表语句新增该表再按文档中的规则做「新增写 apply、修改/删除先按 apply 扣回」。方案 B不建 apply 表。修改/删除时用当前主表子表换刀表按「时间重叠」重新算一遍「这条录入当时会加给哪些 knife_id、各加多少」用算出的结果做扣回逻辑等价但依赖主表/子表/换刀数据未被删改若换刀记录或时间有变更重算结果可能与当初不一致。二、为什么必须扯上「换刀」寿命输入是按设备 日期段录的而已使用寿命是挂在每一把刀yims_knife_info.used_times上的。所以核心问题是同一台设备在不同时间段可能换过刀你录的「1月1日3日、生产数 450」只能加给「1月1日3日期间真的在这台设备上的那几把刀」不能加给后来才换上去的刀。因此换刀提供「谁knife_id、在什么时间段、在哪台设备上」的信息寿命输入提供「某台设备、某时间段、生产了多少」更新 used_times必须用换刀记录把「设备时间段生产数」对应到具体的 knife_id再往yims_knife_info.used_times上累加。这就是「刀具寿命输入的更新」里会涉及「换刀逻辑」的原因不查换刀就不知道这段生产数该加给哪把刀。三、规则「刀具需要换上后才记录刀具寿命」换上exchange_start_time这把刀开始在这台设备上干活换下exchange_end_time这把刀不再在这台设备上或为 NULL 表示还在用。所以只有「换刀时间段」与「寿命录入时间段」有交集的那把刀才参与这次录入的分配交集判断换刀开始 录入结束且(换刀结束为 NULL 或 换刀结束 录入开始)即这把刀在 [录入开始, 录入结束] 内至少有一段时间是在这台设备上的。这样自然满足刀具换上之后这段设备生产数才记到这把刀的已使用寿命上换刀前的录入不会记到新刀上换刀后的录入不会记到旧刀上。四、用你的例子串起来场景设定某台设备生产线 机种 机号确定1月1日3日用的是刀具 Aknife_id A没有在 13 号之间换刀。1月4日没有换刀继续用刀具 A。1本次录入1月1日3日生产数 450用户在做刀具寿命输入选生产线、开始日期 1月1日、结束日期 1月3日该设备录入「生产数(累计) 450」。系统落库主表一条1月1日1月3日、该生产线子表一条该机种、该机号、450。用到换刀查yims_knife_exchange_record条件为「该生产线、该机种、该机号」且换刀时间段与 [1月1日, 1月3日] 有重叠。结果只有刀具 A的换刀记录重叠 → 把 450 加给刀具 A。更新yims_knife_info中 knife_id A 的used_times 450例如原来 0变成 450。此时刀具 A 的实绩寿命used_times 450。2修改1月1日3日 从 450 改为 466用户修改这条寿命录入把该设备 1月1日3日的生产数从 450 改成 466。系统需要先扣回原先加给刀具 A 的 450used_times - 450例如 450 → 0再按新值加 466used_times 4660 → 466。仍然是通过「该录入对应的设备 时间段」用换刀记录找到的还是刀具 A所以还是只动刀具 A。此时刀具 A 的实绩寿命 466。31月4日再新增一条录入4号当天用户新增一条寿命输入同一生产线、同一设备开始日期 结束日期 1月4日生产数 本次录入值例如 20。落库主表、子表后再按「生产线、机种、机号 时间段 [1月4日, 1月4日]」查换刀记录。重叠的仍是刀具 A1月4日还在用没换刀→ 把「本次录入值」加给刀具 A。更新used_times 466 本次录入值例如 466 20 486。这样就和你说的一致实绩寿命 466 本次录入值。五、若 1月3日下午换刀跨换刀日1月1日3日上午刀具 A 在用1月3日下午换刀刀具 B 上机。若用户仍录「1月1日3日、生产数 450」按时间重叠会得到两条换刀记录刀具 A1月1日3日上午、刀具 B3日下午3日。当前实现里是凡是在该时间段内在这台设备上出现过的刀都加上整段 production_num即 450 加给 A450 也加给 B。若业务上要求「按占用天数或时长分摊 450」就需要在时间重叠的基础上再做按比例分摊你项目里的knifeLifeUsedTimesUpdate.ts目前是整段赋值未做按比例拆分。梳理时只要记住先靠换刀找出「这段录入该算到哪几把刀」再决定是整段给每把刀还是按时间比例分摊。六、总结对应关系便于不懵你做的事用到的数据换刀的作用刀具寿命输入提交主表时间段、生产线 子表机种、机号、生产数用「生产线机种机号时间重叠」找出 knife_id把 product_num 加到这些刀的 used_times修改某条寿命录入同上 旧 apply 记录先按旧 apply 扣回再按新数据用换刀重新算 knife_id 并加回去删除某条寿命录入该条的 apply 记录按 apply 里记录的 knife_id 扣回 used_times一句话换刀 「哪把刀、在什么时间、在哪台设备上」寿命输入 「某台设备、某时间段、生产了多少」更新 used_times 用换刀把「设备时间段」映射成「刀」再把「生产数」加给这些刀的yims_knife_info.used_times。这样「换刀」和「刀具寿命输入」的关系就不会绕了换刀是归属依据寿命输入是数值来源两者一起才能正确更新每把刀的已使用寿命。七、换刀后修改历史寿命录入已换下刀是否还跟改场景该设备刀具 A 在用1.1未换刀。录入 1.11.1 生产数 200 → 刀具 A used_times 200。录入 1.21.3 生产数 300 → 刀具 A used_times 500。1.4 换刀换成刀具 B换刀时旧刀设备累计数 1000按产品需求直接把刀具 A 的 used_times 更新为 1000下机定稿。之后用户修改历史录入把 1.21.3 从 300 改为 200。问题此时还要不要按「修改寿命录入」的逻辑对刀具 A 做扣回 300、加上 200即 used_times 从 1000 变成 900建议规则以旧刀设备累计数为准不再更新已换下刀的 used_times换刀时旧刀设备累计数 1000 表示「这把刀在这台设备上的官方终值」已写入刀具 A 的 used_times刀具 A 已换下寿命周期结束。之后再改 1.21.3 的录入300→200只是修正录入台账/明细主表、子表、apply 表可照常改但不应对已换下且已用「旧刀设备累计数」定稿的刀再做 used_times 的扣减或增加。否则会出现换刀时认定刀具 A 1000后来因为改了一条历史录入又变成 900与「换刀时确定的 1000」矛盾。因此对象是否更新1.21.3 这条录入数据主表/子表/apply可以更新允许把 300 改为 200保证台账一致。刀具 A 的used_times不再更新已换下以换刀时的旧刀设备累计数 1000 为准。实现上的约定在「修改/删除刀具寿命录入」并要回写 used_times 时先判断本条录入会影响到的 knife_id 中是否有已换下的刀该刀在换刀记录里 exchange_end_time 非 NULL且 used_times 已被置为当时的旧刀设备累计数。若有对这些刀只做 apply 的增删改不再做 used_times 的扣回或加上。若没有刀仍在用按现有逻辑扣回旧值、加上新值。这样既保证「换刀那一刻的旧刀设备累计数」是已换下刀的唯一权威值又允许后续修正历史录入而不产生逻辑冲突。八、更新规则总览实现时可照此执行说明以下规则不依赖yims_knife_life_input_apply表仅用主表、子表、换刀表、刀具信息表。修改/删除时的「应扣回多少」通过主表子表换刀表重算得出。下面按「谁触发、更新谁、条件与动作」整理便于开发/产品对照。规则 1刀具寿命输入 — 新增提交项目说明触发用户提交一条新的刀具寿命输入主表 子表落库完成找刀按主表 production_line_id、子表 model_id / project_equipment_id、主表 [start_time, end_time]用换刀表查「时间重叠」的 knife_id重叠条件换刀开始 ≤ 录入结束 且 (换刀结束为 NULL 或 换刀结束 ≥ 录入开始)更新 used_times对每个 knife_id若该刀未换下则 used_times 汇总值已换下则跳过见规则 4规则 2刀具寿命输入 — 修改提交项目说明触发用户修改某条刀具寿命输入主表 id 不变主表时间不变子表内容生产数变化扣回重算旧值用该主表 id 下当前主表子表换刀表按规则 1 的「找刀按刀汇总」得到「旧汇总每把刀当时加了多少」对每个 knife_id若该刀未换下则 used_times - 旧汇总且 used_times 不低于 0已换下则跳过见规则 4更新主表/子表执行用户对主表、子表的修改时间、product_num 等加回重算新值用更新后的主表子表换刀表再按规则 1 算「找刀按刀汇总」对每个 knife_id若该刀未换下则 used_times 新汇总已换下则不加见规则 4规则 3刀具寿命输入 — 删除提交项目说明触发用户删除某条刀具寿命输入在删主表子表之前先处理 used_times扣回重算用该主表 id 下当前主表子表换刀表按规则 1 的「找刀按刀汇总」得到「本单对每把刀加了多少」对每个 knife_id若该刀未换下则 used_times - 该汇总且 used_times 不低于 0已换下则跳过见规则 4删除主表/子表再执行主表、子表记录的删除规则 4已换下的刀 — 寿命录入不再回写 used_times项目说明适用规则 1 / 2 / 3 中凡是会改动 used_times 的 knife_id判断若该 knife 在换刀记录中已换下存在 exchange_end_time 非 NULL且当时已用「旧刀设备累计数」更新过该刀 used_times则视为已定稿动作对这些 knife_id不扣回、不加上used_times 以换刀时的旧刀设备累计数为准规则 5换刀 — 旧刀 used_times 定稿项目说明触发换刀操作发生旧刀下机动作用「旧刀设备累计数」直接更新该旧刀knife_id在 yims_knife_info 的 used_times 旧刀设备累计数产品需求下机时以设备累计数为该刀寿命终值效果该刀此后受规则 4 约束后续对「影响该刀」的寿命录入的修改/删除不再改其 used_times汇总表按操作类型操作主表/子表yims_knife_info.used_times寿命输入新增插入按换刀时间重叠找刀、按 knife_id 汇总后对「未换下」的刀 本单汇总已换下不更新寿命输入修改更新用当前主表子表换刀表重算旧汇总 → 对「未换下」的刀扣回更新主表/子表后重算新汇总 → 对「未换下」的刀加回已换下不扣不加寿命输入删除删除用当前主表子表换刀表重算本单汇总 → 对「未换下」的刀扣回已换下不扣再删主表/子表换刀旧刀下机—旧刀 used_times 旧刀设备累计数定稿