Просмотр исходного кода

fix(s7): FQC检验单补全物料编码/检验数量/检验人/检验时间四字段

源 qms_qcpp_inspbill 四列此前从未写入,列表(读中台 mdp_std_fqc_result)对应列空。按写入时机补齐:
- 生成(FqcApplyService.GenerateInspection):INSERT 增 FMATERIALCFG=报检 wlbm、jysj=报检数量 sl(非指令单数量 sczldsl),随 wlmc/ggxh 同事务落库
- 录入(FqcInspBillFlowService.SubmitResult):① 号 UPDATE 增 jyr=录入者(RealName??Account)、FINSPEENDDATE=now(与同事务 qms_fqcbj.jywcsj 同一检验完成时刻);退回重提允许覆盖为最后一次有效提交。jyr(检验人名)与 jyfzr(负责人 SysUser.Id)语义分离不混用
- 历史回填 1.0.379.sql(幂等,仅补空,精确三键关联):①全部历史单补 FMATERIALCFG/jysj;②已录单(pd 非空)补 jyr(负责人推定名)/FINSPEENDDATE(jywcsj)

冒烟(阶段2):migration 影响12行;新单生成 FMATERIALCFG=91HC0497/jysj=42(=sl非965) runtime PASS;
refresh→std→前端四列贯通 UI PASS;历史回填单检验人/时间正常渲染。
Known limitation:2张最早UAT单无源报检关联保持NULL;submit/reject runtime 受既有 S7 FQC 角色凭据约束未跑(非本批代码问题)。

chore: bump version server 1.0.379
YY968XX 5 часов назад
Родитель
Сommit
9ac0a77fa2

+ 6 - 3
server/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj

@@ -11,9 +11,9 @@
     <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
     <Copyright>Admin.NET</Copyright>
     <Description>Admin.NET 通用权限开发平台</Description>
-    <AssemblyVersion>1.0.378</AssemblyVersion>
-    <FileVersion>1.0.378</FileVersion>
-    <Version>1.0.378</Version>
+    <AssemblyVersion>1.0.379</AssemblyVersion>
+    <FileVersion>1.0.379</FileVersion>
+    <Version>1.0.379</Version>
   </PropertyGroup>
 
   <ItemGroup>
@@ -472,6 +472,9 @@
     <None Update="UpdateScripts\1.0.372.sql">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="UpdateScripts\1.0.379.sql">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
     <None Update="UpdateScripts\1.0.364.verify.sql">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>

+ 38 - 0
server/Admin.NET.Web.Entry/UpdateScripts/1.0.379.sql

@@ -0,0 +1,38 @@
+-- 1.0.379:S7 FQC 检验单四字段历史回填(物料编码 / 检验数量 / 检验人 / 检验时间)
+-- 背景:源 qms_qcpp_inspbill 的 FMATERIALCFG/jysj 生成时漏写、jyr/FINSPEENDDATE 从未写;
+--       新单已由 FqcApplyService.GenerateInspection / FqcInspBillFlowService.SubmitResult 补齐,本脚本仅回填存量历史单。
+-- 口径:
+--   ① FMATERIALCFG = 报检 qms_fqcbj.wlbm;jysj = 报检数量 qms_fqcbj.sl(非指令单数量 sczldsl)。
+--   ② 仅已录结果(pd 非空)的历史单:jyr = 负责人 jyfzr(=SysUser.Id) 对应 RealName(空回退 Account) 的【推定值】,
+--      FINSPEENDDATE = qms_fqcbj.jywcsj(检验完成时刻)。历史 jyr 非"实际 submit 操作者"的直接证据,仅历史补齐。
+-- 关联:b.lydjbh=q.FBILLNO AND b.hid=q.id AND b.tenant_id=q.tenant_id(精确,禁 LIKE/单键,防串单)。
+-- 幂等:只补 NULL/空,IFNULL 不覆盖任何已有有效值;可重复执行,二次运行 0/极少变更。
+-- 方言:MySQL(当前主库 aidopdev,DATABASE() 解析当前库)。SysUser 为框架表 PascalCase,Linux 下大小写敏感。
+
+-- ① 物料编码 + 检验数量(全部历史单,仅补空)
+UPDATE qms_qcpp_inspbill b
+JOIN qms_fqcbj q
+  ON q.FBILLNO = b.lydjbh
+ AND q.id = b.hid
+ AND q.tenant_id = b.tenant_id
+SET
+  b.FMATERIALCFG = IFNULL(NULLIF(TRIM(b.FMATERIALCFG), ''), q.wlbm),
+  b.jysj         = IFNULL(b.jysj, q.sl)
+WHERE NULLIF(TRIM(b.FMATERIALCFG), '') IS NULL
+   OR b.jysj IS NULL;
+
+-- ② 检验人 + 检验时间(仅已录结果 pd 非空,仅补空;jyfzr 非纯数字则不解析姓名、保持 NULL)
+UPDATE qms_qcpp_inspbill b
+JOIN qms_fqcbj q
+  ON q.FBILLNO = b.lydjbh
+ AND q.id = b.hid
+ AND q.tenant_id = b.tenant_id
+LEFT JOIN SysUser u
+  ON q.jyfzr REGEXP '^[0-9]+$'
+ AND u.Id = CAST(q.jyfzr AS UNSIGNED)
+SET
+  b.jyr = IFNULL(NULLIF(TRIM(b.jyr), ''),
+                 COALESCE(NULLIF(TRIM(u.RealName), ''), NULLIF(TRIM(u.Account), ''))),
+  b.FINSPEENDDATE = IFNULL(b.FINSPEENDDATE, q.jywcsj)
+WHERE b.pd IS NOT NULL
+  AND (NULLIF(TRIM(b.jyr), '') IS NULL OR b.FINSPEENDDATE IS NULL);

+ 7 - 1
server/Plugins/Admin.NET.Plugin.AiDOP/FinishedWarehouse/FqcApplyService.cs

@@ -208,7 +208,7 @@ public class FqcApplyService : IDynamicApiController, ITransient
 
         // 1) 报检存在 + 归属 + 关键字段
         var apply = await _db.Ado.SqlQuerySingleAsync<ApplyGenRow>(
-            @"SELECT id AS Id, FBILLNO AS BillNo, wlbm AS Wlbm, cpmc AS Cpmc, cpxh AS Cpxh, scph AS Scph, sczld AS Sczld, sczldsl AS Sczldsl
+            @"SELECT id AS Id, FBILLNO AS BillNo, wlbm AS Wlbm, cpmc AS Cpmc, cpxh AS Cpxh, scph AS Scph, sczld AS Sczld, sczldsl AS Sczldsl, sl AS Sl
               FROM qms_fqcbj WHERE id=@id AND tenant_id=@t LIMIT 1",
             new SugarParameter("@id", input.ApplyId), new SugarParameter("@t", tenantId));
         if (apply == null) throw Oops.Oh("报检不存在或不属于当前租户");
@@ -270,9 +270,11 @@ public class FqcApplyService : IDynamicApiController, ITransient
                     await _db.Ado.ExecuteCommandAsync(
                         @"INSERT INTO qms_qcpp_inspbill
                             (id, tenant_id, FBILLNO, lydjbh, hid, scph, sczld, sczldsl, wlmc, ggxh,
+                             FMATERIALCFG, jysj,
                              jgbh, jgbb, jygfid, sxrq, FBILLSTATUS, FCREATETIME)
                           VALUES
                             (@id, @t, @no, @ly, @hid, @scph, @sczld, @sczldsl, @wlmc, @ggxh,
+                             @FMATERIALCFG, @jysj,
                              @jgbh, @jgbb, @jygfid, @sxrq, '未检验', @now)",
                         new SugarParameter("@id", headId),
                         new SugarParameter("@t", tenantId),
@@ -284,6 +286,9 @@ public class FqcApplyService : IDynamicApiController, ITransient
                         new SugarParameter("@sczldsl", (object?)apply.Sczldsl ?? DBNull.Value),
                         new SugarParameter("@wlmc", (object?)apply.Cpmc ?? DBNull.Value),
                         new SugarParameter("@ggxh", (object?)apply.Cpxh ?? DBNull.Value),
+                        // 物料编码=报检 wlbm、检验数量=报检数量 sl(生成时已确定的静态业务字段,随 wlmc/ggxh 同一 INSERT 落库)
+                        new SugarParameter("@FMATERIALCFG", (object?)apply.Wlbm ?? DBNull.Value),
+                        new SugarParameter("@jysj", (object?)apply.Sl ?? DBNull.Value),
                         new SugarParameter("@jgbh", (object?)chosen.Wjbh ?? DBNull.Value),
                         new SugarParameter("@jgbb", (object?)chosen.Bb ?? DBNull.Value),
                         new SugarParameter("@jygfid", chosen.Jygfid.ToString()),
@@ -480,6 +485,7 @@ internal sealed class ApplyGenRow
     public string? Scph { get; set; }
     public string? Sczld { get; set; }
     public decimal? Sczldsl { get; set; }
+    public decimal? Sl { get; set; }
 }
 
 internal sealed class ExistingInspRow

+ 7 - 2
server/Plugins/Admin.NET.Plugin.AiDOP/FinishedWarehouse/FqcInspBillFlowService.cs

@@ -91,6 +91,8 @@ public class FqcInspBillFlowService : IDynamicApiController, ITransient
         }
 
         var now = DateTime.Now;
+        // 检验人=本次实际提交检验结果的操作者姓名(RealName 空回退 Account);语义区别于负责人 jyfzr(=SysUser.Id),二者不混用
+        var inspectorName = _userManager.RealName ?? _userManager.Account;
 
         var tran = await _db.AsTenant().UseTranAsync(async () =>
         {
@@ -112,15 +114,18 @@ public class FqcInspBillFlowService : IDynamicApiController, ITransient
 
             var tid = ResolveTenantOrThrow();
 
-            // ① 检验业务结果 → qms_qcpp_inspbill(仅 pd/hgsl/bhgsl/clfs,不覆盖继承字段)
+            // ① 检验业务结果 → qms_qcpp_inspbill(pd/hgsl/bhgsl/clfs 结果;jyr=录入者、FINSPEENDDATE=检验完成时刻)
+            //    FINSPEENDDATE 复用同一 now,与本事务内 qms_fqcbj.jywcsj 保持同一"检验完成"时刻;退回重提允许覆盖为最后一次有效提交
             await _db.Ado.ExecuteCommandAsync(
-                "UPDATE qms_qcpp_inspbill SET pd=@pd, hgsl=@hgsl, bhgsl=@bhgsl, clfs=@clfs WHERE id=@id AND tenant_id=@TenantFilter",
+                "UPDATE qms_qcpp_inspbill SET pd=@pd, hgsl=@hgsl, bhgsl=@bhgsl, clfs=@clfs, jyr=@jyr, FINSPEENDDATE=@finsp WHERE id=@id AND tenant_id=@TenantFilter",
                 new List<SugarParameter>
                 {
                     new("@pd", input.Pd),
                     new("@hgsl", input.Hgsl),
                     new("@bhgsl", input.Bhgsl),
                     new("@clfs", input.Pd == 1 ? input.Clfs : null),
+                    new("@jyr", inspectorName),
+                    new("@finsp", now),
                     new("@id", input.Id),
                     new("@TenantFilter", tid),
                 });