# 02-项目程序开发详细步骤

## 1. 需求解析

1. 用户反馈生产订单关闭“可关闭”查询以工时为基准，导致没有工时记录但满足其他条件的订单查不出来。
2. 确认不能简单放开所有无工时订单，否则会把未完工的新订单带入可关闭列表。
3. 确定口径：无工时订单只免除“全部工时校验”，仍必须满足原有可关闭条件。

## 2. 数据库开发

1. 新增脚本 `db_backups/update_plan_order_close_no_work_hours_20260630.sql`。
2. 修改 `dbo.计划排产_生产订单关闭_查询全部订单` 的 `@单据状态 = N'可关闭'` 分支。
3. 使用 CTE 汇总收检数量和终检数量。
4. 第一段查询保留原有 `View_生产工时视图` 逻辑：
   - 订单有工时。
   - `MIN(CASE WHEN v.Expr1 IS NULL THEN 0 ELSE 1 END) = 1`，确保全部工时已校验。
   - 保留原有计划数量、入库数量、终检和收检条件。
5. 第二段查询从 `MES_接口_生产计划` 补充无工时订单：
   - `#工时订单` 临时表中不存在该订单号。
   - 单据状态为空。
   - 属性匹配。
   - 满足原有计划数量、入库数量、终检和收检条件。
6. 两段结果使用 `UNION ALL` 合并。
7. 非“可关闭”分支改为参数化静态 SQL，保留原输出字段。

## 3. 发布

1. 使用 `sqlcmd` 发布脚本到 `YL_MESDB`。
2. 发布命令使用环境变量传入密码，不写入脚本和文档。

## 4. 验证

1. 验证无工时样例 `7410`：
   - `View_生产工时视图` 中无工时。
   - `MES_接口_生产计划` 中计划数量 `1`、入库数量 `1`、单据状态为空、属性为机加件。
   - 终检合格数 `1`、终检不合格数 `0`。
   - 查询 `@单据状态=N'可关闭', @属性=N'机加'` 能返回。
2. 验证默认可关闭机加查询：
   - 查询耗时约 `0.56` 秒。
   - 返回无工时样例 `7280`、`7409`、`7410`。
3. 验证非可关闭分支可执行：
   - `@单据状态=N'未关闭'`
   - `@单据状态=N'已关闭'`

