刘光辉
7 小时以前 cf11e63b659afcc9792ab3e395f1b45d844431a8
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
export type FormulaDataType = 'BOOLEAN' | 'DECIMAL' | 'DECIMAL_LIST' | 'TEXT';
export type FormulaVersionStatus = 'PRE_RELEASE' | 'PUBLISHED';
 
export interface FormulaVersionCandidate {
  formulaEnabled: boolean;
  id: string;
  isCurrent: boolean;
  status: FormulaVersionStatus;
}
 
export interface FormulaBindingCandidate {
  batchMode: string;
  controlRole: string;
  fieldDataType: FormulaDataType;
  id: string;
  readSource: string;
  status: string;
  writeTarget: string;
}
 
export interface FormulaBindingRequest {
  formulaVersionId: string;
  operationCode: string;
  parameterBindings: Record<string, string>;
  resultBindingId: string;
}
 
export interface FormulaParameterSlot {
  code: string;
  name: string;
  required: boolean;
  type: FormulaDataType;
}
 
export interface TemplateFormulaVersion extends FormulaVersionCandidate {
  formulaCode: string;
  formulaName: string;
  resultType: FormulaDataType;
  slots: FormulaParameterSlot[];
}
 
export interface FormulaResultLockSnapshot {
  locks: Array<{ lock: string; tag: string }>;
  primaryTag: string;
}
 
export interface FormulaBindingLockSnapshot {
  bindingId: string;
  controlRole: string;
  controlTag: string;
  lock: string;
}
 
export interface TemplateFormulaBinding {
  formulaVersionId: string;
  id: string;
  jieguoSuoKuaizhao?: FormulaBindingLockSnapshot[];
  operationCode: string;
  parameterBindings: Record<string, string>;
  resultBindingId: string;
  status: 'ACTIVE' | 'CANCELLED' | 'PENDING' | 'REMOVED';
  version: number;
}
 
export interface FormulaMappingCheck {
  downstreamFormulaBindingIds: string[];
  expectedVersions: Record<string, number>;
  operationCode: string;
}
 
export interface FormulaMappingContext {
  bindings: TemplateFormulaBinding[];
  copiedPendingBindingIds?: string[];
  inheritedFormulaLockBindingIds?: string[];
  upgradeOperationCode?: string;
  versions: TemplateFormulaVersion[];
}
 
function compatible(formulaType: FormulaDataType, fieldType: FormulaDataType): boolean {
  if (formulaType === 'DECIMAL_LIST') return false;
  if (formulaType === 'DECIMAL') return fieldType === 'DECIMAL';
  if (formulaType === 'TEXT') return fieldType === 'TEXT';
  return fieldType === 'BOOLEAN';
}
 
function activePrimary(binding: FormulaBindingCandidate): boolean {
  return binding.status === 'ACTIVE' && binding.controlRole === 'PRIMARY';
}
 
export function formulaVersionOptions(versions: FormulaVersionCandidate[]): Array<{ id: string; risk: boolean; selectable: boolean }> {
  return versions
    .filter((version) => version.formulaEnabled && (version.status === 'PRE_RELEASE' || version.status === 'PUBLISHED'))
    .map((version) => ({
      id: version.id,
      risk: version.status === 'PRE_RELEASE',
      selectable: version.status === 'PRE_RELEASE' || version.isCurrent,
    }));
}
 
export function parameterBindingCandidates(type: FormulaDataType, bindings: FormulaBindingCandidate[]): string[] {
  return bindings.filter((binding) => activePrimary(binding) && compatible(type, binding.fieldDataType)).map((binding) => binding.id);
}
 
export function resultBindingCandidates(type: FormulaDataType, bindings: FormulaBindingCandidate[]): string[] {
  return bindings.filter((binding) => activePrimary(binding)
    && binding.readSource === 'NONE'
    && binding.writeTarget === 'ELN_RECORD'
    && binding.batchMode === 'RECORD_PRIVATE'
    && compatible(type, binding.fieldDataType)).map((binding) => binding.id);
}
 
export function buildFormulaBindingRequest(request: FormulaBindingRequest): FormulaBindingRequest {
  return {
    formulaVersionId: request.formulaVersionId,
    parameterBindings: { ...request.parameterBindings },
    resultBindingId: request.resultBindingId,
    operationCode: request.operationCode,
  };
}