@agile-team/wl-skills-kit 1.0.0

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 (112) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +328 -0
  3. package/bin/wl-skills.js +104 -0
  4. package/files/.github/copilot-instructions.md +211 -0
  5. package/files/.github/docs/SYS_MENU_INFO.md +247 -0
  6. package/files/.github/docs/menu-sync-design.md +265 -0
  7. package/files/.github/docs/use-skill.md +379 -0
  8. package/files/.github/docs/wl-skills-kit.md +266 -0
  9. package/files/.github/skills/api-contract/SKILL.md +247 -0
  10. package/files/.github/skills/convention-extract/SKILL.md +355 -0
  11. package/files/.github/skills/menu-sync/SKILL.md +255 -0
  12. package/files/.github/skills/menu-sync/env/guide.md +73 -0
  13. package/files/.github/skills/page-codegen/SKILL.md +825 -0
  14. package/files/.github/skills/page-codegen/TPL-CHANGE-HISTORY.md +281 -0
  15. package/files/.github/skills/page-codegen/TPL-DETAIL-TABS.md +1112 -0
  16. package/files/.github/skills/page-codegen/TPL-DRIVEN.md +124 -0
  17. package/files/.github/skills/page-codegen/TPL-FORM-ROUTE.md +441 -0
  18. package/files/.github/skills/page-codegen/TPL-LIST.md +196 -0
  19. package/files/.github/skills/page-codegen/TPL-MASTER-DETAIL.md +153 -0
  20. package/files/.github/skills/page-codegen/TPL-OPERATION-STATION.md +442 -0
  21. package/files/.github/skills/page-codegen/TPL-RECORD-FORM.md +376 -0
  22. package/files/.github/skills/page-codegen/TPL-TREE-LIST.md +191 -0
  23. package/files/.github/skills/prototype-scan/SKILL.md +414 -0
  24. package/files/demo/README.md +44 -0
  25. package/files/demo/produce/aiflow/mmwr-customer-apply-add/api.md +54 -0
  26. package/files/demo/produce/aiflow/mmwr-customer-apply-add/data.ts +346 -0
  27. package/files/demo/produce/aiflow/mmwr-customer-apply-add/index.scss +1 -0
  28. package/files/demo/produce/aiflow/mmwr-customer-apply-add/index.vue +28 -0
  29. package/files/demo/produce/aiflow/mmwr-customer-apply-add-form/data.ts +115 -0
  30. package/files/demo/produce/aiflow/mmwr-customer-apply-add-form/index.scss +44 -0
  31. package/files/demo/produce/aiflow/mmwr-customer-apply-add-form/index.vue +43 -0
  32. package/files/demo/produce/aiflow/mmwr-customer-apply-change/data.ts +338 -0
  33. package/files/demo/produce/aiflow/mmwr-customer-apply-change/index.scss +1 -0
  34. package/files/demo/produce/aiflow/mmwr-customer-apply-change/index.vue +28 -0
  35. package/files/demo/produce/aiflow/mmwr-customer-apply-change-form/data.ts +115 -0
  36. package/files/demo/produce/aiflow/mmwr-customer-apply-change-form/index.scss +44 -0
  37. package/files/demo/produce/aiflow/mmwr-customer-apply-change-form/index.vue +43 -0
  38. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/data.ts +196 -0
  39. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.scss +150 -0
  40. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.vue +79 -0
  41. package/files/demo/produce/aiflow/mmwr-customer-archive/api.md +88 -0
  42. package/files/demo/produce/aiflow/mmwr-customer-archive/data.ts +601 -0
  43. package/files/demo/produce/aiflow/mmwr-customer-archive/index.scss +1 -0
  44. package/files/demo/produce/aiflow/mmwr-customer-archive/index.vue +64 -0
  45. package/files/demo/produce/aiflow/mmwr-customer-detail/api.md +67 -0
  46. package/files/demo/produce/aiflow/mmwr-customer-detail/data.ts +286 -0
  47. package/files/demo/produce/aiflow/mmwr-customer-detail/index.scss +139 -0
  48. package/files/demo/produce/aiflow/mmwr-customer-detail/index.vue +318 -0
  49. package/files/demo/produce/aiflow/mmwr-temp-customer-archive/api.md +98 -0
  50. package/files/demo/produce/aiflow/mmwr-temp-customer-archive/data.ts +543 -0
  51. package/files/demo/produce/aiflow/mmwr-temp-customer-archive/index.scss +1 -0
  52. package/files/demo/produce/aiflow/mmwr-temp-customer-archive/index.vue +52 -0
  53. package/files/demo/sale/demo/add-demo/data.ts +518 -0
  54. package/files/demo/sale/demo/add-demo/index.scss +207 -0
  55. package/files/demo/sale/demo/add-demo/index.vue +167 -0
  56. package/files/demo/sale/demo/billet-flame-cut-plan/data.ts +524 -0
  57. package/files/demo/sale/demo/billet-flame-cut-plan/index.scss +155 -0
  58. package/files/demo/sale/demo/billet-flame-cut-plan/index.vue +117 -0
  59. package/files/demo/sale/demo/domestic-trade-order/data.ts +308 -0
  60. package/files/demo/sale/demo/domestic-trade-order/index.scss +99 -0
  61. package/files/demo/sale/demo/domestic-trade-order/index.vue +77 -0
  62. package/files/demo/sale/demo/heat-batch-return/data.ts +367 -0
  63. package/files/demo/sale/demo/heat-batch-return/index.scss +100 -0
  64. package/files/demo/sale/demo/heat-batch-return/index.vue +170 -0
  65. package/files/demo/sale/demo/heat-batch-return/meltDialog.vue +320 -0
  66. package/files/demo/sale/demo/metallurgical-spec/data.ts +825 -0
  67. package/files/demo/sale/demo/metallurgical-spec/index.scss +264 -0
  68. package/files/demo/sale/demo/metallurgical-spec/index.vue +309 -0
  69. package/files/docs/jh-date-range.md +257 -0
  70. package/files/docs/jh-date.md +222 -0
  71. package/files/docs/jh-dept-picker.md +190 -0
  72. package/files/docs/jh-drag-row.md +590 -0
  73. package/files/docs/jh-file-upload.md +216 -0
  74. package/files/docs/jh-pagination.md +505 -0
  75. package/files/docs/jh-picker.md +218 -0
  76. package/files/docs/jh-select.md +148 -0
  77. package/files/docs/jh-text.md +248 -0
  78. package/files/docs/jh-user-picker.md +197 -0
  79. package/files/docs/page-query-hook-best-practices.md +362 -0
  80. package/files/docs/request.md +925 -0
  81. package/files/src/components/global/C_ParentView/index.vue +3 -0
  82. package/files/src/components/global/C_RightToolbar/index.vue +459 -0
  83. package/files/src/components/global/C_Splitter/index.vue +195 -0
  84. package/files/src/components/global/C_SvgIcon/index.vue +61 -0
  85. package/files/src/components/global/C_SvgIcon/svgicon.js +10 -0
  86. package/files/src/components/global/C_TagStatus/README.md +264 -0
  87. package/files/src/components/global/C_TagStatus/config.ts +192 -0
  88. package/files/src/components/global/C_TagStatus/index.vue +127 -0
  89. package/files/src/components/global/C_TagStatus/types.ts +64 -0
  90. package/files/src/components/global/C_Tree/README.md +153 -0
  91. package/files/src/components/global/C_Tree/index.scss +42 -0
  92. package/files/src/components/global/C_Tree/index.vue +119 -0
  93. package/files/src/components/global/C_Tree/types.ts +59 -0
  94. package/files/src/components/local/c_formModal/README.md +235 -0
  95. package/files/src/components/local/c_formModal/data.ts +95 -0
  96. package/files/src/components/local/c_formModal/index.scss +8 -0
  97. package/files/src/components/local/c_formModal/index.vue +107 -0
  98. package/files/src/components/local/c_formSections/README.md +496 -0
  99. package/files/src/components/local/c_formSections/data.ts +175 -0
  100. package/files/src/components/local/c_formSections/index.scss +280 -0
  101. package/files/src/components/local/c_formSections/index.vue +429 -0
  102. package/files/src/components/local/c_listModal/data.ts +41 -0
  103. package/files/src/components/local/c_listModal/index.vue +136 -0
  104. package/files/src/components/local/c_spliterTitle/index.scss +25 -0
  105. package/files/src/components/local/c_spliterTitle/index.vue +21 -0
  106. package/files/src/components/remote/AGGrid/README.md +530 -0
  107. package/files/src/components/remote/BaseForm/README.md +508 -0
  108. package/files/src/components/remote/BaseQuery/README.md +865 -0
  109. package/files/src/components/remote/BaseTable/README.md +941 -0
  110. package/files/src/components/remote/BaseToolbar/README.md +496 -0
  111. package/files/src/types/page.ts +24 -0
  112. package/package.json +31 -0
@@ -0,0 +1,67 @@
1
+ # 客户详情 接口约定
2
+
3
+ > 服务: sale | 资源: customerArchive
4
+ > 页面类型: 多 Tab 只读详情页(7 基础 Tab + 企业核实 + 6 扩展 Tab)
5
+
6
+ ## 1. 获取客户详情
7
+
8
+ ```
9
+ GET /sale/customerArchive/getById?id={id}
10
+ ```
11
+
12
+ Response 结构同 [customer-apply-change/api.md](../customer-apply-change/api.md),
13
+ 额外包含 `verificationInfo` 字段:
14
+
15
+ ```json
16
+ {
17
+ "verificationInfo": {
18
+ "companyName": "string",
19
+ "legalPerson": "string",
20
+ "companyStatus": "string",
21
+ "creditCode": "string",
22
+ "registeredCapital": "string",
23
+ "establishDate": "string",
24
+ "companyType": "string",
25
+ "region": "string",
26
+ "registrationAuthority": "string",
27
+ "businessScope": "string"
28
+ }
29
+ }
30
+ ```
31
+
32
+ ## 2. 企业核实确认
33
+
34
+ ```
35
+ POST /sale/customerArchive/verify
36
+ ```
37
+
38
+ Request: `{ id: string }`
39
+
40
+ ---
41
+
42
+ ## 3. 扩展 Tab 列表接口
43
+
44
+ 所有接口均为 `GET` 请求,参数 `customerId={id}`,返回 `data: Array`。
45
+
46
+ | Tab | 接口路径 |
47
+ | ---------- | ----------------------------------------- |
48
+ | 不良记录 | `/sale/customerArchive/badRecord/list` |
49
+ | 里程碑事件 | `/sale/customerArchive/milestone/list` |
50
+ | 询单需求 | `/sale/customerArchive/inquiry/list` |
51
+ | 跟进记录 | `/sale/customerArchive/followUp/list` |
52
+ | 客诉记录 | `/sale/customerArchive/complaint/list` |
53
+ | 历史销量 | `/sale/customerArchive/historySales/list` |
54
+
55
+ ### 各接口 Response 字段
56
+
57
+ **不良记录**: contractNo, badType, badInfo, createDate, status
58
+
59
+ **里程碑事件**: recordDate, milestoneType(首次接触/首次询单/首次合同), detail
60
+
61
+ **询单需求**: steelType, size, price, quantity, remark, tradeCondition, paymentMethod
62
+
63
+ **跟进记录**: activityDate, activityNo, activityTitle, activityContent, createBy
64
+
65
+ **客诉记录**: complaintDate, complaintNo, complaintSubject, handleContent, handleDate, handleBy
66
+
67
+ **历史销量记录**: steelGrade, spec, unit, orderQty, orderAmount, outboundQty, outboundAmount, settlementQty, settlementAmount
@@ -0,0 +1,286 @@
1
+ import { getAction, postAction } from "@jhlc/common-core/src/api/action";
2
+ import { ElMessage, ElMessageBox } from "element-plus";
3
+ import { useRouter } from "vue-router";
4
+
5
+ export const API_CONFIG = {
6
+ getById: "/sale/tempCustomerArchive/getById",
7
+ save: "/sale/tempCustomerArchive/save",
8
+ convert: "/sale/tempCustomerArchive/convert",
9
+ assign: "/sale/tempCustomerArchive/assign",
10
+ claim: "/sale/tempCustomerArchive/claim",
11
+ recycle: "/sale/tempCustomerArchive/recycle",
12
+ returnBack: "/sale/tempCustomerArchive/return"
13
+ } as const;
14
+
15
+ export const OPTS = {
16
+ useOrg: [
17
+ { label: "不锈钢接单中心", value: "不锈钢接单中心" },
18
+ {
19
+ label: "江阴华新特殊合金材料有限公司",
20
+ value: "江阴华新特殊合金材料有限公司"
21
+ },
22
+ { label: "採瞒管理中心", value: "採瞒管理中心" },
23
+ { label: "烟台华鑫再生资源有限公司", value: "烟台华鑫再生资源有限公司" }
24
+ ],
25
+ product: [
26
+ { label: "热轧", value: "热轧" },
27
+ { label: "盘元", value: "盘元" },
28
+ { label: "冷精", value: "冷精" },
29
+ { label: "汽车", value: "汽车" }
30
+ ],
31
+ customerType: [
32
+ { label: "SYCSR001-交易客户", value: "SYCSR001-交易客户" },
33
+ { label: "SYCSR002-直采客户", value: "SYCSR002-直采客户" }
34
+ ],
35
+ customerLevel: [
36
+ { label: "一般客户(A1)", value: "一般客户(A1)" },
37
+ { label: "重要客户(A2)", value: "重要客户(A2)" },
38
+ { label: "战略客户(A3)", value: "战略客户(A3)" }
39
+ ],
40
+ currency: [
41
+ { label: "CNY", value: "CNY" },
42
+ { label: "USD", value: "USD" }
43
+ ],
44
+ followType: [
45
+ { label: "客户拜访", value: "客户拜访" },
46
+ { label: "电话跟进", value: "电话跟进" },
47
+ { label: "邮件跟进", value: "邮件跟进" }
48
+ ]
49
+ };
50
+
51
+ export interface FollowRecord {
52
+ id: string;
53
+ useOrg: string;
54
+ product: string;
55
+ type: string;
56
+ activityDate: string;
57
+ activityCode: string;
58
+ activityTitle: string;
59
+ activityContent: string;
60
+ attachment: string;
61
+ createTime: string;
62
+ }
63
+
64
+ export interface TempCustomerForm {
65
+ id: string;
66
+ customerName: string;
67
+ convertStatus: string;
68
+ tempCode: string;
69
+ formalCode: string;
70
+ useOrg: string;
71
+ product: string;
72
+ lastFollowPerson: string;
73
+ lastFollowDate: string;
74
+ creator: string;
75
+ createTime: string;
76
+ customerType: string;
77
+ customerLevel: string;
78
+ businessLicense: string;
79
+ contactPerson: string;
80
+ contactPhone: string;
81
+ companyPhone1: string;
82
+ companyPhone2: string;
83
+ companyFax: string;
84
+ position: string;
85
+ email: string;
86
+ address: string;
87
+ consignee: string;
88
+ deliveryContact: string;
89
+ deliveryAddress: string;
90
+ currency: string;
91
+ taxRate: string;
92
+ bankType: string;
93
+ bankAccountName: string;
94
+ bankAccount: string;
95
+ bankBranch: string;
96
+ invoiceHeader: string;
97
+ taxNumber: string;
98
+ invoiceEmail: string;
99
+ invoicePhone: string;
100
+ invoiceAddress: string;
101
+ followRecords: FollowRecord[];
102
+ }
103
+
104
+ export function createMockData(): TempCustomerForm {
105
+ return {
106
+ id: "mock-001",
107
+ customerName: "烟台华新不锈钢智能化深加工基地",
108
+ convertStatus: "未转换",
109
+ tempCode: "10001170",
110
+ formalCode: "10001170",
111
+ useOrg: "不锈钢接单中心",
112
+ product: "热轧",
113
+ lastFollowPerson: "郭松",
114
+ lastFollowDate: "",
115
+ creator: "郭松",
116
+ createTime: "",
117
+ customerType: "SYCSR001-交易客户",
118
+ customerLevel: "一般客户(A1)",
119
+ businessLicense: "",
120
+ contactPerson: "潘灵连",
121
+ contactPhone: "18174058864",
122
+ companyPhone1: "18174058864",
123
+ companyPhone2: "18174058864",
124
+ companyFax: "18174058864",
125
+ position: "采购",
126
+ email: "2140309447@qq.com",
127
+ address: "上海市宝山区富锦路885号",
128
+ consignee: "潘灵连",
129
+ deliveryContact: "18174058864",
130
+ deliveryAddress: "上海市宝山区富锦路885号",
131
+ currency: "CNY",
132
+ taxRate: "--",
133
+ bankType: "中国工商银行股份有限公司",
134
+ bankAccountName: "江苏金恒信息科技股份有限公司",
135
+ bankAccount: "1001 1538 1900 3292 075",
136
+ bankBranch: "中国工商银行股份有限公司七台河兴煤支行",
137
+ invoiceHeader: "江苏金恒信息科技股份有限公司",
138
+ taxNumber: "91310000631696382C",
139
+ invoiceEmail: "2140309447@qq.com",
140
+ invoicePhone: "18174058864",
141
+ invoiceAddress: "上海市宝山区富锦路885号",
142
+ followRecords: [
143
+ {
144
+ id: "1",
145
+ useOrg: "",
146
+ product: "",
147
+ type: "客户拜访",
148
+ activityDate: "2024-01-01",
149
+ activityCode: "CV20241119003-07",
150
+ activityTitle: "客户拜访商业洽谈",
151
+ activityContent: "******",
152
+ attachment: "查看附件",
153
+ createTime: "2024-01-01 20:00"
154
+ },
155
+ {
156
+ id: "2",
157
+ useOrg: "",
158
+ product: "",
159
+ type: "客户拜访",
160
+ activityDate: "2024-01-01",
161
+ activityCode: "CV20241119003-07",
162
+ activityTitle: "客户拜访商业洽谈",
163
+ activityContent: "******",
164
+ attachment: "查看附件",
165
+ createTime: "2024-01-01 20:00"
166
+ },
167
+ {
168
+ id: "3",
169
+ useOrg: "",
170
+ product: "",
171
+ type: "客户拜访",
172
+ activityDate: "2024-01-01",
173
+ activityCode: "CV20241119003-07",
174
+ activityTitle: "客户拜访商业洽谈",
175
+ activityContent: "******",
176
+ attachment: "查看附件",
177
+ createTime: "2024-01-01 20:00"
178
+ }
179
+ ]
180
+ };
181
+ }
182
+
183
+ export function useTempCustomerDetail() {
184
+ const router = useRouter();
185
+ const loading = ref(false);
186
+ const form = reactive<TempCustomerForm>(createMockData());
187
+
188
+ async function loadDetail(id: string) {
189
+ loading.value = true;
190
+ try {
191
+ const res = await getAction(API_CONFIG.getById, { id });
192
+ if (res?.data) Object.assign(form, res.data);
193
+ } finally {
194
+ loading.value = false;
195
+ }
196
+ }
197
+
198
+ async function handleSave() {
199
+ loading.value = true;
200
+ try {
201
+ const res = await postAction(API_CONFIG.save, { ...form });
202
+ if (res?.code === 200) ElMessage.success("保存成功");
203
+ } finally {
204
+ loading.value = false;
205
+ }
206
+ }
207
+
208
+ function handleTempSave() {
209
+ ElMessage.info("暂存功能开发中");
210
+ }
211
+
212
+ async function handleConvert() {
213
+ ElMessageBox.confirm("确定将该临时客户转化为正式客户?", "提示", {
214
+ type: "info"
215
+ })
216
+ .then(async () => {
217
+ loading.value = true;
218
+ try {
219
+ const res = await postAction(API_CONFIG.convert, { ids: [form.id] });
220
+ if (res?.code === 200) {
221
+ ElMessage.success("转化成功");
222
+ router.back();
223
+ }
224
+ } finally {
225
+ loading.value = false;
226
+ }
227
+ })
228
+ .catch(() => {});
229
+ }
230
+
231
+ function handleAssign() {
232
+ ElMessage.info("分配功能开发中");
233
+ }
234
+ function handleClaim() {
235
+ ElMessage.info("认领功能开发中");
236
+ }
237
+ function handleRecycle() {
238
+ ElMessage.info("回收功能开发中");
239
+ }
240
+ function handleReturn() {
241
+ ElMessage.info("退回功能开发中");
242
+ }
243
+
244
+ function addFollowRecord() {
245
+ form.followRecords.push({
246
+ id: Date.now().toString(),
247
+ useOrg: "",
248
+ product: "",
249
+ type: "客户拜访",
250
+ activityDate: "",
251
+ activityCode: "",
252
+ activityTitle: "",
253
+ activityContent: "",
254
+ attachment: "",
255
+ createTime: ""
256
+ });
257
+ }
258
+
259
+ function removeFollowRecord(index: number) {
260
+ ElMessageBox.confirm("确定删除该跟进记录?", "提示", { type: "warning" })
261
+ .then(() => {
262
+ form.followRecords.splice(index, 1);
263
+ })
264
+ .catch(() => {});
265
+ }
266
+
267
+ function handleCancel() {
268
+ router.back();
269
+ }
270
+
271
+ return {
272
+ loading,
273
+ form,
274
+ loadDetail,
275
+ handleSave,
276
+ handleTempSave,
277
+ handleConvert,
278
+ handleAssign,
279
+ handleClaim,
280
+ handleRecycle,
281
+ handleReturn,
282
+ addFollowRecord,
283
+ removeFollowRecord,
284
+ handleCancel
285
+ };
286
+ }
@@ -0,0 +1,139 @@
1
+ .temp-customer-detail {
2
+ padding: 0 !important;
3
+ display: flex;
4
+ flex-direction: column;
5
+ overflow: hidden;
6
+ }
7
+
8
+ .temp-customer-detail .title-bar {
9
+ padding: 10px 16px 8px;
10
+ background: #f5f7fa;
11
+ border-bottom: 1px solid #e4e7ed;
12
+ display: flex;
13
+ align-items: center;
14
+ gap: 8px;
15
+ flex-shrink: 0;
16
+ }
17
+
18
+ .temp-customer-detail .title-bar .customer-name {
19
+ font-size: 15px;
20
+ font-weight: 600;
21
+ color: #303133;
22
+ }
23
+ .temp-customer-detail .title-bar .status-tag {
24
+ font-size: 12px;
25
+ }
26
+
27
+ .temp-customer-detail .page-toolbar {
28
+ padding: 8px 16px;
29
+ border-bottom: 1px solid #e4e7ed;
30
+ background: #fff;
31
+ flex-shrink: 0;
32
+ display: flex;
33
+ gap: 8px;
34
+ }
35
+
36
+ .temp-customer-detail .detail-form {
37
+ flex: 1;
38
+ overflow-y: auto;
39
+ padding: 0 16px 16px;
40
+ }
41
+
42
+ .temp-customer-detail .header-info {
43
+ padding: 12px 0 4px;
44
+ border-bottom: 1px solid #f0f2f5;
45
+ margin-bottom: 8px;
46
+ }
47
+
48
+ .temp-customer-detail .form-section {
49
+ margin-top: 16px;
50
+ }
51
+
52
+ .temp-customer-detail .form-section .section-title {
53
+ font-size: 13px;
54
+ font-weight: 600;
55
+ color: #303133;
56
+ padding: 0 0 8px 10px;
57
+ border-left: 3px solid var(--el-color-primary);
58
+ margin-bottom: 12px;
59
+ }
60
+
61
+ .temp-customer-detail .name-field {
62
+ display: flex;
63
+ align-items: center;
64
+ gap: 6px;
65
+ }
66
+
67
+ .temp-customer-detail .name-field .el-input {
68
+ flex: 1;
69
+ }
70
+
71
+ .temp-customer-detail .name-field .name-badge {
72
+ background: #e8f4ff;
73
+ color: #409eff;
74
+ font-size: 11px;
75
+ font-weight: 600;
76
+ padding: 2px 5px;
77
+ border-radius: 3px;
78
+ white-space: nowrap;
79
+ cursor: pointer;
80
+ }
81
+
82
+ .temp-customer-detail .upload-box {
83
+ width: 100%;
84
+ height: 88px;
85
+ border: 1px dashed #d9d9d9;
86
+ border-radius: 4px;
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: center;
90
+ cursor: pointer;
91
+ background: #fafafa;
92
+ }
93
+
94
+ .temp-customer-detail .upload-box:hover {
95
+ border-color: var(--el-color-primary);
96
+ }
97
+
98
+ .temp-customer-detail .upload-box .upload-placeholder {
99
+ text-align: center;
100
+ }
101
+
102
+ .temp-customer-detail .upload-box .upload-icon {
103
+ font-size: 20px;
104
+ color: #c0c4cc;
105
+ line-height: 1;
106
+ margin-bottom: 4px;
107
+ }
108
+
109
+ .temp-customer-detail .upload-box .upload-text {
110
+ font-size: 12px;
111
+ color: #909399;
112
+ }
113
+
114
+ .temp-customer-detail .link-text {
115
+ color: #409eff;
116
+ text-decoration: none;
117
+ }
118
+
119
+ .temp-customer-detail .link-text:hover {
120
+ text-decoration: underline;
121
+ }
122
+
123
+ .temp-customer-detail .add-row-btn {
124
+ margin-top: 8px;
125
+ padding: 6px 12px;
126
+ color: #409eff;
127
+ cursor: pointer;
128
+ font-size: 13px;
129
+ display: inline-flex;
130
+ align-items: center;
131
+ gap: 4px;
132
+ }
133
+
134
+ .temp-customer-detail .add-row-btn:hover {
135
+ color: #66b1ff;
136
+ }
137
+ .temp-customer-detail .el-form-item {
138
+ margin-bottom: 10px;
139
+ }