diff --git a/.gitignore b/.gitignore index 41488fcc3c7fd9cd8143ca5f55f233339ee353ce..6daa1949c9a9fb59600d3e5f9b048b8d3f932800 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ dist .vs docs/* .vscode +.codex-staging/ \ No newline at end of file diff --git a/.workflow/vue-build-pipeline.yml b/.workflow/vue-build-pipeline.yml new file mode 100644 index 0000000000000000000000000000000000000000..89d9ec59c8aba675f87321b951cbc06c1ca269a9 --- /dev/null +++ b/.workflow/vue-build-pipeline.yml @@ -0,0 +1,110 @@ +version: '1.0' +name: vue-build-pipeline +displayName: Vue3项目构建流水线 +triggers: + push: + branches: + - Main + - Dev + pr: + branches: + - Main + manual: + +variables: + global: + - COUNTER_DIR: '/opt/gitee-counters' + +stages: + - stage: build + name: build + displayName: 构建与打包 + strategy: naturally + trigger: auto + steps: + - step: build@nodejs + name: nodejs_build + displayName: Node.js构建 + nodeVersion: 18.20.4 + commands: + - | + # 检查Node.js环境 + echo "使用系统Node.js:" + echo "Node版本: $(node --version)" + echo "npm版本: $(npm --version)" + - | + # 生成构建版本号 + NODE_PATH=$(which node) + NPM_PATH=$(which npm) + + # 从package.json获取基础版本 + BASE_VERSION=$($NODE_PATH -p "require('./package.json').version" | cut -d. -f1-2) + + # 生成日期 + BUILD_DATE=$(date +'%Y%m%d') + + # 计数器目录 + mkdir -p $COUNTER_DIR + + # 1. 总构建次数计数器 + TOTAL_COUNTER_FILE="$COUNTER_DIR/total-builds.txt" + if [ ! -f "$TOTAL_COUNTER_FILE" ]; then + echo "1" > "$TOTAL_COUNTER_FILE" + fi + TOTAL_BUILDS=$(cat "$TOTAL_COUNTER_FILE") + + # 2. 当天构建次数计数器 + DAILY_COUNTER_FILE="$COUNTER_DIR/daily-builds-$BUILD_DATE.txt" + if [ ! -f "$DAILY_COUNTER_FILE" ]; then + echo "1" > "$DAILY_COUNTER_FILE" + fi + DAILY_BUILDS=$(cat "$DAILY_COUNTER_FILE") + + # 组合成新版本号: v1.0.{count}-yyyyMMdd.{count} + NEW_VERSION="v${BASE_VERSION}.${TOTAL_BUILDS}-${BUILD_DATE}.${DAILY_BUILDS}" + + # 更新package.json + $NPM_PATH version $NEW_VERSION --no-git-tag-version + + # 递增计数器 + echo $((TOTAL_BUILDS + 1)) > "$TOTAL_COUNTER_FILE" + echo $((DAILY_BUILDS + 1)) > "$DAILY_COUNTER_FILE" + + echo "构建版本号: $NEW_VERSION" + echo "NEW_VERSION=$NEW_VERSION" >> GITEE_PARAMS + echo "总构建次数: $TOTAL_BUILDS" + echo "当天构建次数: $DAILY_BUILDS" + - | + # 安装依赖 + npm ci + - | + # 构建项目 + npm run build + - | + # 创建tar压缩包 + TIMESTAMP=$(date +'%Y%m%d%H%M%S') + TAR_NAME="vue-app-${NEW_VERSION}-${TIMESTAMP}.tar.gz" + + tar -czf "${TAR_NAME}" -C ./dist . + + echo "TAR_FILE=${TAR_NAME}" >> GITEE_PARAMS + echo "Created archive: ${TAR_NAME}" + ls -lh "${TAR_NAME}" + artifacts: + - name: build_artifact + path: + - ./*.tar.gz + + - stage: publish + name: publish + displayName: 发布制品 + strategy: naturally + trigger: auto + steps: + - step: publish@artifacts + name: upload_artifact + displayName: 上传构建产物 + artifacts: + - name: vue-app-package + path: + - ./*.tar.gz diff --git a/README.en.md b/README.en.md index 343029efa32138976336ddee24f095f16a7d3aef..29e0988550cd206c94b1637414c2a1e3886e7268 100644 --- a/README.en.md +++ b/README.en.md @@ -38,6 +38,16 @@ In today's rapidly developing hotel industry, with the increase in daily hotel work, it has become difficult to handle with manpower alone. Some cumbersome data may also cause some losses to the hotel due to human errors, hence the need for a management software that can assist in the internal management of the hotel. +# :shield: Authentication & Security Mechanism: + +This system implements **Dual-Token JWT Authentication**, providing secure and reliable identity verification: + +- **Access Token** (15 minutes):Used for API request authentication, stored in sessionStorage +- **Refresh Token** (7 days):Used for automatic token refresh, securely managed in HttpOnly Cookie to prevent XSS attacks +- **Automatic Renewal**:Tokens are automatically refreshed when expired, no need for users to re-login +- **Token Rotation**:New tokens are generated on each refresh, old tokens automatically expire, enhancing security +- **Multi-User Support**:All user types (employees, administrators, etc.) support dual-token authentication + # :mag_right: System Development Environment: Operating System: Windows 11(x64) @@ -83,7 +93,7 @@ topsky-hotel-manager-system-vue3 | Human Resource Management | Staff Management | | | | | | | | Material Management | Goods Management | | | | | | | | Operation Management | Operation Log | Request Log | | | | | | -| System Management | Administrator Management | Menu Management | Role Management | Administrator Type Management | | | | +| System Management | Administrator Management | Menu Management | Role Management | Administrator Type Management | Quartz Job List | | | # :family: Project Authors: @@ -97,18 +107,20 @@ topsky-hotel-manager-system-vue3 # Project Review Image: -![主页](Review-Images/home.png) +![home page](review_images/home.png) + +![login page](review_images/login.png) -![员工列表页](Review-Images/staff-list-page.png) +![dash board](review_images/dashboard.png) -![员工详情页](Review-Images/staff-detail-page.png) +![dark mode](review_images/darkmode.png) -![员工详情页(英文版)](Review-Images/staff-detail-page-english-verison.png) +![staff list page](review_images/staff-list-page.png) -![登录页](Review-Images/login.png) +![staff detail page](review_images/staff-detail-page.png) -![员工打卡记录页](Review-Images/staff-check-page.png) +![staff detail page(ver. Engish)](review_images/staff-detail-page-english-verison.png) -![权限插图](Review-Images/account-role-permission.png) +![role permission page](review_images/role-permission.png) [![java-and-net/topsky-hotel-management-system-vue3](https://gitee.com/java-and-net/topsky-hotel-management-system-vue3/widgets/widget_card.svg?colors=4183c4,ffffff,ffffff,e3e9ed,666666,9b9b9b)](https://gitee.com/java-and-net/topsky-hotel-management-system-vue3) diff --git a/README.md b/README.md index 16f1b8d433b6604382316d8f8144903fac9f48c6..6a5f926b3fa0435114052e83fc00ddce1215f1e6 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,16 @@ 在现如今发展迅速的酒店行业,随着酒店的日常工作增加,已经很难用人工去进行处理,一些繁琐的数据也可能会因为人工的失误而造成酒店的一些损失,因此很需要一款可以协助酒店进行内部管理的管理软件。 +# :shield: 认证与安全机制: + +本系统采用**双Token JWT认证机制**,提供更加安全可靠的身份验证: + +- **Access Token**(15分钟):用于API请求认证,存储在sessionStorage中 +- **Refresh Token**(7天):用于自动刷新过期Token,由HttpOnly Cookie安全管理,防止XSS攻击 +- **自动续期**:Token过期时自动刷新,用户无需重新登录 +- **Token轮换**:每次刷新生成新Token,旧Token自动失效,提升安全性 +- **全用户支持**:员工、管理员等所有用户类型均支持双Token认证 + # :mag_right: 系统开发环境: 操作系统:Windows 11(x64) @@ -71,19 +81,19 @@ topsky-hotel-manager-system-vue3 # :books: 系统功能模块汇总: -| 功能汇总 | | | | | | | | -| ------------ | ------------ | ---------- | ------------ | -------------- | ------------ | -------- | ---------------- | -| 主页 | 仪表盘 | | | | | | | -| 基础信息管理 | 职位管理 | 民族管理 | 学历管理 | 部门管理 | 公告类型管理 | 证件管理 | 宣传联动内容管理 | -| 财务信息 | 内部资产管理 | | | | | | | -| 水电信息管理 | 水电信息 | | | | | | | -| 监管统计管理 | 监管情况 | | | | | | | -| 客房信息管理 | 预约管理 | 房态图一览 | 房间管理 | 客房配置 | | | | -| 客户管理 | 会员等级规则 | 客户管理 | 客户消费记录 | 客户类型管理 | | | | -| 酒店人事管理 | 员工管理 | | | | | | | -| 酒店物资管理 | 商品管理 | | | | | | | -| 操作行为管理 | 操作日志 | 请求日志 | | | | | | -| 系统管理 | 管理员管理 | 菜单管理 | 角色管理 | 管理员类型管理 | | | | +| 功能汇总 | | | | | | | | +| ------------ | ------------ | ---------- | ------------ | -------------- | -------------- | -------- | ---------------- | +| 主页 | 仪表盘 | 我的 | | | | | | +| 基础信息管理 | 职位管理 | 民族管理 | 学历管理 | 部门管理 | 公告类型管理 | 证件管理 | 宣传联动内容管理 | +| 财务信息 | 内部资产管理 | | | | | | | +| 水电信息管理 | 水电信息 | | | | | | | +| 监管统计管理 | 监管情况 | | | | | | | +| 客房信息管理 | 预约管理 | 房态图一览 | 房间管理 | 客房配置 | | | | +| 客户管理 | 会员等级规则 | 客户管理 | 客户消费记录 | 客户类型管理 | | | | +| 酒店人事管理 | 员工管理 | | | | | | | +| 酒店物资管理 | 商品管理 | | | | | | | +| 操作行为管理 | 操作日志 | 请求日志 | | | | | | +| 系统管理 | 管理员管理 | 菜单管理 | 角色管理 | 管理员类型管理 | Quartz任务列表 | | | # :family: 项目作者: @@ -95,20 +105,26 @@ topsky-hotel-manager-system-vue3 **2、下载并安装Microsoft Visual Studio Code,并通过下载Zip包解压,在VS Code的【文件】——>【打开文件夹】,在弹出的对话框里选择刚刚Zip包解压后的文件夹,点击【打开】按钮即可。** +**3、打开 .env.development 并填写API服务器地址。** + +**4、新建终端并输入 npm install,待命令跑完后,再输入 npm run dev 即可运行起来。** + # 项目效果图: -![主页](Review-Images/home.png) +![主页](review_images/home.png) + +![登录页](review_images/login.png) -![员工列表页](Review-Images/staff-list-page.png) +![仪表盘](review_images/dashboard.png) -![员工详情页](Review-Images/staff-detail-page.png) +![深色模式](review_images/darkmode.png) -![员工详情页(英文版)](Review-Images/staff-detail-page-english-verison.png) +![员工列表页](review_images/staff-list-page.png) -![登录页](Review-Images/login.png) +![员工详情页](review_images/staff-detail-page.png) -![员工打卡记录页](Review-Images/staff-check-page.png) +![员工详情页(英文版)](review_images/staff-detail-page-english-verison.png) -![权限插图](Review-Images/account-role-permission.png) +![权限插图](review_images/role-permission.png) [![java-and-net/topsky-hotel-management-system-vue3](https://gitee.com/java-and-net/topsky-hotel-management-system-vue3/widgets/widget_card.svg?colors=4183c4,ffffff,ffffff,e3e9ed,666666,9b9b9b)](https://gitee.com/java-and-net/topsky-hotel-management-system-vue3) diff --git a/Review-Images/account-role-permission.png b/Review-Images/account-role-permission.png deleted file mode 100644 index 51a95b5f699e3c803b796cc396ae3bc23144258d..0000000000000000000000000000000000000000 Binary files a/Review-Images/account-role-permission.png and /dev/null differ diff --git a/Review-Images/home.png b/Review-Images/home.png deleted file mode 100644 index d23195f6b01efc0139ab75a4604946ca025b2f44..0000000000000000000000000000000000000000 Binary files a/Review-Images/home.png and /dev/null differ diff --git a/Review-Images/login.png b/Review-Images/login.png deleted file mode 100644 index 9b60956ceee7b0fabe3124f770bd17a9f76b9d94..0000000000000000000000000000000000000000 Binary files a/Review-Images/login.png and /dev/null differ diff --git a/Review-Images/permission-detail.png b/Review-Images/permission-detail.png deleted file mode 100644 index 10fe29fd2344af514173c6572d0b88db22ca71f1..0000000000000000000000000000000000000000 Binary files a/Review-Images/permission-detail.png and /dev/null differ diff --git a/Review-Images/staff-check-page.png b/Review-Images/staff-check-page.png deleted file mode 100644 index c3fd055645c5a8b3e2daa05fe4342115487339a3..0000000000000000000000000000000000000000 Binary files a/Review-Images/staff-check-page.png and /dev/null differ diff --git a/Review-Images/staff-detail-page-english-verison.png b/Review-Images/staff-detail-page-english-verison.png deleted file mode 100644 index d97008f11ad88d44c0249854e50a095bb3e2a4b6..0000000000000000000000000000000000000000 Binary files a/Review-Images/staff-detail-page-english-verison.png and /dev/null differ diff --git a/Review-Images/staff-detail-page.png b/Review-Images/staff-detail-page.png deleted file mode 100644 index 31d46c4b9cbc659ef994e6e1905bae1568b1b7ff..0000000000000000000000000000000000000000 Binary files a/Review-Images/staff-detail-page.png and /dev/null differ diff --git a/Review-Images/staff-list-page.png b/Review-Images/staff-list-page.png deleted file mode 100644 index e7e9dd0072a8460e3e51753bba88ff881c858fe6..0000000000000000000000000000000000000000 Binary files a/Review-Images/staff-list-page.png and /dev/null differ diff --git a/components.d.ts b/components.d.ts index 5135cc66cba7d945284cbe20cf7fcd21764d990e..e79cb1e8cdf8086cf21e0100d1c74117d4c54db4 100644 --- a/components.d.ts +++ b/components.d.ts @@ -10,22 +10,28 @@ declare module 'vue' { export interface GlobalComponents { AAlert: typeof import('ant-design-vue/es')['Alert'] AAvatar: typeof import('ant-design-vue/es')['Avatar'] + ABadge: typeof import('ant-design-vue/es')['Badge'] AButton: typeof import('ant-design-vue/es')['Button'] ACard: typeof import('ant-design-vue/es')['Card'] + ACascader: typeof import('ant-design-vue/es')['Cascader'] ACheckbox: typeof import('ant-design-vue/es')['Checkbox'] ACheckboxGroup: typeof import('ant-design-vue/es')['CheckboxGroup'] ACol: typeof import('ant-design-vue/es')['Col'] ACollapse: typeof import('ant-design-vue/es')['Collapse'] ACollapsePanel: typeof import('ant-design-vue/es')['CollapsePanel'] + ActionFormModal: typeof import('./src/components/common/ActionFormModal.vue')['default'] ADatePicker: typeof import('ant-design-vue/es')['DatePicker'] ADescriptions: typeof import('ant-design-vue/es')['Descriptions'] ADescriptionsItem: typeof import('ant-design-vue/es')['DescriptionsItem'] ADivider: typeof import('ant-design-vue/es')['Divider'] ADropdown: typeof import('ant-design-vue/es')['Dropdown'] AEmpty: typeof import('ant-design-vue/es')['Empty'] + AFlex: typeof import('ant-design-vue/es')['Flex'] AForm: typeof import('ant-design-vue/es')['Form'] AFormItem: typeof import('ant-design-vue/es')['FormItem'] + AFormItemRest: typeof import('ant-design-vue/es')['FormItemRest'] AInput: typeof import('ant-design-vue/es')['Input'] + AInputGroup: typeof import('ant-design-vue/es')['InputGroup'] AInputNumber: typeof import('ant-design-vue/es')['InputNumber'] AInputPassword: typeof import('ant-design-vue/es')['InputPassword'] ALayout: typeof import('ant-design-vue/es')['Layout'] @@ -48,6 +54,7 @@ declare module 'vue' { ARangePicker: typeof import('ant-design-vue/es')['RangePicker'] AResult: typeof import('ant-design-vue/es')['Result'] ARow: typeof import('ant-design-vue/es')['Row'] + ArrowLeftOutlined: typeof import('@ant-design/icons-vue')['ArrowLeftOutlined'] ASegmented: typeof import('ant-design-vue/es')['Segmented'] ASelect: typeof import('ant-design-vue/es')['Select'] ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] @@ -56,6 +63,7 @@ declare module 'vue' { ASpin: typeof import('ant-design-vue/es')['Spin'] AStatistic: typeof import('ant-design-vue/es')['Statistic'] ASubMenu: typeof import('ant-design-vue/es')['SubMenu'] + ASwitch: typeof import('ant-design-vue/es')['Switch'] ATable: typeof import('ant-design-vue/es')['Table'] ATabPane: typeof import('ant-design-vue/es')['TabPane'] ATabs: typeof import('ant-design-vue/es')['Tabs'] @@ -64,13 +72,19 @@ declare module 'vue' { ATimeline: typeof import('ant-design-vue/es')['Timeline'] ATimelineItem: typeof import('ant-design-vue/es')['TimelineItem'] ATooltip: typeof import('ant-design-vue/es')['Tooltip'] + ATree: typeof import('ant-design-vue/es')['Tree'] ATypographyParagraph: typeof import('ant-design-vue/es')['TypographyParagraph'] AUpload: typeof import('ant-design-vue/es')['Upload'] CaretRightOutlined: typeof import('@ant-design/icons-vue')['CaretRightOutlined'] CarryOutOutlined: typeof import('@ant-design/icons-vue')['CarryOutOutlined'] + CheckCircleOutlined: typeof import('@ant-design/icons-vue')['CheckCircleOutlined'] DeleteOutlined: typeof import('@ant-design/icons-vue')['DeleteOutlined'] + DownloadOutlined: typeof import('@ant-design/icons-vue')['DownloadOutlined'] + DownOutlined: typeof import('@ant-design/icons-vue')['DownOutlined'] EditOutlined: typeof import('@ant-design/icons-vue')['EditOutlined'] + ExclamationCircleOutlined: typeof import('@ant-design/icons-vue')['ExclamationCircleOutlined'] EyeOutlined: typeof import('@ant-design/icons-vue')['EyeOutlined'] + GenericDialog: typeof import('./src/components/common/GenericDialog.vue')['default'] GlobalNotification: typeof import('./src/components/GlobalNotification.vue')['default'] GlobalOutlined: typeof import('@ant-design/icons-vue')['GlobalOutlined'] HomeOutlined: typeof import('@ant-design/icons-vue')['HomeOutlined'] @@ -79,7 +93,11 @@ declare module 'vue' { LinkOutlined: typeof import('@ant-design/icons-vue')['LinkOutlined'] ListFilter: typeof import('./src/components/common/ListFilter.vue')['default'] LoadingOutlined: typeof import('@ant-design/icons-vue')['LoadingOutlined'] + MenuFoldOutlined: typeof import('@ant-design/icons-vue')['MenuFoldOutlined'] + MenuUnfoldOutlined: typeof import('@ant-design/icons-vue')['MenuUnfoldOutlined'] MoneyCollectOutlined: typeof import('@ant-design/icons-vue')['MoneyCollectOutlined'] + MoonOutlined: typeof import('@ant-design/icons-vue')['MoonOutlined'] + PageTabBar: typeof import('./src/components/common/PageTabBar.vue')['default'] PlusOutlined: typeof import('@ant-design/icons-vue')['PlusOutlined'] ReloadOutlined: typeof import('@ant-design/icons-vue')['ReloadOutlined'] RetweetOutlined: typeof import('@ant-design/icons-vue')['RetweetOutlined'] @@ -89,11 +107,16 @@ declare module 'vue' { SafetyOutlined: typeof import('@ant-design/icons-vue')['SafetyOutlined'] SaveOutlined: typeof import('@ant-design/icons-vue')['SaveOutlined'] SearchOutlined: typeof import('@ant-design/icons-vue')['SearchOutlined'] + ShoppingOutlined: typeof import('@ant-design/icons-vue')['ShoppingOutlined'] + StarFilled: typeof import('@ant-design/icons-vue')['StarFilled'] + StarOutlined: typeof import('@ant-design/icons-vue')['StarOutlined'] StopOutlined: typeof import('@ant-design/icons-vue')['StopOutlined'] + SunOutlined: typeof import('@ant-design/icons-vue')['SunOutlined'] SwapOutlined: typeof import('@ant-design/icons-vue')['SwapOutlined'] SycnOutlined: typeof import('@ant-design/icons-vue')['SycnOutlined'] SyncOutlined: typeof import('@ant-design/icons-vue')['SyncOutlined'] UndoOutlined: typeof import('@ant-design/icons-vue')['UndoOutlined'] UserOutlined: typeof import('@ant-design/icons-vue')['UserOutlined'] + VerticalAlignTopOutlined: typeof import('@ant-design/icons-vue')['VerticalAlignTopOutlined'] } } diff --git a/index.html b/index.html index a0f4cd90e6336cafa884c675d8992008d01be323..5c5e604965d652c4e93ffb1da42707c77280685e 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,7 @@ - + TopSky Hotel Management System diff --git a/package-lock.json b/package-lock.json index 35efb4785bd8142d860b28a435849b9a8569a096..79d34fd3244a45dec18d3090a471f89f5c18de9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,13 @@ "name": "topsky-hotel-management-system-vue3", "version": "1.0.0", "dependencies": { - "@akashrajpurohit/snowflake-id": "^2.0.0", "@vueuse/core": "^13.1.0", "ant-design-vue": "^4.2.6", + "area-data": "^5.0.6", "axios": "^1.13.2", "dayjs": "^1.11.10", "echarts": "^5.6.0", + "element-china-area-data": "^5.0.2", "js-cookie": "^3.0.5", "jwt-decode": "^4.0.0", "less": "^4.2.2", @@ -37,12 +38,6 @@ "vite-plugin-commonjs": "^0.10.4" } }, - "node_modules/@akashrajpurohit/snowflake-id": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/@akashrajpurohit/snowflake-id/-/snowflake-id-2.0.0.tgz", - "integrity": "sha512-9En2OKHBOO39vztHUxHUh/Xh6wTI1lEQ9c0ivr7QX3ozaKgs770TRJrgtBbQBeLLbMoLGG3fBk3otAlSY440pw==", - "license": "MIT" - }, "node_modules/@ant-design/colors": { "version": "6.0.0", "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-6.0.0.tgz", @@ -90,12 +85,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "version": "7.29.2", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.6" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -105,18 +100,18 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "version": "7.29.2", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -148,9 +143,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", "cpu": [ "ppc64" ], @@ -165,9 +160,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", "cpu": [ "arm" ], @@ -182,9 +177,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", "cpu": [ "arm64" ], @@ -199,9 +194,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", "cpu": [ "x64" ], @@ -216,9 +211,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", "cpu": [ "arm64" ], @@ -233,9 +228,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", "cpu": [ "x64" ], @@ -250,9 +245,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", "cpu": [ "arm64" ], @@ -267,9 +262,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", "cpu": [ "x64" ], @@ -284,9 +279,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", "cpu": [ "arm" ], @@ -301,9 +296,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", "cpu": [ "arm64" ], @@ -318,9 +313,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", "cpu": [ "ia32" ], @@ -335,9 +330,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", "cpu": [ "loong64" ], @@ -352,9 +347,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", "cpu": [ "mips64el" ], @@ -369,9 +364,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", "cpu": [ "ppc64" ], @@ -386,9 +381,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", "cpu": [ "riscv64" ], @@ -403,9 +398,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", "cpu": [ "s390x" ], @@ -420,9 +415,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", "cpu": [ "x64" ], @@ -437,9 +432,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", "cpu": [ "arm64" ], @@ -454,9 +449,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", "cpu": [ "x64" ], @@ -471,9 +466,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", "cpu": [ "arm64" ], @@ -488,9 +483,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", "cpu": [ "x64" ], @@ -505,9 +500,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", "cpu": [ "arm64" ], @@ -522,9 +517,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", "cpu": [ "x64" ], @@ -539,9 +534,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", "cpu": [ "arm64" ], @@ -556,9 +551,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", "cpu": [ "ia32" ], @@ -573,9 +568,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", "cpu": [ "x64" ], @@ -846,16 +841,16 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.53", - "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", - "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", "dev": true, "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz", - "integrity": "sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.0.tgz", + "integrity": "sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==", "cpu": [ "arm" ], @@ -867,9 +862,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz", - "integrity": "sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.0.tgz", + "integrity": "sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==", "cpu": [ "arm64" ], @@ -881,9 +876,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz", - "integrity": "sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.0.tgz", + "integrity": "sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==", "cpu": [ "arm64" ], @@ -895,9 +890,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz", - "integrity": "sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.0.tgz", + "integrity": "sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==", "cpu": [ "x64" ], @@ -909,9 +904,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz", - "integrity": "sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.0.tgz", + "integrity": "sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==", "cpu": [ "arm64" ], @@ -923,9 +918,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz", - "integrity": "sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.0.tgz", + "integrity": "sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==", "cpu": [ "x64" ], @@ -937,9 +932,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz", - "integrity": "sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.0.tgz", + "integrity": "sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==", "cpu": [ "arm" ], @@ -951,9 +946,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz", - "integrity": "sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.0.tgz", + "integrity": "sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==", "cpu": [ "arm" ], @@ -965,9 +960,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz", - "integrity": "sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.0.tgz", + "integrity": "sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==", "cpu": [ "arm64" ], @@ -979,9 +974,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz", - "integrity": "sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.0.tgz", + "integrity": "sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==", "cpu": [ "arm64" ], @@ -993,9 +988,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz", - "integrity": "sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.0.tgz", + "integrity": "sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==", "cpu": [ "loong64" ], @@ -1007,9 +1002,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz", - "integrity": "sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.0.tgz", + "integrity": "sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==", "cpu": [ "loong64" ], @@ -1021,9 +1016,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz", - "integrity": "sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.0.tgz", + "integrity": "sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==", "cpu": [ "ppc64" ], @@ -1035,9 +1030,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz", - "integrity": "sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.0.tgz", + "integrity": "sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==", "cpu": [ "ppc64" ], @@ -1049,9 +1044,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz", - "integrity": "sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.0.tgz", + "integrity": "sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==", "cpu": [ "riscv64" ], @@ -1063,9 +1058,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz", - "integrity": "sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.0.tgz", + "integrity": "sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==", "cpu": [ "riscv64" ], @@ -1077,9 +1072,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz", - "integrity": "sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.0.tgz", + "integrity": "sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==", "cpu": [ "s390x" ], @@ -1091,9 +1086,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz", - "integrity": "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.0.tgz", + "integrity": "sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==", "cpu": [ "x64" ], @@ -1105,9 +1100,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz", - "integrity": "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.0.tgz", + "integrity": "sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==", "cpu": [ "x64" ], @@ -1119,9 +1114,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz", - "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.0.tgz", + "integrity": "sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==", "cpu": [ "x64" ], @@ -1133,9 +1128,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz", - "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.0.tgz", + "integrity": "sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==", "cpu": [ "arm64" ], @@ -1147,9 +1142,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz", - "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.0.tgz", + "integrity": "sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==", "cpu": [ "arm64" ], @@ -1161,9 +1156,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz", - "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.0.tgz", + "integrity": "sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==", "cpu": [ "ia32" ], @@ -1175,9 +1170,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz", - "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.0.tgz", + "integrity": "sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==", "cpu": [ "x64" ], @@ -1189,9 +1184,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz", - "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.0.tgz", + "integrity": "sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==", "cpu": [ "x64" ], @@ -1233,70 +1228,70 @@ "license": "ISC" }, "node_modules/@vitejs/plugin-vue": { - "version": "6.0.3", - "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.3.tgz", - "integrity": "sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==", + "version": "6.0.5", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.5.tgz", + "integrity": "sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==", "dev": true, "license": "MIT", "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.53" + "@rolldown/pluginutils": "1.0.0-rc.2" }, "engines": { "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "vue": "^3.2.25" } }, "node_modules/@vue/compiler-core": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.27.tgz", - "integrity": "sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==", + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.31.tgz", + "integrity": "sha512-k/ueL14aNIEy5Onf0OVzR8kiqF/WThgLdFhxwa4e/KF/0qe38IwIdofoSWBTvvxQOesaz6riAFAUaYjoF9fLLQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/shared": "3.5.27", - "entities": "^7.0.0", + "@babel/parser": "^7.29.2", + "@vue/shared": "3.5.31", + "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.27.tgz", - "integrity": "sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==", + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.31.tgz", + "integrity": "sha512-BMY/ozS/xxjYqRFL+tKdRpATJYDTTgWSo0+AJvJNg4ig+Hgb0dOsHPXvloHQ5hmlivUqw1Yt2pPIqp4e0v1GUw==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.27", - "@vue/shared": "3.5.27" + "@vue/compiler-core": "3.5.31", + "@vue/shared": "3.5.31" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.27.tgz", - "integrity": "sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==", + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.31.tgz", + "integrity": "sha512-M8wpPgR9UJ8MiRGjppvx9uWJfLV7A/T+/rL8s/y3QG3u0c2/YZgff3d6SuimKRIhcYnWg5fTfDMlz2E6seUW8Q==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/compiler-core": "3.5.27", - "@vue/compiler-dom": "3.5.27", - "@vue/compiler-ssr": "3.5.27", - "@vue/shared": "3.5.27", + "@babel/parser": "^7.29.2", + "@vue/compiler-core": "3.5.31", + "@vue/compiler-dom": "3.5.31", + "@vue/compiler-ssr": "3.5.31", + "@vue/shared": "3.5.31", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", - "postcss": "^8.5.6", + "postcss": "^8.5.8", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.27.tgz", - "integrity": "sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==", + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.31.tgz", + "integrity": "sha512-h0xIMxrt/LHOvJKMri+vdYT92BrK3HFLtDqq9Pr/lVVfE4IyKZKvWf0vJFW10Yr6nX02OR4MkJwI0c1HDa1hog==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.27", - "@vue/shared": "3.5.27" + "@vue/compiler-dom": "3.5.31", + "@vue/shared": "3.5.31" } }, "node_modules/@vue/devtools-api": { @@ -1321,53 +1316,53 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.27.tgz", - "integrity": "sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==", + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.31.tgz", + "integrity": "sha512-DtKXxk9E/KuVvt8VxWu+6Luc9I9ETNcqR1T1oW1gf02nXaZ1kuAx58oVu7uX9XxJR0iJCro6fqBLw9oSBELo5g==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.27" + "@vue/shared": "3.5.31" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.27.tgz", - "integrity": "sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==", + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.31.tgz", + "integrity": "sha512-AZPmIHXEAyhpkmN7aWlqjSfYynmkWlluDNPHMCZKFHH+lLtxP/30UJmoVhXmbDoP1Ng0jG0fyY2zCj1PnSSA6Q==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.27", - "@vue/shared": "3.5.27" + "@vue/reactivity": "3.5.31", + "@vue/shared": "3.5.31" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.27.tgz", - "integrity": "sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==", + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.31.tgz", + "integrity": "sha512-xQJsNRmGPeDCJq/u813tyonNgWBFjzfVkBwDREdEWndBnGdHLHgkwNBQxLtg4zDrzKTEcnikUy1UUNecb3lJ6g==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.27", - "@vue/runtime-core": "3.5.27", - "@vue/shared": "3.5.27", + "@vue/reactivity": "3.5.31", + "@vue/runtime-core": "3.5.31", + "@vue/shared": "3.5.31", "csstype": "^3.2.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.27.tgz", - "integrity": "sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==", + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.31.tgz", + "integrity": "sha512-GJuwRvMcdZX/CriUnyIIOGkx3rMV3H6sOu0JhdKbduaeCji6zb60iOGMY7tFoN24NfsUYoFBhshZtGxGpxO4iA==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.27", - "@vue/shared": "3.5.27" + "@vue/compiler-ssr": "3.5.31", + "@vue/shared": "3.5.31" }, "peerDependencies": { - "vue": "3.5.27" + "vue": "3.5.31" } }, "node_modules/@vue/shared": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.27.tgz", - "integrity": "sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==", + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.31.tgz", + "integrity": "sha512-nBxuiuS9Lj5bPkPbWogPUnjxxWpkRniX7e5UBQDWl6Fsf4roq9wwV+cR7ezQ4zXswNvPIlsdj1slcLB7XCsRAw==", "license": "MIT" }, "node_modules/@vueuse/core": { @@ -1409,9 +1404,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -1432,9 +1427,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -1528,6 +1523,12 @@ "node": ">= 8" } }, + "node_modules/area-data": { + "version": "5.0.6", + "resolved": "https://registry.npmmirror.com/area-data/-/area-data-5.0.6.tgz", + "integrity": "sha512-QxLoA+823xXKyhw5S3750I9TToki0OS42HU9ol3rCOsCXfkjtl8RtQ/eoj0cK0Levn4//oEM05FmMumfw/HIlg==", + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", @@ -1554,14 +1555,14 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmmirror.com/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "version": "1.14.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.14.0.tgz", + "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" } }, "node_modules/balanced-match": { @@ -1592,9 +1593,9 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -1662,6 +1663,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/china-area-data": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/china-area-data/-/china-area-data-5.0.1.tgz", + "integrity": "sha512-BQDPpiv5Nn+018ekcJK2oSD9PAD+E1bvXB0wgabc//dFVS/KvRqCgg0QOEUt3vBkx9XzB5a9BmkJCEZDBxVjVw==", + "license": "MIT" + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", @@ -1753,28 +1760,31 @@ "license": "MIT" }, "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", "dev": true, "license": "MIT" }, "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", "license": "MIT", "dependencies": { - "is-what": "^3.14.1" + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" }, "funding": { "url": "https://github.com/sponsors/mesqueeb" } }, "node_modules/core-js": { - "version": "3.48.0", - "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.48.0.tgz", - "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==", + "version": "3.49.0", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -1817,9 +1827,9 @@ "license": "MIT" }, "node_modules/dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "version": "1.11.20", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", "license": "MIT" }, "node_modules/debug": { @@ -1905,6 +1915,16 @@ "zrender": "5.6.1" } }, + "node_modules/element-china-area-data": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/element-china-area-data/-/element-china-area-data-5.0.2.tgz", + "integrity": "sha512-vLQuvOKJy/uiX7MRHEk3x/j09hipuIl6DJ/C4XFUG7D7Pj3O47sy+Y6aAArM6k9v8cD9UX6e+yz2S4J+IPnZ8g==", + "license": "MIT", + "dependencies": { + "china-area-data": "^5.0.1", + "lodash-es": "^4.17.15" + } + }, "node_modules/entities": { "version": "7.0.1", "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", @@ -1983,9 +2003,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1996,32 +2016,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" } }, "node_modules/escape-string-regexp": { @@ -2395,9 +2415,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -2779,10 +2799,16 @@ } }, "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "license": "MIT" + "version": "4.1.16", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } }, "node_modules/isexe": { "version": "2.0.0", @@ -2860,21 +2886,19 @@ } }, "node_modules/less": { - "version": "4.5.1", - "resolved": "https://registry.npmmirror.com/less/-/less-4.5.1.tgz", - "integrity": "sha512-UKgI3/KON4u6ngSsnDADsUERqhZknsVZbnuzlRZXLQCmfC/MDld42fTydUE9B+Mla1AL6SJ/Pp6SlEFi/AVGfw==", - "hasInstallScript": true, + "version": "4.6.4", + "resolved": "https://registry.npmmirror.com/less/-/less-4.6.4.tgz", + "integrity": "sha512-OJmO5+HxZLLw0RLzkqaNHzcgEAQG7C0y3aMbwtCzIUFZsLMNNq/1IdAdHEycQ58CwUO3jPTHmoN+tE5I7FQxNg==", "license": "Apache-2.0", "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" + "copy-anything": "^3.0.5", + "parse-node-version": "^1.0.1" }, "bin": { "lessc": "bin/lessc" }, "engines": { - "node": ">=14" + "node": ">=18" }, "optionalDependencies": { "errno": "^0.1.1", @@ -3066,9 +3090,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -3085,16 +3109,16 @@ "license": "MIT" }, "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", - "ufo": "^1.6.1" + "ufo": "^1.6.3" } }, "node_modules/mlly/node_modules/confbox": { @@ -3155,9 +3179,9 @@ "license": "MIT" }, "node_modules/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/needle/-/needle-3.5.0.tgz", + "integrity": "sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==", "license": "MIT", "optional": true, "dependencies": { @@ -3320,9 +3344,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -3355,9 +3379,9 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.8", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "funding": [ { "type": "opencollective", @@ -3436,10 +3460,13 @@ } }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/prr": { "version": "1.0.1", @@ -3554,9 +3581,9 @@ } }, "node_modules/rollup": { - "version": "4.56.0", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.56.0.tgz", - "integrity": "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==", + "version": "4.60.0", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.60.0.tgz", + "integrity": "sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3570,31 +3597,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.56.0", - "@rollup/rollup-android-arm64": "4.56.0", - "@rollup/rollup-darwin-arm64": "4.56.0", - "@rollup/rollup-darwin-x64": "4.56.0", - "@rollup/rollup-freebsd-arm64": "4.56.0", - "@rollup/rollup-freebsd-x64": "4.56.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.56.0", - "@rollup/rollup-linux-arm-musleabihf": "4.56.0", - "@rollup/rollup-linux-arm64-gnu": "4.56.0", - "@rollup/rollup-linux-arm64-musl": "4.56.0", - "@rollup/rollup-linux-loong64-gnu": "4.56.0", - "@rollup/rollup-linux-loong64-musl": "4.56.0", - "@rollup/rollup-linux-ppc64-gnu": "4.56.0", - "@rollup/rollup-linux-ppc64-musl": "4.56.0", - "@rollup/rollup-linux-riscv64-gnu": "4.56.0", - "@rollup/rollup-linux-riscv64-musl": "4.56.0", - "@rollup/rollup-linux-s390x-gnu": "4.56.0", - "@rollup/rollup-linux-x64-gnu": "4.56.0", - "@rollup/rollup-linux-x64-musl": "4.56.0", - "@rollup/rollup-openbsd-x64": "4.56.0", - "@rollup/rollup-openharmony-arm64": "4.56.0", - "@rollup/rollup-win32-arm64-msvc": "4.56.0", - "@rollup/rollup-win32-ia32-msvc": "4.56.0", - "@rollup/rollup-win32-x64-gnu": "4.56.0", - "@rollup/rollup-win32-x64-msvc": "4.56.0", + "@rollup/rollup-android-arm-eabi": "4.60.0", + "@rollup/rollup-android-arm64": "4.60.0", + "@rollup/rollup-darwin-arm64": "4.60.0", + "@rollup/rollup-darwin-x64": "4.60.0", + "@rollup/rollup-freebsd-arm64": "4.60.0", + "@rollup/rollup-freebsd-x64": "4.60.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.0", + "@rollup/rollup-linux-arm-musleabihf": "4.60.0", + "@rollup/rollup-linux-arm64-gnu": "4.60.0", + "@rollup/rollup-linux-arm64-musl": "4.60.0", + "@rollup/rollup-linux-loong64-gnu": "4.60.0", + "@rollup/rollup-linux-loong64-musl": "4.60.0", + "@rollup/rollup-linux-ppc64-gnu": "4.60.0", + "@rollup/rollup-linux-ppc64-musl": "4.60.0", + "@rollup/rollup-linux-riscv64-gnu": "4.60.0", + "@rollup/rollup-linux-riscv64-musl": "4.60.0", + "@rollup/rollup-linux-s390x-gnu": "4.60.0", + "@rollup/rollup-linux-x64-gnu": "4.60.0", + "@rollup/rollup-linux-x64-musl": "4.60.0", + "@rollup/rollup-openbsd-x64": "4.60.0", + "@rollup/rollup-openharmony-arm64": "4.60.0", + "@rollup/rollup-win32-arm64-msvc": "4.60.0", + "@rollup/rollup-win32-ia32-msvc": "4.60.0", + "@rollup/rollup-win32-x64-gnu": "4.60.0", + "@rollup/rollup-win32-x64-msvc": "4.60.0", "fsevents": "~2.3.2" } }, @@ -3630,9 +3657,9 @@ "optional": true }, "node_modules/sax": { - "version": "1.4.4", - "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.4.tgz", - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", "license": "BlueOak-1.0.0", "optional": true, "engines": { @@ -3649,9 +3676,9 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -3782,9 +3809,9 @@ } }, "node_modules/terser": { - "version": "5.46.0", - "resolved": "https://registry.npmmirror.com/terser/-/terser-5.46.0.tgz", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "version": "5.46.1", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.46.1.tgz", + "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3852,9 +3879,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -3950,9 +3977,9 @@ } }, "node_modules/unplugin-utils/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -3999,9 +4026,9 @@ } }, "node_modules/unplugin/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -4147,9 +4174,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -4160,16 +4187,16 @@ } }, "node_modules/vue": { - "version": "3.5.27", - "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.27.tgz", - "integrity": "sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==", + "version": "3.5.31", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.31.tgz", + "integrity": "sha512-iV/sU9SzOlmA/0tygSmjkEN6Jbs3nPoIPFhCMLD2STrjgOU8DX7ZtzMhg4ahVwf5Rp9KoFzcXeB1ZrVbLBp5/Q==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.27", - "@vue/compiler-sfc": "3.5.27", - "@vue/runtime-dom": "3.5.27", - "@vue/server-renderer": "3.5.27", - "@vue/shared": "3.5.27" + "@vue/compiler-dom": "3.5.31", + "@vue/compiler-sfc": "3.5.31", + "@vue/runtime-dom": "3.5.31", + "@vue/server-renderer": "3.5.31", + "@vue/shared": "3.5.31" }, "peerDependencies": { "typescript": "*" diff --git a/package.json b/package.json index 1af3b100c704a8886a3eca0a45d4fe9a1445b17c..87f1c5af4e7d960114125ed3f13993046d596172 100644 --- a/package.json +++ b/package.json @@ -12,12 +12,13 @@ "format": "prettier --write ." }, "dependencies": { - "@akashrajpurohit/snowflake-id": "^2.0.0", "@vueuse/core": "^13.1.0", "ant-design-vue": "^4.2.6", + "area-data": "^5.0.6", "axios": "^1.13.2", "dayjs": "^1.11.10", "echarts": "^5.6.0", + "element-china-area-data": "^5.0.2", "js-cookie": "^3.0.5", "jwt-decode": "^4.0.0", "less": "^4.2.2", diff --git a/review_images/darkmode.png b/review_images/darkmode.png new file mode 100644 index 0000000000000000000000000000000000000000..c25c3eb061378ad4cf120fd60472dff10f02aefd Binary files /dev/null and b/review_images/darkmode.png differ diff --git a/review_images/dashboard.png b/review_images/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..b60c17c1ef78d6546a3457221a130b0df2dc5485 Binary files /dev/null and b/review_images/dashboard.png differ diff --git a/review_images/home.png b/review_images/home.png new file mode 100644 index 0000000000000000000000000000000000000000..fae427424be7651e9abb368286acdfc0cf33d3eb Binary files /dev/null and b/review_images/home.png differ diff --git a/review_images/login.png b/review_images/login.png new file mode 100644 index 0000000000000000000000000000000000000000..cd4b15bc89b323ea86ebe97db2f78f316b7f7aa0 Binary files /dev/null and b/review_images/login.png differ diff --git a/review_images/personnel-center.png b/review_images/personnel-center.png new file mode 100644 index 0000000000000000000000000000000000000000..5a32b55fdcacd34a8edb3f184d01cccfa33e43ca Binary files /dev/null and b/review_images/personnel-center.png differ diff --git a/review_images/role-permission.png b/review_images/role-permission.png new file mode 100644 index 0000000000000000000000000000000000000000..bce03088319eaff43b74577c71457240b748a04e Binary files /dev/null and b/review_images/role-permission.png differ diff --git a/review_images/staff-detail-page-english-verison.png b/review_images/staff-detail-page-english-verison.png new file mode 100644 index 0000000000000000000000000000000000000000..87fe355accc5f3f6ae211a15e11aa48c9b8a5b1f Binary files /dev/null and b/review_images/staff-detail-page-english-verison.png differ diff --git a/review_images/staff-detail-page.png b/review_images/staff-detail-page.png new file mode 100644 index 0000000000000000000000000000000000000000..730977a670e955bc47ccfe59d030039d55eafb74 Binary files /dev/null and b/review_images/staff-detail-page.png differ diff --git a/review_images/staff-list-page.png b/review_images/staff-list-page.png new file mode 100644 index 0000000000000000000000000000000000000000..f226329b00d19996022fbbcb9368e3f13114220e Binary files /dev/null and b/review_images/staff-list-page.png differ diff --git a/src/App.vue b/src/App.vue index 4960fc7c1c1fa64ca7c126657680d2bf5e24036b..2638f598fd4a13ad260c732745d4c2edc6c71225 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,5 @@ + + diff --git a/src/components/common/PageTabBar.vue b/src/components/common/PageTabBar.vue new file mode 100644 index 0000000000000000000000000000000000000000..aafb94b68ee5a52d757251553bffbc3df7e562cc --- /dev/null +++ b/src/components/common/PageTabBar.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/src/composables/useModalForm.js b/src/composables/useModalForm.js new file mode 100644 index 0000000000000000000000000000000000000000..e95958d371b03fd195d24b6cefec830d100dc662 --- /dev/null +++ b/src/composables/useModalForm.js @@ -0,0 +1,45 @@ +import { computed, unref } from "vue"; + +const isEmptyValue = (value) => { + if (value === null || value === undefined) { + return true; + } + if (typeof value === "string") { + return value.trim() === ""; + } + if (Array.isArray(value)) { + return value.length === 0; + } + return false; +}; + +export default function useModalForm(form, rules) { + const resolvedRules = computed(() => { + const rawRules = unref(rules); + return rawRules || {}; + }); + + const requiredFields = computed(() => + Object.keys(resolvedRules.value).filter( + (field) => + Array.isArray(resolvedRules.value[field]) && + resolvedRules.value[field].some( + (rule) => rule && rule.required === true, + ), + ), + ); + + const isFormValid = computed(() => + requiredFields.value.every((field) => { + const value = form[field]; + if (value === 0) { + return true; + } + return !isEmptyValue(value); + }), + ); + + return { + isFormValid, + }; +} diff --git a/src/composables/useTabs.js b/src/composables/useTabs.js new file mode 100644 index 0000000000000000000000000000000000000000..1eac9166517bc317ea5c7829bf3103b83532fd77 --- /dev/null +++ b/src/composables/useTabs.js @@ -0,0 +1,207 @@ +import { ref, computed, provide, inject, watch } from "vue"; +import { useRouter } from "vue-router"; +import { getPageTitle } from "@/utils/pageTitle"; + +const HOME_TAB = { + path: "/home", + title: "message.home", + closable: false, +}; + +export const TABS_CONTEXT_KEY = Symbol("TABS_CONTEXT_KEY"); +const TABS_STORAGE_KEY = "app-tabs-state"; + +const getStoredTabs = () => { + try { + const stored = sessionStorage.getItem(TABS_STORAGE_KEY); + if (stored) { + const { tabs: storedTabs, activeTab } = JSON.parse(stored); + if (Array.isArray(storedTabs) && storedTabs.length > 0) { + return { tabs: storedTabs, activeTab }; + } + } + } catch (error) {} + return null; +}; + +const saveTabsState = (tabs, activeTab) => { + try { + sessionStorage.setItem( + TABS_STORAGE_KEY, + JSON.stringify({ tabs, activeTab }), + ); + } catch (error) {} +}; + +export const clearSavedTabs = () => { + try { + sessionStorage.removeItem(TABS_STORAGE_KEY); + } catch (error) {} +}; + +export function createTabsContext(i18n) { + const router = useRouter(); + + const storedState = getStoredTabs(); + const tabs = ref(storedState?.tabs || [{ ...HOME_TAB }]); + const activeTab = ref(storedState?.activeTab || "/home"); + + const getTabTitle = (path) => { + const key = getPageTitle(path); + if (key && i18n) { + const translated = i18n.t(key); + if (translated !== key) { + return translated; + } + } + return key || path; + }; + + const addTab = (tabInfo) => { + const { path, title, name, closable = true } = tabInfo; + if (!path) return; + + const existing = tabs.value.find((tab) => tab.path === path); + if (existing) { + activeTab.value = path; + return; + } + + const tabTitle = title || getTabTitle(path); + tabs.value.push({ + path, + title: tabTitle, + name, + closable, + }); + activeTab.value = path; + }; + + const removeTab = (targetPath) => { + if (targetPath === HOME_TAB.path) return; + + const index = tabs.value.findIndex((tab) => tab.path === targetPath); + if (index === -1) return; + + const wasActive = activeTab.value === targetPath; + tabs.value.splice(index, 1); + + if (wasActive) { + const nextTab = tabs.value[index] || tabs.value[index - 1]; + if (nextTab) { + activeTab.value = nextTab.path; + router.push(nextTab.path); + } + } + }; + + const closeLeftTabs = (targetPath) => { + const index = tabs.value.findIndex((tab) => tab.path === targetPath); + if (index <= 0) return; + + const toRemove = []; + for (let i = 0; i < index; i++) { + if (tabs.value[i].closable !== false) { + toRemove.push(tabs.value[i].path); + } + } + + tabs.value = tabs.value.filter( + (tab) => !toRemove.includes(tab.path) || tab.path === targetPath, + ); + + const currentIdx = tabs.value.findIndex( + (tab) => tab.path === activeTab.value, + ); + if (currentIdx === -1) { + const next = tabs.value[index - 1] || tabs.value[0]; + if (next) { + activeTab.value = next.path; + router.push(next.path); + } + } + }; + + const closeRightTabs = (targetPath) => { + const index = tabs.value.findIndex((tab) => tab.path === targetPath); + if (index === -1 || index >= tabs.value.length - 1) return; + + const toRemove = []; + for (let i = index + 1; i < tabs.value.length; i++) { + if (tabs.value[i].closable !== false) { + toRemove.push(tabs.value[i].path); + } + } + + tabs.value = tabs.value.filter((tab) => !toRemove.includes(tab.path)); + + const currentIdx = tabs.value.findIndex( + (tab) => tab.path === activeTab.value, + ); + if (currentIdx === -1) { + const next = tabs.value[index + 1] || tabs.value[tabs.value.length - 1]; + if (next) { + activeTab.value = next.path; + router.push(next.path); + } + } + }; + + const closeOtherTabs = (targetPath) => { + tabs.value = tabs.value.filter( + (tab) => tab.path === targetPath || tab.closable === false, + ); + + if (activeTab.value !== targetPath) { + const currentTab = tabs.value.find((tab) => tab.path === activeTab.value); + if (!currentTab) { + activeTab.value = targetPath; + router.push(targetPath); + } + } + }; + + const closeAllTabs = () => { + const unclosable = tabs.value.filter((tab) => tab.closable === false); + tabs.value = unclosable.length > 0 ? unclosable : [{ ...HOME_TAB }]; + + if (!tabs.value.find((tab) => tab.path === activeTab.value)) { + activeTab.value = tabs.value[0].path; + router.push(activeTab.value); + } + }; + + const resetTabs = () => { + tabs.value = [{ ...HOME_TAB }]; + activeTab.value = HOME_TAB.path; + }; + + // 监听标签改变,自动保存到 sessionStorage + watch( + [tabs, activeTab], + ([newTabs, newActiveTab]) => { + saveTabsState(newTabs, newActiveTab); + }, + { deep: true }, + ); + + const context = { + tabs: computed(() => tabs.value), + activeTab: computed(() => activeTab.value), + addTab, + removeTab, + closeLeftTabs, + closeRightTabs, + closeOtherTabs, + closeAllTabs, + resetTabs, + }; + + provide(TABS_CONTEXT_KEY, context); + + return context; +} + +export function useTabsContext() { + return inject(TABS_CONTEXT_KEY, null); +} diff --git a/src/config/apiRoutes.js b/src/config/apiRoutes.js index 15dbe5ca62bfc230452faca29f6e556375aae08a..3c2717e102f1e6a05403a89d08f7884d2d1ed13e 100644 --- a/src/config/apiRoutes.js +++ b/src/config/apiRoutes.js @@ -12,6 +12,7 @@ export const FLAT_API_ROUTES = Object.freeze({ ADMIN_GET_ALL_ADMIN_TYPES: "/Admin/GetAllAdminTypes", ADMIN_LOGIN: "/Admin/Login", LOGIN_LOGOUT: "/Login/Logout", + LOGIN_REFRESH_TOKEN: "/Login/RefreshToken", ADMIN_READ_USER_DIRECT_PERMISSIONS: "/Admin/ReadUserDirectPermissions", ADMIN_READ_USER_ROLE_PERMISSIONS: "/Admin/ReadUserRolePermissions", ADMIN_READ_USER_ROLES: "/Admin/ReadUserRoles", @@ -56,6 +57,7 @@ export const FLAT_API_ROUTES = Object.freeze({ BASE_UPDATE_PASS_PORT_TYPE: "/Base/UpdatePassPortType", CUSTOMER_DEL_CUSTOMER_INFO: "/Customer/DelCustomerInfo", CUSTOMER_INSERT_CUSTOMER_INFO: "/Customer/InsertCustomerInfo", + CUSTOMER_SELECT_CUSTOMER_BY_INFO: "/Customer/SelectCustoByInfo", CUSTOMER_PERMISSION_ASSIGN_USER_PERMISSIONS: "/CustomerPermission/AssignUserPermissions", CUSTOMER_PERMISSION_ASSIGN_USER_ROLES: "/CustomerPermission/AssignUserRoles", @@ -76,6 +78,10 @@ export const FLAT_API_ROUTES = Object.freeze({ EMPLOYEE_EMPLOYEE_LOGIN: "/Employee/EmployeeLogin", EMPLOYEE_HISTORY_SELECT_HISTORY_BY_EMPLOYEE_ID: "/EmployeeHistory/SelectHistoryByEmployeeId", + EMPLOYEE_HISTORY_INSERT_HISTORY_BY_EMPLOYEE_ID: + "/EmployeeHistory/AddHistoryByEmployeeId", + EMPLOYEE_HISTORY_UPDATE_HISTORY_BY_EMPLOYEE_ID: + "/EmployeeHistory/UpdateHistoryByEmployeeId", EMPLOYEE_MANAGER_EMPLOYEE_ACCOUNT: "/Employee/ManagerEmployeeAccount", EMPLOYEE_PERMISSION_ASSIGN_USER_PERMISSIONS: "/EmployeePermission/AssignUserPermissions", @@ -85,6 +91,13 @@ export const FLAT_API_ROUTES = Object.freeze({ EMPLOYEE_PERMISSION_READ_USER_ROLE_PERMISSIONS: "/EmployeePermission/ReadUserRolePermissions", EMPLOYEE_PERMISSION_READ_USER_ROLES: "/EmployeePermission/ReadUserRoles", + EMPLOYEE_SELECT_TO_DAY_CHECK_INFO_BY_WORKER_NO: + "/EmployeeCheck/SelectToDayCheckInfoByWorkerNo", + EMPLOYEE_ADD_CHECK_INFO: "/EmployeeCheck/AddCheckInfo", + FAVORITE_COLLECTION_GET_FAVORITE_COLLECTION: + "/FavoriteCollection/GetFavoriteCollection", + FAVORITE_COLLECTION_SAVE_FAVORITE_COLLECTION: + "/FavoriteCollection/SaveFavoriteCollection", EMPLOYEE_PHOTO_INSERT_WORKER_PHOTO: "/EmployeePhoto/InsertWorkerPhoto", EMPLOYEE_RESET_EMPLOYEE_ACCOUNT_PASSWORD: "/Employee/ResetEmployeeAccountPassword", @@ -94,20 +107,20 @@ export const FLAT_API_ROUTES = Object.freeze({ EMPLOYEE_UPDATE_EMPLOYEE: "/Employee/UpdateEmployee", ENERGY_MANAGEMENT_DELETE_ENERGY_MANAGEMENT_INFO: "/EnergyManagement/DeleteEnergyManagementInfo", - ENERGY_MANAGEMENT_INSERT_ENERGY_MANAGEMENT_INFO: - "/EnergyManagement/InsertEnergyManagementInfo", ENERGY_MANAGEMENT_SELECT_ENERGY_MANAGEMENT_INFO: "/EnergyManagement/SelectEnergyManagementInfo", ENERGY_MANAGEMENT_UPDATE_ENERGY_MANAGEMENT_INFO: "/EnergyManagement/UpdateEnergyManagementInfo", LOGIN_GET_CSRF_TOKEN: "/Login/GetCSRFToken", - LOGIN_REFRESH_CSRF_TOKEN: "/Login/RefreshCSRFToken", MENU_BUILD_MENU_ALL: "/Menu/BuildMenuAll", MENU_DELETE_MENU: "/Menu/DeleteMenu", MENU_INSERT_MENU: "/Menu/InsertMenu", MENU_SELECT_MENU_ALL: "/Menu/SelectMenuAll", MENU_UPDATE_MENU: "/Menu/UpdateMenu", PERMISSION_SELECT_PERMISSION_LIST: "/Permission/SelectPermissionList", + PROFILE_GET_USER_PROFILE: "/Profile/GetUserProfile", + PROFILE_CHANGE_PASSWORD: "/Profile/ChangePassword", + PROFILE_UPLOAD_AVATAR: "/Profile/UploadAvatar", PROMOTION_CONTENT_ADD_PROMOTION_CONTENT: "/PromotionContent/AddPromotionContent", PROMOTION_CONTENT_DELETE_PROMOTION_CONTENT: @@ -116,10 +129,12 @@ export const FLAT_API_ROUTES = Object.freeze({ "/PromotionContent/SelectPromotionContentAll", PROMOTION_CONTENT_UPDATE_PROMOTION_CONTENT: "/PromotionContent/UpdatePromotionContent", + QUARTZ_SELECT_QUARTZ_JOB_LIST: "/Quartz/SelectQuartzJobList", RESER_DELETE_RESER_INFO: "/Reser/DeleteReserInfo", RESER_INSER_RESER_INFO: "/Reser/InserReserInfo", RESER_SELECT_RESER_ALL: "/Reser/SelectReserAll", RESER_SELECT_RESER_TYPE_ALL: "/Reser/SelectReserTypeAll", + RESER_SELECT_RESER_INFO_BY_ROOM_NO: "/Reser/SelectReserInfoByRoomNo", RESER_UPDATE_RESER_INFO: "/Reser/UpdateReserInfo", REWARD_PUNISHMENT_SELECT_ALL_REWARD_PUNISHMENT_BY_EMPLOYEE_ID: "/RewardPunishment/SelectAllRewardPunishmentByEmployeeId", @@ -127,14 +142,20 @@ export const FLAT_API_ROUTES = Object.freeze({ ROLE_DELETE_ROLE: "/Role/DeleteRole", ROLE_GRANT_ROLE_PERMISSIONS: "/Role/GrantRolePermissions", ROLE_INSERT_ROLE: "/Role/InsertRole", + ROLE_READ_ROLE_GRANTS: "/Role/ReadRoleGrants", ROLE_READ_ROLE_PERMISSIONS: "/Role/ReadRolePermissions", ROLE_READ_ROLE_USERS: "/Role/ReadRoleUsers", ROLE_SELECT_ROLE_LIST: "/Role/SelectRoleList", ROLE_UPDATE_ROLE: "/Role/UpdateRole", ROOM_DELETE_ROOM: "/Room/DeleteRoom", ROOM_INSERT_ROOM: "/Room/InsertRoom", + ROOM_CHECKOUT_ROOM: "/Room/CheckoutRoom", + ROOM_TRANSFER_ROOM: "/Room/TransferRoom", + ROOM_CHECKIN_ROOM_BY_RESERVATION: "/Room/CheckinRoomByReservation", ROOM_SELECT_CAN_USE_ROOM_ALL: "/Room/SelectCanUseRoomAll", ROOM_SELECT_ROOM_ALL: "/Room/SelectRoomAll", + ROOM_SELECT_ROOM_PRICING_OPTIONS: "/Room/SelectRoomPricingOptions", + ROOM_UPDATE_ROOM_INFO: "/Room/UpdateRoomInfo", ROOM_TYPE_DELETE_ROOM_TYPE: "/RoomType/DeleteRoomType", ROOM_TYPE_INSERT_ROOM_TYPE: "/RoomType/InsertRoomType", ROOM_TYPE_SELECT_ROOM_TYPES_ALL: "/RoomType/SelectRoomTypesAll", @@ -144,9 +165,10 @@ export const FLAT_API_ROUTES = Object.freeze({ SELLTHING_INSERT_SELLTHING: "/Sellthing/InsertSellthing", SELLTHING_SELECT_SELLTHING_ALL: "/Sellthing/SelectSellthingAll", SELLTHING_UPDATE_SELLTHING: "/Sellthing/UpdateSellthing", - SPEND_INSERT_SPEND_INFO: "/Spend/InsertSpendInfo", + SPEND_INSERT_SPEND_INFO: "/Spend/AddCustomerSpend", SPEND_SELECT_SPEND_INFO_ALL: "/Spend/SelectSpendInfoAll", SPEND_UPD_SPEND_INFO: "/Spend/UpdSpendInfo", + SPEND_UNDO_SPEND_INFO: "/Spend/UndoCustomerSpend", SUPERVISION_STATISTICS_DELETE_SUPERVISION_STATISTICS: "/SupervisionStatistics/DeleteSupervisionStatistics", SUPERVISION_STATISTICS_INSERT_SUPERVISION_STATISTICS: diff --git a/src/config/dateFields.js b/src/config/dateFields.js index 682a28e8193117b135bd50da20a6b36a4d00af46..5c33a559b4c4b5a8d4501a5eaa6502555b96049e 100644 --- a/src/config/dateFields.js +++ b/src/config/dateFields.js @@ -1,9 +1,20 @@ -import { EmployeeFields } from "@/entities/employee.entity"; -import { LogFields } from "@/entities/log.entity"; -import { SpendInfoFields } from "@/entities/spendinfo.entity"; +import { EmployeeFields } from "@/entities/humanresourcemanagement/employee.entity"; +import { LogFields } from "@/entities/operationmanagement/log.entity"; +import { SpendInfoFields } from "@/entities/customermanagement/spendinfo.entity"; +import { RoomFields } from "@/entities/roominformation/room.entity"; +import { SupervisionFields } from "@/entities/supervision/supervision.entity"; export const dateFieldConfig = { - WITH_TIME: [LogFields.TIME, SpendInfoFields.TIME], + WITH_TIME: [ + LogFields.TIME, + SpendInfoFields.TIME, + RoomFields.CHECK_IN_TIME, + RoomFields.CHECK_OUT_TIME, + ], - WITHOUT_TIME: [EmployeeFields.DATEOFBITRH, EmployeeFields.HIREDATE], + WITHOUT_TIME: [ + EmployeeFields.DATEOFBITRH, + EmployeeFields.HIREDATE, + SupervisionFields.CHECK_TIME, + ], }; diff --git a/src/entities/department.entity.js b/src/entities/base/department.entity.js similarity index 71% rename from src/entities/department.entity.js rename to src/entities/base/department.entity.js index 8f4b1bb18543b933af2e7a31128bcfd97c7e6519..4b948d0d0d0bf45ba40ba4cd14d2c57b29d1a0a8 100644 --- a/src/entities/department.entity.js +++ b/src/entities/base/department.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const DepartmentSpecificFields = { NUMBER: "DepartmentNumber", @@ -79,6 +80,28 @@ export const getColumns = (t, handleView) => [ dataIndex: DepartmentFields.CREATIONDATE, key: DepartmentFields.CREATIONDATE, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ @@ -89,4 +112,11 @@ export const getFormRules = (t) => ({ trigger: "blur", }, ], + [DepartmentFields.LEADER]: [ + { + required: true, + message: t("message.pleaseInputDepartmentLeader"), + trigger: "blur", + }, + ], }); diff --git a/src/entities/nation.entity.js b/src/entities/base/nation.entity.js similarity index 58% rename from src/entities/nation.entity.js rename to src/entities/base/nation.entity.js index 072cee8998189b7e2ade5b3126c5c70c3bab1419..b2b84cc6bc43c31f05899c17a0660bafb6c68395 100644 --- a/src/entities/nation.entity.js +++ b/src/entities/base/nation.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const NationSpecificFields = { NUMBER: "NationNumber", @@ -41,6 +42,28 @@ export const getColumns = (t) => [ dataIndex: NationFields.NAME, key: NationFields.NAME, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/noticetype.entity.js b/src/entities/base/noticetype.entity.js similarity index 57% rename from src/entities/noticetype.entity.js rename to src/entities/base/noticetype.entity.js index 8ca721ce19d08937f1c96b1e4af4ed4bdb4aaa5b..0992b89bffe1ac907af599626dfe755c07781e8e 100644 --- a/src/entities/noticetype.entity.js +++ b/src/entities/base/noticetype.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const NoticeTypeSpecificFields = { NUMBER: "NoticeTypeNumber", @@ -39,6 +40,28 @@ export const getColumns = (t) => [ dataIndex: NoticeTypeFields.NAME, key: NoticeTypeFields.NAME, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/passport.entity.js b/src/entities/base/passport.entity.js similarity index 61% rename from src/entities/passport.entity.js rename to src/entities/base/passport.entity.js index 29e9562437034c1c4e475252d48f49ace509eb03..48910d71c87b0721f7f862ff3300358dde7957a7 100644 --- a/src/entities/passport.entity.js +++ b/src/entities/base/passport.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const PassportSpecificFields = { NUMBER: "PassportId", @@ -44,6 +45,28 @@ export const getColumns = (t) => [ dataIndex: PassportFields.NAME, key: PassportFields.NAME, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/position.entity.js b/src/entities/base/position.entity.js similarity index 59% rename from src/entities/position.entity.js rename to src/entities/base/position.entity.js index 1d98564c7e89d176eea799576e0155f740f2efde..a08ebdad819775c23057bfe58fc70b1b174d533e 100644 --- a/src/entities/position.entity.js +++ b/src/entities/base/position.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const PositionSpecificFields = { NUMBER: "PositionNumber", @@ -41,6 +42,28 @@ export const getColumns = (t) => [ dataIndex: PositionFields.NAME, key: PositionFields.NAME, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/promotioncontent.entity.js b/src/entities/base/promotioncontent.entity.js similarity index 63% rename from src/entities/promotioncontent.entity.js rename to src/entities/base/promotioncontent.entity.js index 175638ad341bd77df704fac9a7ee99d8e0259c23..59e1edac23e9903930ef173bb7073330df838e53 100644 --- a/src/entities/promotioncontent.entity.js +++ b/src/entities/base/promotioncontent.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const PromotionContentSpecificFields = { NUMBER: "PromotionContentNumber", @@ -28,11 +29,6 @@ export const getColumns = (t) => [ key: "action", width: 100, }, - { - title: t("message.id"), - dataIndex: PromotionContentFields.ID, - key: PromotionContentFields.ID, - }, { title: t("message.promotionContentNumber"), dataIndex: PromotionContentFields.NUMBER, @@ -43,6 +39,28 @@ export const getColumns = (t) => [ dataIndex: PromotionContentFields.MESSAGE, key: PromotionContentFields.MESSAGE, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/qualification.entity.js b/src/entities/base/qualification.entity.js similarity index 59% rename from src/entities/qualification.entity.js rename to src/entities/base/qualification.entity.js index 4bcb907d4d67a43b1e6345b2fc92ebce2859a494..2a0b2f630c720497f1720b4db980fb02eb4e5abb 100644 --- a/src/entities/qualification.entity.js +++ b/src/entities/base/qualification.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const EducationSpecificFields = { NUMBER: "EducationNumber", @@ -41,6 +42,28 @@ export const getColumns = (t) => [ dataIndex: EducationFields.NAME, key: EducationFields.NAME, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/common.entity.js b/src/entities/common.entity.js index c0fc0e17ba6b7adad1cb6fd7db43f1ec6c2aec14..e99409aaed6f5919e59d10b71fc5b68f44f507d3 100644 --- a/src/entities/common.entity.js +++ b/src/entities/common.entity.js @@ -8,6 +8,11 @@ export const BaseFields = { PAGE_SIZE: "PageSize", ROWVERSION: "RowVersion", SELECTED: "selected", + + DATA_INS_USER: "DataInsUsr", + DATA_INS_DATE: "DataInsDate", + DATA_CHG_USER: "DataChgUsr", + DATA_CHG_DATE: "DataChgDate", }; export const BaseInitialValues = { diff --git a/src/entities/customer.entity.js b/src/entities/customermanagement/customer.entity.js similarity index 74% rename from src/entities/customer.entity.js rename to src/entities/customermanagement/customer.entity.js index d417803df98557970a669fe63f7befda7c3e0fd2..f62e36cd0ad0d87ac8c702cc5db7f6d9a98ac214 100644 --- a/src/entities/customer.entity.js +++ b/src/entities/customermanagement/customer.entity.js @@ -1,18 +1,19 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const CustomerSpecificFields = { NUMBER: "CustomerNumber", - NAME: "CustomerName", - GENDER: "CustomerGender", + NAME: "Name", + GENDER: "Gender", GENDER_NAME: "GenderName", BIRTH_DATE: "DateOfBirth", TYPE: "CustomerType", TYPE_NAME: "CustomerTypeName", - PASSPORTTYPE: "PassportId", + PASSPORTTYPE: "IdCardType", PASSPORTNAME: "PassportName", ID_NUMBER: "IdCardNumber", - PHONE: "CustomerPhoneNumber", - ADDRESS: "CustomerAddress", + PHONE: "PhoneNumber", + ADDRESS: "Address", DATE_RANGE_DTO: "DateRangeDto", }; @@ -125,6 +126,28 @@ export const getColumns = (t) => [ dataIndex: CustomerFields.ADDRESS, key: CustomerFields.ADDRESS, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ @@ -164,4 +187,25 @@ export const getFormRules = (t) => ({ trigger: "blur", }, ], + [CustomerFields.TYPE]: [ + { + required: true, + message: t("message.invalidCustomerType"), + trigger: "blur", + }, + ], + [CustomerFields.BIRTH_DATE]: [ + { + required: true, + message: t("message.invalidCustomerBirth"), + trigger: "blur", + }, + ], + [CustomerFields.PASSPORTTYPE]: [ + { + required: true, + message: t("message.invalidCustomerPassportType"), + trigger: "blur", + }, + ], }); diff --git a/src/entities/customertype.entity.js b/src/entities/customermanagement/customertype.entity.js similarity index 69% rename from src/entities/customertype.entity.js rename to src/entities/customermanagement/customertype.entity.js index 724844f91f88b5573dcd0702fde7899a774fd3ed..355c41794218cf9d322e0d91b7df4dd37323dda9 100644 --- a/src/entities/customertype.entity.js +++ b/src/entities/customermanagement/customertype.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const CustomerTypeSpecificFields = { NUMBER: "CustomerType", @@ -51,6 +52,28 @@ export const getColumns = (t) => [ dataIndex: CustomerTypeFields.DISCOUNT, key: CustomerTypeFields.DISCOUNT, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/spendinfo.entity.js b/src/entities/customermanagement/spendinfo.entity.js similarity index 73% rename from src/entities/spendinfo.entity.js rename to src/entities/customermanagement/spendinfo.entity.js index 86a2629145f254ae635370b3219675531768ace6..5875007b9d16f1c9f478b9d9f7c8e7210db671f3 100644 --- a/src/entities/spendinfo.entity.js +++ b/src/entities/customermanagement/spendinfo.entity.js @@ -1,9 +1,14 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; -import { formatDate } from "@/utils/index"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDate, formatDateTime } from "@/utils/index"; export const SpendInfoSpecificFields = { NUMBER: "SpendNumber", + PRODUCT_NO: "ProductNumber", + ROOM_ID: "RoomId", ROOM_NO: "RoomNumber", + ROOM_LOCATOR: "RoomLocator", + ROOM_AREA: "RoomArea", + ROOM_FLOOR: "RoomFloor", CUSTO_NO: "CustomerNumber", NAME: "ProductName", AMOUNT: "ConsumptionQuantity", @@ -14,6 +19,8 @@ export const SpendInfoSpecificFields = { TIME: "ConsumptionTime", STATE: "SettlementStatus", STATE_NAME: "SettlementStatusDescription", + TYPE: "ConsumptionType", + TYPE_NAME: "ConsumptionTypeDescription", DATE_RANGE_DTO: "DateRangeDto", }; @@ -27,6 +34,12 @@ export const SpendState = { PAID: "Settled", }; +export const SpendTypes = { + ROOM: "room", + GOODS: "goods", + OTHER: "other", +}; + export const StateColors = { [SpendState.UNPAID]: "#f50", [SpendState.PAID]: "#87d068", @@ -37,14 +50,18 @@ export const DATE_FORMAT = "YYYY-MM-DD HH:mm:ss"; export const initialFormValues = { ...BaseInitialValues, [SpendInfoFields.NUMBER]: null, + [SpendInfoFields.ROOM_ID]: null, [SpendInfoFields.ROOM_NO]: null, + [SpendInfoFields.ROOM_LOCATOR]: "", [SpendInfoFields.CUSTO_NO]: null, + [SpendInfoFields.PRODUCT_NO]: null, [SpendInfoFields.NAME]: "", [SpendInfoFields.AMOUNT]: 1, [SpendInfoFields.PRICE]: 0, [SpendInfoFields.MONEY]: 0, [SpendInfoFields.TIME]: null, [SpendInfoFields.STATE]: SpendState.UNPAID, + [SpendInfoFields.TYPE]: null, [SpendInfoFields.DATE_RANGE_DTO]: { Start: null, End: null, @@ -71,12 +88,24 @@ export const getColumns = (t) => [ sorter: (a, b) => a[SpendInfoFields.NUMBER].localeCompare(b[SpendInfoFields.NUMBER]), }, + { + title: t("message.roomLocator"), + dataIndex: SpendInfoFields.ROOM_LOCATOR, + key: SpendInfoFields.ROOM_LOCATOR, + sorter: (a, b) => + String(a[SpendInfoFields.ROOM_LOCATOR] || "").localeCompare( + String(b[SpendInfoFields.ROOM_LOCATOR] || ""), + "zh-Hans-CN", + { + numeric: true, + }, + ), + }, { title: t("message.roomNo"), dataIndex: SpendInfoFields.ROOM_NO, key: SpendInfoFields.ROOM_NO, - sorter: (a, b) => - a[SpendInfoFields.ROOM_NO].localeCompare(b[SpendInfoFields.ROOM_NO]), + hidden: true, }, { title: t("message.customerNo"), @@ -95,6 +124,7 @@ export const getColumns = (t) => [ title: t("message.spendAmount"), dataIndex: SpendInfoFields.AMOUNT, key: SpendInfoFields.AMOUNT, + width: 80, }, { title: t("message.spendPrice"), @@ -112,11 +142,13 @@ export const getColumns = (t) => [ title: t("message.spendPrice"), dataIndex: SpendInfoFields.PRICEFORMATTED, key: SpendInfoFields.PRICEFORMATTED, + width: 120, }, { title: t("message.spendMoney"), dataIndex: SpendInfoFields.MONEYFORMATTED, key: SpendInfoFields.MONEYFORMATTED, + width: 120, }, { title: t("message.spendTime"), @@ -131,6 +163,28 @@ export const getColumns = (t) => [ key: SpendInfoFields.STATE, width: 100, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/viprule.entity.js b/src/entities/customermanagement/viprule.entity.js similarity index 72% rename from src/entities/viprule.entity.js rename to src/entities/customermanagement/viprule.entity.js index 2524ffbc3c532016e715c652a66579f5f45ee75b..b206d52b50beccf780f2d89b58cda79b6282a644 100644 --- a/src/entities/viprule.entity.js +++ b/src/entities/customermanagement/viprule.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const VipRuleSpecificFields = { NUMBER: "RuleSerialNumber", @@ -59,6 +60,28 @@ export const getColumns = (t) => [ dataIndex: VipRuleFields.CUSTOMER_TYPE_NAME, key: VipRuleFields.CUSTOMER_TYPE_NAME, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/employeehistory.entity.js b/src/entities/employeehistory.entity.js deleted file mode 100644 index 76bfb9352de501c65f9bfb5e4a248ba62d16caf5..0000000000000000000000000000000000000000 --- a/src/entities/employeehistory.entity.js +++ /dev/null @@ -1,59 +0,0 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; -import { formatDate } from "@/utils/index"; - -export const EmployeeHistorySpecificFields = { - NUMBER: "HistoryNumber", - EMPLOYEENUMBER: "EmployeeId", - STARTDATE: "StartDate", - ENDDATE: "EndDate", - POSITION: "Position", - COMPANY: "Company", -}; - -export const DATE_FORMATS = { - SHORT_DATE: "YYYY-MM-DD", - LONG_DATE: "MMMM Do YYYY", - TABLE_DATE: "MM/DD/YYYY", -}; - -export const EmployeeHistoryFields = { - ...EmployeeHistorySpecificFields, - ...BaseFields, -}; - -export const initialFormValues = { - ...BaseInitialValues, - [EmployeeHistoryFields.NUMBER]: null, - [EmployeeHistoryFields.EMPLOYEENUMBER]: "", - [EmployeeHistoryFields.STARTDATE]: null, - [EmployeeHistoryFields.ENDDATE]: null, - [EmployeeHistoryFields.POSITION]: "", - [EmployeeHistoryFields.COMPANY]: "", -}; - -export const getHistoryColumns = (t) => [ - { - title: t("message.hireDate"), - dataIndex: EmployeeHistoryFields.STARTDATE, - key: EmployeeHistoryFields.STARTDATE, - customRender: ({ text }) => formatDate(text, DATE_FORMATS.TABLE_DATE), - }, - { - title: t("message.departureDate"), - dataIndex: EmployeeHistoryFields.ENDDATE, - key: EmployeeHistoryFields.ENDDATE, - customRender: ({ text }) => formatDate(text, DATE_FORMATS.TABLE_DATE), - }, - { - title: t("message.historyPosition"), - dataIndex: EmployeeHistoryFields.POSITION, - key: EmployeeHistoryFields.POSITION, - }, - { - title: t("message.company"), - dataIndex: EmployeeHistoryFields.COMPANY, - key: EmployeeHistoryFields.COMPANY, - }, -]; - -export const getFormRules = (t) => ({}); diff --git a/src/entities/internalfinance.entity.js b/src/entities/finance/internalfinance.entity.js similarity index 81% rename from src/entities/internalfinance.entity.js rename to src/entities/finance/internalfinance.entity.js index 9c66ee7eed36d2c9f61f47a6450413e124086c76..0a53c52f58a0cad09e30691d054aca46b0f1cc4f 100644 --- a/src/entities/internalfinance.entity.js +++ b/src/entities/finance/internalfinance.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const InternalFinanceSpecificFields = { NUMBER: "AssetNumber", @@ -10,7 +11,8 @@ export const InternalFinanceSpecificFields = { ACQUISITIONDATE: "AcquisitionDate", ASSETSOURCE: "AssetSource", ACQUIREDBYEMPLOYEE: "AcquiredByEmployeeId", - ACQUIREDBYEMPLOYEENAME: "AcquiredByEmployeeName", + ACQUIREDBYEMPLOYEENAME: "AcquiredByName", + DATE_RANGE_DTO: "DateRangeDto", }; export const InternalFinanceFields = { @@ -30,6 +32,11 @@ export const initialFormValues = { [InternalFinanceFields.ASSETSOURCE]: "", [InternalFinanceFields.ACQUIREDBYEMPLOYEE]: "", [InternalFinanceFields.ACQUIREDBYEMPLOYEENAME]: "", + [InternalFinanceFields.DATE_RANGE_DTO]: { + Start: null, + End: null, + Ranges: null, + }, }; export const getColumns = (t) => [ @@ -102,6 +109,28 @@ export const getColumns = (t) => [ dataIndex: InternalFinanceFields.ACQUIREDBYEMPLOYEENAME, key: InternalFinanceFields.ACQUIREDBYEMPLOYEENAME, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/employee.entity.js b/src/entities/humanresourcemanagement/employee.entity.js similarity index 90% rename from src/entities/employee.entity.js rename to src/entities/humanresourcemanagement/employee.entity.js index 0d6099ea38642940a31b674ec951e4a4bd98e460..3810e367d6f6426f0c9bb43076b0bdd19517c1dc 100644 --- a/src/entities/employee.entity.js +++ b/src/entities/humanresourcemanagement/employee.entity.js @@ -1,9 +1,9 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; -import { formatDate } from "@/utils/index"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDate, formatDateTime } from "@/utils/index"; export const EmployeeSpecificFields = { NUMBER: "EmployeeId", - NAME: "EmployeeName", + NAME: "Name", GENDER: "Gender", GENDERNAME: "GenderName", DATEOFBIRTH: "DateOfBirth", @@ -187,6 +187,28 @@ export const getColumns = (t) => [ dataIndex: EmployeeFields.ISENABLE, key: EmployeeFields.ISENABLE, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/employeecheck.entity.js b/src/entities/humanresourcemanagement/employeecheck.entity.js similarity index 79% rename from src/entities/employeecheck.entity.js rename to src/entities/humanresourcemanagement/employeecheck.entity.js index a6fd865e09959f843bfbdc0ac59fa0f021a5ba32..50a7dd33dc03e747ae4b17b4f66e41566c72cfe8 100644 --- a/src/entities/employeecheck.entity.js +++ b/src/entities/humanresourcemanagement/employeecheck.entity.js @@ -1,4 +1,4 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; import { formatDate } from "@/utils/index"; export const EmployeeCheckSpecificFields = { @@ -7,6 +7,8 @@ export const EmployeeCheckSpecificFields = { CHECKTIME: "CheckTime", CHECKSTATUS: "CheckStatus", CHECKMETHOD: "CheckMethod", + CHECKSTATUSDESC: "CheckStatusDescription", + CHECKMETHODDESC: "CheckMethodDescription", }; export const DATE_FORMATS = { @@ -45,6 +47,12 @@ export const getCheckColumns = (t) => [ title: t("message.checkMethod"), dataIndex: EmployeeCheckFields.CHECKMETHOD, key: EmployeeCheckFields.CHECKMETHOD, + hidden: true, + }, + { + title: t("message.checkMethod"), + dataIndex: EmployeeCheckFields.CHECKMETHODDESC, + key: EmployeeCheckFields.CHECKMETHODDESC, }, ]; diff --git a/src/entities/humanresourcemanagement/employeehistory.entity.js b/src/entities/humanresourcemanagement/employeehistory.entity.js new file mode 100644 index 0000000000000000000000000000000000000000..7e2db5da5c9562545429c3db2dd5d643c078253b --- /dev/null +++ b/src/entities/humanresourcemanagement/employeehistory.entity.js @@ -0,0 +1,112 @@ +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDate } from "@/utils/index"; + +export const EmployeeHistorySpecificFields = { + NUMBER: "HistoryNumber", + EMPLOYEENUMBER: "EmployeeId", + STARTDATE: "StartDate", + ENDDATE: "EndDate", + POSITION: "Position", + COMPANY: "Company", +}; + +export const DATE_FORMATS = { + SHORT_DATE: "YYYY-MM-DD", + LONG_DATE: "MMMM Do YYYY", + TABLE_DATE: "MM/DD/YYYY", +}; + +export const EmployeeHistoryFields = { + ...EmployeeHistorySpecificFields, + ...BaseFields, +}; + +export const EmployeeHistoryColumnKeys = { + ACTION: "action", +}; + +export const initialFormValues = { + ...BaseInitialValues, + [EmployeeHistoryFields.NUMBER]: "", + [EmployeeHistoryFields.EMPLOYEENUMBER]: "", + [EmployeeHistoryFields.STARTDATE]: null, + [EmployeeHistoryFields.ENDDATE]: null, + [EmployeeHistoryFields.POSITION]: "", + [EmployeeHistoryFields.COMPANY]: "", +}; + +export const getHistoryColumns = (t, { includeActionColumn = false } = {}) => { + const columns = [ + { + title: t("message.hireDate"), + dataIndex: EmployeeHistoryFields.STARTDATE, + key: EmployeeHistoryFields.STARTDATE, + customRender: ({ text }) => formatDate(text, DATE_FORMATS.TABLE_DATE), + }, + { + title: t("message.departureDate"), + dataIndex: EmployeeHistoryFields.ENDDATE, + key: EmployeeHistoryFields.ENDDATE, + customRender: ({ text }) => formatDate(text, DATE_FORMATS.TABLE_DATE), + }, + { + title: t("message.historyPosition"), + dataIndex: EmployeeHistoryFields.POSITION, + key: EmployeeHistoryFields.POSITION, + }, + { + title: t("message.company"), + dataIndex: EmployeeHistoryFields.COMPANY, + key: EmployeeHistoryFields.COMPANY, + }, + ]; + + if (!includeActionColumn) { + return columns; + } + + return [ + { + title: t("message.action"), + key: EmployeeHistoryColumnKeys.ACTION, + width: 80, + align: "center", + }, + ...columns, + ]; +}; + +export const getFormRules = (t) => ({ + [EmployeeHistoryFields.STARTDATE]: [ + { + required: true, + message: t("message.pleaseSelectDate"), + trigger: "change", + }, + ], + [EmployeeHistoryFields.ENDDATE]: [ + { + required: true, + message: t("message.pleaseSelectDate"), + trigger: "change", + }, + ], + [EmployeeHistoryFields.POSITION]: [ + { + required: true, + message: t("message.required", { + field: t("message.historyPosition"), + }), + trigger: "blur", + }, + ], + [EmployeeHistoryFields.COMPANY]: [ + { + required: true, + message: t("message.required", { + field: t("message.company"), + }), + trigger: "blur", + }, + ], +}); diff --git a/src/entities/rewardpunishment.entity.js b/src/entities/humanresourcemanagement/rewardpunishment.entity.js similarity index 96% rename from src/entities/rewardpunishment.entity.js rename to src/entities/humanresourcemanagement/rewardpunishment.entity.js index da8d9acf21b396639603c81fabb38e92dba266e2..0c43e2779717e6f229f2c0a04f191e72a31a50b3 100644 --- a/src/entities/rewardpunishment.entity.js +++ b/src/entities/humanresourcemanagement/rewardpunishment.entity.js @@ -1,4 +1,4 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; import { formatDate } from "@/utils/index"; export const EmployeeRewardPunishmentSpecificFields = { diff --git a/src/entities/energymanagement.entity.js b/src/entities/hydroelectricity/energymanagement.entity.js similarity index 70% rename from src/entities/energymanagement.entity.js rename to src/entities/hydroelectricity/energymanagement.entity.js index 4fa867ed172c659ef10d877cb4425660146c7d82..37a9f5d6909d59430a513615f09eb4824bf1139d 100644 --- a/src/entities/energymanagement.entity.js +++ b/src/entities/hydroelectricity/energymanagement.entity.js @@ -1,9 +1,13 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; -import { formatDate } from "@/utils/index"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDate, formatDateTime } from "@/utils/index"; export const EnergyManagementSpecificFields = { NUMBER: "InformationId", + ROOM_ID: "RoomId", ROOMNUMBER: "RoomNumber", + ROOMLOCATOR: "RoomLocator", + ROOMAREA: "RoomArea", + ROOMFLOOR: "RoomFloor", CUSTOMERNUMBER: "CustomerNumber", STARTDATE: "StartDate", ENDDATE: "EndDate", @@ -20,7 +24,9 @@ export const EnergyManagementFields = { export const initialFormValues = { ...BaseInitialValues, [EnergyManagementFields.NUMBER]: "", + [EnergyManagementFields.ROOM_ID]: null, [EnergyManagementFields.ROOMNUMBER]: "", + [EnergyManagementFields.ROOMLOCATOR]: "", [EnergyManagementFields.CUSTOMERNUMBER]: "", [EnergyManagementFields.STARTDATE]: null, [EnergyManagementFields.ENDDATE]: null, @@ -46,10 +52,16 @@ export const getColumns = (t) => [ dataIndex: [EnergyManagementFields.NUMBER], key: [EnergyManagementFields.NUMBER], }, + { + title: t("message.roomLocator"), + dataIndex: [EnergyManagementFields.ROOMLOCATOR], + key: [EnergyManagementFields.ROOMLOCATOR], + }, { title: t("message.roomNo"), dataIndex: [EnergyManagementFields.ROOMNUMBER], key: [EnergyManagementFields.ROOMNUMBER], + hidden: true, }, { title: t("message.custoNo"), @@ -85,6 +97,28 @@ export const getColumns = (t) => [ dataIndex: [EnergyManagementFields.RECORDER], key: [EnergyManagementFields.RECORDER], }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/goods.entity.js b/src/entities/materialmanagement/goods.entity.js similarity index 73% rename from src/entities/goods.entity.js rename to src/entities/materialmanagement/goods.entity.js index 20a2d61846eab5a0d75713a15abd74fdc815fa2c..af1fdb50bb264ccf9e8e972b5c7f85b0ae2ecce8 100644 --- a/src/entities/goods.entity.js +++ b/src/entities/materialmanagement/goods.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const GoodsSpecificFields = { NUMBER: "ProductNumber", @@ -63,6 +64,28 @@ export const getColumns = (t) => [ dataIndex: GoodsFields.STOCK, key: GoodsFields.STOCK, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/log.entity.js b/src/entities/operationmanagement/log.entity.js similarity index 82% rename from src/entities/log.entity.js rename to src/entities/operationmanagement/log.entity.js index a9e832b9fbb8c89ed76e39ace5cd3836c3b92963..989fc1a4a0576d63b02f44b013926f7a662fab19 100644 --- a/src/entities/log.entity.js +++ b/src/entities/operationmanagement/log.entity.js @@ -1,5 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; -import { formatDate } from "@/utils/index"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDate, formatDateTime } from "@/utils/index"; export const LogSpecificFields = { NUMBER: "OperationId", @@ -87,6 +87,17 @@ export const getColumns = (t) => [ dataIndex: LogFields.IPADDRESS, key: LogFields.IPADDRESS, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/requestlog.entity.js b/src/entities/operationmanagement/requestlog.entity.js similarity index 81% rename from src/entities/requestlog.entity.js rename to src/entities/operationmanagement/requestlog.entity.js index c0d1d6e7152150b3fb4616dcac749ae117f2577d..9885ddc627002d9ca87ad1825ab3a344ad2eed01 100644 --- a/src/entities/requestlog.entity.js +++ b/src/entities/operationmanagement/requestlog.entity.js @@ -1,4 +1,4 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; import { formatDateTime } from "@/utils/index"; export const LogSpecificFields = { @@ -77,14 +77,14 @@ export const getColumns = (t) => [ title: t("message.clientIP"), dataIndex: LogFields.CLIENTIP, key: LogFields.CLIENTIP, - width: 300, + width: 120, ellipsis: true, }, { title: t("message.parameters"), dataIndex: LogFields.PARAMETERS, key: LogFields.PARAMETERS, - width: 300, + width: 150, ellipsis: true, }, { @@ -98,7 +98,7 @@ export const getColumns = (t) => [ title: t("message.elapsedMilliseconds"), dataIndex: LogFields.ELAPSEDMILLISECONDS, key: LogFields.ELAPSEDMILLISECONDS, - width: 100, + width: 90, ellipsis: true, }, { @@ -143,6 +143,28 @@ export const getColumns = (t) => [ width: 180, ellipsis: true, }, + // { + // title: t("message.createdBy"), + // dataIndex: BaseFields.DATA_INS_USER, + // key: BaseFields.DATA_INS_USER, + // }, + // { + // title: t("message.createdTime"), + // dataIndex: BaseFields.DATA_INS_DATE, + // key: BaseFields.DATA_INS_DATE, + // customRender: ({ text }) => formatDateTime(text), + // }, + // { + // title: t("message.lastUpdatedBy"), + // dataIndex: BaseFields.DATA_CHG_USER, + // key: BaseFields.DATA_CHG_USER, + // }, + // { + // title: t("message.lastUpdatedTime"), + // dataIndex: BaseFields.DATA_CHG_DATE, + // key: BaseFields.DATA_CHG_DATE, + // customRender: ({ text }) => formatDateTime(text), + // }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/reser.entity.js b/src/entities/roominformation/reser.entity.js similarity index 72% rename from src/entities/reser.entity.js rename to src/entities/roominformation/reser.entity.js index 2f78aa5780987ba385dcce5b510e3c781eea0b01..20dedfe68bb9e959d23673152a4b66dc9bd17e17 100644 --- a/src/entities/reser.entity.js +++ b/src/entities/roominformation/reser.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const ReserSpecificFields = { NUMBER: "ReservationId", @@ -6,7 +7,11 @@ export const ReserSpecificFields = { PHONENUMBER: "ReservationPhoneNumber", CHANNEL: "ReservationChannel", CHANNELDESCRIPTION: "ReservationChannelDescription", + ROOM_ID: "RoomId", ROOMNUMBER: "ReservationRoomNumber", + ROOMAREA: "RoomArea", + ROOMFLOOR: "RoomFloor", + ROOMLOCATOR: "RoomLocator", STARTDATE: "ReservationStartDate", ENDDATE: "ReservationEndDate", }; @@ -16,13 +21,23 @@ export const ReserFields = { ...BaseFields, }; +export const ReserChannelValues = { + OFFLINE: "Offline", + APP: "App", + APPLET: "Applet", + WEBSITE: "Website", + OTHER: "Other", +}; + export const initialFormValues = { ...BaseInitialValues, [ReserFields.NUMBER]: null, [ReserFields.CUSTOMERNAME]: "", [ReserFields.PHONENUMBER]: "", [ReserFields.CHANNEL]: "", + [ReserFields.ROOM_ID]: null, [ReserFields.ROOMNUMBER]: "", + [ReserFields.ROOMLOCATOR]: "", [ReserFields.STARTDATE]: null, [ReserFields.ENDDATE]: null, }; @@ -68,10 +83,16 @@ export const getColumns = (t) => [ dataIndex: ReserFields.CHANNELDESCRIPTION, key: ReserFields.CHANNELDESCRIPTION, }, + { + title: t("message.roomLocator"), + dataIndex: ReserFields.ROOMLOCATOR, + key: ReserFields.ROOMLOCATOR, + }, { title: t("message.reserRoomNumber"), dataIndex: ReserFields.ROOMNUMBER, key: ReserFields.ROOMNUMBER, + hidden: true, }, { title: t("message.reserStartDate"), @@ -83,6 +104,28 @@ export const getColumns = (t) => [ dataIndex: ReserFields.ENDDATE, key: ReserFields.ENDDATE, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ @@ -122,13 +165,13 @@ export const getFormRules = (t) => ({ trigger: "blur", }, ], - [ReserFields.ROOMNUMBER]: [ + [ReserFields.ROOM_ID]: [ { required: true, message: t("message.required", { - field: t("message.reserRoomNumber"), + field: t("message.roomLocator"), }), - trigger: "blur", + trigger: "change", }, ], [ReserFields.STARTDATE]: [ diff --git a/src/entities/room.entity.js b/src/entities/roominformation/room.entity.js similarity index 34% rename from src/entities/room.entity.js rename to src/entities/roominformation/room.entity.js index 34054c35b12791546016536d1a18556b0c809385..4084d40228367921c12db433f67aef951bd7bf70 100644 --- a/src/entities/room.entity.js +++ b/src/entities/roominformation/room.entity.js @@ -1,15 +1,27 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const RoomSpecificFields = { NO: "RoomNumber", + AREA: "RoomArea", + FLOOR: "RoomFloor", + LOCATOR: "RoomLocator", + LOCATION: "RoomLocation", NAME: "RoomName", STATE: "RoomState", - POSITION: "RoomLocation", CUSTOMER_NAME: "CustomerName", CHECK_IN_TIME: "LastCheckInTime", CHECK_OUT_TIME: "LastCheckOutTime", RENT: "RoomRent", DEPOSIT: "RoomDeposit", + STANDARD_RENT: "StandardRoomRent", + STANDARD_DEPOSIT: "StandardRoomDeposit", + APPLIED_RENT: "AppliedRoomRent", + APPLIED_DEPOSIT: "AppliedRoomDeposit", + EFFECTIVE_RENT: "EffectiveRoomRent", + EFFECTIVE_DEPOSIT: "EffectiveRoomDeposit", + PRICING_CODE: "PricingCode", + PRICING_NAME: "PricingName", STATE_ID: "RoomStateId", TYPE: "RoomTypeId", }; @@ -19,6 +31,60 @@ export const RoomFields = { ...BaseFields, }; +export const RoomOperationSpecificFields = { + ROOM_ID: "RoomId", + ORIGINAL_ROOM_ID: "OriginalRoomId", + TARGET_ROOM_ID: "TargetRoomId", + ORIGINAL_ROOM_NUMBER: "OriginalRoomNumber", + TARGET_ROOM_NUMBER: "TargetRoomNumber", + WATER_USAGE: "WaterUsage", + ELECTRICITY_USAGE: "ElectricityUsage", +}; + +export const RoomOperationFields = { + ...RoomOperationSpecificFields, +}; + +export const getRoomEffectiveRent = (room = {}) => { + const effectiveRent = Number(room?.[RoomFields.EFFECTIVE_RENT]); + if (Number.isFinite(effectiveRent)) { + return effectiveRent; + } + + const roomRent = Number(room?.[RoomFields.RENT]); + return Number.isFinite(roomRent) ? roomRent : 0; +}; + +export const getRoomEffectiveDeposit = (room = {}) => { + const effectiveDeposit = Number(room?.[RoomFields.EFFECTIVE_DEPOSIT]); + if (Number.isFinite(effectiveDeposit)) { + return effectiveDeposit; + } + + const roomDeposit = Number(room?.[RoomFields.DEPOSIT]); + return Number.isFinite(roomDeposit) ? roomDeposit : 0; +}; + +export const getRoomStandardRent = (room = {}) => { + const standardRent = Number(room?.[RoomFields.STANDARD_RENT]); + if (Number.isFinite(standardRent)) { + return standardRent; + } + + const roomRent = Number(room?.[RoomFields.RENT]); + return Number.isFinite(roomRent) ? roomRent : 0; +}; + +export const getRoomStandardDeposit = (room = {}) => { + const standardDeposit = Number(room?.[RoomFields.STANDARD_DEPOSIT]); + if (Number.isFinite(standardDeposit)) { + return standardDeposit; + } + + const roomDeposit = Number(room?.[RoomFields.DEPOSIT]); + return Number.isFinite(roomDeposit) ? roomDeposit : 0; +}; + export const RoomStateMap = { vacant: "空房", occupied: "已住", @@ -27,6 +93,14 @@ export const RoomStateMap = { reserved: "预约", }; +export const RoomStateValues = { + VACANT: "空房", + OCCUPIED: "已住", + MAINTENANCE: "维修", + DIRTY: "脏房", + RESERVED: "预约", +}; + export const RoomStateColors = { 空房: "#48a54b", 已住: "#1f8de5", @@ -38,11 +112,14 @@ export const RoomStateColors = { export const initialFormValues = { ...BaseInitialValues, [RoomFields.NO]: null, + [RoomFields.AREA]: "", + [RoomFields.FLOOR]: null, + [RoomFields.LOCATOR]: "", + [RoomFields.LOCATION]: "", [RoomFields.NAME]: "", [RoomFields.STATE]: "vacant", [RoomFields.STATE_ID]: 0, [RoomFields.TYPE]: null, - [RoomFields.POSITION]: "", [RoomFields.CUSTOMER_NAME]: "", [RoomFields.CHECK_IN_TIME]: null, [RoomFields.CHECK_OUT_TIME]: null, @@ -50,6 +127,21 @@ export const initialFormValues = { [RoomFields.DEPOSIT]: 0, }; +export const getRoomLocatorText = (room = {}) => { + const locator = String(room?.[RoomFields.LOCATOR] || "").trim(); + if (locator) { + return locator; + } + + const area = String(room?.[RoomFields.AREA] || "").trim(); + const floor = room?.[RoomFields.FLOOR]; + const roomNo = String(room?.[RoomFields.NO] || "").trim(); + const floorText = + floor === null || floor === undefined || floor === "" ? "" : `${floor}F`; + + return [area, floorText, roomNo].filter(Boolean).join(" / "); +}; + export const getColumns = (t) => [ { title: "", @@ -63,10 +155,13 @@ export const getColumns = (t) => [ width: 100, }, { - title: t("message.roomNo"), - dataIndex: RoomFields.NO, - key: RoomFields.NO, - sorter: (a, b) => a[RoomFields.NO].localeCompare(b[RoomFields.NO]), + title: t("message.roomLocator"), + dataIndex: RoomFields.LOCATOR, + key: RoomFields.LOCATOR, + sorter: (a, b) => + getRoomLocatorText(a).localeCompare(getRoomLocatorText(b), "zh-Hans-CN", { + numeric: true, + }), defaultSortOrder: "ascend", }, { @@ -75,6 +170,21 @@ export const getColumns = (t) => [ key: RoomFields.TYPE, hidden: true, }, + { + title: t("message.roomArea"), + dataIndex: RoomFields.AREA, + key: RoomFields.AREA, + }, + { + title: t("message.roomFloor"), + dataIndex: RoomFields.FLOOR, + key: RoomFields.FLOOR, + }, + { + title: t("message.roomNo"), + dataIndex: RoomFields.NO, + key: RoomFields.NO, + }, { title: t("message.roomType"), dataIndex: RoomFields.NAME, @@ -92,19 +202,46 @@ export const getColumns = (t) => [ key: "RoomState", }, { - title: t("message.roomRent"), + title: t("message.currentPricing"), + dataIndex: RoomFields.PRICING_NAME, + key: RoomFields.PRICING_NAME, + }, + { + title: t("message.currentRoomRent"), dataIndex: RoomFields.RENT, key: RoomFields.RENT, }, { - title: t("message.roomDeposit"), + title: t("message.currentRoomDeposit"), dataIndex: RoomFields.DEPOSIT, key: RoomFields.DEPOSIT, }, { - title: t("message.roomPosition"), - dataIndex: RoomFields.POSITION, - key: RoomFields.POSITION, + title: t("message.roomLocation"), + dataIndex: RoomFields.LOCATION, + key: RoomFields.LOCATION, + }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), }, ]; diff --git a/src/entities/roomconfig.entity.js b/src/entities/roominformation/roomconfig.entity.js similarity index 57% rename from src/entities/roomconfig.entity.js rename to src/entities/roominformation/roomconfig.entity.js index 67e31a88500027100f5face1b140f47157d8723a..7184672f3bb4c33dc1a4f635915591de424c0396 100644 --- a/src/entities/roomconfig.entity.js +++ b/src/entities/roominformation/roomconfig.entity.js @@ -1,23 +1,49 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const RoomConfigSpecificFields = { NO: "RoomTypeId", NAME: "RoomTypeName", RENT: "RoomRent", DEPOSIT: "RoomDeposit", + PRICING_ITEMS: "PricingItems", }; +export const RoomConfigPricingItemFields = { + CODE: "PricingCode", + NAME: "PricingName", + RENT: "RoomRent", + DEPOSIT: "RoomDeposit", + STAY_HOURS: "StayHours", + SORT: "Sort", + IS_DEFAULT: "IsDefault", +}; + +export const STANDARD_PRICING_CODE = "STANDARD"; + export const RoomConfigFields = { ...RoomConfigSpecificFields, ...BaseFields, }; +export const createRoomConfigPricingItem = (overrides = {}) => ({ + [RoomConfigPricingItemFields.CODE]: "", + [RoomConfigPricingItemFields.NAME]: "", + [RoomConfigPricingItemFields.RENT]: 0, + [RoomConfigPricingItemFields.DEPOSIT]: 0, + [RoomConfigPricingItemFields.STAY_HOURS]: null, + [RoomConfigPricingItemFields.SORT]: 0, + [RoomConfigPricingItemFields.IS_DEFAULT]: false, + ...overrides, +}); + export const initialFormValues = { ...BaseInitialValues, [RoomConfigFields.NO]: null, [RoomConfigFields.NAME]: "", [RoomConfigFields.RENT]: 0, [RoomConfigFields.DEPOSIT]: 0, + [RoomConfigFields.PRICING_ITEMS]: [], }; export const getColumns = (t) => [ @@ -55,6 +81,28 @@ export const getColumns = (t) => [ dataIndex: RoomConfigFields.DEPOSIT, key: RoomConfigFields.DEPOSIT, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/supervision.entity.js b/src/entities/supervision/supervision.entity.js similarity index 72% rename from src/entities/supervision.entity.js rename to src/entities/supervision/supervision.entity.js index 97e3bc65ff3d54546bb1650389ca4549dfbab7c6..e1456bcc330a6040971ff9db9ae3c5853a5e7f08 100644 --- a/src/entities/supervision.entity.js +++ b/src/entities/supervision/supervision.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDate, formatDateTime } from "@/utils/index"; export const SupervisionSpecificFields = { CHECK_NO: "StatisticsNumber", @@ -9,6 +10,8 @@ export const SupervisionSpecificFields = { CHECK_SCORE: "SupervisionScore", CHECK_PERSON: "SupervisionStatistician", CHECK_ADVICE: "SupervisionAdvice", + CHECK_TIME: "SupervisionTime", + DATE_RANGE_DTO: "DateRangeDto", }; export const SupervisionFields = { @@ -25,6 +28,12 @@ export const initialFormValues = { [SupervisionFields.CHECK_SCORE]: 0, [SupervisionFields.CHECK_PERSON]: "", [SupervisionFields.CHECK_ADVICE]: "", + [SupervisionFields.DATE_RANGE_DTO]: { + Start: null, + End: null, + Ranges: null, + }, + [SupervisionFields.CHECK_TIME]: null, }; export const getColumns = (t) => [ @@ -49,6 +58,11 @@ export const getColumns = (t) => [ ), defaultSortOrder: "ascend", }, + { + title: t("message.checkDate"), + dataIndex: SupervisionFields.CHECK_TIME, + key: SupervisionFields.CHECK_TIME, + }, { title: t("message.checkDepartment"), dataIndex: SupervisionFields.CHECK_CLUB, @@ -85,6 +99,28 @@ export const getColumns = (t) => [ dataIndex: SupervisionFields.CHECK_ADVICE, key: SupervisionFields.CHECK_ADVICE, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ @@ -130,4 +166,11 @@ export const getFormRules = (t) => ({ trigger: "blur", }, ], + [SupervisionFields.CHECK_TIME]: [ + { + required: true, + message: t("message.pleaseInputCheckDate"), + trigger: "blur", + }, + ], }); diff --git a/src/entities/administrator.entity.js b/src/entities/systemmanagement/administrator.entity.js similarity index 83% rename from src/entities/administrator.entity.js rename to src/entities/systemmanagement/administrator.entity.js index eceaf8e6b019c8f096234c3a3677c217fe9d7ae3..b339af5d5283e41a3e82fc025d570162dbb5828a 100644 --- a/src/entities/administrator.entity.js +++ b/src/entities/systemmanagement/administrator.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const AdministratorSpecificFields = { NUMBER: "Number", @@ -93,6 +94,28 @@ export const getColumns = (t) => [ dataIndex: AdministratorFields.ISSUPERADMINDESCRIPTION, key: AdministratorFields.ISSUPERADMINDESCRIPTION, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t, isEditMode = false) => ({ diff --git a/src/entities/administratortype.entity.js b/src/entities/systemmanagement/administratortype.entity.js similarity index 68% rename from src/entities/administratortype.entity.js rename to src/entities/systemmanagement/administratortype.entity.js index 634e342a968843869fc935f6ef4ac24eaa4031b6..2c52c704ea99df291d58a767a7bbc4167efa7e75 100644 --- a/src/entities/administratortype.entity.js +++ b/src/entities/systemmanagement/administratortype.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const AdministratorTypeSpecificFields = { NUMBER: "TypeId", @@ -47,6 +48,28 @@ export const getColumns = (t) => [ b[AdministratorTypeFields.NAME], ), }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/menu.entity.js b/src/entities/systemmanagement/menu.entity.js similarity index 69% rename from src/entities/menu.entity.js rename to src/entities/systemmanagement/menu.entity.js index 3a93831e4f2be9aee21daaadede13618110ac56f..f37a7a71d0848e3d25210ddcfbf874acc99ac4ce 100644 --- a/src/entities/menu.entity.js +++ b/src/entities/systemmanagement/menu.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const MenuSpecificFields = { KEY: "Key", @@ -64,6 +65,28 @@ export const getColumns = (t) => [ dataIndex: MenuFields.ICON, key: MenuFields.ICON, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/entities/role.entity.js b/src/entities/systemmanagement/role.entity.js similarity index 61% rename from src/entities/role.entity.js rename to src/entities/systemmanagement/role.entity.js index caaa0396387539ae17f426bfc09759d86880f8af..e516322aabc320e2431c4c8d957671f113d8e037 100644 --- a/src/entities/role.entity.js +++ b/src/entities/systemmanagement/role.entity.js @@ -1,4 +1,5 @@ -import { BaseFields, BaseInitialValues } from "./common.entity"; +import { BaseFields, BaseInitialValues } from "@/entities/common.entity"; +import { formatDateTime } from "@/utils/index"; export const RoleSpecificFields = { NUMBER: "RoleNumber", @@ -47,6 +48,28 @@ export const getColumns = (t) => [ dataIndex: RoleFields.DESCRIPTION, key: RoleFields.DESCRIPTION, }, + { + title: t("message.createdBy"), + dataIndex: BaseFields.DATA_INS_USER, + key: BaseFields.DATA_INS_USER, + }, + { + title: t("message.createdTime"), + dataIndex: BaseFields.DATA_INS_DATE, + key: BaseFields.DATA_INS_DATE, + customRender: ({ text }) => formatDateTime(text), + }, + { + title: t("message.lastUpdatedBy"), + dataIndex: BaseFields.DATA_CHG_USER, + key: BaseFields.DATA_CHG_USER, + }, + { + title: t("message.lastUpdatedTime"), + dataIndex: BaseFields.DATA_CHG_DATE, + key: BaseFields.DATA_CHG_DATE, + customRender: ({ text }) => formatDateTime(text), + }, ]; export const getFormRules = (t) => ({ diff --git a/src/filters/department.filter.config.js b/src/filters/base/department.filter.config.js similarity index 95% rename from src/filters/department.filter.config.js rename to src/filters/base/department.filter.config.js index 5de0d6b0eaae74d1cf1e4ec028a96dc293327ba2..cf176d3a8953dbfce02d83038f83e9fa6a4850d4 100644 --- a/src/filters/department.filter.config.js +++ b/src/filters/base/department.filter.config.js @@ -1,4 +1,4 @@ -import { DepartmentFields } from "@/entities/department.entity"; +import { DepartmentFields } from "@/entities/base/department.entity"; import dayjs from "dayjs"; export const getDepartmentFilterConfig = ( diff --git a/src/filters/nation.filter.config.js b/src/filters/base/nation.filter.config.js similarity index 82% rename from src/filters/nation.filter.config.js rename to src/filters/base/nation.filter.config.js index 8f8e891ee1cf5cd73c391113cc73a2260455eca3..3b66873b396c7489d2552320dda3138154c348c4 100644 --- a/src/filters/nation.filter.config.js +++ b/src/filters/base/nation.filter.config.js @@ -1,4 +1,4 @@ -import { NationFields } from "@/entities/nation.entity"; +import { NationFields } from "@/entities/base/nation.entity"; export const getNationFilterConfig = (t) => { return { diff --git a/src/filters/noticetype.filter.config.js b/src/filters/base/noticetype.filter.config.js similarity index 81% rename from src/filters/noticetype.filter.config.js rename to src/filters/base/noticetype.filter.config.js index a8cedf11e5d49fa08be4680a37f70a3d3316d3e3..90683cc583195235e999c48bddc9b79db9873404 100644 --- a/src/filters/noticetype.filter.config.js +++ b/src/filters/base/noticetype.filter.config.js @@ -1,4 +1,4 @@ -import { NoticeTypeFields } from "@/entities/noticetype.entity"; +import { NoticeTypeFields } from "@/entities/base/noticetype.entity"; export const getNoticeTypeFilterConfig = (t) => { return { diff --git a/src/filters/passport.filter.config.js b/src/filters/base/passport.filter.config.js similarity index 82% rename from src/filters/passport.filter.config.js rename to src/filters/base/passport.filter.config.js index e35bb7ed509dd2730f59e42ea7344c092a240a52..052a97b428a1a17f0db84cab537c995f12a453eb 100644 --- a/src/filters/passport.filter.config.js +++ b/src/filters/base/passport.filter.config.js @@ -1,4 +1,4 @@ -import { PassportFields } from "@/entities/passport.entity"; +import { PassportFields } from "@/entities/base/passport.entity"; export const getPassportFilterConfig = (t) => { return { diff --git a/src/filters/position.filter.config.js b/src/filters/base/position.filter.config.js similarity index 82% rename from src/filters/position.filter.config.js rename to src/filters/base/position.filter.config.js index 2ba9165eabdbf48d3c38622585d3daca449f28cc..c07b6d1118bc85e83ec255b7d002bc8c875be109 100644 --- a/src/filters/position.filter.config.js +++ b/src/filters/base/position.filter.config.js @@ -1,4 +1,4 @@ -import { PositionFields } from "@/entities/position.entity"; +import { PositionFields } from "@/entities/base/position.entity"; export const getPositionFilterConfig = (t) => { return { diff --git a/src/filters/promotioncontent.filter.config.js b/src/filters/base/promotioncontent.filter.config.js similarity index 87% rename from src/filters/promotioncontent.filter.config.js rename to src/filters/base/promotioncontent.filter.config.js index 5ae6166aae895b98e0d2b02790ef51bd3374a91c..21febc81a9e2548818ed0daf181f86b81a2b5086 100644 --- a/src/filters/promotioncontent.filter.config.js +++ b/src/filters/base/promotioncontent.filter.config.js @@ -1,4 +1,4 @@ -import { PromotionContentFields } from "@/entities/promotionContent.entity"; +import { PromotionContentFields } from "@/entities/base/promotioncontent.entity"; export const getPromotionContentFilterConfig = (t) => { return { diff --git a/src/filters/qualification.filter.config.js b/src/filters/base/qualification.filter.config.js similarity index 80% rename from src/filters/qualification.filter.config.js rename to src/filters/base/qualification.filter.config.js index 1bc18c9ad0499df0311821df781d5a9486176a94..b7ce4fbac2db986836b72e740aa1e17339397bba 100644 --- a/src/filters/qualification.filter.config.js +++ b/src/filters/base/qualification.filter.config.js @@ -1,4 +1,4 @@ -import { EducationSpecificFields } from "@/entities/qualification.entity"; +import { EducationSpecificFields } from "@/entities/base/qualification.entity"; export const getQualificationFilterConfig = (t) => { return { diff --git a/src/filters/customer.filter.config.js b/src/filters/customermanagement/customer.filter.config.js similarity index 86% rename from src/filters/customer.filter.config.js rename to src/filters/customermanagement/customer.filter.config.js index 8602f456fca8753527b3259672588d936f316664..8ca5ecbcdece1e65b2b8f56a0848dd89e87c4b71 100644 --- a/src/filters/customer.filter.config.js +++ b/src/filters/customermanagement/customer.filter.config.js @@ -1,4 +1,4 @@ -import { CustomerFields } from "@/entities/customer.entity"; +import { CustomerFields } from "@/entities/customermanagement/customer.entity"; export const getCustomerFilterConfig = (t, customerTypeOptions) => { return { @@ -16,12 +16,12 @@ export const getCustomerFilterConfig = (t, customerTypeOptions) => { label: t("message.customerName"), placeholder: t("message.pleaseInputCustomerName"), }, - { - name: CustomerFields.PHONE, - type: "text", - label: t("message.customerTel"), - placeholder: t("message.pleaseInputCustomerTel"), - }, + // { + // name: CustomerFields.PHONE, + // type: "text", + // label: t("message.customerTel"), + // placeholder: t("message.pleaseInputCustomerTel"), + // }, { name: CustomerFields.TYPE, type: "select", diff --git a/src/filters/customertype.filter.config.js b/src/filters/customermanagement/customertype.filter.config.js similarity index 78% rename from src/filters/customertype.filter.config.js rename to src/filters/customermanagement/customertype.filter.config.js index 1b9a426103fdc5953998e29cf93ee8249912c58f..29de7f9cb20e54427058e8ff613ffd8ff1677293 100644 --- a/src/filters/customertype.filter.config.js +++ b/src/filters/customermanagement/customertype.filter.config.js @@ -1,4 +1,4 @@ -import { CustomerTypeFields } from "@/entities/customertype.entity"; +import { CustomerTypeFields } from "@/entities/customermanagement/customertype.entity"; export const getCustomerTypeFilterConfig = (t) => { return { diff --git a/src/filters/spendinfo.filter.config.js b/src/filters/customermanagement/spendinfo.filter.config.js similarity index 93% rename from src/filters/spendinfo.filter.config.js rename to src/filters/customermanagement/spendinfo.filter.config.js index f13b38957b6ceb2149acf31c7006d72c118a7fde..bfa25be34bf9c2f2137bbdd437a6df9f3f9b2047 100644 --- a/src/filters/spendinfo.filter.config.js +++ b/src/filters/customermanagement/spendinfo.filter.config.js @@ -1,4 +1,5 @@ -import { SpendInfoFields } from "@/entities/spendinfo.entity"; +import { SpendInfoFields } from "@/entities/customermanagement/spendinfo.entity"; +import dayjs from "dayjs"; export const getSpendInfoFilterConfig = (t) => { return { diff --git a/src/filters/viprule.filter.config.js b/src/filters/customermanagement/viprule.filter.config.js similarity index 87% rename from src/filters/viprule.filter.config.js rename to src/filters/customermanagement/viprule.filter.config.js index 3ba7f6a85e491de6788151a78f828abb7cfc536b..31ef37c491a233a45cc5354b337fd66eca2b19ba 100644 --- a/src/filters/viprule.filter.config.js +++ b/src/filters/customermanagement/viprule.filter.config.js @@ -1,4 +1,4 @@ -import { VipRuleFields } from "@/entities/viprule.entity"; +import { VipRuleFields } from "@/entities/customermanagement/viprule.entity"; export const getVipRuleFilterConfig = (t, customerTypeOptions) => { return { diff --git a/src/filters/internalfinance.filter.config.js b/src/filters/finance/internalfinance.filter.config.js similarity index 73% rename from src/filters/internalfinance.filter.config.js rename to src/filters/finance/internalfinance.filter.config.js index 5e2593d9ba77d5e67b284fc94c92b94147b0b33a..90b7d98675db7ac02b75f7bd0d07057c1058a6e4 100644 --- a/src/filters/internalfinance.filter.config.js +++ b/src/filters/finance/internalfinance.filter.config.js @@ -1,4 +1,4 @@ -import { InternalFinanceFields } from "@/entities/internalfinance.entity"; +import { InternalFinanceFields } from "@/entities/finance/internalfinance.entity"; import dayjs from "dayjs"; export const getInternalFinanceFilterConfig = ( @@ -30,7 +30,7 @@ export const getInternalFinanceFilterConfig = ( options: personOptions, }, { - name: InternalFinanceFields.ACQUISITIONDATE, + name: InternalFinanceFields.DATE_RANGE_DTO, type: "date-range", label: t("message.internalfinanceTime"), startPlaceholder: t("message.startDate"), @@ -38,9 +38,12 @@ export const getInternalFinanceFilterConfig = ( filterFn: (value, itemValue, item) => { if (!value || value.length !== 2) return true; const [start, end] = value; - const itemDate = dayjs(itemValue); + if (!itemValue || !itemValue.Start || !itemValue.End) return true; + const itemStart = dayjs(itemValue.Start); + const itemEnd = dayjs(itemValue.End); + // 检查数据范围是否与过滤范围重叠 return ( - itemDate.isAfter(dayjs(start)) && itemDate.isBefore(dayjs(end)) + itemStart.isBefore(dayjs(end)) && itemEnd.isAfter(dayjs(start)) ); }, }, diff --git a/src/filters/employee.filter.config.js b/src/filters/humanresourcemanagement/employee.filter.config.js similarity index 89% rename from src/filters/employee.filter.config.js rename to src/filters/humanresourcemanagement/employee.filter.config.js index 0964cb241fe1e2fb3171b594f311240c48ca3054..25e73b920eb0f458c585962072c061230667fc8c 100644 --- a/src/filters/employee.filter.config.js +++ b/src/filters/humanresourcemanagement/employee.filter.config.js @@ -1,4 +1,4 @@ -import { EmployeeFields } from "@/entities/employee.entity"; +import { EmployeeFields } from "@/entities/humanresourcemanagement/employee.entity"; import dayjs from "dayjs"; export const getEmployeeFilterConfig = ( @@ -16,12 +16,12 @@ export const getEmployeeFilterConfig = ( label: t("message.employeeName"), placeholder: t("message.pleaseInputEmployeeName"), }, - { - name: EmployeeFields.PHONENUMBER, - type: "text", - label: t("message.phoneNumber"), - placeholder: t("message.pleaseInputPhoneNumber"), - }, + // { + // name: EmployeeFields.PHONENUMBER, + // type: "text", + // label: t("message.phoneNumber"), + // placeholder: t("message.pleaseInputPhoneNumber"), + // }, { name: EmployeeFields.DEPARTMENT, type: "select", diff --git a/src/filters/energymanagement.filter.config.js b/src/filters/hydroelectricity/energymanagement.filter.config.js similarity index 92% rename from src/filters/energymanagement.filter.config.js rename to src/filters/hydroelectricity/energymanagement.filter.config.js index bb4dd759b7c9be1b05233ff5aeebb10391b233e0..1d1dbc4da1f94bb6c3d8052c52321b4495343854 100644 --- a/src/filters/energymanagement.filter.config.js +++ b/src/filters/hydroelectricity/energymanagement.filter.config.js @@ -1,4 +1,4 @@ -import { EnergyManagementFields } from "@/entities/energymanagement.entity"; +import { EnergyManagementFields } from "@/entities/hydroelectricity/energymanagement.entity"; import dayjs from "dayjs"; export const getEnergyManagementFilterConfig = (t) => { diff --git a/src/filters/goods.filter.config.js b/src/filters/materialmanagement/goods.filter.config.js similarity index 86% rename from src/filters/goods.filter.config.js rename to src/filters/materialmanagement/goods.filter.config.js index ab48c0ca1db915429eeadafaf36132ce230ce3ac..9bc238c67ad1c7ea7aea1856e1d09a3f6037fec7 100644 --- a/src/filters/goods.filter.config.js +++ b/src/filters/materialmanagement/goods.filter.config.js @@ -1,4 +1,4 @@ -import { GoodsFields } from "@/entities/goods.entity"; +import { GoodsFields } from "@/entities/materialmanagement/goods.entity"; export const getGoodsFilterConfig = (t) => { return { diff --git a/src/filters/log.filter.config.js b/src/filters/operationmanagement/log.filter.config.js similarity index 95% rename from src/filters/log.filter.config.js rename to src/filters/operationmanagement/log.filter.config.js index 1ab9e658dfe81d2892c9573e4f3a386f780ae0a1..194b470c94a218ed43e9bc8574095ebcabf7cb45 100644 --- a/src/filters/log.filter.config.js +++ b/src/filters/operationmanagement/log.filter.config.js @@ -1,4 +1,4 @@ -import { LogFields } from "@/entities/log.entity"; +import { LogFields } from "@/entities/operationmanagement/log.entity"; import dayjs from "dayjs"; export const getLogFilterConfig = (t) => { diff --git a/src/filters/requestlog.filter.config.js b/src/filters/operationmanagement/requestlog.filter.config.js similarity index 94% rename from src/filters/requestlog.filter.config.js rename to src/filters/operationmanagement/requestlog.filter.config.js index a3e190701d4b29e6594353591364b8d9f8ccfeb2..e5951818efaf7d92ce5b2182cb6fc539ce32d324 100644 --- a/src/filters/requestlog.filter.config.js +++ b/src/filters/operationmanagement/requestlog.filter.config.js @@ -1,4 +1,4 @@ -import { LogFields } from "@/entities/requestlog.entity"; +import { LogFields } from "@/entities/operationmanagement/requestlog.entity"; import dayjs from "dayjs"; export const getRequestLogFilterConfig = (t) => { diff --git a/src/filters/reser.filter.config.js b/src/filters/roominformation/reser.filter.config.js similarity index 90% rename from src/filters/reser.filter.config.js rename to src/filters/roominformation/reser.filter.config.js index e21aedd7a81ddec2540101c1380531c5693ced98..0841fd49fe9dbd497412ea845a7d8af0c320ed01 100644 --- a/src/filters/reser.filter.config.js +++ b/src/filters/roominformation/reser.filter.config.js @@ -1,4 +1,4 @@ -import { ReserFields } from "@/entities/reser.entity"; +import { ReserFields } from "@/entities/roominformation/reser.entity"; import dayjs from "dayjs"; export const getReserFilterConfig = (t, roomOptions, reserTypeOptions) => { @@ -25,9 +25,9 @@ export const getReserFilterConfig = (t, roomOptions, reserTypeOptions) => { options: reserTypeOptions, }, { - name: ReserFields.ROOMNUMBER, + name: ReserFields.ROOM_ID, type: "select", - label: t("message.reserRoomNumber"), + label: t("message.roomLocator"), placeholder: t("message.pleaseSelect"), options: roomOptions, }, diff --git a/src/filters/room.filter.config.js b/src/filters/roominformation/room.filter.config.js similarity index 73% rename from src/filters/room.filter.config.js rename to src/filters/roominformation/room.filter.config.js index e9a9756f3c31394746745db09cd255c63ed1ef66..7669fedcf02f942e6bf9daac1fa95c08efd7440d 100644 --- a/src/filters/room.filter.config.js +++ b/src/filters/roominformation/room.filter.config.js @@ -1,4 +1,4 @@ -import { RoomFields } from "@/entities/room.entity"; +import { RoomFields } from "@/entities/roominformation/room.entity"; export const getRoomFilterConfig = (t, roomTypeOptions) => { return { @@ -11,10 +11,16 @@ export const getRoomFilterConfig = (t, roomTypeOptions) => { placeholder: t("message.pleaseInputRoomNo"), }, { - name: RoomFields.NAME, + name: RoomFields.AREA, type: "text", - label: t("message.roomName"), - placeholder: t("message.pleaseInputRoomName"), + label: t("message.roomArea"), + placeholder: t("message.pleaseInputRoomArea"), + }, + { + name: RoomFields.FLOOR, + type: "number", + label: t("message.roomFloor"), + placeholder: t("message.pleaseInputRoomFloor"), }, { name: RoomFields.TYPE, diff --git a/src/filters/roomconfig.filter.config.js b/src/filters/roominformation/roomconfig.filter.config.js similarity index 79% rename from src/filters/roomconfig.filter.config.js rename to src/filters/roominformation/roomconfig.filter.config.js index 0b7712e67ad31c574e70692ae1674e0ee09026c6..6321f8f093c089318fa081306828ba227731fdd7 100644 --- a/src/filters/roomconfig.filter.config.js +++ b/src/filters/roominformation/roomconfig.filter.config.js @@ -1,4 +1,4 @@ -import { RoomConfigFields } from "@/entities/roomconfig.entity"; +import { RoomConfigFields } from "@/entities/roominformation/roomconfig.entity"; export const getRoomConfigFilterConfig = (t) => { return { diff --git a/src/components/common/filterConfigBuilder.js b/src/filters/shared/filterConfigBuilder.js similarity index 97% rename from src/components/common/filterConfigBuilder.js rename to src/filters/shared/filterConfigBuilder.js index 8fa70fb205a7c8ad8debcb2ba4a8b61ebc44229a..695706649a633b2007dd9080478d85ba2bdb6591 100644 --- a/src/components/common/filterConfigBuilder.js +++ b/src/filters/shared/filterConfigBuilder.js @@ -1,5 +1,5 @@ import { dateFieldConfig } from "@/config/dateFields"; -import { BaseFields } from "@/common.entity"; +import { BaseFields } from "@/entities/common.entity"; const BASE_EXCLUDE = new Set([ BaseFields.ID, diff --git a/src/filters/supervision.filter.config.js b/src/filters/supervision/supervision.filter.config.js similarity index 57% rename from src/filters/supervision.filter.config.js rename to src/filters/supervision/supervision.filter.config.js index da0e923b9d7ae6bb2a528acb30271c39bc309601..32a771d6f76d3cb5d93343f3bc449644fc2789b3 100644 --- a/src/filters/supervision.filter.config.js +++ b/src/filters/supervision/supervision.filter.config.js @@ -1,4 +1,4 @@ -import { SupervisionFields } from "@/entities/supervision.entity"; +import { SupervisionFields } from "@/entities/supervision/supervision.entity"; export const getSupervisionFilterConfig = (t, departmentOptions) => { return { @@ -35,6 +35,24 @@ export const getSupervisionFilterConfig = (t, departmentOptions) => { label: t("message.checkAdvice"), placeholder: t("message.pleaseInputCheckAdvice"), }, + { + name: SupervisionFields.DATE_RANGE_DTO, + type: "date-range", + label: t("message.checkDate"), + startPlaceholder: t("message.startDate"), + endPlaceholder: t("message.endDate"), + filterFn: (value, itemValue, item) => { + if (!value || value.length !== 2) return true; + const [start, end] = value; + if (!itemValue || !itemValue.Start || !itemValue.End) return true; + const itemStart = dayjs(itemValue.Start); + const itemEnd = dayjs(itemValue.End); + // 检查数据范围是否与过滤范围重叠 + return ( + itemStart.isBefore(dayjs(end)) && itemEnd.isAfter(dayjs(start)) + ); + }, + }, ], }; }; diff --git a/src/filters/administatortype.filter.config.js b/src/filters/systemmanagement/administatortype.filter.config.js similarity index 76% rename from src/filters/administatortype.filter.config.js rename to src/filters/systemmanagement/administatortype.filter.config.js index c785ee833427c6648c5b39975e5ba392160f7177..1ce96c221dc894f1cd1dfb6294794863e34b0a28 100644 --- a/src/filters/administatortype.filter.config.js +++ b/src/filters/systemmanagement/administatortype.filter.config.js @@ -1,4 +1,4 @@ -import { AdministratorTypeFields } from "@/entities/administratortype.entity"; +import { AdministratorTypeFields } from "@/entities/systemmanagement/administratortype.entity"; export const getAdminTypeFilterConfig = (t) => { return { diff --git a/src/filters/administrator.filter.config.js b/src/filters/systemmanagement/administrator.filter.config.js similarity index 89% rename from src/filters/administrator.filter.config.js rename to src/filters/systemmanagement/administrator.filter.config.js index 8d774d96bb293f44f958c1c2a348de56e15cf50b..002eceea051bdca7094090e7ce13d7d61c596d2e 100644 --- a/src/filters/administrator.filter.config.js +++ b/src/filters/systemmanagement/administrator.filter.config.js @@ -1,4 +1,4 @@ -import { AdministratorFields } from "@/entities/administrator.entity"; +import { AdministratorFields } from "@/entities/systemmanagement/administrator.entity"; export const getAdministratorFilterConfig = (t, adminTypeOptions) => { return { diff --git a/src/filters/menu.filter.config.js b/src/filters/systemmanagement/menu.filter.config.js similarity index 80% rename from src/filters/menu.filter.config.js rename to src/filters/systemmanagement/menu.filter.config.js index 2d65bafb8e3eba10f816af11d07f6b0f9916ddff..91d1d27caf780136961de671f248a76654678de7 100644 --- a/src/filters/menu.filter.config.js +++ b/src/filters/systemmanagement/menu.filter.config.js @@ -1,4 +1,4 @@ -import { MenuFields } from "@/entities/menu.entity"; +import { MenuFields } from "@/entities/systemmanagement/menu.entity"; export const getMenuFilterConfig = (t) => { return { diff --git a/src/filters/role.filter.config.js b/src/filters/systemmanagement/role.filter.config.js similarity index 86% rename from src/filters/role.filter.config.js rename to src/filters/systemmanagement/role.filter.config.js index 8dd2bdb7ad0a38459e137a4eaf3698ef7bb9c2c2..aa9ce5449102e4d3c926f7efb3f5ec15fa21af7c 100644 --- a/src/filters/role.filter.config.js +++ b/src/filters/systemmanagement/role.filter.config.js @@ -1,4 +1,4 @@ -import { RoleFields } from "@/entities/role.entity"; +import { RoleFields } from "@/entities/systemmanagement/role.entity"; export const getRoleFilterConfig = (t) => { return { diff --git a/src/i18n.js b/src/i18n.js index bba2efcf423d5eeffbdc4a98b88adcc7ff89aea3..fdb92a91ced9090697397f4d3fa26310cf0491e7 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -3,6 +3,7 @@ import { createI18n } from "vue-i18n"; const messages = { "en-US": { message: { + all: "All", hello: "hello", welcome: "Welcome to our application", username: "Username", @@ -13,6 +14,18 @@ const messages = { signup: "Sign Up", logout: "Log out", home: "Home", + favoriteCollection: "Favorites", + addToFavoriteCollection: "Add to favorites", + removeFromFavoriteCollection: "Remove from favorites", + favoriteAdded: "Page added to favorites", + favoriteRemoved: "Page removed from favorites", + savingFavoriteCollection: "Saving favorites, please wait...", + favoriteCollectionIdentityChanged: + "Login identity changed. Refresh the page and try again.", + favoriteCollectionConflictRefreshed: + "Favorites changed in another page. The latest server state has been reloaded.", + favoriteCollectionSyncFailed: + "Failed to sync favorites. Please try again later.", operation: "Operation", edit: "Edit", delete: "Delete", @@ -28,6 +41,22 @@ const messages = { success: "Success", error: "Error", undefined: "Undefined", + check: "Check", + createdBy: "Created By", + createdTime: "Created Time", + lastUpdatedBy: "Last Updated By", + lastUpdatedTime: "Last Updated Time", + copyCustomerNumber: "Copy Customer Number", + customerNumberCopied: "Customer number copied", + customerNotFound: "Customer information not found", + customerNotChecked: + "Please click the check button to confirm if the customer exists", + roomDataMissing: "Room data is missing. Please reopen the dialog.", + customerFound: "Customer information found", + checkinNeedCustomerRegistration: + "Please complete customer registration before check-in. Redirecting to Customer Management.", + reservationNotFoundForRoom: + "No available reservation was found for the selected room.", my: "My", passwordEditTip: "Do not change this field if you do not want to change your password.", @@ -38,6 +67,8 @@ const messages = { avatarUpdateSuccess: "Avatar Update Success", selectedRecordNotFound: "Selected record not found", uploadImageOnly: "Only image format is supported", + avatarInvalidFile: + "Only JPG / PNG images are supported. Please choose a valid image file.", imageSizeLimit: "Image size cannot exceed 1MB", loading: "Loading...", verifyCsrfTokenFailed: "Failed to verify CSRF Token", @@ -47,10 +78,23 @@ const messages = { batchDeleteSuccess: "Batch Delete Success", resetPassword: "Reset Password", selectYourLang: "Please choose your language", + lightMode: "Light", + darkMode: "Dark", + switchToDarkMode: "Switch to dark mode", + switchToLightMode: "Switch to light mode", accountType: "Account Type", pleaseSelectAccountType: "Please select account type", accountTypeAdmin: "Admin", accountTypeEmployee: "Employee", + employeeCheckIn: "Check In", + employeeCheckedIn: "Checked In", + morningShift: "Morning Shift", + eveningShift: "Evening Shift", + employeeShiftCheckedIn: "{shift} Checked In", + employeeCheckInSuccess: "Check-in recorded.", + employeeCheckInAlreadyDone: "Current shift already checked in.", + employeeCheckInIdentityMissing: + "Current employee identity is missing. Unable to check in.", twoFactor: "2FA", twoFactorVerification: "Two-Factor Verification", twoFactorAuthentication: "Two-Factor Authentication", @@ -94,6 +138,15 @@ const messages = { permissionCheckError: "Permission check failed, Please retry or contact administrator.", refreshData: "Refresh Data", + exportData: "Export Data", + exportCurrentPage: "Export Current Page", + exportAllPages: "Export All Pages", + exportSuccess: "Export Success", + exportFailed: "Export Failed", + exportEmpty: "No data available for export", + exportColumnEmpty: "No exportable columns were found", + exportAllPages: "Export all pages data", + exportCurrentPage: "Export current page data", addSuccess: "Add Success", updateSuccess: "Update Success", deleteSuccess: "Delete Success", @@ -137,6 +190,45 @@ const messages = { loginExpired: "Login expired, please log in again", unexpectedError: "An unexpected error occurred", serverVersion: "Server Version", + profileCenter: "Profile Center", + accountAvatar: "Account Avatar", + accountInfo: "Account Info", + accountSecurity: "Account Security", + securityOverview: "Security Overview", + rolePermissionCodes: "Role & Permission Codes", + roleCodes: "Role Codes", + directPermissionCodes: "Direct Permission Codes", + effectivePermissionCodes: "Effective Permission Codes", + permissionSource: "Permission Source", + permissionSourceRole: "Granted by Role", + permissionSourceDirect: "Granted Directly", + permissionSourceRoleAndDirect: "Role + Direct", + permissionSourceCache: "Local Cache", + profilePermissionCacheFallback: + "Permission detail APIs are unavailable. Showing locally cached effective permission codes.", + accountAvatarUploadUnsupported: + "The current account type has no avatar upload API yet. The backend adaptation document lists the required interface.", + profileAvatarUploadTip: "Supported formats: JPG / PNG, maximum size 1MB.", + passwordChangeApiPending: "Password change API is not connected yet.", + passwordChangeApiPendingDetail: + "The frontend reserves the account security section. A backend contract document has been added for self-service password change and admin avatar support.", + oldPassword: "Old Password", + newPassword: "New Password", + confirmPassword: "Confirm Password", + changePassword: "Change Password", + passwordChangeTip: + "After changing the password, the current session will be cleared and you need to sign in again.", + pleaseInputOldPassword: "Please input the current password", + pleaseInputNewPassword: "Please input the new password", + pleaseInputConfirmPassword: "Please confirm the new password", + passwordConfirmMismatch: + "The confirmation password does not match the new password.", + passwordMinLength: "Password must be at least 6 characters.", + passwordMustDiffer: + "The new password must be different from the current password.", + passwordChangeFailed: "Failed to change password.", + passwordChangeSuccessRelogin: + "Password changed successfully. Please sign in again.", homeAccountLabel: "Account", homeUpdatedAtLabel: "Updated At", homeAdminDetailPermissionFallback: @@ -236,6 +328,7 @@ const messages = { deleteDepartment: "Delete Department", pleaseInputDepartmentName: "Please input department name", pleaseInputDepartmentNo: "Please input department no", + pleaseInputDepartmentDesc: "Please input department description", pleaseInputDepartmentLeader: "Please select department leader", pleaseInputDepartmentParent: "Please select department parent", departmentNo: "Department No", @@ -347,6 +440,7 @@ const messages = { pleaseInputCheckScore: "Please input SupervisionInfo Check Score", pleaseInputCheckPerson: "Please input SupervisionInfo Check Person", pleaseInputCheckAdvice: "Please input SupervisionInfo Check Advice", + pleaseInputCheckDate: "Please input SupervisionInfo Check Date", checkNo: "SupervisionInfo No", checkDepartment: "Check Department", checkProgres: "Check Progress", @@ -354,6 +448,7 @@ const messages = { checkScore: "Check Score", checkPerson: "Check Person", checkAdvice: "Check Advice", + checkDate: "Check Date", supervisionFilter: "Supervision Filter", dataInsDateStart: "Start Date", dataInsDateEnd: "End Date", @@ -371,9 +466,14 @@ const messages = { pleaseInputRoomState: "Please input Room State", pleaseInputRoomRent: "Please input Room Rent", pleaseInputRoomDeposit: "Please input Room Deposit", - pleaseInputRoomPosition: "Please input Room Position", + pleaseInputRoomArea: "Please input Room Area", + pleaseInputRoomFloor: "Please input Room Floor", + pleaseInputRoomLocation: "Please input Room Location", + roomArea: "Room Area", + roomFloor: "Room Floor", + roomLocator: "Room Locator", roomState: "Room State", - roomPosition: "Room Position", + roomLocation: "Room Location", roomType: "Room Type", roomFilter: "Room Filter", roomName: "Room Name", @@ -416,10 +516,15 @@ const messages = { pleaseInputCustomerPassportType: "Please input customer passport type", pleaseInputCustomerPassportID: "Please input customer passport ID", pleaseInputCustomerAddress: "Please input customer address", + pleaseInputDetailAddress: "Please input detail address", + pleaseSelectRegion: "Please select region", pleaseInputCustomerBirth: "Please input customer birthday", pleaseInputCustomerType: "Please input customer type", invalidPhone: "Invalid Phone Number", invalidIdNumber: "Invalid ID Number", + invalidCustomerBirth: "Invalid Birth Date", + invalidCustomerPassportType: "Invalid Passport Type", + invalidCustomerType: "Invalid Customer Type", customerNo: "Customer No", customerName: "Customer Name", customerGender: "Customer Gender", @@ -450,6 +555,7 @@ const messages = { updateSpend: "Edit Spending Bill", viewSpend: "View Spending Bill", deleteSpend: "Delete Spending Bill", + pleaseEnter: "Please enter", pleaseInputSpendName: "Please input customer name", pleaseInputSpendAmount: "Please input customer Gender", pleaseInputSpendPrice: "Please input customer telephone number", @@ -467,6 +573,8 @@ const messages = { insertStaff: "Create Staff", updateStaff: "Edit Staff", + insertWorkHistory: "Add Work History", + updateWorkHistory: "Edit Work History", viewStaff: "View Staff", pleaseInputStaffName: "Please input staff name", pleaseInputEmployeeName: "Please input employee name", @@ -595,6 +703,7 @@ const messages = { deleteAdminType: "Delete Administrator Type", pleaseInputAdminTypeNumber: "Please input administrator type number", pleaseInputAdminTypeName: "Please input administrator type name", + pleaseInputAdminTypeDesc: "Please input administrator type description", adminTypeNumber: "Administrator Type Number", adminTypeName: "Administrator Type Name", adminTypeFilter: "Administrator Type Filter", @@ -633,6 +742,24 @@ const messages = { permissionName: "Permission Name", menuFilter: "Menu Filter", + quartzjoblist: "Quartz Job List", + jobName: "Job Name", + jobGroup: "Job Group", + triggerName: "Trigger Name", + triggerGroup: "Trigger Group", + triggerState: "Trigger State", + cronExpression: "Cron Expression", + nextFireTime: "Next Fire Time", + previousFireTime: "Previous Fire Time", + timeZone: "Time Zone", + quartzJobFilter: "Quartz Job Filter", + pleaseInputJobName: "Please input job name", + pleaseInputTriggerName: "Please input trigger name", + quartzStateNormal: "Normal", + quartzStatePaused: "Paused", + quartzStateBlocked: "Blocked", + quartzStateError: "Error", + promotioncontent: "Promotion Content Management", insertPromotionContent: "Create Promotion Content", updatePromotionContent: "Edit Promotion Content", @@ -683,6 +810,29 @@ const messages = { checkOutTime: "Check-out Time", roomRent: "Room Rent", roomDeposit: "Room Deposit", + currentPricing: "Current Pricing", + currentRoomRent: "Current Room Rent", + currentRoomDeposit: "Current Deposit", + standardRoomRent: "Standard Room Rent", + standardRoomDeposit: "Standard Deposit", + pricingOption: "Pricing Option", + pleaseSelectPricingOption: "Please select a pricing option", + pricingItems: "Additional Pricing Items", + pricingItem: "Pricing Item", + pricingCode: "Pricing Code", + pricingName: "Pricing Name", + stayHours: "Stay Hours", + sort: "Sort", + stayHoursHint: + "This pricing option is intended for stays within {hours} hour(s).", + addPricingItem: "Add Pricing Item", + noPricingItems: "No additional pricing items", + additionalPricingItemsHint: + "Keep the standard rent and deposit in the original fields, and configure only extra pricing items here.", + pleaseInputPricingCode: "Please input pricing code", + pleaseInputPricingName: "Please input pricing name", + pricingCodeDuplicate: "Pricing code cannot be duplicated", + standardPrice: "Standard Price", custoName: "Customer Name", dayUnit: "Day", totalRecords: "Total {total} Records", @@ -691,12 +841,17 @@ const messages = { normal: "INFO", error: "CRITICAL", warning: "WARNING", - reserve: "Reserve", + reserve: "Reserve Room", checkIn: "Check In", transferRoom: "Transfer Room", checkOut: "Check Out", changeRoomState: "Change Room State", viewCustomerInfo: "View Customer Info", + roomGoodsConsumption: "Room Goods Consumption", + recallSpend: "Recall Consumption", + pleaseSelectGoodsFirst: "Please select a product first", + pleaseSelectSpendFirst: "Please select a consumption record first", + roomMissingCustomerNumber: "The current room has no customer number", roomOverview: "Room Overview", roomStatusDistribution: "Room Status Distribution", @@ -752,13 +907,35 @@ const messages = { late: "Late", absent: "Absent", consumptionTime: "Consumption Time", + consumptionTotal: "Consumption Total", + payableAmount: "Payable Amount", + vipDiscount: "VIP Discount", + changeAmount: "Change Amount", + actualReceived: "Actual Received", + actualReceivedInsufficient: + "Actual received amount cannot be less than the payable amount.", + settle: "Settle", + discount: "Discount", + discountTextWithType: "{type} {offPercent}% off", + discountText: "{offPercent}% off", + discountTextNoDiscount: "No discount", pleaseInputPath: "Please input path", pleaseInputUserName: "Please input user name", - }, - }, + + roomMapOperationHint: + "Tip: Right-click a room card to view available action. Cards with shortcut support will show a double-click hint on hover.", + doubleClickAction: "Double-click{action}", + closeTab: "Close Tab", + closeLeftTabs: "Close Tabs to the Left", + closeRightTabs: "Close Tabs to the Right", + closeOtherTabs: "Close Other Tabs", + closeAllTabs: "Close All Tabs", + }, + }, "zh-CN": { message: { + all: "全部", hello: "你好", welcome: "欢迎使用我们的应用程序", username: "用户账号", @@ -769,6 +946,16 @@ const messages = { signup: "注册", logout: "登出", home: "主页", + favoriteCollection: "收藏夹", + addToFavoriteCollection: "添加到收藏夹", + removeFromFavoriteCollection: "从收藏夹中移除", + favoriteAdded: "页面已添加到收藏夹", + favoriteRemoved: "页面已从收藏夹中移除", + savingFavoriteCollection: "正在保存收藏夹,请稍候...", + favoriteCollectionIdentityChanged: "登录身份已变化,请刷新页面后重试。", + favoriteCollectionConflictRefreshed: + "收藏夹已在其他页面更新,已同步为服务端最新结果。", + favoriteCollectionSyncFailed: "收藏夹同步失败,请稍后重试。", operation: "操作", edit: "编辑", delete: "删除", @@ -783,6 +970,20 @@ const messages = { success: "成功", error: "错误", id: "编号", + check: "检查", + createdBy: "创建人", + createdTime: "创建时间", + lastUpdatedBy: "最后更新人", + lastUpdatedTime: "最后更新时间", + copyCustomerNumber: "复制客户编号", + customerNumberCopied: "客户编号已复制", + customerNotFound: "未找到客户信息", + customerNotChecked: "请先点击检查按钮确认客户是否存在", + roomDataMissing: "房间数据缺失,请重新打开弹窗后重试", + customerFound: "客户信息已找到", + checkinNeedCustomerRegistration: + "请先完成客户信息注册再进行入住,系统将跳转至客户管理页面。", + reservationNotFoundForRoom: "未找到对应房间的有效预约信息。", my: "我的", passwordEditTip: "留空表示不修改密码", required: "请输入 {field}", @@ -792,6 +993,7 @@ const messages = { avatarUpdateSuccess: "头像更新成功", selectedRecordNotFound: "选中的记录未找到", uploadImageOnly: "仅支持图片格式", + avatarInvalidFile: "仅支持 JPG / PNG 格式图片,请重新选择有效图片文件。", imageSizeLimit: "图片大小不能超过 1MB", loading: "加载中...", verifyCsrfTokenFailed: "验证CSRF Token失败", @@ -801,10 +1003,22 @@ const messages = { batchDeleteSuccess: "批量删除成功", resetPassword: "重置密码", selectYourLang: "请选择您的语言", + lightMode: "浅色", + darkMode: "深色", + switchToDarkMode: "切换为深色模式", + switchToLightMode: "切换为浅色模式", accountType: "账号类型", pleaseSelectAccountType: "请选择账号类型", accountTypeAdmin: "管理员", accountTypeEmployee: "员工", + employeeCheckIn: "打卡", + employeeCheckedIn: "已打卡", + morningShift: "早班", + eveningShift: "晚班", + employeeShiftCheckedIn: "{shift}已打卡", + employeeCheckInSuccess: "打卡成功", + employeeCheckInAlreadyDone: "当前班次已打卡", + employeeCheckInIdentityMissing: "未找到当前员工标识,无法打卡。", twoFactor: "两步验证入口", twoFactorVerification: "两步验证", twoFactorAuthentication: "两步验证设置", @@ -842,6 +1056,13 @@ const messages = { permissionCheckError: "权限检查发生错误,请重试或联系管理员", refreshData: "刷新数据", addSuccess: "添加成功", + exportData: "导出数据", + exportSuccess: "导出成功", + exportFailed: "导出失败", + exportEmpty: "没有数据可以导出", + exportColumnEmpty: "选中的列没有数据", + exportAllPages: "导出所有页数据", + exportCurrentPage: "导出当前页数据", updateSuccess: "更新成功", deleteSuccess: "删除成功", restoreSuccess: "恢复成功", @@ -874,6 +1095,7 @@ const messages = { invalidCredentials: "无效的凭据", noPermission: "无权限", notFound: "未找到", + networkError: "网络错误", validationFailed: "验证失败", duplicate: "重复数据", serverError: "服务器错误", @@ -959,6 +1181,7 @@ const messages = { deleteDepartment: "删除部门", pleaseInputDepartmentName: "请输入部门名称", pleaseInputDepartmentNo: "请输入部门编号", + pleaseInputDepartmentDesc: "请输入部门描述", pleaseInputDepartmentLeader: "请输入部门主管", pleaseInputDepartmentParent: "请输入上级部门", departmentNo: "部门编号", @@ -1069,6 +1292,7 @@ const messages = { pleaseInputCheckScore: "请输入本次监管评分", pleaseInputCheckPerson: "请输入本次监管人员", pleaseInputCheckAdvice: "请输入本次监管建议", + pleaseInputCheckDate: "请输入监管日期", checkNo: "监管情况编号", checkDepartment: "受监管部门", checkProgres: "监管进度", @@ -1076,6 +1300,7 @@ const messages = { checkScore: "本次评分", checkPerson: "本次监管人员", checkAdvice: "本次监管建议", + checkDate: "监管日期", supervisionFilter: "监管筛选", dataInsDateStart: "开始日期", dataInsDateEnd: "结束日期", @@ -1090,9 +1315,14 @@ const messages = { pleaseInputRoomState: "请输入房间状态", pleaseInputRoomRent: "请输入房间租金", pleaseInputRoomDeposit: "请输入房间押金", - pleaseInputRoomPosition: "请输入房间位置", + pleaseInputRoomArea: "请输入房间区域", + pleaseInputRoomFloor: "请输入房间楼层", + pleaseInputRoomLocation: "请输入房间位置", + roomArea: "房间区域", + roomFloor: "房间楼层", + roomLocator: "房间定位", roomState: "房间状态", - roomPosition: "房间位置", + roomLocation: "房间位置", roomType: "房间类型", roomFilter: "房间筛选", @@ -1135,14 +1365,19 @@ const messages = { pleaseInputCustomerPassportType: "请输入客户证件类型", pleaseInputCustomerPassportID: "请输入客户证件号码", pleaseInputCustomerAddress: "请输入客户地址", + pleaseInputDetailAddress: "请输入详细地址", + pleaseSelectRegion: "请选择地区", pleaseInputCustomerBirth: "请输入客户出生日期", pleaseInputCustomerType: "请输入客户类型", invalidPhone: "无效的电话号码", invalidIdNumber: "无效的身份证号码", + invalidCustomerBirth: "无效的出生日期", + invalidCustomerPassportType: "无效的证件类型", + invalidCustomerType: "无效的客户类型", customerNo: "客户编号", customerName: "客户姓名", customerGender: "客户性别", - customerTel: "客户电话号码", + customerTel: "电话号码", customerPassportType: "证件类型", customerPassportID: "证件号码", customerAddress: "客户地址", @@ -1166,9 +1401,14 @@ const messages = { customerspend: "客户消费记录", insertSpend: "添加消费记录", + recallSpend: "撤回消费", updateSpend: "编辑消费记录", viewSpend: "查看消费记录", deleteSpend: "删除消费记录", + pleaseSelectGoodsFirst: "请先选择商品", + pleaseSelectSpendFirst: "请先选择一条消费记录", + roomMissingCustomerNumber: "当前房间缺少入住客户编号", + pleaseEnter: "请输入", pleaseInputSpendName: "请输入商品名称", pleaseInputSpendAmount: "请输入商品数量", pleaseInputSpendPrice: "请输入单价", @@ -1186,6 +1426,8 @@ const messages = { insertStaff: "添加员工", updateStaff: "编辑员工", + insertWorkHistory: "添加履历", + updateWorkHistory: "编辑履历", viewStaff: "查看员工", pleaseInputStaffName: "请输入员工姓名", pleaseInputEmployeeName: "请输入员工姓名", @@ -1313,6 +1555,7 @@ const messages = { deleteAdminType: "删除管理员类型", pleaseInputAdminTypeNumber: "请输入管理员类型编号", pleaseInputAdminTypeName: "请输入管理员类型名称", + pleaseInputAdminTypeDesc: "请输入管理员类型描述", adminTypeNumber: "管理员类型编号", adminTypeName: "管理员类型名称", adminTypeFilter: "管理员类型筛选", @@ -1351,6 +1594,24 @@ const messages = { permissionName: "权限名称", menuFilter: "菜单筛选", + quartzjoblist: "定时任务列表", + jobName: "任务名称", + jobGroup: "任务分组", + triggerName: "触发器名称", + triggerGroup: "触发器分组", + triggerState: "触发器状态", + cronExpression: "Cron表达式", + nextFireTime: "下次执行时间", + previousFireTime: "上次执行时间", + timeZone: "时区", + quartzJobFilter: "定时任务筛选", + pleaseInputJobName: "请输入任务名称", + pleaseInputTriggerName: "请输入触发器名称", + quartzStateNormal: "正常", + quartzStatePaused: "暂停", + quartzStateBlocked: "阻塞", + quartzStateError: "异常", + promotioncontent: "宣传联动内容管理", insertPromotionContent: "创建宣传联动内容", updatePromotionContent: "编辑宣传联动内容", @@ -1399,6 +1660,28 @@ const messages = { checkOutTime: "退房时间", roomRent: "房间租金", roomDeposit: "房间押金", + currentPricing: "当前计价", + currentRoomRent: "当前房费", + currentRoomDeposit: "当前押金", + standardRoomRent: "标准价", + standardRoomDeposit: "标准押金", + pricingOption: "计价项", + pleaseSelectPricingOption: "请选择计价项", + pricingItems: "附加计价项", + pricingItem: "计价项", + pricingCode: "计价编码", + pricingName: "计价名称", + stayHours: "停留小时数", + sort: "排序", + stayHoursHint: "该计价项适用于 {hours} 小时内入住展示", + addPricingItem: "新增计价项", + noPricingItems: "暂无附加计价项", + additionalPricingItemsHint: + "标准价仍由房租和押金字段维护,这里只配置额外计价项。", + pleaseInputPricingCode: "请输入计价编码", + pleaseInputPricingName: "请输入计价名称", + pricingCodeDuplicate: "计价编码不能重复", + standardPrice: "标准价", custoName: "客户姓名", dayUnit: "天", totalRecords: "共 {total} 条记录", @@ -1407,12 +1690,13 @@ const messages = { normal: "常规操作", error: "严重操作", warning: "敏感操作", - reserve: "预约", - checkIn: "入住", - transferRoom: "转房", - checkOut: "退房", + reserve: "预约房间", + checkIn: "办理入住", + transferRoom: "转换房间", + checkOut: "结算退房", changeRoomState: "更改房间状态", viewCustomerInfo: "查看客户信息", + roomGoodsConsumption: "商品消费", roomOverview: "客房概览", roomStatusDistribution: "房间状态分布", @@ -1468,6 +1752,17 @@ const messages = { late: "迟到", absent: "旷工", consumptionTime: "消费时间", + consumptionTotal: "消费总额", + payableAmount: "应付金额", + vipDiscount: "会员折扣", + changeAmount: "找零金额", + actualReceived: "实收金额", + actualReceivedInsufficient: "实收金额不能小于应付金额", + settle: "结 算", + discount: "折", + discountTextWithType: "{type} {fold}折 (优惠{offPercent}%)", + discountText: "{fold}折 (优惠{offPercent}%)", + discountTextNoDiscount: "无折扣(10折)", pleaseInputPath: "请输入请求路径", pleaseInputUserName: "请输入用户名", @@ -1536,8 +1831,52 @@ const messages = { homeAdminDetailNotFound: "管理员详情接口未返回当前账号数据。", homeAdminProfileLoadFailed: "管理员信息加载失败", homeEnvironmentLoadFailed: "系统环境配置加载失败", - }, - }, + + profileCenter: "个人中心", + accountAvatar: "账号头像", + accountInfo: "账号信息", + accountSecurity: "账号安全", + securityOverview: "安全概览", + rolePermissionCodes: "角色及权限代码", + roleCodes: "角色编码", + directPermissionCodes: "直接权限编码", + effectivePermissionCodes: "生效权限编码", + permissionSource: "来源", + permissionSourceRole: "角色授权", + permissionSourceDirect: "直接授权", + permissionSourceRoleAndDirect: "角色 + 直接", + permissionSourceCache: "本地缓存", + profilePermissionCacheFallback: + "当前无法调用权限详情接口,已展示本地缓存的生效权限编码。", + accountAvatarUploadUnsupported: + "当前账号类型暂未接入头像上传接口,具体适配要求请见后端对接文档。", + profileAvatarUploadTip: "支持 JPG / PNG 格式,图片大小不能超过 1MB。", + passwordChangeApiPending: "密码修改接口尚未对接。", + passwordChangeApiPendingDetail: + "前端已预留账号安全分栏,并在 docs 中补充了自助修改密码和管理员头像接口合同。", + oldPassword: "当前密码", + newPassword: "新密码", + confirmPassword: "确认新密码", + changePassword: "修改密码", + passwordChangeTip: "修改密码后将清空当前登录态,需要重新登录。", + pleaseInputOldPassword: "请输入当前密码", + pleaseInputNewPassword: "请输入新密码", + pleaseInputConfirmPassword: "请再次输入新密码", + passwordConfirmMismatch: "两次输入的新密码不一致。", + passwordMinLength: "密码长度不能少于 6 位。", + passwordMustDiffer: "新密码不能与当前密码相同。", + passwordChangeFailed: "密码修改失败。", + passwordChangeSuccessRelogin: "密码修改成功,请重新登录。", + roomMapOperationHint: + "提示:对房间卡片点击鼠标右键可查看操作选项。支持快捷操作的卡片在悬停时会显示双击提示。", + doubleClickAction: "双击{action}", + closeTab: "关闭标签页", + closeLeftTabs: "关闭左侧标签页", + closeRightTabs: "关闭右侧标签页", + closeOtherTabs: "关闭其他标签页", + closeAllTabs: "关闭全部标签页", + }, + }, }; const i18n = createI18n({ diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue index 8f850bace44d061e8c78c7bedf681ad70986dd30..bbc39ddeb0dd464723d7dd96a0f3fe7f59098351 100644 --- a/src/layouts/MainLayout.vue +++ b/src/layouts/MainLayout.vue @@ -1,51 +1,98 @@