# `Sp_MftPlanPhase_BtnEventLockRow` (procedure) > 生产计划跟进-锁定或修改所选生产计划 - **Type:** PROCEDURE - **Deterministic:** NO - **SQL data access:** CONTAINS SQL ## Parameters | # | Mode | Name | Type | |---|---|---|---| | 1 | IN | `sProInParam` | `varchar(10000)` | | 2 | IN | `sMakePerson` | `varchar(100)` | | 3 | IN | `sBrId` | `varchar(100)` | | 4 | IN | `sSuId` | `varchar(100)` | | 5 | OUT | `sReturn` | `varchar(1000)` | | 6 | OUT | `sCode` | `int` | ## Body _Body is not pre-cached. To inspect: `mysql --defaults-file=~/.my.cnf -e 'SHOW CREATE PROCEDURE `Sp_MftPlanPhase_BtnEventLockRow`'`._ ## Narrative **Business context:** 生产管理 → 生产计划跟进 — "锁定本行" / dynamic per-阶段 lock button: locks (or relocks at a new date) the specific 工序阶段 cells the user just edited. Sibling of `Sp_MftPlanPhase_BtnEventLockAll` but row-scoped and with per-phase dates parsed from the grid's dynamic columns. **What it does:** Validates `sProInParam`, walks `$.params[*].value[*]` rows where each value carries dynamic keys like `s_印刷阶段-锁定_23` → `3.17`. Stages the parsed `(sId, sValue)` pairs into temp table `p_TempDel`, then opens a cursor over `eleprocessphase` (`sName` ordered by `iOrder`) — for each phase name found inside the row's value string, extracts the date string after `:`, formats it as `YYYY-MM-DD`, and `UPDATE`s `mftproductionplanslave` joined to `eleprocess` (`e.sProcessPhase = p_sName`) setting `bLock=1`, `tLock=p_s1`, `sLock=sMakePerson`. So one row + one phase ⇒ one slave update per matching machine. **Invocation:** Dispatched dynamically by `GenericProcedureCallServiceImpl.doGenericProcedureCall()` on the 生产计划跟进 grid. The header comment shows the `sBtnContent` JSON: `{"sproName":"Sp_MftPlanPhase_BtnEventLockRow","inMap":"slave.sId,slave.s_蓝纸确认-锁定_20,slave.s_印刷阶段-锁定_23"}` — the `inMap` lists which dynamic columns to ship in `sProInParam`. xly-src ships `script/标版/30100101/schedule/Sp_MftPlanPhase_BtnEventLockRow.sql` (install).