Pārlūkot izejas kodu

feat(s7): FQC检验单录入表头补齐报检申请信息(LEFT JOIN qms_fqcbj)

检验单录入表头原仅6项(检验单号/来源报检/检规/产品名称/规格型号/生产批号),
补齐报检申请信息共10项:
- FqcInspectionService.Detail 头查询加 i.sczldsl + LEFT JOIN qms_fqcbj q
  (q.FBILLNO=i.lydjbh AND q.id=i.hid AND q.tenant_id=i.tenant_id) 取
  wlbm/sl/yxj/jfbh/FAPPLYUSER/FAPPLYTIME/jyfzr/FCOMMENT;DTO 扩10字段
- 检验负责人 jyfzr 双语义处理:认领/调配写数字SysUser id→ClearFilter反解姓名;
  检验流程提交写姓名字符串→非数字直接展示(修 code-review 发现的已完成单负责人显示空)
- fqcInspection.ts FqcInspHead 扩10字段;fqcInspDetail.vue 表头6格→16格
  (物料编码/生产指令单/指令单数量/报检数量/检验优先级/击发编号/申请人/申请时间/
  检验负责人/备注)

只读补显,DDL-free(均读已有列)。

chore: bump version Web 2.4.307 / server 1.0.373
YY968XX 3 dienas atpakaļ
vecāks
revīzija
86c246829e

+ 1 - 1
Web/package.json

@@ -1,7 +1,7 @@
 {
 	"name": "admin.net",
 	"type": "module",
-	"version": "2.4.306",
+	"version": "2.4.307",
 	"packageManager": "pnpm@10.32.1",
 	"lastBuildTime": "2026.03.15",
 	"description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",

+ 11 - 0
Web/src/views/aidop/s7/api/fqcInspection.ts

@@ -17,6 +17,17 @@ export interface FqcInspHead {
 	qualifiedQty?: number | null;
 	unqualifiedQty?: number | null;
 	billStatus?: string;
+	// ── 报检申请信息(后端 LEFT JOIN qms_fqcbj 补齐)──
+	orderQty?: number | null;
+	materialCode?: string;
+	applyQty?: number | null;
+	priority?: string;
+	fireNo?: string;
+	applicant?: string;
+	applyTime?: string;
+	ownerId?: string;
+	ownerName?: string;
+	remark?: string;
 }
 
 export interface FqcInspLine {

+ 16 - 0
Web/src/views/aidop/s7/fqc/fqcInspDetail.vue

@@ -12,8 +12,18 @@
 			<el-descriptions-item label="来源报检">{{ head.sourceBillNo }}</el-descriptions-item>
 			<el-descriptions-item label="检规">{{ head.specNo }} / {{ head.specVersion }}</el-descriptions-item>
 			<el-descriptions-item label="产品名称">{{ head.materialName }}</el-descriptions-item>
+			<el-descriptions-item label="物料编码">{{ head.materialCode }}</el-descriptions-item>
 			<el-descriptions-item label="规格型号">{{ head.spec }}</el-descriptions-item>
 			<el-descriptions-item label="生产批号">{{ head.productionBatchNo }}</el-descriptions-item>
+			<el-descriptions-item label="生产指令单">{{ head.productionOrderNo }}</el-descriptions-item>
+			<el-descriptions-item label="指令单数量">{{ head.orderQty ?? '' }}</el-descriptions-item>
+			<el-descriptions-item label="报检数量">{{ head.applyQty ?? '' }}</el-descriptions-item>
+			<el-descriptions-item label="检验优先级">{{ head.priority }}</el-descriptions-item>
+			<el-descriptions-item label="击发编号">{{ head.fireNo }}</el-descriptions-item>
+			<el-descriptions-item label="申请人">{{ head.applicant }}</el-descriptions-item>
+			<el-descriptions-item label="申请时间">{{ fmtDateTime(head.applyTime) }}</el-descriptions-item>
+			<el-descriptions-item label="检验负责人">{{ head.ownerName }}</el-descriptions-item>
+			<el-descriptions-item label="备注" :span="3">{{ head.remark }}</el-descriptions-item>
 		</el-descriptions>
 
 		<div class="toolbar mt12">
@@ -114,6 +124,12 @@ const loading = ref(false);
 const saving = ref(false);
 const judging = ref(false);
 
+function fmtDateTime(v?: string | null) {
+	if (!v) return '';
+	const s = String(v);
+	return s.length > 19 ? s.slice(0, 19).replace('T', ' ') : s.replace('T', ' ');
+}
+
 function sampleSlots(row: FqcInspLine): number {
 	if (!row.samples) row.samples = [];
 	// 至少 5 个空槽,或已录入数+1

+ 3 - 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.372</AssemblyVersion>
-    <FileVersion>1.0.372</FileVersion>
-    <Version>1.0.372</Version>
+    <AssemblyVersion>1.0.373</AssemblyVersion>
+    <FileVersion>1.0.373</FileVersion>
+    <Version>1.0.373</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 39 - 4
server/Plugins/Admin.NET.Plugin.AiDOP/FinishedWarehouse/FqcInspectionService.cs

@@ -38,14 +38,38 @@ public class FqcInspectionService : IDynamicApiController, ITransient
     {
         if (inspBillId <= 0) return null;
         var tenantId = ResolveTenantOrThrow();
+        // 头:检验单本体(i) + LEFT JOIN 报检 qms_fqcbj(q, by lydjbh=FBILLNO AND id=hid) 补齐报检申请信息
         var head = (await _db.Ado.SqlQueryAsync<FqcInspHeadRow>(
-            @"SELECT id AS Id, FBILLNO AS BillNo, lydjbh AS SourceBillNo, wlmc AS MaterialName, ggxh AS Spec,
-                     scph AS ProductionBatchNo, sczld AS ProductionOrderNo, jgbh AS SpecNo, jgbb AS SpecVersion,
-                     IFNULL(pd,'') AS Pd, hgsl AS QualifiedQty, bhgsl AS UnqualifiedQty, FBILLSTATUS AS BillStatus
-              FROM qms_qcpp_inspbill WHERE id=@id AND tenant_id=@t LIMIT 1",
+            @"SELECT i.id AS Id, i.FBILLNO AS BillNo, i.lydjbh AS SourceBillNo, i.wlmc AS MaterialName, i.ggxh AS Spec,
+                     i.scph AS ProductionBatchNo, i.sczld AS ProductionOrderNo, i.jgbh AS SpecNo, i.jgbb AS SpecVersion,
+                     IFNULL(i.pd,'') AS Pd, i.hgsl AS QualifiedQty, i.bhgsl AS UnqualifiedQty, i.FBILLSTATUS AS BillStatus,
+                     i.sczldsl AS OrderQty,
+                     q.wlbm AS MaterialCode, q.sl AS ApplyQty, q.yxj AS Priority, q.jfbh AS FireNo,
+                     q.FAPPLYUSER AS Applicant, q.FAPPLYTIME AS ApplyTime, q.jyfzr AS OwnerId, q.FCOMMENT AS Remark
+              FROM qms_qcpp_inspbill i
+              LEFT JOIN qms_fqcbj q ON q.FBILLNO = i.lydjbh AND q.id = i.hid AND q.tenant_id = i.tenant_id
+              WHERE i.id=@id AND i.tenant_id=@t LIMIT 1",
             new SugarParameter("@id", inspBillId), new SugarParameter("@t", tenantId))).FirstOrDefault();
         if (head == null) return null;
 
+        // 检验负责人 jyfzr 双语义:认领/调配写 SysUser id(数字,可能跨租户),检验流程提交写姓名字符串。
+        // 数字 → ClearFilter 反解姓名(解不到回落原值);非数字 → 本就是姓名,直接展示。
+        if (!string.IsNullOrWhiteSpace(head.OwnerId))
+        {
+            if (long.TryParse(head.OwnerId, out var ownerUid))
+            {
+                var owner = await _db.Queryable<SysUser>().ClearFilter()
+                    .Where(u => u.Id == ownerUid)
+                    .Select(u => new { u.RealName, u.Account })
+                    .FirstAsync();
+                head.OwnerName = owner != null ? (owner.RealName ?? owner.Account) : head.OwnerId;
+            }
+            else
+            {
+                head.OwnerName = head.OwnerId;
+            }
+        }
+
         var jSel = string.Join(",", Enumerable.Range(1, SampleCols).Select(i => $"j{i}"));
         var raw = await _db.Ado.SqlQueryAsync<dynamic>(
             $@"SELECT id, xh, jyxm, IFNULL(lrlx,'') lrlx, IFNULL(sx,'') sx, IFNULL(xx,'') xx, jsyq, jsbz, cyfa, ybl,
@@ -192,6 +216,17 @@ public class FqcInspHeadRow
     public decimal? QualifiedQty { get; set; }
     public decimal? UnqualifiedQty { get; set; }
     public string? BillStatus { get; set; }
+    // ── 报检申请信息(LEFT JOIN qms_fqcbj)──
+    public decimal? OrderQty { get; set; }
+    public string? MaterialCode { get; set; }
+    public decimal? ApplyQty { get; set; }
+    public string? Priority { get; set; }
+    public string? FireNo { get; set; }
+    public string? Applicant { get; set; }
+    public string? ApplyTime { get; set; }
+    public string? OwnerId { get; set; }
+    public string? OwnerName { get; set; }
+    public string? Remark { get; set; }
 }
 
 public class FqcSaveDetailInput