# 工作进度-11:新增「质量」模块(工艺执行书 + 样茧试缫) > 时间:2026-10-22(承接工作进度-10) > 需求:把 `D:\AntaiProject - 副本`(F9 智慧缫丝 WinForms 版)里 **质量模块 → 工艺执行书** 与 **质量模块 → 样茧试缫** 迁移进本系统,并还原随附的 8 张报表版式。 > 参考实现位置: > - 客户端:`WinClient\F9.Business.Prod\Gyzxs\`、`WinClient\F9.Business.Prod\QC\YJSS\` > - 服务端:`F9Servic\BBIT.F9\BBIT.F9.Domain\Entities\Business\PROD\QC\`、`BBIT.F9.Application\CQRS\Business\PROD\QC\YJSS\`、`Application\Implements\Reports\Prod\QC\RepDt_Qc_Yjss_*` > - 报表样例(本次已按 RTF 还原):封面 / 工艺执行书 / 混剥选茧工艺执行书 / 试缫工艺单 / 试缫与大样模板 / 煮茧工艺执行书 / 自动缫车间生产工艺执行书 / 自动缫大样 --- ## 一、功能地图 ``` 质量(新一级菜单,sort=7,图标 Medal) ├── 工艺执行书 /qc/gyzxs qc/gyzxs/index │ 一行 = 一个工艺庄口;√ 标记 7 张子单据是否已录入 │ ├── 封面 (桑蚕丝工艺设计书:编号/规格/原料总量/生产丝量/生产线时间) │ ├── 试产 (试缫工艺单:茧质调查 + 自动缫试缫指标 + 试缫煮茧工艺) │ ├── 选剥茧 (混剥选茧:混茧工艺明细 + 生产/质量/质量控制指标) │ ├── 试缫与大样 (试缫 vs 大样 两行对比 + 技术措施 + 签署) │ ├── 煮茧 (庄口原料性能 + 工艺技术指标 + 真空渗透 + 分车间配温 + 副煮车间) │ ├── 自动缫 (表一:茧质概况 + 生产指标 + 工艺技术指标 + 表二大样) │ └── 后缫 (工艺执行书:生产指标 9 项 + 工艺条件及控制指标 18 项) │ 打印下拉 = 8 张报表任意一张 └── 样茧试缫 /qc/yjss qc/yjss/index 页签:原料小样 / 综合样 ├── 选茧调查 11 个茧别 重量 + 比例(按茧重重算) ├── 解舒调查 多条记录(缫丝参数/纤度丝长/落绪/蛹体/附煮/屑物) ├── 茧幅调查 仅综合样(按茧幅分档,算平均/整齐率/均方差) ├── 切剖调查 仅综合样(原量/干量/粒数比例,算茧层率/脱胶率) ├── 清洁洁净 匀度 + 洁净档位 + 疵点,自动算清洁/洁净/片数 └── 茧丝百回纤度 仅综合样(按回数批量生成 + 自动汇总标注值) 打印下拉 = 原料小样报表 / 综合样报表 / 解舒调查报表 ``` --- ## 二、后端 ### 2.1 领域实体(`F9WebAiTest.Domain/Entities/QC/`) 工艺执行书(`Gyzxs/`,表前缀 `qc_gyzxs_`): | 文件 | 表 | 说明 | |---|---|---| | `GyzxsDocVersion.cs` | `qc_gyzxs_doc_version` | 主控:以庄口为键,记录 7 张子单据 Id(列表 √ 来源) | | `GyzxsFengMian.cs` | `qc_gyzxs_fengmian` | 封面(含编号 SJZ-{年}-工艺-{序}、生产时间区间) | | `GyzxsShichan.cs` | `qc_gyzxs_shichan` | 试产:茧质 7 项 + 自动缫 16 项 + 煮茧 11 项 | | `GyzxsXbj.cs` | `qc_gyzxs_xbj` / `qc_gyzxs_xbj_hunjian` | 选剥茧主表 + 混茧比例明细(庄别/重量/包数/比例/混茧包数) | | `GyzxsXbjSsDy.cs` | `qc_gyzxs_xbj_ssdy` | 试缫与大样(Ss*/Dy* 各 10 项 + 技术措施 + 签署) | | `GyzxsZhuJian.cs` | `qc_gyzxs_zhujian` / `_chejian` / `_fuzhu` | 煮茧主表 + 分车间配温 + 副煮车间结果 | | `GyzxsZds.cs` | `qc_gyzxs_zds` / `qc_gyzxs_zds_dyzl` | 自动缫表一 + 大样表二 | | `GyzxsHs.cs` | `qc_gyzxs_hs` | 后缫(工艺执行书本体) | 样茧试缫(`Yjss/`,表前缀 `qc_yjss_`):`main_ylxy`、`main_zhy`、`dc_xjdc`、`dc_jsdc`、`dc_jfdc_main`、`dc_jfdc_item`、`dc_jsbhxd_main`、`dc_jsbhxd`、`dc_qpdc`、`dc_qjjj`。 > **与 F9 的差异(有意为之)**:F9 子表只用 `yjss_id` 外键,依赖雪花全局唯一 Id;本系统主表用自增 Id,原料小样与综合样会重号,因此所有子表增加 **`YjssType`(1 原料小样 / 2 综合样)** 判别列,读写一律按 `(YjssId, YjssType)` 定位。 > 另:F9 的「综合样茧质」在本系统未单独立表,其指标以冗余字段直接落在选剥茧 / 煮茧 / 自动缫 / 试产表上,报表照常可打。 ### 2.2 服务与接口 | 服务 | 主要方法 | |---|---| | `GyzxsService` | `GetDocVersionPagedAsync` / `CreateDocVersionAsync` / 7 组 `Get*Async`+`Save*Async` / `GetPrintDataAsync` | | `YjssService` | `GetPagedAsync` / `SaveYlxyAsync` / `SaveZhyAsync` / 6 组子单据读写 / `GetFullAsync` / `GetJsdcSummaryAsync` | 设计要点: 1. **指针回写**:任一张子单据保存后 upsert `qc_gyzxs_doc_version` 对应列(`ZdsDyId` 早前漏检已修);解舒/百回纤度保存后回写主表记录数 `JsdcCt`/`JsbhxdCt`。 2. **按「庄口 + 规格」唯一**:试产、试缫与大样、自动缫、大样、后缫均以 `(GyzkId, Guige)` 为业务键;封面、选剥茧、煮茧按庄口唯一。 3. **报表数据包**:`GetPrintDataAsync(type, gyzkId, guige)` 返回 `Parameters`(中文键)+ `Main/Sub1/Sub2`,结构与 Grid++ 的 `Report_Data` 对齐,后续可直接被报表中心 Provider 复用。 4. **编号自增**:封面新建时按 `SJZ-{年度}-工艺-{n}` 预生成。 接口一览(均需登录): ``` GET /api/qc/gyzxs?year=&keyword=&pageIndex=&pageSize= POST /api/qc/gyzxs/version?gyzkId= DELETE /api/qc/gyzxs/version/{id} GET|POST /api/qc/gyzxs/fengmian (gyzkId) GET|POST /api/qc/gyzxs/shichan (gyzkId + guige) GET|POST /api/qc/gyzxs/xbj (主表 + hunJian 明细数组) GET|POST /api/qc/gyzxs/ssdy (gyzkId + guige) GET|POST /api/qc/gyzxs/zhujian (主表 + cheJian + fuZhu) GET|POST /api/qc/gyzxs/zds (zds + dyzl) GET|POST /api/qc/gyzxs/hs (gyzkId + guige) GET /api/qc/gyzxs/print/{type}?gyzkId=&guige= type = fengmian|gyzxs|xbj|shichan|ssdy|zhujian|zds|zdsdy GET /api/qc/yjss?type=1|2&year=&keyword= POST /api/qc/yjss/ylxy | /zhy DELETE /api/qc/yjss/{type}/{id} GET|POST /api/qc/yjss/xjdc/{yjssId}?type= /api/qc/yjss/xjdc?type= GET|POST /api/qc/yjss/jsdc/{yjssId}?type= /api/qc/yjss/jsdc?type= DELETE /api/qc/yjss/jsdc/{type}/{id} GET|POST /api/qc/yjss/jfdc|qpdc|qjjj|jsbhxd (GET 带 ?type=) GET /api/qc/yjss/full/{type}/{id} GET /api/qc/yjss/jsdc-summary/{yjssId}?type= ``` ### 2.3 菜单种子 `DbSeeder.SeedQcMenus()`:幂等创建 `/qc` 目录 + 两个页面菜单,admin 角色授权,并把一级目录顺序校正为 `基础(3) < 员工(4) < 前缫(5) < 后缫(6) < 质量(7) < 消息(8) < 系统(9) < 报表(10)`。 --- ## 三、前端 | 文件 | 作用 | |---|---| | `views/qc/components/SchemaForm.vue` | 字段驱动表单(text/number/date/textarea,支持 `dyzl.xxx` 嵌套键) | | `views/qc/components/QcGrid.vue` | 字段驱动可编辑表格(对应 WinForms 的 f9AntdUITable) | | `views/qc/gyzxs/schema.js` | 7 张子单据 + 8 种报表的字段/版式元数据 | | `views/qc/gyzxs/index.vue` | 庄口列表(√ 标记、按年度筛、打印下拉、按庄口新增) | | `views/qc/gyzxs/DocDialog.vue` | 子单据录入弹窗(含「从指定庄口读取数据」跨庄口复制) | | `views/qc/gyzxs/PrintDialog.vue` | 8 张报表版式 + A4 横向打印 | | `views/qc/yjss/index.vue` | 原料小样 / 综合样双页签列表 | | `views/qc/yjss/schema.js` | 6 类调查字段 + 计算规则(比例 / 茧幅 / 茧层率 / 清洁洁净) | | `views/qc/yjss/YjssDocDialog.vue` | 6 类调查录入(解舒为「列表 + 明细弹窗」) | | `views/qc/yjss/YjssPrintDialog.vue` | 原料小样 / 综合样 / 解舒调查 三张报表 | 业务算法(前端即时计算,保存落库): - 选剥茧:按重量重算比例,总官堆 40 包分摊混茧包数,末行取差额。 - 茧幅:`平均 = Σ(茧幅×数量)/Σ数量`,整齐率 = `|茧幅-平均| ≤ 1mm` 占比,均方差按加权。 - 茧丝百回纤度:外/中/内三百回为分区间平均,最大/内外开差取极值差。 - 清洁洁净:`片数 = Σ洁净档位片数`;`洁净 = Σ(分值×片数)/片数`;`清洁 = 100 - (特大糙×3 + 废丝×3 + 大糙×2 + 黏附糙 + 大长结 + 重螺旋)/片数×100`。 - 解舒:`解舒率 = 解舒丝长 / 一茧丝长`,`落绪总粒数 = 外+中+内`。 --- ## 四、验证记录 | 项 | 结果 | |---|---| | `dotnet build F9WebAiTest.sln` | ✅ 0 错误(120 条既有 CS8632 可空注解警告) | | `vite build` | ✅ 通过(仅既有 chunk 体积/动态导入警告) | | IDE 诊断(`views/qc/**`、`router/index.js`) | ✅ 0 | | 菜单 | ✅ `质量`(sort=7) → `工艺执行书` / `样茧试缫`,admin 自动授权 | | 工艺执行书 7 张子单据保存 + 回读 | ✅ 封面/试产/选剥茧(2 行混茧)/试缫与大样/煮茧(1 分车间+1 副煮)/自动缫(含大样)/后缫 | | 主控 √ 标记 | ✅ 7 个指针全部回写(`zdsDyId` 漏检缺陷已修) | | 8 张报表数据 | ✅ 每张均返回 title + 参数区(如「工艺执行书」28 个参数),xbj/zhujian/ssdy 有结果集 | | 封面编号 | ✅ 新庄口预生成 `SJZ-2026-工艺-1` | | 样茧试缫(原料小样) | ✅ 主表 + 选茧 + 解舒(1 条) + 清洁洁净,解舒汇总正确 | | 样茧试缫(综合样) | ✅ 主表 + 茧幅(3 档) + 切剖 + 百回纤度(2 行),整页参数区完整 | | 两类样品隔离 | ✅ 同一 `yjssId` 下 `type=1` 有数据、`type=2` 返回空 | --- ## 五、后续可做 1. **报表中心对接**:8 张报表目前用 HTML 打印(版式已按 RTF 还原,A4 横向)。若要进「报表中心」,可基于 `/api/qc/gyzxs/print/{type}` 写 8 个 `RepDt_*` Provider 并制作 .grf 模板,数据结构已预留 `Parameters/Main/Sub1/Sub2`。 2. **综合样茧质单独立表**:目前选剥茧/煮茧/自动缫/试产的茧质指标是冗余存储;若需要「综合样茧质」独立维护与联动,可补一张主表并由保存时回填。 3. **审批状态机**:设计/审核/审批目前是文本字段,可升级为流程(参考考勤模块的审批流)。 4. **单位与精度**:部分指标沿用 F9 的字符串区间表达(如 `185±5`、`20~38`),如后续需要统计,可拆分为「下限/上限/目标值」三列。