|
|
@@ -31,6 +31,9 @@ public class FqcInspBillService : IDynamicApiController, ITransient
|
|
|
/// <summary>归口空表建表守卫:每进程仅尝试一次 CREATE TABLE IF NOT EXISTS。</summary>
|
|
|
private static int _taskTableEnsured;
|
|
|
|
|
|
+ /// <summary>检验单明细子表归口空表建表守卫:每进程仅尝试一次。</summary>
|
|
|
+ private static int _detailTableEnsured;
|
|
|
+
|
|
|
public FqcInspBillService(ISqlSugarClient db)
|
|
|
{
|
|
|
_db = db;
|
|
|
@@ -223,6 +226,82 @@ public class FqcInspBillService : IDynamicApiController, ITransient
|
|
|
return new { total, page, pageSize, list };
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// FQC 检验单只读详情(源 qms_qcpp_inspbill 头 + qms_qcpp_inspbillst 明细,glid=id)。
|
|
|
+ ///
|
|
|
+ /// 契约对齐 S6 IPQC:id<=0 或未命中返回 null(HTTP 200/204);扁平头 + Lines[]。
|
|
|
+ /// 明细首查前 EnsureFqcDetailTableAsync 幂等建归口空表;样本 j1..j50 收敛为 Samples[](末尾空值裁剪)。
|
|
|
+ /// 仅 SELECT:无任何写入。两表无 tenant_id,TenantId 接收即忽略。
|
|
|
+ /// </summary>
|
|
|
+ [DisplayName("FQC检验单详情")]
|
|
|
+ [HttpGet("detail")]
|
|
|
+ public async Task<FqcInspBillDetailDto?> GetDetail([FromQuery] long id, [FromQuery] long? tenantId)
|
|
|
+ {
|
|
|
+ if (id <= 0) return null;
|
|
|
+ await EnsureFqcDetailTableAsync();
|
|
|
+
|
|
|
+ var head = (await _db.Ado.SqlQueryAsync<FqcInspBillDetailDto>(
|
|
|
+ """
|
|
|
+ SELECT
|
|
|
+ a.id AS Id,
|
|
|
+ a.FBILLNO AS BillNo,
|
|
|
+ a.FINSPEENDDATE AS InspectTime,
|
|
|
+ a.lydjbh AS SourceBillNo,
|
|
|
+ a.jyr AS Inspector,
|
|
|
+ a.pd AS Judgment,
|
|
|
+ a.FMATERIALCFG AS MaterialCode,
|
|
|
+ a.wlmc AS MaterialName,
|
|
|
+ a.ggxh AS Spec,
|
|
|
+ a.scph AS ProductionBatchNo,
|
|
|
+ a.sczld AS ProductionOrderNo,
|
|
|
+ a.sczldsl AS OrderQty,
|
|
|
+ (SELECT MIN(wo.WorkOrd) FROM WorkOrdMaster wo WHERE wo.Batch = a.sczld) AS SapWorkOrderNo,
|
|
|
+ a.jysj AS InspectQty,
|
|
|
+ a.hgsl AS QualifiedQty,
|
|
|
+ a.bhgsl AS UnqualifiedQty,
|
|
|
+ a.jfbh AS FireNo,
|
|
|
+ a.jgbh AS InspectSpecNo,
|
|
|
+ a.jgbb AS InspectSpecVersion
|
|
|
+ FROM qms_qcpp_inspbill a
|
|
|
+ WHERE a.id = @id
|
|
|
+ LIMIT 1
|
|
|
+ """,
|
|
|
+ new List<SugarParameter> { new("@id", id) })).FirstOrDefault();
|
|
|
+
|
|
|
+ if (head == null || head.Id <= 0) return null;
|
|
|
+
|
|
|
+ var lineRows = await _db.Ado.SqlQueryAsync<FqcInspBillDetailLineRow>(
|
|
|
+ """
|
|
|
+ SELECT
|
|
|
+ st.id AS Id,
|
|
|
+ st.xh AS SeqNo,
|
|
|
+ st.jyxm AS InspectionItem,
|
|
|
+ st.jsbz AS AcceptStandard,
|
|
|
+ st.jsyq AS TechRequirement,
|
|
|
+ st.cyfa AS SamplingPlan,
|
|
|
+ st.ybl AS SampleQty,
|
|
|
+ st.sx AS UpperLimit,
|
|
|
+ st.xx AS LowerLimit,
|
|
|
+ st.SizeSpecifications AS SizeSpecification,
|
|
|
+ st.pd AS Judgment,
|
|
|
+ st.NonNumericalTypeOK AS NonNumericOk,
|
|
|
+ st.NonNumericalTypeNG AS NonNumericNg,
|
|
|
+ st.bz AS Remark,
|
|
|
+ st.j1,st.j2,st.j3,st.j4,st.j5,st.j6,st.j7,st.j8,st.j9,st.j10,
|
|
|
+ st.j11,st.j12,st.j13,st.j14,st.j15,st.j16,st.j17,st.j18,st.j19,st.j20,
|
|
|
+ st.j21,st.j22,st.j23,st.j24,st.j25,st.j26,st.j27,st.j28,st.j29,st.j30,
|
|
|
+ st.j31,st.j32,st.j33,st.j34,st.j35,st.j36,st.j37,st.j38,st.j39,st.j40,
|
|
|
+ st.j41,st.j42,st.j43,st.j44,st.j45,st.j46,st.j47,st.j48,st.j49,st.j50
|
|
|
+ FROM qms_qcpp_inspbillst st
|
|
|
+ WHERE st.glid = @id
|
|
|
+ ORDER BY st.xh, st.id
|
|
|
+ """,
|
|
|
+ new List<SugarParameter> { new("@id", id) });
|
|
|
+
|
|
|
+ head.Lines = lineRows.Select(r => r.ToLine()).ToList();
|
|
|
+ return head;
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 排序解析:白名单命中则 "col dir, tie",否则回落默认;方向仅 asc/desc,非法回落 desc。
|
|
|
/// </summary>
|
|
|
@@ -296,4 +375,72 @@ public class FqcInspBillService : IDynamicApiController, ITransient
|
|
|
throw;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 检验单明细子表归口空表建表(方案 A,DDL 例外、每进程一次、零 DML):
|
|
|
+ /// aidopdev 无 qms_qcpp_inspbillst 时 CREATE TABLE IF NOT EXISTS 建同构 dopdemo 的 82 列空表(glid→主表 id),
|
|
|
+ /// 待上游抽数填充。样本列 j1..j50 一并建。仅建表,不写任何数据行。
|
|
|
+ /// 字符集忠实复刻 dopdemo:13 个列用 utf8mb3(3 字节),其余表默认 utf8mb4;否则 ~68 个 VARCHAR(255) 全 utf8mb4
|
|
|
+ /// 会超 MySQL 单行 65535 字节上限(Row size too large)。join 键 glid/id 为 bigint,字符集不影响。
|
|
|
+ /// </summary>
|
|
|
+ private async Task EnsureFqcDetailTableAsync()
|
|
|
+ {
|
|
|
+ if (Interlocked.Exchange(ref _detailTableEnsured, 1) == 1) return;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ await _db.Ado.ExecuteCommandAsync(
|
|
|
+ """
|
|
|
+ CREATE TABLE IF NOT EXISTS qms_qcpp_inspbillst (
|
|
|
+ id BIGINT NOT NULL PRIMARY KEY COMMENT '子表id',
|
|
|
+ glid BIGINT NULL COMMENT '关联id(=qms_qcpp_inspbill.id)',
|
|
|
+ jyxm VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '检验项目',
|
|
|
+ sx VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '上限',
|
|
|
+ xx VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '下限',
|
|
|
+ bz VARCHAR(255) NULL COMMENT '备注',
|
|
|
+ czf VARCHAR(255) NULL,
|
|
|
+ j1 VARCHAR(255) NULL, j2 VARCHAR(255) NULL, j3 VARCHAR(255) NULL, j4 VARCHAR(255) NULL, j5 VARCHAR(255) NULL,
|
|
|
+ j6 VARCHAR(255) NULL, j7 VARCHAR(255) NULL, j8 VARCHAR(255) NULL, j9 VARCHAR(255) NULL, j10 VARCHAR(255) NULL,
|
|
|
+ j11 VARCHAR(255) NULL, j12 VARCHAR(255) NULL, j13 VARCHAR(255) NULL, j14 VARCHAR(255) NULL, j15 VARCHAR(255) NULL,
|
|
|
+ j16 VARCHAR(255) NULL, j17 VARCHAR(255) NULL, j18 VARCHAR(255) NULL, j19 VARCHAR(255) NULL, j20 VARCHAR(255) NULL,
|
|
|
+ j21 VARCHAR(255) NULL, j22 VARCHAR(255) NULL, j23 VARCHAR(255) NULL, j24 VARCHAR(255) NULL, j25 VARCHAR(255) NULL,
|
|
|
+ j26 VARCHAR(255) NULL, j27 VARCHAR(255) NULL, j28 VARCHAR(255) NULL, j29 VARCHAR(255) NULL, j30 VARCHAR(255) NULL,
|
|
|
+ j31 VARCHAR(255) NULL, j32 VARCHAR(255) NULL, j33 VARCHAR(255) NULL, j34 VARCHAR(255) NULL, j35 VARCHAR(255) NULL,
|
|
|
+ j36 VARCHAR(255) NULL, j37 VARCHAR(255) NULL, j38 VARCHAR(255) NULL, j39 VARCHAR(255) NULL, j40 VARCHAR(255) NULL,
|
|
|
+ j41 VARCHAR(255) NULL, j42 VARCHAR(255) NULL, j43 VARCHAR(255) NULL, j44 VARCHAR(255) NULL, j45 VARCHAR(255) NULL,
|
|
|
+ j46 VARCHAR(255) NULL, j47 VARCHAR(255) NULL, j48 VARCHAR(255) NULL, j49 VARCHAR(255) NULL, j50 VARCHAR(255) NULL,
|
|
|
+ pd VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '判定',
|
|
|
+ ybl VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '样本量',
|
|
|
+ txfl BIGINT NULL COMMENT '指标分类',
|
|
|
+ bztk TEXT NULL,
|
|
|
+ jsyq TEXT NULL COMMENT '技术要求',
|
|
|
+ jyyqsbgj TEXT NULL COMMENT '检验仪器设备工具',
|
|
|
+ jyff TEXT NULL,
|
|
|
+ jytk TEXT NULL,
|
|
|
+ jsbz TEXT NULL COMMENT '接收标准',
|
|
|
+ cyfa TEXT NULL COMMENT '抽样方案',
|
|
|
+ jl TEXT NULL,
|
|
|
+ jlqjbh VARCHAR(255) NULL COMMENT '计量器具编号',
|
|
|
+ jlbh VARCHAR(255) NULL COMMENT '计量器具编号',
|
|
|
+ jf1 VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '击发1',
|
|
|
+ jf2 VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '击发2',
|
|
|
+ jf3 VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '击发3',
|
|
|
+ jf4 VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '击发4',
|
|
|
+ jf5 VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '击发5',
|
|
|
+ NonNumericalTypeOK BIGINT NULL COMMENT '非数值OK',
|
|
|
+ NonNumericalTypeNG BIGINT NULL COMMENT '非数值NG',
|
|
|
+ ThresholdSwitch VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '自动判定按钮',
|
|
|
+ ThresholdSwitchInt BIGINT NULL COMMENT '自动判定按钮',
|
|
|
+ SizeSpecifications VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '规范标准',
|
|
|
+ ybl1 VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL,
|
|
|
+ xh INT NULL COMMENT '序号',
|
|
|
+ KEY idx_qms_qcpp_inspbillst_glid (glid)
|
|
|
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='FQC检验单明细(品检项目) 归口自旧系统dopdemo,空表待上游抽数'
|
|
|
+ """);
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ Interlocked.Exchange(ref _detailTableEnsured, 0);
|
|
|
+ throw;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|