@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,196 @@
1
+ import { getAction } from "@jhlc/common-core/src/api/action";
2
+ import { useRouter } from "vue-router";
3
+ import { createChangeMockData } from "@/components/local/c_customerTabs/data";
4
+ import type {
5
+ BasicInfoForm,
6
+ BusinessInfoRow
7
+ } from "@/components/local/c_customerTabs/data";
8
+
9
+ export const API_CONFIG = {
10
+ changeHistoryList: "/sale/customerApply/changeHistory/list",
11
+ getById: "/sale/customerApply/changeHistory/getById",
12
+ getDiffById: "/sale/customerApply/changeHistory/getDiffById"
13
+ } as const;
14
+
15
+ export interface HistoryRecord {
16
+ id: string;
17
+ changeType: string;
18
+ changeTime: string;
19
+ changePerson: string;
20
+ }
21
+
22
+ /** 变更历史记录 mock 数据(对齐原型截图,首条为"数据变更"以便立即展示比对效果) */
23
+ function createHistoryListMock(): HistoryRecord[] {
24
+ return [
25
+ {
26
+ id: "h001",
27
+ changeType: "数据变更",
28
+ changeTime: "2025/12/15 13:48:07",
29
+ changePerson: "变更人姓名"
30
+ },
31
+ {
32
+ id: "h002",
33
+ changeType: "数据新增",
34
+ changeTime: "2025/12/15 13:48:07",
35
+ changePerson: "新增人姓名"
36
+ },
37
+ {
38
+ id: "h003",
39
+ changeType: "数据新增",
40
+ changeTime: "2025/12/15 13:48:07",
41
+ changePerson: "新增人姓名"
42
+ },
43
+ {
44
+ id: "h004",
45
+ changeType: "数据变更",
46
+ changeTime: "2025/12/15 13:48:07",
47
+ changePerson: "变更人姓名"
48
+ },
49
+ {
50
+ id: "h005",
51
+ changeType: "数据变更",
52
+ changeTime: "2025/12/15 13:48:07",
53
+ changePerson: "变更人姓名"
54
+ },
55
+ {
56
+ id: "h006",
57
+ changeType: "数据新增",
58
+ changeTime: "2025/12/15 13:48:07",
59
+ changePerson: "新增人姓名"
60
+ },
61
+ {
62
+ id: "h007",
63
+ changeType: "数据新增",
64
+ changeTime: "2025/12/15 13:48:07",
65
+ changePerson: "新增人姓名"
66
+ }
67
+ ];
68
+ }
69
+
70
+ /** 变更比对 mock:旧版数据(对齐原型截图中的上下比对效果)
71
+ * 使用显示标签(非值码),以便 diff-old-value 直接展示中文。
72
+ * - basicInfo.taxCategory: "小规模纳税人"(旧)vs "一级纳税人"(新)
73
+ * - basicInfo.relationType: "02-合并关系人"(旧)vs "03-非关系人"(新)
74
+ * - businessInfoList[0]: salesType "外销"(旧)vs "内销"(新),customerLevel "B3" vs "B1"
75
+ */
76
+ function createDiffMockData(): {
77
+ basicInfo: BasicInfoForm;
78
+ businessInfoList: BusinessInfoRow[];
79
+ } {
80
+ const current = createChangeMockData();
81
+ return {
82
+ basicInfo: {
83
+ ...current.basicInfo,
84
+ taxCategory: "小规模纳税人",
85
+ relationType: "02-合并关系人"
86
+ },
87
+ businessInfoList: current.businessInfoList.map((row, idx) => {
88
+ if (idx === 0) {
89
+ return { ...row, salesType: "外销", customerLevel: "B3" };
90
+ }
91
+ return { ...row };
92
+ })
93
+ };
94
+ }
95
+
96
+ export function useChangeHistory(tabsRef: any) {
97
+ const router = useRouter();
98
+ const loading = ref(false);
99
+ const historyLoading = ref(false);
100
+ const historyList = ref<HistoryRecord[]>([]);
101
+ const selectedId = ref<string>("");
102
+ const isMockMode = ref(false);
103
+
104
+ // ─── 真实接口模式(有 id 时调用) ───
105
+
106
+ async function loadHistoryList(applyId: string) {
107
+ isMockMode.value = false;
108
+ historyLoading.value = true;
109
+ try {
110
+ const res = await getAction(API_CONFIG.changeHistoryList, { applyId });
111
+ if (res?.data?.length) {
112
+ historyList.value = res.data;
113
+ }
114
+ } finally {
115
+ historyLoading.value = false;
116
+ if (historyList.value.length > 0) {
117
+ await loadHistoryDetail(historyList.value[0].id);
118
+ }
119
+ }
120
+ }
121
+
122
+ async function loadHistoryDetail(id: string) {
123
+ selectedId.value = id;
124
+ loading.value = true;
125
+ const currentRecord = historyList.value.find((r) => r.id === id);
126
+ const isChangeType = currentRecord?.changeType.includes("变更");
127
+ try {
128
+ const res = await getAction(API_CONFIG.getById, { id });
129
+ if (res?.data) {
130
+ tabsRef.value?.loadData(res.data);
131
+ if (isChangeType) {
132
+ const diffRes = await getAction(API_CONFIG.getDiffById, { id }).catch(
133
+ () => null
134
+ );
135
+ if (diffRes?.data) {
136
+ tabsRef.value?.loadDiffData(diffRes.data);
137
+ } else {
138
+ tabsRef.value?.clearDiffData?.();
139
+ }
140
+ } else {
141
+ tabsRef.value?.clearDiffData?.();
142
+ }
143
+ }
144
+ } finally {
145
+ loading.value = false;
146
+ }
147
+ }
148
+
149
+ // ─── Mock 模式(无 id 时调用,纯本地数据,零接口请求) ───
150
+
151
+ function loadMockData() {
152
+ isMockMode.value = true;
153
+ historyList.value = createHistoryListMock();
154
+ if (historyList.value.length > 0) {
155
+ nextTick(() => selectMockDetail(historyList.value[0].id));
156
+ }
157
+ }
158
+
159
+ function selectMockDetail(id: string) {
160
+ selectedId.value = id;
161
+ const currentRecord = historyList.value.find((r) => r.id === id);
162
+ const isChangeType = currentRecord?.changeType.includes("变更");
163
+ tabsRef.value?.loadData(createChangeMockData());
164
+ if (isChangeType) {
165
+ tabsRef.value?.loadDiffData(createDiffMockData());
166
+ } else {
167
+ tabsRef.value?.clearDiffData?.();
168
+ }
169
+ }
170
+
171
+ // ─── 公共 ───
172
+
173
+ function handleSelectHistory(item: HistoryRecord) {
174
+ if (item.id === selectedId.value) return;
175
+ if (isMockMode.value) {
176
+ selectMockDetail(item.id);
177
+ } else {
178
+ loadHistoryDetail(item.id);
179
+ }
180
+ }
181
+
182
+ function handleCancel() {
183
+ router.back();
184
+ }
185
+
186
+ return {
187
+ loading,
188
+ historyLoading,
189
+ historyList,
190
+ selectedId,
191
+ loadHistoryList,
192
+ loadMockData,
193
+ handleSelectHistory,
194
+ handleCancel
195
+ };
196
+ }
@@ -0,0 +1,150 @@
1
+ .change-history-page {
2
+ display: flex !important;
3
+ padding: 0 !important;
4
+ height: 100%;
5
+ overflow: hidden;
6
+
7
+ /* ─── 左侧:变更记录面板 ─── */
8
+ .history-panel {
9
+ width: 200px;
10
+ flex-shrink: 0;
11
+ border-right: 1px solid #e4e7ed;
12
+ display: flex;
13
+ flex-direction: column;
14
+ overflow: hidden;
15
+ background: #fff;
16
+
17
+ &__header {
18
+ padding: 12px 16px;
19
+ font-size: 14px;
20
+ font-weight: 600;
21
+ color: #303133;
22
+ border-bottom: 1px solid #e4e7ed;
23
+ flex-shrink: 0;
24
+ }
25
+
26
+ &__list {
27
+ flex: 1;
28
+ overflow-y: auto;
29
+ padding: 4px 0;
30
+ }
31
+ }
32
+
33
+ .history-card {
34
+ display: flex;
35
+ align-items: flex-start;
36
+ padding: 10px 16px;
37
+ cursor: pointer;
38
+ border-left: 3px solid transparent;
39
+ transition: background 0.15s;
40
+ gap: 8px;
41
+
42
+ &:hover {
43
+ background: #f5f7fa;
44
+ }
45
+
46
+ &.is-active {
47
+ background: #ecf5ff;
48
+ border-left-color: #409eff;
49
+ }
50
+
51
+ &__dot {
52
+ width: 8px;
53
+ height: 8px;
54
+ border-radius: 50%;
55
+ margin-top: 5px;
56
+ flex-shrink: 0;
57
+
58
+ &.is-add {
59
+ background: #409eff;
60
+ }
61
+ &.is-change {
62
+ background: #e6a23c;
63
+ }
64
+ }
65
+
66
+ &__content {
67
+ flex: 1;
68
+ min-width: 0;
69
+ }
70
+
71
+ &__type {
72
+ font-size: 13px;
73
+ font-weight: 500;
74
+ color: #303133;
75
+ line-height: 18px;
76
+ }
77
+
78
+ &__date {
79
+ font-size: 12px;
80
+ color: #909399;
81
+ line-height: 18px;
82
+ }
83
+
84
+ &__person {
85
+ font-size: 12px;
86
+ color: #606266;
87
+ line-height: 18px;
88
+ }
89
+ }
90
+
91
+ .history-empty {
92
+ padding: 32px 16px;
93
+ text-align: center;
94
+ color: #909399;
95
+ font-size: 13px;
96
+ }
97
+
98
+ /* ─── 右侧:变更详情面板 ─── */
99
+ .detail-panel {
100
+ flex: 1;
101
+ overflow: hidden;
102
+ display: flex;
103
+ flex-direction: column;
104
+ background: #fff;
105
+
106
+ &__body {
107
+ flex: 1;
108
+ overflow-y: auto;
109
+ padding: 0 16px 16px;
110
+ }
111
+ }
112
+
113
+ .page-header {
114
+ display: flex;
115
+ align-items: center;
116
+ padding: 10px 16px;
117
+ flex-shrink: 0;
118
+
119
+ .page-title {
120
+ font-size: 16px;
121
+ font-weight: 600;
122
+ margin-right: 10px;
123
+ }
124
+
125
+ .page-tag {
126
+ display: inline-block;
127
+ padding: 1px 8px;
128
+ font-size: 12px;
129
+ border-radius: 4px;
130
+ margin-right: 8px;
131
+
132
+ &--change {
133
+ background-color: var(--el-color-primary-light-9);
134
+ color: var(--el-color-primary);
135
+ border: 1px solid var(--el-color-primary-light-7);
136
+ }
137
+
138
+ &--status {
139
+ background-color: var(--el-color-warning-light-9);
140
+ color: var(--el-color-warning);
141
+ border: 1px solid var(--el-color-warning-light-7);
142
+ }
143
+ }
144
+ }
145
+
146
+ .page-toolbar {
147
+ padding: 0 16px 8px;
148
+ flex-shrink: 0;
149
+ }
150
+ }
@@ -0,0 +1,79 @@
1
+ <template>
2
+ <div class="app-container change-history-page">
3
+ <!-- 左侧:变更历史记录面板 -->
4
+ <div class="history-panel" v-loading="historyLoading">
5
+ <div class="history-panel__header">变更记录</div>
6
+ <div class="history-panel__list">
7
+ <div
8
+ v-for="item in historyList"
9
+ :key="item.id"
10
+ class="history-card"
11
+ :class="{ 'is-active': item.id === selectedId }"
12
+ @click="handleSelectHistory(item)"
13
+ >
14
+ <span
15
+ class="history-card__dot"
16
+ :class="item.changeType.includes('新增') ? 'is-add' : 'is-change'"
17
+ ></span>
18
+ <div class="history-card__content">
19
+ <div class="history-card__type">{{ item.changeType }}</div>
20
+ <div class="history-card__date">{{ item.changeTime }}</div>
21
+ <div class="history-card__person">{{ item.changePerson }}</div>
22
+ </div>
23
+ </div>
24
+ <div
25
+ v-if="!historyList.length && !historyLoading"
26
+ class="history-empty"
27
+ >
28
+ 暂无变更记录
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ <!-- 右侧:变更详情面板 -->
34
+ <div class="detail-panel" v-loading="loading">
35
+ <div class="page-header">
36
+ <span class="page-title">客户变更详情</span>
37
+ <span class="page-tag page-tag--change">变更</span>
38
+ <span class="page-tag page-tag--status">未审核</span>
39
+ </div>
40
+ <div class="page-toolbar">
41
+ <el-button @click="handleCancel">取消</el-button>
42
+ </div>
43
+ <div class="detail-panel__body">
44
+ <c_customerTabs ref="tabsRef" mode="view" />
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </template>
49
+
50
+ <script setup lang="ts">
51
+ import { useRoute } from "vue-router";
52
+ import { useChangeHistory } from "./data";
53
+ import c_customerTabs from "@/components/local/c_customerTabs/index.vue";
54
+
55
+ const tabsRef = ref<InstanceType<typeof c_customerTabs>>();
56
+ const route = useRoute();
57
+
58
+ const {
59
+ loading,
60
+ historyLoading,
61
+ historyList,
62
+ selectedId,
63
+ loadHistoryList,
64
+ loadMockData,
65
+ handleSelectHistory,
66
+ handleCancel
67
+ } = useChangeHistory(tabsRef);
68
+
69
+ onMounted(() => {
70
+ // TODO: 后端接口就绪后,启用真实接口:
71
+ // const id = route.query.id as string;
72
+ // if (id) { loadHistoryList(id); } else { loadMockData(); }
73
+ loadMockData();
74
+ });
75
+ </script>
76
+
77
+ <style scoped lang="scss">
78
+ @import "./index.scss";
79
+ </style>
@@ -0,0 +1,88 @@
1
+ # 客户档案 接口约定
2
+
3
+ > 服务: sale | 资源: customerArchive
4
+
5
+ ## 1. 分页查询
6
+
7
+ ```
8
+ POST /sale/customerArchive/list
9
+ ```
10
+
11
+ ### Request
12
+
13
+ | 字段 | 类型 | 必填 | 说明 |
14
+ | ------------------- | ------ | ---- | ----------------------------------- |
15
+ | customerCategory | string | 是 | 客户分类: formal/temp/pool |
16
+ | customerName | string | | 客户名称(模糊) |
17
+ | customerCode | string | | 客户编码 |
18
+ | tempCustomerCode | string | | 临时客户编号 |
19
+ | customerStatus | string | | 客户状态(dict: customer_status) |
20
+ | applicant | string | | 申请人 |
21
+ | conversionStatus | string | | 转换状态(dict: conversion_status) |
22
+ | createDateStart | string | | 建立日期-起(YYYY-MM-DD) |
23
+ | createDateEnd | string | | 建立日期-止(YYYY-MM-DD) |
24
+ | lastFollowDateStart | string | | 最后跟进-起(YYYY-MM-DD) |
25
+ | lastFollowDateEnd | string | | 最后跟进-止(YYYY-MM-DD) |
26
+ | productLine | string | | 产品别(dict: product_line) |
27
+ | approvalStatus | string | | 审批状态(dict: approval_status) |
28
+ | verificationStatus | string | | 核实状态(dict: verification_status) |
29
+ | enableStatus | string | | 启用状态(dict: enable_status) |
30
+ | current | number | 是 | 当前页 |
31
+ | size | number | 是 | 每页条数 |
32
+
33
+ ### Response
34
+
35
+ | 字段 | 类型 | 说明 |
36
+ | ----------------- | ------ | ------------------------------- |
37
+ | customerName | string | 客户名称 |
38
+ | customerShortName | string | 客户简称 |
39
+ | customerType | string | 客户类型(dict: customer_type) |
40
+ | countryRegion | string | 国家/地区 |
41
+ | tradeCurrency | string | 交易币种 |
42
+ | taxCategory | string | 纳税类别(dict: tax_category) |
43
+ | relationType | string | 关系人分类(dict: relation_type) |
44
+ | parentCustomer | string | 上级客户 |
45
+ | groupName | string | 集团 |
46
+ | createBy | string | 建立人 |
47
+ | createTime | string | 建立时间 |
48
+ | applyOrg | string | 申请组织 |
49
+ | enableStatus | string | 启用状态(dict: enable_status) |
50
+ | disableTime | string | 停用时间 |
51
+
52
+ ---
53
+
54
+ ## 2. 删除
55
+
56
+ ```
57
+ DELETE /sale/customerArchive/remove?id={id}
58
+ ```
59
+
60
+ ## 3. 详情
61
+
62
+ ```
63
+ GET /sale/customerArchive/getById?id={id}
64
+ ```
65
+
66
+ ## 4. 导出
67
+
68
+ ```
69
+ GET /sale/customerArchive/export
70
+ ```
71
+
72
+ 支持与分页查询相同的筛选参数。
73
+
74
+ ---
75
+
76
+ ## 字典表
77
+
78
+ | dictCode | 值 |
79
+ | ------------------- | --------------------------------------------------------- |
80
+ | customer_status | 待定义 |
81
+ | conversion_status | 已转换 / 未转换 |
82
+ | product_line | 热轧 / 盘元 / 冷精 / 汽车 |
83
+ | approval_status | 开立审批中 / 审批完成 / 流程终止 / 驳回 |
84
+ | verification_status | 已核实 / 未核实 |
85
+ | enable_status | 已启用 / 已停用 |
86
+ | customer_type | SYCSR001-交易客户 / SYCSR002-非交易客户 |
87
+ | tax_category | 一般纳税人 / 小规模纳税人 / 海外纳税 / 其他 |
88
+ | relation_type | 01-关联企业 / 02-合并关系人 / 03-非关系人 / 04-实质关系人 |