# `Sp_CalcPlan_dHour` (procedure) > @author:钱豹 根据排成Id计算dHour - **Type:** PROCEDURE - **Deterministic:** NO - **SQL data access:** CONTAINS SQL ## Parameters | # | Mode | Name | Type | |---|---|---|---| | 1 | IN | `sPlanId` | `varchar(50)` | | 2 | IN | `p_sMakePerson` | `varchar(50)` | | 3 | IN | `sBrId` | `varchar(50)` | | 4 | IN | `sSuId` | `varchar(50)` | | 5 | OUT | `p_dHour` | `decimal(18,6)` | | 6 | OUT | `sReturn` | `varchar(1000)` | | 7 | OUT | `sCode` | `int` | ## Body _Body is not pre-cached. To inspect: `mysql --defaults-file=~/.my.cnf -e 'SHOW CREATE PROCEDURE `Sp_CalcPlan_dHour`'`._ ## Narrative **Business context:** 生产管理 / 排程 — per-plan-row machine-hour calculator (作者: 钱豹). Given one `mftproductionplanslave.sId`, derives the slave row's planned hours and machine-changeover (调机) hours using the machine's adjustable formula (`elemachine.sPlanCapacityId` / `sAdjustableFormulaId`), so the scheduler shows realistic time on each plan row. **What it does:** Reads the slave's product/process/machine context from `mftproductionplanslave` joined to `EleMachine`. When an adjustable formula is configured, builds the formula's input tuple (`billSlave,billControl,billProcedure,billMaster,baseProduct` over `mftproductionplanslave,mftworkordercontrol,mftworkorderprocess,eleprocessparam,eleProduct,mftworkorderslave`) and calls `Sp_System_ReplaceField_Detail` to evaluate it, capturing the raw hour, an annotated `sAdjustHour` (formula trace), and a fallback message when the formula errors. Writes back to `mftproductionplanslave.dCalcHour1` and `sAdjustHour`. Returns the cumulative `p_dHour` to the caller. **Invocation:** Called by procedure `Sp_Manufacture_InsertMftPlanSlave` (when a plan slave is inserted/refreshed) and `Sp_Manufacture_SetTime` (when plan times are re-derived). No direct Java caller and no form-master binding — strictly a helper inside the scheduling proc family.