FqcInspBillService.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. using Admin.NET.Plugin.AiDOP.FinishedWarehouse.Dto;
  2. namespace Admin.NET.Plugin.AiDOP.FinishedWarehouse;
  3. /// <summary>
  4. /// S7 FQC 成品质量:检验任务列表 / 检验单(结果)列表 只读 list 服务。
  5. ///
  6. /// 数据源(均 aidopdev,只读):
  7. /// - task-list :qms_fqcbj(37 列,归口自旧系统 dopdemo,空表待上游抽数)。yxj/FINSPECTSTATUS 原样透出,
  8. /// rf_dictionary 优先级字典未接(CTO 拍板舍弃)。默认排序 FAPPLYTIME DESC, id DESC。
  9. /// - result-list:qms_qcpp_inspbill 主表;SAP 工单号经 (SELECT MIN(wo.WorkOrd) FROM WorkOrdMaster wo
  10. /// WHERE wo.Batch = a.sczld) 标量子查询取得(Batch 非唯一仅因 NULL;非空 Batch 现 1:1,
  11. /// MIN 保确定性、杜绝行倍增)。默认排序 FINSPEENDDATE DESC, id DESC。
  12. ///
  13. /// 归口说明(方案 A,复刻已闭环 S6 IPQC IpqcInspectionMdpSyncService.EnsureTablesAsync):
  14. /// qms_fqcbj 原仅存于旧系统 dopdemo(0 行)、aidopdev 无此表,且 dopdemo 非运行时连接。
  15. /// EnsureFqcTaskTableAsync 在 aidopdev 建同构空表(CREATE TABLE IF NOT EXISTS,DDL 例外、仅一次、零 DML),
  16. /// 后续由上游一次性抽数填充,届时无需改代码即随查询流通。id 不设 AUTO_INCREMENT(抽数将携旧系统主键)。
  17. ///
  18. /// 只读边界:纯 SELECT + 一次性 DDL 建空表;绝不 INSERT/UPDATE/DELETE 任何业务表、不写库存/仓储/生产状态、
  19. /// 不接 ApprovalFlow、不做详情/子表(qms_qcpp_inspbillst 留下一批)/录入/审核/处置。两表无 tenant_id,不做租户过滤。
  20. /// </summary>
  21. [ApiDescriptionSettings(Order = 330, Description = "FQC检验单列表")]
  22. [Route("api/S7FqcInspBill")]
  23. [AllowAnonymous]
  24. [NonUnify]
  25. public class FqcInspBillService : IDynamicApiController, ITransient
  26. {
  27. private readonly ISqlSugarClient _db;
  28. /// <summary>归口空表建表守卫:每进程仅尝试一次 CREATE TABLE IF NOT EXISTS。</summary>
  29. private static int _taskTableEnsured;
  30. /// <summary>检验单明细子表归口空表建表守卫:每进程仅尝试一次。</summary>
  31. private static int _detailTableEnsured;
  32. public FqcInspBillService(ISqlSugarClient db)
  33. {
  34. _db = db;
  35. }
  36. /// <summary>检验任务列表 排序白名单(前端 prop → 物理列,杜绝 orderBy 注入)。</summary>
  37. private static readonly Dictionary<string, string> TaskOrderWhitelist = new(StringComparer.OrdinalIgnoreCase)
  38. {
  39. ["applyTime"] = "t.FAPPLYTIME",
  40. ["productionBatchNo"] = "t.scph",
  41. ["productionOrderNo"] = "t.sczld",
  42. ["materialCode"] = "t.wlbm",
  43. ["priority"] = "t.yxj",
  44. ["inspectStartTime"] = "t.jykssj",
  45. ["inspectFinishTime"] = "t.jywcsj",
  46. ["inspectProgress"] = "t.FINSPECTSTATUS",
  47. };
  48. /// <summary>检验单列表 排序白名单(前端 prop → 物理列)。</summary>
  49. private static readonly Dictionary<string, string> ResultOrderWhitelist = new(StringComparer.OrdinalIgnoreCase)
  50. {
  51. ["inspectTime"] = "a.FINSPEENDDATE",
  52. ["billNo"] = "a.FBILLNO",
  53. ["productionBatchNo"] = "a.scph",
  54. ["materialCode"] = "a.FMATERIALCFG",
  55. ["inspector"] = "a.jyr",
  56. ["inspectQty"] = "a.jysj",
  57. ["productionOrderNo"] = "a.sczld",
  58. };
  59. /// <summary>
  60. /// FQC 检验任务列表(只读分页查询,源 qms_fqcbj)。
  61. /// </summary>
  62. [DisplayName("FQC检验任务列表")]
  63. [HttpGet("task-list")]
  64. public async Task<object> GetTaskList([FromQuery] FqcTaskListInput input)
  65. {
  66. await EnsureFqcTaskTableAsync();
  67. var page = input.Page <= 0 ? 1 : input.Page;
  68. var pageSize = input.PageSize <= 0 ? 10 : (input.PageSize > 200 ? 200 : input.PageSize);
  69. var offset = (page - 1) * pageSize;
  70. // qms_fqcbj 无 tenant_id:不做租户过滤(TenantId 接收即忽略)。
  71. var where = new List<string> { "1=1" };
  72. var pars = new List<SugarParameter>();
  73. void AddLike(string? v, string col, string p)
  74. {
  75. if (string.IsNullOrWhiteSpace(v)) return;
  76. where.Add($"{col} LIKE @{p}");
  77. pars.Add(new SugarParameter($"@{p}", $"%{v.Trim()}%"));
  78. }
  79. AddLike(input.ProductionOrderNo, "t.sczld", "ProductionOrderNo");
  80. AddLike(input.ProductionBatchNo, "t.scph", "ProductionBatchNo");
  81. AddLike(input.MaterialCode, "t.wlbm", "MaterialCode");
  82. AddLike(input.Priority, "t.yxj", "Priority");
  83. AddLike(input.Inspector, "t.jyfzr", "Inspector");
  84. if (!string.IsNullOrWhiteSpace(input.InspectProgress))
  85. {
  86. where.Add("t.FINSPECTSTATUS = @InspectProgress");
  87. pars.Add(new SugarParameter("@InspectProgress", input.InspectProgress.Trim()));
  88. }
  89. if (!string.IsNullOrWhiteSpace(input.ApplyTimeStart))
  90. {
  91. where.Add("t.FAPPLYTIME >= @ApplyTimeStart");
  92. pars.Add(new SugarParameter("@ApplyTimeStart", $"{input.ApplyTimeStart.Trim()} 00:00:00"));
  93. }
  94. if (!string.IsNullOrWhiteSpace(input.ApplyTimeEnd))
  95. {
  96. where.Add("t.FAPPLYTIME <= @ApplyTimeEnd");
  97. pars.Add(new SugarParameter("@ApplyTimeEnd", $"{input.ApplyTimeEnd.Trim()} 23:59:59"));
  98. }
  99. var whereSql = string.Join(" AND ", where);
  100. var orderSql = ResolveOrder(input.OrderBy, input.OrderDir, TaskOrderWhitelist, "t.FAPPLYTIME DESC, t.id DESC", "t.id");
  101. var total = await _db.Ado.GetIntAsync($"SELECT COUNT(1) FROM qms_fqcbj t WHERE {whereSql}", pars);
  102. var list = await _db.Ado.SqlQueryAsync<FqcTaskListRow>(
  103. $"""
  104. SELECT
  105. t.id AS Id,
  106. t.FBILLNO AS BillNo,
  107. t.sczld AS ProductionOrderNo,
  108. t.FORGID AS ApplyOrgId,
  109. t.FAPPLYTIME AS ApplyTime,
  110. t.wlbm AS MaterialCode,
  111. t.cpmc AS ProductName,
  112. t.cpxh AS ProductModel,
  113. t.scph AS ProductionBatchNo,
  114. t.sczldsl AS OrderQty,
  115. t.sl AS Qty,
  116. t.FAPPLYUSER AS Applicant,
  117. t.FCOMMENT AS Remark,
  118. t.yxj AS Priority,
  119. t.jykssj AS InspectStartTime,
  120. t.jywcsj AS InspectFinishTime,
  121. t.jyfzr AS Inspector,
  122. t.FINSPECTSTATUS AS InspectProgress
  123. FROM qms_fqcbj t
  124. WHERE {whereSql}
  125. ORDER BY {orderSql}
  126. LIMIT {pageSize} OFFSET {offset}
  127. """,
  128. pars);
  129. return new { total, page, pageSize, list };
  130. }
  131. /// <summary>
  132. /// FQC 检验单(结果)列表(只读分页查询,源 qms_qcpp_inspbill + WorkOrdMaster 取 SAP 工单号)。
  133. /// </summary>
  134. [DisplayName("FQC检验单结果列表")]
  135. [HttpGet("result-list")]
  136. public async Task<object> GetResultList([FromQuery] FqcResultListInput input)
  137. {
  138. var page = input.Page <= 0 ? 1 : input.Page;
  139. var pageSize = input.PageSize <= 0 ? 10 : (input.PageSize > 200 ? 200 : input.PageSize);
  140. var offset = (page - 1) * pageSize;
  141. // qms_qcpp_inspbill 无 tenant_id:不做租户过滤(TenantId 接收即忽略)。
  142. var where = new List<string> { "1=1" };
  143. var pars = new List<SugarParameter>();
  144. void AddLike(string? v, string col, string p)
  145. {
  146. if (string.IsNullOrWhiteSpace(v)) return;
  147. where.Add($"{col} LIKE @{p}");
  148. pars.Add(new SugarParameter($"@{p}", $"%{v.Trim()}%"));
  149. }
  150. AddLike(input.BillNo, "a.FBILLNO", "BillNo");
  151. AddLike(input.ProductionBatchNo, "a.scph", "ProductionBatchNo");
  152. AddLike(input.MaterialCode, "a.FMATERIALCFG", "MaterialCode");
  153. AddLike(input.MaterialName, "a.wlmc", "MaterialName");
  154. AddLike(input.Inspector, "a.jyr", "Inspector");
  155. AddLike(input.SourceBillNo, "a.lydjbh", "SourceBillNo");
  156. AddLike(input.ProductionOrderNo, "a.sczld", "ProductionOrderNo");
  157. if (!string.IsNullOrWhiteSpace(input.Judgment))
  158. {
  159. where.Add("a.pd = @Judgment");
  160. pars.Add(new SugarParameter("@Judgment", input.Judgment.Trim()));
  161. }
  162. if (!string.IsNullOrWhiteSpace(input.InspectDateStart))
  163. {
  164. where.Add("a.FINSPEENDDATE >= @InspectDateStart");
  165. pars.Add(new SugarParameter("@InspectDateStart", $"{input.InspectDateStart.Trim()} 00:00:00"));
  166. }
  167. if (!string.IsNullOrWhiteSpace(input.InspectDateEnd))
  168. {
  169. where.Add("a.FINSPEENDDATE <= @InspectDateEnd");
  170. pars.Add(new SugarParameter("@InspectDateEnd", $"{input.InspectDateEnd.Trim()} 23:59:59"));
  171. }
  172. var whereSql = string.Join(" AND ", where);
  173. var orderSql = ResolveOrder(input.OrderBy, input.OrderDir, ResultOrderWhitelist, "a.FINSPEENDDATE DESC, a.id DESC", "a.id");
  174. var total = await _db.Ado.GetIntAsync($"SELECT COUNT(1) FROM qms_qcpp_inspbill a WHERE {whereSql}", pars);
  175. var list = await _db.Ado.SqlQueryAsync<FqcResultListRow>(
  176. $"""
  177. SELECT
  178. a.id AS Id,
  179. a.FBILLNO AS BillNo,
  180. a.FINSPEENDDATE AS InspectTime,
  181. a.scph AS ProductionBatchNo,
  182. a.FMATERIALCFG AS MaterialCode,
  183. a.wlmc AS MaterialName,
  184. a.ggxh AS Spec,
  185. a.jyr AS Inspector,
  186. a.jysj AS InspectQty,
  187. a.lydjbh AS SourceBillNo,
  188. a.sczld AS ProductionOrderNo,
  189. a.sczldsl AS OrderQty,
  190. (SELECT MIN(wo.WorkOrd) FROM WorkOrdMaster wo WHERE wo.Batch = a.sczld) AS SapWorkOrderNo,
  191. a.pd AS Judgment,
  192. a.hgsl AS QualifiedQty,
  193. a.bhgsl AS UnqualifiedQty
  194. FROM qms_qcpp_inspbill a
  195. WHERE {whereSql}
  196. ORDER BY {orderSql}
  197. LIMIT {pageSize} OFFSET {offset}
  198. """,
  199. pars);
  200. return new { total, page, pageSize, list };
  201. }
  202. /// <summary>
  203. /// FQC 检验单只读详情(源 qms_qcpp_inspbill 头 + qms_qcpp_inspbillst 明细,glid=id)。
  204. ///
  205. /// 契约对齐 S6 IPQC:id&lt;=0 或未命中返回 null(HTTP 200/204);扁平头 + Lines[]。
  206. /// 明细首查前 EnsureFqcDetailTableAsync 幂等建归口空表;样本 j1..j50 收敛为 Samples[](末尾空值裁剪)。
  207. /// 仅 SELECT:无任何写入。两表无 tenant_id,TenantId 接收即忽略。
  208. /// </summary>
  209. [DisplayName("FQC检验单详情")]
  210. [HttpGet("detail")]
  211. public async Task<FqcInspBillDetailDto?> GetDetail([FromQuery] long id, [FromQuery] long? tenantId)
  212. {
  213. if (id <= 0) return null;
  214. await EnsureFqcDetailTableAsync();
  215. var head = (await _db.Ado.SqlQueryAsync<FqcInspBillDetailDto>(
  216. """
  217. SELECT
  218. a.id AS Id,
  219. a.FBILLNO AS BillNo,
  220. a.FINSPEENDDATE AS InspectTime,
  221. a.lydjbh AS SourceBillNo,
  222. a.jyr AS Inspector,
  223. a.pd AS Judgment,
  224. a.FMATERIALCFG AS MaterialCode,
  225. a.wlmc AS MaterialName,
  226. a.ggxh AS Spec,
  227. a.scph AS ProductionBatchNo,
  228. a.sczld AS ProductionOrderNo,
  229. a.sczldsl AS OrderQty,
  230. (SELECT MIN(wo.WorkOrd) FROM WorkOrdMaster wo WHERE wo.Batch = a.sczld) AS SapWorkOrderNo,
  231. a.jysj AS InspectQty,
  232. a.hgsl AS QualifiedQty,
  233. a.bhgsl AS UnqualifiedQty,
  234. a.jfbh AS FireNo,
  235. a.jgbh AS InspectSpecNo,
  236. a.jgbb AS InspectSpecVersion
  237. FROM qms_qcpp_inspbill a
  238. WHERE a.id = @id
  239. LIMIT 1
  240. """,
  241. new List<SugarParameter> { new("@id", id) })).FirstOrDefault();
  242. if (head == null || head.Id <= 0) return null;
  243. var lineRows = await _db.Ado.SqlQueryAsync<FqcInspBillDetailLineRow>(
  244. """
  245. SELECT
  246. st.id AS Id,
  247. st.xh AS SeqNo,
  248. st.jyxm AS InspectionItem,
  249. st.jsbz AS AcceptStandard,
  250. st.jsyq AS TechRequirement,
  251. st.cyfa AS SamplingPlan,
  252. st.ybl AS SampleQty,
  253. st.sx AS UpperLimit,
  254. st.xx AS LowerLimit,
  255. st.SizeSpecifications AS SizeSpecification,
  256. st.pd AS Judgment,
  257. st.NonNumericalTypeOK AS NonNumericOk,
  258. st.NonNumericalTypeNG AS NonNumericNg,
  259. st.bz AS Remark,
  260. st.j1,st.j2,st.j3,st.j4,st.j5,st.j6,st.j7,st.j8,st.j9,st.j10,
  261. st.j11,st.j12,st.j13,st.j14,st.j15,st.j16,st.j17,st.j18,st.j19,st.j20,
  262. st.j21,st.j22,st.j23,st.j24,st.j25,st.j26,st.j27,st.j28,st.j29,st.j30,
  263. st.j31,st.j32,st.j33,st.j34,st.j35,st.j36,st.j37,st.j38,st.j39,st.j40,
  264. st.j41,st.j42,st.j43,st.j44,st.j45,st.j46,st.j47,st.j48,st.j49,st.j50
  265. FROM qms_qcpp_inspbillst st
  266. WHERE st.glid = @id
  267. ORDER BY st.xh, st.id
  268. """,
  269. new List<SugarParameter> { new("@id", id) });
  270. head.Lines = lineRows.Select(r => r.ToLine()).ToList();
  271. return head;
  272. }
  273. /// <summary>
  274. /// 排序解析:白名单命中则 "col dir, tie",否则回落默认;方向仅 asc/desc,非法回落 desc。
  275. /// </summary>
  276. private static string ResolveOrder(string? orderBy, string? orderDir, Dictionary<string, string> whitelist, string fallback, string tie)
  277. {
  278. if (!string.IsNullOrWhiteSpace(orderBy) && whitelist.TryGetValue(orderBy.Trim(), out var col))
  279. {
  280. var dir = string.Equals(orderDir?.Trim(), "asc", StringComparison.OrdinalIgnoreCase) ? "ASC" : "DESC";
  281. return $"{col} {dir}, {tie} DESC";
  282. }
  283. return fallback;
  284. }
  285. /// <summary>
  286. /// 归口空表建表(方案 A,DDL 例外、每进程一次、零 DML):
  287. /// aidopdev 无 qms_fqcbj 时 CREATE TABLE IF NOT EXISTS 建同构 dopdemo 的 37 列空表,待上游抽数填充。
  288. /// 仅建表,不写任何数据行。
  289. /// </summary>
  290. private async Task EnsureFqcTaskTableAsync()
  291. {
  292. if (Interlocked.Exchange(ref _taskTableEnsured, 1) == 1) return;
  293. try
  294. {
  295. await _db.Ado.ExecuteCommandAsync(
  296. """
  297. CREATE TABLE IF NOT EXISTS qms_fqcbj (
  298. id BIGINT NOT NULL PRIMARY KEY COMMENT '主表id',
  299. FBILLNO VARCHAR(80) NULL COMMENT '单据编号',
  300. FBILLSTATUS VARCHAR(50) NULL COMMENT '单据状态',
  301. FCREATORID BIGINT NULL,
  302. FMODIFIERID BIGINT NULL,
  303. FAUDITORID BIGINT NULL,
  304. FAUDITDATE DATETIME NULL,
  305. FMODIFYTIME DATETIME NULL,
  306. FCREATETIME DATETIME NULL,
  307. FORGID BIGINT NULL COMMENT '申请组织',
  308. FQUALITYORG BIGINT NULL,
  309. FAPPLYUSER VARCHAR(50) NULL COMMENT '申请人',
  310. FAPPLYTIME DATETIME NULL COMMENT '申请时间',
  311. FBILLTYPE VARCHAR(50) NULL COMMENT '单据类型',
  312. FBIZTYPE BIGINT NULL COMMENT '业务类型',
  313. FINSPECORGID BIGINT NULL,
  314. FCOMMENT TEXT NULL COMMENT '备注',
  315. FAUTHORIZEOBJID BIGINT NULL,
  316. FINTERFACEID VARCHAR(50) NULL,
  317. cpmc VARCHAR(255) NULL COMMENT '产品名称',
  318. cpxh VARCHAR(255) NULL COMMENT '产品型号',
  319. scph VARCHAR(255) NULL COMMENT '生产批号',
  320. sl DECIMAL(10,0) NULL COMMENT '数量',
  321. jfbh TEXT NULL COMMENT '击发编号',
  322. wlbm VARCHAR(255) NULL COMMENT '物料编码',
  323. jyfzr VARCHAR(255) NULL COMMENT '检验负责人',
  324. yxj VARCHAR(255) NULL COMMENT '检验优先级',
  325. jykssj DATETIME NULL COMMENT '检验开始时间',
  326. jywcsj DATETIME NULL COMMENT '检验完成时间',
  327. mjpc VARCHAR(255) NULL,
  328. tsyq VARCHAR(255) NULL,
  329. FINSPECTSTATUS VARCHAR(255) NULL COMMENT '检验进度',
  330. sczld VARCHAR(255) NULL COMMENT '生产指令单',
  331. sczldsl DECIMAL(10,0) NULL COMMENT '指令单数量',
  332. lydjbh VARCHAR(100) NULL COMMENT '来源单据编号',
  333. ISscrap INT NULL,
  334. CirculationCard TEXT NULL
  335. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='FQC检验任务(报检) 归口自旧系统dopdemo,空表待上游抽数'
  336. """);
  337. }
  338. catch
  339. {
  340. // 建表失败(如权限/并发)不吞成静默通过:复位守卫,让后续调用可再尝试,并向上抛出真实错误。
  341. Interlocked.Exchange(ref _taskTableEnsured, 0);
  342. throw;
  343. }
  344. }
  345. /// <summary>
  346. /// 检验单明细子表归口空表建表(方案 A,DDL 例外、每进程一次、零 DML):
  347. /// aidopdev 无 qms_qcpp_inspbillst 时 CREATE TABLE IF NOT EXISTS 建同构 dopdemo 的 82 列空表(glid→主表 id),
  348. /// 待上游抽数填充。样本列 j1..j50 一并建。仅建表,不写任何数据行。
  349. /// 字符集忠实复刻 dopdemo:13 个列用 utf8mb3(3 字节),其余表默认 utf8mb4;否则 ~68 个 VARCHAR(255) 全 utf8mb4
  350. /// 会超 MySQL 单行 65535 字节上限(Row size too large)。join 键 glid/id 为 bigint,字符集不影响。
  351. /// </summary>
  352. private async Task EnsureFqcDetailTableAsync()
  353. {
  354. if (Interlocked.Exchange(ref _detailTableEnsured, 1) == 1) return;
  355. try
  356. {
  357. await _db.Ado.ExecuteCommandAsync(
  358. """
  359. CREATE TABLE IF NOT EXISTS qms_qcpp_inspbillst (
  360. id BIGINT NOT NULL PRIMARY KEY COMMENT '子表id',
  361. glid BIGINT NULL COMMENT '关联id(=qms_qcpp_inspbill.id)',
  362. jyxm VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '检验项目',
  363. sx VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '上限',
  364. xx VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '下限',
  365. bz VARCHAR(255) NULL COMMENT '备注',
  366. czf VARCHAR(255) NULL,
  367. j1 VARCHAR(255) NULL, j2 VARCHAR(255) NULL, j3 VARCHAR(255) NULL, j4 VARCHAR(255) NULL, j5 VARCHAR(255) NULL,
  368. j6 VARCHAR(255) NULL, j7 VARCHAR(255) NULL, j8 VARCHAR(255) NULL, j9 VARCHAR(255) NULL, j10 VARCHAR(255) NULL,
  369. j11 VARCHAR(255) NULL, j12 VARCHAR(255) NULL, j13 VARCHAR(255) NULL, j14 VARCHAR(255) NULL, j15 VARCHAR(255) NULL,
  370. j16 VARCHAR(255) NULL, j17 VARCHAR(255) NULL, j18 VARCHAR(255) NULL, j19 VARCHAR(255) NULL, j20 VARCHAR(255) NULL,
  371. j21 VARCHAR(255) NULL, j22 VARCHAR(255) NULL, j23 VARCHAR(255) NULL, j24 VARCHAR(255) NULL, j25 VARCHAR(255) NULL,
  372. j26 VARCHAR(255) NULL, j27 VARCHAR(255) NULL, j28 VARCHAR(255) NULL, j29 VARCHAR(255) NULL, j30 VARCHAR(255) NULL,
  373. j31 VARCHAR(255) NULL, j32 VARCHAR(255) NULL, j33 VARCHAR(255) NULL, j34 VARCHAR(255) NULL, j35 VARCHAR(255) NULL,
  374. j36 VARCHAR(255) NULL, j37 VARCHAR(255) NULL, j38 VARCHAR(255) NULL, j39 VARCHAR(255) NULL, j40 VARCHAR(255) NULL,
  375. j41 VARCHAR(255) NULL, j42 VARCHAR(255) NULL, j43 VARCHAR(255) NULL, j44 VARCHAR(255) NULL, j45 VARCHAR(255) NULL,
  376. j46 VARCHAR(255) NULL, j47 VARCHAR(255) NULL, j48 VARCHAR(255) NULL, j49 VARCHAR(255) NULL, j50 VARCHAR(255) NULL,
  377. pd VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '判定',
  378. ybl VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '样本量',
  379. txfl BIGINT NULL COMMENT '指标分类',
  380. bztk TEXT NULL,
  381. jsyq TEXT NULL COMMENT '技术要求',
  382. jyyqsbgj TEXT NULL COMMENT '检验仪器设备工具',
  383. jyff TEXT NULL,
  384. jytk TEXT NULL,
  385. jsbz TEXT NULL COMMENT '接收标准',
  386. cyfa TEXT NULL COMMENT '抽样方案',
  387. jl TEXT NULL,
  388. jlqjbh VARCHAR(255) NULL COMMENT '计量器具编号',
  389. jlbh VARCHAR(255) NULL COMMENT '计量器具编号',
  390. jf1 VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '击发1',
  391. jf2 VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '击发2',
  392. jf3 VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '击发3',
  393. jf4 VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '击发4',
  394. jf5 VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '击发5',
  395. NonNumericalTypeOK BIGINT NULL COMMENT '非数值OK',
  396. NonNumericalTypeNG BIGINT NULL COMMENT '非数值NG',
  397. ThresholdSwitch VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '自动判定按钮',
  398. ThresholdSwitchInt BIGINT NULL COMMENT '自动判定按钮',
  399. SizeSpecifications VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL COMMENT '规范标准',
  400. ybl1 VARCHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL,
  401. xh INT NULL COMMENT '序号',
  402. KEY idx_qms_qcpp_inspbillst_glid (glid)
  403. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='FQC检验单明细(品检项目) 归口自旧系统dopdemo,空表待上游抽数'
  404. """);
  405. }
  406. catch
  407. {
  408. Interlocked.Exchange(ref _detailTableEnsured, 0);
  409. throw;
  410. }
  411. }
  412. }