# `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.
