gaoluyang
3 小时以前 e449a5408265e4bd1f6c66f5be28a42efac444ee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
 * 检验项判定(需求九.3)
 *
 * 判定口径逐字复刻管理端 qualityManagement/finalInspection/components/formDia.vue
 * 里 watch(tableData) 的那段逻辑,不要自行发明:
 *   数字型(parameterType === 1):minValue <= 检验值 <= maxValue
 *   文字型(parameterType 其余):检验值全等 standardValue
 *   全部项通过 → 合格;全部项未通过 → 不合格;其余 → 部分合格
 *
 * 注意判定用的是最大值/最小值,"内控值(controlValue)"只作展示、不参与判定。
 * 管理端在检验项为空时跳过判定,这里对应返回空串,由调用方决定是否保留原值。
 */
 
export const TEXT_TYPE = 0;
export const NUMERIC_TYPE = 1;
 
/** 单行是否判定通过 */
export function isItemPass(item) {
  const val = item?.testValue;
  if (val === null || val === undefined || val === "") return false;
  if (item.parameterType === NUMERIC_TYPE) {
    const numVal = Number(val);
    const min = Number(item.minValue);
    const max = Number(item.maxValue);
    return !isNaN(numVal) && numVal >= min && numVal <= max;
  }
  return String(val) === String(item.standardValue);
}
 
/** 检验项列表 → 检测结果(合格 / 不合格 / 部分合格),空列表返回空串 */
export function judgeInspectionResult(rows) {
  const list = Array.isArray(rows) ? rows : [];
  if (list.length === 0) return "";
 
  let passCount = 0;
  let failCount = 0;
  list.forEach(item => {
    if (isItemPass(item)) passCount++;
    else failCount++;
  });
 
  if (failCount === 0 && passCount > 0) return "合格";
  if (passCount === 0 && failCount > 0) return "不合格";
  return "部分合格";
}
 
/** 临时追加的检测项行(需求九.2):不受指标标准约束,各字段都可编辑 */
export function createTempItem() {
  return {
    id: undefined,
    isTemp: true,
    parameterItem: "",
    parameterType: NUMERIC_TYPE,
    unit: "",
    standardValue: "",
    controlValue: "",
    maxValue: null,
    minValue: null,
    testValue: "",
  };
}