diff --git a/components/hrm/CityPicker.vue b/components/hrm/CityPicker.vue
new file mode 100644
index 0000000..6f98548
--- /dev/null
+++ b/components/hrm/CityPicker.vue
@@ -0,0 +1,57 @@
+
+
+
+
+ {{ pathLabel || '请选择目的地' }}
+
+
+ {{ item.name }}
+
+
+ {{ item.name }}
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/hrm/DateTimePicker.vue b/components/hrm/DateTimePicker.vue
new file mode 100644
index 0000000..59bff2a
--- /dev/null
+++ b/components/hrm/DateTimePicker.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+ {{ d }}
+
+
+ {{ h }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/hrm/EmployeePicker.vue b/components/hrm/EmployeePicker.vue
new file mode 100644
index 0000000..400bf96
--- /dev/null
+++ b/components/hrm/EmployeePicker.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+ {{ getName(item) }}
+ {{ getDept(item) }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/hrm/GlobalCityPicker.vue b/components/hrm/GlobalCityPicker.vue
new file mode 100644
index 0000000..6964899
--- /dev/null
+++ b/components/hrm/GlobalCityPicker.vue
@@ -0,0 +1,152 @@
+
+
+
+
+
+ {{ currentPath }}
+
+
+
+
+ {{ item.name }}
+
+
+
+
+ {{ item.name }}
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/hrm/RequestForm.vue b/components/hrm/RequestForm.vue
new file mode 100644
index 0000000..675f616
--- /dev/null
+++ b/components/hrm/RequestForm.vue
@@ -0,0 +1,166 @@
+
+
+
+
+ {{ section.title }}
+
+ {{ field.label }}*
+ onSelect(field.key, field.options, e)">{{ form[field.key] || field.placeholder }}
+ {{ formatDateTime(field.key) || field.placeholder }}
+ {{ form[field.key] || field.placeholder }}
+ {{ computedFieldText(field.key) || field.placeholder || '—' }}
+
+
+
+ {{ field.placeholder || '点击上传文件' }}
+ 支持文件上传,点击后选择文件
+
+
+
+ {{ file.originalName || file.fileName || file.url }}
+ 删除
+
+
+
+
+
+
+
+
+ 审批方式审批人*{{ assigneeLabel || '点击选择审批人' }}
+ 抄送抄送人{{ ccUsers.length ? `已选择 ${ccUsers.length} 人` : '点击选择抄送人' }}
+ 提交
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/x-coupon/x-coupon.vue b/components/x-coupon/x-coupon.vue
new file mode 100644
index 0000000..2e776d6
--- /dev/null
+++ b/components/x-coupon/x-coupon.vue
@@ -0,0 +1,316 @@
+
+
+
+
+
+ {{ currency }}
+ {{ value }}
+ 折
+
+ {{ condition }}
+
+
+
+
+
+
+
+
+
+
+ {{ title }}
+ {{ desc }}
+ {{ validity }}
+
+
+
+
+ {{ btnText }}
+
+
+
+
+
+
+ {{ statusText }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/x-coupon/╬─╡╡.md b/components/x-coupon/╬─╡╡.md
new file mode 100644
index 0000000..9497e2c
--- /dev/null
+++ b/components/x-coupon/╬─╡╡.md
@@ -0,0 +1,110 @@
+# x-coupon 优惠券组件
+
+一个可复用的优惠券展示组件,支持金额券/折扣券、状态展示、按钮插槽、自定义主题色与缺口背景色。
+
+## 引入方式
+
+在页面中手动引入:
+
+```vue
+
+```
+
+## 基本用法
+
+```vue
+
+
+
+
+
+
+
+```
+
+## 折扣券
+
+```vue
+
+```
+
+## 状态展示
+
+```vue
+
+
+```
+
+## 自定义按钮(插槽)
+
+```vue
+
+
+
+ 去使用
+
+
+
+```
+
+## Props
+
+| 参数 | 说明 | 类型 | 默认值 |
+| --- | --- | --- | --- |
+| type | 券类型:`money` 金额券 / `discount` 折扣券 | String | `money` |
+| value | 面值(金额或折扣值) | Number \| String | 必填 |
+| currency | 金额币种符号(仅 `money` 时展示) | String | `¥` |
+| condition | 使用条件文案 | String | `''` |
+| title | 标题 | String | `优惠券` |
+| desc | 描述文案 | String | `''` |
+| validity | 有效期文案 | String | `''` |
+| color | 左侧主题色(也用于默认按钮色) | String | `#ff5a5f` |
+| backgroundColor | 卡券背景色 | String | `#ffffff` |
+| cutoutColor | 缺口圆背景色(通常传页面背景色;需要透明可传 `transparent`) | String | `#f5f5f5` |
+| disabled | 是否禁用点击(禁用时不会触发 click) | Boolean | `false` |
+| status | 状态:`available` / `used` / `expired` | String | `available` |
+| btnText | 默认按钮文字(未使用 action 插槽时) | String | `立即使用` |
+| showBtn | 是否显示默认按钮 | Boolean | `true` |
+
+## Events
+
+| 事件 | 说明 | 回调参数 |
+| --- | --- | --- |
+| click | 点击卡券(仅 `status=available` 且未禁用时触发) | 无 |
+
+## Slots
+
+| 名称 | 说明 |
+| --- | --- |
+| action | 右侧操作区域插槽(自定义按钮/图标等) |
+
diff --git a/components/x-native-uploader/README.md b/components/x-native-uploader/README.md
new file mode 100644
index 0000000..5e8e8bd
--- /dev/null
+++ b/components/x-native-uploader/README.md
@@ -0,0 +1,149 @@
+# x-native-uploader 原生文件上传组件
+
+`x-native-uploader` 是一个跨平台的文件上传组件,专为解决 UniApp 在 App 端文件选择与上传的痛点而设计。它集成了 Native.js 的能力,支持在 Android 和 iOS 上调用原生文件选择器,同时兼容 H5 和小程序平台。
+
+## 功能特性
+
+* 📱 **原生体验**: App 端使用 Native.js 调用系统原生文件选择器 (Intent / UIDocumentPicker),支持选择任意类型文件。
+* 🚀 **高性能上传**: App 端使用 `plus.uploader` 实现原生上传,支持后台传输、大文件上传,比 WebView AJAX 更稳定。
+* 🔄 **跨平台兼容**: 自动降级处理,H5 使用 `uni.chooseFile`,小程序使用 `uni.chooseMessageFile`,一套代码多端运行。
+* 📦 **多选支持**: 支持一次选择多个文件进行批量上传 (Android/iOS/H5/MP)。
+* 🛠️ **灵活配置**: 支持自定义上传 URL、Header、FormData 以及自定义触发按钮 UI。
+* 📄 **PDF 及其他文件支持**: 完美处理 Android 平台的 `content://` URI 文件路径,确保 PDF、Word 等各种文档类型的正确上传。
+
+## 引入组件
+
+```javascript
+import xNativeUploader from '@/components/x-native-uploader/x-native-uploader.vue';
+
+export default {
+ components: {
+ xNativeUploader
+ }
+}
+```
+
+## 代码演示
+
+### 基础用法 (单选)
+
+默认点击按钮选择单个文件并自动上传。
+
+```html
+
+```
+
+### 多文件上传
+
+设置 `multiple` 属性开启多选,`limit` 控制最大选择数量。
+
+```html
+
+
+ 点击批量上传文件
+
+
+```
+
+### PDF 文件上传(Android 兼容)
+
+设置 `fileType="all"` 即可支持上传 PDF 文件,组件会自动处理 Android 平台的 `content://` URI 路径:
+
+```html
+
+
+ 上传 PDF 文件
+
+
+```
+
+### 自定义触发按钮
+
+通过默认插槽 (slot) 自定义上传按钮样式。
+
+```html
+
+
+
+```
+
+## API
+
+### Props
+
+| 参数 | 说明 | 类型 | 默认值 |
+| --- | --- | --- | --- |
+| `url` | 上传接口地址 (必填) | `String` | - |
+| `name` | 上传文件的字段名 | `String` | `'file'` |
+| `header` | 请求头对象 | `Object` | `{}` |
+| `formData` | 额外的上传参数 | `Object` | `{}` |
+| `fileType` | 文件选择类型,可选值: `image`, `video`, `all` | `String` | `'image'` |
+| `multiple` | 是否开启多选 | `Boolean` | `false` |
+| `limit` | 最大选择文件数量 (多选模式下有效) | `Number` | `9` |
+| `autoUpload` | 选择文件后是否自动上传 | `Boolean` | `true` |
+
+### Events
+
+| 事件名 | 说明 | 回调参数 |
+| --- | --- | --- |
+| `success` | 上传成功时触发 | `{ file: FileObj, response: String }` |
+| `fail` | 上传失败时触发 | `{ file: FileObj, error: Any }` |
+| `progress` | 上传进度更新时触发 | `{ file: FileObj, progress: Number }` |
+
+### FileObj 数据结构
+
+```javascript
+{
+ path: "...", // 文件本地路径
+ name: "...", // 文件名
+ progress: 100, // 上传进度 (0-100)
+ status: "success", // 状态: pending, uploading, success, error
+ statusText: "..." // 状态描述文本
+}
+```
+
+## 注意事项
+
+1. **Android 权限**: App 端需要 `READ_EXTERNAL_STORAGE` 和 `WRITE_EXTERNAL_STORAGE` 权限。
+2. **iOS 配置**: iOS 端无需特殊配置,使用 `UIDocumentPickerViewController`。
+3. **H5 跨域**: 确保上传接口支持 CORS 跨域请求。
+4. **小程序**: 微信小程序使用 `uni.chooseMessageFile`,支持从聊天记录中选择文件。
+5. **Android content:// URI 处理**: 组件已自动处理 Android 系统返回的 `content://` 格式 URI,包括对 `raw: `前缀的路径解析,确保 PDF、Word、Excel 等文件能够正确上传。
+6. **文件格式支持**: 当 `fileType="all"` 时,支持选择任意类型文件,但上传前请确保服务器端支持该文件格式。
+
+## 常见问题
+
+### Q: 为什么在 Android 上选择 PDF 文件后上传失败?
+
+**A**: 这是因为 Android 系统返回的文件路径是 `content://` 格式的 URI,而不是真实的本地文件路径。本组件已经内置了对这种格式的自动解析处理,确保文件能够正确上传。如果仍然遇到问题,请检查:
+1. 是否已经正确配置了 Android 权限
+2. 文件路径是否被正确解析
+3. 服务器端是否支持接收该文件格式
+
+### Q: 如何限制只能上传特定类型的文件?
+
+**A**: 可以通过设置 `fileType` 属性来限制文件类型:
+- `fileType="image"` - 仅允许选择图片
+- `fileType="video"` - 仅允许选择视频
+- `fileType="all"` - 允许选择所有类型文件
+
+如果需要更精确的控制,可以结合使用 `accept` 属性,例如 `accept="application/pdf"`。
diff --git a/components/x-native-uploader/x-file-picker.vue b/components/x-native-uploader/x-file-picker.vue
new file mode 100644
index 0000000..e10391e
--- /dev/null
+++ b/components/x-native-uploader/x-file-picker.vue
@@ -0,0 +1,730 @@
+
+
+
+
+
+
+
+
+
+
+ 加载中...
+ 空文件夹
+
+
+
+ 📁
+ 📄
+
+
+ {{ item.name }}
+ {{ formatSize(item.size) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/x-native-uploader/x-native-uploader.vue b/components/x-native-uploader/x-native-uploader.vue
new file mode 100644
index 0000000..034b351
--- /dev/null
+++ b/components/x-native-uploader/x-native-uploader.vue
@@ -0,0 +1,532 @@
+
+
+
+
+
+ +
+ 选择文件并上传
+
+
+
+
+
+
+
+
+ {{ file.name }}
+
+ {{ file.statusText }}
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+