@agile-team/wl-skills-kit 2.11.1 → 2.11.3
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.
- package/CHANGELOG.md +25 -0
- package/README.md +38 -21
- package/bin/wl-skills.js +27 -3
- package/files/.wl-skills/docs/jh-pagination.md +505 -505
- package/files/.wl-skills/docs/request.md +940 -940
- package/files/.wl-skills/docs/validate-exempt.md +113 -0
- package/files/.wl-skills/guides/architecture.md +1 -1
- package/files/.wl-skills/skills/_compat/headers/cursor-mdc.txt +1 -1
- package/files/.wl-skills/skills/_compat/headers/kiro.txt +1 -1
- package/files/.wl-skills/skills/_compat/headers/trae.txt +1 -1
- package/files/.wl-skills/skills/core/convention-audit/SKILL.md +3 -3
- package/files/.wl-skills/skills/core/spec-doc-parse/SKILL.md +332 -332
- package/files/.wl-skills/skills/core/spec-doc-parse/USAGE.md +97 -97
- package/files/.wl-skills/skills/sync/permission-sync/USAGE.md +107 -107
- package/files/.wl-skills/src/components/global/C_ParentView/index.vue +3 -3
- package/files/.wl-skills/src/components/global/C_RightToolbar/index.vue +157 -157
- package/files/.wl-skills/src/components/global/C_SvgIcon/index.vue +31 -31
- package/files/.wl-skills/src/components/global/C_SvgIcon/svgicon.js +10 -10
- package/files/.wl-skills/src/components/global/C_TagStatus/README.md +264 -264
- package/files/.wl-skills/src/components/global/C_TagStatus/config.ts +192 -192
- package/files/.wl-skills/src/components/global/C_TagStatus/index.vue +106 -106
- package/files/.wl-skills/src/components/global/C_TagStatus/types.ts +64 -64
- package/files/.wl-skills/src/components/global/C_Tree/README.md +153 -153
- package/files/.wl-skills/src/components/global/C_Tree/index.scss +42 -42
- package/files/.wl-skills/src/components/global/C_Tree/index.vue +78 -78
- package/files/.wl-skills/src/components/global/C_Tree/types.ts +59 -59
- package/files/.wl-skills/src/components/local/c_formModal/README.md +235 -235
- package/files/.wl-skills/src/components/local/c_formModal/data.ts +95 -95
- package/files/.wl-skills/src/components/local/c_formModal/index.scss +8 -8
- package/files/.wl-skills/src/components/local/c_formModal/index.vue +107 -107
- package/files/.wl-skills/src/components/local/c_formSections/data.ts +175 -175
- package/files/.wl-skills/src/components/local/c_formSections/index.scss +280 -280
- package/files/.wl-skills/src/components/local/c_formSections/index.vue +429 -429
- package/files/.wl-skills/src/components/local/c_listModal/data.ts +41 -41
- package/files/.wl-skills/src/components/local/c_listModal/index.vue +136 -136
- package/files/.wl-skills/src/components/local/c_spliterTitle/index.scss +25 -25
- package/files/.wl-skills/src/components/local/c_spliterTitle/index.vue +21 -21
- package/files/.wl-skills/src/components/remote/AGGrid/README.md +530 -530
- package/files/.wl-skills/src/components/remote/BaseForm/README.md +508 -508
- package/files/.wl-skills/src/components/remote/BaseQuery/README.md +865 -865
- package/files/.wl-skills/src/components/remote/BaseTable/README.md +941 -941
- package/files/.wl-skills/src/components/remote/BaseToolbar/README.md +496 -496
- package/files/.wl-skills/src/types/page.ts +24 -24
- package/files/.wl-skills/standards/04-coding-basics.md +39 -1
- package/files/.wl-skills/standards/09-typescript.md +26 -3
- package/files/.wl-skills/standards/12-base-table.md +56 -4
- package/files/.wl-skills/standards/13-platform-components.md +1 -0
- package/files/.wl-skills/standards/index.md +2 -2
- package/files/.wl-skills/templates/README.md +44 -44
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add/api.md +54 -54
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add/data.ts +346 -346
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add/index.scss +1 -1
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add/index.vue +28 -28
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add-form/data.ts +115 -115
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add-form/index.scss +44 -44
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-add-form/index.vue +43 -43
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-change/data.ts +338 -338
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-change/index.scss +1 -1
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-change/index.vue +28 -28
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-change-form/data.ts +115 -115
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-change-form/index.scss +44 -44
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-apply-change-form/index.vue +43 -43
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-archive/api.md +88 -88
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-archive/data.ts +601 -601
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-archive/index.scss +1 -1
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-archive/index.vue +64 -64
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-detail/api.md +67 -67
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-detail/data.ts +286 -286
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-detail/index.scss +139 -139
- package/files/.wl-skills/templates/produce/aiflow/mmwr-customer-detail/index.vue +318 -318
- package/files/.wl-skills/templates/produce/aiflow/mmwr-temp-customer-archive/api.md +98 -98
- package/files/.wl-skills/templates/produce/aiflow/mmwr-temp-customer-archive/data.ts +543 -543
- package/files/.wl-skills/templates/produce/aiflow/mmwr-temp-customer-archive/index.scss +1 -1
- package/files/.wl-skills/templates/produce/aiflow/mmwr-temp-customer-archive/index.vue +52 -52
- package/files/.wl-skills/templates/sale/demo/add-demo/data.ts +518 -518
- package/files/.wl-skills/templates/sale/demo/billet-flame-cut-plan/data.ts +524 -524
- package/files/.wl-skills/templates/sale/demo/billet-flame-cut-plan/index.scss +154 -154
- package/files/.wl-skills/templates/sale/demo/billet-flame-cut-plan/index.vue +117 -117
- package/files/.wl-skills/templates/sale/demo/domestic-trade-order/data.ts +308 -308
- package/files/.wl-skills/templates/sale/demo/domestic-trade-order/index.scss +99 -99
- package/files/.wl-skills/templates/sale/demo/domestic-trade-order/index.vue +77 -77
- package/files/.wl-skills/templates/sale/demo/heat-batch-return/data.ts +367 -367
- package/files/.wl-skills/templates/sale/demo/heat-batch-return/index.scss +100 -100
- package/files/.wl-skills/templates/sale/demo/heat-batch-return/index.vue +170 -170
- package/files/.wl-skills/templates/sale/demo/heat-batch-return/meltDialog.vue +320 -320
- package/files/.wl-skills/templates/sale/demo/metallurgical-spec/data.ts +824 -824
- package/lib/ast-rules.js +395 -12
- package/mcp/config.js +46 -46
- package/mcp/registry.js +6 -1
- package/mcp/tools/projectTools.js +9 -1
- package/package.json +2 -2
|
@@ -1,367 +1,367 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: ChenYu ycyplus@gmail.com
|
|
3
|
-
* @Date: 2025-06-13 18:38:58
|
|
4
|
-
* @LastEditors: ChenYu ycyplus@gmail.com
|
|
5
|
-
* @LastEditTime: 2026-01-04 08:52:20
|
|
6
|
-
* @FilePath: \cx-ui-sale\src\views\sale\demo\heat-batch-return\data.ts
|
|
7
|
-
* @Description: 炉次返送 - 数据逻辑层
|
|
8
|
-
* Copyright (c) 2025 by CHENY, All Rights Reserved 😎.
|
|
9
|
-
*/
|
|
10
|
-
import { ref, reactive, h } from "vue";
|
|
11
|
-
import { TableColumnDesc } from "@jhlc/common-core/src/components/table/base-table/type";
|
|
12
|
-
import { ActionButtonDesc } from "@jhlc/common-core/src/components/toolbar/type";
|
|
13
|
-
import type { BaseFormItemDesc } from "@jhlc/common-core/src/components/form/common/type";
|
|
14
|
-
import axios from "axios";
|
|
15
|
-
import { ElMessage } from "element-plus";
|
|
16
|
-
|
|
17
|
-
// 计划炉号点击处理函数
|
|
18
|
-
function handlePlanFurnaceNoClick(row: any) {
|
|
19
|
-
ElMessage.info(`查看计划炉号: ${row.plannedFurnaceNumber} 的详细信息`);
|
|
20
|
-
// 这里可以添加跳转到计划炉号详情页面或打开详情弹窗的逻辑
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* 表格列配置 - 待返送
|
|
25
|
-
*/
|
|
26
|
-
export const pendingColumnsConfig: TableColumnDesc<any>[] = [
|
|
27
|
-
{ type: "selection", width: 55 },
|
|
28
|
-
{
|
|
29
|
-
label: "计划炉号",
|
|
30
|
-
name: "plannedFurnaceNumber",
|
|
31
|
-
defaultSlot: ({ row }: any) => {
|
|
32
|
-
return h(
|
|
33
|
-
"span",
|
|
34
|
-
{
|
|
35
|
-
style: "color: #409eff; cursor: pointer; text-decoration: underline;",
|
|
36
|
-
onClick: () => handlePlanFurnaceNoClick(row)
|
|
37
|
-
},
|
|
38
|
-
row.plannedFurnaceNumber
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
{ label: "计划顺序号", name: "plannedSequenceNumber", width: 120 },
|
|
43
|
-
{ label: "熔炼号", name: "smeltingNumber", width: 150 },
|
|
44
|
-
{ label: "内部钢种", name: "internalSteelGrade", width: 120 },
|
|
45
|
-
{ label: "铸机号", name: "castingMachineNumber", width: 120 }
|
|
46
|
-
];
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* 表格列配置 - 已返送
|
|
50
|
-
*/
|
|
51
|
-
export const returnedColumnsConfig: TableColumnDesc<any>[] = [
|
|
52
|
-
{ type: "selection", width: 55 },
|
|
53
|
-
{
|
|
54
|
-
label: "计划炉号",
|
|
55
|
-
name: "plannedFurnaceNumber",
|
|
56
|
-
defaultSlot: ({ row }: any) => {
|
|
57
|
-
return h(
|
|
58
|
-
"span",
|
|
59
|
-
{
|
|
60
|
-
style: "color: #409eff; cursor: pointer; text-decoration: underline;",
|
|
61
|
-
onClick: () => handlePlanFurnaceNoClick(row)
|
|
62
|
-
},
|
|
63
|
-
row.plannedFurnaceNumber
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
{ label: "计划顺序号", name: "plannedSequenceNumber", width: 120 },
|
|
68
|
-
{ label: "熔炼号", name: "smeltingNumber", width: 150 },
|
|
69
|
-
{ label: "内部钢种", name: "internalSteelGrade", width: 120 },
|
|
70
|
-
{ label: "铸机号", name: "castingMachineNumber", width: 120 }
|
|
71
|
-
];
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Loading状态
|
|
75
|
-
*/
|
|
76
|
-
export const pendingLoading = ref(false);
|
|
77
|
-
export const returnedLoading = ref(false);
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* 待返送数据
|
|
81
|
-
*/
|
|
82
|
-
export const pendingData = reactive({
|
|
83
|
-
list: [] as any[],
|
|
84
|
-
total: 0
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* 已返送数据
|
|
89
|
-
*/
|
|
90
|
-
export const returnedData = reactive({
|
|
91
|
-
list: [] as any[],
|
|
92
|
-
total: 0
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* 待返送分页
|
|
97
|
-
*/
|
|
98
|
-
export const pendingPagination = reactive({
|
|
99
|
-
page: 1,
|
|
100
|
-
pageSize: 15
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* 已返送分页
|
|
105
|
-
*/
|
|
106
|
-
export const returnedPagination = reactive({
|
|
107
|
-
page: 1,
|
|
108
|
-
pageSize: 15
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* 选中的行
|
|
113
|
-
*/
|
|
114
|
-
export const pendingSelectedRows = ref<any[]>([]);
|
|
115
|
-
export const returnedSelectedRows = ref<any[]>([]);
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* API 配置 - 统一管理所有接口地址
|
|
119
|
-
*/
|
|
120
|
-
export const API_CONFIG = {
|
|
121
|
-
list: "/api/furnace-batch/list",
|
|
122
|
-
save: "/api/furnace-batch/save",
|
|
123
|
-
update: "/api/furnace-batch/update",
|
|
124
|
-
getById: "/api/furnace-batch/getOneById"
|
|
125
|
-
} as const;
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* 获取待返送数据
|
|
129
|
-
*/
|
|
130
|
-
export const fetchPendingData = async () => {
|
|
131
|
-
pendingLoading.value = true;
|
|
132
|
-
|
|
133
|
-
try {
|
|
134
|
-
const params = {
|
|
135
|
-
page: pendingPagination.page,
|
|
136
|
-
pageSize: pendingPagination.pageSize,
|
|
137
|
-
type: "pending"
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
const response = await axios.get(API_CONFIG.list, { params });
|
|
141
|
-
|
|
142
|
-
if (response.data.code === 200) {
|
|
143
|
-
pendingData.list = response.data.data.list;
|
|
144
|
-
pendingData.total = response.data.data.total;
|
|
145
|
-
} else {
|
|
146
|
-
ElMessage.error(response.data.message || "获取数据失败");
|
|
147
|
-
}
|
|
148
|
-
} catch (error) {
|
|
149
|
-
console.error("获取待返送数据失败:", error);
|
|
150
|
-
ElMessage.error("获取数据失败");
|
|
151
|
-
} finally {
|
|
152
|
-
pendingLoading.value = false;
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* 获取已返送数据
|
|
158
|
-
*/
|
|
159
|
-
export const fetchReturnedData = async () => {
|
|
160
|
-
returnedLoading.value = true;
|
|
161
|
-
|
|
162
|
-
try {
|
|
163
|
-
const params = {
|
|
164
|
-
page: returnedPagination.page,
|
|
165
|
-
pageSize: returnedPagination.pageSize,
|
|
166
|
-
type: "returned"
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
const response = await axios.get(API_CONFIG.list, { params });
|
|
170
|
-
|
|
171
|
-
if (response.data.code === 200) {
|
|
172
|
-
returnedData.list = response.data.data.list;
|
|
173
|
-
returnedData.total = response.data.data.total;
|
|
174
|
-
} else {
|
|
175
|
-
ElMessage.error(response.data.message || "获取数据失败");
|
|
176
|
-
}
|
|
177
|
-
} catch (error) {
|
|
178
|
-
console.error("获取已返送数据失败:", error);
|
|
179
|
-
ElMessage.error("获取数据失败");
|
|
180
|
-
} finally {
|
|
181
|
-
returnedLoading.value = false;
|
|
182
|
-
}
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* 待返送分页变化
|
|
187
|
-
*/
|
|
188
|
-
export const handlePendingPageChange = (page: number) => {
|
|
189
|
-
pendingPagination.page = page;
|
|
190
|
-
fetchPendingData();
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
export const handlePendingSizeChange = (size: number) => {
|
|
194
|
-
pendingPagination.pageSize = size;
|
|
195
|
-
pendingPagination.page = 1;
|
|
196
|
-
fetchPendingData();
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* 已返送分页变化
|
|
201
|
-
*/
|
|
202
|
-
export const handleReturnedPageChange = (page: number) => {
|
|
203
|
-
returnedPagination.page = page;
|
|
204
|
-
fetchReturnedData();
|
|
205
|
-
};
|
|
206
|
-
|
|
207
|
-
export const handleReturnedSizeChange = (size: number) => {
|
|
208
|
-
returnedPagination.pageSize = size;
|
|
209
|
-
returnedPagination.page = 1;
|
|
210
|
-
fetchReturnedData();
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* 选择变化
|
|
215
|
-
*/
|
|
216
|
-
export const handlePendingSelectionChange = (selection: any[]) => {
|
|
217
|
-
pendingSelectedRows.value = selection;
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
export const handleReturnedSelectionChange = (selection: any[]) => {
|
|
221
|
-
returnedSelectedRows.value = selection;
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* 查询
|
|
226
|
-
*/
|
|
227
|
-
export const handleQuery = () => {
|
|
228
|
-
pendingPagination.page = 1;
|
|
229
|
-
returnedPagination.page = 1;
|
|
230
|
-
fetchPendingData();
|
|
231
|
-
fetchReturnedData();
|
|
232
|
-
};
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* 新增返送炉次弹窗配置
|
|
236
|
-
*/
|
|
237
|
-
export const modalConfig = {
|
|
238
|
-
titlePrefix: "返送炉次",
|
|
239
|
-
width: "60%",
|
|
240
|
-
columns: 4,
|
|
241
|
-
labelWidth: "90px",
|
|
242
|
-
formItems: [
|
|
243
|
-
{
|
|
244
|
-
name: "ponoNumber",
|
|
245
|
-
label: "PONO号",
|
|
246
|
-
placeholder: "请输入"
|
|
247
|
-
},
|
|
248
|
-
{
|
|
249
|
-
name: "continuousCasterNumber",
|
|
250
|
-
label: "连铸机号",
|
|
251
|
-
required: true,
|
|
252
|
-
placeholder: "请选择",
|
|
253
|
-
customProps: () => ({
|
|
254
|
-
clearable: true,
|
|
255
|
-
options: [
|
|
256
|
-
{ label: "1", value: "1" },
|
|
257
|
-
{ label: "2", value: "2" },
|
|
258
|
-
{ label: "3", value: "3" }
|
|
259
|
-
]
|
|
260
|
-
})
|
|
261
|
-
},
|
|
262
|
-
{
|
|
263
|
-
name: "internalSteelGrade",
|
|
264
|
-
label: "内部钢种",
|
|
265
|
-
required: true,
|
|
266
|
-
placeholder: "请输入"
|
|
267
|
-
},
|
|
268
|
-
{
|
|
269
|
-
name: "castSlabType",
|
|
270
|
-
label: "铸坯类型",
|
|
271
|
-
required: true,
|
|
272
|
-
placeholder: "请选择",
|
|
273
|
-
customProps: () => ({
|
|
274
|
-
clearable: true,
|
|
275
|
-
options: [
|
|
276
|
-
{ label: "类型1", value: "type1" },
|
|
277
|
-
{ label: "类型2", value: "type2" },
|
|
278
|
-
{ label: "类型3", value: "type3" }
|
|
279
|
-
]
|
|
280
|
-
})
|
|
281
|
-
},
|
|
282
|
-
{
|
|
283
|
-
name: "slabCount",
|
|
284
|
-
label: "坯数",
|
|
285
|
-
required: true,
|
|
286
|
-
placeholder: "请输入",
|
|
287
|
-
rules: [
|
|
288
|
-
{ required: true, message: "请输入坯数", trigger: "blur" },
|
|
289
|
-
{ pattern: /^\d+$/, message: "坯数必须为数字", trigger: "blur" }
|
|
290
|
-
]
|
|
291
|
-
},
|
|
292
|
-
{
|
|
293
|
-
name: "thickness",
|
|
294
|
-
label: "厚度",
|
|
295
|
-
required: true,
|
|
296
|
-
placeholder: "请输入",
|
|
297
|
-
rules: [
|
|
298
|
-
{ required: true, message: "请输入厚度", trigger: "blur" },
|
|
299
|
-
{ pattern: /^\d+(\.\d+)?$/, message: "厚度必须为数字", trigger: "blur" }
|
|
300
|
-
]
|
|
301
|
-
},
|
|
302
|
-
{
|
|
303
|
-
name: "width",
|
|
304
|
-
label: "宽度",
|
|
305
|
-
required: true,
|
|
306
|
-
placeholder: "请输入",
|
|
307
|
-
rules: [
|
|
308
|
-
{ required: true, message: "请输入宽度", trigger: "blur" },
|
|
309
|
-
{ pattern: /^\d+(\.\d+)?$/, message: "宽度必须为数字", trigger: "blur" }
|
|
310
|
-
]
|
|
311
|
-
},
|
|
312
|
-
{
|
|
313
|
-
name: "length",
|
|
314
|
-
label: "长度",
|
|
315
|
-
required: true,
|
|
316
|
-
placeholder: "请输入",
|
|
317
|
-
rules: [
|
|
318
|
-
{ required: true, message: "请输入长度", trigger: "blur" },
|
|
319
|
-
{ pattern: /^\d+(\.\d+)?$/, message: "长度必须为数字", trigger: "blur" }
|
|
320
|
-
]
|
|
321
|
-
},
|
|
322
|
-
{
|
|
323
|
-
name: "lengthUpperLimit",
|
|
324
|
-
label: "长度上限",
|
|
325
|
-
required: true,
|
|
326
|
-
placeholder: "请输入",
|
|
327
|
-
rules: [
|
|
328
|
-
{ required: true, message: "请输入长度上限", trigger: "blur" },
|
|
329
|
-
{
|
|
330
|
-
pattern: /^\d+(\.\d+)?$/,
|
|
331
|
-
message: "长度上限必须为数字",
|
|
332
|
-
trigger: "blur"
|
|
333
|
-
}
|
|
334
|
-
]
|
|
335
|
-
},
|
|
336
|
-
{
|
|
337
|
-
name: "widthUpperLimit",
|
|
338
|
-
label: "宽度上限",
|
|
339
|
-
required: true,
|
|
340
|
-
placeholder: "请输入",
|
|
341
|
-
rules: [
|
|
342
|
-
{ required: true, message: "请输入宽度上限", trigger: "blur" },
|
|
343
|
-
{
|
|
344
|
-
pattern: /^\d+(\.\d+)?$/,
|
|
345
|
-
message: "宽度上限必须为数字",
|
|
346
|
-
trigger: "blur"
|
|
347
|
-
}
|
|
348
|
-
]
|
|
349
|
-
}
|
|
350
|
-
] as BaseFormItemDesc<any>[],
|
|
351
|
-
api: {
|
|
352
|
-
getById: API_CONFIG.getById,
|
|
353
|
-
save: API_CONFIG.save,
|
|
354
|
-
update: API_CONFIG.update
|
|
355
|
-
}
|
|
356
|
-
};
|
|
357
|
-
|
|
358
|
-
/**
|
|
359
|
-
* 工具栏配置生成
|
|
360
|
-
*/
|
|
361
|
-
export const getToolbarConfig = (callbacks: {
|
|
362
|
-
onReturn: () => void;
|
|
363
|
-
onQuery: () => void;
|
|
364
|
-
}): ActionButtonDesc[] => [
|
|
365
|
-
{ label: "炉次返送", type: "primary", onClick: callbacks.onReturn },
|
|
366
|
-
{ label: "查询", type: "primary", onClick: callbacks.onQuery }
|
|
367
|
-
];
|
|
1
|
+
/*
|
|
2
|
+
* @Author: ChenYu ycyplus@gmail.com
|
|
3
|
+
* @Date: 2025-06-13 18:38:58
|
|
4
|
+
* @LastEditors: ChenYu ycyplus@gmail.com
|
|
5
|
+
* @LastEditTime: 2026-01-04 08:52:20
|
|
6
|
+
* @FilePath: \cx-ui-sale\src\views\sale\demo\heat-batch-return\data.ts
|
|
7
|
+
* @Description: 炉次返送 - 数据逻辑层
|
|
8
|
+
* Copyright (c) 2025 by CHENY, All Rights Reserved 😎.
|
|
9
|
+
*/
|
|
10
|
+
import { ref, reactive, h } from "vue";
|
|
11
|
+
import { TableColumnDesc } from "@jhlc/common-core/src/components/table/base-table/type";
|
|
12
|
+
import { ActionButtonDesc } from "@jhlc/common-core/src/components/toolbar/type";
|
|
13
|
+
import type { BaseFormItemDesc } from "@jhlc/common-core/src/components/form/common/type";
|
|
14
|
+
import axios from "axios";
|
|
15
|
+
import { ElMessage } from "element-plus";
|
|
16
|
+
|
|
17
|
+
// 计划炉号点击处理函数
|
|
18
|
+
function handlePlanFurnaceNoClick(row: any) {
|
|
19
|
+
ElMessage.info(`查看计划炉号: ${row.plannedFurnaceNumber} 的详细信息`);
|
|
20
|
+
// 这里可以添加跳转到计划炉号详情页面或打开详情弹窗的逻辑
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 表格列配置 - 待返送
|
|
25
|
+
*/
|
|
26
|
+
export const pendingColumnsConfig: TableColumnDesc<any>[] = [
|
|
27
|
+
{ type: "selection", width: 55 },
|
|
28
|
+
{
|
|
29
|
+
label: "计划炉号",
|
|
30
|
+
name: "plannedFurnaceNumber",
|
|
31
|
+
defaultSlot: ({ row }: any) => {
|
|
32
|
+
return h(
|
|
33
|
+
"span",
|
|
34
|
+
{
|
|
35
|
+
style: "color: #409eff; cursor: pointer; text-decoration: underline;",
|
|
36
|
+
onClick: () => handlePlanFurnaceNoClick(row)
|
|
37
|
+
},
|
|
38
|
+
row.plannedFurnaceNumber
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
{ label: "计划顺序号", name: "plannedSequenceNumber", width: 120 },
|
|
43
|
+
{ label: "熔炼号", name: "smeltingNumber", width: 150 },
|
|
44
|
+
{ label: "内部钢种", name: "internalSteelGrade", width: 120 },
|
|
45
|
+
{ label: "铸机号", name: "castingMachineNumber", width: 120 }
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* 表格列配置 - 已返送
|
|
50
|
+
*/
|
|
51
|
+
export const returnedColumnsConfig: TableColumnDesc<any>[] = [
|
|
52
|
+
{ type: "selection", width: 55 },
|
|
53
|
+
{
|
|
54
|
+
label: "计划炉号",
|
|
55
|
+
name: "plannedFurnaceNumber",
|
|
56
|
+
defaultSlot: ({ row }: any) => {
|
|
57
|
+
return h(
|
|
58
|
+
"span",
|
|
59
|
+
{
|
|
60
|
+
style: "color: #409eff; cursor: pointer; text-decoration: underline;",
|
|
61
|
+
onClick: () => handlePlanFurnaceNoClick(row)
|
|
62
|
+
},
|
|
63
|
+
row.plannedFurnaceNumber
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
{ label: "计划顺序号", name: "plannedSequenceNumber", width: 120 },
|
|
68
|
+
{ label: "熔炼号", name: "smeltingNumber", width: 150 },
|
|
69
|
+
{ label: "内部钢种", name: "internalSteelGrade", width: 120 },
|
|
70
|
+
{ label: "铸机号", name: "castingMachineNumber", width: 120 }
|
|
71
|
+
];
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Loading状态
|
|
75
|
+
*/
|
|
76
|
+
export const pendingLoading = ref(false);
|
|
77
|
+
export const returnedLoading = ref(false);
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* 待返送数据
|
|
81
|
+
*/
|
|
82
|
+
export const pendingData = reactive({
|
|
83
|
+
list: [] as any[],
|
|
84
|
+
total: 0
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* 已返送数据
|
|
89
|
+
*/
|
|
90
|
+
export const returnedData = reactive({
|
|
91
|
+
list: [] as any[],
|
|
92
|
+
total: 0
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* 待返送分页
|
|
97
|
+
*/
|
|
98
|
+
export const pendingPagination = reactive({
|
|
99
|
+
page: 1,
|
|
100
|
+
pageSize: 15
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* 已返送分页
|
|
105
|
+
*/
|
|
106
|
+
export const returnedPagination = reactive({
|
|
107
|
+
page: 1,
|
|
108
|
+
pageSize: 15
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* 选中的行
|
|
113
|
+
*/
|
|
114
|
+
export const pendingSelectedRows = ref<any[]>([]);
|
|
115
|
+
export const returnedSelectedRows = ref<any[]>([]);
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* API 配置 - 统一管理所有接口地址
|
|
119
|
+
*/
|
|
120
|
+
export const API_CONFIG = {
|
|
121
|
+
list: "/api/furnace-batch/list",
|
|
122
|
+
save: "/api/furnace-batch/save",
|
|
123
|
+
update: "/api/furnace-batch/update",
|
|
124
|
+
getById: "/api/furnace-batch/getOneById"
|
|
125
|
+
} as const;
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 获取待返送数据
|
|
129
|
+
*/
|
|
130
|
+
export const fetchPendingData = async () => {
|
|
131
|
+
pendingLoading.value = true;
|
|
132
|
+
|
|
133
|
+
try {
|
|
134
|
+
const params = {
|
|
135
|
+
page: pendingPagination.page,
|
|
136
|
+
pageSize: pendingPagination.pageSize,
|
|
137
|
+
type: "pending"
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
const response = await axios.get(API_CONFIG.list, { params });
|
|
141
|
+
|
|
142
|
+
if (response.data.code === 200) {
|
|
143
|
+
pendingData.list = response.data.data.list;
|
|
144
|
+
pendingData.total = response.data.data.total;
|
|
145
|
+
} else {
|
|
146
|
+
ElMessage.error(response.data.message || "获取数据失败");
|
|
147
|
+
}
|
|
148
|
+
} catch (error) {
|
|
149
|
+
console.error("获取待返送数据失败:", error);
|
|
150
|
+
ElMessage.error("获取数据失败");
|
|
151
|
+
} finally {
|
|
152
|
+
pendingLoading.value = false;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* 获取已返送数据
|
|
158
|
+
*/
|
|
159
|
+
export const fetchReturnedData = async () => {
|
|
160
|
+
returnedLoading.value = true;
|
|
161
|
+
|
|
162
|
+
try {
|
|
163
|
+
const params = {
|
|
164
|
+
page: returnedPagination.page,
|
|
165
|
+
pageSize: returnedPagination.pageSize,
|
|
166
|
+
type: "returned"
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
const response = await axios.get(API_CONFIG.list, { params });
|
|
170
|
+
|
|
171
|
+
if (response.data.code === 200) {
|
|
172
|
+
returnedData.list = response.data.data.list;
|
|
173
|
+
returnedData.total = response.data.data.total;
|
|
174
|
+
} else {
|
|
175
|
+
ElMessage.error(response.data.message || "获取数据失败");
|
|
176
|
+
}
|
|
177
|
+
} catch (error) {
|
|
178
|
+
console.error("获取已返送数据失败:", error);
|
|
179
|
+
ElMessage.error("获取数据失败");
|
|
180
|
+
} finally {
|
|
181
|
+
returnedLoading.value = false;
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* 待返送分页变化
|
|
187
|
+
*/
|
|
188
|
+
export const handlePendingPageChange = (page: number) => {
|
|
189
|
+
pendingPagination.page = page;
|
|
190
|
+
fetchPendingData();
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
export const handlePendingSizeChange = (size: number) => {
|
|
194
|
+
pendingPagination.pageSize = size;
|
|
195
|
+
pendingPagination.page = 1;
|
|
196
|
+
fetchPendingData();
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* 已返送分页变化
|
|
201
|
+
*/
|
|
202
|
+
export const handleReturnedPageChange = (page: number) => {
|
|
203
|
+
returnedPagination.page = page;
|
|
204
|
+
fetchReturnedData();
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
export const handleReturnedSizeChange = (size: number) => {
|
|
208
|
+
returnedPagination.pageSize = size;
|
|
209
|
+
returnedPagination.page = 1;
|
|
210
|
+
fetchReturnedData();
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* 选择变化
|
|
215
|
+
*/
|
|
216
|
+
export const handlePendingSelectionChange = (selection: any[]) => {
|
|
217
|
+
pendingSelectedRows.value = selection;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
export const handleReturnedSelectionChange = (selection: any[]) => {
|
|
221
|
+
returnedSelectedRows.value = selection;
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* 查询
|
|
226
|
+
*/
|
|
227
|
+
export const handleQuery = () => {
|
|
228
|
+
pendingPagination.page = 1;
|
|
229
|
+
returnedPagination.page = 1;
|
|
230
|
+
fetchPendingData();
|
|
231
|
+
fetchReturnedData();
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* 新增返送炉次弹窗配置
|
|
236
|
+
*/
|
|
237
|
+
export const modalConfig = {
|
|
238
|
+
titlePrefix: "返送炉次",
|
|
239
|
+
width: "60%",
|
|
240
|
+
columns: 4,
|
|
241
|
+
labelWidth: "90px",
|
|
242
|
+
formItems: [
|
|
243
|
+
{
|
|
244
|
+
name: "ponoNumber",
|
|
245
|
+
label: "PONO号",
|
|
246
|
+
placeholder: "请输入"
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
name: "continuousCasterNumber",
|
|
250
|
+
label: "连铸机号",
|
|
251
|
+
required: true,
|
|
252
|
+
placeholder: "请选择",
|
|
253
|
+
customProps: () => ({
|
|
254
|
+
clearable: true,
|
|
255
|
+
options: [
|
|
256
|
+
{ label: "1", value: "1" },
|
|
257
|
+
{ label: "2", value: "2" },
|
|
258
|
+
{ label: "3", value: "3" }
|
|
259
|
+
]
|
|
260
|
+
})
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
name: "internalSteelGrade",
|
|
264
|
+
label: "内部钢种",
|
|
265
|
+
required: true,
|
|
266
|
+
placeholder: "请输入"
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
name: "castSlabType",
|
|
270
|
+
label: "铸坯类型",
|
|
271
|
+
required: true,
|
|
272
|
+
placeholder: "请选择",
|
|
273
|
+
customProps: () => ({
|
|
274
|
+
clearable: true,
|
|
275
|
+
options: [
|
|
276
|
+
{ label: "类型1", value: "type1" },
|
|
277
|
+
{ label: "类型2", value: "type2" },
|
|
278
|
+
{ label: "类型3", value: "type3" }
|
|
279
|
+
]
|
|
280
|
+
})
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
name: "slabCount",
|
|
284
|
+
label: "坯数",
|
|
285
|
+
required: true,
|
|
286
|
+
placeholder: "请输入",
|
|
287
|
+
rules: [
|
|
288
|
+
{ required: true, message: "请输入坯数", trigger: "blur" },
|
|
289
|
+
{ pattern: /^\d+$/, message: "坯数必须为数字", trigger: "blur" }
|
|
290
|
+
]
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
name: "thickness",
|
|
294
|
+
label: "厚度",
|
|
295
|
+
required: true,
|
|
296
|
+
placeholder: "请输入",
|
|
297
|
+
rules: [
|
|
298
|
+
{ required: true, message: "请输入厚度", trigger: "blur" },
|
|
299
|
+
{ pattern: /^\d+(\.\d+)?$/, message: "厚度必须为数字", trigger: "blur" }
|
|
300
|
+
]
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
name: "width",
|
|
304
|
+
label: "宽度",
|
|
305
|
+
required: true,
|
|
306
|
+
placeholder: "请输入",
|
|
307
|
+
rules: [
|
|
308
|
+
{ required: true, message: "请输入宽度", trigger: "blur" },
|
|
309
|
+
{ pattern: /^\d+(\.\d+)?$/, message: "宽度必须为数字", trigger: "blur" }
|
|
310
|
+
]
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
name: "length",
|
|
314
|
+
label: "长度",
|
|
315
|
+
required: true,
|
|
316
|
+
placeholder: "请输入",
|
|
317
|
+
rules: [
|
|
318
|
+
{ required: true, message: "请输入长度", trigger: "blur" },
|
|
319
|
+
{ pattern: /^\d+(\.\d+)?$/, message: "长度必须为数字", trigger: "blur" }
|
|
320
|
+
]
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
name: "lengthUpperLimit",
|
|
324
|
+
label: "长度上限",
|
|
325
|
+
required: true,
|
|
326
|
+
placeholder: "请输入",
|
|
327
|
+
rules: [
|
|
328
|
+
{ required: true, message: "请输入长度上限", trigger: "blur" },
|
|
329
|
+
{
|
|
330
|
+
pattern: /^\d+(\.\d+)?$/,
|
|
331
|
+
message: "长度上限必须为数字",
|
|
332
|
+
trigger: "blur"
|
|
333
|
+
}
|
|
334
|
+
]
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
name: "widthUpperLimit",
|
|
338
|
+
label: "宽度上限",
|
|
339
|
+
required: true,
|
|
340
|
+
placeholder: "请输入",
|
|
341
|
+
rules: [
|
|
342
|
+
{ required: true, message: "请输入宽度上限", trigger: "blur" },
|
|
343
|
+
{
|
|
344
|
+
pattern: /^\d+(\.\d+)?$/,
|
|
345
|
+
message: "宽度上限必须为数字",
|
|
346
|
+
trigger: "blur"
|
|
347
|
+
}
|
|
348
|
+
]
|
|
349
|
+
}
|
|
350
|
+
] as BaseFormItemDesc<any>[],
|
|
351
|
+
api: {
|
|
352
|
+
getById: API_CONFIG.getById,
|
|
353
|
+
save: API_CONFIG.save,
|
|
354
|
+
update: API_CONFIG.update
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* 工具栏配置生成
|
|
360
|
+
*/
|
|
361
|
+
export const getToolbarConfig = (callbacks: {
|
|
362
|
+
onReturn: () => void;
|
|
363
|
+
onQuery: () => void;
|
|
364
|
+
}): ActionButtonDesc[] => [
|
|
365
|
+
{ label: "炉次返送", type: "primary", onClick: callbacks.onReturn },
|
|
366
|
+
{ label: "查询", type: "primary", onClick: callbacks.onQuery }
|
|
367
|
+
];
|