feat(mes): 新增假期设置日历页面,使用 dayjs-plugin-lunar 显示农历

基于 el-calendar 实现假期设置页面,右键日期可设置假期/工作日类型,
日历单元格显示班/休标签、农历日期、公历节日、农历节日和节气。
使用 dayjs-plugin-lunar(底层 tyme4ts)替代手写 667 行农历工具。

新增文件:
- src/api/mes/cal/holiday/index.ts
- src/views/mes/cal/holiday/index.vue
- src/views/mes/cal/holiday/HolidayForm.vue

修改文件:
- src/utils/dict.ts:新增 MES_CAL_HOLIDAY_TYPE

新增依赖:
- dayjs-plugin-lunar
pull/871/MERGE
YunaiV 2026-02-16 18:39:12 +08:00
parent cb56866deb
commit f40b415b9c
5 changed files with 612 additions and 241 deletions

538
package-lock.json generated
View File

@ -1,40 +1,43 @@
{
"name": "yudao-ui-admin-vue3",
"version": "2.5.0-snapshot",
"version": "2026.01-snapshot",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "yudao-ui-admin-vue3",
"version": "2.5.0-snapshot",
"version": "2026.01-snapshot",
"license": "MIT",
"dependencies": {
"@element-plus/icons-vue": "^2.1.0",
"@element-plus/icons-vue": "2.3.2",
"@form-create/designer": "^3.2.6",
"@form-create/element-ui": "^3.2.11",
"@iconify/iconify": "^3.1.1",
"@microsoft/fetch-event-source": "^2.0.1",
"@videojs-player/vue": "^1.0.0",
"@vueuse/core": "^10.9.0",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.10",
"@wangeditor-next/editor": "^5.6.46",
"@wangeditor-next/editor-for-vue": "^5.1.14",
"@wangeditor-next/plugin-mention": "^1.0.16",
"@zxcvbn-ts/core": "^3.0.4",
"animate.css": "^4.1.1",
"axios": "^1.6.8",
"axios": "1.9.0",
"benz-amr-recorder": "^1.1.5",
"bpmn-js-token-simulation": "^0.36.0",
"camunda-bpmn-moddle": "^7.0.1",
"cropperjs": "^1.6.1",
"crypto-js": "^4.2.0",
"dayjs": "^1.11.10",
"dayjs-plugin-lunar": "^1.4.1",
"diagram-js": "^12.8.0",
"driver.js": "^1.3.1",
"echarts": "^5.5.0",
"echarts-wordcloud": "^2.1.0",
"element-plus": "2.9.1",
"element-plus": "2.11.1",
"fast-xml-parser": "^4.3.2",
"highlight.js": "^11.9.0",
"jsencrypt": "^3.3.2",
"jsoneditor": "^10.1.3",
"lodash-es": "^4.17.21",
"markdown-it": "^14.1.0",
"markmap-common": "^0.16.0",
@ -48,16 +51,17 @@
"pinia-plugin-persistedstate": "^3.2.1",
"qrcode": "^1.5.3",
"qs": "^6.12.0",
"snabbdom": "^3.6.2",
"sortablejs": "^1.15.3",
"steady-xml": "^0.1.0",
"url": "^0.11.3",
"v3-jsoneditor": "^0.0.6",
"video.js": "^7.21.5",
"vue": "3.5.12",
"vue-dompurify-html": "^4.1.4",
"vue-i18n": "9.10.2",
"vue-router": "4.4.5",
"vue-types": "^5.1.1",
"vue3-print-nb": "^0.1.4",
"vue3-signature": "^0.2.4",
"vuedraggable": "^4.1.0",
"web-storage-cache": "^1.1.1",
@ -69,6 +73,7 @@
"@iconify/json": "^2.2.187",
"@intlify/unplugin-vue-i18n": "^2.0.0",
"@purge-icons/generated": "^0.9.0",
"@types/jsoneditor": "^9.9.5",
"@types/lodash-es": "^4.17.12",
"@types/node": "^20.11.21",
"@types/nprogress": "^0.2.3",
@ -2310,10 +2315,9 @@
}
},
"node_modules/@element-plus/icons-vue": {
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
"integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
"license": "MIT",
"version": "2.3.2",
"resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
"integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==",
"peerDependencies": {
"vue": "^3.2.0"
}
@ -4492,6 +4496,12 @@
"node": ">=10.13.0"
}
},
"node_modules/@types/ace": {
"version": "0.0.52",
"resolved": "https://registry.npmmirror.com/@types/ace/-/ace-0.0.52.tgz",
"integrity": "sha512-YPF9S7fzpuyrxru+sG/rrTpZkC6gpHBPF14W3x70kqVOD+ks6jkYLapk4yceh36xej7K4HYxcyz9ZDQ2lTvwgQ==",
"dev": true
},
"node_modules/@types/conventional-commits-parser": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz",
@ -4792,6 +4802,38 @@
"dev": true,
"license": "MIT"
},
"node_modules/@types/jsoneditor": {
"version": "9.9.6",
"resolved": "https://registry.npmmirror.com/@types/jsoneditor/-/jsoneditor-9.9.6.tgz",
"integrity": "sha512-SJ29nWBIhnhtU5n72wxhPiuUVd8cnDHd7ZYMqVkzWtdRxTUdS8+oy1pg66yhmM1kcuanX3xmAAKfcyhhBnHEjQ==",
"dev": true,
"dependencies": {
"@types/ace": "*",
"ajv": "^6.12.0"
}
},
"node_modules/@types/jsoneditor/node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/@types/jsoneditor/node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"node_modules/@types/lodash": {
"version": "4.17.16",
"resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.16.tgz",
@ -6991,163 +7033,256 @@
}
}
},
"node_modules/@wangeditor/basic-modules": {
"version": "1.1.7",
"resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
"integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
"license": "MIT",
"node_modules/@wangeditor-next/editor": {
"version": "5.6.49",
"resolved": "https://registry.npmmirror.com/@wangeditor-next/editor/-/editor-5.6.49.tgz",
"integrity": "sha512-gDh7CLzsuPvUp1n4rO//V1NTHlpGzEibL71oRcRcxpz76oNaW12u+GWWvRde4cWivaCTLzHwz7EfEVdyDkt/Ww==",
"dependencies": {
"@uppy/core": "^2.1.1",
"@uppy/xhr-upload": "^2.0.3",
"@wangeditor-next/basic-modules": "~1.5.47",
"@wangeditor-next/code-highlight": "~1.3.43",
"@wangeditor-next/core": "~1.7.45",
"@wangeditor-next/list-module": "~1.1.52",
"@wangeditor-next/table-module": "~1.6.60",
"@wangeditor-next/upload-image-module": "~1.1.50",
"@wangeditor-next/video-module": "~1.3.51",
"dom7": "^4.0.0",
"is-hotkey": "^0.2.0",
"lodash.camelcase": "^4.3.0",
"lodash.clonedeep": "^4.5.0",
"lodash.debounce": "^4.0.8",
"lodash.foreach": "^4.5.0",
"lodash.throttle": "^4.1.1",
"lodash.toarray": "^4.4.0",
"nanoid": "^5.0.0",
"slate": "^0.82.0",
"snabbdom": "^3.6.0"
}
},
"node_modules/@wangeditor-next/editor-for-vue": {
"version": "5.1.14",
"resolved": "https://registry.npmmirror.com/@wangeditor-next/editor-for-vue/-/editor-for-vue-5.1.14.tgz",
"integrity": "sha512-Xkrdo590AhLHvzyR+U246t6T89nIWHz1weAgMuo8jEA2HS5RiUnsA4U6+iUGaQ2E5c8mYQaeNqzHQXUp9Okbiw==",
"peerDependencies": {
"@wangeditor-next/editor": ">=5.1.0",
"vue": "^3.0.5"
}
},
"node_modules/@wangeditor-next/editor/node_modules/@wangeditor-next/basic-modules": {
"version": "1.5.47",
"resolved": "https://registry.npmmirror.com/@wangeditor-next/basic-modules/-/basic-modules-1.5.47.tgz",
"integrity": "sha512-FHydtBbfpsi4R4JTo5MvwWhzButwq6x36o+GoxsALdItwDW2qVgJkrlhw25aWYpg6ff1xqjivHfLBaAPWC4J+w==",
"dependencies": {
"is-url": "^1.2.4"
},
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"@wangeditor-next/core": "1.7.45",
"dom7": "^3.0.0 || ^4.0.0",
"lodash.throttle": "^4.1.1",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
"nanoid": "^5.0.0",
"slate": "^0.82.0",
"snabbdom": "^3.6.0"
}
},
"node_modules/@wangeditor/code-highlight": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
"integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
"license": "MIT",
"node_modules/@wangeditor-next/editor/node_modules/@wangeditor-next/code-highlight": {
"version": "1.3.43",
"resolved": "https://registry.npmmirror.com/@wangeditor-next/code-highlight/-/code-highlight-1.3.43.tgz",
"integrity": "sha512-22eHjYDmtTxZqZOma2ls9zWA6gsgSkWq3XtmLylA15kegVBKAy7YxYbRrdS7D4Y/igqOerSbc5oMsOdeYjRfnQ==",
"dependencies": {
"prismjs": "^1.23.0"
},
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
"@wangeditor-next/core": "1.7.45",
"dom7": "^3.0.0 || ^4.0.0",
"slate": "^0.82.0",
"snabbdom": "^3.6.0"
}
},
"node_modules/@wangeditor/core": {
"version": "1.1.19",
"resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
"integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
"license": "MIT",
"node_modules/@wangeditor-next/editor/node_modules/@wangeditor-next/core": {
"version": "1.7.45",
"resolved": "https://registry.npmmirror.com/@wangeditor-next/core/-/core-1.7.45.tgz",
"integrity": "sha512-5Pt8JCmdzJWk4q18zUZse+zM+mBW6jYt3npXVkLswYysx01krC3bBQq1J9JeZe4Ci+rQAs0tQj3t1imjpsmRgg==",
"dependencies": {
"@types/event-emitter": "^0.3.3",
"event-emitter": "^0.3.5",
"html-void-elements": "^2.0.0",
"i18next": "^20.4.0",
"scroll-into-view-if-needed": "^2.2.28",
"slate-history": "^0.66.0"
"html-void-elements": "^3.0.0",
"i18next": "^23.0.0",
"scroll-into-view-if-needed": "^3.0.0",
"slate-history": "^0.109.0"
},
"peerDependencies": {
"@uppy/core": "^2.1.1",
"@uppy/xhr-upload": "^2.0.3",
"dom7": "^3.0.0",
"dom7": "^3.0.0 || ^4.0.0",
"is-hotkey": "^0.2.0",
"lodash.camelcase": "^4.3.0",
"lodash.clonedeep": "^4.5.0",
"lodash.debounce": "^4.0.8",
"lodash.foreach": "^4.5.0",
"lodash.isequal": "^4.5.0",
"lodash.throttle": "^4.1.1",
"lodash.toarray": "^4.4.0",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
"nanoid": "^5.0.0",
"slate": "^0.82.0",
"snabbdom": "^3.6.0"
}
},
"node_modules/@wangeditor/editor": {
"version": "5.1.23",
"resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz",
"integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
"license": "MIT",
"dependencies": {
"@uppy/core": "^2.1.1",
"@uppy/xhr-upload": "^2.0.3",
"@wangeditor/basic-modules": "^1.1.7",
"@wangeditor/code-highlight": "^1.0.3",
"@wangeditor/core": "^1.1.19",
"@wangeditor/list-module": "^1.0.5",
"@wangeditor/table-module": "^1.1.4",
"@wangeditor/upload-image-module": "^1.0.2",
"@wangeditor/video-module": "^1.1.4",
"dom7": "^3.0.0",
"is-hotkey": "^0.2.0",
"lodash.camelcase": "^4.3.0",
"lodash.clonedeep": "^4.5.0",
"node_modules/@wangeditor-next/editor/node_modules/@wangeditor-next/list-module": {
"version": "1.1.52",
"resolved": "https://registry.npmmirror.com/@wangeditor-next/list-module/-/list-module-1.1.52.tgz",
"integrity": "sha512-FMzvx+iXXkatFFRZZ+rbiPjZpEcPa3UtNBFs40VpZG0w7O3gQWM7B/oPec3SKvAmre/US4CC5DJEqeEY3QX4hw==",
"peerDependencies": {
"@wangeditor-next/core": "1.7.45",
"dom7": "^3.0.0 || ^4.0.0",
"slate": "^0.82.0",
"snabbdom": "^3.6.0"
}
},
"node_modules/@wangeditor-next/editor/node_modules/@wangeditor-next/table-module": {
"version": "1.6.60",
"resolved": "https://registry.npmmirror.com/@wangeditor-next/table-module/-/table-module-1.6.60.tgz",
"integrity": "sha512-BGTG1YzPSIC4XJRafllCcynT9CkElWDSFxYBJ2svS36AvJc3ivQuj5Fhv+rCS4RqGggsN1hdeA4iP+xrtwWI4w==",
"peerDependencies": {
"@wangeditor-next/core": "1.7.45",
"dom7": "^3.0.0 || ^4.0.0",
"lodash.debounce": "^4.0.8",
"lodash.foreach": "^4.5.0",
"lodash.isequal": "^4.5.0",
"lodash.throttle": "^4.1.1",
"lodash.toarray": "^4.4.0",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
"nanoid": "^5.0.0",
"slate": "^0.82.0",
"snabbdom": "^3.6.0"
}
},
"node_modules/@wangeditor/editor-for-vue": {
"version": "5.1.12",
"resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz",
"integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==",
"license": "MIT",
"peerDependencies": {
"@wangeditor/editor": ">=5.1.0",
"vue": "^3.0.5"
}
},
"node_modules/@wangeditor/list-module": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz",
"integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==",
"license": "MIT",
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/table-module": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz",
"integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==",
"license": "MIT",
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"lodash.isequal": "^4.5.0",
"lodash.throttle": "^4.1.1",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/upload-image-module": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
"integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==",
"license": "MIT",
"node_modules/@wangeditor-next/editor/node_modules/@wangeditor-next/upload-image-module": {
"version": "1.1.50",
"resolved": "https://registry.npmmirror.com/@wangeditor-next/upload-image-module/-/upload-image-module-1.1.50.tgz",
"integrity": "sha512-KIzI1IIQA6J5Hg3/UJF/AlEsrxJ62LZZUt61tenkO8cxks2UQMvH4CEsgEU5NNfQ0PUnOeR4ErjOgyhtbZKyaQ==",
"peerDependencies": {
"@uppy/core": "^2.0.3",
"@uppy/xhr-upload": "^2.0.3",
"@wangeditor/basic-modules": "1.x",
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"@wangeditor-next/basic-modules": "1.5.47",
"@wangeditor-next/core": "1.7.45",
"dom7": "^3.0.0 || ^4.0.0",
"lodash.foreach": "^4.5.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
"slate": "^0.82.0",
"snabbdom": "^3.6.0"
}
},
"node_modules/@wangeditor/video-module": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz",
"integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==",
"license": "MIT",
"node_modules/@wangeditor-next/editor/node_modules/@wangeditor-next/video-module": {
"version": "1.3.51",
"resolved": "https://registry.npmmirror.com/@wangeditor-next/video-module/-/video-module-1.3.51.tgz",
"integrity": "sha512-67ecZCGIY+MUsqFtmwR9QKWlzGeIXVyXHmzPuevYwEqRwg50oR2xCSuoQLhfs5CKjXDZKsZhOnD/CGgt82TU+A==",
"peerDependencies": {
"@uppy/core": "^2.1.4",
"@uppy/xhr-upload": "^2.0.7",
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
"@wangeditor-next/core": "1.7.45",
"dom7": "^3.0.0 || ^4.0.0",
"nanoid": "^5.0.0",
"slate": "^0.82.0",
"snabbdom": "^3.6.0"
}
},
"node_modules/@wangeditor-next/editor/node_modules/compute-scroll-into-view": {
"version": "3.1.1",
"resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz",
"integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="
},
"node_modules/@wangeditor-next/editor/node_modules/dom7": {
"version": "4.0.6",
"resolved": "https://registry.npmmirror.com/dom7/-/dom7-4.0.6.tgz",
"integrity": "sha512-emjdpPLhpNubapLFdjNL9tP06Sr+GZkrIHEXLWvOGsytACUrkbeIdjO5g77m00BrHTznnlcNqgmn7pCN192TBA==",
"dependencies": {
"ssr-window": "^4.0.0"
}
},
"node_modules/@wangeditor-next/editor/node_modules/html-void-elements": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-3.0.0.tgz",
"integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/@wangeditor-next/editor/node_modules/i18next": {
"version": "23.16.8",
"resolved": "https://registry.npmmirror.com/i18next/-/i18next-23.16.8.tgz",
"integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==",
"funding": [
{
"type": "individual",
"url": "https://locize.com"
},
{
"type": "individual",
"url": "https://locize.com/i18next.html"
},
{
"type": "individual",
"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
}
],
"dependencies": {
"@babel/runtime": "^7.23.2"
}
},
"node_modules/@wangeditor-next/editor/node_modules/nanoid": {
"version": "5.1.6",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-5.1.6.tgz",
"integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"bin": {
"nanoid": "bin/nanoid.js"
},
"engines": {
"node": "^18 || >=20"
}
},
"node_modules/@wangeditor-next/editor/node_modules/scroll-into-view-if-needed": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz",
"integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==",
"dependencies": {
"compute-scroll-into-view": "^3.0.2"
}
},
"node_modules/@wangeditor-next/editor/node_modules/slate": {
"version": "0.82.1",
"resolved": "https://registry.npmmirror.com/slate/-/slate-0.82.1.tgz",
"integrity": "sha512-3mdRdq7U3jSEoyFrGvbeb28hgrvrr4NdFCtJX+IjaNvSFozY0VZd/CGHF0zf/JDx7aEov864xd5uj0HQxxEWTQ==",
"dependencies": {
"immer": "^9.0.6",
"is-plain-object": "^5.0.0",
"tiny-warning": "^1.0.3"
}
},
"node_modules/@wangeditor-next/editor/node_modules/slate-history": {
"version": "0.109.0",
"resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.109.0.tgz",
"integrity": "sha512-DHavPwrTTAEAV66eAocB3iQHEj65N6IVtbRK98ZuqGT0S44T3zXlhzY+5SZ7EPxRcoOYVt1dioRxXYM/+PmCiQ==",
"dependencies": {
"is-plain-object": "^5.0.0"
},
"peerDependencies": {
"slate": ">=0.65.3"
}
},
"node_modules/@wangeditor-next/editor/node_modules/ssr-window": {
"version": "4.0.2",
"resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-4.0.2.tgz",
"integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ=="
},
"node_modules/@wangeditor-next/plugin-mention": {
"version": "1.0.19",
"resolved": "https://registry.npmmirror.com/@wangeditor-next/plugin-mention/-/plugin-mention-1.0.19.tgz",
"integrity": "sha512-aH81xDT4hZ+PdEFPsptJ/Gn4KDyIOhQdrNewLi2BKadmVBiYXlLneseodeFyv9MLhtNg2ekt+KNGJNK3kKzCsw==",
"peerDependencies": {
"@wangeditor-next/editor": "5.6.49",
"snabbdom": "^3.6.0"
}
},
"node_modules/@xmldom/xmldom": {
@ -8231,12 +8366,6 @@
"integrity": "sha512-wGA++isMqiDq1jPYeyv2as/Bt/u+3iLW0rEa+8NQ82jAv3TgqMiCM+B2SaBdn2DfLilLjjq736YcezihRYhfxw==",
"license": "MIT"
},
"node_modules/compute-scroll-into-view": {
"version": "1.0.20",
"resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
"integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==",
"license": "MIT"
},
"node_modules/computeds": {
"version": "0.0.1",
"resolved": "https://registry.npmmirror.com/computeds/-/computeds-0.0.1.tgz",
@ -9039,6 +9168,15 @@
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
"license": "MIT"
},
"node_modules/dayjs-plugin-lunar": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/dayjs-plugin-lunar/-/dayjs-plugin-lunar-1.4.1.tgz",
"integrity": "sha512-nHKJMKoVAGt/Wp6x3xH8GrjWhB25YBYd6iYTCfLkCm4GAS6q3jvfHpLwRnIX8bjHgl8sPlTPiLFcylcEaEnj8Q==",
"peerDependencies": {
"dayjs": "^1.0.0",
"tyme4ts": "^1.0.0"
}
},
"node_modules/de-indent": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz",
@ -9234,15 +9372,6 @@
"resolved": "https://registry.npmmirror.com/dom-walk/-/dom-walk-0.1.2.tgz",
"integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
},
"node_modules/dom7": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz",
"integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
"license": "MIT",
"dependencies": {
"ssr-window": "^3.0.0-alpha.1"
}
},
"node_modules/domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz",
@ -9424,10 +9553,9 @@
"license": "ISC"
},
"node_modules/element-plus": {
"version": "2.9.1",
"resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.1.tgz",
"integrity": "sha512-9Agqf/jt4Ugk7EZ6C5LME71sgkvauPCsnvJN12Xid2XVobjufxMGpRE4L7pS4luJMOmFAH3J0NgYEGZT5r+NDg==",
"license": "MIT",
"version": "2.11.1",
"resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.11.1.tgz",
"integrity": "sha512-weYFIniyNXTAe9vJZnmZpYzurh4TDbdKhBsJwhbzuo0SDZ8PLwHVll0qycJUxc6SLtH+7A9F7dvdDh5CnqeIVA==",
"dependencies": {
"@ctrl/tinycolor": "^3.4.1",
"@element-plus/icons-vue": "^2.3.1",
@ -11232,16 +11360,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/html-void-elements": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz",
"integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/htmlparser2": {
"version": "8.0.2",
"resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-8.0.2.tgz",
@ -11271,15 +11389,6 @@
"node": ">=16.17.0"
}
},
"node_modules/i18next": {
"version": "20.6.1",
"resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz",
"integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.12.0"
}
},
"node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz",
@ -11866,20 +11975,18 @@
}
},
"node_modules/jsoneditor": {
"version": "9.10.5",
"resolved": "https://registry.npmmirror.com/jsoneditor/-/jsoneditor-9.10.5.tgz",
"integrity": "sha512-fVZ0NMt+zm4rqTKBv2x7zPdLeaRyKo1EjJkaR1QjK4gEM1rMwICILYSW1OPxSc1qqyAoDaA/eeNrluKoxOocCA==",
"license": "Apache-2.0",
"version": "10.4.2",
"resolved": "https://registry.npmmirror.com/jsoneditor/-/jsoneditor-10.4.2.tgz",
"integrity": "sha512-SQPCXlanU4PqdVsYuj2X7yfbLiiJYjklbksGfMKPsuwLhAIPxDlG43jYfXieGXvxpuq1fkw08YoRbkKXKabcLA==",
"dependencies": {
"ace-builds": "^1.31.1",
"ace-builds": "^1.36.2",
"ajv": "^6.12.6",
"javascript-natural-sort": "^0.7.1",
"jmespath": "^0.16.0",
"json-source-map": "^0.6.1",
"jsonrepair": "3.1.0",
"mobius1-selectr": "^2.4.13",
"jsonrepair": "^3.8.1",
"picomodal": "^3.0.0",
"vanilla-picker": "^2.12.2"
"vanilla-picker": "^2.12.3"
}
},
"node_modules/jsoneditor/node_modules/ajv": {
@ -11928,10 +12035,9 @@
"license": "MIT"
},
"node_modules/jsonrepair": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/jsonrepair/-/jsonrepair-3.1.0.tgz",
"integrity": "sha512-idqReg23J0PVRAADmZMc5xQM3xeOX5bTB6OTyMnzq33IXJXmn9iJuWIEvGmrN80rQf4d7uLTMEDwpzujNcI0Rg==",
"license": "ISC",
"version": "3.13.2",
"resolved": "https://registry.npmmirror.com/jsonrepair/-/jsonrepair-3.13.2.tgz",
"integrity": "sha512-Leuly0nbM4R+S5SVJk3VHfw1oxnlEK9KygdZvfUtEtTawNDyzB4qa1xWTmFt1aeoA7sXZkVTRuIixJ8bAvqVUg==",
"bin": {
"jsonrepair": "bin/cli.js"
}
@ -12342,13 +12448,6 @@
"integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==",
"license": "MIT"
},
"node_modules/lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
"deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.",
"license": "MIT"
},
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
@ -13025,12 +13124,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/mobius1-selectr": {
"version": "2.4.13",
"resolved": "https://registry.npmmirror.com/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz",
"integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==",
"license": "MIT"
},
"node_modules/moddle": {
"version": "6.2.3",
"resolved": "https://registry.npmmirror.com/moddle/-/moddle-6.2.3.tgz",
@ -14824,15 +14917,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/scroll-into-view-if-needed": {
"version": "2.2.31",
"resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
"integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
"license": "MIT",
"dependencies": {
"compute-scroll-into-view": "^1.0.20"
}
},
"node_modules/scule": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
@ -14994,29 +15078,6 @@
"node": ">=8"
}
},
"node_modules/slate": {
"version": "0.72.8",
"resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz",
"integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
"license": "MIT",
"dependencies": {
"immer": "^9.0.6",
"is-plain-object": "^5.0.0",
"tiny-warning": "^1.0.3"
}
},
"node_modules/slate-history": {
"version": "0.66.0",
"resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz",
"integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
"license": "MIT",
"dependencies": {
"is-plain-object": "^5.0.0"
},
"peerDependencies": {
"slate": ">=0.65.3"
}
},
"node_modules/slice-ansi": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz",
@ -15108,12 +15169,6 @@
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"license": "BSD-3-Clause"
},
"node_modules/ssr-window": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz",
"integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==",
"license": "MIT"
},
"node_modules/steady-xml": {
"version": "0.1.0",
"resolved": "https://registry.npmmirror.com/steady-xml/-/steady-xml-0.1.0.tgz",
@ -15925,6 +15980,12 @@
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
"license": "0BSD"
},
"node_modules/tyme4ts": {
"version": "1.4.2",
"resolved": "https://registry.npmmirror.com/tyme4ts/-/tyme4ts-1.4.2.tgz",
"integrity": "sha512-3rUMpQv3Oz9V0f/GOPVHn+PC6eqR4CyMYQu02B8bUA5+BWvYALJapfwjOS7GH5NFK7mAS3LCUzSEYkQc4rkk6Q==",
"peer": true
},
"node_modules/type": {
"version": "2.7.3",
"resolved": "https://registry.npmmirror.com/type/-/type-2.7.3.tgz",
@ -16489,19 +16550,6 @@
"uuid": "dist/bin/uuid"
}
},
"node_modules/v3-jsoneditor": {
"version": "0.0.6",
"resolved": "https://registry.npmmirror.com/v3-jsoneditor/-/v3-jsoneditor-0.0.6.tgz",
"integrity": "sha512-9G0sXWXUn67SBkn46ycWfwPwjuJu/lcsQaNzMtXAR2/95hMV21WfcRNsqJ+vVVrSHQehohB/9fVLwYEXz0u/KA==",
"license": "MIT",
"dependencies": {
"jsoneditor": "^9.10.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/pratik227"
}
},
"node_modules/vanilla-picker": {
"version": "2.12.3",
"resolved": "https://registry.npmmirror.com/vanilla-picker/-/vanilla-picker-2.12.3.tgz",
@ -17064,6 +17112,14 @@
"integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==",
"license": "MIT"
},
"node_modules/vue3-print-nb": {
"version": "0.1.4",
"resolved": "https://registry.npmmirror.com/vue3-print-nb/-/vue3-print-nb-0.1.4.tgz",
"integrity": "sha512-LExI7viEzplR6ZKQ2b+V4U0cwGYbVD4fut/XHvk3UPGlT5CcvIGs6VlwGp107aKgk6P8Pgx4rco3Rehv2lti3A==",
"dependencies": {
"vue": "^3.0.5"
}
},
"node_modules/vue3-signature": {
"version": "0.2.4",
"resolved": "https://registry.npmmirror.com/vue3-signature/-/vue3-signature-0.2.4.tgz",

View File

@ -44,6 +44,7 @@
"cropperjs": "^1.6.1",
"crypto-js": "^4.2.0",
"dayjs": "^1.11.10",
"dayjs-plugin-lunar": "^1.4.1",
"diagram-js": "^12.8.0",
"driver.js": "^1.3.1",
"echarts": "^5.5.0",

View File

@ -0,0 +1,54 @@
import request from '@/config/axios'
// MES 假期设置 VO
export interface CalHolidayVO {
id: number // 编号
theDay: string // 日期
type: string // 日期类型
startTime: string // 开始时间
endTime: string // 结束时间
remark: string // 备注
attribute1: string // 预留字段1
attribute2: string // 预留字段2
attribute3: number // 预留字段3
attribute4: number // 预留字段4
createTime: string // 创建时间
}
// MES 假期设置 API
export const CalHolidayApi = {
// 查询假期设置分页
getHolidayPage: async (params: any) => {
return await request.get({ url: `/mes/cal/holiday/page`, params })
},
// 查询所有假期设置列表(日历组件用,不分页)
getHolidayList: async () => {
return await request.get({ url: `/mes/cal/holiday/list` })
},
// 查询假期设置详情
getHoliday: async (id: number) => {
return await request.get({ url: `/mes/cal/holiday/get?id=` + id })
},
// 新增假期设置(含 upsert 逻辑)
createHoliday: async (data: CalHolidayVO) => {
return await request.post({ url: `/mes/cal/holiday/create`, data })
},
// 修改假期设置
updateHoliday: async (data: CalHolidayVO) => {
return await request.put({ url: `/mes/cal/holiday/update`, data })
},
// 删除假期设置
deleteHoliday: async (id: number) => {
return await request.delete({ url: `/mes/cal/holiday/delete?id=` + id })
},
// 导出假期设置 Excel
exportHoliday: async (params: any) => {
return await request.download({ url: `/mes/cal/holiday/export-excel`, params })
}
}

View File

@ -0,0 +1,87 @@
<!-- MES 假期设置表单 -->
<template>
<Dialog title="假期设置" v-model="dialogVisible" width="400px">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="80px"
v-loading="formLoading"
>
<el-form-item label="日期" prop="theDay">
<el-input v-model="formData.theDayDisplay" readonly />
</el-form-item>
<el-form-item label="类型" prop="type">
<el-radio-group v-model="formData.type">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.MES_CAL_HOLIDAY_TYPE)"
:key="dict.value"
:value="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { CalHolidayApi } from '@/api/mes/cal/holiday'
defineOptions({ name: 'HolidayForm' })
const message = useMessage()
const dialogVisible = ref(false)
const formLoading = ref(false)
const formData = ref({
theDay: '' as string, // yyyy-MM-dd 00:00:00
theDayDisplay: '' as string, //
type: 'HOLIDAY' as string
})
const formRules = reactive({
type: [{ required: true, message: '请选择类型', trigger: 'change' }]
})
const formRef = ref()
/** 打开弹窗 */
const open = (day: string) => {
dialogVisible.value = true
resetForm()
formData.value.theDayDisplay = day
// theDay datetime yyyy-MM-dd 00:00:00
// TODO @
formData.value.theDay = day + ' 00:00:00'
}
defineExpose({ open })
/** 提交表单 */
const emit = defineEmits(['success'])
const submitForm = async () => {
await formRef.value.validate()
formLoading.value = true
try {
await CalHolidayApi.createHoliday(formData.value as any)
message.success('设置成功')
dialogVisible.value = false
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
theDay: '',
theDayDisplay: '',
type: 'HOLIDAY'
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,173 @@
<!-- MES 假期设置 - 日历视图 -->
<template>
<ContentWrap>
<!-- TODO @AI从周一到周日这样的视图 -->
<el-calendar v-model="currentDate">
<template #date-cell="{ data }">
<div class="calendar-cell" @contextmenu.prevent="onRightClick(data)">
<div class="calendar-cell-header">
<span class="solar-day" :class="{ weekend: isWeekend(data.day) }">
{{ data.day.split('-')[2] }}
</span>
<el-tag
v-if="holidaySet.has(data.day)"
size="small"
effect="dark"
type="success"
>
</el-tag>
<el-tag
v-else-if="workdaySet.has(data.day)"
size="small"
effect="dark"
type="primary"
>
</el-tag>
</div>
<div class="lunar-day" :class="{ festival: hasFestival(data.day) }">
{{ getLunarDisplay(data.day) }}
</div>
</div>
</template>
</el-calendar>
<!-- 假期设置表单弹窗 -->
<HolidayForm ref="formRef" @success="getList" />
</ContentWrap>
</template>
<script setup lang="ts">
import { CalHolidayApi, CalHolidayVO } from '@/api/mes/cal/holiday'
import dayjs from 'dayjs'
import PluginLunar from 'dayjs-plugin-lunar'
import { SolarDay } from 'tyme4ts'
import HolidayForm from './HolidayForm.vue'
import { checkPermi } from '@/utils/permission'
dayjs.extend(PluginLunar)
defineOptions({ name: 'MesCalHoliday' })
const message = useMessage()
const currentDate = ref(new Date())
const holidaySet = ref(new Set<string>()) // HOLIDAY
const workdaySet = ref(new Set<string>()) // WORKDAY
const formRef = ref()
/** 获取假期列表 */
const getList = async () => {
holidaySet.value.clear()
workdaySet.value.clear()
const list = await CalHolidayApi.getHolidayList()
if (list) {
list.forEach((item: CalHolidayVO) => {
// theDay datetime 10 yyyy-MM-dd
const day = item.theDay ? item.theDay.substring(0, 10) : ''
if (!day) {
return
}
if (item.type === 'HOLIDAY') {
holidaySet.value.add(day)
} else if (item.type === 'WORKDAY') {
workdaySet.value.add(day)
}
})
}
}
/** 右键点击日期 */
const onRightClick = (data: { day: string }) => {
//
if (!checkPermi(['mes:cal-holiday:create'])) {
message.warning('没有假期设置权限')
return
}
formRef.value.open(data.day)
}
/** 判断是否周末 */
const isWeekend = (day: string): boolean => {
const date = new Date(day)
const weekDay = date.getDay()
return weekDay === 0 || weekDay === 6
}
/** 获取农历显示信息 */
const getLunarInfo = (day: string) => {
const parts = day.split('-')
const y = parseInt(parts[0]), m = parseInt(parts[1]), d = parseInt(parts[2])
try {
const solarDay = SolarDay.fromYmd(y, m, d)
const lunarDay = solarDay.getLunarDay()
//
const solarFestival = solarDay.getFestival()
//
const lunarFestival = lunarDay.getFestival()
// dayIndex === 0
const termDay = solarDay.getTermDay()
const termName = termDay.getDayIndex() === 0 ? termDay.getSolarTerm().getName() : null
//
const lunarMonthName = lunarDay.getLunarMonth().getName() // ...
const lunarDayName = lunarDay.getName() // ...
return {
solarFestival: solarFestival ? solarFestival.getName() : null,
lunarFestival: lunarFestival ? lunarFestival.getName() : null,
termName,
lunarText: lunarMonthName + lunarDayName
}
} catch {
return { solarFestival: null, lunarFestival: null, termName: null, lunarText: '' }
}
}
/** 获取农历显示文本 */
const getLunarDisplay = (day: string): string => {
const info = getLunarInfo(day)
//
return info.solarFestival || info.lunarFestival || info.termName || info.lunarText
}
/** 判断是否有节日 */
const hasFestival = (day: string): boolean => {
const info = getLunarInfo(day)
return !!(info.solarFestival || info.lunarFestival || info.termName)
}
/** 初始化 */
onMounted(() => {
getList()
})
// TODO @AI使 unocss style
</script>
<style scoped>
.calendar-cell {
height: 100%;
padding: 4px;
}
.calendar-cell-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.solar-day {
font-size: 16px;
font-weight: 500;
}
.solar-day.weekend {
color: #f56c6c;
}
.lunar-day {
font-size: 12px;
color: #909399;
margin-top: 4px;
}
.lunar-day.festival {
color: #67c23a;
}
</style>