@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,257 @@
1
+ # jh-date-range - 日期范围选择组件
2
+
3
+ > 平台统一的日期范围选择组件,封装常用日期范围选择交互与默认格式,适用于查询条件、统计分析等需要选择开始/结束日期的场景
4
+
5
+ ## 📦 组件位置
6
+
7
+ ```ts
8
+ import "@jhlc/common-core";
9
+ ```
10
+
11
+ 组件已全局注册,可直接在模板中使用 `<jh-date-range />`。
12
+
13
+ ---
14
+
15
+ ## 基本用法
16
+
17
+ ### 1️⃣ 选择日期范围(最常用)
18
+
19
+ ```vue
20
+ <template>
21
+ <jh-date-range v-model="query.dateRange" placeholder="请选择日期范围" />
22
+ </template>
23
+
24
+ <script setup lang="ts">
25
+ import { ref } from "vue";
26
+
27
+ const query = ref({
28
+ dateRange: []
29
+ });
30
+ </script>
31
+ ```
32
+
33
+ ---
34
+
35
+ ### 2️⃣ 查询条件中使用(推荐)
36
+
37
+ ```vue
38
+ <jh-date-range
39
+ v-model="query.createDateRange"
40
+ placeholder="创建日期"
41
+ clearable
42
+ />
43
+ ```
44
+
45
+ ---
46
+
47
+ ## Props 属性
48
+
49
+ | 参数 | 说明 | 类型 | 默认值 |
50
+ | ------------------------------- | ---------------------------- | ------------------------------------------------ | ------------------ |
51
+ | modelValue / v-model | 绑定值(开始/结束数组) | `Array<string \| Date>` | `[]` |
52
+ | beginValue / v-model:beginValue | 开始日期(可拆分绑定) | `string \| Date` | - |
53
+ | endValue / v-model:endValue | 结束日期(可拆分绑定) | `string \| Date` | - |
54
+ | placeholder | 占位提示 | `string` | `"请选择日期范围"` |
55
+ | startPlaceholder | 开始日期占位 | `string` | `"开始日期"` |
56
+ | endPlaceholder | 结束日期占位 | `string` | `"结束日期"` |
57
+ | type | 范围选择器类型 | `"daterange" \| "monthrange" \| "datetimerange"` | `"daterange"` |
58
+ | format | 绑定值格式(返回给 v-model) | `string` | `"YYYY-MM-DD"` |
59
+ | showFormat | 显示格式 | `string` | `"YYYY-MM-DD"` |
60
+ | rangeSeparator | 分隔符 | `string` | `"至"` |
61
+ | disabled | 是否禁用 | `boolean` | `false` |
62
+ | clearable | 是否可清空 | `boolean` | `true` |
63
+
64
+ > **新增提示**: 除了使用 `v-model` 绑定数组外,还可以使用 `v-model:beginValue` 和 `v-model:endValue` 分别绑定开始和结束日期,这在某些场景下更加灵活。
65
+
66
+ ---
67
+
68
+ ## Events 事件
69
+
70
+ | 事件名 | 说明 | 回调参数 |
71
+ | ----------------- | ------------------ | ---------------------------------------- |
72
+ | update:modelValue | v-model 更新时触发 | `(value: Array<string \| Date>) => void` |
73
+ | update:beginValue | 开始日期更新时触发 | `(value: string \| Date) => void` |
74
+ | update:endValue | 结束日期更新时触发 | `(value: string \| Date) => void` |
75
+ | blur | 失去焦点时触发 | `() => void` |
76
+
77
+ ---
78
+
79
+ ## 常见场景
80
+
81
+ ### 场景 1:列表查询时间范围(推荐)
82
+
83
+ ```vue
84
+ <jh-date-range v-model="query.bizDateRange" placeholder="业务日期" />
85
+ ```
86
+
87
+ ---
88
+
89
+ ### 场景 2:统计报表筛选
90
+
91
+ ```vue
92
+ <jh-date-range v-model="query.statRange" placeholder="统计区间" />
93
+ ```
94
+
95
+ ---
96
+
97
+ ### 场景 3:BaseQuery 配置式用法(推荐)
98
+
99
+ ```ts
100
+ // data.ts 查询项配置
101
+ export const queryItemsConfig: BaseQueryItemDesc<any>[] = [
102
+ {
103
+ name: "createDateTime",
104
+ startName: "createDateTimeStart", // 开始字段
105
+ endName: "createDateTimeEnd", // 结束字段
106
+ label: "创建日期",
107
+ component: () => {
108
+ return {
109
+ tag: "jh-date",
110
+ type: "daterange",
111
+ rangeSeparator: "至",
112
+ showFormat: "YYYY-MM-DD",
113
+ valueFormat: "YYYY-MM-DD"
114
+ };
115
+ }
116
+ }
117
+ ];
118
+
119
+ // 使用时会自动拆分为 startName 和 endName 两个字段
120
+ // query.createDateTimeStart = "2026-01-01"
121
+ // query.createDateTimeEnd = "2026-01-31"
122
+ ```
123
+
124
+ ### 场景 4:与后端接口参数映射
125
+
126
+ ```ts
127
+ // v-model 方式
128
+ query.dateRange = ["2026-01-01", "2026-01-31"]
129
+
130
+ // 请求参数建议拆分传递
131
+ params: {
132
+ startDate: query.dateRange?.[0],
133
+ endDate: query.dateRange?.[1]
134
+ }
135
+
136
+ // 或使用 beginValue/endValue 方式
137
+ query.beginDate = "2026-01-01"
138
+ query.endDate = "2026-01-31"
139
+
140
+ // 请求参数直接使用
141
+ params: {
142
+ startDate: query.beginDate,
143
+ endDate: query.endDate
144
+ }
145
+ ```
146
+
147
+ ---
148
+
149
+ ## 与 el-date-picker 对比
150
+
151
+ ### 使用 jh-date-range(推荐)
152
+
153
+ ```vue
154
+ <jh-date-range v-model="query.dateRange" />
155
+ ```
156
+
157
+ ✅ 统一默认格式
158
+ ✅ 简化配置
159
+ ✅ 风格一致
160
+
161
+ ### 使用 el-date-picker(不推荐)
162
+
163
+ ```vue
164
+ <el-date-picker
165
+ v-model="query.dateRange"
166
+ type="daterange"
167
+ value-format="YYYY-MM-DD"
168
+ format="YYYY-MM-DD"
169
+ range-separator="至"
170
+ start-placeholder="开始日期"
171
+ end-placeholder="结束日期"
172
+ />
173
+ ```
174
+
175
+ ❌ 配置繁琐
176
+ ❌ 每处都要重复写默认格式
177
+ ❌ 风格不统一
178
+
179
+ ---
180
+
181
+ ## 最佳实践
182
+
183
+ ### 1️⃣ 统一返回字符串格式(强烈推荐)
184
+
185
+ ```vue
186
+ <jh-date-range v-model="query.dateRange" value-format="YYYY-MM-DD" />
187
+ ```
188
+
189
+ 避免 Date / string 混用,接口参数更稳定
190
+
191
+ ---
192
+
193
+ ### 2️⃣ 查询条件建议 always clearable
194
+
195
+ ```vue
196
+ <jh-date-range v-model="query.range" clearable />
197
+ ```
198
+
199
+ ---
200
+
201
+ ### 3️⃣ 请求参数建议拆分传递
202
+
203
+ ```ts
204
+ const [startDate, endDate] = query.value.dateRange || [];
205
+ request({
206
+ url: "/api/list",
207
+ params: { startDate, endDate }
208
+ });
209
+ ```
210
+
211
+ ---
212
+
213
+ ### 4️⃣ 与单日期选择区分使用
214
+
215
+ - 单个日期:`jh-date`
216
+ - 日期范围:`jh-date-range`
217
+
218
+ ---
219
+
220
+ ## 注意事项
221
+
222
+ 1. **v-model 为数组**
223
+ - 必须使用数组字段接收
224
+ - 推荐默认 `[]`
225
+
226
+ 2. **valueFormat 决定返回类型**
227
+ - 默认 `"YYYY-MM-DD"` 字符串数组
228
+ - 不建议返回 Date(容易引入时区/格式问题)
229
+
230
+ 3. **后端字段建议统一**
231
+ - 强烈建议后端使用 `startDate/endDate` 两个字段接收
232
+
233
+ ---
234
+
235
+ ## 🎯 真实项目示例
236
+
237
+ ### 示例 1:列表查询
238
+
239
+ ```vue
240
+ <jh-date-range v-model="query.createDateRange" />
241
+ ```
242
+
243
+ ### 示例 2:报表筛选
244
+
245
+ ```vue
246
+ <jh-date-range v-model="query.statRange" />
247
+ ```
248
+
249
+ ---
250
+
251
+ ## 🚀 快速开始
252
+
253
+ 1. 使用数组字段绑定 v-model(如 `dateRange`)
254
+ 2. 默认返回 `"YYYY-MM-DD"` 字符串数组
255
+ 3. 请求参数拆分成 start / end 传递
256
+
257
+ **推荐作为平台统一的日期范围选择组件使用!**
@@ -0,0 +1,222 @@
1
+ # jh-date - 日期选择组件
2
+
3
+ > 平台统一的日期选择组件,封装常用日期选择交互与默认格式,适用于表单、查询条件等需要选择单个日期的场景
4
+
5
+ ## 📦 组件位置
6
+
7
+ ```ts
8
+ import "@jhlc/common-core";
9
+ ```
10
+
11
+ 组件已全局注册,可直接在模板中使用 `<jh-date />`。
12
+
13
+ ---
14
+
15
+ ## 基本用法
16
+
17
+ ### 1️⃣ 选择单个日期(最常用)
18
+
19
+ ```vue
20
+ <template>
21
+ <jh-date v-model="form.date" placeholder="请选择日期" />
22
+ </template>
23
+
24
+ <script setup lang="ts">
25
+ import { ref } from "vue";
26
+
27
+ const form = ref({
28
+ date: ""
29
+ });
30
+ </script>
31
+ ```
32
+
33
+ ---
34
+
35
+ ### 2️⃣ 查询条件使用
36
+
37
+ ```vue
38
+ <jh-date v-model="query.bizDate" placeholder="业务日期" clearable />
39
+ ```
40
+
41
+ ---
42
+
43
+ ## Props 属性
44
+
45
+ | 参数 | 说明 | 类型 | 默认值 |
46
+ | -------------------- | ---------------------------- | --------------------------------------- | -------------- |
47
+ | modelValue / v-model | 绑定值 | `string \| Date` | - |
48
+ | placeholder | 占位提示 | `string` | `"请选择日期"` |
49
+ | type | 日期类型 | `"date" \| "week" \| "month" \| "year"` | `"date"` |
50
+ | format | 绑定值格式(返回给 v-model) | `string` | `"YYYY-MM-DD"` |
51
+ | showFormat | 显示格式 | `string` | `"YYYY-MM-DD"` |
52
+ | disabled | 是否禁用 | `boolean` | `false` |
53
+ | clearable | 是否可清空 | `boolean` | `true` |
54
+ | teleported | 是否将下拉面板插入 body | `boolean` | `true` |
55
+
56
+ > **提示**: `valueFormat` 为 Element Plus 原生属性,此处统一使用 `format` 属性代替,控制返回值格式。
57
+
58
+ ---
59
+
60
+ ## Events 事件
61
+
62
+ | 事件名 | 说明 | 回调参数 |
63
+ | ----------------- | -------------- | ----------------- |
64
+ | change | 日期变化时触发 | `(value) => void` |
65
+ | update:modelValue | v-model 更新 | `(value) => void` |
66
+
67
+ ---
68
+
69
+ ## 常见场景
70
+
71
+ ### 场景 1:表单录入日期
72
+
73
+ ```vue
74
+ <jh-date v-model="form.deliveryDate" placeholder="请选择交期" />
75
+ ```
76
+
77
+ ---
78
+
79
+ ### 场景 2:列表查询日期
80
+
81
+ ```vue
82
+ <jh-date v-model="query.createDate" placeholder="创建日期" />
83
+ ```
84
+
85
+ ---
86
+
87
+ ### 场景 3:详情页日期展示(配合 jh-text / 普通文本)
88
+
89
+ ```vue
90
+ <span>{{ detail.bizDate }}</span>
91
+ ```
92
+
93
+ > ⚠️ `jh-date` 仅用于选择,详情展示建议直接展示字符串或统一格式化后展示
94
+
95
+ ---
96
+
97
+ ### 场景 3:BaseQuery 配置式用法
98
+
99
+ ```ts
100
+ // data.ts 查询项配置
101
+ export const queryItemsConfig: BaseQueryItemDesc<any>[] = [
102
+ {
103
+ name: "deliveryDate",
104
+ label: "交期日期",
105
+ component: () => {
106
+ return {
107
+ tag: "jh-date",
108
+ type: "date",
109
+ showFormat: "YYYY-MM-DD",
110
+ valueFormat: "YYYY-MM-DD" // 或使用 format
111
+ };
112
+ }
113
+ },
114
+ {
115
+ name: "month",
116
+ label: "月份",
117
+ component: () => {
118
+ return {
119
+ tag: "jh-date",
120
+ type: "month",
121
+ showFormat: "YYYY-MM",
122
+ valueFormat: "YYYY-MM"
123
+ };
124
+ }
125
+ }
126
+ ];
127
+ ```
128
+
129
+ ---
130
+
131
+ ## 与 el-date-picker 对比
132
+
133
+ ### 使用 jh-date(推荐)
134
+
135
+ ```vue
136
+ <jh-date v-model="form.date" />
137
+ ```
138
+
139
+ ✅ 统一默认格式
140
+ ✅ 简化 props 配置
141
+ ✅ 风格一致
142
+
143
+ ### 使用 el-date-picker(不推荐)
144
+
145
+ ```vue
146
+ <el-date-picker
147
+ v-model="form.date"
148
+ type="date"
149
+ value-format="YYYY-MM-DD"
150
+ format="YYYY-MM-DD"
151
+ />
152
+ ```
153
+
154
+ ❌ 每处都要重复配置格式
155
+ ❌ 样式与交互不统一
156
+
157
+ ---
158
+
159
+ ## 最佳实践
160
+
161
+ ### 1️⃣ 统一返回字符串格式
162
+
163
+ 推荐保持 `valueFormat="YYYY-MM-DD"`,避免 Date / string 混用:
164
+
165
+ ```vue
166
+ <jh-date v-model="form.date" value-format="YYYY-MM-DD" />
167
+ ```
168
+
169
+ ---
170
+
171
+ ### 2️⃣ 查询条件优先可清空
172
+
173
+ ```vue
174
+ <jh-date v-model="query.date" clearable />
175
+ ```
176
+
177
+ ---
178
+
179
+ ### 3️⃣ 与日期范围选择区分使用
180
+
181
+ - 单个日期:`jh-date`
182
+ - 日期范围:`jh-date-range`
183
+
184
+ ---
185
+
186
+ ## 注意事项
187
+
188
+ 1. **v-model 返回值取决于 valueFormat**
189
+ - 默认返回 `"YYYY-MM-DD"` 字符串
190
+ - 若不配置可能返回 Date(取决于组件封装)
191
+
192
+ 2. **后端字段格式建议统一**
193
+ - 推荐后端/前端统一使用 `"YYYY-MM-DD"`
194
+
195
+ 3. **不要在不同页面混用格式**
196
+ - 避免接口参数混乱
197
+
198
+ ---
199
+
200
+ ## 🎯 真实项目示例
201
+
202
+ ### 示例 1:订单交期
203
+
204
+ ```vue
205
+ <jh-date v-model="form.deliveryDate" />
206
+ ```
207
+
208
+ ### 示例 2:查询条件
209
+
210
+ ```vue
211
+ <jh-date v-model="query.bizDate" clearable />
212
+ ```
213
+
214
+ ---
215
+
216
+ ## 🚀 快速开始
217
+
218
+ 1. 直接使用 v-model 绑定字段
219
+ 2. 默认返回 `"YYYY-MM-DD"` 字符串
220
+ 3. 范围选择使用 `jh-date-range`
221
+
222
+ **推荐作为平台统一的单日期选择组件使用!**
@@ -0,0 +1,190 @@
1
+ # jh-dept-picker - 部门选择组件
2
+
3
+ > 平台统一的部门挑选组件,用于选择单个或多个部门,内置部门树数据加载与回显逻辑
4
+
5
+ ## 📦 组件位置
6
+
7
+ ```ts
8
+ import "@jhlc/common-core";
9
+ ```
10
+
11
+ 组件已全局注册,可直接在模板中使用 `<jh-dept-picker />`。
12
+
13
+ ---
14
+
15
+ ## 基本用法
16
+
17
+ ### 1️⃣ 单选部门(最常用)
18
+
19
+ ```vue
20
+ <template>
21
+ <jh-dept-picker v-model="form.deptId" placeholder="请选择部门" />
22
+ </template>
23
+
24
+ <script setup lang="ts">
25
+ import { ref } from "vue";
26
+
27
+ const form = ref({
28
+ deptId: ""
29
+ });
30
+ </script>
31
+ ```
32
+
33
+ ---
34
+
35
+ ### 2️⃣ 多选部门
36
+
37
+ ```vue
38
+ <jh-dept-picker v-model="form.deptIds" multiple placeholder="请选择相关部门" />
39
+ ```
40
+
41
+ ---
42
+
43
+ ## Props 属性
44
+
45
+ | 参数 | 说明 | 类型 | 默认值 |
46
+ | -------------------- | ---------------------- | --------------------- | ------------------ |
47
+ | modelValue / v-model | 绑定值 | `string \| string[]` | - |
48
+ | multiple | 是否多选 | `boolean` | `false` |
49
+ | placeholder | 占位提示 | `string` | `"请选择部门"` |
50
+ | disabled | 是否禁用 | `boolean` | `false` |
51
+ | clearable | 是否可清空 | `boolean` | `true` |
52
+ | checkStrictly | 父子是否不关联 | `boolean` | `false` |
53
+ | dataType | 返回数据类型(多选时) | `"array" \| "string"` | `"array"` |
54
+ | dialogTitle | 弹窗标题 | `string` | `"选择部门"` |
55
+ | dialogWidth | 弹窗宽度 | `string` | `"600px"` |
56
+ | searchPlaceholder | 搜索框占位文本 | `string` | `"请输入部门名称"` |
57
+
58
+ > **重点**:
59
+ >
60
+ > - 默认父子关联,选中父节点会自动选中子节点
61
+ > - `checkStrictly=true` 时,父子不互相关联
62
+
63
+ ---
64
+
65
+ ## Events 事件
66
+
67
+ | 事件名 | 说明 | 回调参数 |
68
+ | ----------------- | ------------------------ | ------------------------------------- |
69
+ | update:modelValue | v-model 更新 | `(value: string \| string[]) => void` |
70
+ | confirm | 确认选择时触发 | `() => void` |
71
+ | clear | 清空时触发 | `() => void` |
72
+ | closed | 弹窗关闭时触发 | `() => void` |
73
+ | remove | 移除选中项时触发(多选) | `() => void` |
74
+
75
+ ---
76
+
77
+ ## 常见场景
78
+
79
+ ### 场景 1:表单部门选择
80
+
81
+ ```vue
82
+ <jh-dept-picker v-model="form.deptId" placeholder="请选择所属部门" />
83
+ ```
84
+
85
+ ---
86
+
87
+ ### 场景 2:查询条件(多选)
88
+
89
+ ```vue
90
+ <jh-dept-picker v-model="query.deptIds" multiple placeholder="请选择部门" />
91
+ ```
92
+
93
+ ---
94
+
95
+ ### 场景 3:详情页部门展示(配合 jh-text)
96
+
97
+ ```vue
98
+ <jh-text type="dept" :value="detail.deptId" />
99
+ ```
100
+
101
+ > ⚠️ `jh-dept-picker` 仅用于选择,展示请使用 `jh-text`
102
+
103
+ ---
104
+
105
+ ## 与手动实现对比
106
+
107
+ ### 使用 jh-dept-picker(推荐)
108
+
109
+ ```vue
110
+ <jh-dept-picker v-model="form.deptId" />
111
+ ```
112
+
113
+ ### 手动实现(不推荐)
114
+
115
+ ```vue
116
+ <el-tree-select v-model="form.deptId" :data="deptTree" />
117
+ ```
118
+
119
+ ❌ 需要自己加载部门树
120
+ ❌ 需要处理父子关系
121
+ ❌ 回显逻辑复杂
122
+
123
+ ---
124
+
125
+ ## 最佳实践
126
+
127
+ ### 1️⃣ 编辑 & 展示分离
128
+
129
+ | 场景 | 编辑 | 展示 |
130
+ | ---- | -------------- | ------- |
131
+ | 部门 | jh-dept-picker | jh-text |
132
+
133
+ ---
134
+
135
+ ### 2️⃣ 多选返回值说明
136
+
137
+ ```ts
138
+ // 单选
139
+ deptId: "d001";
140
+
141
+ // 多选
142
+ deptIds: ["d001", "d002"];
143
+ ```
144
+
145
+ ---
146
+
147
+ ### 3️⃣ 树形选择说明
148
+
149
+ - 默认父子关联
150
+ - `checkStrictly=true` 时父子不互相关联
151
+
152
+ ---
153
+
154
+ ## 注意事项
155
+
156
+ 1. **组件内部已处理部门数据加载**
157
+ - 不需要手动请求接口
158
+ - 支持树形结构与自动回显
159
+
160
+ 2. **仅返回部门 ID**
161
+ - 部门名称展示统一使用 `jh-text`
162
+
163
+ 3. **多选字段类型**
164
+ - 必须使用数组接收
165
+
166
+ ---
167
+
168
+ ## 🎯 真实项目示例
169
+
170
+ ### 示例 1:新增页面
171
+
172
+ ```vue
173
+ <jh-dept-picker v-model="form.deptId" />
174
+ ```
175
+
176
+ ### 示例 2:查询条件
177
+
178
+ ```vue
179
+ <jh-dept-picker v-model="query.deptIds" multiple />
180
+ ```
181
+
182
+ ---
183
+
184
+ ## 🚀 快速开始
185
+
186
+ - **单选**:直接使用 v-model
187
+ - **多选**:添加 `multiple`
188
+ - **部门展示**:统一使用 `jh-text type="dept"`
189
+
190
+ **推荐作为平台统一的部门选择组件使用!**