@agile-team/wl-skills-kit 2.11.1 → 2.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +1 -1
  3. package/bin/wl-skills.js +27 -3
  4. package/files/.wl-skills/docs/jh-pagination.md +505 -505
  5. package/files/.wl-skills/docs/request.md +940 -940
  6. package/files/.wl-skills/guides/architecture.md +1 -1
  7. package/files/.wl-skills/skills/core/convention-audit/SKILL.md +3 -3
  8. package/files/.wl-skills/skills/core/spec-doc-parse/SKILL.md +332 -332
  9. package/files/.wl-skills/skills/core/spec-doc-parse/USAGE.md +97 -97
  10. package/files/.wl-skills/skills/sync/permission-sync/USAGE.md +107 -107
  11. package/files/.wl-skills/src/components/global/C_ParentView/index.vue +3 -3
  12. package/files/.wl-skills/src/components/global/C_RightToolbar/index.vue +157 -157
  13. package/files/.wl-skills/src/components/global/C_SvgIcon/index.vue +31 -31
  14. package/files/.wl-skills/src/components/global/C_SvgIcon/svgicon.js +10 -10
  15. package/files/.wl-skills/src/components/global/C_TagStatus/README.md +264 -264
  16. package/files/.wl-skills/src/components/global/C_TagStatus/config.ts +192 -192
  17. package/files/.wl-skills/src/components/global/C_TagStatus/index.vue +106 -106
  18. package/files/.wl-skills/src/components/global/C_TagStatus/types.ts +64 -64
  19. package/files/.wl-skills/src/components/global/C_Tree/README.md +153 -153
  20. package/files/.wl-skills/src/components/global/C_Tree/index.scss +42 -42
  21. package/files/.wl-skills/src/components/global/C_Tree/index.vue +78 -78
  22. package/files/.wl-skills/src/components/global/C_Tree/types.ts +59 -59
  23. package/files/.wl-skills/src/components/local/c_formModal/README.md +235 -235
  24. package/files/.wl-skills/src/components/local/c_formModal/data.ts +95 -95
  25. package/files/.wl-skills/src/components/local/c_formModal/index.scss +8 -8
  26. package/files/.wl-skills/src/components/local/c_formModal/index.vue +107 -107
  27. package/files/.wl-skills/src/components/local/c_formSections/data.ts +175 -175
  28. package/files/.wl-skills/src/components/local/c_formSections/index.scss +280 -280
  29. package/files/.wl-skills/src/components/local/c_formSections/index.vue +429 -429
  30. package/files/.wl-skills/src/components/local/c_listModal/data.ts +41 -41
  31. package/files/.wl-skills/src/components/local/c_listModal/index.vue +136 -136
  32. package/files/.wl-skills/src/components/local/c_spliterTitle/index.scss +25 -25
  33. package/files/.wl-skills/src/components/local/c_spliterTitle/index.vue +21 -21
  34. package/files/.wl-skills/src/components/remote/AGGrid/README.md +530 -530
  35. package/files/.wl-skills/src/components/remote/BaseForm/README.md +508 -508
  36. package/files/.wl-skills/src/components/remote/BaseQuery/README.md +865 -865
  37. package/files/.wl-skills/src/components/remote/BaseTable/README.md +941 -941
  38. package/files/.wl-skills/src/components/remote/BaseToolbar/README.md +496 -496
  39. package/files/.wl-skills/src/types/page.ts +24 -24
  40. package/files/.wl-skills/standards/04-coding-basics.md +39 -1
  41. package/files/.wl-skills/standards/09-typescript.md +26 -3
  42. package/files/.wl-skills/standards/index.md +2 -2
  43. package/files/.wl-skills/templates/README.md +44 -44
  44. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add/api.md +54 -54
  45. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add/data.ts +346 -346
  46. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add/index.scss +1 -1
  47. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add/index.vue +28 -28
  48. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add-form/data.ts +115 -115
  49. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add-form/index.scss +44 -44
  50. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add-form/index.vue +43 -43
  51. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-change/data.ts +338 -338
  52. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-change/index.scss +1 -1
  53. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-change/index.vue +28 -28
  54. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-change-form/data.ts +115 -115
  55. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-change-form/index.scss +44 -44
  56. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-change-form/index.vue +43 -43
  57. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-archive/api.md +88 -88
  58. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-archive/data.ts +601 -601
  59. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-archive/index.scss +1 -1
  60. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-archive/index.vue +64 -64
  61. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-detail/api.md +67 -67
  62. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-detail/data.ts +286 -286
  63. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-detail/index.scss +139 -139
  64. package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-detail/index.vue +318 -318
  65. package/files/.wl-skills/templates/produce/aiflow/mmwr-temp-customer-archive/api.md +98 -98
  66. package/files/.wl-skills/templates/produce/aiflow/mmwr-temp-customer-archive/data.ts +543 -543
  67. package/files/.wl-skills/templates/produce/aiflow/mmwr-temp-customer-archive/index.scss +1 -1
  68. package/files/.wl-skills/templates/produce/aiflow/mmwr-temp-customer-archive/index.vue +52 -52
  69. package/files/.wl-skills/templates/sale/demo/add-demo/data.ts +518 -518
  70. package/files/.wl-skills/templates/sale/demo/billet-flame-cut-plan/data.ts +524 -524
  71. package/files/.wl-skills/templates/sale/demo/billet-flame-cut-plan/index.scss +154 -154
  72. package/files/.wl-skills/templates/sale/demo/billet-flame-cut-plan/index.vue +117 -117
  73. package/files/.wl-skills/templates/sale/demo/domestic-trade-order/data.ts +308 -308
  74. package/files/.wl-skills/templates/sale/demo/domestic-trade-order/index.scss +99 -99
  75. package/files/.wl-skills/templates/sale/demo/domestic-trade-order/index.vue +77 -77
  76. package/files/.wl-skills/templates/sale/demo/heat-batch-return/data.ts +367 -367
  77. package/files/.wl-skills/templates/sale/demo/heat-batch-return/index.scss +100 -100
  78. package/files/.wl-skills/templates/sale/demo/heat-batch-return/index.vue +170 -170
  79. package/files/.wl-skills/templates/sale/demo/heat-batch-return/meltDialog.vue +320 -320
  80. package/files/.wl-skills/templates/sale/demo/metallurgical-spec/data.ts +824 -824
  81. package/lib/ast-rules.js +304 -9
  82. package/mcp/config.js +46 -46
  83. package/mcp/registry.js +6 -1
  84. package/mcp/tools/projectTools.js +9 -1
  85. package/package.json +2 -2
@@ -1,320 +1,320 @@
1
- <template>
2
- <el-dialog
3
- v-model="dialogVisible"
4
- title="新增返送炉次"
5
- width="50%"
6
- :close-on-click-modal="false"
7
- align-center
8
- @close="handleClose"
9
- >
10
- <el-form
11
- ref="formRef"
12
- :model="formData"
13
- :rules="rules"
14
- label-width="90px"
15
- label-position="right"
16
- >
17
- <el-row :gutter="20">
18
- <el-col :span="6">
19
- <el-form-item label="PONO号" prop="ponoNumber">
20
- <el-input
21
- v-model="formData.ponoNumber"
22
- placeholder="请输入"
23
- size="small"
24
- style="width: 100%"
25
- />
26
- </el-form-item>
27
- </el-col>
28
- </el-row>
29
- <el-row :gutter="20">
30
- <el-col :span="6">
31
- <el-form-item label="连铸机号" prop="continuousCasterNumber" required>
32
- <el-select
33
- v-model="formData.continuousCasterNumber"
34
- placeholder="请选择"
35
- clearable
36
- size="small"
37
- style="width: 100%"
38
- >
39
- <el-option label="1" value="1" />
40
- <el-option label="2" value="2" />
41
- <el-option label="3" value="3" />
42
- </el-select>
43
- </el-form-item>
44
- </el-col>
45
- <el-col :span="6">
46
- <el-form-item label="内部钢种" prop="internalSteelGrade" required>
47
- <el-input
48
- v-model="formData.internalSteelGrade"
49
- placeholder="请输入"
50
- size="small"
51
- style="width: 100%"
52
- />
53
- </el-form-item>
54
- </el-col>
55
- <el-col :span="6">
56
- <el-form-item label="铸坯类型" prop="castSlabType" required>
57
- <el-select
58
- v-model="formData.castSlabType"
59
- placeholder="请选择"
60
- clearable
61
- size="small"
62
- style="width: 100%"
63
- >
64
- <el-option label="类型1" value="type1" />
65
- <el-option label="类型2" value="type2" />
66
- <el-option label="类型3" value="type3" />
67
- </el-select>
68
- </el-form-item>
69
- </el-col>
70
- <el-col :span="6">
71
- <el-form-item label="坯数" prop="slabCount" required>
72
- <el-input
73
- v-model="formData.slabCount"
74
- placeholder="请输入"
75
- size="small"
76
- style="width: 100%"
77
- />
78
- </el-form-item>
79
- </el-col>
80
- </el-row>
81
-
82
- <el-row :gutter="20">
83
- <el-col :span="6">
84
- <el-form-item label="厚度" prop="thickness" required>
85
- <el-input
86
- v-model="formData.thickness"
87
- placeholder="请输入"
88
- size="small"
89
- style="width: 100%"
90
- >
91
- <template #suffix>
92
- <span class="input-suffix">(mm)</span>
93
- </template>
94
- </el-input>
95
- </el-form-item>
96
- </el-col>
97
- <el-col :span="6">
98
- <el-form-item label="宽度(mm)" prop="width" required>
99
- <el-input
100
- v-model="formData.width"
101
- placeholder="请输入"
102
- size="small"
103
- style="width: 100%"
104
- >
105
- <template #suffix>
106
- <span class="input-suffix">(mm)</span>
107
- </template>
108
- </el-input>
109
- </el-form-item>
110
- </el-col>
111
- <el-col :span="6">
112
- <el-form-item label="长度(mm)" prop="length" required>
113
- <el-input
114
- v-model="formData.length"
115
- placeholder="请输入"
116
- size="small"
117
- style="width: 100%"
118
- >
119
- <template #suffix>
120
- <span class="input-suffix">(mm)</span>
121
- </template>
122
- </el-input>
123
- </el-form-item>
124
- </el-col>
125
- <el-col :span="6">
126
- <el-form-item label="长度上限" prop="lengthUpperLimit" required>
127
- <el-input
128
- v-model="formData.lengthUpperLimit"
129
- placeholder="请输入"
130
- size="small"
131
- style="width: 100%"
132
- >
133
- <template #suffix>
134
- <span class="input-suffix">(mm)</span>
135
- </template>
136
- </el-input>
137
- </el-form-item>
138
- </el-col>
139
- </el-row>
140
-
141
- <el-row :gutter="20">
142
- <el-col :span="6">
143
- <el-form-item label="宽度上限" prop="widthUpperLimit" required>
144
- <el-input
145
- v-model="formData.widthUpperLimit"
146
- placeholder="请输入"
147
- size="small"
148
- style="width: 100%"
149
- >
150
- <template #suffix>
151
- <span class="input-suffix">(mm)</span>
152
- </template>
153
- </el-input>
154
- </el-form-item>
155
- </el-col>
156
- </el-row>
157
- </el-form>
158
-
159
- <template #footer>
160
- <div class="dialog-footer">
161
- <el-button size="small" @click="handleClose">取消</el-button>
162
- <el-button type="primary" size="small" @click="handleConfirm">确认</el-button>
163
- </div>
164
- </template>
165
- </el-dialog>
166
- </template>
167
-
168
- <script setup lang="ts">
169
- import { ref, reactive } from 'vue';
170
- import { ElMessage, type FormInstance, type FormRules } from 'element-plus';
171
-
172
- const dialogVisible = ref(false);
173
- const formRef = ref<FormInstance>();
174
-
175
- // 打开弹窗方法
176
- const open = () => {
177
- dialogVisible.value = true;
178
- };
179
-
180
- // 关闭弹窗方法
181
- const close = () => {
182
- handleClose();
183
- };
184
-
185
- // 暴露方法供外部调用
186
- defineExpose({
187
- open,
188
- close,
189
- });
190
-
191
- // 表单数据
192
- const formData = reactive({
193
- ponoNumber: '',
194
- internalSteelGrade: '',
195
- castSlabType: '',
196
- slabCount: '',
197
- continuousCasterNumber: '1',
198
- width: '',
199
- length: '',
200
- lengthUpperLimit: '',
201
- thickness: '',
202
- widthUpperLimit: '',
203
- });
204
-
205
- // 表单校验规则
206
- const rules = reactive<FormRules>({
207
- internalSteelGrade: [{ required: true, message: '请输入内部钢种', trigger: 'blur' }],
208
- castSlabType: [{ required: true, message: '请选择铸坯类型', trigger: 'change' }],
209
- slabCount: [
210
- { required: true, message: '请输入坯数', trigger: 'blur' },
211
- { pattern: /^\d+$/, message: '坯数必须为数字', trigger: 'blur' },
212
- ],
213
- continuousCasterNumber: [{ required: true, message: '请选择连铸机号', trigger: 'change' }],
214
- width: [
215
- { required: true, message: '请输入宽度', trigger: 'blur' },
216
- { pattern: /^\d+(\.\d+)?$/, message: '宽度必须为数字', trigger: 'blur' },
217
- ],
218
- length: [
219
- { required: true, message: '请输入长度', trigger: 'blur' },
220
- { pattern: /^\d+(\.\d+)?$/, message: '长度必须为数字', trigger: 'blur' },
221
- ],
222
- lengthUpperLimit: [
223
- { required: true, message: '请输入长度上限', trigger: 'blur' },
224
- { pattern: /^\d+(\.\d+)?$/, message: '长度上限必须为数字', trigger: 'blur' },
225
- ],
226
- thickness: [
227
- { required: true, message: '请输入厚度', trigger: 'blur' },
228
- { pattern: /^\d+(\.\d+)?$/, message: '厚度必须为数字', trigger: 'blur' },
229
- ],
230
- widthUpperLimit: [
231
- { required: true, message: '请输入宽度上限', trigger: 'blur' },
232
- { pattern: /^\d+(\.\d+)?$/, message: '宽度上限必须为数字', trigger: 'blur' },
233
- ],
234
- });
235
-
236
- // 关闭弹窗
237
- const handleClose = () => {
238
- dialogVisible.value = false;
239
- formRef.value?.resetFields();
240
- // 重置表单数据
241
- Object.assign(formData, {
242
- ponoNumber: '',
243
- internalSteelGrade: '',
244
- castSlabType: '',
245
- slabCount: '',
246
- continuousCasterNumber: '1',
247
- width: '',
248
- length: '',
249
- lengthUpperLimit: '',
250
- thickness: '',
251
- widthUpperLimit: '',
252
- });
253
- };
254
-
255
- // 确认提交
256
- const handleConfirm = async () => {
257
- if (!formRef.value) return;
258
-
259
- try {
260
- await formRef.value.validate();
261
- ElMessage.success('提交成功');
262
- handleClose();
263
- // 这里可以调用提交接口
264
- console.log('表单数据:', formData);
265
- } catch (error) {
266
- console.error('表单校验失败:', error);
267
- }
268
- };
269
- </script>
270
-
271
- <style scoped lang="scss">
272
- .dialog-footer {
273
- display: flex;
274
- justify-content: flex-end;
275
- gap: 12px;
276
- }
277
-
278
- .input-suffix {
279
- color: #909399;
280
- font-size: 12px;
281
- padding-right: 0px;
282
- }
283
-
284
- // 确保所有输入框和下拉框宽度一致
285
- :deep(.el-form-item) {
286
- margin-bottom: 18px;
287
- }
288
-
289
- :deep(.el-input),
290
- :deep(.el-select) {
291
- width: 100%;
292
- }
293
-
294
- // 覆盖primary按钮颜色
295
- :deep(.el-button--primary:not(.el-button--text):not(.is-link)) {
296
- background-color: #002a8f;
297
- border-color: #002a8f;
298
- color: #fff;
299
-
300
- &:hover,
301
- &:focus {
302
- background-color: #0033b3;
303
- border-color: #0033b3;
304
- color: #fff;
305
- }
306
-
307
- &:active {
308
- background-color: #002080;
309
- border-color: #002080;
310
- color: #fff;
311
- }
312
- }
313
-
314
- // 必填项标签样式
315
- :deep(.el-form-item.is-required .el-form-item__label::before) {
316
- content: '*';
317
- color: #f56c6c;
318
- margin-right: 4px;
319
- }
320
- </style>
1
+ <template>
2
+ <el-dialog
3
+ v-model="dialogVisible"
4
+ title="新增返送炉次"
5
+ width="50%"
6
+ :close-on-click-modal="false"
7
+ align-center
8
+ @close="handleClose"
9
+ >
10
+ <el-form
11
+ ref="formRef"
12
+ :model="formData"
13
+ :rules="rules"
14
+ label-width="90px"
15
+ label-position="right"
16
+ >
17
+ <el-row :gutter="20">
18
+ <el-col :span="6">
19
+ <el-form-item label="PONO号" prop="ponoNumber">
20
+ <el-input
21
+ v-model="formData.ponoNumber"
22
+ placeholder="请输入"
23
+ size="small"
24
+ style="width: 100%"
25
+ />
26
+ </el-form-item>
27
+ </el-col>
28
+ </el-row>
29
+ <el-row :gutter="20">
30
+ <el-col :span="6">
31
+ <el-form-item label="连铸机号" prop="continuousCasterNumber" required>
32
+ <el-select
33
+ v-model="formData.continuousCasterNumber"
34
+ placeholder="请选择"
35
+ clearable
36
+ size="small"
37
+ style="width: 100%"
38
+ >
39
+ <el-option label="1" value="1" />
40
+ <el-option label="2" value="2" />
41
+ <el-option label="3" value="3" />
42
+ </el-select>
43
+ </el-form-item>
44
+ </el-col>
45
+ <el-col :span="6">
46
+ <el-form-item label="内部钢种" prop="internalSteelGrade" required>
47
+ <el-input
48
+ v-model="formData.internalSteelGrade"
49
+ placeholder="请输入"
50
+ size="small"
51
+ style="width: 100%"
52
+ />
53
+ </el-form-item>
54
+ </el-col>
55
+ <el-col :span="6">
56
+ <el-form-item label="铸坯类型" prop="castSlabType" required>
57
+ <el-select
58
+ v-model="formData.castSlabType"
59
+ placeholder="请选择"
60
+ clearable
61
+ size="small"
62
+ style="width: 100%"
63
+ >
64
+ <el-option label="类型1" value="type1" />
65
+ <el-option label="类型2" value="type2" />
66
+ <el-option label="类型3" value="type3" />
67
+ </el-select>
68
+ </el-form-item>
69
+ </el-col>
70
+ <el-col :span="6">
71
+ <el-form-item label="坯数" prop="slabCount" required>
72
+ <el-input
73
+ v-model="formData.slabCount"
74
+ placeholder="请输入"
75
+ size="small"
76
+ style="width: 100%"
77
+ />
78
+ </el-form-item>
79
+ </el-col>
80
+ </el-row>
81
+
82
+ <el-row :gutter="20">
83
+ <el-col :span="6">
84
+ <el-form-item label="厚度" prop="thickness" required>
85
+ <el-input
86
+ v-model="formData.thickness"
87
+ placeholder="请输入"
88
+ size="small"
89
+ style="width: 100%"
90
+ >
91
+ <template #suffix>
92
+ <span class="input-suffix">(mm)</span>
93
+ </template>
94
+ </el-input>
95
+ </el-form-item>
96
+ </el-col>
97
+ <el-col :span="6">
98
+ <el-form-item label="宽度(mm)" prop="width" required>
99
+ <el-input
100
+ v-model="formData.width"
101
+ placeholder="请输入"
102
+ size="small"
103
+ style="width: 100%"
104
+ >
105
+ <template #suffix>
106
+ <span class="input-suffix">(mm)</span>
107
+ </template>
108
+ </el-input>
109
+ </el-form-item>
110
+ </el-col>
111
+ <el-col :span="6">
112
+ <el-form-item label="长度(mm)" prop="length" required>
113
+ <el-input
114
+ v-model="formData.length"
115
+ placeholder="请输入"
116
+ size="small"
117
+ style="width: 100%"
118
+ >
119
+ <template #suffix>
120
+ <span class="input-suffix">(mm)</span>
121
+ </template>
122
+ </el-input>
123
+ </el-form-item>
124
+ </el-col>
125
+ <el-col :span="6">
126
+ <el-form-item label="长度上限" prop="lengthUpperLimit" required>
127
+ <el-input
128
+ v-model="formData.lengthUpperLimit"
129
+ placeholder="请输入"
130
+ size="small"
131
+ style="width: 100%"
132
+ >
133
+ <template #suffix>
134
+ <span class="input-suffix">(mm)</span>
135
+ </template>
136
+ </el-input>
137
+ </el-form-item>
138
+ </el-col>
139
+ </el-row>
140
+
141
+ <el-row :gutter="20">
142
+ <el-col :span="6">
143
+ <el-form-item label="宽度上限" prop="widthUpperLimit" required>
144
+ <el-input
145
+ v-model="formData.widthUpperLimit"
146
+ placeholder="请输入"
147
+ size="small"
148
+ style="width: 100%"
149
+ >
150
+ <template #suffix>
151
+ <span class="input-suffix">(mm)</span>
152
+ </template>
153
+ </el-input>
154
+ </el-form-item>
155
+ </el-col>
156
+ </el-row>
157
+ </el-form>
158
+
159
+ <template #footer>
160
+ <div class="dialog-footer">
161
+ <el-button size="small" @click="handleClose">取消</el-button>
162
+ <el-button type="primary" size="small" @click="handleConfirm">确认</el-button>
163
+ </div>
164
+ </template>
165
+ </el-dialog>
166
+ </template>
167
+
168
+ <script setup lang="ts">
169
+ import { ref, reactive } from 'vue';
170
+ import { ElMessage, type FormInstance, type FormRules } from 'element-plus';
171
+
172
+ const dialogVisible = ref(false);
173
+ const formRef = ref<FormInstance>();
174
+
175
+ // 打开弹窗方法
176
+ const open = () => {
177
+ dialogVisible.value = true;
178
+ };
179
+
180
+ // 关闭弹窗方法
181
+ const close = () => {
182
+ handleClose();
183
+ };
184
+
185
+ // 暴露方法供外部调用
186
+ defineExpose({
187
+ open,
188
+ close,
189
+ });
190
+
191
+ // 表单数据
192
+ const formData = reactive({
193
+ ponoNumber: '',
194
+ internalSteelGrade: '',
195
+ castSlabType: '',
196
+ slabCount: '',
197
+ continuousCasterNumber: '1',
198
+ width: '',
199
+ length: '',
200
+ lengthUpperLimit: '',
201
+ thickness: '',
202
+ widthUpperLimit: '',
203
+ });
204
+
205
+ // 表单校验规则
206
+ const rules = reactive<FormRules>({
207
+ internalSteelGrade: [{ required: true, message: '请输入内部钢种', trigger: 'blur' }],
208
+ castSlabType: [{ required: true, message: '请选择铸坯类型', trigger: 'change' }],
209
+ slabCount: [
210
+ { required: true, message: '请输入坯数', trigger: 'blur' },
211
+ { pattern: /^\d+$/, message: '坯数必须为数字', trigger: 'blur' },
212
+ ],
213
+ continuousCasterNumber: [{ required: true, message: '请选择连铸机号', trigger: 'change' }],
214
+ width: [
215
+ { required: true, message: '请输入宽度', trigger: 'blur' },
216
+ { pattern: /^\d+(\.\d+)?$/, message: '宽度必须为数字', trigger: 'blur' },
217
+ ],
218
+ length: [
219
+ { required: true, message: '请输入长度', trigger: 'blur' },
220
+ { pattern: /^\d+(\.\d+)?$/, message: '长度必须为数字', trigger: 'blur' },
221
+ ],
222
+ lengthUpperLimit: [
223
+ { required: true, message: '请输入长度上限', trigger: 'blur' },
224
+ { pattern: /^\d+(\.\d+)?$/, message: '长度上限必须为数字', trigger: 'blur' },
225
+ ],
226
+ thickness: [
227
+ { required: true, message: '请输入厚度', trigger: 'blur' },
228
+ { pattern: /^\d+(\.\d+)?$/, message: '厚度必须为数字', trigger: 'blur' },
229
+ ],
230
+ widthUpperLimit: [
231
+ { required: true, message: '请输入宽度上限', trigger: 'blur' },
232
+ { pattern: /^\d+(\.\d+)?$/, message: '宽度上限必须为数字', trigger: 'blur' },
233
+ ],
234
+ });
235
+
236
+ // 关闭弹窗
237
+ const handleClose = () => {
238
+ dialogVisible.value = false;
239
+ formRef.value?.resetFields();
240
+ // 重置表单数据
241
+ Object.assign(formData, {
242
+ ponoNumber: '',
243
+ internalSteelGrade: '',
244
+ castSlabType: '',
245
+ slabCount: '',
246
+ continuousCasterNumber: '1',
247
+ width: '',
248
+ length: '',
249
+ lengthUpperLimit: '',
250
+ thickness: '',
251
+ widthUpperLimit: '',
252
+ });
253
+ };
254
+
255
+ // 确认提交
256
+ const handleConfirm = async () => {
257
+ if (!formRef.value) return;
258
+
259
+ try {
260
+ await formRef.value.validate();
261
+ ElMessage.success('提交成功');
262
+ handleClose();
263
+ // 这里可以调用提交接口
264
+ console.log('表单数据:', formData);
265
+ } catch (error) {
266
+ console.error('表单校验失败:', error);
267
+ }
268
+ };
269
+ </script>
270
+
271
+ <style scoped lang="scss">
272
+ .dialog-footer {
273
+ display: flex;
274
+ justify-content: flex-end;
275
+ gap: 12px;
276
+ }
277
+
278
+ .input-suffix {
279
+ color: #909399;
280
+ font-size: 12px;
281
+ padding-right: 0px;
282
+ }
283
+
284
+ // 确保所有输入框和下拉框宽度一致
285
+ :deep(.el-form-item) {
286
+ margin-bottom: 18px;
287
+ }
288
+
289
+ :deep(.el-input),
290
+ :deep(.el-select) {
291
+ width: 100%;
292
+ }
293
+
294
+ // 覆盖primary按钮颜色
295
+ :deep(.el-button--primary:not(.el-button--text):not(.is-link)) {
296
+ background-color: #002a8f;
297
+ border-color: #002a8f;
298
+ color: #fff;
299
+
300
+ &:hover,
301
+ &:focus {
302
+ background-color: #0033b3;
303
+ border-color: #0033b3;
304
+ color: #fff;
305
+ }
306
+
307
+ &:active {
308
+ background-color: #002080;
309
+ border-color: #002080;
310
+ color: #fff;
311
+ }
312
+ }
313
+
314
+ // 必填项标签样式
315
+ :deep(.el-form-item.is-required .el-form-item__label::before) {
316
+ content: '*';
317
+ color: #f56c6c;
318
+ margin-right: 4px;
319
+ }
320
+ </style>