10 小时以前 35722562e9e13f0504acc15b740d042ecb810199
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import type { QualityComponentDefinition } from '../core/types';
 
import { cssStyle, escapeHtml } from '../core/html';
import { QUALITY_ICONS } from '../core/icons';
import { QUALITY_CATEGORY } from '../core/types';
 
/**
 * 单个检验项的明细块。
 * <p>
 * 取值全部来自循环变量 item,放在检验项表格的重复行里、或独立的重复容器里使用;
 * 单独拖到画布上时渲染期没有 item 上下文,会渲染成空值,这是预期行为。
 */
const LOOP_VAR = 'item';
 
interface FieldSpec {
  label: string;
  /** 取值表达式,'' 表示该字段只有一个值、不带标签 */
  expr: string;
  toggle: string;
}
 
const FIELDS: FieldSpec[] = [
  { label: '', expr: `{{${LOOP_VAR}.itemName}}`, toggle: '' },
  { label: '标准值:', expr: `{{${LOOP_VAR}.standardValue}}`, toggle: 'showStandard' },
  { label: '实测值:', expr: `{{${LOOP_VAR}.actualValue}}`, toggle: 'showActual' },
  { label: '单位:', expr: `{{${LOOP_VAR}.unit}}`, toggle: 'showUnit' },
  { label: '判定:', expr: `{{${LOOP_VAR}.resultText}}`, toggle: 'showResult' },
];
 
export const inspectionItemDefinition: QualityComponentDefinition = {
  type: 'InspectionItem',
  name: 'inspectionItem',
  label: '检验项明细',
  category: QUALITY_CATEGORY.INSPECTION,
  icon: QUALITY_ICONS.inspection,
  aiHint:
    '单条检验项的竖排明细卡片,用于检验项很少、不适合排成表格的场合。多行数据用 QualityTable。',
  defaults: {
    showStandard: true,
    showActual: true,
    showUnit: true,
    showResult: true,
    showBorder: true,
  },
  propertySchema: [
    { key: 'showStandard', label: '显示标准值', type: 'boolean', defaultValue: true },
    { key: 'showActual', label: '显示实测值', type: 'boolean', defaultValue: true },
    { key: 'showUnit', label: '显示单位', type: 'boolean', defaultValue: true },
    { key: 'showResult', label: '显示判定', type: 'boolean', defaultValue: true },
    { key: 'showBorder', label: '显示边框', type: 'boolean', defaultValue: true },
  ],
  dataSchema: [
    { key: `${LOOP_VAR}.itemName`, label: '检验项目名称', type: 'string', bindable: true },
    { key: `${LOOP_VAR}.standardValue`, label: '标准值', type: 'string', bindable: true },
    { key: `${LOOP_VAR}.actualValue`, label: '实测值', type: 'string', bindable: true },
    { key: `${LOOP_VAR}.unit`, label: '单位', type: 'string', bindable: true },
    { key: `${LOOP_VAR}.resultText`, label: '判定结果', type: 'string', bindable: true },
  ],
  buildContent: (properties) => {
    const visible = FIELDS.filter(
      (field) => field.toggle === '' || properties[field.toggle] !== false,
    );
    const [first, ...rest] = visible;
    const name = first
      ? `<div style="${cssStyle({ 'font-weight': 600, 'font-size': '13px' })}">${first.expr}</div>`
      : '';
    const details = rest
      .map(
        (field) =>
          `<div style="${cssStyle({ 'font-size': '12px', 'line-height': '1.8' })}">${escapeHtml(field.label)}<span>${field.expr}</span></div>`,
      )
      .join('');
    return {
      tagName: 'div',
      components: name + details,
      style: {
        margin: '0 0 6px',
        padding: '6px 8px',
        border: properties.showBorder === false ? 'none' : '1px solid #d9d9d9',
      },
    };
  },
};