@yxhl/specter-pui-vtk 1.0.96 → 1.0.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"specter-pui.umd.js","sources":["../src/commons/storage.js","../src/stores/message.js","../src/components/message/index.js","../src/commons/request.js","../src/components/assembly/VtkArea.vue","../src/components/assembly/VtkAreaTabs.vue","../src/components/assembly/VtkBreadcrumb.vue","../src/components/assembly/VtkCheckbox.vue","../src/components/assembly/VtkCount.vue","../src/components/assembly/VtkDatePicker.vue","../src/components/assembly/VtkDatePanelHeader.vue","../src/components/assembly/VtkDateSelector.vue","../src/components/assembly/VtkDateTimePicker.vue","../src/components/assembly/VtkDept.vue","../src/components/assembly/VtkEmpty.vue","../src/assets/img/empty.svg","../src/components/assembly/VtkEmptyNew.vue","../src/components/assembly/VtkFab.vue","../src/components/assembly/VtkFormItem.vue","../src/components/assembly/VtkImg.vue","../src/components/assembly/VtkPage.vue","../src/components/assembly/VtkPdf.vue","../src/composables/usePage.js","../src/components/assembly/VtkProj.vue","../src/components/assembly/VtkRadio.vue","../src/components/assembly/VtkSearch.vue","../src/components/assembly/VtkSelect.vue","../src/components/assembly/VtkSinglePage.vue","../src/components/assembly/VtkStepper.vue","../src/components/assembly/VtkUpload.vue","../src/commons/location.js","../src/commons/filters/dictionary.js","../src/commons/filters/format.js","../src/commons/filters/mask.js","../node_modules/vuetify/lib/util/colors.js","../src/commons/themes.js","../src/commons/validation.js","../src/components/message/alert.vue","../src/components/message/confirm.vue","../src/components/message/loading.vue","../src/components/message/vtkMessage.vue","../src/components/message/prompt.vue","../src/components/message/toast.vue","../src/index.js"],"sourcesContent":["const Storage = {};\r\n/** 获取Storage对象 */\r\nconst storage = (type = 'local') => {\r\n return type == \"local\" ? window.localStorage : window.sessionStorage;\r\n}\r\n/**\r\n * 获取对应缓存值JSON对象\r\n * @param {string} key 键\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n * @return {object} 对应的值JSON对象\r\n */\r\nStorage.get = (key, type = 'local') => {\r\n var js = storage(type).getItem(key);\r\n return /^[\\\\{|\\\\[].+[\\\\}|\\\\]]$/.test(js) ? JSON.parse(js) : js;\r\n};\r\n/**\r\n * 设置存储缓存取对象JSON\r\n * @param {string} key 键\r\n * @param {string} value 值(JSON对象)\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n */\r\nStorage.set = (key, value, type = 'local') => {\r\n value = (value.constructor === Object) ? JSON.stringify(value) : value\r\n storage(type).setItem(key, value);\r\n};\r\n/**\r\n * 删除对应的缓存对象JSON\r\n * @param {string} key 键\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n */\r\nStorage.remove = (key, type = 'local') => {\r\n storage(type).removeItem(key);\r\n};\r\n/**\r\n * 清空所有的缓存对象JSON\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n */\r\nStorage.clear = (type = 'local') => {\r\n storage(type).clear();\r\n};\r\n\r\nexport default Storage;\r\n","// stores/message.js\r\nimport { defineStore } from 'pinia'\r\n\r\nexport const useMessageStore = defineStore('message', {\r\n state: () => ({\r\n alert: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 500\r\n }\r\n },\r\n confirm: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 400,\r\n cancelText: '取消',\r\n confirmText: '确定'\r\n }\r\n },\r\n loading: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 300,\r\n indeterminate: true,\r\n value: 0,\r\n progressColor: 'primary',\r\n size: 64,\r\n circleWidth: 6\r\n }\r\n },\r\n prompt: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 500,\r\n label: '',\r\n placeholder: '',\r\n inputType: 'text',\r\n cancelText: '取消',\r\n confirmText: '确定'\r\n }\r\n },\r\n toast: {\r\n isActive: false,\r\n options: {\r\n text: '',\r\n color: '',\r\n timeout: 3000,\r\n position: 'top'\r\n }\r\n }\r\n }),\r\n \r\n actions: {\r\n hide(type) {\r\n if (this[type]) {\r\n this[type].isActive = false\r\n }\r\n },\r\n \r\n show(type, options) {\r\n if (this[type]) {\r\n this[type] = {\r\n isActive: true,\r\n options: options\r\n }\r\n }\r\n }\r\n }\r\n})","// components/message/index.js\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst Message = {\r\n // 显示 alert\r\n alert(options) {\r\n const messageStore = useMessageStore()\r\n messageStore.show('alert', options)\r\n },\r\n \r\n // 显示 confirm\r\n confirm(options) {\r\n const messageStore = useMessageStore()\r\n messageStore.show('confirm', options)\r\n },\r\n \r\n // loading 对象,包含 show 和 hide 方法\r\n loading: {\r\n show(options = {}) {\r\n const messageStore = useMessageStore()\r\n const defaultOptions = {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 120,\r\n indeterminate: true,\r\n progressColor: 'primary',\r\n size: 64,\r\n circleWidth: 6\r\n }\r\n messageStore.show('loading', { ...defaultOptions, ...options })\r\n },\r\n hide() {\r\n const messageStore = useMessageStore()\r\n messageStore.hide('loading')\r\n }\r\n },\r\n \r\n // 显示 prompt\r\n prompt(options) {\r\n const messageStore = useMessageStore()\r\n messageStore.show('prompt', options)\r\n },\r\n \r\n // 显示 toast\r\n toast(text, options = {}) {\r\n \r\n const messageStore = useMessageStore()\r\n // 确保传入的是字符串时正确处理\r\n const toastOptions = typeof text === 'string' \r\n ? { text, ...options }\r\n : text\r\n messageStore.show('toast', toastOptions)\r\n },\r\n \r\n // 隐藏指定类型的消息\r\n hide(type) {\r\n const messageStore = useMessageStore()\r\n messageStore.hide(type)\r\n }\r\n}\r\n\r\nexport default Message","import axios from \"axios\";\r\nimport Storage from \"./storage.js\";\r\nimport Message from \"../components/message/index.js\";\r\n\r\n// create an axios instance\r\nconst service = axios.create({\r\n baseURL: window.VITE_APP_API_URL || import.meta.env.VITE_APP_API_URL || \"\",\r\n headers: {\r\n \"X-Requested-With\": \"XMLHttpRequest\",\r\n },\r\n withCredentials: false,\r\n timeout: 30000,\r\n});\r\n\r\n// request interceptor\r\nservice.interceptors.request.use(\r\n (config) => {\r\n // 获取配置的键名,如果没有配置则使用默认值\r\n const tokenKey = window.VTK_CONFIG?.storageKeys?.token || '_mis_acis_token';\r\n if (Storage.get(tokenKey)) {\r\n config.headers[\"X-Token\"] = \"1b0679be72ad976ad5d491ad57a5eec0\";\r\n config.headers[\"Authorization\"] = \"Bearer \" + Storage.get(tokenKey);\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n Message.toast(error.message || \"请求错误\");\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\n// response interceptor\r\nservice.interceptors.response.use(\r\n (response) => {\r\n let res = response.data;\r\n let header = response.headers[\"content-disposition\"];\r\n\r\n if (header != undefined && header.split(\";\")[0] == \"attachment\") {\r\n res = response;\r\n }\r\n if (response.status !== 200) {\r\n Message.toast(res.message || \"请求失败\", { color: \"error\" });\r\n return Promise.reject(new Error(res.message || \"请求失败\"));\r\n } else {\r\n // 检查登录过期\r\n if (\r\n res.meta &&\r\n !res.meta.success &&\r\n res.meta.message === \"specter_authorize_exception\"\r\n ) {\r\n Storage.clear(); //清除所有缓存\r\n const handleRedirect = () => {\r\n const url = window.location.href;\r\n const index = url.indexOf(\"#\");\r\n let newUrl;\r\n\r\n if (index > -1) {\r\n newUrl = url.substring(0, index) + \"#/\";\r\n } else {\r\n newUrl = url + \"#/\";\r\n }\r\n\r\n window.location.href = newUrl;\r\n };\r\n\r\n Message.confirm({\r\n title: \"提示\",\r\n text: \"对不起,您的登录信息过期!\",\r\n onConfirm: handleRedirect,\r\n onCancel: handleRedirect,\r\n });\r\n }\r\n return Promise.resolve(res);\r\n }\r\n },\r\n (error) => {\r\n console.log(\"err\" + error);\r\n Message.toast(error.message || \"网络错误\", { color: \"error\" });\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nconst Request = {};\r\n\r\nRequest.http = (\r\n url,\r\n data = {},\r\n method = \"GET\",\r\n headers = { \"content-type\": \"application/x-www-form-urlencoded\" },\r\n responseType = null\r\n) => {\r\n if (headers[\"content-type\"] === \"application/x-www-form-urlencoded\") {\r\n return service({\r\n url: url,\r\n params: data,\r\n method: method,\r\n headers: headers,\r\n responseType: responseType,\r\n });\r\n } else {\r\n return service({\r\n url: url,\r\n data: data,\r\n method: method,\r\n headers: headers,\r\n responseType: responseType,\r\n });\r\n }\r\n};\r\n\r\nRequest.getForm = (url, data = {}) => {\r\n return Request.http(url, data);\r\n};\r\n\r\nRequest.postForm = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\");\r\n};\r\n\r\nRequest.getJson = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\", {\r\n \"content-type\": \"application/json\",\r\n });\r\n};\r\n\r\nRequest.postJson = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\", {\r\n \"content-type\": \"application/json\",\r\n });\r\n};\r\n\r\nRequest.imp = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\", {\r\n \"Content-Type\": \"multipart/form-data\",\r\n });\r\n};\r\n\r\nRequest.exp = (url, data = {}) => {\r\n return Request.http(\r\n url,\r\n data,\r\n \"POST\",\r\n { \"content-Type\": \"application/json\" },\r\n \"blob\"\r\n );\r\n};\r\n\r\nexport default Request;\r\n","<template>\r\n\t<div class=\"d-inline-block d-flex\">\r\n\t\t<VSelect\r\n\t\t\tv-model=\"entity.area2\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area2, 1)\"\r\n\t\t\t@click:clear=\"clear(1)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 2 ? entity.name2 : '---省级---'\"\r\n\t\t\t:items=\"areaData.area2\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box mr-3\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 2\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 4\"\r\n\t\t\tv-model=\"entity.area4\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area4, 2)\"\r\n\t\t\t@click:clear=\"clear(2)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 4 ? entity.name4 : '---市级---'\"\r\n\t\t\t:items=\"areaData.area4\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box\"\r\n\t\t\t:class=\"maxArea > 4 && 'mr-3'\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 4\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 6\"\r\n\t\t\tv-model=\"entity.area6\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area6, 3)\"\r\n\t\t\t@click:clear=\"clear(3)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 6 ? entity.name6 : '---区/县---'\"\r\n\t\t\t:items=\"areaData.area6\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box\"\r\n\t\t\t:class=\"maxArea > 6 && 'mr-3'\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 6\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 9\"\r\n\t\t\tv-model=\"entity.area9\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area9, 4)\"\r\n\t\t\t@click:clear=\"clear(4)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 9 ? entity.name9 : '---街/镇---'\"\r\n\t\t\t:items=\"areaData.area9\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box\"\r\n\t\t\t:class=\"maxArea > 9 && 'mr-3'\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 9\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 12\"\r\n\t\t\tv-model=\"entity.area12\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area12, 5)\"\r\n\t\t\t@click:clear=\"clear(5)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 12 ? entity.name12 : '---村/社---'\"\r\n\t\t\t:items=\"areaData.area12\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block\"\r\n\t\t\tstyle=\"width: 188px\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 12\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t</div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, reactive, onMounted, getCurrentInstance } from 'vue';\r\n\r\nimport Request from \"../../commons/request\"\r\n\r\nconst { proxy } = getCurrentInstance();\r\n\r\n// 定义组件名称和选项\r\ndefineOptions({\r\n\tname: \"VtkArea\",\r\n\tinheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n\tmaxArea: {\r\n\t\ttype: Number,\r\n\t\tdefault: 12,\r\n\t},\r\n\tminArea: {\r\n\t\ttype: Number,\r\n\t\tdefault: null,\r\n\t},\r\n\tareaStyle: {\r\n\t\ttype: String,\r\n\t\tdefault: \"\",\r\n\t},\r\n});\r\n\r\n// 定义emits\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 响应式数据\r\nconst entity = reactive({\r\n\tarea2: null,\r\n\tarea4: null,\r\n\tarea6: null,\r\n\tarea9: null,\r\n\tarea12: null,\r\n\tname2: '',\r\n\tname4: '',\r\n\tname6: '',\r\n\tname9: '',\r\n\tname12: ''\r\n});\r\n\r\nconst user = ref({ areacode: \"\" });\r\nconst areaData = reactive({\r\n\tarea2: [],\r\n\tarea4: [],\r\n\tarea6: [],\r\n\tarea9: [],\r\n\tarea12: []\r\n});\r\n\r\n// 安全获取 vtk 对象\r\nconst getVtk = () => {\r\n if (typeof window !== 'undefined' && window.$vtk) {\r\n return window.$vtk;\r\n }\r\n return null;\r\n};\r\n\r\n// 组件挂载时执行\r\nonMounted(() => {\r\n\t// 获取配置的键名,如果没有配置则使用默认值\r\n\tconst userKey = window.VTK_CONFIG?.storageKeys?.user || '_mis_acis_users';\r\n\tuser.value = typeof(proxy.$vtk.storage.get(userKey)) != 'object' ? JSON.parse(proxy.$vtk.storage.get(userKey)) : proxy.$vtk.storage.get(userKey) || '';\r\n\tif (user.value) {\r\n\t\tarea();\r\n\t}\r\n});\r\n\r\n// 所属地区\r\nconst area = () => {\r\n try {\r\n proxy.$vtk.message.loading.show();\r\n Request.postForm(`/dict/area/show/${user.value.areacode}`).then((res) => {\r\n proxy.$vtk.message.loading.hide();\r\n if (res.meta.success) {\r\n entity[`area${res.data.areaLeve}`] = res.data.areaCode;\r\n entity.name2 = res.data.province;\r\n entity.name4 = res.data.city;\r\n entity.name6 = res.data.district;\r\n entity.name9 = res.data?.town;\r\n entity.name12 = res.data?.village;\r\n nextArea(user.value.areacode);\r\n } else {\r\n proxy.$vtk.message.toast(res.meta.message);\r\n }\r\n }).catch(error => {\r\n proxy.$vtk.message.loading.hide();\r\n proxy.$vtk.message.toast('加载区域数据失败');\r\n });\r\n } catch (error) {\r\n console.error('初始化区域数据失败:', error);\r\n if (proxy.$vtk.message?.loading?.hide) {\r\n proxy.$vtk.message.loading.hide();\r\n }\r\n }\r\n};\r\n\r\n// 下一级地区列表\r\nconst nextArea = (areaCode, index) => {\r\n\tinputFn(areaCode);\r\n \r\n\tif (areaCode?.length < 12) {\r\n\t\tRequest.postForm(`/dict/area/next/${areaCode}`).then((res) => {\r\n\t\t\tproxy.$vtk.message.loading.hide();\r\n\t\t\tif (res.meta.success) {\r\n\t\t\t\tif (index) {\r\n\t\t\t\t\tObject.keys(areaData)\r\n\t\t\t\t\t\t.slice(index, 5)\r\n\t\t\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\t\t\tareaData[e] = [];\r\n\t\t\t\t\t\t\tentity[e] = null;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tareaData[`area${res.data[0].areaLeve}`] = res.data;\r\n\t\t\t} else {\r\n\t\t\t\tproxy.$vtk.message.toast(res.meta.message);\r\n\t\t\t}\r\n\t\t}).catch(error => {\r\n console.error('加载下级区域数据失败:', error);\r\n proxy.$vtk.message.toast('加载下级区域数据失败');\r\n });\r\n\t}\r\n};\r\n\r\n// 清除\r\nconst clear = (index) => {\r\n\tlet arr = Object.keys(areaData);\r\n\tinputFn(entity[arr[index - 2]]);\r\n\tarr.slice(index, 5).forEach((e) => {\r\n\t\tareaData[e] = [];\r\n\t\tentity[e] = null;\r\n\t});\r\n};\r\n\r\n// 输入事件\r\nconst inputFn = (e) => {\r\n\te && emit(\"update:modelValue\", e);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.sel_box {\r\n\twidth: 164px;\r\n}\r\n</style>","<template>\r\n\t<v-menu v-model=\"menu\" :close-on-content-click=\"false\" max-width=\"520\" min-width=\"520\">\r\n\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t<v-btn\r\n\t\t\t\tv-bind=\"props\"\r\n\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\tcolor=\"primary\"\r\n\t\t\t\tclass=\"area-select-btn\"\r\n\t\t\t\t:style=\"$attrs.styles\"\r\n\t\t\t>\r\n\t\t\t\t<span class=\"btn-text\">{{ itemText || '选择地区' }}</span>\r\n\t\t\t\t<v-icon v-if=\"itemText\" size=\"small\" @click.stop=\"textClear\" class=\"ml-2\">mdi-close-circle</v-icon>\r\n\t\t\t</v-btn>\r\n\t\t</template>\r\n\t\t<v-card elevation=\"0\" style=\"width: 350px;\">\r\n\t\t\t<p class=\"pt-3 px-3\">\r\n\t\t\t\t<v-icon color=\"primary\" class=\"mr-1\" size=\"20\">mdi-map-marker-radius</v-icon>\r\n\t\t\t\t<span v-for=\"link in entity\" :key=\"link.areaCode\" class=\"link text-body-2 text-primary\">{{ link.areaName }}</span>\r\n\t\t\t</p>\r\n\t\t\t<v-sheet class=\"rounded-lg mx-3 mt-2\" color=\"#b1b1b117\">\r\n\t\t\t\t<v-tabs v-model=\"tab\" @update:model-value=\"tabArea\" class=\"pt-2 px-1\">\r\n\t\t\t\t\t<v-tab\r\n\t\t\t\t\t\tv-for=\"(item, index) in tabItems\"\r\n\t\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\t\tclass=\"mx-1\"\r\n\t\t\t\t\t\t:style=\"tab == index && 'color:white;opacity:1'\"\r\n\t\t\t\t\t\t:disabled=\"areaStorage.length <= index + 1\"\r\n\t\t\t\t\t\tv-show=\"minArea ? minArea >= item.leve : true\"\r\n\t\t\t\t\t>{{ item.text }}</v-tab>\r\n\t\t\t\t</v-tabs>\r\n\t\t\t\t<v-sheet\r\n\t\t\t\t\tv-show=\"index == tab\"\r\n\t\t\t\t\tv-for=\"(item, index) in tabItems\"\r\n\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\tclass=\"px-3 py-1\"\r\n\t\t\t\t\tmin-height=\"100\"\r\n\t\t\t\t\tcolor=\"rgba(0,0,0,0)\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<v-chip-group v-model=\"current\" selected-class=\"chipActive\" column>\r\n\t\t\t\t\t\t<v-chip\r\n\t\t\t\t\t\t\tv-for=\"area in areaItems\"\r\n\t\t\t\t\t\t\t:key=\"area.id\"\r\n\t\t\t\t\t\t\t@click=\"areaChange(area, index)\"\r\n\t\t\t\t\t\t\tclass=\"rounded\"\r\n\t\t\t\t\t\t\t:class=\"area.areaCode == user.areacode && 'active'\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{{ area.areaName }}\r\n\t\t\t\t\t\t</v-chip>\r\n\t\t\t\t\t</v-chip-group>\r\n\t\t\t\t</v-sheet>\r\n\t\t\t</v-sheet>\r\n\r\n\t\t\t<v-card-actions class=\"pr-0 py-3\">\r\n\t\t\t\t<v-spacer />\r\n\t\t\t\t<v-btn @click=\"close\" elevation=\"0\" size=\"small\"><v-icon class=\"pt-1 pr-1\">mdi-progress-close</v-icon> 取消</v-btn>\r\n\t\t\t\t<v-btn @click=\"save\" class=\"text-white mr-3\" color=\"primary\" elevation=\"0\" size=\"small\"><v-icon class=\"pt-1 pr-1\">mdi-progress-check</v-icon> 确定</v-btn>\r\n\t\t\t</v-card-actions>\r\n\t\t</v-card>\r\n\t</v-menu>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, watch, onMounted, getCurrentInstance, nextTick } from 'vue';\r\n\r\nconst props = defineProps({\r\n\tmodelValue: {\r\n\t\ttype: [String, Object],\r\n\t\tdefault: null,\r\n\t},\r\n\tminArea: {\r\n\t\ttype: Number,\r\n\t\tdefault: null,\r\n\t},\r\n\tareaNode: {\r\n\t\ttype: Number,\r\n\t\tdefault: null,\r\n\t},\r\n\tareaCode: {\r\n\t\ttype: String,\r\n\t\tdefault: null,\r\n\t},\r\n\treturnObj: {\r\n\t\ttype: Boolean,\r\n\t\tdefault: false,\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits(['update:modelValue', 'change']);\r\n\r\nconst { proxy } = getCurrentInstance();\r\n\r\nconst menu = ref(false);\r\nconst user = ref({});\r\nconst tab = ref(0);\r\nconst tabItems = ref([]);\r\nconst areaStorage = ref([]); //存储个级别地区数据\r\nconst areaItems = ref([]); //当前选择地区的所有列\r\nconst entity = ref([]); //存储选中的数据\r\nconst current = ref(null); //回显值选中\r\nconst itemValue = ref(\"\"); //传值:最终选择值\r\nconst itemText = ref(\"\"); //最终选择值\r\n\r\n// 值回显\r\nconst view = (code) => {\r\n\tproxy.$vtk.request.getForm(`/dict/area/show/${code}`).then((res) => {\r\n\t\tlet province = res.data.province ? `${res.data.province}` : \"\";\r\n\t\tlet city = res.data.city ? `/${res.data.city}` : \"\";\r\n\t\tlet district = res.data.district ? `/${res.data.district}` : \"\";\r\n\t\tlet town = res.data.town ? `/${res.data.town}` : \"\";\r\n\t\tlet village = res.data.village ? `/${res.data.village}` : \"\";\r\n\t\titemText.value = `${province}${city}${district}${town}${village}`;\r\n\t\tif (props.areaNode && props.areaNode > 0) {\r\n\t\t\titemText.value = itemText.value.split(\"/\").slice(-props.areaNode).join(\"/\");\r\n\t\t}\r\n\t});\r\n};\r\n\r\n// 切换Tab地区级别\r\nconst tabArea = (index) => {\r\n\tareaItems.value = [...areaStorage.value[index]];\r\n\tif (index < entity.value.length) {\r\n\t\tcurrent.value = areaItems.value.findIndex((e) => e.areaCode == entity.value[index].areaCode);\r\n\t} else {\r\n\t\tcurrent.value = null;\r\n\t}\r\n};\r\n\r\n//选择地区\r\nconst areaChange = (item, index) => {\r\n\tentity.value = entity.value.slice(0, index);\r\n\tentity.value.push(item);\r\n\tareaStorage.value = areaStorage.value.slice(0, index + 1);\r\n\tif (tabItems.value.length > tab.value + 1 && (props.minArea ? props.minArea > item.areaCode.length : true)) {\r\n\t\tgetTree(item.areaCode);\r\n\t\ttab.value++;\r\n\t}\r\n};\r\n\r\n// 加载下级地区\r\nconst getTree = (code) => {\r\n\tproxy.$vtk.request.getForm(`/dict/area/next/${code}`).then((res) => {\r\n\t\tareaItems.value = res.data;\r\n\t\tareaStorage.value.push(res.data);\r\n\t\tcurrent.value = null;\r\n\t\tnextTick(); //Vue 3中替代$forceUpdate\r\n\t});\r\n};\r\n\r\n// 加载第一个地区,用户所在地区\r\nconst getAreaName = (code) => {\r\n\tentity.value = [];\r\n\ttabItems.value = [\r\n\t\t{ text: \"省级\", leve: \"2\" },\r\n\t\t{ text: \"市级\", leve: \"4\" },\r\n\t\t{ text: \"区县\", leve: \"6\" },\r\n\t\t{ text: \"街镇\", leve: \"9\" },\r\n\t\t{ text: \"村社\", leve: \"12\" },\r\n\t].filter((e) => e.leve >= (props.areaCode || user.value?.areacode || user.value?.areaCode || '').length);\r\n\tareaStorage.value = [];\r\n\r\n\tproxy.$vtk.request.getForm(`/dict/area/show/${code}`).then((res) => {\r\n\t\tareaItems.value = [{ areaName: res.data.areaName, areaCode: res.data.areaCode }];\r\n\t\tareaStorage.value.push(areaItems.value);\r\n\t\tentity.value.push(areaItems.value[0]);\r\n\t});\r\n};\r\n\r\n//确认保存\r\nconst save = () => {\r\n\tlet text = [];\r\n\tlet val = [];\r\n\tentity.value.forEach((e) => {\r\n\t\ttext.push(e.areaName);\r\n\t\tval.push(e.areaCode);\r\n\t\titemValue.value = e.areaCode;\r\n\t});\r\n\tif (props.areaNode && props.areaNode > 0) {\r\n\t\ttext = text.slice(-props.areaNode);\r\n\t}\r\n\titemText.value = text.join().replace(/,/g, \"/\");\r\n\tconst lastItem = entity.value[entity.value.length - 1];\r\n\temit(\"update:modelValue\", props.returnObj ? { areaCode: lastItem?.areaCode, areaName: lastItem?.areaName } : itemValue.value);\r\n\temit(\"change\");\r\n\tclose();\r\n};\r\n\r\n// 清空\r\nconst textClear = () => {\r\n\ttab.value = 0;\r\n\tconst initCode = props.areaCode || user.value?.areacode || user.value?.areaCode;\r\n\tgetAreaName(initCode);\r\n\titemValue.value = initCode;\r\n\temit(\"update:modelValue\", itemValue.value);\r\n\temit(\"change\");\r\n};\r\n\r\n// 关闭弹窗\r\nconst close = () => {\r\n\tmenu.value = false;\r\n};\r\n\r\n// Watch modelValue\r\nwatch(() => props.modelValue, (newVal, oldVal) => {\r\n\tif (newVal && newVal != oldVal) {\r\n\t\tconst code = typeof newVal === 'object' ? newVal.areaCode : newVal;\r\n\t\tif (code) view(code);\r\n\t}\r\n});\r\n\r\n// 组件挂载时执行\r\nonMounted(() => {\r\n\t// 获取配置的键名,如果没有配置则使用默认值\r\n\tconst userKey = window.VTK_CONFIG?.storageKeys?.user || '_mis_acis_users';\r\n\tuser.value = proxy.$vtk.storage.get(userKey) && JSON.parse(proxy.$vtk.storage.get(userKey));\r\n\tconst initCode = props.areaCode || user.value?.areacode || user.value?.areaCode;\r\n\tif (initCode) {\r\n\t\tgetAreaName(initCode);\r\n\t}\r\n\tif (props.modelValue) {\r\n\t\tconst code = typeof props.modelValue === 'object' ? props.modelValue.areaCode : props.modelValue;\r\n\t\tif (code) view(code);\r\n\t}\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n// 圆形按钮样式\r\n.area-select-btn {\r\n\tborder-radius: 20px !important;\r\n\tpadding: 6px 20px !important;\r\n\tmin-width: 120px;\r\n\theight: 36px !important;\r\n\ttext-transform: none;\r\n\tletter-spacing: normal;\r\n\r\n\t.btn-text {\r\n\t\tfont-size: 14px;\r\n\t\tcolor: inherit;\r\n\t}\r\n\r\n\t&:hover {\r\n\t\tbackground-color: rgba(var(--v-theme-primary), 0.08);\r\n\t}\r\n}\r\n:deep(.v-tab__slider) {\r\n\theight: 0px !important;\r\n}\r\n\r\n.link::after {\r\n\tcontent: \" / \";\r\n\tfont-size: 14px;\r\n\tcolor: #999;\r\n}\r\n.link:last-of-type::after {\r\n\tcontent: \"\";\r\n}\r\n:deep(.v-chip:not(.v-chip--selected)) {\r\n\tbackground: #e0e0e000;\r\n}\r\n// Vuetify 3 tabs container styling\r\n:deep(.v-tabs) {\r\n\theight: 40px;\r\n}\r\n// Tab button styling\r\n:deep(.v-tab) {\r\n\tmin-width: 90px;\r\n\theight: 32px !important;\r\n\tborder-radius: 6px !important;\r\n\tcolor: rgba(0, 0, 0, .6);\r\n\ttransition: all 0.3s ease;\r\n\tz-index: 1;\r\n}\r\n// Active/selected tab styling\r\n:deep(.v-tab--selected) {\r\n\tbackground-color: rgb(var(--v-theme-primary));\r\n\tcolor: white !important;\r\n\topacity: 1;\r\n}\r\n// Hover effect\r\n:deep(.v-tab:hover) {\r\n\tbackground-color: rgba(var(--v-theme-primary), 0.9);\r\n\tcolor: white;\r\n}\r\n.tabActive {\r\n\tcolor: #fff;\r\n}\r\n.chipActive {\r\n\tcolor: #0095ff !important;\r\n\tbackground-color: #008eff05 !important;\r\n}\r\n.active {\r\n\tcolor: #0095ff !important;\r\n\tbackground-color: #008eff20 !important;\r\n}\r\n:deep(.v-slide-group__next),\r\n:deep(.v-slide-group__prev) {\r\n\tdisplay: none;\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"vtk-breadcrumb-wrapper d-flex align-center justify-space-between\">\r\n <!-- 左侧面包屑 -->\r\n <v-breadcrumbs :items=\"breadcrumbItems\" class=\"pa-0\">\r\n <template v-slot:divider>\r\n <v-icon>mdi-chevron-right</v-icon>\r\n </template>\r\n <template v-slot:item=\"{ item }\">\r\n <v-breadcrumbs-item\r\n :title=\"item.title\"\r\n :to=\"item.to\"\r\n :disabled=\"item.disabled\"\r\n :class=\"{ 'text-primary': !item.disabled }\"\r\n >\r\n {{ item.title }}\r\n </v-breadcrumbs-item>\r\n </template>\r\n </v-breadcrumbs>\r\n\r\n <!-- 右侧返回按钮 -->\r\n <v-btn\r\n v-if=\"showBack\"\r\n variant=\"text\"\r\n color=\"primary\"\r\n prepend-icon=\"mdi-arrow-left\"\r\n @click=\"handleBack\"\r\n style=\"height: 36px;\"\r\n >\r\n {{ backText }}\r\n </v-btn>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed, inject, getCurrentInstance } from 'vue'\r\n\r\nconst props = defineProps({\r\n // 面包屑项目数组\r\n items: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 是否显示返回按钮\r\n showBack: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 返回按钮文字\r\n backText: {\r\n type: String,\r\n default: '返回'\r\n },\r\n // 自定义返回路径,不传则返回上一级\r\n backTo: {\r\n type: [String, Object],\r\n default: null\r\n }\r\n})\r\n\r\nconst emit = defineEmits(['back'])\r\n\r\n// 使用inject安全地获取router和route\r\nconst router = inject('router', null)\r\nconst route = inject('route', null)\r\n\r\n// 处理面包屑数据\r\nconst breadcrumbItems = computed(() => {\r\n if (props.items && props.items.length > 0) {\r\n return props.items.map((item, index) => ({\r\n title: item.title || item.text || item.name,\r\n to: item.to || item.path || item.href,\r\n disabled: item.disabled !== undefined ? item.disabled : index === props.items.length - 1\r\n }))\r\n }\r\n\r\n // 如果route不可用,返回空数组\r\n if (!route) {\r\n return []\r\n }\r\n\r\n // 如果没有传入items,尝试从路由meta中获取\r\n const matched = route.matched?.filter(r => r.meta && r.meta.breadcrumb) || []\r\n if (matched.length > 0) {\r\n return matched.map((r, index) => ({\r\n title: r.meta.breadcrumb,\r\n to: r.path,\r\n disabled: index === matched.length - 1\r\n }))\r\n }\r\n\r\n // 默认返回当前路由路径生成的面包屑\r\n const pathArray = route.path?.split('/').filter(p => p) || []\r\n return pathArray.map((path, index) => {\r\n const routePath = '/' + pathArray.slice(0, index + 1).join('/')\r\n return {\r\n title: path.charAt(0).toUpperCase() + path.slice(1),\r\n to: routePath,\r\n disabled: index === pathArray.length - 1\r\n }\r\n })\r\n})\r\n\r\n// 处理返回按钮点击\r\nconst handleBack = () => {\r\n // 触发back事件\r\n emit('back')\r\n\r\n // 如果router不可用,仅触发事件\r\n if (!router) {\r\n return\r\n }\r\n\r\n // 如果传入了backTo参数,跳转到指定路径\r\n if (props.backTo) {\r\n if (typeof props.backTo === 'string') {\r\n router.push(props.backTo)\r\n } else {\r\n router.push(props.backTo)\r\n }\r\n } else {\r\n // 默认返回上一级\r\n router.back()\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-breadcrumb-wrapper {\r\n width: 100%;\r\n padding: 12px 0;\r\n\r\n :deep(.v-breadcrumbs) {\r\n flex-grow: 1;\r\n height: 36px;\r\n }\r\n\r\n :deep(.v-breadcrumbs-item) {\r\n font-size: 14px;\r\n }\r\n\r\n :deep(.v-breadcrumbs-divider) {\r\n padding: 0 8px;\r\n }\r\n\r\n :deep(.v-breadcrumbs-item--disabled) {\r\n opacity: 0.6;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <VInput \r\n v-bind=\"inputAttrs\" \r\n :model-value=\"inputValue\"\r\n >\r\n <div class=\"checkGroup\" :class=\"inline ? 'd-flex flex-wrap align-top' : 'd-inline-block'\">\r\n <VCheckbox\r\n v-for=\"item in items\"\r\n hide-details\r\n :key=\"item.id || item.code\"\r\n :label=\"item.codeValue\"\r\n :value=\"item.code\"\r\n v-model=\"localValue\"\r\n v-bind=\"checkboxAttrs\"\r\n :class=\"inline ? 'mr-4' : ''\"\r\n />\r\n </div>\r\n </VInput>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, useAttrs, computed, watch } from 'vue';\r\nimport Request from '../../commons/request';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkCheckbox\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n /**\r\n * 字典来源:\r\n * - 若为静态数据,格式如:\"0:否/1:是\"\r\n * - 若为字典键,格式如:\"DISABLE_TYPE\"\r\n */\r\n list: {\r\n type: String,\r\n required: true,\r\n },\r\n /**\r\n * 是否横向排列\r\n */\r\n inline: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 绑定值\r\n */\r\n modelValue: {\r\n type: [Array, String],\r\n default: () => []\r\n }\r\n});\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 本地选中值\r\nconst localValue = ref([]);\r\n\r\n// 防止递归更新的标志位\r\nconst isUpdatingLocal = ref(false);\r\nconst isUpdatingModel = ref(false);\r\n\r\n// 同步外部 modelValue 到本地值\r\nwatch(() => props.modelValue, (newVal) => {\r\n if (isUpdatingModel.value) {\r\n isUpdatingModel.value = false;\r\n return;\r\n }\r\n \r\n isUpdatingLocal.value = true;\r\n if (Array.isArray(newVal)) {\r\n localValue.value = [...newVal];\r\n } else if (typeof newVal === 'string') {\r\n localValue.value = newVal ? [newVal] : [];\r\n } else {\r\n localValue.value = [];\r\n }\r\n}, { immediate: true });\r\n\r\n// 同步本地值到外部 modelValue\r\nwatch(localValue, (newVal) => {\r\n if (isUpdatingLocal.value) {\r\n isUpdatingLocal.value = false;\r\n return;\r\n }\r\n \r\n isUpdatingModel.value = true;\r\n emit('update:modelValue', newVal);\r\n}, { deep: true });\r\n\r\n// 获取透传属性\r\nconst attrs = useAttrs();\r\n\r\n// 分离传递给 input 和传递给 checkbox 的属性\r\nconst inputAttrs = computed(() => {\r\n const { list, inline, modelValue, ...rest } = attrs;\r\n return rest;\r\n});\r\n\r\nconst checkboxAttrs = computed(() => {\r\n // 移除表单验证相关属性,避免重复应用\r\n const { \r\n list, \r\n inline, \r\n modelValue,\r\n error, \r\n 'error-messages': errorMessages, \r\n rules, \r\n hint, \r\n 'persistent-hint': persistentHint,\r\n ...rest \r\n } = attrs;\r\n return rest;\r\n});\r\n\r\n// 为 v-input 提供一个值\r\nconst inputValue = computed(() => {\r\n return localValue.value && localValue.value.length > 0 ? localValue.value : null;\r\n});\r\n\r\n// 响应式数据\r\nconst items = ref([]);\r\n\r\n// 处理静态数据(如 \"0:否/1:是\")\r\nconst statc = () => {\r\n props.list.split('/').forEach(it => {\r\n const [code, codeValue] = it.split(':');\r\n items.value.push({ code, codeValue });\r\n });\r\n};\r\n\r\n// 请求远程字典数据\r\nconst miscs = async () => {\r\n try {\r\n const res = await Request.getForm(`dict/misc/list/${props.list}`);\r\n items.value = res.data || [];\r\n } catch (error) {\r\n console.error('[VtkCheckbox] Failed to load dictionary:', error);\r\n items.value = [];\r\n }\r\n};\r\n\r\n// 组件挂载时初始化数据\r\nonMounted(() => {\r\n if (props.list.includes(':')) {\r\n statc();\r\n } else {\r\n miscs();\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n:deep(.v-checkbox .v-selection-control) {\r\n margin: 0;\r\n padding: 0;\r\n min-height: 32px;\r\n}\r\n\r\n:deep(.v-input__details) {\r\n padding-inline: 16px;\r\n}\r\n</style>","<!-- \r\n\r\n// 基础用法\r\n <VtkCount :start=\"0\" :end=\"12345\" :duration=\"3000\" suffix=\"次\" />\r\n \r\n//带前缀和分隔符\r\n <VtkCount \r\n :start=\"0\" \r\n :end=\"999999\" \r\n :duration=\"2000\" \r\n prefix=\"¥\" \r\n suffix=\"元\" \r\n :separator=\"true\" \r\n />\r\n \r\n//手动控制\r\n <VtkCount \r\n ref=\"countRef\" \r\n :start=\"0\" \r\n :end=\"100\" \r\n :autoplay=\"false\" \r\n @complete=\"onComplete\"\r\n />\r\n <VBtn @click=\"startCount\">开始计数</VBtn>\r\n -->\r\n\r\n<template>\r\n <div class=\"vtk-count\" :class=\"containerClass\">\r\n <div class=\"count-display\" :style=\"{ color: color }\">\r\n <!-- 前缀 -->\r\n <span v-if=\"prefix\" class=\"prefix\">{{ prefix }}</span>\r\n \r\n <!-- 数字容器 -->\r\n <div class=\"digits-container\">\r\n <div \r\n v-for=\"(digitChar, index) in maxDigitString\" \r\n :key=\"`digit-${index}-${digitKey}`\"\r\n class=\"digit-wrapper\"\r\n :class=\"{ 'digit-separator': isNaN(digitChar) }\"\r\n >\r\n <div \r\n v-if=\"!isNaN(digitChar)\" \r\n class=\"digit-scroll\"\r\n >\r\n <div \r\n v-for=\"n in 10\" \r\n :key=\"n\" \r\n class=\"digit-item\"\r\n :style=\"getDigitStyle(getCurrentDigit(index), n-1)\"\r\n >\r\n {{ n-1 }}\r\n </div>\r\n </div>\r\n <div v-else class=\"separator\">{{ digitChar }}</div>\r\n </div>\r\n </div>\r\n \r\n <!-- 后缀 -->\r\n <span v-if=\"suffix\" class=\"suffix\">{{ suffix }}</span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, onMounted, watch, nextTick } from 'vue'\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkCount\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 初始值\r\n start: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 目标值\r\n end: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 动画持续时间(毫秒)\r\n duration: {\r\n type: Number,\r\n default: 2000\r\n },\r\n // 是否自动开始动画\r\n autoplay: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 数字前缀\r\n prefix: {\r\n type: String,\r\n default: ''\r\n },\r\n // 数字后缀\r\n suffix: {\r\n type: String,\r\n default: ''\r\n },\r\n // 容器自定义类名\r\n containerClass: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否使用分隔符(千分位)\r\n separator: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 小数位数\r\n decimals: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 文字颜色\r\n color: {\r\n type: String,\r\n default: '#1976d2'\r\n }\r\n})\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['complete'])\r\n\r\n// 当前显示的数值\r\nconst currentNumber = ref(props.start)\r\n\r\n// 当前每个位置的数字值\r\nconst currentDigits = ref([])\r\n\r\n// 用于强制重新渲染的key\r\nconst digitKey = ref(0)\r\n\r\n// 是否正在动画中\r\nconst isAnimating = ref(false)\r\n\r\n// 格式化数字(处理小数和分隔符)\r\nconst formatNumber = (num) => {\r\n let result = num.toFixed(props.decimals)\r\n if (props.separator && props.decimals === 0) {\r\n result = result.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\r\n }\r\n return result\r\n}\r\n\r\n// 获取目标数字字符串\r\nconst targetNumberString = computed(() => {\r\n return formatNumber(props.end)\r\n})\r\n\r\n// 获取起始数字字符串\r\nconst startNumberString = computed(() => {\r\n return formatNumber(props.start)\r\n})\r\n\r\n// 获取最大位数的字符串(用于保持DOM结构稳定)\r\nconst maxDigitString = computed(() => {\r\n const target = targetNumberString.value\r\n const start = startNumberString.value\r\n return target.length >= start.length ? target : start\r\n})\r\n\r\n// 获取当前指定位置的数字\r\nconst getCurrentDigit = (index) => {\r\n if (index < currentDigits.value.length) {\r\n return currentDigits.value[index]\r\n }\r\n return '0'\r\n}\r\n\r\n// 初始化数字数组\r\nconst initDigitsArray = () => {\r\n const targetStr = targetNumberString.value\r\n const startStr = startNumberString.value\r\n \r\n // 初始化currentDigits数组,确保长度与maxDigitString一致\r\n currentDigits.value = maxDigitString.value.split('').map((char, index) => {\r\n if (isNaN(char)) {\r\n return char // 分隔符保持原样\r\n }\r\n \r\n // 从起始字符串对应位置获取数字\r\n if (index < startStr.length) {\r\n const startChar = startStr[index]\r\n return isNaN(startChar) ? '0' : startChar\r\n }\r\n return '0'\r\n })\r\n}\r\n\r\n// 获取数字样式\r\nconst getDigitStyle = (currentValue, digitValue) => {\r\n // 如果是分隔符,直接返回\r\n if (isNaN(currentValue) || isNaN(digitValue)) {\r\n return {\r\n transform: 'translateY(0)'\r\n }\r\n }\r\n \r\n const current = parseInt(currentValue) || 0\r\n const target = digitValue\r\n const offset = target - current\r\n \r\n // 处理循环滚动(9->0 或 0->9)\r\n let translateY\r\n if (offset > 5) {\r\n // 向下滚动(如 9->0)\r\n translateY = -(10 - offset) * 100\r\n } else if (offset < -5) {\r\n // 向上滚动(如 0->9)\r\n translateY = (10 + offset) * 100\r\n } else {\r\n translateY = -offset * 100\r\n }\r\n \r\n return {\r\n transform: `translateY(${translateY}%)`,\r\n transition: isAnimating.value ? 'transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)' : 'none',\r\n color: props.color\r\n }\r\n}\r\n\r\n// 开始数字动画\r\nconst startAnimation = () => {\r\n if (isAnimating.value) return\r\n \r\n isAnimating.value = true\r\n const startTime = performance.now()\r\n const startValue = props.start\r\n const endValue = props.end\r\n const diff = endValue - startValue\r\n \r\n // 初始化数字数组\r\n initDigitsArray()\r\n \r\n const animate = (currentTime) => {\r\n const elapsed = currentTime - startTime\r\n const progress = Math.min(elapsed / props.duration, 1)\r\n \r\n // 使用缓动函数使动画更自然\r\n const easeOutQuart = 1 - Math.pow(1 - progress, 4)\r\n currentNumber.value = startValue + diff * easeOutQuart\r\n \r\n // 更新每个数字位的当前值\r\n updateDigitArray(currentNumber.value)\r\n \r\n if (progress < 1) {\r\n requestAnimationFrame(animate)\r\n } else {\r\n currentNumber.value = endValue\r\n // 确保最终值准确\r\n updateDigitArray(endValue)\r\n isAnimating.value = false\r\n emit('complete')\r\n }\r\n }\r\n \r\n requestAnimationFrame(animate)\r\n}\r\n\r\n// 更新数字数组\r\nconst updateDigitArray = (value) => {\r\n const valueStr = formatNumber(value)\r\n const maxStr = maxDigitString.value\r\n \r\n // 保持数组长度不变,只更新值\r\n for (let i = 0; i < maxStr.length; i++) {\r\n if (i < valueStr.length) {\r\n currentDigits.value[i] = valueStr[i]\r\n } else {\r\n // 超出部分保持为'0'或分隔符\r\n currentDigits.value[i] = isNaN(maxStr[i]) ? maxStr[i] : '0'\r\n }\r\n }\r\n}\r\n\r\n// 监听 end 值变化,重新开始动画\r\nwatch(() => props.end, (newVal, oldVal) => {\r\n if (newVal !== oldVal) {\r\n // 当位数可能发生变化时,更新key强制重新渲染\r\n const newStr = formatNumber(newVal)\r\n const oldStr = formatNumber(oldVal)\r\n if (newStr.length !== oldStr.length) {\r\n digitKey.value += 1\r\n nextTick(() => {\r\n startAnimation()\r\n })\r\n } else {\r\n startAnimation()\r\n }\r\n }\r\n})\r\n\r\n// 组件挂载时开始动画\r\nonMounted(() => {\r\n if (props.autoplay) {\r\n // 检查初始值和目标值位数是否不同,如果不同则更新key\r\n const startStr = startNumberString.value\r\n const endStr = targetNumberString.value\r\n if (startStr.length !== endStr.length) {\r\n digitKey.value += 1\r\n }\r\n \r\n nextTick(() => {\r\n startAnimation()\r\n })\r\n }\r\n})\r\n\r\n// 提供外部调用方法\r\ndefineExpose({\r\n startAnimation\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.vtk-count {\r\n display: inline-block;\r\n}\r\n\r\n.count-display {\r\n display: flex;\r\n align-items: center;\r\n font-family: 'Roboto Mono', monospace;\r\n font-size: 24px;\r\n font-weight: bold;\r\n}\r\n\r\n.digits-container {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.digit-wrapper {\r\n position: relative;\r\n width: 1em;\r\n height: 1em;\r\n overflow: hidden;\r\n text-align: center;\r\n margin: 0 1px;\r\n}\r\n\r\n.digit-wrapper.digit-separator {\r\n width: auto;\r\n animation: none;\r\n}\r\n\r\n.digit-scroll {\r\n position: relative;\r\n height: 100%;\r\n}\r\n\r\n.digit-item {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.separator {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n font-weight: normal;\r\n}\r\n\r\n.prefix, .suffix {\r\n font-size: 0.8em;\r\n align-self: flex-end;\r\n margin-bottom: 0.1em;\r\n}\r\n\r\n.prefix {\r\n margin-right: 4px;\r\n}\r\n\r\n.suffix {\r\n margin-left: 4px;\r\n}\r\n\r\n/* 响应式设计 */\r\n@media (max-width: 768px) {\r\n .count-display {\r\n font-size: 20px;\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .count-display {\r\n font-size: 18px;\r\n }\r\n}\r\n</style>","<template>\r\n <div class=\"vtk-date-range-picker\">\r\n <VMenu\r\n v-model=\"menu\"\r\n :close-on-content-click=\"false\"\r\n transition=\"scale-transition\"\r\n offset-y\r\n min-width=\"auto\"\r\n eager\r\n >\r\n <template #activator=\"{ props: activatorProps }\">\r\n <VTextField\r\n v-bind=\"{ ...activatorProps, ...textFieldProps }\"\r\n v-model=\"displayValue\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n readonly\r\n clearable\r\n density=\"compact\"\r\n variant=\"outlined\"\r\n @click:clear=\"clearValue\"\r\n >\r\n <template #prepend-inner>\r\n <VIcon size=\"small\">mdi-calendar</VIcon>\r\n </template>\r\n </VTextField>\r\n </template>\r\n \r\n <VCard style=\"width: 650px;\">\r\n <VCardText class=\"pa-0\">\r\n <div class=\"date-picker-container\">\r\n <VDatePicker\r\n v-model=\"startDateRange\"\r\n hide-header\r\n :min=\"minDate\"\r\n :max=\"maxDate\"\r\n :show-current=\"showCurrent\"\r\n @update:model-value=\"onStartDateChange\"\r\n class=\"date-picker-item\"\r\n />\r\n <VDatePicker\r\n v-model=\"endDateRange\"\r\n hide-header\r\n :min=\"minDate\"\r\n :max=\"maxDate\"\r\n :show-current=\"showCurrent\"\r\n @update:model-value=\"onEndDateChange\"\r\n class=\"date-picker-item\"\r\n />\r\n </div>\r\n </VCardText>\r\n \r\n <VDivider></VDivider>\r\n \r\n <VCardActions>\r\n <VSpacer></VSpacer>\r\n <VBtn text @click=\"cancel\">取消</VBtn>\r\n <VBtn color=\"primary\" variant=\"tonal\" @click=\"confirm\">确定</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VMenu>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch, useAttrs } from 'vue';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkDatePicker\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n // v-model绑定值\r\n modelValue: {\r\n type: [Array, String],\r\n default: () => []\r\n },\r\n // 占位符\r\n placeholder: {\r\n type: String,\r\n default: '请选择日期范围'\r\n },\r\n // 禁用状态\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 最小日期\r\n min: {\r\n type: String,\r\n default: undefined\r\n },\r\n // 最大日期\r\n max: {\r\n type: String,\r\n default: undefined\r\n },\r\n // 是否显示当前日期\r\n showCurrent: {\r\n type: [Boolean, String],\r\n default: true\r\n },\r\n // 显示格式\r\n format: {\r\n type: String,\r\n default: 'YYYY-MM-DD'\r\n },\r\n // 分隔符\r\n separator: {\r\n type: String,\r\n default: ' 至 '\r\n }\r\n});\r\n\r\n// 定义emit事件\r\nconst emit = defineEmits(['update:modelValue', 'change']);\r\n\r\n// 获取透传属性\r\nconst attrs = useAttrs();\r\n\r\n// 菜单显示控制\r\nconst menu = ref(false);\r\n\r\n// 日期范围值\r\nconst dateRange = ref([]);\r\n\r\n// 为了横向排列,需要分别管理开始和结束日期选择器的值\r\nconst startDateRange = ref(null);\r\nconst endDateRange = ref(null);\r\n\r\n\r\n// 显示值\r\nconst displayValue = computed(() => {\r\n if (!dateRange.value || dateRange.value.length === 0) {\r\n return '';\r\n }\r\n \r\n if (dateRange.value.length === 1) {\r\n return formatDate(dateRange.value[0]);\r\n }\r\n \r\n return `${formatDate(dateRange.value[0])}${props.separator}${formatDate(dateRange.value[1])}`;\r\n});\r\n\r\n// 文本框属性\r\nconst textFieldProps = computed(() => {\r\n // 排除我们自己使用的属性\r\n const { \r\n modelValue, \r\n placeholder, \r\n disabled, \r\n min, \r\n max, \r\n showCurrent, \r\n format,\r\n separator,\r\n ...rest \r\n } = attrs;\r\n \r\n return rest;\r\n});\r\n\r\n// 格式化日期\r\nconst formatDate = (date) => {\r\n if (!date) return '';\r\n \r\n // 如果是字符串直接返回\r\n if (typeof date === 'string') {\r\n return date;\r\n }\r\n \r\n // 如果是 Date 对象\r\n if (date instanceof Date) {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n \r\n return date;\r\n};\r\n\r\n// 最小日期\r\nconst minDate = computed(() => props.min);\r\n\r\n// 最大日期\r\nconst maxDate = computed(() => props.max);\r\n\r\n// 监听外部modelValue变化\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n if (Array.isArray(newValue) && newValue.length > 0) {\r\n dateRange.value = [...newValue];\r\n // 同步到单独的日期选择器\r\n if (newValue[0]) startDateRange.value = newValue[0];\r\n if (newValue[1]) endDateRange.value = newValue[1];\r\n } else if (typeof newValue === 'string' && newValue) {\r\n // 处理字符串形式的日期范围,如 \"2023-01-01 至 2023-01-31\"\r\n const dates = newValue.split(props.separator);\r\n if (dates.length === 2) {\r\n dateRange.value = [dates[0].trim(), dates[1].trim()];\r\n startDateRange.value = dates[0].trim();\r\n endDateRange.value = dates[1].trim();\r\n } else {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n }\r\n } else {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n }\r\n },\r\n { immediate: true }\r\n);\r\n\r\n\r\n// 开始日期变化处理\r\nconst onStartDateChange = (value) => {\r\n // 更新日期范围的第一个值\r\n if (value) {\r\n dateRange.value = [value, dateRange.value[1] || null];\r\n } else {\r\n // 如果开始日期被清除,清除整个范围或只清除开始日期\r\n if (dateRange.value.length > 0) {\r\n dateRange.value = [null, dateRange.value[1] || null];\r\n }\r\n }\r\n};\r\n\r\n// 结束日期变化处理\r\nconst onEndDateChange = (value) => {\r\n // 更新日期范围的第二个值\r\n if (value) {\r\n dateRange.value = [dateRange.value[0] || null, value];\r\n } else {\r\n // 如果结束日期被清除,只清除结束日期\r\n if (dateRange.value.length > 1) {\r\n dateRange.value = [dateRange.value[0] || null, null];\r\n }\r\n }\r\n};\r\n\r\n// 清除值\r\nconst clearValue = () => {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n emit('update:modelValue', []);\r\n emit('change', []);\r\n menu.value = false;\r\n};\r\n\r\n// 取消\r\nconst cancel = () => {\r\n // 恢复到原始值\r\n if (Array.isArray(props.modelValue)) {\r\n dateRange.value = [...props.modelValue];\r\n if (props.modelValue[0]) startDateRange.value = props.modelValue[0];\r\n if (props.modelValue[1]) endDateRange.value = props.modelValue[1];\r\n } else {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n }\r\n menu.value = false;\r\n};\r\n\r\n// 确认\r\nconst confirm = () => {\r\n // 确保日期按顺序排列\r\n let sortedRange = [...dateRange.value].filter(date => date !== null);\r\n if (sortedRange.length === 2) {\r\n const date1 = new Date(sortedRange[0]);\r\n const date2 = new Date(sortedRange[1]);\r\n if (date1 > date2) {\r\n sortedRange = [sortedRange[1], sortedRange[0]];\r\n }\r\n } else if (sortedRange.length === 1) {\r\n // 如果只有一个日期,复制为范围\r\n sortedRange = [sortedRange[0], sortedRange[0]];\r\n }\r\n \r\n emit('update:modelValue', sortedRange);\r\n emit('change', sortedRange);\r\n menu.value = false;\r\n};\r\n</script>\r\n\r\n<style scoped>\r\n.vtk-date-range-picker {\r\n width: 100%;\r\n}\r\n\r\n.date-picker-container {\r\n display: flex;\r\n flex-direction: row;\r\n gap: 0;\r\n}\r\n\r\n.date-picker-item {\r\n flex: 1;\r\n max-width: 50%;\r\n}\r\n\r\n.date-picker-item:first-child {\r\n border-right: 1px solid rgba(0, 0, 0, 0.12);\r\n}\r\n\r\n:deep(.v-picker) {\r\n border-radius: 0;\r\n}\r\n\r\n:deep(.v-date-picker-month__day--adjacent) {\r\n opacity: 0.5;\r\n}\r\n\r\n:deep(.v-date-picker-title) {\r\n display: none;\r\n}\r\n</style>","<template>\n <div class=\"panel-header\" @keydown.esc.stop=\"closePicker\">\n <button type=\"button\" class=\"panel-nav\" aria-label=\"上一周期\" @click=\"handleNavigate('prev')\">‹</button>\n\n <div class=\"panel-title\">\n <button type=\"button\" class=\"title-trigger\" :class=\"{ active: openPicker === 'year' }\"\n :aria-expanded=\"openPicker === 'year'\" aria-label=\"选择年份\" @click.stop=\"togglePicker('year')\">\n {{ year }}年\n </button>\n <button v-if=\"showMonth\" type=\"button\" class=\"title-trigger month-trigger\"\n :class=\"{ active: openPicker === 'month' }\" :aria-expanded=\"openPicker === 'month'\" aria-label=\"选择月份\"\n @click.stop=\"togglePicker('month')\">\n {{ month + 1 }}月\n </button>\n </div>\n\n <button type=\"button\" class=\"panel-nav\" aria-label=\"下一周期\" @click=\"handleNavigate('next')\">›</button>\n\n <div v-if=\"openPicker\" class=\"panel-popover\" @click.stop>\n <template v-if=\"openPicker === 'year'\">\n <div class=\"picker-navigation\">\n <button type=\"button\" class=\"picker-nav\" aria-label=\"上一组年份\" @click=\"shiftYearPage(-YEAR_PAGE_SIZE)\">\n ‹\n </button>\n <span class=\"picker-range\">{{ yearPage[0] }} - {{ yearPage[yearPage.length - 1] }}</span>\n <button type=\"button\" class=\"picker-nav\" :disabled=\"!canShowNextYearPage\" aria-label=\"下一组年份\"\n @click=\"shiftYearPage(YEAR_PAGE_SIZE)\">\n ›\n </button>\n </div>\n <div class=\"picker-grid year-picker-grid\">\n <button v-for=\"item in yearPage\" :key=\"item\" type=\"button\" class=\"picker-option\"\n :class=\"{ selected: item === year }\" :disabled=\"isYearDisabled(item)\" @click=\"selectYear(item)\">\n {{ item }}\n </button>\n </div>\n </template>\n\n <template v-else>\n <div class=\"picker-caption\">{{ year }}年</div>\n <div class=\"picker-grid month-picker-grid\">\n <button v-for=\"(item, index) in MONTHS\" :key=\"item\" type=\"button\" class=\"picker-option\"\n :class=\"{ selected: index === month }\" :disabled=\"isMonthDisabled(index)\" @click=\"selectMonth(index)\">\n {{ item }}\n </button>\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkDatePanelHeader',\n});\n\nconst props = defineProps({\n year: {\n type: Number,\n required: true\n },\n month: {\n type: Number,\n default: 0\n },\n showMonth: {\n type: Boolean,\n default: true\n },\n maxYear: {\n type: Number,\n default: null\n },\n maxMonth: {\n type: Number,\n default: 11\n }\n});\n\nconst emit = defineEmits(['update:year', 'update:month', 'prev', 'next']);\n\nconst YEAR_PAGE_SIZE = 12;\nconst YEAR_PAGE_CENTER_OFFSET = 4;\nconst MONTHS = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];\n\nconst getYearPageStart = (year) => year - YEAR_PAGE_CENTER_OFFSET;\n\nconst openPicker = ref(null);\nconst yearPageStart = ref(getYearPageStart(props.year));\n\nconst yearPage = computed(() =>\n Array.from({ length: YEAR_PAGE_SIZE }, (_, index) => yearPageStart.value + index)\n);\n\nconst canShowNextYearPage = computed(() =>\n props.maxYear === null || yearPageStart.value + YEAR_PAGE_SIZE <= props.maxYear\n);\n\nconst isYearDisabled = (year) => props.maxYear !== null && year > props.maxYear;\n\nconst isMonthDisabled = (month) => {\n if (props.maxYear === null || props.year < props.maxYear) return false;\n if (props.year > props.maxYear) return true;\n return month > props.maxMonth;\n};\n\nconst togglePicker = (type) => {\n if (openPicker.value === type) {\n closePicker();\n return;\n }\n\n if (type === 'year') {\n yearPageStart.value = getYearPageStart(props.year);\n }\n openPicker.value = type;\n};\n\nconst closePicker = () => {\n openPicker.value = null;\n};\n\nconst shiftYearPage = (offset) => {\n const nextStart = yearPageStart.value + offset;\n if (offset > 0 && props.maxYear !== null && nextStart > props.maxYear) return;\n yearPageStart.value = nextStart;\n};\n\nconst selectYear = (year) => {\n if (isYearDisabled(year)) return;\n\n emit('update:year', year);\n if (props.showMonth) {\n if (props.maxYear !== null && year === props.maxYear && props.month > props.maxMonth) {\n emit('update:month', props.maxMonth);\n }\n openPicker.value = 'month';\n } else {\n closePicker();\n }\n};\n\nconst selectMonth = (month) => {\n if (isMonthDisabled(month)) return;\n emit('update:month', month);\n closePicker();\n};\n\nconst handleNavigate = (direction) => {\n closePicker();\n emit(direction);\n};\n\nwatch(() => props.year, (year) => {\n if (openPicker.value !== 'year') {\n yearPageStart.value = getYearPageStart(year);\n }\n});\n</script>\n\n<style scoped>\n.panel-header {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 30px;\n margin-bottom: 4px;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 112px;\n}\n\n.title-trigger,\n.panel-nav,\n.picker-nav,\n.picker-option {\n border: 0;\n outline: none;\n font: inherit;\n}\n\n.title-trigger {\n position: relative;\n padding: 5px 17px 5px 7px;\n border-radius: 5px;\n background: transparent;\n color: rgb(var(--v-theme-on-surface));\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n cursor: pointer;\n transition: color 0.18s ease, background 0.18s ease;\n}\n\n.title-trigger::after {\n position: absolute;\n top: 10px;\n right: 7px;\n width: 5px;\n height: 5px;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n content: '';\n transform: rotate(45deg);\n transition: transform 0.18s ease;\n}\n\n.title-trigger:hover,\n.title-trigger.active {\n background: rgb(var(--v-theme-primary), 0.1);\n color: rgb(var(--v-theme-primary));\n}\n\n.title-trigger.active::after {\n top: 12px;\n transform: rotate(225deg);\n}\n\n.month-trigger {\n margin-left: 1px;\n}\n\n.panel-nav,\n.picker-nav {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 5px;\n background: transparent;\n color: rgb(var(--v-theme-on-surface), 0.55);\n cursor: pointer;\n transition: color 0.18s ease, background 0.18s ease;\n}\n\n.panel-nav {\n width: 24px;\n height: 24px;\n font-size: 17px;\n}\n\n.panel-nav:hover,\n.picker-nav:hover:not(:disabled) {\n background: rgb(var(--v-theme-on-surface), 0.08);\n color: rgb(var(--v-theme-on-surface));\n}\n\n.panel-popover {\n position: absolute;\n z-index: 5;\n top: 34px;\n left: 50%;\n width: 204px;\n padding: 10px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 8px;\n background: rgb(var(--v-theme-surface));\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.16);\n transform: translateX(-50%);\n}\n\n.picker-navigation {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.picker-range,\n.picker-caption {\n color: rgb(var(--v-theme-on-surface), 0.72);\n font-size: 12px;\n font-weight: 600;\n}\n\n.picker-caption {\n margin-bottom: 8px;\n text-align: center;\n}\n\n.picker-nav {\n width: 24px;\n height: 24px;\n font-size: 16px;\n}\n\n.picker-nav:disabled {\n color: rgb(var(--v-theme-on-surface), 0.22);\n cursor: not-allowed;\n}\n\n.picker-grid {\n display: grid;\n gap: 6px;\n}\n\n.year-picker-grid,\n.month-picker-grid {\n grid-template-columns: repeat(4, 1fr);\n}\n\n.picker-option {\n min-width: 0;\n padding: 7px 2px;\n border-radius: 5px;\n background: transparent;\n color: rgb(var(--v-theme-on-surface), 0.82);\n font-size: 12px;\n cursor: pointer;\n transition: color 0.18s ease, background 0.18s ease;\n}\n\n.picker-option:hover:not(:disabled) {\n background: rgb(var(--v-theme-primary), 0.1);\n color: rgb(var(--v-theme-primary));\n}\n\n.picker-option.selected {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n font-weight: 600;\n}\n\n.picker-option:disabled {\n color: rgb(var(--v-theme-on-surface), 0.24);\n cursor: not-allowed;\n}\n</style>\n","<template>\r\n <div class=\"vtk-date-selector\" :style=\"rootStyle\">\n <VMenu\r\n v-if=\"!inline\"\r\n v-model=\"showPicker\"\r\n :attach=\"menuAttach\"\r\n :location=\"menuLocation\"\r\n :origin=\"menuOrigin\"\r\n offset=\"4\"\r\n :close-on-content-click=\"false\"\r\n >\r\n <template #activator=\"{ props: menuProps }\">\r\n <div class=\"date-input\">\r\n <VTextField :model-value=\"displayValue\" :placeholder=\"placeholder\" :disabled=\"disabled\" density=\"compact\"\r\n variant=\"outlined\" hide-details readonly v-bind=\"menuProps\" :clearable=\"!!displayValue && !disabled\"\r\n clear-icon=\"mdi-close-circle\" persistent-clear class=\"date-input-field\" @click:clear.stop=\"clearValue\">\r\n <template #append-inner>\r\n <span class=\"date-icon\" aria-hidden=\"true\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" class=\"date-icon-svg\">\r\n <path\r\n d=\"M7 2.75a.75.75 0 0 1 .75.75V5h8.5V3.5a.75.75 0 0 1 1.5 0V5h.75A2.5 2.5 0 0 1 21 7.5v10A2.5 2.5 0 0 1 18.5 20h-13A2.5 2.5 0 0 1 3 17.5v-10A2.5 2.5 0 0 1 5.5 5h.75V3.5A.75.75 0 0 1 7 2.75ZM4.5 10v7.5c0 .552.448 1 1 1h13c.552 0 1-.448 1-1V10h-15Zm1-3.5c-.552 0-1 .448-1 1v1h15v-1c0-.552-.448-1-1-1h-.75v1a.75.75 0 0 1-1.5 0v-1h-8.5v1a.75.75 0 0 1-1.5 0v-1H5.5Zm2.25 5.75a.75.75 0 0 1 .75.75v.25a.75.75 0 0 1-1.5 0V13a.75.75 0 0 1 .75-.75Zm4.25 0a.75.75 0 0 1 .75.75v.25a.75.75 0 0 1-1.5 0V13a.75.75 0 0 1 .75-.75Zm4.25 0a.75.75 0 0 1 .75.75v.25a.75.75 0 0 1-1.5 0V13a.75.75 0 0 1 .75-.75Zm-8.5 3.75a.75.75 0 0 1 .75.75V17a.75.75 0 0 1-1.5 0v-.25a.75.75 0 0 1 .75-.75Zm4.25 0a.75.75 0 0 1 .75.75V17a.75.75 0 0 1-1.5 0v-.25a.75.75 0 0 1 .75-.75Z\"\r\n fill=\"currentColor\" />\r\n </svg>\r\n </span>\r\n </template>\r\n </VTextField>\r\n </div>\r\n </template>\r\n <div class=\"date-picker-dropdown\" :style=\"popupStyle\" @click.stop @mousedown.stop>\n <!-- 头部控制区(非日期/月份范围选择模式时显示) -->\r\n <div v-if=\"!(mode === 'range' && (displayMode === 'day' || displayMode === 'month'))\" class=\"picker-header\">\r\n <button class=\"nav-btn\" @click=\"prevPeriod\">‹</button>\r\n <div class=\"header-title\">\r\n <span @click=\"changeViewMode('year')\" class=\"clickable\">{{ currentYear }}年</span>\r\n <span v-if=\"displayMode !== 'year' && viewMode !== 'month'\" @click=\"changeViewMode('month')\"\r\n class=\"clickable\">{{\r\n currentMonth + 1\r\n }}月</span>\r\n </div>\r\n <button class=\"nav-btn\" @click=\"nextPeriod\">›</button>\r\n </div>\r\n\r\n <!-- 年份选择视图 -->\r\n <div v-if=\"viewMode === 'year'\" class=\"picker-body\">\r\n <div class=\"year-grid\">\r\n <div v-for=\"year in yearList\" :key=\"year\"\r\n :class=\"['year-item', { 'selected': isYearSelected(year), 'in-range': isYearInRange(year), 'disabled': isFutureYear(year) }]\"\r\n @click=\"selectYear(year)\">\r\n {{ year }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 月份选择视图 -->\r\n <div v-else-if=\"viewMode === 'month'\" class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个年份的月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" :show-month=\"false\"\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYear\" @next=\"nextYearLeft\" />\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" :show-month=\"false\"\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYearRight\" @next=\"nextYear\" />\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelectedRight(index), 'in-range': isMonthInRangeRight(index), 'disabled': isFutureMonth(index, rightYear) }]\"\r\n @click=\"selectMonthRight(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个年份的月份 -->\r\n <div v-else>\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 周选择视图 -->\r\n <div v-else-if=\"viewMode === 'week'\" class=\"picker-body\">\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"week-grid\">\r\n <div v-for=\"week in weekList\" :key=\"week.weekNumber\"\r\n :class=\"['week-row', { 'selected': isWeekSelected(week), 'in-range': isWeekInRange(week) }]\"\r\n @click=\"selectWeek(week)\">\r\n <div class=\"week-number\">W{{ week.weekNumber }}</div>\r\n <div v-for=\"day in week.days\" :key=\"day.date\"\r\n :class=\"['day-cell', { 'other-month': day.otherMonth, 'today': day.isToday }]\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 日期选择视图(默认) -->\r\n <div v-else class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" v-model:month=\"currentMonth\"\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonth\"\n @next=\"nextMonthLeft\" />\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" v-model:month=\"rightMonth\"\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonthRight\"\n @next=\"nextMonth\" />\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in nextMonthDayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个月份 -->\r\n <div v-else>\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 底部操作区 -->\r\n <div v-if=\"mode === 'range' && (displayMode === 'day' || displayMode === 'month')\" class=\"range-display\">\r\n <span class=\"range-text\">\r\n <template v-if=\"tempValue && Array.isArray(tempValue) && tempValue.length > 0\">\r\n {{ tempValue[0] || (displayMode === 'month' ? '开始月份' : '开始日期') }}\r\n <span class=\"range-separator\"> - </span>\r\n {{ tempValue[1] || (displayMode === 'month' ? '结束月份' : '结束日期') }}\r\n </template>\r\n <template v-else>\r\n <span class=\"placeholder-text\">{{ displayMode === 'month' ? '请选择月份范围' : '请选择日期范围' }}</span>\r\n </template>\r\n </span>\r\n </div>\r\n <div class=\"picker-footer\">\r\n <button class=\"btn btn-text\" @click=\"handleCancel\">取消</button>\r\n <button class=\"btn btn-primary\" @click=\"handleConfirm\">确定</button>\r\n </div>\r\n </div>\r\n </VMenu>\r\n <div v-if=\"inline\" class=\"date-picker-dropdown inline-mode\" :style=\"popupStyle\" @click.stop @mousedown.stop>\n <!-- 头部控制区(非日期/月份范围选择模式时显示) -->\r\n <div v-if=\"!(mode === 'range' && (displayMode === 'day' || displayMode === 'month'))\" class=\"picker-header\">\r\n <button class=\"nav-btn\" @click=\"prevPeriod\">‹</button>\r\n <div class=\"header-title\">\r\n <span @click=\"changeViewMode('year')\" class=\"clickable\">{{ currentYear }}年</span>\r\n <span v-if=\"displayMode !== 'year' && viewMode !== 'month'\" @click=\"changeViewMode('month')\"\r\n class=\"clickable\">{{\r\n currentMonth + 1\r\n }}月</span>\r\n </div>\r\n <button class=\"nav-btn\" @click=\"nextPeriod\">›</button>\r\n </div>\r\n\r\n <!-- 年份选择视图 -->\r\n <div v-if=\"viewMode === 'year'\" class=\"picker-body\">\r\n <div class=\"year-grid\">\r\n <div v-for=\"year in yearList\" :key=\"year\"\r\n :class=\"['year-item', { 'selected': isYearSelected(year), 'in-range': isYearInRange(year), 'disabled': isFutureYear(year) }]\"\r\n @click=\"selectYear(year)\">\r\n {{ year }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 月份选择视图 -->\r\n <div v-else-if=\"viewMode === 'month'\" class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个年份的月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" :show-month=\"false\"\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYear\" @next=\"nextYearLeft\" />\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" :show-month=\"false\"\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYearRight\" @next=\"nextYear\" />\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelectedRight(index), 'in-range': isMonthInRangeRight(index), 'disabled': isFutureMonth(index, rightYear) }]\"\r\n @click=\"selectMonthRight(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个年份的月份 -->\r\n <div v-else>\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 周选择视图 -->\r\n <div v-else-if=\"viewMode === 'week'\" class=\"picker-body\">\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"week-grid\">\r\n <div v-for=\"week in weekList\" :key=\"week.weekNumber\"\r\n :class=\"['week-row', { 'selected': isWeekSelected(week), 'in-range': isWeekInRange(week) }]\"\r\n @click=\"selectWeek(week)\">\r\n <div class=\"week-number\">W{{ week.weekNumber }}</div>\r\n <div v-for=\"day in week.days\" :key=\"day.date\"\r\n :class=\"['day-cell', { 'other-month': day.otherMonth, 'today': day.isToday }]\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 日期选择视图(默认) -->\r\n <div v-else class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" v-model:month=\"currentMonth\"\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonth\"\n @next=\"nextMonthLeft\" />\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" v-model:month=\"rightMonth\"\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonthRight\"\n @next=\"nextMonth\" />\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in nextMonthDayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个月份 -->\r\n <div v-else>\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 底部操作区 -->\r\n <div v-if=\"mode === 'range' && (displayMode === 'day' || displayMode === 'month')\" class=\"range-display\">\r\n <span class=\"range-text\">\r\n <template v-if=\"tempValue && Array.isArray(tempValue) && tempValue.length > 0\">\r\n {{ tempValue[0] || (displayMode === 'month' ? '开始月份' : '开始日期') }}\r\n <span class=\"range-separator\"> - </span>\r\n {{ tempValue[1] || (displayMode === 'month' ? '结束月份' : '结束日期') }}\r\n </template>\r\n <template v-else>\r\n <span class=\"placeholder-text\">{{ displayMode === 'month' ? '请选择月份范围' : '请选择日期范围' }}</span>\r\n </template>\r\n </span>\r\n </div>\r\n <div class=\"picker-footer\">\r\n <button class=\"btn btn-text\" @click=\"handleCancel\">取消</button>\r\n <button class=\"btn btn-primary\" @click=\"handleConfirm\">确定</button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</template>\r\n\r\n<script setup>\nimport { ref, computed, watch } from 'vue';\nimport VtkDatePanelHeader from './VtkDatePanelHeader.vue';\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: 'VtkDateSelector',\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // v-model 绑定值\r\n modelValue: {\r\n type: [String, Array],\r\n default: null\r\n },\r\n // 显示模式: 'day' | 'week' | 'month' | 'year'\r\n displayMode: {\r\n type: String,\r\n default: 'day',\r\n validator: (value) => ['day', 'week', 'month', 'year'].includes(value)\r\n },\r\n // 选择模式: 'single' | 'range'\r\n mode: {\r\n type: String,\r\n default: 'single',\r\n validator: (value) => ['single', 'range'].includes(value)\r\n },\r\n // 占位符\r\n placeholder: {\n type: String,\n default: '请选择日期'\n },\n // 输入框宽度,数字按 px 处理,也支持 100%、12rem 等 CSS 宽度\n width: {\n type: [String, Number],\n default: ''\n },\n // 日期弹层宽度,数字按 px 处理,也支持 100%、24rem 等 CSS 宽度\n popupWidth: {\n type: [String, Number],\n default: ''\n },\n // 禁用状态\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 日期格式\r\n format: {\r\n type: String,\r\n default: 'YYYY-MM-DD'\r\n },\r\n // 范围分隔符\r\n separator: {\r\n type: String,\r\n default: ' 至 '\r\n },\r\n // 内联模式(直接显示选择器,不需要点击输入框)\r\n inline: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 单面板模式(范围选择时只显示一个面板)\r\n singlePanel: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 禁用未来日期(大于当前日期的都置灰不可选)\r\n disableFuture: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 自定义取消方法\r\n onCancel: {\r\n type: Function,\r\n default: null\r\n },\r\n // 自定义确认方法\r\n onConfirm: {\r\n type: Function,\r\n default: null\r\n },\r\n // 禁用 Teleport 时,弹层保留在当前 DOM 树内\r\n noTeleport: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 下拉框对齐方式: 'left' | 'right'\r\n placement: {\r\n type: String,\r\n default: 'left',\r\n validator: (value) => ['left', 'right'].includes(value)\r\n }\r\n});\r\n\r\n// 定义 emit\r\nconst emit = defineEmits(['update:modelValue', 'change', 'cancel', 'confirm']);\r\n\r\n// 响应式数据\r\nconst showPicker = ref(false);\r\nconst viewMode = ref(props.displayMode);\r\nconst currentYear = ref(new Date().getFullYear());\r\nconst currentMonth = ref(new Date().getMonth());\r\nconst rightYear = ref(new Date().getFullYear());\r\nconst rightMonth = ref(new Date().getMonth() + 1);\r\nconst selectedValue = ref(null);\r\nconst tempValue = ref(null);\r\n\r\n// 当前日期(用于判断未来日期)\r\nconst today = new Date();\r\nconst todayYear = today.getFullYear();\r\nconst todayMonth = today.getMonth();\r\nconst todayDate = today.getDate();\r\n\r\n// 年份面板固定展示 12 个年份,并尽量让锚点年份落在中间偏前位置\r\nconst YEAR_PANEL_SIZE = 12;\r\nconst YEAR_PANEL_CENTER_OFFSET = 4;\r\n\r\n// 周和月份名称\r\nconst weekDays = ['日', '一', '二', '三', '四', '五', '六'];\r\nconst monthList = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];\r\n\r\n// 显示值\nconst menuAttach = computed(() => (props.noTeleport ? true : false));\n\nconst menuLocation = computed(() => props.placement === 'right' ? 'bottom end' : 'bottom start');\n\nconst menuOrigin = computed(() => props.placement === 'right' ? 'top end' : 'top start');\n\nconst normalizeCssSize = (value) => {\n if (value === null || value === undefined || value === '') return '';\n if (typeof value === 'number') return `${value}px`;\n const nextValue = String(value).trim();\n return /^\\d+(\\.\\d+)?$/.test(nextValue) ? `${nextValue}px` : nextValue;\n};\n\nconst rootStyle = computed(() => {\n const width = normalizeCssSize(props.width);\n return width ? { width } : {};\n});\n\nconst popupStyle = computed(() => {\n const width = normalizeCssSize(props.popupWidth);\n return width ? { width } : {};\n});\n\r\nconst displayValue = computed(() => {\r\n if (!selectedValue.value) return '';\r\n\r\n if (props.mode === 'range' && Array.isArray(selectedValue.value)) {\r\n if (selectedValue.value.length === 2) {\r\n return `${formatDisplay(selectedValue.value[0])}${props.separator}${formatDisplay(selectedValue.value[1])}`;\r\n }\r\n return '';\r\n }\r\n\r\n return formatDisplay(selectedValue.value);\r\n});\r\n\r\n// 格式化显示\r\nconst formatDisplay = (value) => {\r\n if (!value) return '';\r\n\r\n if (props.displayMode === 'year') {\r\n return `${value}年`;\r\n } else if (props.displayMode === 'month') {\r\n const [year, month] = value.split('-');\r\n return `${year}年${month}月`;\r\n } else if (props.displayMode === 'week') {\r\n const [year, week] = value.split('-W');\r\n return `${year}年第${week}周`;\r\n }\r\n\r\n return value;\r\n};\r\n\r\n// 年份列表(显示12年)\r\nconst yearList = computed(() => {\n // 年份面板打开时,以当前锚点年份为中心生成 12 个年份选项\n const startYear = currentYear.value - YEAR_PANEL_CENTER_OFFSET;\n return Array.from({ length: YEAR_PANEL_SIZE }, (_, i) => startYear + i);\n});\n\n// 周列表\nconst weekList = computed(() => {\n const weeks = [];\r\n const firstDay = new Date(currentYear.value, currentMonth.value, 1);\r\n const lastDay = new Date(currentYear.value, currentMonth.value + 1, 0);\r\n\r\n let currentDate = new Date(firstDay);\r\n currentDate.setDate(currentDate.getDate() - currentDate.getDay());\r\n\r\n let weekNumber = getWeekNumber(currentDate);\r\n\r\n while (currentDate <= lastDay || currentDate.getDay() !== 0) {\r\n const week = {\r\n weekNumber: weekNumber,\r\n startDate: new Date(currentDate),\r\n days: []\r\n };\r\n\r\n for (let i = 0; i < 7; i++) {\r\n const day = {\r\n date: formatDate(currentDate),\r\n day: currentDate.getDate(),\r\n month: currentDate.getMonth(),\r\n year: currentDate.getFullYear(),\r\n otherMonth: currentDate.getMonth() !== currentMonth.value,\r\n isToday: isToday(currentDate)\r\n };\r\n week.days.push(day);\r\n currentDate.setDate(currentDate.getDate() + 1);\r\n }\r\n\r\n weeks.push(week);\r\n weekNumber++;\r\n\r\n if (currentDate > lastDay && currentDate.getDay() === 0) break;\r\n }\r\n\r\n return weeks;\r\n});\r\n\r\n// 日期列表\r\nconst dayList = computed(() => {\r\n const days = [];\r\n const firstDay = new Date(currentYear.value, currentMonth.value, 1);\r\n const lastDay = new Date(currentYear.value, currentMonth.value + 1, 0);\r\n\r\n const startDate = new Date(firstDay);\r\n startDate.setDate(startDate.getDate() - startDate.getDay());\r\n\r\n const endDate = new Date(lastDay);\r\n endDate.setDate(endDate.getDate() + (6 - endDate.getDay()));\r\n\r\n let currentDate = new Date(startDate);\r\n\r\n while (currentDate <= endDate) {\r\n days.push({\r\n date: formatDate(currentDate),\r\n day: currentDate.getDate(),\r\n month: currentDate.getMonth(),\r\n year: currentDate.getFullYear(),\r\n otherMonth: currentDate.getMonth() !== currentMonth.value,\r\n isToday: isToday(currentDate)\r\n });\r\n currentDate.setDate(currentDate.getDate() + 1);\r\n }\r\n\r\n return days;\r\n});\r\n\r\n// 右侧日历的年份和月份(独立状态)\r\nconst nextMonthYear = computed(() => rightYear.value);\r\nconst nextMonthMonth = computed(() => rightMonth.value);\r\n\r\n// 下个月的日期列表\r\nconst nextMonthDayList = computed(() => {\r\n const days = [];\r\n const firstDay = new Date(nextMonthYear.value, nextMonthMonth.value, 1);\r\n const lastDay = new Date(nextMonthYear.value, nextMonthMonth.value + 1, 0);\r\n\r\n const startDate = new Date(firstDay);\r\n startDate.setDate(startDate.getDate() - startDate.getDay());\r\n\r\n const endDate = new Date(lastDay);\r\n endDate.setDate(endDate.getDate() + (6 - endDate.getDay()));\r\n\r\n let currentDate = new Date(startDate);\r\n\r\n while (currentDate <= endDate) {\r\n days.push({\r\n date: formatDate(currentDate),\r\n day: currentDate.getDate(),\r\n month: currentDate.getMonth(),\r\n year: currentDate.getFullYear(),\r\n otherMonth: currentDate.getMonth() !== nextMonthMonth.value,\r\n isToday: isToday(currentDate)\r\n });\r\n currentDate.setDate(currentDate.getDate() + 1);\r\n }\r\n\r\n return days;\r\n});\r\n\r\n// 工具函数\r\nconst formatDate = (date) => {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n};\r\n\r\nconst isToday = (date) => {\r\n const today = new Date();\r\n return date.getDate() === today.getDate() &&\r\n date.getMonth() === today.getMonth() &&\r\n date.getFullYear() === today.getFullYear();\r\n};\r\n\r\nconst getWeekNumber = (date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d - yearStart) / 86400000) + 1) / 7);\r\n};\r\n\r\n// 选择判断\r\nconst isYearSelected = (year) => {\r\n if (!tempValue.value) return false;\r\n if (props.mode === 'single') {\r\n return tempValue.value === year.toString();\r\n }\r\n if (Array.isArray(tempValue.value) && tempValue.value.length > 0) {\r\n return tempValue.value.some(v => v && v.startsWith(year.toString()));\r\n }\r\n return false;\r\n};\r\n\r\nconst isYearInRange = (year) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const [start, end] = tempValue.value.map(v => parseInt(v));\r\n return year > start && year < end;\r\n};\r\n\r\nconst isMonthSelected = (month) => {\r\n if (!tempValue.value) return false;\r\n const monthStr = `${currentYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n return tempValue.value === monthStr;\r\n }\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(monthStr);\r\n }\r\n return false;\r\n};\r\n\r\nconst isMonthInRange = (month) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const monthStr = `${currentYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n return monthStr > tempValue.value[0] && monthStr < tempValue.value[1];\r\n};\r\n\r\nconst isWeekSelected = (week) => {\r\n if (!tempValue.value) return false;\r\n const weekStr = `${currentYear.value}-W${String(week.weekNumber).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n return tempValue.value === weekStr;\r\n }\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(weekStr);\r\n }\r\n return false;\r\n};\r\n\r\nconst isWeekInRange = (week) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const weekStr = `${currentYear.value}-W${String(week.weekNumber).padStart(2, '0')}`;\r\n return weekStr > tempValue.value[0] && weekStr < tempValue.value[1];\r\n};\r\n\r\nconst isDaySelected = (day) => {\r\n if (!tempValue.value) return false;\r\n if (props.mode === 'single') {\r\n return tempValue.value === day.date;\r\n }\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(day.date);\r\n }\r\n return false;\r\n};\r\n\r\nconst isDayInRange = (day) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n return day.date > tempValue.value[0] && day.date < tempValue.value[1];\r\n};\r\n\r\nconst isDayRangeStart = (day) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length === 0) {\r\n return false;\r\n }\r\n return day.date === tempValue.value[0];\r\n};\r\n\r\nconst isDayRangeEnd = (day) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length < 2) {\r\n return false;\r\n }\r\n return day.date === tempValue.value[1];\r\n};\r\n\r\n// 判断是否是未来日期/月份/年份\r\nconst isFutureYear = (year) => {\r\n if (!props.disableFuture) return false;\r\n return year > todayYear;\r\n};\r\n\r\nconst isFutureMonth = (month, year) => {\r\n if (!props.disableFuture) return false;\r\n if (year > todayYear) return true;\r\n if (year === todayYear && month > todayMonth) return true;\r\n return false;\r\n};\r\n\r\nconst isFutureDay = (day) => {\r\n if (!props.disableFuture) return false;\r\n const [year, month, date] = day.date.split('-').map(Number);\r\n if (year > todayYear) return true;\r\n if (year === todayYear && month - 1 > todayMonth) return true;\r\n if (year === todayYear && month - 1 === todayMonth && date > todayDate) return true;\r\n return false;\r\n};\r\n\r\n// 选择操作\r\nconst selectYear = (year) => {\r\n // 如果是未来年份且禁用未来日期,则不允许选择\r\n if (isFutureYear(year)) return;\r\n\r\n const yearStr = year.toString();\r\n\r\n // 如果 displayMode 是 'year',则选择年份作为值\r\n if (props.displayMode === 'year') {\r\n if (props.mode === 'single') {\r\n tempValue.value = yearStr;\r\n if (props.inline) {\r\n // 内联模式直接确认\r\n confirm();\r\n }\r\n } else {\r\n // 范围选择\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [yearStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= yearStr ? [first, yearStr] : [yearStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [yearStr];\r\n }\r\n }\r\n } else {\r\n // 如果 displayMode 不是 'year',则只是切换年份,然后返回到原来的视图\r\n currentYear.value = year;\r\n // 切换回原来的显示模式\r\n viewMode.value = props.displayMode;\r\n }\r\n};\r\n\r\nconst selectMonth = (month) => {\r\n // 如果是未来月份且禁用未来日期,则不允许选择\r\n if (isFutureMonth(month, currentYear.value)) return;\r\n\r\n if (props.displayMode !== 'month') {\r\n currentMonth.value = month;\r\n viewMode.value = props.displayMode;\r\n return;\r\n }\r\n\r\n const monthStr = `${currentYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n tempValue.value = monthStr;\r\n if (props.displayMode === 'month' || props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [monthStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= monthStr ? [first, monthStr] : [monthStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [monthStr];\r\n }\r\n }\r\n};\r\n\r\nconst selectMonthRight = (month) => {\r\n // 如果是未来月份且禁用未来日期,则不允许选择\r\n if (isFutureMonth(month, rightYear.value)) return;\r\n\r\n const monthStr = `${rightYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [monthStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= monthStr ? [first, monthStr] : [monthStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [monthStr];\r\n }\r\n};\r\n\r\nconst isMonthSelectedRight = (month) => {\r\n if (!tempValue.value) return false;\r\n const monthStr = `${rightYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(monthStr);\r\n }\r\n return false;\r\n};\r\n\r\nconst isMonthInRangeRight = (month) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const monthStr = `${rightYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n return monthStr > tempValue.value[0] && monthStr < tempValue.value[1];\r\n};\r\n\r\nconst selectWeek = (week) => {\r\n const weekStr = `${currentYear.value}-W${String(week.weekNumber).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n tempValue.value = weekStr;\r\n confirm();\r\n } else {\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [weekStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= weekStr ? [first, weekStr] : [weekStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [weekStr];\r\n }\r\n }\r\n};\r\n\r\nconst selectDay = (day) => {\r\n // 如果是未来日期且禁用未来日期,则不允许选择\r\n if (isFutureDay(day)) return;\r\n\r\n if (props.mode === 'single') {\r\n tempValue.value = day.date;\r\n // 内联模式下单选直接确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [day.date];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= day.date ? [first, day.date] : [day.date, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [day.date];\r\n }\r\n }\r\n};\r\n\r\n// 导航操作\r\nconst prevPeriod = () => {\r\n if (viewMode.value === 'year') {\r\n currentYear.value -= 12;\r\n } else if (viewMode.value === 'month') {\r\n currentYear.value -= 1;\r\n } else {\r\n if (currentMonth.value === 0) {\r\n currentMonth.value = 11;\r\n currentYear.value -= 1;\r\n } else {\r\n currentMonth.value -= 1;\r\n }\r\n }\r\n};\r\n\r\nconst nextPeriod = () => {\r\n if (viewMode.value === 'year') {\r\n currentYear.value += 12;\r\n } else if (viewMode.value === 'month') {\r\n currentYear.value += 1;\r\n } else {\r\n if (currentMonth.value === 11) {\r\n currentMonth.value = 0;\r\n currentYear.value += 1;\r\n } else {\r\n currentMonth.value += 1;\r\n }\r\n }\r\n};\r\n\r\n// 月份导航(用于双日历)\r\nconst prevMonth = () => {\r\n // 只控制左侧日历\r\n if (currentMonth.value === 0) {\r\n currentMonth.value = 11;\r\n currentYear.value -= 1;\r\n } else {\r\n currentMonth.value -= 1;\r\n }\r\n};\r\n\r\nconst nextMonthLeft = () => {\r\n // 增加左侧日历月份\r\n if (currentMonth.value === 11) {\r\n currentMonth.value = 0;\r\n currentYear.value += 1;\r\n } else {\r\n currentMonth.value += 1;\r\n }\r\n};\r\n\r\nconst prevMonthRight = () => {\r\n // 减少右侧日历月份\r\n if (rightMonth.value === 0) {\r\n rightMonth.value = 11;\r\n rightYear.value -= 1;\r\n } else {\r\n rightMonth.value -= 1;\r\n }\r\n};\r\n\r\nconst nextMonth = () => {\r\n // 只控制右侧日历\r\n if (rightMonth.value === 11) {\r\n rightMonth.value = 0;\r\n rightYear.value += 1;\r\n } else {\r\n rightMonth.value += 1;\r\n }\r\n};\r\n\r\n// 年份导航(用于双月份面板)\r\nconst prevYear = () => {\r\n // 只控制左侧年份\r\n currentYear.value -= 1;\r\n};\r\n\r\nconst nextYearLeft = () => {\r\n // 增加左侧年份\r\n currentYear.value += 1;\r\n};\r\n\r\nconst prevYearRight = () => {\r\n // 减少右侧年份\r\n rightYear.value -= 1;\r\n};\r\n\r\nconst nextYear = () => {\r\n // 只控制右侧年份\r\n rightYear.value += 1;\r\n};\r\n\r\nconst changeViewMode = (mode) => {\r\n if (props.displayMode === 'year' && mode !== 'year') return;\r\n if (props.displayMode === 'month' && !['year', 'month'].includes(mode)) return;\r\n viewMode.value = mode;\r\n};\r\n\r\n// 面板操作\r\nconst initializePicker = () => {\r\n if (props.displayMode === 'year' && props.mode === 'single') {\r\n currentYear.value = todayYear;\r\n }\r\n\r\n tempValue.value = selectedValue.value ?\r\n (Array.isArray(selectedValue.value) ? [...selectedValue.value] : selectedValue.value) :\r\n (props.mode === 'range' ? [] : null);\r\n viewMode.value = props.displayMode;\r\n\r\n if (props.displayMode === 'month') {\r\n rightYear.value = currentYear.value + 1;\r\n } else {\r\n if (currentMonth.value === 11) {\r\n rightYear.value = currentYear.value + 1;\r\n rightMonth.value = 0;\r\n } else {\r\n rightYear.value = currentYear.value;\r\n rightMonth.value = currentMonth.value + 1;\r\n }\r\n }\r\n};\r\n\r\nwatch(showPicker, (isOpen) => {\r\n if (isOpen) {\r\n initializePicker();\r\n }\r\n});\r\nif (props.inline) {\r\n // 内联模式下直接初始化\r\n tempValue.value = selectedValue.value ?\r\n (Array.isArray(selectedValue.value) ? [...selectedValue.value] : selectedValue.value) :\r\n (props.mode === 'range' ? [] : null);\r\n viewMode.value = props.displayMode;\r\n\r\n // 初始化右侧日历/年份\r\n if (props.displayMode === 'month') {\r\n rightYear.value = currentYear.value + 1;\r\n } else {\r\n if (currentMonth.value === 11) {\r\n rightYear.value = currentYear.value + 1;\r\n rightMonth.value = 0;\r\n } else {\r\n rightYear.value = currentYear.value;\r\n rightMonth.value = currentMonth.value + 1;\r\n }\r\n }\r\n}\r\n\r\nconst closePicker = () => {\r\n showPicker.value = false;\r\n};\r\n\r\nconst clearValue = () => {\r\n selectedValue.value = props.mode === 'range' ? [] : null;\r\n emit('update:modelValue', selectedValue.value);\r\n emit('change', selectedValue.value);\r\n};\r\n\r\nconst confirm = () => {\r\n selectedValue.value = tempValue.value;\r\n emit('update:modelValue', selectedValue.value);\r\n emit('change', selectedValue.value);\r\n closePicker();\r\n};\r\n\r\n// 自定义取消和确认处理\r\nconst handleCancel = () => {\r\n if (props.onCancel) {\r\n props.onCancel();\r\n } else {\r\n emit('cancel');\r\n closePicker();\r\n }\r\n};\r\n\r\nconst handleConfirm = () => {\r\n if (props.onConfirm) {\r\n props.onConfirm(tempValue.value);\r\n } else {\r\n emit('confirm', tempValue.value);\r\n confirm();\r\n }\r\n};\r\n\r\n// 监听外部值变化\r\nwatch(() => props.modelValue, (newValue) => {\r\n selectedValue.value = newValue;\r\n}, { immediate: true });\r\n</script>\r\n\r\n<style scoped>\r\n.vtk-date-selector {\r\n position: relative;\r\n width: 100%;\r\n}\r\n\r\n.date-input {\r\n width: 100%;\r\n}\r\n\r\n.date-input-field {\r\n cursor: pointer;\r\n}\r\n\r\n:deep(.date-input-field .v-field),\r\n:deep(.date-input-field input) {\r\n cursor: pointer;\r\n}\r\n\r\n.date-icon {\r\n margin-left: 8px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.date-icon-svg {\r\n width: 16px;\r\n height: 16px;\r\n display: block;\r\n}\r\n\r\n.clear-icon {\r\n margin-left: 4px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n font-size: 18px;\r\n line-height: 1;\r\n cursor: pointer;\r\n padding: 2px;\r\n}\r\n\r\n.clear-icon:hover {\r\n color: rgb(var(--v-theme-on-surface), 0.87);\r\n}\r\n\r\n.date-picker-dropdown {\n box-sizing: border-box;\n max-width: calc(100vw - 24px);\n overflow-x: auto;\n background: rgb(var(--v-theme-surface));\n border-radius: 8px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n}\r\n\r\n.date-picker-dropdown.inline-mode {\r\n box-shadow: none;\r\n width: fit-content;\r\n border: none;\r\n}\r\n\r\n.picker-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 16px;\r\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n}\r\n\r\n.header-title {\r\n font-size: 16px;\r\n font-weight: 500;\r\n color: rgb(var(--v-theme-on-surface));\r\n}\r\n\r\n.clickable {\r\n cursor: pointer;\r\n padding: 4px 8px;\r\n border-radius: 4px;\r\n transition: background 0.2s;\r\n}\r\n\r\n.clickable:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.nav-btn {\r\n border: none;\r\n background: none;\r\n font-size: 20px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n cursor: pointer;\r\n padding: 4px 12px;\r\n border-radius: 4px;\r\n transition: background 0.2s;\r\n}\r\n\r\n.nav-btn:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.picker-body {\r\n padding: 8px;\r\n min-height: 200px;\r\n}\r\n\r\n.dual-calendar {\r\n display: flex;\r\n gap: 8px;\r\n}\r\n\r\n.calendar-divider {\r\n width: 1px;\r\n background: rgb(var(--v-theme-on-surface), 0.12);\r\n margin: 0 6px;\r\n}\r\n\r\n.calendar-panel {\r\n flex: 0 0 210px;\r\n width: 210px;\r\n min-width: 210px;\r\n max-width: 210px;\r\n}\r\n\r\n/* 单面板模式:放大以匹配底部范围显示的宽度 */\r\n.calendar-panel:only-child {\r\n flex: 0 0 340px;\r\n width: 340px;\r\n min-width: 340px;\r\n max-width: 340px;\r\n}\r\n\r\n.calendar-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 4px 0;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.month-title {\n font-size: 12px;\n font-weight: 500;\n color: rgb(var(--v-theme-on-surface));\n}\n\n.nav-btn-small {\n border: none;\n background: none;\n font-size: 14px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n cursor: pointer;\r\n padding: 2px 4px;\r\n border-radius: 4px;\r\n transition: background 0.2s;\r\n}\r\n\r\n.nav-btn-small:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.nav-btn-small.invisible {\r\n visibility: hidden;\r\n pointer-events: none;\r\n}\r\n\r\n.year-grid,\r\n.month-grid {\r\n display: grid;\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: 6px;\r\n}\r\n\r\n.year-item,\r\n.month-item {\r\n padding: 6px;\r\n text-align: center;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n border: 1px solid transparent;\r\n color: rgb(var(--v-theme-on-surface));\r\n font-size: 12px;\r\n}\r\n\r\n.year-item:hover,\r\n.month-item:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.year-item.selected,\r\n.month-item.selected {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.year-item.in-range,\r\n.month-item.in-range {\r\n background: rgb(var(--v-theme-primary), 0.12);\r\n}\r\n\r\n/* 禁用状态样式 */\r\n.year-item.disabled,\r\n.month-item.disabled,\r\n.day-item.disabled {\r\n color: rgb(var(--v-theme-on-surface), 0.26) !important;\r\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\r\n cursor: not-allowed !important;\r\n pointer-events: none;\r\n opacity: 0.5;\r\n}\r\n\r\n.year-item.disabled:hover,\r\n.month-item.disabled:hover,\r\n.day-item.disabled:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\r\n}\r\n\r\n.week-header {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: 2px;\r\n margin-bottom: 6px;\r\n}\r\n\r\n.week-day {\r\n text-align: center;\r\n padding: 6px 0;\r\n font-size: 12px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n font-weight: 500;\r\n}\r\n\r\n.week-grid {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.week-row {\r\n display: grid;\r\n grid-template-columns: 40px repeat(7, 1fr);\r\n gap: 4px;\r\n padding: 4px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: background 0.2s;\r\n}\r\n\r\n.week-row:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.week-row.selected {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.week-row.in-range {\r\n background: rgb(var(--v-theme-primary), 0.12);\r\n}\r\n\r\n.week-number {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 12px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n font-weight: 500;\r\n}\r\n\r\n.day-grid {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: 2px;\r\n}\r\n\r\n.day-item,\r\n.day-cell {\r\n aspect-ratio: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n font-size: 13px;\r\n color: rgb(var(--v-theme-on-surface));\r\n}\r\n\r\n.day-item:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.day-item.other-month,\r\n.day-cell.other-month {\r\n color: rgb(var(--v-theme-on-surface), 0.38);\r\n}\r\n\r\n.day-item.today,\r\n.day-cell.today {\r\n color: rgb(var(--v-theme-primary));\r\n font-weight: 600;\r\n}\r\n\r\n.day-item.selected {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.day-item.in-range {\r\n background: rgb(var(--v-theme-primary), 0.12);\r\n}\r\n\r\n.day-item.range-start,\r\n.day-item.range-end {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.range-display {\r\n padding: 12px 16px;\r\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n text-align: center;\r\n}\r\n\r\n.range-text {\r\n font-size: 14px;\r\n color: rgb(var(--v-theme-on-surface));\r\n}\r\n\r\n.range-separator {\r\n margin: 0 8px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n}\r\n\r\n.placeholder-text {\r\n color: rgb(var(--v-theme-on-surface), 0.38);\r\n}\r\n\r\n.picker-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 8px;\r\n padding: 12px 16px;\r\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n}\r\n\r\n.btn {\r\n padding: 8px 16px;\r\n border-radius: 4px;\r\n font-size: 14px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n border: none;\r\n outline: none;\r\n}\r\n\r\n.btn-text {\r\n background: none;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n}\r\n\r\n.btn-text:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.btn-primary {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.btn-primary:hover {\r\n opacity: 0.9;\r\n}\r\n</style>\r\n","<template>\n <div class=\"vtk-date-time-picker\">\n <VMenu\n v-if=\"!inline\"\n v-model=\"showPicker\"\n :attach=\"menuAttach\"\n :location=\"menuLocation\"\n :origin=\"menuOrigin\"\n :width=\"menuWidth\"\n :min-width=\"menuWidth\"\n offset=\"4\"\n :close-on-content-click=\"false\"\n >\n <template #activator=\"{ props: menuProps }\">\n <div class=\"date-time-input\">\n <VTextField\n :model-value=\"displayValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n density=\"compact\"\n variant=\"outlined\"\n hide-details\n readonly\n v-bind=\"menuProps\"\n :clearable=\"clearable && !!displayValue && !disabled\"\n clear-icon=\"mdi-close-circle\"\n persistent-clear\n class=\"date-time-input-field\"\n @click:clear.stop=\"clearValue\"\n >\n <template #append-inner>\n <VIcon size=\"16\" class=\"date-time-icon\">mdi-clock-outline</VIcon>\n </template>\n </VTextField>\n </div>\n </template>\n\n <div class=\"date-time-picker-dropdown\" :class=\"{ 'range-mode': isRange }\" @click.stop @mousedown.stop>\n <template v-if=\"isRange\">\n <div class=\"range-input-row\">\n <input class=\"range-date-input\" :value=\"formatDatePart(tempRange[0])\" readonly placeholder=\"开始日期\" />\n <button\n class=\"range-time-input\"\n type=\"button\"\n :class=\"{ active: activeTimeSide === 'start' }\"\n @click=\"openRangeTime('start')\"\n >\n {{ formatTimePart(tempRange[0]) || defaultStartTime }}\n </button>\n <span class=\"range-arrow\">›</span>\n <input class=\"range-date-input\" :value=\"formatDatePart(tempRange[1])\" readonly placeholder=\"结束日期\" />\n <button\n class=\"range-time-input\"\n type=\"button\"\n :class=\"{ active: activeTimeSide === 'end' }\"\n @click=\"openRangeTime('end')\"\n >\n {{ formatTimePart(tempRange[1]) || defaultEndTime }}\n </button>\n\n <div v-if=\"activeTimeSide\" :class=\"['range-time-popover', activeTimeSide]\">\n <div class=\"time-columns compact\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === activeRangeHour }]\"\n @click=\"selectRangeTime('hour', hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === activeRangeMinute }]\"\n @click=\"selectRangeTime('minute', minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === activeRangeSecond }]\"\n @click=\"selectRangeTime('second', second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n <div class=\"time-popover-footer\">\n <button class=\"btn btn-text small\" type=\"button\" @click=\"activeTimeSide = null\">取消</button>\n <button class=\"btn btn-primary small\" type=\"button\" @click=\"activeTimeSide = null\">确定</button>\n </div>\n </div>\n </div>\n\n <div class=\"range-calendar-shell\">\n <div class=\"calendar-panel\">\n <div class=\"calendar-header\">\n <button class=\"nav-btn-small\" type=\"button\" @click=\"prevLeftMonth\">‹</button>\n <span class=\"month-title\">{{ leftYear }} 年 {{ leftMonth + 1 }} 月</span>\n <button class=\"nav-btn-small invisible\" type=\"button\">›</button>\n </div>\n <div class=\"week-header\">\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\n </div>\n <div class=\"day-grid\">\n <button\n v-for=\"day in leftDayList\"\n :key=\"day.date\"\n type=\"button\"\n :class=\"rangeDayClass(day)\"\n @click=\"selectRangeDay(day)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <div class=\"calendar-panel\">\n <div class=\"calendar-header\">\n <button class=\"nav-btn-small invisible\" type=\"button\">‹</button>\n <span class=\"month-title\">{{ rightYear }} 年 {{ rightMonth + 1 }} 月</span>\n <button class=\"nav-btn-small\" type=\"button\" @click=\"nextRightMonth\">›</button>\n </div>\n <div class=\"week-header\">\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\n </div>\n <div class=\"day-grid\">\n <button\n v-for=\"day in rightDayList\"\n :key=\"day.date\"\n type=\"button\"\n :class=\"rangeDayClass(day)\"\n @click=\"selectRangeDay(day)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n </div>\n </template>\n\n <template v-else>\n <div class=\"single-input-row\">\n <input class=\"single-date-input\" :value=\"formatDatePart(tempDate)\" readonly placeholder=\"请选择日期\" />\n <button\n class=\"single-time-input\"\n type=\"button\"\n :class=\"{ active: activeSingleTime }\"\n @click=\"activeSingleTime = true\"\n >\n {{ singleTimeValue }}\n </button>\n\n <div v-if=\"activeSingleTime\" class=\"single-time-popover\">\n <div class=\"time-columns compact\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === selectedHour, disabled: isTimePartDisabled(hour, selectedMinute, selectedSecond) }]\"\n @click=\"selectHour(hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === selectedMinute, disabled: isTimePartDisabled(selectedHour, minute, selectedSecond) }]\"\n @click=\"selectMinute(minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === selectedSecond, disabled: isTimePartDisabled(selectedHour, selectedMinute, second) }]\"\n @click=\"selectSecond(second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n <div class=\"time-popover-footer\">\n <button class=\"btn btn-text small\" type=\"button\" @click=\"activeSingleTime = false\">取消</button>\n <button class=\"btn btn-primary small\" type=\"button\" @click=\"activeSingleTime = false\">确定</button>\n </div>\n </div>\n </div>\n\n <div class=\"single-calendar-panel\">\n <div class=\"picker-header single-header\">\n <button class=\"nav-btn\" type=\"button\" @click=\"prevPeriod\">‹</button>\n <div class=\"header-title\">\n <span class=\"clickable\" @click=\"changeViewMode('year')\">{{ currentYear }} 年</span>\n <span v-if=\"viewMode !== 'year'\" class=\"clickable\" @click=\"changeViewMode('month')\">\n {{ currentMonth + 1 }} 月\n </span>\n </div>\n <button class=\"nav-btn\" type=\"button\" @click=\"nextPeriod\">›</button>\n </div>\n\n <div v-if=\"viewMode === 'year'\" class=\"picker-body\">\n <div class=\"year-grid\">\n <button\n v-for=\"year in yearList\"\n :key=\"year\"\n type=\"button\"\n :class=\"['year-item', { selected: year === currentYear, disabled: isYearDisabled(year) }]\"\n @click=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n </div>\n </div>\n\n <div v-else-if=\"viewMode === 'month'\" class=\"picker-body\">\n <div class=\"month-grid\">\n <button\n v-for=\"(month, index) in monthList\"\n :key=\"month\"\n type=\"button\"\n :class=\"['month-item', { selected: index === currentMonth, disabled: isMonthDisabled(index) }]\"\n @click=\"selectMonth(index)\"\n >\n {{ month }}\n </button>\n </div>\n </div>\n\n <div v-else class=\"picker-body\">\n <div class=\"week-header\">\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\n </div>\n <div class=\"day-grid\">\n <button\n v-for=\"day in dayList\"\n :key=\"day.date\"\n type=\"button\"\n :class=\"['day-item', {\n 'other-month': day.otherMonth,\n selected: isDaySelected(day),\n today: day.isToday,\n disabled: isDayDisabled(day)\n }]\"\n @click=\"selectDay(day)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n </div>\n </template>\n\n <div class=\"picker-footer\">\n <button v-if=\"!isRange\" class=\"btn btn-text\" type=\"button\" @click=\"handleNow\">此刻</button>\n <button v-if=\"isRange\" class=\"btn btn-text\" type=\"button\" @click=\"clearTempRange\">清空</button>\n <span class=\"footer-spacer\"></span>\n <button class=\"btn btn-text\" type=\"button\" @click=\"handleCancel\">取消</button>\n <button class=\"btn btn-primary\" type=\"button\" :disabled=\"!canConfirm\" @click=\"handleConfirm\">确定</button>\n </div>\n </div>\n </VMenu>\n\n <div v-if=\"inline\" class=\"date-time-picker-dropdown inline-mode\" :class=\"{ 'range-mode': isRange }\" @click.stop @mousedown.stop>\n <div class=\"inline-message\">内联模式请使用默认单选面板。</div>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkDateTimePicker',\n});\n\nconst props = defineProps({\n modelValue: {\n type: [String, Date, Number, Array],\n default: null\n },\n mode: {\n type: String,\n default: 'single',\n validator: (value) => ['single', 'range'].includes(value)\n },\n placeholder: {\n type: String,\n default: '请选择日期时间'\n },\n disabled: {\n type: Boolean,\n default: false\n },\n clearable: {\n type: Boolean,\n default: true\n },\n format: {\n type: String,\n default: 'YYYY-MM-DD HH:mm:ss'\n },\n valueFormat: {\n type: String,\n default: 'YYYY-MM-DD HH:mm:ss'\n },\n separator: {\n type: String,\n default: ' 至 '\n },\n min: {\n type: [String, Date, Number],\n default: null\n },\n max: {\n type: [String, Date, Number],\n default: null\n },\n disableFuture: {\n type: Boolean,\n default: false\n },\n minuteStep: {\n type: Number,\n default: 1\n },\n secondStep: {\n type: Number,\n default: 1\n },\n showSeconds: {\n type: Boolean,\n default: true\n },\n inline: {\n type: Boolean,\n default: false\n },\n placement: {\n type: String,\n default: 'left',\n validator: (value) => ['left', 'right'].includes(value)\n },\n noTeleport: {\n type: Boolean,\n default: false\n },\n onCancel: {\n type: Function,\n default: null\n },\n onConfirm: {\n type: Function,\n default: null\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'change', 'cancel', 'confirm']);\n\nconst showPicker = ref(false);\nconst selectedDateTime = ref(null);\nconst selectedRange = ref([]);\nconst tempDate = ref(null);\nconst tempRange = ref([null, null]);\nconst currentYear = ref(new Date().getFullYear());\nconst currentMonth = ref(new Date().getMonth());\nconst leftYear = ref(new Date().getFullYear());\nconst leftMonth = ref(new Date().getMonth());\nconst rightYear = ref(new Date().getMonth() === 11 ? new Date().getFullYear() + 1 : new Date().getFullYear());\nconst rightMonth = ref(new Date().getMonth() === 11 ? 0 : new Date().getMonth() + 1);\nconst viewMode = ref('day');\nconst selectedHour = ref(0);\nconst selectedMinute = ref(0);\nconst selectedSecond = ref(0);\nconst activeRangeSide = ref('start');\nconst activeTimeSide = ref(null);\nconst activeSingleTime = ref(false);\n\nconst weekDays = ['日', '一', '二', '三', '四', '五', '六'];\nconst monthList = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];\nconst defaultStartTime = '00:00:00';\nconst defaultEndTime = '23:59:59';\n\nconst isRange = computed(() => props.mode === 'range');\nconst menuAttach = computed(() => (props.noTeleport ? true : false));\nconst menuLocation = computed(() => props.placement === 'right' ? 'bottom end' : 'bottom start');\nconst menuOrigin = computed(() => props.placement === 'right' ? 'top end' : 'top start');\nconst menuWidth = computed(() => isRange.value ? 646 : 360);\nconst minDateTime = computed(() => parseValue(props.min));\nconst maxDateTime = computed(() => parseValue(props.max));\nconst hourOptions = computed(() => Array.from({ length: 24 }, (_, index) => index));\nconst minuteOptions = computed(() => buildStepOptions(props.minuteStep));\nconst secondOptions = computed(() => buildStepOptions(props.secondStep));\n\nconst yearList = computed(() => {\n const startYear = Math.floor(currentYear.value / 12) * 12;\n return Array.from({ length: 12 }, (_, index) => startYear + index);\n});\n\nconst dayList = computed(() => getDayList(currentYear.value, currentMonth.value));\nconst leftDayList = computed(() => getDayList(leftYear.value, leftMonth.value));\nconst rightDayList = computed(() => getDayList(rightYear.value, rightMonth.value));\n\nconst displayValue = computed(() => {\n if (isRange.value) {\n if (!selectedRange.value.length) return '';\n const [start, end] = selectedRange.value;\n return [start, end].filter(Boolean).map(date => formatByPattern(date, props.format)).join(props.separator);\n }\n return selectedDateTime.value ? formatByPattern(selectedDateTime.value, props.format) : '';\n});\n\nconst previewValue = computed(() => tempDate.value ? formatByPattern(buildTempDateTime(), props.format) : '');\nconst singleTimeValue = computed(() => {\n const pattern = props.showSeconds ? 'HH:mm:ss' : 'HH:mm';\n const date = buildTempDateTime() || new Date(2000, 0, 1, selectedHour.value, selectedMinute.value, selectedSecond.value);\n return formatByPattern(date, pattern);\n});\n\nconst canConfirm = computed(() => {\n if (isRange.value) {\n const [start, end] = tempRange.value;\n return !!start && !!end && start <= end && !isDateTimeDisabled(start) && !isDateTimeDisabled(end);\n }\n if (!tempDate.value) return false;\n return !isDateTimeDisabled(buildTempDateTime());\n});\n\nconst activeRangeDate = computed(() => {\n return activeTimeSide.value === 'end' ? tempRange.value[1] : tempRange.value[0];\n});\n\nconst activeRangeHour = computed(() => activeRangeDate.value ? activeRangeDate.value.getHours() : 0);\nconst activeRangeMinute = computed(() => activeRangeDate.value ? activeRangeDate.value.getMinutes() : 0);\nconst activeRangeSecond = computed(() => activeRangeDate.value ? activeRangeDate.value.getSeconds() : 0);\n\nconst buildStepOptions = (step) => {\n const normalizedStep = Number.isFinite(step) && step > 0 ? Math.max(1, Math.floor(step)) : 1;\n const options = [];\n for (let value = 0; value < 60; value += normalizedStep) {\n options.push(value);\n }\n return options;\n};\n\nconst getDayList = (year, month) => {\n const firstDay = new Date(year, month, 1);\n const startDay = firstDay.getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const daysInPrevMonth = new Date(year, month, 0).getDate();\n const today = new Date();\n const days = [];\n\n for (let index = startDay - 1; index >= 0; index -= 1) {\n days.push(createDay(new Date(year, month - 1, daysInPrevMonth - index), true, today));\n }\n for (let day = 1; day <= daysInMonth; day += 1) {\n days.push(createDay(new Date(year, month, day), false, today));\n }\n for (let day = 1; days.length < 42; day += 1) {\n days.push(createDay(new Date(year, month + 1, day), true, today));\n }\n\n return days;\n};\n\nconst createDay = (date, otherMonth, today) => ({\n date: formatByPattern(date, 'YYYY-MM-DD'),\n day: date.getDate(),\n year: date.getFullYear(),\n month: date.getMonth(),\n otherMonth,\n isToday: isSameDate(date, today)\n});\n\nconst padTime = (value) => String(value).padStart(2, '0');\n\nconst formatByPattern = (date, pattern) => {\n if (!(date instanceof Date) || Number.isNaN(date.getTime())) return '';\n const replacements = {\n YYYY: date.getFullYear(),\n MM: padTime(date.getMonth() + 1),\n DD: padTime(date.getDate()),\n HH: padTime(date.getHours()),\n mm: padTime(date.getMinutes()),\n ss: padTime(date.getSeconds())\n };\n return Object.keys(replacements).reduce((result, token) => {\n return result.replace(new RegExp(token, 'g'), replacements[token]);\n }, pattern);\n};\n\nconst formatDatePart = (date) => date ? formatByPattern(date, 'YYYY-MM-DD') : '';\nconst formatTimePart = (date) => date ? formatByPattern(date, props.showSeconds ? 'HH:mm:ss' : 'HH:mm') : '';\n\nconst parseValue = (value) => {\n if (!value && value !== 0) return null;\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : new Date(value.getTime());\n if (typeof value === 'number') {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n if (typeof value !== 'string') return null;\n\n const normalized = value.trim().replace(/\\//g, '-');\n const match = normalized.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[ T](\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?)?/);\n if (!match) {\n const fallback = new Date(value);\n return Number.isNaN(fallback.getTime()) ? null : fallback;\n }\n\n const [, year, month, day, hour = '0', minute = '0', second = '0'] = match;\n const date = new Date(Number(year), Number(month) - 1, Number(day), Number(hour), Number(minute), Number(second));\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\nconst parseRangeValue = (value) => {\n if (Array.isArray(value)) return value.map(parseValue).filter(Boolean).slice(0, 2);\n if (typeof value === 'string' && value.includes(props.separator)) {\n return value.split(props.separator).map(item => parseValue(item.trim())).filter(Boolean).slice(0, 2);\n }\n return [];\n};\n\nconst toModelValue = (date) => {\n if (!date) return null;\n if (props.valueFormat === 'timestamp') return date.getTime();\n if (props.valueFormat === 'Date') return new Date(date.getTime());\n return formatByPattern(date, props.valueFormat);\n};\n\nconst toModelRange = (range) => range.map(date => toModelValue(date));\n\nconst isSameDate = (left, right) => {\n return left.getFullYear() === right.getFullYear()\n && left.getMonth() === right.getMonth()\n && left.getDate() === right.getDate();\n};\n\nconst buildTempDateTime = (hour = selectedHour.value, minute = selectedMinute.value, second = selectedSecond.value) => {\n if (!tempDate.value) return null;\n return new Date(tempDate.value.getFullYear(), tempDate.value.getMonth(), tempDate.value.getDate(), hour, minute, props.showSeconds ? second : 0);\n};\n\nconst isDateTimeDisabled = (date) => {\n if (!date) return true;\n if (minDateTime.value && date < minDateTime.value) return true;\n if (maxDateTime.value && date > maxDateTime.value) return true;\n if (props.disableFuture && date > new Date()) return true;\n return false;\n};\n\nconst isYearDisabled = (year) => {\n const start = new Date(year, 0, 1, 0, 0, 0);\n const end = new Date(year, 11, 31, 23, 59, 59);\n if (minDateTime.value && end < minDateTime.value) return true;\n if (maxDateTime.value && start > maxDateTime.value) return true;\n if (props.disableFuture && start > new Date()) return true;\n return false;\n};\n\nconst isMonthDisabled = (month) => {\n const start = new Date(currentYear.value, month, 1, 0, 0, 0);\n const end = new Date(currentYear.value, month + 1, 0, 23, 59, 59);\n if (minDateTime.value && end < minDateTime.value) return true;\n if (maxDateTime.value && start > maxDateTime.value) return true;\n if (props.disableFuture && start > new Date()) return true;\n return false;\n};\n\nconst isDayDisabled = (day) => {\n const start = new Date(day.year, day.month, day.day, 0, 0, 0);\n const end = new Date(day.year, day.month, day.day, 23, 59, 59);\n if (minDateTime.value && end < minDateTime.value) return true;\n if (maxDateTime.value && start > maxDateTime.value) return true;\n if (props.disableFuture && start > new Date()) return true;\n return false;\n};\n\nconst isTimePartDisabled = (hour, minute, second) => {\n if (!tempDate.value) return false;\n return isDateTimeDisabled(buildTempDateTime(hour, minute, second));\n};\n\nconst isDaySelected = (day) => {\n if (!tempDate.value) return false;\n return tempDate.value.getFullYear() === day.year\n && tempDate.value.getMonth() === day.month\n && tempDate.value.getDate() === day.day;\n};\n\nconst isRangeDaySelected = (day, side) => {\n const date = tempRange.value[side === 'start' ? 0 : 1];\n return !!date && date.getFullYear() === day.year && date.getMonth() === day.month && date.getDate() === day.day;\n};\n\nconst isRangeDayInRange = (day) => {\n const [start, end] = tempRange.value;\n if (!start || !end) return false;\n const date = new Date(day.year, day.month, day.day, 12, 0, 0);\n return date > start && date < end;\n};\n\nconst rangeDayClass = (day) => ['day-item', {\n 'other-month': day.otherMonth,\n today: day.isToday,\n disabled: isDayDisabled(day),\n selected: isRangeDaySelected(day, 'start') || isRangeDaySelected(day, 'end'),\n 'range-start': isRangeDaySelected(day, 'start'),\n 'range-end': isRangeDaySelected(day, 'end'),\n 'in-range': isRangeDayInRange(day)\n}];\n\nconst setSinglePanelFromDate = (date) => {\n if (!date) return;\n currentYear.value = date.getFullYear();\n currentMonth.value = date.getMonth();\n tempDate.value = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n selectedHour.value = date.getHours();\n selectedMinute.value = date.getMinutes();\n selectedSecond.value = date.getSeconds();\n};\n\nconst setRangePanelsFromDate = (date) => {\n const base = date || new Date();\n leftYear.value = base.getFullYear();\n leftMonth.value = base.getMonth();\n const right = new Date(base.getFullYear(), base.getMonth() + 1, 1);\n rightYear.value = right.getFullYear();\n rightMonth.value = right.getMonth();\n};\n\nconst initializePicker = () => {\n if (isRange.value) {\n tempRange.value = selectedRange.value.length ? selectedRange.value.map(date => new Date(date.getTime())) : [null, null];\n setRangePanelsFromDate(tempRange.value[0] || new Date());\n activeRangeSide.value = tempRange.value[0] && !tempRange.value[1] ? 'end' : 'start';\n activeTimeSide.value = null;\n return;\n }\n setSinglePanelFromDate(selectedDateTime.value || new Date());\n viewMode.value = 'day';\n activeSingleTime.value = false;\n};\n\nconst prevPeriod = () => {\n if (viewMode.value === 'year') currentYear.value -= 12;\n else if (viewMode.value === 'month') currentYear.value -= 1;\n else if (currentMonth.value === 0) {\n currentMonth.value = 11;\n currentYear.value -= 1;\n } else currentMonth.value -= 1;\n};\n\nconst nextPeriod = () => {\n if (viewMode.value === 'year') currentYear.value += 12;\n else if (viewMode.value === 'month') currentYear.value += 1;\n else if (currentMonth.value === 11) {\n currentMonth.value = 0;\n currentYear.value += 1;\n } else currentMonth.value += 1;\n};\n\nconst prevLeftMonth = () => {\n const left = new Date(leftYear.value, leftMonth.value - 1, 1);\n leftYear.value = left.getFullYear();\n leftMonth.value = left.getMonth();\n const right = new Date(leftYear.value, leftMonth.value + 1, 1);\n rightYear.value = right.getFullYear();\n rightMonth.value = right.getMonth();\n};\n\nconst nextRightMonth = () => {\n const right = new Date(rightYear.value, rightMonth.value + 1, 1);\n rightYear.value = right.getFullYear();\n rightMonth.value = right.getMonth();\n const left = new Date(rightYear.value, rightMonth.value - 1, 1);\n leftYear.value = left.getFullYear();\n leftMonth.value = left.getMonth();\n};\n\nconst changeViewMode = (mode) => {\n viewMode.value = mode;\n};\n\nconst selectYear = (year) => {\n if (isYearDisabled(year)) return;\n currentYear.value = year;\n viewMode.value = 'month';\n};\n\nconst selectMonth = (month) => {\n if (isMonthDisabled(month)) return;\n currentMonth.value = month;\n viewMode.value = 'day';\n};\n\nconst selectDay = (day) => {\n if (isDayDisabled(day)) return;\n tempDate.value = new Date(day.year, day.month, day.day);\n};\n\nconst selectRangeDay = (day) => {\n if (isDayDisabled(day)) return;\n const selected = new Date(day.year, day.month, day.day);\n if (activeRangeSide.value === 'start' || !tempRange.value[0] || (tempRange.value[0] && tempRange.value[1])) {\n const currentStart = tempRange.value[0];\n selected.setHours(currentStart?.getHours() ?? 0, currentStart?.getMinutes() ?? 0, props.showSeconds ? currentStart?.getSeconds() ?? 0 : 0, 0);\n tempRange.value = [selected, null];\n activeRangeSide.value = 'end';\n } else {\n const currentEnd = tempRange.value[1];\n selected.setHours(currentEnd?.getHours() ?? 23, currentEnd?.getMinutes() ?? 59, props.showSeconds ? currentEnd?.getSeconds() ?? 59 : 0, 0);\n const start = tempRange.value[0];\n tempRange.value = start <= selected ? [start, selected] : [selected, start];\n activeRangeSide.value = 'start';\n }\n};\n\nconst selectHour = (hour) => {\n if (isTimePartDisabled(hour, selectedMinute.value, selectedSecond.value)) return;\n selectedHour.value = hour;\n};\n\nconst selectMinute = (minute) => {\n if (isTimePartDisabled(selectedHour.value, minute, selectedSecond.value)) return;\n selectedMinute.value = minute;\n};\n\nconst selectSecond = (second) => {\n if (isTimePartDisabled(selectedHour.value, selectedMinute.value, second)) return;\n selectedSecond.value = second;\n};\n\nconst openRangeTime = (side) => {\n activeTimeSide.value = side;\n activeRangeSide.value = side;\n const index = side === 'start' ? 0 : 1;\n if (!tempRange.value[index]) {\n const base = new Date();\n base.setHours(side === 'start' ? 0 : 23, side === 'start' ? 0 : 59, props.showSeconds ? side === 'start' ? 0 : 59 : 0, 0);\n tempRange.value[index] = base;\n }\n};\n\nconst selectRangeTime = (part, value) => {\n const index = activeTimeSide.value === 'end' ? 1 : 0;\n const fallback = new Date();\n const date = tempRange.value[index] ? new Date(tempRange.value[index].getTime()) : fallback;\n if (part === 'hour') date.setHours(value);\n if (part === 'minute') date.setMinutes(value);\n if (part === 'second') date.setSeconds(value);\n if (!props.showSeconds) date.setSeconds(0);\n date.setMilliseconds(0);\n tempRange.value[index] = date;\n};\n\nconst closePicker = () => {\n showPicker.value = false;\n activeSingleTime.value = false;\n};\n\nconst clearTempRange = () => {\n tempRange.value = [null, null];\n activeRangeSide.value = 'start';\n activeTimeSide.value = null;\n};\n\nconst clearValue = () => {\n if (isRange.value) {\n selectedRange.value = [];\n tempRange.value = [null, null];\n emit('update:modelValue', []);\n emit('change', []);\n } else {\n selectedDateTime.value = null;\n tempDate.value = null;\n emit('update:modelValue', null);\n emit('change', null);\n }\n};\n\nconst confirm = () => {\n if (!canConfirm.value) return;\n if (isRange.value) {\n selectedRange.value = tempRange.value.map(date => new Date(date.getTime()));\n const modelValue = toModelRange(selectedRange.value);\n emit('update:modelValue', modelValue);\n emit('change', modelValue);\n closePicker();\n return;\n }\n const nextValue = buildTempDateTime();\n selectedDateTime.value = nextValue;\n const modelValue = toModelValue(nextValue);\n emit('update:modelValue', modelValue);\n emit('change', modelValue);\n closePicker();\n};\n\nconst handleCancel = () => {\n if (props.onCancel) {\n props.onCancel();\n } else {\n emit('cancel');\n closePicker();\n }\n};\n\nconst handleConfirm = () => {\n const value = isRange.value ? toModelRange(tempRange.value) : toModelValue(buildTempDateTime());\n if (props.onConfirm) {\n props.onConfirm(value);\n } else {\n emit('confirm', value);\n confirm();\n }\n};\n\nconst handleNow = () => {\n const now = new Date();\n if (isDateTimeDisabled(now)) return;\n setSinglePanelFromDate(now);\n};\n\nwatch(showPicker, (isOpen) => {\n if (isOpen) initializePicker();\n});\n\nwatch(() => props.modelValue, (newValue) => {\n if (isRange.value) {\n selectedRange.value = parseRangeValue(newValue);\n } else {\n selectedDateTime.value = parseValue(newValue);\n }\n}, { immediate: true });\n</script>\n\n<style scoped>\n.vtk-date-time-picker {\n position: relative;\n width: 100%;\n}\n\n.date-time-input {\n width: 100%;\n}\n\n.date-time-input-field {\n cursor: pointer;\n}\n\n:deep(.date-time-input-field .v-field),\n:deep(.date-time-input-field input) {\n cursor: pointer;\n}\n\n.date-time-icon {\n margin-left: 8px;\n color: rgb(var(--v-theme-on-surface), 0.6);\n}\n\n.date-time-picker-dropdown {\n background: rgb(var(--v-theme-surface));\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n overflow: visible;\n}\n\n.date-time-picker-dropdown.range-mode {\n width: 646px;\n min-width: 646px;\n max-width: 646px;\n}\n\n.date-time-picker-dropdown:not(.range-mode) {\n width: 360px;\n min-width: 360px;\n max-width: none;\n}\n\n.date-time-picker-dropdown.inline-mode {\n box-shadow: none;\n width: fit-content;\n border: none;\n}\n\n.picker-shell,\n.range-calendar-shell {\n display: flex;\n align-items: stretch;\n flex-wrap: nowrap;\n}\n\n.date-panel {\n width: 288px;\n border-right: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.calendar-panel {\n flex: 0 0 322px;\n width: 322px;\n min-width: 322px;\n max-width: 322px;\n padding: 12px 16px 16px;\n box-sizing: border-box;\n}\n\n.calendar-divider {\n flex: 0 0 1px;\n width: 1px;\n background: rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.picker-header,\n.calendar-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.picker-header {\n padding: 12px 16px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.picker-header.single-header {\n border-bottom: none;\n padding: 14px 16px 8px;\n}\n\n.calendar-header {\n height: 36px;\n margin-bottom: 8px;\n}\n\n.header-title,\n.month-title {\n font-size: 16px;\n font-weight: 500;\n color: rgb(var(--v-theme-on-surface));\n}\n\n.clickable {\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background 0.2s;\n}\n\n.clickable:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.nav-btn,\n.nav-btn-small {\n border: none;\n background: none;\n color: rgb(var(--v-theme-on-surface), 0.6);\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.2s;\n}\n\n.nav-btn {\n font-size: 20px;\n padding: 4px 12px;\n}\n\n.nav-btn-small {\n font-size: 18px;\n padding: 4px 8px;\n}\n\n.nav-btn:hover,\n.nav-btn-small:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.nav-btn-small.invisible {\n visibility: hidden;\n}\n\n.picker-body {\n padding: 10px 16px 16px;\n min-height: 250px;\n}\n\n.year-grid,\n.month-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n\n.year-item,\n.month-item {\n height: 42px;\n border: 1px solid transparent;\n background: transparent;\n text-align: center;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s;\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n}\n\n.year-item:hover,\n.month-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.year-item.selected,\n.month-item.selected {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.week-header {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 2px;\n margin-bottom: 6px;\n}\n\n.week-day {\n text-align: center;\n padding: 6px 0;\n font-size: 12px;\n color: rgb(var(--v-theme-on-surface), 0.6);\n font-weight: 500;\n}\n\n.day-grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 2px;\n}\n\n.day-item {\n aspect-ratio: 1;\n border: 1px solid transparent;\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 13px;\n color: rgb(var(--v-theme-on-surface));\n}\n\n.day-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.day-item.other-month {\n color: rgb(var(--v-theme-on-surface), 0.38);\n}\n\n.day-item.today {\n color: rgb(var(--v-theme-primary));\n font-weight: 600;\n}\n\n.day-item.selected,\n.day-item.range-start,\n.day-item.range-end {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.day-item.in-range {\n background: rgb(var(--v-theme-primary), 0.1);\n}\n\n.year-item.disabled,\n.month-item.disabled,\n.day-item.disabled,\n.time-item.disabled {\n color: rgb(var(--v-theme-on-surface), 0.26) !important;\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\n cursor: not-allowed !important;\n pointer-events: none;\n opacity: 0.5;\n}\n\n.time-panel {\n width: 156px;\n}\n\n.time-header {\n height: 49px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n font-weight: 500;\n color: rgb(var(--v-theme-on-surface));\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.time-columns {\n display: flex;\n height: 250px;\n}\n\n.time-columns.compact {\n height: 192px;\n}\n\n.time-column {\n flex: 1;\n overflow-y: auto;\n padding: 6px 0;\n border-right: 1px solid rgb(var(--v-theme-on-surface), 0.08);\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.time-column::-webkit-scrollbar {\n width: 0;\n height: 0;\n}\n\n.time-column:last-child {\n border-right: none;\n}\n\n.time-item {\n width: 100%;\n height: 28px;\n border: none;\n background: transparent;\n color: rgb(var(--v-theme-on-surface));\n cursor: pointer;\n font-size: 13px;\n transition: all 0.2s;\n}\n\n.time-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.time-item.selected {\n color: rgb(var(--v-theme-primary));\n font-weight: 600;\n background: rgb(var(--v-theme-primary), 0.1);\n}\n\n.range-input-row {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: nowrap;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n box-sizing: border-box;\n}\n\n.single-input-row {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 9px 12px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n box-sizing: border-box;\n}\n\n.single-date-input,\n.single-time-input {\n flex: 0 0 auto;\n width: 150px;\n height: 32px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.16);\n border-radius: 4px;\n background: rgb(var(--v-theme-surface));\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n padding: 0 12px;\n outline: none;\n}\n\n.single-time-input {\n text-align: left;\n cursor: pointer;\n}\n\n.single-time-input.active,\n.single-time-input:focus,\n.single-date-input:focus {\n border-color: rgb(var(--v-theme-primary));\n}\n\n.single-calendar-panel {\n width: 360px;\n}\n\n.range-date-input,\n.range-time-input {\n flex: 0 0 auto;\n height: 32px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.16);\n border-radius: 4px;\n background: rgb(var(--v-theme-surface));\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n padding: 0 12px;\n outline: none;\n}\n\n.range-date-input {\n width: 144px;\n}\n\n.range-time-input {\n width: 132px;\n text-align: left;\n cursor: pointer;\n}\n\n.range-time-input.active,\n.range-time-input:focus,\n.range-date-input:focus {\n border-color: rgb(var(--v-theme-primary));\n}\n\n.range-arrow {\n flex: 0 0 16px;\n width: 16px;\n text-align: center;\n color: rgb(var(--v-theme-on-surface), 0.6);\n font-size: 22px;\n}\n\n.range-time-popover {\n position: absolute;\n top: 45px;\n width: 180px;\n z-index: 2;\n background: rgb(var(--v-theme-surface));\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n}\n\n.single-time-popover {\n position: absolute;\n top: 45px;\n left: 156px;\n width: 180px;\n z-index: 2;\n background: rgb(var(--v-theme-surface));\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n}\n\n.range-time-popover.start {\n left: 162px;\n}\n\n.range-time-popover.end {\n left: 430px;\n}\n\n.time-popover-footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 10px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.selected-display {\n padding: 10px 16px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n text-align: center;\n}\n\n.selected-text {\n font-size: 14px;\n color: rgb(var(--v-theme-on-surface));\n}\n\n.placeholder-text,\n.inline-message {\n font-size: 14px;\n color: rgb(var(--v-theme-on-surface), 0.38);\n}\n\n.inline-message {\n padding: 16px;\n}\n\n.picker-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.footer-spacer {\n flex: 1;\n}\n\n.btn {\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n outline: none;\n}\n\n.btn.small {\n padding: 4px 8px;\n font-size: 12px;\n}\n\n.btn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.btn-text {\n background: none;\n color: rgb(var(--v-theme-primary));\n}\n\n.btn-text:hover:not(:disabled) {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.btn-primary {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.btn-primary:hover:not(:disabled) {\n opacity: 0.9;\n}\n</style>\n","<script setup>\r\nimport { ref, computed, reactive, onMounted, getCurrentInstance, watch, nextTick } from \"vue\";\r\nconst { proxy } = getCurrentInstance();\r\n// 获取配置的键名,如果没有配置则使用默认值\r\nconst userKey = window.VTK_CONFIG?.storageKeys?.user || '_mis_acis_users';\r\nconst user = JSON.parse(proxy.$vtk.storage.get(userKey));\r\n\r\nconsole.log('window.VTK_CONFIG=', window.VTK_CONFIG)\r\nconsole.log('window.VTK_CONFIG?.storageKeys?.user', window.VTK_CONFIG?.storageKeys?.user)\r\nconsole.log('user', user)\r\nconst pause = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\r\n\r\n// 定义 props - 控制是否支持多选\r\nconst props = defineProps({\r\n multiple: {\r\n type: Boolean,\r\n default: false // 默认单选\r\n }\r\n});\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['selected']);\r\n\r\n// 定义响应式数据\r\nconst dialog = ref(false);\r\n\r\n\r\n// 地区列表\r\nconst areaData = ref([]);\r\nconst areaSelectedData = ref([]);\r\nconst areaActivatedData = ref([]);\r\n\r\nwatch(areaActivatedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.areaCode) {\r\n getDeptList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\nwatch(areaSelectedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.areaCode) {\r\n getDeptList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\n// 获取地区列表\r\nconst getAreaList = () => {\r\n if (user && user.areacode) {\r\n proxy.$vtk.request.getForm(`/dict/area/show/${user.areacode}`).then((res) => {\r\n console.log('res=', res);\r\n if (res && res.data) {\r\n areaData.value = [{\r\n areaCode: res.data.areaCode,\r\n areaName: res.data.areaName,\r\n children: []\r\n }];\r\n }\r\n });\r\n }\r\n};\r\n\r\n// 获取下级地区列表\r\nconst getAreaNextList = async (item) => {\r\n await pause(300);\r\n const parentCode = item.areaCode;\r\n proxy.$vtk.request.getForm(`/dict/area/next/${parentCode}`).then((res) => {\r\n if (res && res.data) {\r\n res.data.forEach((it) => {\r\n it.areaLeve < 12 && (it.children = []);\r\n item.children.push(it);\r\n });\r\n }\r\n });\r\n};\r\n\r\n// 部门列表\r\nconst deptData = ref([]);\r\nconst deptSelectedData = ref([]);\r\nconst deptActivatedData = ref([]);\r\n\r\nwatch(deptSelectedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.id) {\r\n getPersonList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\nwatch(deptActivatedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.id) {\r\n getPersonList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\n// 点击叶子节点时调用的方法\r\nconst getDeptList = (node) => {\r\n const selectAreaCode = node[0].areaCode;\r\n const params = { codex: { area: selectAreaCode, type: \"0\" } };\r\n deptData.value = [];\r\n proxy.$vtk.request.postJson('/bizp/supported/dept/list', params).then((res) => {\r\n res.data.forEach((it) => {\r\n it.children = [];\r\n deptData.value.push(it);\r\n });\r\n });\r\n};\r\n\r\nconst getDepNextList = async (item) => {\r\n await pause(300);\r\n const selectAreaCode = item.areaCode;\r\n const selectPid = item.id;\r\n const params = { codex: { area: selectAreaCode, pid: selectPid } };\r\n proxy.$vtk.request.postJson('/bizp/supported/dept/list', params).then((res) => {\r\n if (res && res.data) {\r\n res.data.forEach((it) => {\r\n it.children = [];\r\n item.children.push(it);\r\n });\r\n }\r\n });\r\n};\r\n\r\n// 人员列表\r\nconst personData = ref([]);\r\nconst selectedPersonData = ref([]);\r\n// 全局已选人员列表(跨部门保存,用于去重和持久化选中状态)\r\nconst allSelectedPersons = ref([]);\r\n// 标记是否正在恢复选中状态(避免触发 watch 循环)\r\nconst isRestoringSelection = ref(false);\r\n\r\n// 已选中的人员列表(用于右侧显示)- 去重后的列表\r\nconst selectedPersonList = computed(() => {\r\n // 使用 Map 去重,key 为人员 id\r\n const uniqueMap = new Map();\r\n allSelectedPersons.value.forEach(person => {\r\n if (person && person.id) {\r\n uniqueMap.set(person.id, person);\r\n }\r\n });\r\n\r\n return Array.from(uniqueMap.values());\r\n});\r\n\r\n// 监听当前部门选中人员的变化\r\nwatch(selectedPersonData, (newVal, oldVal) => {\r\n // 如果正在恢复选中状态,不处理\r\n if (isRestoringSelection.value) {\r\n return;\r\n }\r\n\r\n // 单选模式:直接替换全局列表\r\n if (!props.multiple) {\r\n if (newVal && newVal.length > 0) {\r\n // 单选模式下只保留最新选中的一个\r\n allSelectedPersons.value = [newVal[0]];\r\n } else {\r\n // 取消选中时清空\r\n allSelectedPersons.value = [];\r\n }\r\n return;\r\n }\r\n\r\n // 多选模式:累加到全局列表\r\n // 处理新选中的人员\r\n if (newVal && newVal.length > 0) {\r\n newVal.forEach(person => {\r\n const exists = allSelectedPersons.value.some(p => p.id === person.id);\r\n if (!exists) {\r\n allSelectedPersons.value.push(person);\r\n }\r\n });\r\n }\r\n\r\n // 处理取消选中的人员\r\n if (oldVal && oldVal.length > 0) {\r\n oldVal.forEach(oldPerson => {\r\n const stillSelected = newVal?.some(p => p.id === oldPerson.id);\r\n if (!stillSelected) {\r\n // 从全局列表中移除\r\n const index = allSelectedPersons.value.findIndex(p => p.id === oldPerson.id);\r\n if (index > -1) {\r\n allSelectedPersons.value.splice(index, 1);\r\n }\r\n }\r\n });\r\n }\r\n}, { deep: true });\r\n\r\n// 监听部门切换,同步选中状态\r\nwatch(personData, async (newPersonData) => {\r\n if (!newPersonData || newPersonData.length === 0) {\r\n isRestoringSelection.value = true;\r\n selectedPersonData.value = [];\r\n await nextTick();\r\n isRestoringSelection.value = false;\r\n return;\r\n }\r\n\r\n // 等待 DOM 更新\r\n await nextTick();\r\n\r\n // 标记正在恢复选中状态\r\n isRestoringSelection.value = true;\r\n\r\n // 当人员列表更新时,恢复之前选中的状态\r\n const currentSelected = [];\r\n newPersonData.forEach(person => {\r\n const isSelected = allSelectedPersons.value.some(p => p.id === person.id);\r\n if (isSelected) {\r\n currentSelected.push(person);\r\n }\r\n });\r\n\r\n selectedPersonData.value = currentSelected;\r\n\r\n // 等待状态更新完成\r\n await nextTick();\r\n isRestoringSelection.value = false;\r\n}, { deep: true });\r\n\r\n// 移除已选中的人员\r\nconst removeSelectedPerson = (personId) => {\r\n // 从全局列表中移除\r\n const globalIndex = allSelectedPersons.value.findIndex(person => person.id === personId);\r\n if (globalIndex > -1) {\r\n allSelectedPersons.value.splice(globalIndex, 1);\r\n }\r\n\r\n // 从当前显示的选中列表中移除\r\n const currentIndex = selectedPersonData.value.findIndex(person => person.id === personId);\r\n if (currentIndex > -1) {\r\n selectedPersonData.value.splice(currentIndex, 1);\r\n }\r\n};\r\n\r\n\r\n// 点击叶子节点时调用的方法\r\n// \r\nconst getPersonList = (node) => {\r\n const selectAreaID = node[0].id;\r\n const params = { codex: { dept: selectAreaID } };\r\n\r\n proxy.$vtk.request.postJson('/bizp/supported/user/list', params).then((res) => {\r\n if (res && res.meta.success && res.data.length > 0) {\r\n personData.value = res.data\r\n } else {\r\n personData.value = null\r\n }\r\n });\r\n};\r\nconst add = () => {\r\n dialog.value = true;\r\n};\r\n\r\nconst close = () => {\r\n // 先设置标记,避免触发 watch\r\n isRestoringSelection.value = true;\r\n\r\n // 关闭对话框\r\n dialog.value = false;\r\n\r\n // 清空选中状态\r\n selectedPersonData.value = [];\r\n allSelectedPersons.value = [];\r\n areaSelectedData.value = [];\r\n areaActivatedData.value = [];\r\n deptSelectedData.value = [];\r\n deptActivatedData.value = [];\r\n personData.value = [];\r\n deptData.value = [];\r\n\r\n // 重置标记\r\n nextTick(() => {\r\n isRestoringSelection.value = false;\r\n });\r\n};\r\n\r\n// 确认选择\r\nconst confirm = () => {\r\n // 返回选中的人员列表给父组件\r\n const selectedPersons = selectedPersonList.value;\r\n // 通过 emit 将选中的人员传递给父组件\r\n emit('selected', selectedPersons);\r\n close();\r\n};\r\n\r\nonMounted(() => {\r\n // 获取地区列表\r\n getAreaList();\r\n});\r\n\r\n// 使组件方法可以被父组件调用\r\ndefineExpose({\r\n close,\r\n add,\r\n});\r\n</script>\r\n\r\n<template>\r\n <v-dialog v-model=\"dialog\" persistent width=\"1000\">\r\n <v-card>\r\n <v-card-title class=\"d-flex align-center\">\r\n <span class=\"text-h6\">人员选择</span>\r\n <v-spacer></v-spacer>\r\n <v-btn class=\"g-no-shadow\" icon @click=\"close\" size=\"small\">\r\n <v-icon>mdi-close</v-icon>\r\n </v-btn>\r\n </v-card-title>\r\n <v-divider />\r\n <v-card-text class=\"pb-0 mb-0 pl-0 pr-0\" style=\"height: 600px;\">\r\n <v-row style=\"margin-top:-16px; height: 100%;\">\r\n <v-col md=\"3\" class=\"pr-0 \" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">地区</span>\r\n </v-card-title>\r\n <v-sheet height=\"500\" style=\"overflow: auto\" class=\"mt-2 pl-2\">\r\n <v-treeview item-value=\"id\" item-title=\"areaName\" return-object :items=\"areaData\" density=\"compact\"\r\n color=\"primary\" item-props activatable v-model:selected=\"areaSelectedData\"\r\n v-model:activated=\"areaActivatedData\" :load-children=\"getAreaNextList\">\r\n <template v-slot:title=\"{ item }\">\r\n <span :title=\"item.areaName\">{{ item.areaName }}</span>\r\n </template>\r\n </v-treeview>\r\n </v-sheet>\r\n </v-col>\r\n <v-col md=\"3\" class=\"pr-0 pl-0\" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">部门</span>\r\n </v-card-title>\r\n <v-sheet height=\"500\" style=\"overflow: auto\" class=\"mt-2 pl-2\">\r\n <v-treeview v-if=\"deptData && deptData.length > 0\" item-value=\"id\" item-title=\"name\" return-object :items=\"deptData\" density=\"compact\"\r\n color=\"primary\" item-props activatable v-model:selected=\"deptSelectedData\"\r\n v-model:activated=\"deptActivatedData\" :load-children=\"getDepNextList\">\r\n <template v-slot:title=\"{ item }\">\r\n <span :title=\"item.name\">{{ item.name }}</span>\r\n </template>\r\n </v-treeview>\r\n <div v-else class=\"text-center pt-4 d-flex flex-column align-center justify-center\">\r\n <v-icon size=\"64\" color=\"grey-lighten-2\" class=\"mb-4\">\r\n mdi-office-building-outline\r\n </v-icon>\r\n <div class=\"text-grey\">暂无</div>\r\n </div>\r\n </v-sheet>\r\n </v-col>\r\n <v-col md=\"3\" class=\"pr-0 pl-0\" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">人员</span>\r\n </v-card-title>\r\n <v-sheet height=\"550\" style=\"overflow: auto;\" class=\"mt-2\">\r\n <v-treeview v-if=\"personData && personData.length > 0\"\r\n item-value=\"id\"\r\n item-title=\"username\"\r\n return-object\r\n :items=\"personData\"\r\n density=\"compact\"\r\n color=\"primary\"\r\n item-props\r\n selectable\r\n :select-strategy=\"multiple ? 'leaf' : 'single-leaf'\"\r\n v-model:selected=\"selectedPersonData\">\r\n <template v-slot:title=\"{ item }\">\r\n <div class=\"d-flex align-center\" :title=\"item.username\">\r\n <v-avatar size=\"24\" class=\"mr-2\">\r\n <v-img v-if=\"item.avatar\" :src=\"item.avatar\"></v-img>\r\n <v-icon v-else size=\"20\">mdi-account-circle</v-icon>\r\n </v-avatar>\r\n <span>{{ item.username }}</span>\r\n </div>\r\n </template>\r\n </v-treeview>\r\n <div v-else class=\"text-center pt-4 d-flex flex-column align-center justify-center\">\r\n <v-icon size=\"64\" color=\"grey-lighten-2\" class=\"mb-4\">\r\n mdi-account-group\r\n </v-icon>\r\n <div class=\"text-grey\">暂无</div>\r\n </div>\r\n </v-sheet>\r\n </v-col>\r\n <v-col md=\"3\" class=\"pr-0 pl-0\" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">已选中人员 ({{ selectedPersonList.length }})</span>\r\n </v-card-title>\r\n <v-sheet height=\"550\" style=\"overflow: auto\" class=\"mt-2 px-2\">\r\n <v-list v-if=\"selectedPersonList.length > 0\" density=\"compact\">\r\n <v-list-item\r\n v-for=\"person in selectedPersonList\"\r\n :key=\"person.id\"\r\n :title=\"person.username\"\r\n class=\"px-2 mb-1 mr-2\"\r\n rounded=\"lg\"\r\n color=\"primary\"\r\n variant=\"tonal\">\r\n <template v-slot:prepend>\r\n <v-avatar size=\"32\">\r\n <v-img v-if=\"person.avatar\" :src=\"person.avatar\"></v-img>\r\n <v-icon v-else>mdi-account-circle</v-icon>\r\n </v-avatar>\r\n </template>\r\n <template v-slot:append>\r\n <v-btn\r\n icon\r\n size=\"x-small\"\r\n variant=\"text\"\r\n @click=\"removeSelectedPerson(person.id)\">\r\n <v-icon size=\"16\">mdi-close</v-icon>\r\n </v-btn>\r\n </template>\r\n </v-list-item>\r\n </v-list>\r\n <div v-else class=\"text-center pt-4 d-flex flex-column align-center justify-center\">\r\n <v-icon size=\"64\" color=\"grey-lighten-2\" class=\"mb-4\">\r\n mdi-account\r\n </v-icon>\r\n <div class=\"text-grey\">暂无选中</div>\r\n </div>\r\n </v-sheet>\r\n </v-col>\r\n </v-row>\r\n </v-card-text>\r\n <v-divider />\r\n <v-card-actions>\r\n <v-spacer></v-spacer>\r\n <v-btn color=\"darken-1\" text @click=\"close\">取消</v-btn>\r\n <v-btn color=\"blue darken-1\" text @click=\"confirm\">确定</v-btn>\r\n </v-card-actions>\r\n </v-card>\r\n </v-dialog>\r\n</template>\r\n\r\n<style scoped>\r\n:deep() .v-sheet[style*=\"overflow: auto\"] {\r\n &::-webkit-scrollbar {\r\n width: 5px;\r\n }\r\n\r\n &::-webkit-scrollbar-thumb {\r\n background: #ccc;\r\n border-radius: 4px;\r\n }\r\n}\r\n</style>","<!-- 空页面 -->\r\n<template>\r\n <v-empty-state\r\n :headline=\"headline\"\r\n :title=\"title\"\r\n :text=\"text\"\r\n :image=\"image\"\r\n :icon=\"icon\"\r\n :rounded=\"rounded\"\r\n :elevation=\"elevation\"\r\n >\r\n <!-- 图像插槽 -->\r\n <template v-if=\"$slots.media\" #media>\r\n <slot name=\"media\"></slot>\r\n </template>\r\n\r\n <!-- 标题插槽 -->\r\n <template v-if=\"$slots.title\" #title>\r\n <slot name=\"title\"></slot>\r\n </template>\r\n\r\n <!-- 文本插槽 -->\r\n <template v-if=\"$slots.text\" #text>\r\n <slot name=\"text\"></slot>\r\n </template>\r\n\r\n <!-- 操作按钮插槽 -->\r\n <template v-if=\"$slots.actions\" #actions>\r\n <slot name=\"actions\"></slot>\r\n </template>\r\n\r\n <!-- 底部插槽 -->\r\n <template v-if=\"$slots.bottom\" #bottom>\r\n <slot name=\"bottom\"></slot>\r\n </template>\r\n </v-empty-state>\r\n</template>\r\n\r\n<script setup>\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkEmpty\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 标题\r\n title: {\r\n type: String,\r\n default: ''\r\n },\r\n // 副标题/文本\r\n text: {\r\n type: String,\r\n default: ''\r\n },\r\n // 头部文本(更大字体)\r\n headline: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图标\r\n icon: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图像\r\n image: {\r\n type: String,\r\n default: ''\r\n },\r\n // 圆角\r\n rounded: {\r\n type: [Boolean, String, Number],\r\n default: 'circle'\r\n },\r\n // 阴影\r\n elevation: {\r\n type: [Number, String],\r\n default: 0\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n/* 可以添加自定义样式 */\r\n:deep(.v-empty-state) {\r\n padding: 24px;\r\n}\r\n\r\n:deep(.v-empty-state__media) {\r\n margin-bottom: 16px;\r\n}\r\n\r\n:deep(.v-empty-state__headline) {\r\n margin-bottom: 8px;\r\n}\r\n\r\n:deep(.v-empty-state__title) {\r\n margin-bottom: 8px;\r\n}\r\n\r\n:deep(.v-empty-state__actions) {\r\n margin-top: 16px;\r\n}\r\n</style>","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1749629552703'%20class='icon'%20viewBox='0%200%201396%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='13768'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='272.65625'%20height='200'%3e%3cpath%20d='M1264.425891%20814.340655c-6.050909-42.7008-33.233455-84.433455-74.202764-97.540655a199.028364%20199.028364%200%200%201%202.373818%20136.443345c-5.9392%2017.072873-14.373236%2035.439709-8.154763%2052.410182a44.274036%2044.274036%200%200%200%2023.021382%2023.514764%20132.096%20132.096%200%200%200%2032.423563%209.309091l2.169018%201.7408c16.5888-39.880145%2028.429964-83.232582%2022.369746-125.877527z'%20fill='%23F4F4F4'%20p-id='13769'%3e%3c/path%3e%3cpath%20d='M1191.666036%20718.773527c25.488291%2026.242327%2041.630255%2059.466473%2046.145164%2094.952728%201.089164%207.633455%200.893673%2015.378618-0.577164%2022.956218a41.648873%2041.648873%200%200%201-10.593745%2019.642182%2088.175709%2088.175709%200%200%200-13.898473%2016.27229%2024.669091%2024.669091%200%200%200-0.902982%2021.00131c3.723636%208.192%209.141527%2015.5648%2015.946473%2021.69949a66.187636%2066.187636%200%200%201%2017.7152%2024.315346c0.335127%201.135709%202.215564%200.539927%201.880436-0.651636-5.697164-16.821527-22.788655-26.158545-31.390254-41.239273a24.920436%2024.920436%200%200%201-2.215564-22.788655%2067.323345%2067.323345%200%200%201%2013.7216-16.877382%2043.976145%2043.976145%200%200%200%2011.394328-18.878836%2065.619782%2065.619782%200%200%200%201.42429-22.844509%20157.947345%20157.947345%200%200%200-13.6192-49.915345%20171.4176%20171.4176%200%200%200-33.540654-49.319564c-0.856436-0.930909-2.169018%200.539927-1.312582%201.461527l-0.176873%200.214109z'%20fill='%23FFFFFF'%20p-id='13770'%3e%3c/path%3e%3cpath%20d='M1228.418327%20845.460945c-8.033745-5.678545-14.038109-14.838691-16.821527-25.674472-0.279273-1.098473-1.629091-0.502691-1.387055%200.549236%202.913745%2011.282618%209.197382%2020.815127%2017.594182%2026.679855%200.8192%200.539927%201.424291-1.005382%200.6144-1.554619z'%20fill='%23FFFFFF'%20p-id='13771'%3e%3c/path%3e%3cpath%20d='M1070.545455%20804.770909l1.954909%201.135709c8.759855%204.980364%2017.035636%2010.630982%2024.734254%2016.886691%200.642327%200.437527%201.238109%200.912291%201.796655%201.4336a184.813382%20184.813382%200%200%201%2044.776727%2053.573818c4.421818%208.043055%208.154764%2016.384%2011.170909%2024.939055%204.189091%2011.803927%207.68%2024.687709%2015.685818%2034.564654%200.837818%201.014691%201.722182%201.992145%202.671709%202.913746l70.814255-1.135709H1247.418182a12.241455%2012.241455%200%200%200-0.381673-1.3312%203.351273%203.351273%200%200%200%200-0.791273%201.926982%201.926982%200%200%201%200-0.539927%201.303273%201.303273%200%200%201%200-0.446837c-0.763345-2.615855-1.582545-5.231709-2.345891-7.801018a246.225455%20246.225455%200%200%200-26.959127-58.963782%20166.288291%20166.288291%200%200%200-17.221818-22.760727%20137.746618%20137.746618%200%200%200-45.921746-33.978182c-25.013527-12.269382-54.346473-15.173818-81.696582-8.098909l-2.34589%200.400291z'%20fill='%23F4F4F4'%20p-id='13772'%3e%3c/path%3e%3cpath%20d='M1071.904582%20802.425018c35.169745%206.022982%2067.444364%2022.341818%2092.243782%2046.685091a69.678545%2069.678545%200%200%201%2013.451636%2017.594182c3.165091%206.395345%204.468364%2013.479564%203.742255%2020.517236a78.941091%2078.941091%200%200%200-0.651637%2019.893528c1.303273%206.823564%205.659927%2012.790691%2011.943564%2016.365381%207.7824%204.189091%2016.384%206.8608%2025.283491%207.847564a67.397818%2067.397818%200%200%201%2028.048291%208.722618c0.977455%200.670255%202.066618-0.8192%201.033309-1.536-14.270836-9.746618-33.093818-7.335564-48.835491-14.112582-7.493818-2.774109-13.2096-8.685382-15.453091-16.002327a60.229818%2060.229818%200%200%201%200-20.200727%2040.001164%2040.001164%200%200%200-2.885818-20.265891%2064.260655%2064.260655%200%200%200-12.6976-17.957236%20164.9664%20164.9664%200%200%200-40.364218-30.366255A180.140218%20180.140218%200%200%200%201071.522909%20800.581818c-1.247418%200-1.359127%201.582545%200%201.796655l0.372364%200.046545z'%20fill='%23FFFFFF'%20p-id='13773'%3e%3c/path%3e%3cpath%20d='M1148.220509%20837.520291c8.620218-8.145455%208.052364-19.725964-1.3312-27.387346-0.912291-0.7168-2.541382%200.316509-1.582545%201.03331%208.8064%207.121455%209.271855%2017.938618%201.098472%2025.451054-0.847127%200.809891%200.968145%201.675636%201.815273%200.902982z'%20fill='%23FFFFFF'%20p-id='13774'%3e%3c/path%3e%3cpath%20d='M269.963636%20102.4m20.107637%200l248.366545%200q20.107636%200%2020.107637%2020.107636l0%2080.802909q0%2020.107636-20.107637%2020.107637l-248.366545%200q-20.107636%200-20.107637-20.107637l0-80.802909q0-20.107636%2020.107637-20.107636Z'%20fill='%23F4F4F4'%20p-id='13775'%3e%3c/path%3e%3cpath%20d='M339.781818%20162.909091m-23.272727%200a23.272727%2023.272727%200%201%200%2046.545454%200%2023.272727%2023.272727%200%201%200-46.545454%200Z'%20fill='%23FFFFFF'%20p-id='13776'%3e%3c/path%3e%3cpath%20d='M513.889745%20158.217309H387.872582C384.372364%20157.789091%20381.672727%20153.767564%20381.672727%20148.945455s2.690327-8.843636%206.199855-9.271855h126.017163c2.569309-0.316509%205.045527%201.377745%206.404655%204.375273%201.349818%203.006836%201.349818%206.795636%200%209.793163-1.359127%202.997527-3.835345%204.691782-6.404655%204.375273zM477.435345%20195.490909h-89.125236c-3.667782%200-6.637382-4.170473-6.637382-9.309091s2.978909-9.309091%206.637382-9.309091h89.125236c3.667782%200%206.637382%204.170473%206.637382%209.309091s-2.978909%209.309091-6.637382%209.309091z'%20fill='%23FFFFFF'%20p-id='13777'%3e%3c/path%3e%3cpath%20d='M111.709091%20605.090909m20.107636%200l183.202909%200q20.107636%200%2020.107637%2020.107636l0%2090.112q0%2020.107636-20.107637%2020.107637l-183.202909%200q-20.107636%200-20.107636-20.107637l0-90.112q0-20.107636%2020.107636-20.107636Z'%20fill='%23E1EDFF'%20p-id='13778'%3e%3c/path%3e%3cpath%20d='M162.909091%20665.6m-23.272727%200a23.272727%2023.272727%200%201%200%2046.545454%200%2023.272727%2023.272727%200%201%200-46.545454%200Z'%20fill='%23FFFFFF'%20p-id='13779'%3e%3c/path%3e%3cpath%20d='M251.997091%20660.908218h-30.608291C217.264873%20660.489309%20214.109091%20656.477091%20214.109091%20651.636364s3.165091-8.852945%207.279709-9.271855h30.608291c2.997527-0.3072%205.892655%201.396364%207.4752%204.384582%201.582545%202.997527%201.582545%206.777018%200%209.774545-1.582545%202.997527-4.477673%204.691782-7.4752%204.384582zM282.0096%20698.181818h-61.328291c-3.723636-0.418909-6.572218-4.468364-6.572218-9.309091s2.848582-8.890182%206.572218-9.309091h61.328291c3.723636%200.418909%206.572218%204.468364%206.572218%209.309091s-2.848582%208.890182-6.572218%209.309091z'%20fill='%23FFFFFF'%20p-id='13780'%3e%3c/path%3e%3cpath%20d='M269.963636%20944.872727h1014.690909'%20fill='%2366676D'%20p-id='13781'%3e%3c/path%3e%3cpath%20d='M269.963636%20940.218182h1014.690909v9.309091H269.963636z'%20fill='%23E1EDFF'%20p-id='13782'%3e%3c/path%3e%3cpath%20d='M996.072727%20232.727273m-27.927272%200a27.927273%2027.927273%200%201%200%2055.854545%200%2027.927273%2027.927273%200%201%200-55.854545%200Z'%20fill='%23F4F4F4'%20p-id='13783'%3e%3c/path%3e%3cpath%20d='M1181.305018%20866.117818c-1.508073%203.956364-4.431127%206.656-7.7824%207.177309-0.893673%200-0.633018%201.8432%200%201.759418%203.695709-0.6144%206.925964-3.584%208.610909-7.940654a1.098473%201.098473%200%200%200%200.055855-0.865746c-0.093091-0.279273-0.297891-0.465455-0.539927-0.50269-0.232727-0.027927-0.465455%200.111709-0.605091%200.372363h0.260654z'%20fill='%23FFFFFF'%20p-id='13784'%3e%3c/path%3e%3cpath%20d='M1196.218182%20358.4m-32.581818%200a32.581818%2032.581818%200%201%200%2065.163636%200%2032.581818%2032.581818%200%201%200-65.163636%200Z'%20fill='%23FEDAC2'%20p-id='13785'%3e%3c/path%3e%3cpath%20d='M1027.537455%20679.563636H846.196364a26.437818%2026.437818%200%200%200-26.372655%2026.5216v11.347782c0%2010.426182-8.406109%2018.878836-18.776436%2018.878837H642.234182a18.832291%2018.832291%200%200%201-18.776437-18.822982v-11.403637A26.437818%2026.437818%200%200%200%20597.085091%20679.563636H415.529891c-8.415418%200-15.238982%206.8608-15.238982%2015.332073v239.299491A15.341382%2015.341382%200%200%200%20415.529891%20949.527273h611.849309a15.341382%2015.341382%200%200%200%2015.238982-15.332073V694.895709c0-8.406109-6.730473-15.248291-15.080727-15.332073z%20m7.382109%20254.585019c0%204.105309-3.295418%207.447273-7.382109%207.4752H415.688145a7.456582%207.456582%200%200%201-7.382109-7.4752V694.895709a7.186618%207.186618%200%200%201%202.169019-5.306182%207.316945%207.316945%200%200%201%205.268945-2.178327h181.341091a18.832291%2018.832291%200%200%201%2018.720582%2018.888145v11.347782a26.763636%2026.763636%200%200%200%2026.633309%2026.512291H801.047273a26.763636%2026.763636%200%200%200%2026.633309-26.512291v-11.357091c0-10.398255%208.378182-18.850909%2018.729891-18.878836h181.341091a7.456582%207.456582%200%200%201%207.3728%207.484509l-0.2048%20239.243636z'%20fill='%23D3D3D3'%20p-id='13786'%3e%3c/path%3e%3cpath%20d='M527.145891%20260.654545H934.632727c13.833309%200.977455%2024.417745%2013.163055%2024.203637%2027.368728l-0.046546%201.163636L958.836364%20684.218182h-6.460509l-0.046546-395.226764c0.6144-10.835782-6.944582-20.200727-16.905309-21.466763l-1.005382-0.093091-407.058618-0.009309c-10.333091%200.726109-18.255127%209.755927-18.208582%2020.666181l0.037237%201.098473%200.046545%20395.031273h-6.460509l-0.037236-394.835782c-0.791273-14.522182%209.4208-27.052218%2023.272727-28.625455l1.135709-0.1024z'%20fill='%23CACACC'%20p-id='13787'%3e%3c/path%3e%3cpath%20d='M823.975564%20381.672727H712.024436c-7.7824-0.446836-13.842618-6.572218-13.842618-13.963636s6.060218-13.5168%2013.842618-13.963636h111.951128c7.7824%200.446836%2013.842618%206.572218%2013.842618%2013.963636s-6.060218%2013.5168-13.842618%2013.963636zM878.964364%20381.672727h-17.128728c-8.266473-0.446836-14.708364-6.572218-14.708363-13.963636s6.441891-13.5168%2014.708363-13.963636h17.128728c8.266473%200.446836%2014.708364%206.572218%2014.708363%2013.963636s-6.441891%2013.5168-14.708363%2013.963636z'%20fill='%23F4F4F4'%20p-id='13788'%3e%3c/path%3e%3cpath%20d='M650.724073%20357.338764h-30.72V326.190545A10.333091%2010.333091%200%200%200%20609.745455%20316.509091a10.333091%2010.333091%200%200%200-10.24931%209.681454v31.148219h-30.72c-5.650618%200-10.230691%204.645236-10.23069%2010.370327%200%205.725091%204.580073%2010.370327%2010.221381%2010.370327h30.72v31.157527A10.333091%2010.333091%200%200%200%20609.745455%20418.909091a10.333091%2010.333091%200%200%200%2010.249309-9.681455v-31.148218h30.72c5.650618%200%2010.230691-4.645236%2010.230691-10.370327%200-5.725091-4.580073-10.370327-10.221382-10.370327z'%20fill='%231E73F7'%20p-id='13789'%3e%3c/path%3e%3cpath%20d='M558.545455%20474.763636m20.107636%200l304.221091%200q20.107636%200%2020.107636%2020.107637l0%2024.948363q0%2020.107636-20.107636%2020.107637l-304.221091%200q-20.107636%200-20.107636-20.107637l0-24.948363q0-20.107636%2020.107636-20.107637Z'%20fill='%23E1EDFF'%20p-id='13790'%3e%3c/path%3e%3cpath%20d='M558.545455%20549.236364m20.107636%200l118.039273%200q20.107636%200%2020.107636%2020.107636l0%2024.948364q0%2020.107636-20.107636%2020.107636l-118.039273%200q-20.107636%200-20.107636-20.107636l0-24.948364q0-20.107636%2020.107636-20.107636Z'%20fill='%23E1EDFF'%20p-id='13791'%3e%3c/path%3e%3cpath%20d='M251.345455%20437.527273m-18.618182%200a18.618182%2018.618182%200%201%200%2037.236363%200%2018.618182%2018.618182%200%201%200-37.236363%200Z'%20fill='%23E1EDFF'%20p-id='13792'%3e%3c/path%3e%3cpath%20d='M1079.854545%20539.927273m-9.30909%200a9.309091%209.309091%200%201%200%2018.618181%200%209.309091%209.309091%200%201%200-18.618181%200Z'%20fill='%23E1EDFF'%20p-id='13793'%3e%3c/path%3e%3cpath%20d='M558.545455%20810.942836v53.750691h5.920581V820.503273h0.214109l29.29571%2044.190254h6.060218v-53.750691h-5.911273v43.734109h-0.223418l-29.146764-43.734109zM632.943709%20809.890909c-7.791709%200-13.851927%202.708945-18.3296%208.126836-4.254255%205.12-6.3488%2011.748073-6.3488%2019.87491%200%208.052364%202.094545%2014.680436%206.3488%2019.800436%204.468364%205.343418%2010.537891%208.052364%2018.255127%208.052364%207.726545%200%2013.861236-2.708945%2018.338909-8.052364%204.189091-5.12%206.3488-11.6736%206.3488-19.800436%200-8.201309-2.169018-14.829382-6.358109-19.949382-4.468364-5.417891-10.603055-8.052364-18.245818-8.052364z%20m0%205.492364c5.920582%200%2010.537891%202.038691%2013.861236%206.171927%203.165091%204.068073%204.831418%209.495273%204.831419%2016.337455%200%206.777018-1.657018%2012.120436-4.840728%2016.188509-3.314036%204.058764-8.005818%206.171927-13.9264%206.171927-5.911273%200-10.603055-2.113164-13.9264-6.330182-3.165091-4.058764-4.756945-9.402182-4.756945-16.030254%200-6.702545%201.582545-12.045964%204.756945-16.104728%203.397818-4.291491%208.0896-6.404655%2014.000873-6.404654zM689.803636%20810.942836v53.750691h17.901382c8.080291%200%2014.289455-2.485527%2018.618182-7.382109%204.114618-4.663855%206.209164-11.217455%206.209164-19.493236%200-8.434036-1.954909-14.987636-5.771637-19.493237-4.189091-4.971055-10.323782-7.382109-18.478545-7.382109h-18.469237z%20m5.920582%205.343419h11.617746c6.795636%200%2011.692218%201.805964%2014.866618%205.492363%202.960291%203.472291%204.477673%208.815709%204.477673%2016.039564%200%207.000436-1.657018%2012.343855-4.840728%2015.955782-3.388509%203.695709-8.434036%205.576145-15.145891%205.576145h-10.975418v-43.063854zM755.842327%20810.942836l-20.2752%2053.750691h6.3488l5.483055-15.0528h23.663709l5.492364%2015.0528h6.423272l-20.284509-53.750691h-6.851491z%20m-6.572218%2033.503419l9.886255-26.875346h0.288581l9.746619%2026.875346h-19.921455zM784.197818%20810.942836v5.343419h18.189964v48.407272h5.846109v-48.407272h18.180654v-5.343419zM847.918545%20810.942836l-20.2752%2053.750691h6.3488l5.492364-15.0528h23.663709l5.492364%2015.0528H875.054545l-20.2752-53.750691h-6.8608z%20m-6.562909%2033.503419l9.886255-26.875346h0.279273l9.746618%2026.875346h-19.921455z'%20fill='%23E1EDFF'%20p-id='13794'%3e%3c/path%3e%3cpath%20d='M959.860364%20543.222691l-0.791273%201.954909-4.635927%204.244945%2077.367854%20123.233746c1.973527%203.146473%203.025455%206.814255%203.006837%2010.556509v251.308218a7.354182%207.354182%200%200%201-2.048%205.110691%206.907345%206.907345%200%200%201-4.961746%202.122473H415.371636a7.391418%207.391418%200%200%201-7.2704-7.512437V683.2128c0-3.751564%201.061236-7.419345%203.053382-10.556509L507.345455%20535.272727l-2.532073-10.873018-100.258909%20143.741673c-2.792727%204.440436-4.282182%209.616291-4.263564%2014.903854V922.344727c0%2015.015564%2011.803927%2027.191855%2026.372655%2027.191855h589.321309c14.605964%200%2026.484364-12.129745%2026.624-27.191855V683.045236c0-5.213091-1.4336-10.333091-4.161164-14.736291l-78.587345-125.086254z'%20fill='%23D3D3D3'%20p-id='13795'%3e%3c/path%3e%3c/svg%3e\"","<template>\n <v-card class=\"pa-4 mx-auto text-center pt-10\" color=\"transparent\" elevation=\"0\" style=\"border: none !important;box-shadow: none !important;\">\n <v-img contain width=\"120\" class=\"mx-auto\" :src=\"emptyImg\" alt=\"\" />\n <p class=\"text-grey mt-1\">{{ text || \"暂无数据\" }}</p>\n </v-card>\n</template>\n\n<script setup>\nimport emptyImg from '@/assets/img/empty.svg';\n\n// 定义 props\ndefineProps({\n text: {\n type: String,\n default: null,\n },\r\n items: {\r\n type: Array,\r\n default: null,\r\n },\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped></style>\n","<!-- 悬浮按钮 -->\r\n<template>\r\n <transition name=\"slide-up\">\r\n <v-fab\r\n v-if=\"showFab\"\r\n :class=\"fabClass\"\r\n color=\"primary\"\r\n icon=\"mdi-arrow-up\"\r\n @click=\"scrollToTop\"\r\n ></v-fab>\r\n </transition>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, onBeforeUnmount } from 'vue'\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkFab\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 控制悬浮按钮显示状态\r\nconst showFab = ref(false)\r\n// 自定义类名用于样式调整\r\nconst fabClass = ref('scroll-to-top-fab')\r\n\r\n// 监听滚动事件\r\nconst handleScroll = () => {\r\n showFab.value = window.scrollY > 100\r\n}\r\n\r\n// 滚动到顶部\r\nconst scrollToTop = () => {\r\n window.scrollTo({\r\n top: 0,\r\n behavior: 'smooth'\r\n })\r\n}\r\n\r\n// 组件挂载时添加滚动监听\r\nonMounted(() => {\r\n window.addEventListener('scroll', handleScroll)\r\n})\r\n\r\n// 组件卸载前移除监听\r\nonBeforeUnmount(() => {\r\n window.removeEventListener('scroll', handleScroll)\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.scroll-to-top-fab {\r\n position: fixed;\r\n bottom: 24px;\r\n right: 24px;\r\n z-index: 1004;\r\n}\r\n\r\n/* 滑动动画 */\r\n.slide-up-enter-active {\r\n transition: all 0.2s ease-out;\r\n}\r\n\r\n.slide-up-leave-active {\r\n transition: all 0.2s ease-in;\r\n}\r\n\r\n.slide-up-enter-from {\r\n opacity: 0;\r\n transform: translateY(30px);\r\n}\r\n\r\n.slide-up-leave-to {\r\n opacity: 0;\r\n transform: translateY(30px);\r\n}\r\n</style>","<template>\r\n <div\r\n class=\"box\"\r\n :class=\"{\r\n 'form-item--vertical': top,\r\n 'form-item--horizontal': !top\r\n }\"\r\n style=\"position: relative\"\r\n >\r\n <!-- label 在上方 (top模式) -->\r\n <div\r\n v-if=\"label && top\"\r\n class=\"pb-2 text-left\"\r\n >\r\n <span v-if=\"must\" class=\"text-red mr-1\">*</span>\r\n <span>{{ label }}</span>\r\n </div>\r\n\r\n <!-- label 在左侧 (默认模式) -->\r\n <div\r\n v-if=\"label && !top\"\r\n :class=\"left ? '' : 'vtk-width-2'\"\r\n class=\"d-inline-block text-right\"\r\n :style=\"Tstyle\"\r\n style=\"min-width: 120px !important;vertical-align: top;padding-top: 11px;\"\r\n >\r\n <span v-if=\"must\" class=\"text-red\">*</span>\r\n <span>{{ label }}</span>\r\n </div>\r\n\r\n <!-- 输入框容器 (top模式) -->\r\n <div\r\n v-if=\"top\"\r\n :style=\"contentStyles\"\r\n >\r\n <slot></slot>\r\n </div>\r\n\r\n <!-- 输入框容器 (默认模式) -->\r\n <div\r\n v-if=\"!top\"\r\n class=\"d-inline-block vtk-width-7 \"\r\n style=\"min-width: 350px;\"\r\n >\r\n <slot></slot>\r\n </div>\r\n\r\n <!-- help提示 (仅left模式) -->\r\n <div\r\n v-if=\"left && help && !top\"\r\n class=\"box_help tips py-3 px-4\"\r\n style=\"width: calc(30% - 160px)\"\r\n >\r\n <p class=\"mb-2 font-weight-bold text-body-1\">{{ label }}</p>\r\n <span v-html=\"help\"></span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\n\r\n// 定义组件名称和选项\r\ndefineOptions({\r\n name: \"VtkFormItem\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n label: {\r\n type: String,\r\n default: null\r\n },\r\n must: {\r\n type: Boolean,\r\n default: false\r\n },\r\n left: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 标签在上方的垂直布局\r\n top: {\r\n type: Boolean,\r\n default: false\r\n },\r\n Tstyle: {\r\n type: String,\r\n default: null\r\n },\r\n help: {\r\n type: String,\r\n default: null\r\n },\r\n // 控制top模式下内容的最大宽度\r\n maxWidth: {\r\n type: [String, Number],\r\n default: '100%'\r\n }\r\n});\r\n\r\n// 处理maxWidth属性\r\nconst processedMaxWidth = computed(() => {\r\n if (typeof props.maxWidth === 'number') {\r\n return props.maxWidth + 'px';\r\n }\r\n return props.maxWidth;\r\n});\r\n\r\n// 内容样式(仅在top模式下应用maxWidth)\r\nconst contentStyles = computed(() => {\r\n const styles = {};\r\n\r\n // 在top模式下应用maxWidth\r\n if (props.top && props.maxWidth) {\r\n styles.maxWidth = processedMaxWidth.value;\r\n }\r\n\r\n return styles;\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.box:hover > .box_help {\r\n display: inline-block !important;\r\n border-top-right-radius: 24px;\r\n border-bottom-left-radius: 24px;\r\n}\r\n\r\n.box_help {\r\n display: none;\r\n}\r\n\r\n.tips {\r\n position: absolute;\r\n right: 8px;\r\n top: 0;\r\n border: 1px rgba(175, 175, 175, 0.341) solid;\r\n}\r\n\r\n.form-item--vertical {\r\n display: block;\r\n margin-bottom: 1rem;\r\n}\r\n\r\n.form-item--horizontal {\r\n display: block;\r\n margin-bottom: 0.5rem;\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"vtk-img-container\">\r\n <VCard \r\n :class=\"['vtk-img-card', { 'vtk-img-card--preview': preview }]\"\r\n @click=\"openPreview\"\r\n >\r\n <v-img \r\n v-bind=\"$attrs\" \r\n :src=\"srcWithToken\"\r\n class=\"vtk-img\"\r\n :aspect-ratio=\"aspectRatio\"\r\n cover\r\n >\r\n <template v-slot:placeholder>\r\n <div class=\"d-flex align-center justify-center fill-height\">\r\n <v-progress-circular indeterminate color=\"grey-lighten-1\"></v-progress-circular>\r\n </div>\r\n </template>\r\n </v-img>\r\n \r\n <!-- 图片标题和描述 -->\r\n <div class=\"vtk-img-info\" v-if=\"showTitle || showDescription\">\r\n <VCardTitle v-if=\"showTitle\" class=\"vtk-img-title text-subtitle-2 pa-2\">\r\n {{ title }}\r\n </VCardTitle>\r\n <v-card-subtitle v-if=\"showDescription\" class=\"vtk-img-description text-caption pa-2\">\r\n {{ description }}\r\n </v-card-subtitle>\r\n </div>\r\n </VCard>\r\n \r\n <!-- 使用 v-dialog 的图片预览 -->\r\n <VDialog \r\n v-model=\"showPreview\" \r\n max-width=\"90%\" \r\n fullscreen\r\n @click:outside=\"closePreview\"\r\n >\r\n <VCard class=\"image-viewer-card\">\r\n <v-toolbar dark color=\"primary\">\r\n <v-toolbar-title>{{ currentImageTitle }}</v-toolbar-title>\r\n <VSpacer></VSpacer>\r\n <v-toolbar-items>\r\n <VBtn icon dark title=\"新窗口打开\" @click=\"openCurrentImageInNewWindow\">\r\n <VIcon>mdi-open-in-new</VIcon>\r\n </VBtn>\r\n <VBtn icon dark title=\"下载图片\" @click=\"downloadCurrentImage\">\r\n <VIcon>mdi-download</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"zoomImage(-0.3)\">\r\n <VIcon>mdi-magnify-minus-outline</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"zoomImage(0.3)\">\r\n <VIcon>mdi-magnify-plus-outline</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"rotateImage(-90)\">\r\n <VIcon>mdi-rotate-left</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"rotateImage(90)\">\r\n <VIcon>mdi-rotate-right</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"resetImageTransform\">\r\n <VIcon>mdi-refresh</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"closePreview\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n </v-toolbar-items>\r\n </v-toolbar>\r\n \r\n <div class=\"image-viewer-content\">\r\n <VBtn \r\n v-if=\"hasPrev\" \r\n icon \r\n class=\"nav-button prev-button\" \r\n @click=\"prevImage\"\r\n >\r\n <VIcon>mdi-chevron-left</VIcon>\r\n </VBtn>\r\n \r\n <div class=\"image-container\" @wheel.prevent=\"handleImageWheel\">\r\n <v-img\r\n :src=\"currentImageUrl\"\r\n class=\"viewer-image\"\r\n :class=\"{ 'viewer-image--draggable': imageScale > 1 }\"\r\n :style=\"viewerImageStyle\"\r\n draggable=\"false\"\r\n @pointerdown=\"startImageDrag\"\r\n />\r\n </div>\r\n \r\n <VBtn \r\n v-if=\"hasNext\" \r\n icon \r\n class=\"nav-button next-button\" \r\n @click=\"nextImage\"\r\n >\r\n <VIcon>mdi-chevron-right</VIcon>\r\n </VBtn>\r\n </div>\r\n \r\n <div class=\"image-info\">\r\n <p class=\"text-center\">{{ currentImageDescription }}</p>\r\n <p class=\"text-center text--secondary\">{{ currentIndex + 1 }} / {{ imageList.length }}</p>\r\n </div>\r\n </VCard>\r\n </VDialog>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch, getCurrentInstance } from 'vue';\r\n\r\ndefineOptions({\r\n name: 'VtkImg',\r\n inheritAttrs: true\r\n});\r\n\r\nconst { proxy } = getCurrentInstance();\r\n\r\nconst props = defineProps({\r\n src: {\r\n type: String,\r\n default: null,\r\n },\r\n downloadSrc: {\r\n type: String,\r\n default: '',\r\n },\r\n error: {\r\n type: String,\r\n default: new URL('../../assets/img/wxsq.png', import.meta.url).href,\r\n },\r\n preview: {\r\n type: Boolean,\r\n default: true\r\n },\r\n title: {\r\n type: String,\r\n default: ''\r\n },\r\n description: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图片列表,用于导航功能\r\n imageList: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 当前图片索引\r\n index: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 是否显示标题\r\n showTitle: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 是否显示描述\r\n showDescription: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 图片宽高比\r\n aspectRatio: {\r\n type: [String, Number],\r\n default: 16/9\r\n }\r\n});\r\n\r\n// 预览状态\r\nconst showPreview = ref(false);\r\n// 图片旋转角度\r\nconst imageRotation = ref(0);\r\n// 图片缩放和拖动位置\r\nconst imageScale = ref(1);\r\nconst imageTranslateX = ref(0);\r\nconst imageTranslateY = ref(0);\r\nconst imageDragState = ref(null);\r\n// 当前图片索引(预览模式下使用)\r\nconst currentIndex = ref(0);\r\n\r\n// 使用计算属性处理带token的URL\r\nconst srcWithToken = computed(() => {\r\n if (!props.src) return props.src;\r\n \r\n try {\r\n // 首先尝试使用 $vtk.storage\r\n if (window.$vtk && typeof window.$vtk.storage?.get === 'function') {\r\n const token = window.$vtk.storage.get('_mis_acis_token');\r\n return token ? `${props.src}?stoken=${token}` : props.src;\r\n }\r\n // 如果 $vtk 不存在,尝试从 localStorage 获取 token\r\n else {\r\n const token = localStorage.getItem('_mis_acis_token');\r\n return token ? `${props.src}?stoken=${token}` : props.src;\r\n }\r\n } catch (error) {\r\n // 发生错误时返回原始src\r\n console.warn('VtkImg: Failed to get token, using src without token', error);\r\n return props.src;\r\n }\r\n});\r\n\r\n// 当前预览图片的URL\r\nconst currentImageUrl = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n if (currentImage) {\r\n // 支持 imageList 项为字符串(直接是URL)或对象(含 url 属性)\r\n const url = typeof currentImage === 'string' ? currentImage : currentImage?.url;\r\n if (url) {\r\n try {\r\n // 为图片列表中的图片也添加token\r\n if (window.$vtk && typeof window.$vtk.storage?.get === 'function') {\r\n const token = window.$vtk.storage.get('_mis_acis_token');\r\n return token ? `${url}?stoken=${token}` : url;\r\n } else {\r\n const token = localStorage.getItem('_mis_acis_token');\r\n return token ? `${url}?stoken=${token}` : url;\r\n }\r\n } catch (error) {\r\n return url;\r\n }\r\n }\r\n }\r\n }\r\n return srcWithToken.value;\r\n});\r\n\r\nconst currentImageRawUrl = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n const url = typeof currentImage === 'string' ? currentImage : currentImage?.url;\r\n return url || props.src;\r\n }\r\n\r\n return props.src;\r\n});\r\n\r\nconst currentImageDownloadUrl = computed(() => {\r\n if (props.downloadSrc) return props.downloadSrc;\r\n\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n if (currentImage && typeof currentImage === 'object') {\r\n return currentImage.downloadUrl || currentImage.downloadSrc || currentImage.url || props.src;\r\n }\r\n }\r\n\r\n return currentImageRawUrl.value;\r\n});\r\n\r\n// 当前图片标题\r\nconst currentImageTitle = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n return currentImage?.title || '';\r\n }\r\n return props.title;\r\n});\r\n\r\n// 当前图片描述\r\nconst currentImageDescription = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n return currentImage?.description || '';\r\n }\r\n return props.description;\r\n});\r\n\r\n// 是否有上一张图片\r\nconst hasPrev = computed(() => {\r\n return props.imageList.length > 1 && currentIndex.value > 0;\r\n});\r\n\r\n// 是否有下一张图片\r\nconst hasNext = computed(() => {\r\n return props.imageList.length > 1 && currentIndex.value < props.imageList.length - 1;\r\n});\r\n\r\nconst viewerImageStyle = computed(() => ({\r\n transform: `translate(${imageTranslateX.value}px, ${imageTranslateY.value}px) scale(${imageScale.value}) rotate(${imageRotation.value}deg)`,\r\n}));\r\n\r\nconst openCurrentImageInNewWindow = () => {\r\n if (!currentImageRawUrl.value) return;\r\n\r\n window.open(currentImageRawUrl.value, '_blank', 'noopener');\r\n};\r\n\r\nconst imageMimeExtensionMap = {\r\n 'image/bmp': 'bmp',\r\n 'image/gif': 'gif',\r\n 'image/jpeg': 'jpg',\r\n 'image/png': 'png',\r\n 'image/svg+xml': 'svg',\r\n 'image/webp': 'webp',\r\n};\r\n\r\nconst imageExtensionMimeMap = {\r\n bmp: 'image/bmp',\r\n gif: 'image/gif',\r\n jpeg: 'image/jpeg',\r\n jpg: 'image/jpeg',\r\n png: 'image/png',\r\n svg: 'image/svg+xml',\r\n webp: 'image/webp',\r\n};\r\n\r\nconst getImageFileExtension = (blob) => {\r\n const mimeType = blob?.type?.split(';')[0]?.toLowerCase();\r\n\r\n if (mimeType && imageMimeExtensionMap[mimeType]) {\r\n return imageMimeExtensionMap[mimeType];\r\n }\r\n\r\n try {\r\n const { pathname } = new URL(currentImageRawUrl.value, window.location.href);\r\n const matched = pathname.match(/\\.([a-z0-9]+)$/i);\r\n return matched?.[1]?.toLowerCase() || 'png';\r\n } catch (error) {\r\n return 'png';\r\n }\r\n};\r\n\r\nconst getCurrentImageFileName = (blob) => {\n const extension = getImageFileExtension(blob);\n const titleName = currentImageTitle.value?.trim();\n\r\n if (titleName) {\r\n const safeTitle = titleName.replace(/[\\\\/:*?\"<>|]/g, '_').replace(/\\.[a-z0-9]+$/i, '');\r\n return `${safeTitle}.${extension}`;\r\n }\r\n\r\n try {\r\n const { pathname } = new URL(currentImageRawUrl.value, window.location.href);\r\n const urlName = decodeURIComponent(pathname.split('/').pop() || '')\r\n .replace(/[\\\\/:*?\"<>|]/g, '_')\r\n .replace(/\\.[a-z0-9]+$/i, '');\r\n return urlName ? `${urlName}.${extension}` : `image.${extension}`;\r\n } catch (error) {\r\n return `image.${extension}`;\r\n }\n};\n\nconst isDownloadRiskWebView = () => {\n const ua = window.navigator?.userAgent || '';\n const hasEmbeddedBridge = typeof window.dd !== 'undefined' || typeof window.AlipayJSBridge !== 'undefined';\n return hasEmbeddedBridge\n || /DingTalk|AliApp\\(DingTalk|zjzwfw|zzd|ZJGovernment|ZhejiangGovernment|GovDing|Electron|WebView|; wv\\)/i.test(ua);\n};\n\nconst getDownloadFailureReason = (error) => {\n const message = error?.message || '';\n const name = error?.name || '';\n\n if (name === 'AbortError') return '已取消下载';\n if (name === 'NotAllowedError' || name === 'SecurityError') return '当前客户端阻止了文件保存';\n if (name === 'QuotaExceededError') return '存储空间不足或客户端限制写入';\n if (/Failed to fetch|NetworkError|Load failed/i.test(message)) {\n return '图片地址不允许跨域读取,或当前网络无法访问图片';\n }\n if (/HTTP error! status:\\s*(\\d+)/i.test(message)) {\n return `图片请求失败,状态码 ${message.match(/HTTP error! status:\\s*(\\d+)/i)?.[1]}`;\n }\n if (/Response is not an image/i.test(message)) return '下载地址返回的不是图片文件';\n if (/Downloaded image is empty/i.test(message)) return '下载到的图片文件为空';\n if (/Downloaded file is not an image/i.test(message)) return '下载到的文件不是图片格式';\n if (/Downloaded image cannot be decoded/i.test(message)) return '下载到的图片无法被浏览器解析';\n\n return message || '未知错误';\n};\n\nconst validateImageBlob = async (blob) => {\n if (!blob || blob.size <= 0) {\n throw new Error('Downloaded image is empty');\n }\n\n const extension = getImageFileExtension(blob);\n const mimeType = blob.type?.split(';')[0]?.trim().toLowerCase();\n if (mimeType && !mimeType.startsWith('image/')) {\n throw new Error(`Downloaded file is not an image: ${mimeType}`);\n }\n\n if (typeof window.createImageBitmap === 'function' && mimeType !== 'image/svg+xml') {\n try {\n const bitmap = await window.createImageBitmap(blob);\n bitmap.close?.();\n return;\n } catch (error) {\n console.warn('VtkImg: createImageBitmap validation failed, fallback to Image validation', error);\n }\n }\n\n if (extension === 'svg') return;\n\n await new Promise((resolve, reject) => {\n const url = window.URL.createObjectURL(blob);\n const image = new Image();\n\n image.onload = () => {\n window.URL.revokeObjectURL(url);\n resolve();\n };\n image.onerror = () => {\n window.URL.revokeObjectURL(url);\n reject(new Error('Downloaded image cannot be decoded'));\n };\n image.src = url;\n });\n};\n\nconst triggerBrowserDownload = (blob, fileName) => {\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n setTimeout(() => window.URL.revokeObjectURL(url), 60 * 1000);\n};\n\r\nconst triggerBrowserUrlDownload = (url, fileName) => {\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n link.target = '_blank';\r\n link.rel = 'noopener';\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n};\r\n\r\nconst showDownloadToast = (message, color = 'info') => {\r\n try {\r\n const toast = proxy?.$vtk?.message?.toast || window.$vtk?.message?.toast;\r\n if (typeof toast === 'function') {\r\n toast(message, { color });\r\n return;\r\n }\r\n } catch (error) {\r\n console.warn('VtkImg: failed to show message toast', error);\r\n }\r\n\r\n if (color === 'error' || color === 'warning') {\r\n window.alert?.(message);\r\n }\r\n};\r\n\r\nconst getDownloadFileHandle = async (fileName, blob) => {\n if (isDownloadRiskWebView()) {\n return null;\n }\n\n if (typeof window.showSaveFilePicker !== 'function') {\n showDownloadToast('当前浏览器不支持选择保存目录,将使用默认下载方式。', 'warning');\n return null;\n }\n\r\n const extension = getImageFileExtension(blob);\r\n const mimeType = imageExtensionMimeMap[extension] || blob?.type || 'image/png';\r\n\r\n try {\r\n return await window.showSaveFilePicker({\r\n suggestedName: fileName,\r\n types: [\r\n {\r\n description: '图片文件',\r\n accept: {\r\n [mimeType]: [`.${extension}`],\r\n },\r\n },\r\n ],\r\n });\r\n } catch (error) {\r\n if (error?.name === 'AbortError') {\r\n showDownloadToast('已取消下载。');\r\n return false;\r\n }\r\n\r\n console.warn('VtkImg: showSaveFilePicker unavailable, fallback to browser download', error);\r\n return null;\r\n }\r\n};\r\n\r\nconst isImageResponse = (response, blob, url) => {\r\n const contentType = response.headers.get('content-type')?.split(';')[0]?.trim().toLowerCase();\r\n\r\n if (contentType?.startsWith('image/')) return true;\r\n if (blob.type?.startsWith('image/')) return true;\r\n\r\n const canFallbackToExtension = !contentType\r\n || contentType === 'application/octet-stream'\r\n || contentType === 'binary/octet-stream';\r\n if (!canFallbackToExtension) return false;\r\n\r\n try {\r\n const { pathname } = new URL(url, window.location.href);\r\n const extension = pathname.match(/\\.([a-z0-9]+)$/i)?.[1]?.toLowerCase();\r\n return Boolean(extension && imageExtensionMimeMap[extension]);\r\n } catch (error) {\r\n return false;\r\n }\r\n};\r\n\r\nconst fetchImageBlob = async (url) => {\r\n const response = await fetch(url, { mode: 'cors' });\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const blob = await response.blob();\r\n if (!isImageResponse(response, blob, url)) {\r\n const contentType = response.headers.get('content-type') || blob.type || 'unknown';\r\n throw new Error(`Response is not an image: ${contentType}`);\r\n }\r\n\r\n return blob;\r\n};\r\n\r\nconst fetchCurrentImageBlob = async () => {\r\n if (!currentImageDownloadUrl.value) {\r\n throw new Error('Image download url is empty');\r\n }\r\n\r\n return fetchImageBlob(currentImageDownloadUrl.value);\r\n};\r\n\r\nconst downloadCurrentImage = async () => {\r\n const downloadUrl = currentImageDownloadUrl.value;\r\n\r\n if (!downloadUrl) {\r\n showDownloadToast('暂无可下载的图片地址。', 'warning');\r\n return;\r\n }\r\n\r\n try {\n const blob = await fetchCurrentImageBlob();\n await validateImageBlob(blob);\n const fileName = getCurrentImageFileName(blob);\n const fileHandle = await getDownloadFileHandle(fileName, blob);\n if (fileHandle === false) return;\n\r\n if (fileHandle) {\r\n const writable = await fileHandle.createWritable();\r\n await writable.write(blob);\r\n await writable.close();\r\n showDownloadToast('图片下载成功。', 'success');\r\n return;\r\n }\n\n triggerBrowserDownload(blob, fileName);\n if (isDownloadRiskWebView()) {\n showDownloadToast('已使用兼容方式下载图片,如文件仍不可用,请在系统浏览器中打开后保存。');\n return;\n }\n\n showDownloadToast('图片已开始下载。', 'success');\n } catch (error) {\n const failureReason = getDownloadFailureReason(error);\n console.error(`下载图片失败:${failureReason}`, error);\n triggerBrowserUrlDownload(downloadUrl, getCurrentImageFileName());\n if (isDownloadRiskWebView()) {\n showDownloadToast(`下载失败:${failureReason}。已打开原图,请在系统浏览器中保存。`, 'warning');\n return;\n }\n\n showDownloadToast(`下载失败:${failureReason}。已切换为浏览器下载。`, 'warning');\n }\n};\n\r\nconst resetImageTransform = () => {\r\n imageRotation.value = 0;\r\n imageScale.value = 1;\r\n imageTranslateX.value = 0;\r\n imageTranslateY.value = 0;\r\n imageDragState.value = null;\r\n};\r\n\r\n// 监听预览状态变化\r\nwatch(showPreview, (newVal) => {\r\n if (newVal) {\r\n // 打开预览时重置旋转角度和当前索引\r\n resetImageTransform();\r\n currentIndex.value = props.index;\r\n }\r\n});\r\n\r\n// 打开预览\r\nconst openPreview = () => {\r\n if (props.preview) {\r\n showPreview.value = true;\r\n }\r\n};\r\n\r\n// 关闭预览\r\nconst closePreview = () => {\r\n showPreview.value = false;\r\n};\r\n\r\n// 上一张图片\r\nconst prevImage = () => {\r\n if (hasPrev.value) {\r\n currentIndex.value--;\r\n resetImageTransform();\r\n }\r\n};\r\n\r\n// 下一张图片\r\nconst nextImage = () => {\r\n if (hasNext.value) {\r\n currentIndex.value++;\r\n resetImageTransform();\r\n }\r\n};\r\n\r\n// 旋转图片\r\nconst rotateImage = (degrees) => {\r\n imageRotation.value += degrees;\r\n};\r\n\r\nconst zoomImage = (step) => {\r\n const nextScale = Number((imageScale.value + step).toFixed(2));\r\n imageScale.value = Math.min(3, Math.max(0.2, nextScale));\r\n if (imageScale.value <= 1) {\r\n imageTranslateX.value = 0;\r\n imageTranslateY.value = 0;\r\n }\r\n};\r\n\r\nconst handleImageWheel = (event) => {\r\n zoomImage(event.deltaY < 0 ? 0.2 : -0.2);\r\n};\r\n\r\nconst startImageDrag = (event) => {\r\n if (imageScale.value <= 1) return;\r\n event.preventDefault();\r\n const target = event.currentTarget;\r\n imageDragState.value = {\r\n pointerId: event.pointerId,\r\n startX: event.clientX,\r\n startY: event.clientY,\r\n translateX: imageTranslateX.value,\r\n translateY: imageTranslateY.value,\r\n };\r\n target.setPointerCapture?.(event.pointerId);\r\n target.addEventListener('pointermove', moveImageDrag);\r\n target.addEventListener('pointerup', endImageDrag, { once: true });\r\n target.addEventListener('pointercancel', endImageDrag, { once: true });\r\n};\r\n\r\nconst moveImageDrag = (event) => {\r\n const state = imageDragState.value;\r\n if (!state || state.pointerId !== event.pointerId) return;\r\n imageTranslateX.value = state.translateX + event.clientX - state.startX;\r\n imageTranslateY.value = state.translateY + event.clientY - state.startY;\r\n};\r\n\r\nconst endImageDrag = (event) => {\r\n event.currentTarget?.releasePointerCapture?.(event.pointerId);\r\n event.currentTarget?.removeEventListener('pointermove', moveImageDrag);\r\n imageDragState.value = null;\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-img-container {\r\n position: relative;\r\n display: inline-block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.vtk-img-card {\r\n height: 100%;\r\n}\r\n\r\n.vtk-img-card--preview {\r\n cursor: pointer;\r\n transition: transform 0.2s ease-in-out;\r\n}\r\n\r\n.vtk-img-card--preview:hover {\r\n transform: translateY(-5px);\r\n}\r\n\r\n.vtk-img {\r\n width: 100%;\r\n}\r\n\r\n.vtk-img-info {\r\n padding: 0;\r\n}\r\n\r\n.vtk-img-title {\r\n word-break: break-word;\r\n}\r\n\r\n.vtk-img-description {\r\n word-break: break-word;\r\n}\r\n\r\n/* 图片查看器样式 */\r\n.image-viewer-card {\r\n background-color: rgba(0, 0, 0, 0.3);\r\n color: white;\r\n}\r\n\r\n.image-viewer-content {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: calc(100vh - 150px);\r\n position: relative;\r\n}\r\n\r\n.image-container {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n overflow: hidden;\r\n}\r\n\r\n.viewer-image {\r\n max-width: 90%;\r\n max-height: 80vh;\r\n transform-origin: center center;\r\n transition: transform 0.3s ease;\r\n user-select: none;\r\n touch-action: none;\r\n}\r\n\r\n.viewer-image--draggable {\r\n cursor: grab;\r\n}\r\n\r\n.viewer-image--draggable:active {\r\n cursor: grabbing;\r\n}\r\n\r\n.nav-button {\r\n position: absolute;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n z-index: 10;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n color: white;\r\n width: 50px;\r\n height: 50px;\r\n}\r\n\r\n.prev-button {\r\n left: 20px;\r\n}\r\n\r\n.next-button {\r\n right: 20px;\r\n}\r\n\r\n.image-info {\r\n padding: 20px;\r\n background-color: rgba(0, 0, 0, 0.7);\r\n}\r\n\r\n.image-info p {\r\n margin: 5px 0;\r\n}\r\n\r\n:deep(.v-img__img) {\r\n background: v-bind('props.error') no-repeat center;\r\n background-size: cover;\r\n}\r\n\r\n:deep(.v-img__placeholder) {\r\n filter: blur(0px);\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"m_pagination\">\r\n <VRow v-if=\"pageDatas.rowCount > 0\" class=\"pagination box\" align=\"center\">\r\n <span class=\"page-total d-none d-md-flex align-center\">共{{ pageDatas.rowCount }}条</span>\r\n <VSelect\r\n v-model=\"pagination.limit\"\r\n :items=\"pageSizeObjs\"\r\n variant=\"outlined\"\r\n density=\"compact\"\r\n :menu-props=\"{ offsetY: true }\"\r\n hide-details\r\n class=\"page-select ml-2 d-none d-md-flex\"\r\n @update:model-value=\"pageSizeChange()\"\r\n />\r\n <span class=\"my-2\">\r\n <v-pagination\r\n v-model=\"pageDatas.pageno\"\r\n :total-visible=\"5\"\r\n :length=\"pageDatas.pageCount\"\r\n size=\"small\"\r\n @update:model-value=\"pageChange()\"\r\n />\r\n </span>\r\n <span class=\"page-total ml-3 d-none d-md-flex align-center\">到</span>\r\n <VTextField\r\n v-model=\"pagination.pageno\"\r\n variant=\"outlined\"\r\n density=\"compact\"\r\n hide-details\r\n class=\"page-go ml-2 d-none d-md-flex\"\r\n @keyup.enter=\"toPage()\"\r\n />\r\n <span class=\"page-total ml-2 d-none d-md-flex align-center\">页</span>\r\n </VRow>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, reactive, computed, watch, onMounted } from 'vue';\r\n\r\nconst props = defineProps({\r\n pageData: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n pageSizes: {\r\n type: Array,\r\n default: () => [10, 20, 30]\r\n }\r\n});\r\n\r\nconst emit = defineEmits(['pageChange']);\r\n\r\nconst pagination = reactive({\r\n pageno: 1,\r\n limit: 10\r\n});\r\n\r\nconst pageSizeObjs = ref([]);\r\nconst pageDatas = ref({ ...props.pageData });\r\n\r\nconst paginationChange = computed(() => pageDatas.value.pageno);\r\n\r\nwatch(paginationChange, () => {\r\n pagination.pageno = pageDatas.value.pageno;\r\n});\r\n\r\nwatch(() => props.pageData, (newVal) => {\r\n pageDatas.value = { ...newVal };\r\n if (newVal.rowCount < 1 && newVal.rows > 0) {\r\n pageDatas.value.pageno = newVal.pageno - 1;\r\n pageChange();\r\n }\r\n}, { deep: true });\r\n\r\nonMounted(() => {\r\n pageSizeFormat();\r\n});\r\n\r\nconst toPage = () => {\r\n const re = /^[0-9]+$/;\r\n if (re.test(pagination.pageno) && pagination.pageno <= pageDatas.value.pageCount) {\r\n pageDatas.value.pageno = parseInt(pagination.pageno);\r\n pageChange();\r\n } else {\r\n pagination.pageno = pageDatas.value.pageno;\r\n }\r\n};\r\n\r\nconst pageSizeChange = () => {\r\n pageDatas.value.pageCount = 1;\r\n pageChange();\r\n};\r\n\r\nconst pageSizeFormat = () => {\r\n const temp = props.pageSizes;\r\n temp.forEach((value) => {\r\n const obj = {\r\n title: value + \"条/页\",\r\n value: value\r\n };\r\n pageSizeObjs.value.push(obj);\r\n });\r\n pagination.limit = temp[0];\r\n};\r\n\r\nconst pageChange = () => {\r\n const page = {\r\n pageno: pageDatas.value.pageno,\r\n limit: pagination.limit\r\n };\r\n emit('pageChange', page);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.mt-1 {\r\n margin-top: 11px !important;\r\n}\r\n.my-5 {\r\n margin-top: 20px !important;\r\n margin-bottom: 20px !important;\r\n}\r\n.m_pagination {\r\n width: 100%;\r\n min-height: 52px;\r\n display: flex;\r\n align-items: center;\r\n .box {\r\n position: absolute;\r\n right: 32px;\r\n }\r\n}\r\n.page-total {\r\n display: flex;\r\n align-items: center;\r\n height: 36px;\r\n font-size: 13px;\r\n padding-top: 4px;\r\n}\r\n.page-select {\r\n padding-top: 4px;\r\n max-width: 115px;\r\n :deep(.v-input__control) {\r\n min-height: 36px !important;\r\n height: 36px !important;\r\n }\r\n :deep(.v-field) {\r\n height: 36px !important;\r\n font-size: 13px !important;\r\n }\r\n :deep(.v-field__input) {\r\n padding-top: 6px !important;\r\n padding-bottom: 6px !important;\r\n min-height: 36px !important;\r\n }\r\n}\r\n.page-go {\r\n max-width: 75px;\r\n :deep(.v-input__control) {\r\n min-height: 36px !important;\r\n height: 36px !important;\r\n }\r\n :deep(.v-field) {\r\n height: 36px !important;\r\n font-size: 13px !important;\r\n }\r\n :deep(.v-field__input) {\r\n padding-top: 6px !important;\r\n padding-bottom: 6px !important;\r\n min-height: 36px !important;\r\n }\r\n}\r\n\r\n// 分页按钮缩小\r\n.my-2 {\r\n :deep(.v-pagination__item),\r\n :deep(.v-pagination__prev),\r\n :deep(.v-pagination__next) {\r\n min-width: 32px !important;\r\n height: 36px !important;\r\n font-size: 13px !important;\r\n }\r\n}\r\n</style>","<template>\r\n <div class=\"vtk-pdf-container\">\r\n <VCard \r\n :class=\"['vtk-pdf-card', { 'vtk-pdf-card--preview': preview }]\"\r\n @click=\"openPreview\"\r\n >\r\n <!-- PDF封面或默认图标 -->\r\n <div class=\"vtk-pdf-cover\" :style=\"{ aspectRatio: aspectRatio }\">\r\n <VIcon size=\"48\" color=\"red\">mdi-file-pdf-box</VIcon>\r\n <div class=\"vtk-pdf-label\">PDF</div>\r\n </div>\r\n \r\n <!-- PDF标题和描述 -->\r\n <div class=\"vtk-pdf-info\" v-if=\"showTitle || showDescription\">\r\n <VCardTitle v-if=\"showTitle\" class=\"vtk-pdf-title text-subtitle-2 pa-2\">\r\n {{ title }}\r\n </VCardTitle>\r\n <v-card-subtitle v-if=\"showDescription\" class=\"vtk-pdf-description text-caption pa-2\">\r\n {{ description }}\r\n </v-card-subtitle>\r\n </div>\r\n </VCard>\r\n \r\n <!-- 使用 v-dialog 的PDF预览 -->\r\n <VDialog \r\n v-model=\"showPreview\" \r\n max-width=\"90%\" \r\n fullscreen\r\n @click:outside=\"closePreview\"\r\n >\r\n <VCard class=\"pdf-viewer-card\">\r\n <v-toolbar dark color=\"red darken-1\">\r\n <VBtn icon dark @click=\"closePreview\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n <v-toolbar-title>{{ title }}</v-toolbar-title>\r\n <VSpacer></VSpacer>\r\n <v-toolbar-items>\r\n <VBtn icon dark @click=\"downloadPdf\">\r\n <VIcon>mdi-download</VIcon>\r\n </VBtn>\r\n </v-toolbar-items>\r\n </v-toolbar>\r\n \r\n <div class=\"pdf-viewer-content\">\r\n <div class=\"pdf-container\" ref=\"pdfContainer\">\r\n <!-- PDF内容将通过PDF.js渲染 -->\r\n <div id=\"pdf-viewer\"></div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"pdf-viewer-footer\" v-if=\"pdfLoaded\">\r\n <VRow align=\"center\" justify=\"center\">\r\n <VCol cols=\"12\" sm=\"6\" class=\"d-flex justify-center\">\r\n <VBtn icon @click=\"prevPage\" :disabled=\"currentPage <= 1\">\r\n <VIcon>mdi-chevron-left</VIcon>\r\n </VBtn>\r\n <div class=\"mx-4\">\r\n <span>第 {{ currentPage }} 页 / 共 {{ pageCount }} 页</span>\r\n </div>\r\n <VBtn icon @click=\"nextPage\" :disabled=\"currentPage >= pageCount\">\r\n <VIcon>mdi-chevron-right</VIcon>\r\n </VBtn>\r\n </VCol>\r\n <VCol cols=\"12\" sm=\"6\" class=\"d-flex justify-center\">\r\n <VSlider\r\n v-model=\"currentPage\"\r\n :min=\"1\"\r\n :max=\"pageCount\"\r\n hide-details\r\n class=\"mx-4\"\r\n ></VSlider>\r\n </VCol>\r\n </VRow>\r\n </div>\r\n \r\n <div class=\"pdf-loading\" v-if=\"loading\">\r\n <v-progress-circular indeterminate color=\"red\"></v-progress-circular>\r\n <p class=\"mt-2\">正在加载PDF...</p>\r\n </div>\r\n </VCard>\r\n </VDialog>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, onMounted, onBeforeUnmount } from 'vue';\r\n// import * as pdfjsLib from 'pdfjs-dist';\r\n// 注意:在实际项目中,您需要安装 pdfjs-dist 库\r\n// npm install pdfjs-dist\r\n// import * as pdfjsLib from 'pdfjs-dist';\r\n\r\ndefineOptions({\r\n name: 'VtkPdf',\r\n inheritAttrs: true\r\n});\r\n\r\nconst props = defineProps({\r\n src: {\r\n type: String,\r\n default: null,\r\n },\r\n preview: {\r\n type: Boolean,\r\n default: true\r\n },\r\n title: {\r\n type: String,\r\n default: ''\r\n },\r\n description: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否显示标题\r\n showTitle: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 是否显示描述\r\n showDescription: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 封面宽高比\r\n aspectRatio: {\r\n type: [String, Number],\r\n default: 16/9\r\n }\r\n});\r\n\r\n// 预览状态\r\nconst showPreview = ref(false);\r\n// PDF相关状态\r\nconst loading = ref(false);\r\nconst pdfLoaded = ref(false);\r\nconst currentPage = ref(1);\r\nconst pageCount = ref(0);\r\nconst pdfContainer = ref(null);\r\n\r\n// PDF对象(实际使用时需要引入pdfjsLib)\r\nlet pdfDoc = null;\r\n\r\n// 使用计算属性处理带token的URL\r\nconst srcWithToken = computed(() => {\r\n if (!props.src) return props.src;\r\n \r\n try {\r\n // 首先尝试使用 $vtk.storage\r\n if (window.$vtk && typeof window.$vtk.storage?.get === 'function') {\r\n const token = window.$vtk.storage.get('_mis_acis_token');\r\n return token ? `${props.src}?stoken=${token}` : props.src;\r\n }\r\n // 如果 $vtk 不存在,尝试从 localStorage 获取 token\r\n else {\r\n const token = localStorage.getItem('_mis_acis_token');\r\n return token ? `${props.src}?stoken=${token}` : props.src;\r\n }\r\n } catch (error) {\r\n // 发生错误时返回原始src\r\n console.warn('VtkPdf: Failed to get token, using src without token', error);\r\n return props.src;\r\n }\r\n});\r\n\r\n// 打开预览\r\nconst openPreview = () => {\r\n if (props.preview) {\r\n showPreview.value = true;\r\n // 延迟加载PDF以确保DOM已准备好\r\n setTimeout(() => {\r\n loadPdf();\r\n }, 300);\r\n }\r\n};\r\n\r\n// 关闭预览\r\nconst closePreview = () => {\r\n showPreview.value = false;\r\n // 清理PDF对象\r\n pdfDoc = null;\r\n pdfLoaded.value = false;\r\n currentPage.value = 1;\r\n pageCount.value = 0;\r\n};\r\n\r\n// 加载PDF(示例实现,实际使用需要PDF.js库)\r\nconst loadPdf = async () => {\r\n if (!srcWithToken.value) return;\r\n \r\n loading.value = true;\r\n \r\n try {\r\n // 模拟PDF加载(实际实现需要使用PDF.js)\r\n /*\r\n // 实际使用时的代码示例:\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = '//cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.worker.min.js';\r\n \r\n const loadingTask = pdfjsLib.getDocument(srcWithToken.value);\r\n pdfDoc = await loadingTask.promise;\r\n pageCount.value = pdfDoc.numPages;\r\n pdfLoaded.value = true;\r\n \r\n // 渲染第一页\r\n renderPage(currentPage.value);\r\n */\r\n \r\n // 模拟加载过程\r\n await new Promise(resolve => setTimeout(resolve, 1000));\r\n pageCount.value = 10; // 模拟10页PDF\r\n pdfLoaded.value = true;\r\n } catch (error) {\r\n console.error('加载PDF失败:', error);\r\n } finally {\r\n loading.value = false;\r\n }\r\n};\r\n\r\n// 渲染PDF页面(示例实现)\r\nconst renderPage = async (pageNum) => {\r\n if (!pdfDoc || !pdfContainer.value) return;\r\n \r\n try {\r\n /*\r\n // 实际使用时的代码示例:\r\n const page = await pdfDoc.getPage(pageNum);\r\n const viewport = page.getViewport({ scale: 1.5 });\r\n \r\n // 准备canvas\r\n const canvas = document.createElement('canvas');\r\n const context = canvas.getContext('2d');\r\n canvas.height = viewport.height;\r\n canvas.width = viewport.width;\r\n \r\n // 清空容器\r\n pdfContainer.value.innerHTML = '';\r\n pdfContainer.value.appendChild(canvas);\r\n \r\n // 渲染页面\r\n const renderContext = {\r\n canvasContext: context,\r\n viewport: viewport\r\n };\r\n await page.render(renderContext).promise;\r\n */\r\n } catch (error) {\r\n console.error('渲染PDF页面失败:', error);\r\n }\r\n};\r\n\r\n// 上一页\r\nconst prevPage = () => {\r\n if (currentPage.value > 1) {\r\n currentPage.value--;\r\n renderPage(currentPage.value);\r\n }\r\n};\r\n\r\n// 下一页\r\nconst nextPage = () => {\r\n if (currentPage.value < pageCount.value) {\r\n currentPage.value++;\r\n renderPage(currentPage.value);\r\n }\r\n};\r\n\r\n// 下载PDF\r\nconst downloadPdf = async () => {\r\n if (!srcWithToken.value) return;\r\n \r\n try {\r\n // 获取PDF文件的二进制数据\r\n const response = await fetch(srcWithToken.value);\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n \r\n const blob = await response.blob();\r\n const fileName = props.title && props.title.trim() !== '' \r\n ? `${props.title}.pdf` \r\n : 'document.pdf';\r\n \r\n // 创建下载链接\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n \r\n // 清理\r\n document.body.removeChild(link);\r\n window.URL.revokeObjectURL(url);\r\n } catch (error) {\r\n console.error('下载PDF失败:', error);\r\n // 备用方案:在新窗口打开\r\n window.open(srcWithToken.value, '_blank');\r\n }\r\n};\r\n\r\n// 监听页码变化\r\nconst handlePageChange = (newPage) => {\r\n if (newPage >= 1 && newPage <= pageCount.value) {\r\n renderPage(newPage);\r\n }\r\n};\r\n\r\n// 监听 currentPage 变化\r\n// 在实际实现中,您需要使用 watch 监听 currentPage 变化\r\n// watch(currentPage, handlePageChange);\r\n\r\n// 组件销毁前清理\r\nonBeforeUnmount(() => {\r\n pdfDoc = null;\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-pdf-container {\r\n position: relative;\r\n display: inline-block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.vtk-pdf-card {\r\n height: 100%;\r\n}\r\n\r\n.vtk-pdf-card--preview {\r\n cursor: pointer;\r\n transition: transform 0.2s ease-in-out;\r\n}\r\n\r\n.vtk-pdf-card--preview:hover {\r\n transform: translateY(-5px);\r\n}\r\n\r\n.vtk-pdf-cover {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: #f5f5f5;\r\n border: 1px solid #ddd;\r\n width: 100%;\r\n}\r\n\r\n.vtk-pdf-label {\r\n margin-top: 8px;\r\n font-weight: 500;\r\n color: #666;\r\n}\r\n\r\n.vtk-pdf-info {\r\n padding: 0;\r\n}\r\n\r\n.vtk-pdf-title {\r\n word-break: break-word;\r\n}\r\n\r\n.vtk-pdf-description {\r\n word-break: break-word;\r\n}\r\n\r\n/* PDF查看器样式 */\r\n.pdf-viewer-card {\r\n background-color: #e0e0e0;\r\n color: #333;\r\n}\r\n\r\n.pdf-viewer-content {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: calc(100vh - 150px);\r\n position: relative;\r\n background-color: #555;\r\n overflow: auto;\r\n}\r\n\r\n.pdf-container {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n#pdf-viewer {\r\n max-width: 100%;\r\n max-height: 100%;\r\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\r\n background-color: white;\r\n /* 实际PDF内容将在此处渲染 */\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 500px;\r\n min-width: 400px;\r\n}\r\n\r\n.pdf-viewer-footer {\r\n padding: 16px;\r\n background-color: #f5f5f5;\r\n border-top: 1px solid #ddd;\r\n}\r\n\r\n.pdf-loading {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: rgba(255, 255, 255, 0.9);\r\n padding: 20px;\r\n border-radius: 8px;\r\n z-index: 100;\r\n}\r\n</style>","// composables/useMixins.js\r\nimport { ref, reactive } from 'vue'\r\nimport Request from '../commons/request.js'\r\nimport Message from '../components/message/index.js'\r\nimport storage from '../commons/storage.js'\r\n\r\n/**\r\n * 通用 mixins composable\r\n * @param {Object} urlConfig - URL 配置对象\r\n * @returns {Object} 包含所有状态和方法的对象\r\n */\r\nexport function useMixins(urlConfig = {}) {\r\n // 响应式数据\r\n const queryParam = reactive({})\r\n const desserts = ref([])\r\n const loading = ref(false)\r\n const superQueryParams = ref('')\r\n const page = reactive({\r\n pageno: 1,\r\n limit: 10\r\n })\r\n const pageData = ref({})\r\n const sumup = ref({})\r\n const pageDataCopy = ref([])\r\n const overlay = ref(false)\r\n const user = ref({})\r\n\r\n // URL 配置\r\n const url = reactive(urlConfig)\r\n\r\n /**\r\n * 获取查询参数\r\n * @returns {Object} 查询参数对象\r\n */\r\n const getQueryParams = () => {\r\n user.value = storage.get('_mis_acis_users')\r\n if (!queryParam.areaCode) {\r\n queryParam.areaCode = user.value?.areacode\r\n }\r\n const codex = Object.assign({}, queryParam)\r\n const params = {\r\n pageno: page.pageno,\r\n limit: page.limit,\r\n codex: codex\r\n }\r\n return params\r\n }\r\n\r\n /**\r\n * 加载页面数据\r\n */\r\n const loadPage = () => {\r\n if (!url.list) {\r\n Message.toast('请先设置url.list属性', { color: 'warning' })\r\n return\r\n }\r\n const params = getQueryParams()\r\n loading.value = true\r\n\r\n // 兼容处理 vtk 对象\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.show()\r\n }\r\n\r\n Request.postJson(url.list, params)\r\n .then((res) => {\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n\r\n if (res.meta.success || res.data) {\r\n desserts.value = res.data?.rows || []\r\n pageData.value = res.data\r\n sumup.value = res.data.sumup ? res.data.sumup : {}\r\n pageDataCopy.value = res.data\r\n }\r\n loading.value = false\r\n })\r\n .catch((error) => {\r\n console.error('加载页面数据失败:', error)\r\n loading.value = false\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 搜索查询\r\n */\r\n const searchQuery = () => {\r\n page.pageno = 1\r\n page.limit ??= 10\r\n loadPage()\r\n }\r\n\r\n /**\r\n * 分页变化处理\r\n * @param {Object} pageInfo - 分页信息\r\n */\r\n const getListPage = (pageInfo) => {\r\n page.pageno = pageInfo.pageno\r\n page.limit = pageInfo.limit\r\n loadPage()\r\n }\r\n\r\n /**\r\n * 删除项\r\n * @param {string|number} id - 要删除的项ID\r\n * @param {string} text - 确认提示文本\r\n */\r\n const deleteItem = (id, text) => {\r\n if (!url.delete) {\r\n Message.toast('请设置url.delete属性!', { color: 'warning' })\r\n return\r\n }\r\n\r\n Message.confirm(\r\n { title: '确认删除', text: text ? text : '是否删除?' },\r\n (result) => {\r\n if (result) {\r\n Request.getForm(url.delete, { id: id })\r\n .then((res) => {\r\n if (res.meta.success) {\r\n Message.toast('删除成功', { color: 'success' })\r\n loadPage()\r\n } else {\r\n Message.toast('删除失败', { color: 'warning' })\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('删除失败:', error)\r\n Message.toast('删除失败', { color: 'warning' })\r\n })\r\n }\r\n }\r\n )\r\n }\r\n\r\n /**\r\n * 复制项\r\n * @param {string|number} id - 要复制的项ID\r\n * @param {string} text - 确认提示文本\r\n */\r\n const copyItem = (id, text) => {\r\n if (!url.copy) {\r\n Message.toast('请设置url.copy!', { color: 'warning' })\r\n return\r\n }\r\n\r\n Message.confirm(\r\n { title: '拷贝', text: text ? text : '是否确认拷贝当前数据?' },\r\n (result) => {\r\n if (result) {\r\n Request.getForm(url.copy, { id: id })\r\n .then((res) => {\r\n if (res.meta.success) {\r\n Message.toast('拷贝成功', { color: 'success' })\r\n loadPage()\r\n } else {\r\n Message.toast('拷贝失败', { color: 'warning' })\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('拷贝失败:', error)\r\n Message.toast('拷贝失败', { color: 'warning' })\r\n })\r\n }\r\n }\r\n )\r\n }\r\n\r\n /**\r\n * 编辑项\r\n * @param {Object} record - 要编辑的记录\r\n * @param {Object} modalFormRef - 模态框引用\r\n */\r\n const edit = (record, modalFormRef) => {\r\n if (modalFormRef?.value) {\r\n modalFormRef.value.edit(record)\r\n }\r\n }\r\n\r\n /**\r\n * 添加新项\r\n * @param {Object} modalFormRef - 模态框引用\r\n */\r\n const add = (modalFormRef) => {\r\n if (modalFormRef?.value) {\r\n modalFormRef.value.add()\r\n }\r\n }\r\n\r\n /**\r\n * 模态框确认回调\r\n */\r\n const modalFormOk = () => {\r\n loadPage()\r\n }\r\n\r\n /**\r\n * 导出数据\r\n */\r\n const expData = () => {\r\n overlay.value = true\r\n\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.show()\r\n }\r\n\r\n const params = getQueryParams()\r\n Request.exp(url.exp, params)\r\n .then((res) => {\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n\r\n if (res) {\r\n const disposition = res.headers['content-disposition']\r\n const filename = decodeURI(\r\n disposition.substring(\r\n disposition.indexOf('filename=') + 9,\r\n disposition.length\r\n )\r\n )\r\n const blob = new Blob([res.data], {\r\n type: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\r\n })\r\n\r\n if (window.navigator.msSaveOrOpenBlob) {\r\n navigator.msSaveBlob(blob)\r\n } else {\r\n const link = document.createElement('a')\r\n link.style.display = 'none'\r\n link.href = URL.createObjectURL(blob)\r\n link.download = filename\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n }\r\n }\r\n overlay.value = false\r\n })\r\n .catch((error) => {\r\n console.error('导出数据失败:', error)\r\n overlay.value = false\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 重置查询参数\r\n */\r\n const resetQueryParams = () => {\r\n Object.keys(queryParam).forEach(key => {\r\n delete queryParam[key]\r\n })\r\n }\r\n\r\n /**\r\n * 重置分页\r\n */\r\n const resetPage = () => {\r\n page.pageno = 1\r\n page.limit = 10\r\n }\r\n\r\n /**\r\n * 更新 URL 配置\r\n * @param {Object} newUrlConfig - 新的 URL 配置\r\n */\r\n const updateUrlConfig = (newUrlConfig) => {\r\n Object.assign(url, newUrlConfig)\r\n }\r\n\r\n // 返回所有状态和方法\r\n return {\r\n // 响应式数据\r\n queryParam,\r\n desserts,\r\n loading,\r\n superQueryParams,\r\n page,\r\n pageData,\r\n sumup,\r\n pageDataCopy,\r\n overlay,\r\n user,\r\n url,\r\n\r\n // 方法\r\n getQueryParams,\r\n loadPage,\r\n searchQuery,\r\n getListPage,\r\n deleteItem,\r\n copyItem,\r\n edit,\r\n add,\r\n modalFormOk,\r\n expData,\r\n resetQueryParams,\r\n resetPage,\r\n updateUrlConfig\r\n }\r\n}\r\n\r\n// 默认导出保持向后兼容\r\nexport default useMixins","<template>\r\n\t<VContainer fluid class=\"vtk-height pa-0\">\r\n\t\t<VTabs v-model=\"examType\" bg-color=\"transparent\" height=\"38\" style=\"width: 100%\">\r\n\t\t\t<VTab @click=\"examAll()\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-clipboard-arrow-up</VIcon>全部</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"list\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-star-circle</VIcon>审核</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"tip\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-hand-heart</VIcon>实施</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"tip\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-comment-minus</VIcon>评价</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"tip\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-credit-card-check</VIcon>支付</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VSpacer />\r\n\t\t</VTabs>\r\n\t\t<VCard elevation=\"0\" style=\"min-height: calc(100% - 38px)\">\r\n\t\t\t<VCardTitle style=\"height: 88px\">\r\n\t\t\t\t<VMenu v-if=\"examType == '0' && (expShow || user.grole >= 2)\" offset-y :close-on-content-click=\"false\" location=\"bottom\">\r\n\t\t\t\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t\t\t\t<VBtn @click=\"exv\" v-bind=\"props\" class=\"bg-orange text-white mr-3\" elevation=\"0\">\r\n\t\t\t\t\t\t\t<VIcon>mdi-export-variant</VIcon> 导出\r\n\t\t\t\t\t\t</VBtn>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<VCard class=\"pa-3\" width=\"300\">\r\n\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t<p class=\"mb-2 font-weight-bold\">公共字段</p>\r\n\t\t\t\t\t\t\t<p class=\"text-caption\">\r\n\t\t\t\t\t\t\t\t服务事项\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t所属区县\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t所属镇街\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t所属社区\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t申请人证件号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t申请人姓名\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t残疾人证号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t性别\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t申请人手机号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t补助金额\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t开户银行\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t银行卡号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t收款人姓名\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t收款人证件号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t状态\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t<VDivider />\r\n\t\t\t\t\t\t\t<div v-if=\"queryParam.servState == '1' && projName\">\r\n\t\t\t\t\t\t\t\t<VCardTitle class=\"pa-0 text-body-1 mb-2 pt-3\">\r\n\t\t\t\t\t\t\t\t\t<VCheckbox @update:model-value=\"chkAll\" v-model=\"select\" class=\"mt-n1\" hide-details>\r\n\t\t\t\t\t\t\t\t\t\t<template v-slot:append>\r\n\t\t\t\t\t\t\t\t\t\t\t<VIcon class=\"active\" style=\"display: none\" size=\"18\">mdi-check-circle</VIcon>\r\n\t\t\t\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t\t\t</VCheckbox>\r\n\t\t\t\t\t\t\t\t\t<span class=\"font-weight-bold ml-n2\">拓展字段</span>\r\n\t\t\t\t\t\t\t\t\t<VSpacer />\r\n\t\t\t\t\t\t\t\t</VCardTitle>\r\n\t\t\t\t\t\t\t\t<p v-if=\"formArr?.length > 0\" class=\"mb-0 expBox\">\r\n\t\t\t\t\t\t\t\t\t<VCheckbox\r\n\t\t\t\t\t\t\t\t\t\tv-for=\"(item, index) in formArr\"\r\n\t\t\t\t\t\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\t\t\t\t\t\tv-model=\"expArr\"\r\n\t\t\t\t\t\t\t\t\t\t:label=\"item.label\"\r\n\t\t\t\t\t\t\t\t\t\t:value=\"{ name: item.name, valu: `${item.label}${item.valu && item.valu.includes('/') && item.valu.includes(':') ? `(${item.valu})` : ''}` }\"\r\n\t\t\t\t\t\t\t\t\t\tclass=\"mt-2\"\r\n\t\t\t\t\t\t\t\t\t\tmultiple\r\n\t\t\t\t\t\t\t\t\t\thide-details>\r\n\t\t\t\t\t\t\t\t\t\t<template v-slot:append>\r\n\t\t\t\t\t\t\t\t\t\t\t<VIcon class=\"active\" style=\"display: none\" size=\"18\">mdi-check-circle</VIcon>\r\n\t\t\t\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t\t\t</VCheckbox>\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<p v-else class=\"text-red text-body-2 mb-2\">{{ projTip }}</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div v-else>\r\n\t\t\t\t\t\t\t\t<p class=\"mb-3 pt-3 font-weight-bold\">导出提示</p>\r\n\t\t\t\t\t\t\t\t<p :class=\"queryParam.servState == '1' ? 'text-green' : 'text-red'\" class=\"mb-3 text-body-2\">\r\n\t\t\t\t\t\t\t\t\t<VIcon size=\"20\" :color=\"queryParam.servState == '1' ? 'green' : 'red'\">{{ queryParam.servState == \"1\" ? \"mdi-progress-check\" : \"mdi-progress-close\" }}</VIcon>\r\n\t\t\t\t\t\t\t\t\t导出数据仅限已服务信息\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<p class=\"mb-2 text-body-2\" :class=\"projName ? 'text-green' : 'text-red'\">\r\n\t\t\t\t\t\t\t\t\t<VIcon size=\"20\" :color=\"projName ? 'green' : 'red'\">{{ projName ? \"mdi-progress-check\" : \"mdi-progress-close\" }}</VIcon>\r\n\t\t\t\t\t\t\t\t\t至少选择一个服务事项导出\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<VBtn @click=\"exp\" :disabled=\"!(projName && queryParam.servState == '1')\" elevation=\"0\" color=\"primary\" class=\"vtk-width mt-3\" size=\"small\">确认导出</VBtn>\r\n\t\t\t\t\t</VCard>\r\n\t\t\t\t</VMenu>\r\n\t\t\t\t<VSpacer />\r\n\t\t\t\t<vtk-search v-model=\"queryParam\" @search=\"searchQuery\" placeholder=\"输入姓名/身份证查询\" :styles=\"'width:320px'\">\r\n\t\t\t\t\t<VTextField @click=\"searchProj\" v-model=\"projName\" :title=\"projName\" clearable readonly variant=\"outlined\" placeholder=\"服务事项\" density=\"compact\" hide-details class=\"my-3\"></VTextField>\r\n\t\t\t\t\t<vtk-area-tabs v-model=\"queryParam.areaCode\" :styles=\"'width:100%'\" />\r\n\t\t\t\t\t<div v-if=\"examType == 0\" style=\"width: 400px\">\r\n\t\t\t\t\t\t<vtk-select v-model=\"queryParam.servState\" @change=\"searchQuery\" placeholder=\"服务状态\" list=\"0:服务中/1:已服务\" class=\"mt-3 d-inline-block mr-3 mb-3\" style=\"width: calc(50% - 6px)\" hide-details density=\"compact\" variant=\"outlined\" clearable></vtk-select>\r\n\t\t\t\t\t\t<vtk-select v-model=\"queryParam.rateState\" @change=\"searchQuery\" placeholder=\"是否评价\" list=\"0:未评价/1:已评价\" class=\"mt-3 d-inline-block\" style=\"width: calc(50% - 6px)\" hide-details density=\"compact\" variant=\"outlined\" clearable></vtk-select>\r\n\t\t\t\t\t\t<VMenu v-model=\"menu\" :close-on-content-click=\"false\" transition=\"scale-transition\" location=\"bottom\" max-width=\"290px\" min-width=\"auto\">\r\n\t\t\t\t\t\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t\t\t\t\t\t<VTextField v-model=\"queryParam.servFtime0\" placeholder=\"开始时间\" persistent-hint append-icon=\"mdi-calendar\" class=\"d-inline-block\" style=\"width: calc(50% - 16px)\" hide-details variant=\"outlined\" density=\"compact\" v-bind=\"props\"></VTextField>\r\n\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t<VDatePicker v-model=\"queryParam.servFtime0\" title=\"\" @update:model-value=\"menu = false\" view-mode=\"month\" :max=\"queryParam.servFtime1\"></VDatePicker>\r\n\t\t\t\t\t\t</VMenu>\r\n\t\t\t\t\t\t<span class=\"mx-2\">至</span>\r\n\t\t\t\t\t\t<VMenu v-model=\"menu1\" :close-on-content-click=\"false\" transition=\"scale-transition\" location=\"bottom\" max-width=\"290px\" min-width=\"auto\">\r\n\t\t\t\t\t\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t\t\t\t\t\t<VTextField v-model=\"queryParam.servFtime1\" placeholder=\"结束时间\" persistent-hint append-icon=\"mdi-calendar\" class=\"d-inline-block\" style=\"width: calc(50% - 15px)\" hide-details variant=\"outlined\" density=\"compact\" v-bind=\"props\"></VTextField>\r\n\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t<VDatePicker v-model=\"queryParam.servFtime1\" title=\"\" @update:model-value=\"menu1 = false\" view-mode=\"month\" :min=\"queryParam.servFtime0\"></VDatePicker>\r\n\t\t\t\t\t\t</VMenu>\r\n\t\t\t\t\t\t<vtk-select v-if=\"queryParam.servState == '1'\" @change=\"searchQuery\" v-model=\"queryParam.state\" class=\"mt-3\" placeholder=\"状态\" list=\"1:已通过/0:未通过\" hide-details density=\"compact\" variant=\"outlined\" clearable></vtk-select>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</vtk-search>\r\n\t\t\t</VCardTitle>\r\n\t\t\t<VCardText>\r\n\t\t\t\t<VDataTable :headers=\"headers\" :items=\"desserts\" :loading=\"loading\" disable-pagination loading-text=\"数据加载中...\" class=\"elevation-0\" hide-default-footer>\r\n\t\t\t\t\t<template v-slot:[`item.objsName`]=\"{ item }\">\r\n\t\t\t\t\t\t<div class=\"py-3\" @click=\"toView(item)\">\r\n\t\t\t\t\t\t\t<p class=\"vtk-cursor-pointer text-body-1 font-weight-bold mb-2\">\r\n\t\t\t\t\t\t\t\t{{ item.objsName }}<span class=\"ml-3 text-grey\">{{ formatIdCard(item.objsCode) }} </span>\r\n\t\t\t\t\t\t\t\t<VChip class=\"ml-2\" :class=\"getServStateClass(item.servState)\" size=\"small\" label>{{ getServStateText(item.servState) }} </VChip>\r\n\t\t\t\t\t\t\t\t<VChip class=\"ml-2\" :class=\"getRateStateClass(item.rateState)\" size=\"small\" label>{{ getRateStateText(item.rateState) }} </VChip>\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t<VChip class=\"bg-orange-lighten-5 text-orange\" size=\"small\" label> 事项编码:{{ item.projCode }} </VChip>\r\n\t\t\t\t\t\t\t\t<VChip class=\"text-primary ml-2\" size=\"small\" label> 办件编号:{{ item.inst }} </VChip>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<div class=\"mb-0 mt-2 text-grey\">\r\n\t\t\t\t\t\t\t\t<div class=\"d-inline-block\" style=\"min-width: 320px\">\r\n\t\t\t\t\t\t\t\t\t服务名称:<span class=\"text-blue\">{{ item.projName }}</span>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<span>补助金额:{{ item.servAmts }}元</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<VRow class=\"py-2\" style=\"color: #979797c2\">\r\n\t\t\t\t\t\t\t\t<VCol style=\"max-width: 320px\">\r\n\t\t\t\t\t\t\t\t\t<span :title=\"item.name\" class=\"d-block\" style=\"color: #979797c2\">申请途径:{{ getServFromText(item.servFrom) }}</span>\r\n\t\t\t\t\t\t\t\t</VCol>\r\n\t\t\t\t\t\t\t\t<VCol>\r\n\t\t\t\t\t\t\t\t\t<span :title=\"item.name\" class=\"d-block\" style=\"color: #979797c2\">申请时间:{{ formatDate(item.servCtime) }}</span>\r\n\t\t\t\t\t\t\t\t</VCol>\r\n\t\t\t\t\t\t\t</VRow>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<template v-slot:[`item.actions`]=\"{ item }\">\r\n\t\t\t\t\t\t<a v-if=\"item.state != 0 && user.areacode?.length == 6 && item.servState == '1'\" @click=\"del(item)\" class=\"text-error\" text>作废</a>\r\n\t\t\t\t\t\t<div v-if=\"item.state == 0\" class=\"state_btg text-right\"></div>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<template v-slot:no-data>\r\n\t\t\t\t\t\t<vtk-empty />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</VDataTable>\r\n\t\t\t\t<vtk-page :page-sizes=\"[10, 20]\" :page-data=\"pageData\" @pageChange=\"getListPage\" />\r\n\t\t\t</VCardText>\r\n\t\t</VCard>\r\n\t\t<!-- 服务事项 -->\r\n\t\t<vtk-proj ref=\"MprojRef\" @toPage=\"toPage\" />\r\n\t\t<!-- 删除服务 -->\r\n\t\t<VDialog v-model=\"dialog\" persistent max-width=\"500\">\r\n\t\t\t<VCard>\r\n\t\t\t\t<VCardTitle>作废</VCardTitle>\r\n\t\t\t\t<VCardText class=\"pb-0\">\r\n\t\t\t\t\t服务作废后将无法恢复,请谨慎操作!!!\r\n\t\t\t\t\t<VTextarea v-model=\"delNote\" variant=\"outlined\" label=\"请填写作废原因\" class=\"mt-3\" hide-details density=\"compact\"></VTextarea>\r\n\t\t\t\t</VCardText>\r\n\t\t\t\t<VCardActions>\r\n\t\t\t\t\t<VSpacer />\r\n\t\t\t\t\t<VBtn @click=\"dialog = false\" variant=\"text\">取消</VBtn>\r\n\t\t\t\t\t<VBtn @click=\"delSave(true)\" variant=\"text\">确定</VBtn>\r\n\t\t\t\t</VCardActions>\r\n\t\t\t</VCard>\r\n\t\t</VDialog>\r\n\t</VContainer>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, watch, onActivated } from 'vue';\r\nimport { useMixins } from '../../composables/useMixins'\r\nimport Request from '../../commons/request';\r\n\r\n// 定义组件选项\r\ndefineOptions({\r\n\tname: 'VtkProj',\r\n\tinheritAttrs: false,\r\n});\r\n\r\n// 表单列表 URL 配置\r\nconst urlConfig = {\r\n\tlist: '/kudas/xfwez/page',\r\n\texp: '/kudas/xfwez/exp',\r\n\tdelete: '/kudas/xfwez/delete'\r\n};\r\n\r\n// 使用 mixins composable\r\nconst {\r\n\tpageData,\r\n\tgetListPage,\r\n\tloadPage,\r\n\texpData,\r\n\tdesserts,\r\n\tloading,\r\n\tqueryParam: mixinQueryParam,\r\n\turl\r\n} = useMixins(urlConfig);\r\n\r\n// 合并 queryParam\r\nObject.assign(mixinQueryParam, {});\r\nconst queryParam = mixinQueryParam;\r\n\r\n// 响应式数据\r\nconst user = ref({});\r\nconst examType = ref(1);\r\n\r\nconst headers = ref([\r\n\t{ title: '事项', key: 'objsName', sortable: false },\r\n\t{ title: '状态', key: 'actions', sortable: false, align: 'end' },\r\n]);\r\n\r\n// 主题筛选\r\nconst permits = ref([]);\r\nconst projName = ref('');\r\nconst projTip = ref('');\r\nconst bizType = ref('');\r\nconst expShow = ref(false);\r\nconst menu = ref(false);\r\nconst menu1 = ref(false);\r\n\r\n// 导出\r\nconst expArr = ref([]);\r\nconst formArr = ref([]);\r\nconst select = ref(false);\r\nconst selectAll = ref([]);\r\n\r\n// 删除\r\nconst dialog = ref(false);\r\nconst delItem = ref({});\r\nconst delNote = ref('');\r\n\r\n// ref\r\nconst MprojRef = ref(null);\r\n\r\n// 监听器\r\nwatch(expArr, (newVal) => {\r\n\tif (newVal.length < selectAll.value.length) {\r\n\t\tselect.value = false;\r\n\t}\r\n}, { deep: true });\r\n\r\n// 生命周期\r\nonActivated(() => {\r\n\talert('onActivated');\r\n\tlist();\r\n\t// 监听接收消息,刷新页面\r\n\twindow.addEventListener('storage', (event) => {\r\n\t\tif (JSON.parse(event?.newValue)?.fwez) {\r\n\t\t\texamType.value == '0' ? examAll() : loadPage();\r\n\t\t}\r\n\t});\r\n});\r\n\r\n// 方法\r\n// 全选\r\nconst chkAll = (e) => {\r\n\texpArr.value = e ? selectAll.value : [];\r\n};\r\n\r\nconst list = () => {\r\n\tbizType.value = '';\r\n\texpShow.value = false;\r\n\tuser.value = getUserInfo();\r\n\tpermits.value = [];\r\n\tuser.value.permits?.forEach((e) => {\r\n\t\tif (e.permNkey.includes('biz_type')) {\r\n\t\t\tpermits.value.push(e);\r\n\t\t\tbizType.value = bizType.value + e.permNkey.slice(9) + ',';\r\n\t\t} else if (e.permNkey == 'btn_expo') {\r\n\t\t\texpShow.value = true;\r\n\t\t}\r\n\t});\r\n\tqueryParam.bizType = bizType.value;\r\n\texamWait();\r\n};\r\n\r\n// 获取用户信息\r\nconst getUserInfo = () => {\r\n\ttry {\r\n\t\t// 实际项目中从存储或状态管理获取\r\n\t\treturn window.$vtk?.storage?.get('_mis_acis_users') || {};\r\n\t} catch (error) {\r\n\t\tconsole.warn('获取用户信息失败:', error);\r\n\t\treturn {};\r\n\t}\r\n};\r\n\r\n// 待审\r\nconst examWait = () => {\r\n\texamType.value = 1;\r\n\tqueryParam.operateLeve = user.value.areacode?.length;\r\n\tqueryParam.servState = '0';\r\n\tloadPage();\r\n};\r\n\r\n// 全部审核\r\nconst examAll = () => {\r\n\texamType.value = 0;\r\n\tdelete queryParam.operateLeve;\r\n\tdelete queryParam.servState;\r\n\tloadPage();\r\n};\r\n\r\n// 审核\r\nconst toView = (item) => {\r\n\tconst url = item.servState == 1\r\n\t\t? `#/mino/suse/view/${item.inst}?ddtab=true`\r\n\t\t: `#/mino/suse/exam/${item.inst}?ddtab=true`;\r\n\twindow.open(url);\r\n};\r\n\r\n// 服务事项查询/筛选\r\nconst searchProj = () => {\r\n\tMprojRef.value?.add(queryParam.projCode);\r\n};\r\n\r\nconst toPage = (param) => {\r\n\tprojName.value = param.projName;\r\n\tqueryParam.projCode = param.projCode;\r\n\tdelete queryParam.bizType;\r\n\tsearchQuery();\r\n};\r\n\r\nconst searchQuery = () => {\r\n\t// 搜索查询逻辑\r\n\tloadPage();\r\n};\r\n\r\n// 导出相关\r\nconst exv = () => {\r\n\tif (projName.value && queryParam.servState == '1') {\r\n\t\texpArr.value = [];\r\n\t\tformArr.value = [];\r\n\t\t// 显示加载状态\r\n\t\tRequest.postJson('/kudas/xfwez/exv', { codex: queryParam }).then((res) => {\r\n\t\t\tif (res.meta.success) {\r\n\t\t\t\tJSON.parse(res.data.formJson).forEach((item) => {\r\n\t\t\t\t\tif (['text', 'radio', 'number', 'time', 'checkbox', 'textarea', 'select'].includes(item.type)) {\r\n\t\t\t\t\t\titem.value = {\r\n\t\t\t\t\t\t\tname: item.name,\r\n\t\t\t\t\t\t\tvalu: `${item.label}${item.valu && item.valu.includes('/') && item.valu.includes(':') ? `(${item.valu})` : ''}`\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\tformArr.value.push(item);\r\n\t\t\t\t\t\tselectAll.value.push(item.value);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tprojTip.value = res.meta.message;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n};\r\n\r\nconst exp = () => {\r\n\tqueryParam.fields = expArr.value;\r\n\texpData();\r\n};\r\n\r\n// 服务作废\r\nconst del = (item) => {\r\n\tdialog.value = true;\r\n\tdelItem.value = item;\r\n\tdelNote.value = '';\r\n};\r\n\r\nconst delSave = () => {\r\n\tif (delNote.value) {\r\n\t\tRequest.postForm(url.delete, { id: delItem.value.id, note: delNote.value }).then((res) => {\r\n\t\t\tif (res.meta.success) {\r\n\t\t\t\t// 显示成功消息\r\n\t\t\t\tdialog.value = false;\r\n\t\t\t\tloadPage();\r\n\t\t\t} else {\r\n\t\t\t\t// 显示失败消息\r\n\t\t\t}\r\n\t\t});\r\n\t} else {\r\n\t\t// 显示错误消息\r\n\t}\r\n};\r\n\r\n// 提示\r\nconst tip = () => {\r\n\t// 显示应用开发中的消息\r\n};\r\n\r\n// 工具函数\r\nconst formatIdCard = (idcard) => {\r\n\tif (!idcard) return '';\r\n\treturn idcard.replace(/^(.{6})(?:\\d+)(.{4})$/, '$1********$2');\r\n};\r\n\r\nconst formatDate = (dateStr) => {\r\n\tif (!dateStr) return '';\r\n\tconst date = new Date(dateStr);\r\n\treturn `${date.getFullYear()}年${String(date.getMonth() + 1).padStart(2, '0')}月${String(date.getDate()).padStart(2, '0')}日 ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`;\r\n};\r\n\r\nconst getServStateClass = (state) => {\r\n\treturn state == '0' ? 'bg-blue-lighten-5 text-blue' : 'bg-green-lighten-5 text-green';\r\n};\r\n\r\nconst getServStateText = (state) => {\r\n\treturn state == '0' ? '服务中' : '已服务';\r\n};\r\n\r\nconst getRateStateClass = (state) => {\r\n\treturn state == '0' ? 'bg-orange-lighten-5 text-orange' : 'bg-blue-lighten-5 text-blue';\r\n};\r\n\r\nconst getRateStateText = (state) => {\r\n\treturn state == '0' ? '未评价' : '已评价';\r\n};\r\n\r\nconst getServFromText = (from) => {\r\n\tconst fromMap = {\r\n\t\t'100': '特殊渠道',\r\n\t\t'101': '移动端代办',\r\n\t\t'102': '窗口端通办',\r\n\t\t'200': '特殊渠道',\r\n\t\t'210': '浙里办App',\r\n\t\t'211': '浙里办微信小程序',\r\n\t\t'212': '浙里办支付宝小程序',\r\n\t\t'230': '微信小程序',\r\n\t\t'240': '支付宝小程序',\r\n\t\t'250': '自助机',\r\n\t\t'300': '特殊渠道',\r\n\t\t'310': '服务外包代办'\r\n\t};\r\n\treturn fromMap[from] || from;\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.state_btg {\r\n\tpadding-right: 0;\r\n\theight: 100%;\r\n\tbackground: url(../../assets/img/objs_btg.png) no-repeat;\r\n\tbackground-size: 80px;\r\n\tbackground-position: 100% 100%;\r\n}\r\n\r\n:deep(.v-tab) {\r\n\tbackground: url(../../assets/img/tab-2.png) no-repeat;\r\n\tbackground-size: 100% 100%;\r\n\twidth: 150px;\r\n\tmargin-left: -11px;\r\n\tborder-top-left-radius: 20px;\r\n\tborder-top-right-radius: 20px;\r\n\tspan {\r\n\t\tz-index: 99;\r\n\t}\r\n}\r\n\r\n/* Dark theme */\r\n.v-theme--dark {\r\n\t:deep(.v-tab) {\r\n\t\tbackground: url(../../assets/img/tab-4.png) no-repeat;\r\n\t\tbackground-size: 100% 100%;\r\n\t}\r\n\r\n\t:deep(.v-tabs__slider) {\r\n\t\tbackground: url(../../assets/img/tab-3.png) no-repeat !important;\r\n\t\tbackground-size: 100% 100% !important;\r\n\t}\r\n}\r\n\r\n:deep(.v-tab::before),\r\n:deep(.v-tab:focus::before),\r\n:deep(.v-tab:hover::before) {\r\n\tbackground-color: transparent !important;\r\n\topacity: 0 !important;\r\n}\r\n\r\n:deep(.v-tabs__slider) {\r\n\theight: 38px !important;\r\n\tbackground: url(../../assets/img/tab-1.png) no-repeat;\r\n\tbackground-size: 100% 100%;\r\n}\r\n\r\n.expBox {\r\n\t:deep(td) {\r\n\t\tborder-bottom: thin solid rgba(123, 123, 123, 0.22);\r\n\t}\r\n\r\n\t:deep(.v-data-table__empty-wrapper td) {\r\n\t\tborder: none;\r\n\t}\r\n\r\n\t:deep(.v-checkbox.v-selection-control--dirty) {\r\n\t\tbackground-color: rgba(33, 149, 243, 0.06) !important;\r\n\r\n\t\t.v-label {\r\n\t\t\tcolor: rgb(33, 150, 243) !important;\r\n\t\t}\r\n\r\n\t\t.active {\r\n\t\t\tcolor: rgb(33, 150, 243);\r\n\t\t\tdisplay: inline-block !important;\r\n\t\t}\r\n\t}\r\n\r\n\t:deep(.v-selection-control__input) {\r\n\t\tdisplay: none;\r\n\t}\r\n\r\n\t:deep(.v-checkbox) {\r\n\t\tpadding: 4px 8px 4px 10px;\r\n\t\tborder-radius: 6px;\r\n\t\tbackground-color: rgba(117, 117, 117, 0.06);\r\n\r\n\t\t.v-label {\r\n\t\t\tmargin-top: 3px;\r\n\t\t\tfont-size: 12px;\r\n\t\t}\r\n\t}\r\n}\r\n</style>\r\n","<template>\r\n <VRadioGroup v-bind=\"attrs\" :modelValue=\"modelValue\" @update:modelValue=\"onUpdate\">\r\n <VRadio\r\n v-for=\"item in items\"\r\n :key=\"item.id || item.code\"\r\n :label=\"item.codeValue\"\r\n :value=\"item.code\"\r\n />\r\n </VRadioGroup>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, useAttrs } from 'vue';\r\nimport Request from '../../commons/request';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkRadio\",\r\n inheritAttrs: false,\r\n});\r\n// 定义 props\r\nconst props = defineProps({\r\n /**\r\n * 字典来源:\r\n * - 静态数据,如:\"0:否/1:是\"\r\n * - 字典键名,如:\"DISABLE_TYPE\"\r\n */\r\n list: {\r\n type: String,\r\n required: true,\r\n },\r\n modelValue: {\r\n type: [String, Number],\r\n default: null,\r\n },\r\n});\r\n\r\n// 定义 emit 事件\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 获取透传属性(替代 $attrs)\r\nconst attrs = useAttrs();\r\n\r\n// 响应式数据\r\nconst items = ref([]);\r\n\r\n// 处理静态数据\r\nconst statc = () => {\r\n props.list.split('/').forEach(it => {\r\n const [code, codeValue] = it.split(':');\r\n items.value.push({ code, codeValue });\r\n });\r\n};\r\n\r\n// 请求远程字典\r\nconst miscs = async () => {\r\n try {\r\n const res = await Request.getForm(`dict/misc/list/${props.list}`);\r\n items.value = res.data || [];\r\n } catch (error) {\r\n console.error('[VtkRadio] Failed to load dictionary:', error);\r\n items.value = [];\r\n }\r\n};\r\n\r\n// 更新 v-model 值\r\nconst onUpdate = (val) => {\r\n emit('update:modelValue', val);\r\n};\r\n\r\n// 初始化数据\r\nonMounted(() => {\r\n if (props.list.includes(':')) {\r\n statc();\r\n } else {\r\n miscs();\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n</style>","<template>\r\n <div class=\"search\">\r\n <VMenu\r\n v-model=\"menu\"\r\n @update:model-value=\"obtain\"\r\n location=\"bottom end\"\r\n origin=\"top end\"\r\n offset=\"12\"\r\n :close-on-content-click=\"false\"\r\n >\r\n <template v-slot:activator=\"{ props }\">\r\n <VTextField\r\n v-model=\"queryParam.condition\"\r\n :placeholder=\"$attrs.placeholder || '请输入查询内容'\"\r\n :style=\"$attrs.styles\"\r\n class=\"box\"\r\n density=\"compact\"\r\n variant=\"outlined\"\r\n hide-details\r\n @click:append=\"search\"\r\n @keyup.enter=\"search\"\r\n @click:clear=\"(queryParam.condition = ''), search()\"\r\n clearable\r\n >\r\n <template v-slot:append-inner>\r\n <VBadge\r\n dot\r\n :content=\"initialIndex\"\r\n :model-value=\"initialIndex > 0\"\r\n color=\"error\"\r\n class=\"advanced-badge\"\r\n >\r\n <span\r\n v-bind=\"props\"\r\n class=\"text-blue vtk-cursor-pointer d-inline-flex align-center text-body-2\"\r\n >\r\n 高级\r\n </span>\r\n </VBadge>\r\n </template>\r\n </VTextField>\r\n </template>\r\n\r\n <VCard class=\"search-panel\">\r\n <VCardTitle class=\"pr-3 d-flex justify-space-between align-center pb-5\">\r\n <span>高级搜索</span>\r\n <VBtn class=\"mx-0\" variant=\"text\" icon @click=\"close\" size=\"small\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n </VCardTitle>\r\n\r\n <VCardText class=\"search-panel__body\">\r\n <div class=\"search-panel__content\" :style=\"contentStyle\">\r\n <slot :query-param=\"queryParam\"></slot>\r\n </div>\r\n </VCardText>\r\n\r\n <VCardActions class=\"pt-0 px-4 pb-3\">\r\n <slot name=\"actions\"></slot>\r\n <VSpacer />\r\n <VBtn @click=\"search\" variant=\"flat\" color=\"primary\">\r\n <VIcon class=\"mr-1\">mdi-magnify</VIcon>搜索\r\n </VBtn>\r\n <VBtn @click=\"handleResetClick\" variant=\"flat\" color=\"error\">\r\n <VIcon class=\"mr-1\">mdi-sync</VIcon>重置\r\n </VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VMenu>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed, getCurrentInstance, onMounted, ref, watch } from 'vue';\r\n\r\ndefineOptions({\r\n name: \"VtkSearch\"\r\n});\r\n\r\nconst props = defineProps({\r\n value: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n contentMinHeight: {\r\n type: [Number, String],\r\n default: 0\r\n },\r\n contentMaxHeight: {\r\n type: [Number, String],\r\n default: 360\r\n }\r\n});\r\n\r\nconst emit = defineEmits(['update:value', 'search', 'reset']);\r\nconst instance = getCurrentInstance();\n\nconst user = ref({});\nconst menu = ref(false);\n\nconst cloneValue = (val) => {\n if (Array.isArray(val)) return [...val];\n if (val && typeof val === 'object') return { ...val };\n return val;\n};\n\nconst cloneQueryParam = (source = {}) => {\n return Object.fromEntries(Object.entries(source || {}).map(([key, val]) => [key, cloneValue(val)]));\n};\n\nconst isSameValue = (a, b) => {\n if (\n Array.isArray(a) ||\n Array.isArray(b) ||\n (a && typeof a === 'object') ||\n (b && typeof b === 'object')\n ) {\n return JSON.stringify(a) === JSON.stringify(b);\n }\n\n return a === b;\n};\n\nconst queryParam = ref(cloneQueryParam(props.value));\nconst initialQueryParam = ref(cloneQueryParam(props.value));\nconst externalQueryParam = ref(cloneQueryParam(props.value));\n\nconst initialIndex = computed(() => {\n return Object.entries(queryParam.value).filter(([key, val]) => {\n if (key === 'condition') return false;\n const initVal = initialQueryParam.value[key];\n return !isSameValue(val, initVal);\n }).length;\n});\n\r\nconst contentStyle = computed(() => {\r\n const minValue = props.contentMinHeight;\r\n const maxValue = props.contentMaxHeight;\r\n const minHeight = typeof minValue === 'number' ? `${minValue}px` : minValue;\r\n const maxHeight = typeof maxValue === 'number' ? `${maxValue}px` : maxValue;\r\n\r\n return {\r\n ...(minValue ? { minHeight } : {}),\r\n maxHeight,\r\n };\r\n});\r\n\r\nwatch(\n () => props.value,\n (newVal = {}) => {\n const nextExternalQueryParam = cloneQueryParam(newVal);\n const nextQueryParam = { ...queryParam.value };\n\n Object.entries(nextExternalQueryParam).forEach(([key, val]) => {\n if (!isSameValue(val, externalQueryParam.value[key])) {\n nextQueryParam[key] = cloneValue(val);\n }\n });\n\n Object.keys(externalQueryParam.value).forEach((key) => {\n if (!(key in nextExternalQueryParam)) {\n delete nextQueryParam[key];\n }\n });\n\n queryParam.value = nextQueryParam;\n externalQueryParam.value = nextExternalQueryParam;\n },\n { deep: true }\n);\n\r\nonMounted(() => {\r\n user.value = JSON.parse(localStorage.getItem(\"_mis_acis_users\") || \"{}\");\r\n});\r\n\r\nconst obtain = () => {};\r\n\r\nconst close = () => {\r\n menu.value = false;\r\n obtain();\r\n};\r\n\r\nconst filterNull = (obj) => {\r\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== null && v !== undefined));\r\n};\r\n\r\nconst search = () => {\r\n close();\r\n emit('update:value', filterNull(queryParam.value));\r\n emit(\"search\");\r\n};\r\n\r\nconst reset = () => {\r\n queryParam.value = {\r\n ...initialQueryParam.value,\r\n condition: ''\r\n };\r\n emit('update:value', filterNull(queryParam.value));\r\n emit(\"search\");\r\n menu.value = false;\r\n};\r\n\r\nconst handleResetClick = () => {\r\n const hasParentResetHandler = Boolean(instance?.vnode.props?.onReset);\r\n\r\n if (hasParentResetHandler) {\r\n emit('reset', { ...queryParam.value });\r\n return;\r\n }\r\n\r\n reset();\r\n};\r\n\r\ndefineExpose({ search, reset });\r\n\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.search {\r\n position: relative;\r\n min-width: 380px;\r\n min-height: 40px;\r\n}\r\n\r\n.box {\r\n min-width: 380px;\r\n min-height: 40px;\r\n}\r\n\r\n.search-panel {\r\n width: 380px;\r\n margin-right: -16px;\r\n overflow: visible;\r\n}\r\n\r\n.search-panel__body {\r\n overflow: visible;\r\n}\r\n\r\n.search-panel__content {\r\n overflow-x: hidden;\r\n overflow-y: auto;\r\n scrollbar-gutter: stable;\r\n scrollbar-color: rgb(var(--v-theme-primary)) transparent;\r\n scrollbar-width: thin;\r\n}\r\n\r\n\r\n.search-panel__content::-webkit-scrollbar-track {\r\n background: transparent;\r\n}\r\n\r\n.search-panel__content::-webkit-scrollbar-thumb {\r\n background: rgb(var(--v-theme-primary));\r\n}\r\n\r\n:deep(.box .v-field__append-inner) {\r\n cursor: pointer;\r\n padding-left: 16px !important;\r\n padding-right: 4px !important;\r\n border-left: 1px #cccccc88 solid;\r\n min-width: 50px;\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n:deep(.advanced-badge .v-badge__badge) {\r\n transform: translate(10px, -2px);\r\n}\r\n</style>\r\n","<template>\r\n <VSelect \r\n v-bind=\"filteredAttrs\" \r\n :items=\"items\" \r\n item-title=\"codeValue\" \r\n item-value=\"code\" \r\n :multiple=\"multi\"\r\n :menu-props=\"{ offsetY: true }\" \r\n @update:model-value=\"$emit('update:modelValue', $event)\"\r\n />\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, useAttrs, computed } from 'vue'\r\nimport Request from \"../../commons/request\";\r\n\r\n// 定义组件名称和选项\r\ndefineOptions({\r\n name: \"VtkSelect\",\r\n inheritAttrs: false\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 数据库字段名字(DISABLE_TYPE) 或 静态的字段(0:否/1:是)\r\n list: {\r\n type: String,\r\n default: null,\r\n },\r\n multi: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n});\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 获取所有传递的属性\r\nconst attrs = useAttrs();\r\n\r\n// 过滤属性,排除组件内部使用的属性\r\nconst filteredAttrs = computed(() => {\r\n const { list, multi, ...rest } = attrs;\r\n return rest;\r\n});\r\n\r\n// 响应式数据\r\nconst items = ref([]);\r\n\r\n// 方法定义\r\nconst miscs = () => {\r\n Request.getForm(`dict/misc/list/${props.list}`).then((res) => {\r\n items.value = res.data;\r\n });\r\n};\r\n\r\nconst statc = () => {\r\n if (!props.list) return;\r\n \r\n props.list.split(\"/\").forEach((it) => {\r\n const its = it.split(\":\");\r\n items.value.push({ code: its[0], codeValue: its[1] });\r\n });\r\n};\r\n\r\n// 生命周期钩子\r\nonMounted(() => {\r\n if (props.list) {\r\n if (props.list.includes(\":\")) {\r\n statc();\r\n } else {\r\n miscs();\r\n }\r\n }\r\n});\r\n\r\n// 使用方式\r\n// <vtk-select\r\n// v-model=\"value\"\r\n// list=\"YOUR_LIST\"\r\n// variant=\"outlined\" <!-- 样式变体 -->\r\n// density=\"compact\" <!-- 密度 'default' | 'comfortable' | 'compact' -->\r\n// clearable <!-- 可清除 -->\r\n// placeholder=\"请选择\" <!-- 占位符 -->\r\n// :rules=\"rules\" <!-- 验证规则 -->\r\n// disabled <!-- 禁用状态 -->\r\n// readonly <!-- 只读状态 -->\r\n// hide-details <!-- 隐藏详情信息 -->\r\n// />\r\n\r\n</script>\r\n\r\n<style scoped>\r\n::-webkit-scrollbar {\r\n width: 6px;\r\n}\r\n\r\n::-webkit-scrollbar-thumb {\r\n border-radius: 3px;\r\n height: 100px;\r\n background-color: #007acc;\r\n}\r\n</style>","<template>\n <div class=\"vtk-single-page\">\n <v-row class=\"pagination-row ma-0\" align=\"center\" justify=\"end\">\n <template v-if=\"hasTotal\">\n <span class=\"page-total d-none d-md-flex\">共 {{ rowCount }} 条</span>\n\n <v-select\n v-model=\"pagination.limit\"\n :items=\"pageSizeItems\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n class=\"page-select ml-2 d-none d-md-flex\"\n @update:model-value=\"handlePageSizeChange\"\n />\n\n <v-pagination\n v-model=\"currentPage\"\n :length=\"pageCount\"\n :total-visible=\"6\"\n density=\"comfortable\"\n size=\"small\"\n class=\"page-pagination\"\n @update:model-value=\"emitPageChange\"\n />\n\n <span class=\"page-total ml-2 d-none d-md-flex\">到</span>\n <v-text-field\n v-model=\"pagination.pageno\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n inputmode=\"numeric\"\n class=\"page-go ml-2 d-none d-md-flex\"\n @keyup.enter=\"goToPage\"\n />\n <span class=\"page-total ml-2 d-none d-md-flex\">页</span>\n </template>\n\n <template v-else>\n <span class=\"page-total d-none d-md-flex\">第 {{ currentPage }} 页</span>\n\n <v-select\n v-model=\"pagination.limit\"\n :items=\"pageSizeItems\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n class=\"page-select ml-2 d-none d-md-flex\"\n @update:model-value=\"handlePageSizeChange\"\n />\n\n <div class=\"d-flex\">\n <v-btn\n variant=\"outlined\"\n size=\"small\"\n height=\"36\"\n\t\t\tclass=\"mr-2\"\n :disabled=\"currentPage <= 1\"\n @click=\"previousPage\"\n >\n 上一页\n </v-btn>\n <v-btn\n variant=\"outlined\"\n size=\"small\"\n height=\"36\"\n :disabled=\"!hasNextPage\"\n @click=\"nextPage\"\n >\n 下一页\n </v-btn>\n </div>\n </template>\n </v-row>\n </div>\n</template>\n\n<script setup>\nimport { computed, reactive, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkSinglePage'\n});\n\nconst props = defineProps({\n pageData: {\n type: Object,\n default: () => ({})\n },\n pageSizes: {\n type: Array,\n default: () => [15, 20, 30]\n }\n});\n\nconst emit = defineEmits(['pageChange']);\n\nconst normalizePositiveInteger = (value, fallback = 1) => {\n const parsedValue = Number.parseInt(value, 10);\n return Number.isInteger(parsedValue) && parsedValue > 0 ? parsedValue : fallback;\n};\n\nconst initialLimit = computed(() => normalizePositiveInteger(props.pageSizes[0], 15));\nconst currentPage = ref(normalizePositiveInteger(props.pageData.pageno));\nconst pagination = reactive({\n pageno: currentPage.value,\n limit: normalizePositiveInteger(props.pageData.limit, initialLimit.value)\n});\n\nconst rowCount = computed(() => Math.max(0, Number(props.pageData.rowCount) || 0));\nconst pageCount = computed(() => normalizePositiveInteger(props.pageData.pageCount));\nconst hasTotal = computed(() => rowCount.value > 0);\nconst pageSizeItems = computed(() => props.pageSizes.map(value => ({\n title: `${value} 条/页`,\n value\n})));\nconst rowLength = computed(() => {\n if (Array.isArray(props.pageData.rows)) {\n return props.pageData.rows.length;\n }\n\n return Number.isFinite(Number(props.pageData.rows))\n ? Number(props.pageData.rows)\n : null;\n});\nconst hasNextPage = computed(() => (\n rowLength.value === null || rowLength.value >= Number(pagination.limit)\n));\n\nwatch(\n () => props.pageData,\n newValue => {\n currentPage.value = normalizePositiveInteger(newValue.pageno, currentPage.value);\n pagination.pageno = currentPage.value;\n\n if (newValue.limit != null) {\n pagination.limit = normalizePositiveInteger(newValue.limit, pagination.limit);\n }\n },\n { deep: true }\n);\n\nwatch(currentPage, value => {\n pagination.pageno = value;\n});\n\nwatch(\n () => props.pageSizes,\n values => {\n if (!values.some(value => Number(value) === Number(pagination.limit))) {\n pagination.limit = initialLimit.value;\n }\n },\n { deep: true }\n);\n\nconst emitPageChange = () => {\n emit('pageChange', {\n pageno: currentPage.value,\n limit: Number(pagination.limit)\n });\n};\n\nconst goToPage = () => {\n const targetPage = Number(pagination.pageno);\n\n if (Number.isInteger(targetPage) && targetPage >= 1 && targetPage <= pageCount.value) {\n currentPage.value = targetPage;\n emitPageChange();\n return;\n }\n\n pagination.pageno = currentPage.value;\n};\n\nconst handlePageSizeChange = () => {\n currentPage.value = 1;\n emitPageChange();\n};\n\nconst previousPage = () => {\n if (currentPage.value <= 1) return;\n\n currentPage.value -= 1;\n emitPageChange();\n};\n\nconst nextPage = () => {\n if (!hasNextPage.value) return;\n\n currentPage.value += 1;\n emitPageChange();\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.vtk-single-page {\n width: 100%;\n min-height: 60px;\n}\n\n.pagination-row {\n min-height: 60px;\n padding: 8px 16px;\n}\n\n.page-total {\n align-items: center;\n min-height: 36px;\n color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity));\n font-size: 13px;\n}\n\n.page-select {\n max-width: 120px;\n}\n\n.page-go {\n max-width: 72px;\n}\n\n.page-select,\n.page-go {\n :deep(.v-input__control),\n :deep(.v-field) {\n min-height: 36px;\n height: 36px;\n font-size: 13px;\n }\n\n :deep(.v-field__input) {\n min-height: 36px;\n padding-top: 4px;\n padding-bottom: 4px;\n }\n}\n\n.page-pagination {\n :deep(.v-pagination__item),\n :deep(.v-pagination__prev),\n :deep(.v-pagination__next) {\n font-size: 13px;\n }\n}\n</style>\n","<template>\r\n\t<VStepper class=\"elevation-0\" v-model=\"stepIndex\">\r\n\t\t<VStepperHeader class=\"elevation-0\" style=\"overflow: hidden;\">\r\n\t\t\t<VRow class=\"stepList\">\r\n\t\t\t\t<VCol class=\"pl-0 colItem\" v-for=\"(item, index) in step\" :key=\"index\" style=\"\">\r\n\t\t\t\t\t<div class=\"first-box1 last-box pl-10 py-5 stepItem\" :class=\"stepIndex > index? 'selected' : ''\"\r\n\t\t\t\t\t\t:complete=\"stepIndex > index\" :step=\"index + 1\">\r\n\t\t\t\t\t\t{{ item }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</VCol>\r\n\t\t\t</VRow>\r\n\t\t</VStepperHeader>\r\n\r\n\t\t<VStepperWindow>\r\n\t\t\t<VStepperWindowItem v-for=\"(item, index) in list\" :key=\"index\" :value=\"index + 1\">\r\n\t\t\t\t<slot :name=\"index + 1\"></slot>\r\n\t\t\t</VStepperWindowItem>\r\n\t\t\t<slot></slot>\r\n\t\t</VStepperWindow>\r\n\t</VStepper>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, watch, onMounted } from 'vue';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n\tname: \"VtkStepper\",\r\n\tinheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n\tlist: {\r\n\t\ttype: String,\r\n\t\tdefault: null,\r\n\t},\r\n\tel: {\r\n\t\ttype: Number,\r\n\t\tdefault: 1,\r\n\t},\r\n});\r\n\r\n// 响应式数据\r\nconst stepIndex = ref(props.el);\r\nconst step = ref([]);\r\n\r\n// 监听el属性变化\r\nwatch(() => props.el, (val) => {\r\n\tstepIndex.value = val;\r\n});\r\n\r\n// 处理内容\r\nconst content = () => {\r\n\tif (props.list) {\r\n\t\tstep.value = props.list.split(\",\");\r\n\t}\r\n};\r\n\r\n// 组件挂载时执行\r\nonMounted(() => {\r\n\tcontent();\r\n});\r\n\r\n// 监听list变化\r\nwatch(() => props.list, () => {\r\n\tcontent();\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n// 颜色变量定义\r\n$color-background: #c7ccd538;\r\n$color-selected: #165dff;\r\n$color-white: #fff;\r\n$color-light-bg: #f2f3f5;\r\n$color-dark-bg: #1e1e1e;\r\n\r\n.v-stepper__step {\r\n\tbackground: $color-background;\r\n\tposition: relative;\r\n}\r\n\r\n// 隐藏步骤数字\r\n:deep(.v-stepper__step__step) {\r\n\tdisplay: none !important;\r\n}\r\n\r\n.stepItem {\r\n\talign-items: center;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tpadding: 24px;\r\n\tposition: relative;\r\n\tbackground: $color-background;\r\n\r\n\t// 暗色主题样式\r\n\t.v-theme--dark & {\r\n\t\tcolor: rgba(255, 255, 255, 0.5);\r\n\t}\r\n\r\n\t// 选中状态\r\n\t&.selected {\r\n\t\tbackground: $color-selected;\r\n\t\tcolor: $color-white !important;\r\n\r\n\t\t&.last-box::after {\r\n\t\t\tborder-color: transparent transparent transparent $color-selected;\r\n\t\t}\r\n\r\n\t\t:deep(.v-stepper__label) {\r\n\t\t\tcolor: $color-white !important;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n.colItem {\r\n\t&:first-child .first-box1::before {\r\n\t\tborder-color: transparent !important;\r\n\t}\r\n\r\n\t&:last-child .last-box::after {\r\n\t\tborder-color: transparent !important;\r\n\t}\r\n}\r\n\r\n.first-box1::before {\r\n\tposition: absolute;\r\n\tleft: 0;\r\n\tcontent: \"\";\r\n\twidth: 0;\r\n\theight: 0;\r\n\tz-index: 0;\r\n\tborder: 30px solid;\r\n\tborder-color: transparent transparent transparent $color-white;\r\n\r\n\t.v-theme--dark & {\r\n\t\tborder-color: transparent transparent transparent $color-dark-bg;\r\n\t}\r\n}\r\n\r\n.last-box::after {\r\n\tposition: absolute;\r\n\tright: -69px;\r\n\tcontent: \"\";\r\n\tz-index: 1;\r\n\twidth: 0;\r\n\theight: 0;\r\n\tborder: 35px solid;\r\n\tborder-color: transparent transparent transparent $color-light-bg;\r\n\r\n\t.v-theme--dark & {\r\n\t\tborder-color: transparent transparent transparent $color-background;\r\n\t}\r\n}\r\n\r\n.theme--dark.v-stepper {\r\n\tbackground: transparent;\r\n}\r\n</style>","<template>\r\n <div class=\"vtk-upload\">\r\n <!-- 拖拽 / 点击上传区域 -->\r\n <div\r\n v-if=\"listType !== 'picture-card' && !detail\"\r\n :class=\"['vtk-upload__dragger', { 'is-dragover': isDragover, 'is-disabled': disabled }]\"\r\n title=\"点击上传\"\r\n @click=\"!disabled && triggerInput()\"\r\n @dragover.prevent=\"onDragover\"\r\n @dragleave.prevent=\"isDragover = false\"\r\n @drop.prevent=\"onDrop\"\r\n >\r\n <slot>\r\n <div class=\"vtk-upload__dragger-inner\">\r\n <VIcon size=\"40\" color=\"grey-lighten-1\">mdi-cloud-upload-outline</VIcon>\r\n <div class=\"text-body-2 mt-2 text-grey\">将文件拖到此处,或 <span class=\"text-primary\" style=\"cursor:pointer\">点击上传</span></div>\r\n <div v-if=\"tip\" class=\"text-caption text-grey-lighten-1 mt-1\">{{ tip }}</div>\r\n </div>\r\n </slot>\r\n </div>\r\n\r\n <!-- picture-card 模式 -->\r\n <div v-if=\"listType === 'picture-card'\" class=\"vtk-upload__picture-card-wrap\">\r\n <div\r\n v-for=\"file in fileList\"\r\n :key=\"file.uid\"\r\n class=\"vtk-upload__picture-card-item\"\r\n >\r\n <v-img :key=\"file.url || file.preview || file.uid\" :src=\"file.url || file.preview\" cover class=\"fill-height\" />\n <div class=\"vtk-upload__picture-card-mask\">\r\n <VBtn icon size=\"x-small\" variant=\"text\" color=\"white\" title=\"查看\" @click.stop=\"handlePreview(file)\">\r\n <VIcon>mdi-eye</VIcon>\r\n </VBtn>\r\n <VBtn v-if=\"!disabled && !detail\" icon size=\"x-small\" variant=\"text\" color=\"white\" title=\"删除\" @click.stop=\"handleRemove(file)\">\r\n <VIcon>mdi-delete</VIcon>\r\n </VBtn>\r\n </div>\r\n <!-- 上传进度 -->\r\n <div v-if=\"file.status === 'uploading'\" class=\"vtk-upload__picture-card-progress\">\r\n <v-progress-circular :model-value=\"file.percentage\" size=\"36\" color=\"white\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 添加按钮 -->\r\n <div\r\n v-if=\"!disabled && !detail && (limit === 0 || fileList.length < limit)\"\r\n :class=\"['vtk-upload__picture-card-add', { 'is-dragover': isDragover }]\"\r\n title=\"添加文件\"\r\n @click=\"triggerInput()\"\r\n @dragover.prevent=\"onDragover\"\r\n @dragleave.prevent=\"isDragover = false\"\r\n @drop.prevent=\"onDrop\"\r\n >\r\n <VIcon size=\"28\" color=\"grey-lighten-1\">mdi-plus</VIcon>\r\n </div>\r\n </div>\r\n\r\n <!-- 隐藏的 input -->\r\n <input\r\n ref=\"inputRef\"\r\n type=\"file\"\r\n class=\"vtk-upload__input\"\r\n :accept=\"accept\"\r\n :multiple=\"multiple\"\r\n @change=\"onInputChange\"\r\n />\r\n\r\n <!-- 文件列表 (非 picture-card) -->\r\n <div v-if=\"showFileList && listType !== 'picture-card' && fileList.length > 0\" class=\"vtk-upload__list mt-2\">\r\n <div\r\n v-for=\"file in fileList\"\r\n :key=\"file.uid\"\r\n :class=\"['vtk-upload__list-item', `is-${file.status}`]\"\r\n style=\"cursor: pointer;\"\r\n >\r\n <VIcon size=\"18\" class=\"mr-1\" :color=\"file.status === 'error' ? 'error' : 'primary'\">\r\n {{ fileIcon(file) }}\r\n </VIcon>\r\n <span class=\"vtk-upload__list-item-name flex-grow-1 text-truncate\" @click=\"handlePreview(file)\" :title=\"file.name\">{{ file.name }}</span>\r\n <span v-if=\"file.status === 'uploading'\" class=\"text-caption text-grey ml-2\">{{ file.percentage }}%</span>\r\n <VBtn\r\n v-if=\"!disabled && !detail\"\r\n icon\r\n size=\"x-small\"\r\n variant=\"text\"\r\n color=\"grey\"\r\n class=\"ml-1\"\r\n title=\"删除\"\r\n @click=\"handleRemove(file)\"\r\n >\r\n <VIcon size=\"16\">mdi-close</VIcon>\r\n </VBtn>\r\n <!-- 进度条 -->\r\n <v-progress-linear\r\n v-if=\"file.status === 'uploading'\"\r\n :model-value=\"file.percentage\"\r\n color=\"primary\"\r\n class=\"vtk-upload__list-progress\"\r\n height=\"2\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 预览 Dialog -->\r\n <VDialog v-model=\"previewVisible\" fullscreen scrollable @click:outside=\"closePreview\">\r\n <VCard class=\"vtk-upload__preview-card\">\r\n <v-toolbar color=\"primary\" density=\"comfortable\">\r\n <v-toolbar-title class=\"text-truncate\">{{ previewFile?.name }}</v-toolbar-title>\r\n <VSpacer />\r\n <VBtn icon variant=\"text\" title=\"新窗口打开\" @click=\"openCurrentPreview\">\r\n <VIcon>mdi-open-in-new</VIcon>\r\n </VBtn>\r\n <template v-if=\"isImage(previewFile)\">\r\n <VBtn icon variant=\"text\" :disabled=\"!hasPreviewPrev\" title=\"上一张\" @click=\"switchPreviewImage(-1)\">\r\n <VIcon>mdi-chevron-left</VIcon>\r\n </VBtn>\r\n <VBtn icon variant=\"text\" :disabled=\"!hasPreviewNext\" title=\"下一张\" @click=\"switchPreviewImage(1)\">\r\n <VIcon>mdi-chevron-right</VIcon>\r\n </VBtn>\r\n <VBtn icon variant=\"text\" title=\"缩小\" @click=\"zoomPreview(-0.3)\">\r\n <VIcon>mdi-magnify-minus-outline</VIcon>\r\n </VBtn>\r\n <VBtn icon variant=\"text\" title=\"放大\" @click=\"zoomPreview(0.3)\">\r\n <VIcon>mdi-magnify-plus-outline</VIcon>\r\n </VBtn>\r\n <VBtn icon variant=\"text\" title=\"向左旋转\" @click=\"rotatePreview(-90)\">\r\n <VIcon>mdi-rotate-left</VIcon>\r\n </VBtn>\r\n <VBtn icon variant=\"text\" title=\"向右旋转\" @click=\"rotatePreview(90)\">\r\n <VIcon>mdi-rotate-right</VIcon>\r\n </VBtn>\r\n <VBtn icon variant=\"text\" title=\"重置\" @click=\"resetPreviewTransform\">\r\n <VIcon>mdi-refresh</VIcon>\r\n </VBtn>\r\n </template>\r\n <VBtn icon variant=\"text\" title=\"关闭\" @click=\"closePreview\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n </v-toolbar>\r\n <div class=\"vtk-upload__preview-body\">\r\n <VBtn\r\n v-if=\"isImage(previewFile) && hasPreviewPrev\"\r\n icon\r\n class=\"vtk-upload__preview-nav vtk-upload__preview-nav--prev\"\r\n title=\"上一张\"\r\n @click.stop=\"switchPreviewImage(-1)\"\r\n >\r\n <VIcon size=\"36\">mdi-chevron-left</VIcon>\r\n </VBtn>\r\n <VBtn\r\n v-if=\"isImage(previewFile) && hasPreviewNext\"\r\n icon\r\n class=\"vtk-upload__preview-nav vtk-upload__preview-nav--next\"\r\n title=\"下一张\"\r\n @click.stop=\"switchPreviewImage(1)\"\r\n >\r\n <VIcon size=\"36\">mdi-chevron-right</VIcon>\r\n </VBtn>\r\n <div v-if=\"isImage(previewFile)\" class=\"vtk-upload__preview-image-wrap\">\r\n <img\r\n class=\"vtk-upload__preview-image\"\r\n :src=\"previewFile?._previewSrc\"\r\n :alt=\"previewFile?.name\"\r\n :style=\"previewImageStyle\"\r\n draggable=\"false\"\r\n @pointerdown=\"startPreviewDrag\"\r\n />\r\n </div>\r\n <div v-else class=\"vtk-upload__preview-empty\">\r\n <VIcon size=\"64\">{{ isExcel(previewFile) ? 'mdi-microsoft-excel' : 'mdi-file-outline' }}</VIcon>\r\n <div class=\"mt-2\">{{ previewFile?.name }}</div>\r\n <div class=\"text-caption mt-1\">This file cannot be previewed online.</div>\r\n </div>\r\n </div>\r\n </VCard>\r\n </VDialog>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\r\nimport Request from '../../commons/request.js';\r\n\r\ndefineOptions({\r\n name: 'VtkUpload',\r\n inheritAttrs: false,\r\n});\r\n\r\nconst props = defineProps({\r\n /** v-model 文件列表 */\r\n modelValue: {\r\n type: Array,\r\n default: () => [],\r\n },\r\n /** 上传地址 */\r\n action: {\r\n type: String,\r\n default: '',\r\n },\r\n /** 接受的文件类型,同原生 accept */\r\n accept: {\r\n type: String,\r\n default: '',\r\n },\r\n /** 是否多选 */\r\n multiple: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /** 最大上传数量,0 表示不限制 */\r\n limit: {\r\n type: Number,\r\n default: 0,\r\n },\r\n /** 单文件最大体积,单位 MB,0 表示不限制 */\r\n maxSize: {\r\n type: Number,\r\n default: 0,\r\n },\r\n /** 列表类型:text | picture | picture-card */\r\n listType: {\r\n type: String,\r\n default: 'text',\r\n validator: (v) => ['text', 'picture', 'picture-card'].includes(v),\r\n },\r\n /** 是否显示文件列表 */\r\n showFileList: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n /** 是否自动上传 */\r\n autoUpload: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n /** 是否禁用 */\r\n disabled: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /** 详情模式:隐藏上传和删除入口,仅展示已上传文件并保留查看 */\r\n detail: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /** 附加请求头 */\r\n headers: {\r\n type: Object,\r\n default: () => ({}),\r\n },\r\n /** 附加请求数据 */\r\n data: {\r\n type: Object,\r\n default: () => ({}),\r\n },\r\n /** 文件字段名 */\r\n name: {\r\n type: String,\r\n default: 'file',\r\n },\r\n /** 提示文字 */\r\n tip: {\r\n type: String,\r\n default: '',\r\n },\r\n /** 上传前钩子,返回 false 或 rejected Promise 则停止上传 */\r\n beforeUpload: {\r\n type: Function,\r\n default: null,\r\n },\r\n /** 移除前钩子 */\r\n beforeRemove: {\r\n type: Function,\r\n default: null,\r\n },\r\n});\r\n\r\nconst emit = defineEmits([\r\n 'update:modelValue',\r\n 'change',\r\n 'success',\r\n 'error',\r\n 'progress',\r\n 'remove',\r\n 'exceed',\r\n 'preview',\r\n]);\r\n\r\n/* -------------------- 内部状态 -------------------- */\r\nconst inputRef = ref(null);\r\nconst isDragover = ref(false);\r\nconst previewVisible = ref(false);\r\nconst previewFile = ref(null);\r\nconst previewScale = ref(1);\r\nconst previewRotation = ref(0);\r\nconst previewTranslateX = ref(0);\r\nconst previewTranslateY = ref(0);\r\nconst previewDragState = ref(null);\r\n\r\n// 内部维护文件列表\nconst fileList = ref([]);\nlet isSyncingModel = false;\nconst localPreviewUrls = new Set();\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n if (isSyncingModel) {\r\n isSyncingModel = false;\r\n return;\r\n }\r\n\r\n // Accept external URL lists or file object lists.\n revokeAllLocalPreviews();\n fileList.value = normalizeFileList(val || []);\n },\n);\n\r\n/* -------------------- 工具函数 -------------------- */\r\nlet uidCounter = 0;\r\nconst genUid = () => `vtk-upload-${Date.now()}-${uidCounter++}`;\r\n\r\nconst getFileNameFromUrl = (url) => {\n const cleanUrl = String(url || '').split('?')[0].split('#')[0];\n const name = cleanUrl.substring(cleanUrl.lastIndexOf('/') + 1);\n try {\n return decodeURIComponent(name || cleanUrl || 'file');\n } catch (e) {\r\n return name || cleanUrl || 'file';\r\n }\n};\n\nconst isImageUrl = (url) => {\n const value = String(url || '');\n const cleanUrl = value.split('?')[0].split('#')[0];\n return /^data:image\\//i.test(value) || /\\.(png|jpg|jpeg|gif|bmp|webp|svg)$/i.test(cleanUrl);\n};\n\nconst normalizeFileList = (value) => {\n if (!Array.isArray(value)) return [];\n\n return value\n .filter((item) => item)\r\n .map((item) => {\r\n if (typeof item === 'string') {\r\n return {\r\n uid: genUid(),\n name: getFileNameFromUrl(item),\n size: 0,\n type: props.listType === 'picture-card' || isImageUrl(item) ? 'image/*' : '',\n status: 'success',\n percentage: 100,\n raw: null,\n url: item,\r\n preview: '',\r\n response: null,\r\n };\r\n }\r\n\r\n return {\r\n uid: item.uid || genUid(),\n name: item.name || getFileNameFromUrl(item.url || item.preview),\n size: item.size || 0,\n type: item.type || (props.listType === 'picture-card' && (item.url || item.preview) ? 'image/*' : ''),\n status: item.status || 'success',\n percentage: item.percentage ?? 100,\n raw: item.raw || null,\n url: item.url || '',\r\n preview: item.preview || '',\r\n response: item.response || null,\r\n ...item,\r\n };\r\n });\r\n};\r\n\r\nfileList.value = normalizeFileList(props.modelValue || []);\r\n\r\nconst isImage = (file) => {\n if (!file) return false;\n return /image\\//.test(file.type) || isImageUrl(file.name) || isImageUrl(file.url) || isImageUrl(file.preview);\n};\n\r\nconst fileIcon = (file) => {\r\n if (file.status === 'error') return 'mdi-file-alert-outline';\r\n if (isImage(file)) return 'mdi-file-image-outline';\r\n return 'mdi-file-outline';\r\n};\r\n\r\nconst getPreviewSrc = (file) => file?.url || file?.preview || '';\n\nconst revokeLocalPreview = (file) => {\n const preview = file?.preview;\n if (preview && localPreviewUrls.has(preview)) {\n URL.revokeObjectURL(preview);\n localPreviewUrls.delete(preview);\n }\n};\n\nconst revokeAllLocalPreviews = () => {\n fileList.value.forEach(revokeLocalPreview);\n localPreviewUrls.forEach((url) => URL.revokeObjectURL(url));\n localPreviewUrls.clear();\n};\n\r\nconst previewImageList = computed(() => fileList.value.filter((file) => isImage(file) && getPreviewSrc(file)));\r\n\r\nconst previewImageIndex = computed(() => {\r\n if (!previewFile.value) return -1;\r\n return previewImageList.value.findIndex((file) => file.uid === previewFile.value.uid);\r\n});\r\n\r\nconst hasPreviewPrev = computed(() => previewImageIndex.value > 0);\r\nconst hasPreviewNext = computed(() => previewImageIndex.value >= 0 && previewImageIndex.value < previewImageList.value.length - 1);\r\n\r\nconst previewImageStyle = computed(() => ({\r\n transform: `translate(${previewTranslateX.value}px, ${previewTranslateY.value}px) scale(${previewScale.value}) rotate(${previewRotation.value}deg)`,\r\n}));\r\n\r\n/* -------------------- 触发 input -------------------- */\r\nconst triggerInput = () => {\r\n inputRef.value && inputRef.value.click();\r\n};\r\n\r\n/* -------------------- 拖拽 -------------------- */\r\nconst onDragover = () => {\r\n if (!props.disabled && !props.detail) isDragover.value = true;\r\n};\r\n\r\nconst onDrop = (e) => {\r\n isDragover.value = false;\r\n if (props.disabled || props.detail) return;\r\n processFiles(Array.from(e.dataTransfer.files));\r\n};\r\n\r\n/* -------------------- input change -------------------- */\r\nconst onInputChange = (e) => {\r\n if (props.disabled || props.detail) return;\r\n processFiles(Array.from(e.target.files));\r\n // 清空,允许重复选同一文件\r\n e.target.value = '';\r\n};\r\n\r\n/* -------------------- 文件处理 -------------------- */\r\nconst processFiles = (rawFiles) => {\r\n if (!rawFiles.length) return;\r\n\r\n // 数量限制检查\r\n if (props.limit > 0 && fileList.value.length + rawFiles.length > props.limit) {\r\n emit('exceed', rawFiles, fileList.value);\r\n return;\r\n }\r\n\r\n rawFiles.forEach((raw) => {\r\n // 体积检查\r\n if (props.maxSize > 0 && raw.size / 1024 / 1024 > props.maxSize) {\r\n const errFile = buildFile(raw, 'error');\r\n emit('error', new Error(`文件 ${raw.name} 超过最大限制 ${props.maxSize}MB`), errFile, fileList.value);\r\n return;\r\n }\r\n\r\n const file = buildFile(raw, 'ready');\r\n\r\n // 生成本地预览地址,保证 picture-card 选图后立即回显缩略图。\n if (isImage(raw)) {\n if (typeof URL !== 'undefined' && URL.createObjectURL) {\n file.preview = URL.createObjectURL(raw);\n localPreviewUrls.add(file.preview);\n } else {\n const reader = new FileReader();\n reader.onload = (e) => {\n file.preview = e.target.result;\n emit('change', file, fileList.value);\n };\n reader.readAsDataURL(raw);\n }\n }\n\r\n const beforeHook = props.beforeUpload ? props.beforeUpload(raw) : true;\r\n Promise.resolve(beforeHook).then((result) => {\r\n if (result === false) return;\r\n addFile(file);\r\n if (props.autoUpload && props.action) {\r\n uploadFile(file);\r\n }\r\n }).catch(() => {});\r\n });\r\n};\r\n\r\nconst buildFile = (raw, status) => ({\r\n uid: genUid(),\r\n name: raw.name,\r\n size: raw.size,\r\n type: raw.type,\r\n status,\r\n percentage: 0,\r\n raw,\r\n url: '',\r\n preview: '',\r\n response: null,\r\n});\r\n\r\nconst addFile = (file) => {\r\n fileList.value.push(file);\r\n syncModel();\r\n emit('change', file, fileList.value);\r\n};\r\n\r\nconst syncModel = () => {\r\n const urls = fileList.value\r\n .filter((f) => f.status === 'success' && f.url)\r\n .map((f) => String(f.url));\r\n isSyncingModel = true;\r\n emit('update:modelValue', urls);\r\n nextTick(() => {\r\n isSyncingModel = false;\r\n });\r\n};\r\n\r\n/* -------------------- 上传逻辑 -------------------- */\r\nconst uploadFile = (file) => {\r\n file.status = 'uploading';\r\n const formData = new FormData();\r\n formData.append(props.name, file.raw);\r\n Object.entries(props.data).forEach(([k, v]) => formData.append(k, v));\r\n\r\n // 使用 axios 直接调,以获得 onUploadProgress\r\n const tokenKey = window.VTK_CONFIG?.storageKeys?.token || '_mis_acis_token';\r\n const token = window.$vtk?.storage?.get(tokenKey) || localStorage.getItem(tokenKey);\r\n\r\n const headers = {\r\n 'content-type': 'multipart/form-data',\r\n ...props.headers,\r\n };\r\n if (token) headers['Authorization'] = `Bearer ${token}`;\r\n\r\n Request.http(props.action, formData, 'POST', headers).then((res) => {\r\n file.status = 'success';\r\n file.response = res;\r\n // 兼容 { data: 'url' } 和 { data: { url: '...' } } 两种结构\n const url = typeof res?.data === 'string' ? res.data : (res?.data?.url || res?.url || '');\n if (url) {\n file.url = url;\n revokeLocalPreview(file);\n }\n console.log('[VtkUpload] res:', res, '| file.url:', file.url, '| fileList:', JSON.parse(JSON.stringify(fileList.value)));\r\n syncModel();\r\n emit('success', res, file, fileList.value);\r\n emit('change', file, fileList.value);\r\n }).catch((err) => {\r\n file.status = 'error';\r\n syncModel();\r\n emit('error', err, file, fileList.value);\r\n emit('change', file, fileList.value);\r\n });\r\n};\r\n\r\n/* -------------------- 移除文件 -------------------- */\r\nconst handleRemove = (file) => {\r\n const doRemove = () => {\n revokeLocalPreview(file);\n fileList.value = fileList.value.filter((f) => f.uid !== file.uid);\n syncModel();\n emit('remove', file, fileList.value);\n };\r\n\r\n if (props.beforeRemove) {\r\n Promise.resolve(props.beforeRemove(file, fileList.value)).then((result) => {\r\n if (result !== false) doRemove();\r\n }).catch(() => {});\r\n } else {\r\n doRemove();\r\n }\r\n};\r\n\r\n/* -------------------- 预览 -------------------- */\r\nconst isExcel = (file) => /\\.(xlsx|xls)$/i.test(file?.name || '');\r\n\r\nconst resetPreviewTransform = () => {\r\n previewScale.value = 1;\r\n previewRotation.value = 0;\r\n previewTranslateX.value = 0;\r\n previewTranslateY.value = 0;\r\n};\r\n\r\nconst closePreview = () => {\r\n previewVisible.value = false;\r\n};\r\n\r\nconst rotatePreview = (degrees) => {\r\n previewRotation.value += degrees;\r\n};\r\n\r\nconst zoomPreview = (step) => {\r\n const nextScale = Number((previewScale.value + step).toFixed(2));\r\n previewScale.value = Math.min(3, Math.max(0.2, nextScale));\r\n};\r\n\r\nconst setImagePreviewFile = (file) => {\r\n previewFile.value = {\r\n ...file,\r\n _previewSrc: getPreviewSrc(file),\r\n };\r\n resetPreviewTransform();\r\n};\r\n\r\nconst switchPreviewImage = (step) => {\r\n if (!isImage(previewFile.value)) return;\r\n\r\n const index = previewImageIndex.value;\r\n const nextFile = previewImageList.value[index + step];\r\n if (!nextFile) return;\r\n\r\n emit('preview', nextFile);\r\n setImagePreviewFile(nextFile);\r\n};\r\n\r\nconst handlePreviewKeydown = (event) => {\r\n if (!previewVisible.value || !isImage(previewFile.value)) return;\r\n\r\n if (event.key === 'ArrowLeft' && hasPreviewPrev.value) {\r\n event.preventDefault();\r\n switchPreviewImage(-1);\r\n }\r\n\r\n if (event.key === 'ArrowRight' && hasPreviewNext.value) {\r\n event.preventDefault();\r\n switchPreviewImage(1);\r\n }\r\n};\r\n\r\nconst startPreviewDrag = (event) => {\r\n if (previewScale.value <= 1) return;\r\n event.preventDefault();\r\n const target = event.currentTarget;\r\n previewDragState.value = {\r\n pointerId: event.pointerId,\r\n startX: event.clientX,\r\n startY: event.clientY,\r\n translateX: previewTranslateX.value,\r\n translateY: previewTranslateY.value,\r\n };\r\n target.setPointerCapture?.(event.pointerId);\r\n target.addEventListener('pointermove', movePreviewDrag);\r\n target.addEventListener('pointerup', endPreviewDrag, { once: true });\r\n target.addEventListener('pointercancel', endPreviewDrag, { once: true });\r\n};\r\n\r\nconst movePreviewDrag = (event) => {\r\n const state = previewDragState.value;\r\n if (!state || state.pointerId !== event.pointerId) return;\r\n previewTranslateX.value = state.translateX + event.clientX - state.startX;\r\n previewTranslateY.value = state.translateY + event.clientY - state.startY;\r\n};\r\n\r\nconst endPreviewDrag = (event) => {\r\n event.currentTarget?.releasePointerCapture?.(event.pointerId);\r\n event.currentTarget?.removeEventListener('pointermove', movePreviewDrag);\r\n previewDragState.value = null;\r\n};\r\n\r\nconst openFileInNewTab = (file, fileUrl) => {\r\n if (fileUrl) {\r\n window.open(fileUrl, '_blank');\r\n return;\r\n }\r\n\r\n if (file.raw instanceof File || file.raw instanceof Blob) {\r\n const blobUrl = URL.createObjectURL(file.raw);\r\n const win = window.open(blobUrl, '_blank');\r\n win?.addEventListener('unload', () => URL.revokeObjectURL(blobUrl));\r\n }\r\n};\r\n\r\nconst openCurrentPreview = () => {\r\n if (!previewFile.value) return;\r\n openFileInNewTab(previewFile.value, previewFile.value._previewSrc || previewFile.value.url || previewFile.value.preview);\r\n};\r\n\r\nconst handlePreview = (file) => {\r\n emit('preview', file);\r\n\r\n const fileUrl = getPreviewSrc(file);\r\n\r\n // Non-image files open in a new tab.\r\n if (!isImage(file) && !isExcel(file)) {\r\n openFileInNewTab(file, fileUrl);\r\n return;\r\n }\r\n\r\n // Excel:Office Online 查看器(需要文件有公网 URL)\r\n if (isExcel(file)) {\r\n if (fileUrl && /^https?:\\/\\//.test(fileUrl)) {\r\n window.open(`https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(fileUrl)}`, '_blank');\r\n } else {\r\n // Excel without a public URL falls back to the dialog hint.\r\n previewFile.value = { ...file, _previewSrc: fileUrl };\r\n resetPreviewTransform();\r\n previewVisible.value = true;\r\n }\r\n return;\r\n }\r\n\r\n // Images preview inside the dialog.\r\n setImagePreviewFile(file);\r\n previewVisible.value = true;\r\n};\r\n\r\nwatch(previewVisible, (visible) => {\r\n if (visible) {\r\n window.addEventListener('keydown', handlePreviewKeydown);\r\n return;\r\n }\r\n\r\n window.removeEventListener('keydown', handlePreviewKeydown);\r\n resetPreviewTransform();\r\n});\r\n\r\nonBeforeUnmount(() => {\n window.removeEventListener('keydown', handlePreviewKeydown);\n revokeAllLocalPreviews();\n});\n\r\n/* -------------------- 对外暴露方法 -------------------- */\r\n/** 手动触发未上传文件的上传 */\r\nconst submit = () => {\r\n fileList.value\r\n .filter((f) => f.status === 'ready' && props.action)\r\n .forEach(uploadFile);\r\n};\r\n\r\n/** 清空文件列表 */\r\nconst clearFiles = () => {\n revokeAllLocalPreviews();\n fileList.value = [];\n syncModel();\n};\n\r\n/** 手动移除某个文件 */\r\nconst remove = (file) => handleRemove(file);\r\n\r\ndefineExpose({ submit, clearFiles, remove });\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-upload {\r\n width: 100%;\r\n}\r\n\r\n/* ---- 拖拽区域 ---- */\r\n.vtk-upload__dragger {\r\n border: 1px dashed rgba(0, 0, 0, 0.2);\r\n border-radius: 6px;\r\n padding: 24px 16px;\r\n text-align: center;\r\n cursor: pointer;\r\n transition: border-color 0.2s, background 0.2s;\r\n background: transparent;\r\n\r\n &:hover:not(.is-disabled) {\r\n border-color: rgb(var(--v-theme-primary));\r\n }\r\n\r\n &.is-dragover {\r\n border-color: rgb(var(--v-theme-primary));\r\n background: rgba(var(--v-theme-primary), 0.05);\r\n }\r\n\r\n &.is-disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n }\r\n}\r\n\r\n/* ---- 文件列表 ---- */\r\n.vtk-upload__list {\r\n border-top: 1px solid rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.vtk-upload__list-item {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n padding: 4px 4px 4px 8px;\r\n border-radius: 4px;\r\n font-size: 13px;\r\n transition: background 0.15s;\r\n\r\n &:hover {\r\n background: rgba(0, 0, 0, 0.04);\r\n }\r\n\r\n &.is-error {\r\n color: rgb(var(--v-theme-error));\r\n }\r\n\r\n &.is-success .vtk-upload__list-item-name {\r\n cursor: pointer;\r\n &:hover { color: rgb(var(--v-theme-primary)); }\r\n }\r\n}\r\n\r\n.vtk-upload__list-item-name {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n max-width: 500px;\r\n}\r\n\r\n.vtk-upload__list-progress {\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n}\r\n\r\n/* ---- picture-card ---- */\r\n.vtk-upload__picture-card-wrap {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n}\r\n\r\n.vtk-upload__picture-card-item,\r\n.vtk-upload__picture-card-add {\r\n width: 100px;\r\n height: 100px;\r\n border-radius: 6px;\r\n overflow: hidden;\r\n}\r\n\r\n.vtk-upload__picture-card-item {\r\n position: relative;\r\n border: 1px solid rgba(0, 0, 0, 0.12);\r\n\r\n &:hover .vtk-upload__picture-card-mask {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n.vtk-upload__picture-card-mask {\r\n position: absolute;\r\n inset: 0;\r\n background: rgba(0, 0, 0, 0.08);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 4px;\r\n opacity: 0;\r\n transition: opacity 0.2s;\r\n}\r\n\r\n.vtk-upload__picture-card-progress {\r\n position: absolute;\r\n inset: 0;\r\n background: rgba(0, 0, 0, 0.4);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.vtk-upload__picture-card-add {\r\n border: 1px dashed rgba(0, 0, 0, 0.2);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n transition: border-color 0.2s, background 0.2s;\r\n\r\n &:hover, &.is-dragover {\r\n border-color: rgb(var(--v-theme-primary));\r\n background: rgba(var(--v-theme-primary), 0.04);\r\n }\r\n}\r\n\r\n/* ---- 隐藏 input ---- */\r\n.vtk-upload__input {\r\n display: none;\r\n}\r\n\r\n/* ---- preview ---- */\r\n.vtk-upload__preview-card {\r\n --vtk-upload-preview-bg: rgba(0, 0, 0, 0.3);\r\n\r\n height: 100vh;\r\n background: var(--vtk-upload-preview-bg);\r\n}\r\n\r\n.vtk-upload__preview-body {\r\n height: calc(100vh - 64px);\r\n overflow: auto;\r\n background: var(--vtk-upload-preview-bg);\r\n position: relative;\r\n}\r\n\r\n.vtk-upload__preview-nav {\n position: fixed;\n top: 50%;\n z-index: 10;\n width: 50px;\n height: 50px;\n color: #fff;\n background: rgba(0, 0, 0, 0.5);\n transform: translateY(-50%);\n}\n\n.vtk-upload__preview-nav--prev {\n left: 20px;\n}\n\n.vtk-upload__preview-nav--next {\n right: 20px;\n}\n\r\n.vtk-upload__preview-image-wrap {\r\n min-width: 100%;\r\n min-height: 100%;\r\n padding: 32px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.vtk-upload__preview-image {\r\n display: block;\r\n max-width: 90vw;\r\n max-height: calc(100vh - 128px);\r\n object-fit: contain;\r\n transform-origin: center center;\r\n transition: transform 0.2s ease;\r\n user-select: none;\r\n cursor: grab;\r\n touch-action: none;\r\n\r\n &:active {\r\n cursor: grabbing;\r\n }\r\n}\r\n\r\n.vtk-upload__preview-empty {\r\n min-height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 32px;\r\n color: rgba(var(--v-theme-on-surface), 0.72);\r\n text-align: center;\r\n}\r\n</style>\r\n","import Request from \"./request.js\";\r\nimport Storage from \"./storage.js\";\r\nimport Message from \"../components/message/index.js\";\r\n\r\nfunction isAid(value) {\r\n const str = String(value || \"\");\r\n return !!str && !/^(https?:)?\\/\\//i.test(str) && !str.includes(\"/\") && !str.includes(\"?\");\r\n\r\n \r\n}\r\n\r\nfunction getLinkFromResponse(data) {\r\n if (!data) {\r\n return \"\";\r\n }\r\n\r\n if (typeof data === \"string\") {\r\n return data;\r\n }\r\n\r\n return data.puri || \"\";\r\n}\r\n\r\nfunction buildUrlWithParams(target, appendParams) {\r\n const queryString = target.includes(\"?\") ? target.split(\"?\")[1] : \"\";\r\n const queryParams = new URLSearchParams(queryString);\r\n const newParams = [];\r\n\r\n Object.entries(appendParams).forEach(([key, value]) => {\r\n if (!key || value === undefined || value === null || value === \"\") {\r\n return;\r\n }\r\n\r\n if (!queryParams.has(key)) {\r\n newParams.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\r\n }\r\n });\r\n\r\n if (!newParams.length) {\r\n return target;\r\n }\r\n\r\n const joinSymbol = target.includes(\"?\") ? \"&\" : \"?\";\r\n return `${target}${joinSymbol}${newParams.join(\"&\")}`;\r\n}\r\n\r\nfunction appendParamsToUrl(targetUrl, appendParams) {\r\n const hashIndex = targetUrl.indexOf(\"#\");\r\n\r\n if (hashIndex === -1) {\r\n return buildUrlWithParams(targetUrl, appendParams);\r\n }\r\n\r\n const baseUrl = targetUrl.slice(0, hashIndex);\r\n const hashRoute = targetUrl.slice(hashIndex + 1);\r\n const newHashRoute = buildUrlWithParams(hashRoute, appendParams);\r\n return `${baseUrl}#${newHashRoute}`;\r\n}\r\n\r\nasync function resolveAidUrl(aid) {\r\n if (!aid) {\r\n return aid;\r\n }\r\n\r\n try {\r\n const res = await Request.postForm(\"/kudas/xfwez/apps\", { aid });\r\n const realUrl = res?.meta?.success ? getLinkFromResponse(res.data) : \"\";\r\n return realUrl || aid;\r\n } catch (error) {\r\n return aid;\r\n }\r\n}\r\n\r\nfunction buildAppendParams(sobject, sroute, stokenKey) {\r\n const appendParams = {};\r\n const storageKey = stokenKey || \"_mis_acis_token\";\r\n const stoken = Storage.get(storageKey);\r\n\r\n if (stoken !== undefined && stoken !== null && stoken !== \"\") {\r\n appendParams.stoken = stoken;\r\n }\r\n\r\n if (sroute) {\r\n appendParams.sroute = sroute;\r\n }\r\n\r\n if (sobject && typeof sobject === \"object\" && Object.keys(sobject).length) {\r\n appendParams.sobject = btoa(encodeURIComponent(JSON.stringify(sobject)));\r\n }\r\n\r\n return appendParams;\r\n}\r\n\r\n/**\r\n * 解析地址中的指定参数值。\r\n * @param {string} name 参数名。\r\n * @param {string} url 要解析的地址,不传时默认使用当前地址。\r\n * @return {string} 参数值;未找到时返回空字符串。\r\n */\r\nexport function GetQueryString(name, url = window.location.href) {\r\n const reg = new RegExp(`[?&]${name}=([^&^#^/]*)`, \"i\");\r\n const res = String(url || \"\").match(reg);\r\n return res ? decodeURIComponent(res[1]) : \"\";\r\n}\r\n\r\n/**\r\n * 追加应用访问参数。\r\n * @param {string} url 链接地址或应用 aid;不传时默认取当前地址。\r\n * @param {Object} sobject 参数对象;会按 `btoa(encodeURIComponent(JSON.stringify(sobject)))` 编码后追加为 `sobject` 参数。\r\n * @param {string} sroute 页面路由标识;传值后会在最终地址中追加 `sroute=xxx`。\r\n * @param {string} stokenKey 取 `stoken` 的存储键名,默认 `_mis_acis_token`。\r\n * @return {Promise<string>} 拼接后的链接地址。\r\n */\r\nexport async function appendAppParams(url, sobject = {}, sroute = \"\", stokenKey = \"_mis_acis_token\") {\r\n if (url === undefined || url === null || url === \"\" || url === 0 || url === \"0\") {\r\n Message.toast(\"应用标识错误\", { color: \"error\" });\r\n return \"\";\r\n }\r\n\r\n const source = url || window.location.href;\r\n\r\n if (!source) {\r\n return \"\";\r\n }\r\n\r\n const targetUrl = isAid(source) ? await resolveAidUrl(source) : source;\r\n return appendParamsToUrl(targetUrl, buildAppendParams(sobject, sroute, stokenKey));\r\n}\r\n","/**\r\n * 将数值转换成中文 '0:未启/1:已启'\r\n * \r\n * @param {*} val 数值\r\n * @param {*} map 值对\r\n * @return {string} 中文值\r\n */\r\nexport function dict(val, map) {\r\n let value = \"\";\r\n if (val && val.includes(\",\")) {\r\n value = val.split(\",\").map(item => pre(item, map)).join();\r\n } else {\r\n value = pre(val, map)\r\n }\r\n return value;\r\n}\r\n\r\nfunction pre(value, map) {\r\n if (value) {\r\n var val = Array.isArray(value) ? value : value.split(\",\");\r\n var maps = map?.split(\"/\");\r\n var results = []; // 创建一个空数组,用于存储匹配到的值\r\n // 遍历 val 数组\r\n for (var j = 0; j < val?.length; j++) {\r\n var currentVal = val[j]; // 获取当前要查找的键\r\n for (var i in maps) {\r\n var kv = maps[i].split(\":\");\r\n if (kv[0] == currentVal) {\r\n results.push(kv[1]); // 将匹配到的值添加到结果数组中\r\n break; // 找到匹配项后,跳出内层循环\r\n }\r\n }\r\n }\r\n return results.length > 0 ? results.join() : \"其他\";\r\n }\r\n\r\n}\r\n\r\n\r\n/**\r\n * 1,2字符残疾类别转换\r\n * \r\n * @param {*} val 数值\r\n * @return {string} 中文值\r\n */\r\nexport function analyType(val) {\r\n if (!val) {\r\n return ''\r\n }\r\n let newVal = ''\r\n let arr = ['视力', '听力', '言语', '肢体', '智力', '精神', '多重']\r\n for (let i = 1; i < 8; i++) {\r\n if (i === 1) {\r\n newVal = val.replace(i.toString(), arr[i - 1])\r\n } else {\r\n newVal = newVal.replace(i.toString(), arr[i - 1])\r\n }\r\n }\r\n return newVal;\r\n}\r\nexport function analyLevel(val) {\r\n if (!val) {\r\n return ''\r\n }\r\n let newVal = ''\r\n let arr = ['一级', '二级', '三级', '四级', '不限等级']\r\n for (let i = 1; i < 7; i++) {\r\n if (i === 1) {\r\n newVal = val.replace(i.toString(), arr[i - 1])\r\n } else {\r\n newVal = newVal.replace(i.toString(), arr[i - 1])\r\n }\r\n }\r\n return newVal;\r\n}","/**\r\n * \r\n * @param {*} value 需格式化的时间\r\n * @param {*} fmt 格式\r\n */\r\nexport function date(value, fmt) {\r\n if (!value || value == '无' || value == null) {\r\n fmt = '无';\r\n return fmt;\r\n }\r\n let getDate = new Date(value)\r\n let o = {\r\n 'M+': getDate.getMonth() + 1,\r\n 'd+': getDate.getDate(),\r\n 'H+': getDate.getHours(),\r\n 'h+': getDate.getHours(),\r\n 'm+': getDate.getMinutes(),\r\n 's+': getDate.getSeconds(),\r\n 'q+': Math.floor((getDate.getMonth() + 3) / 3),\r\n 'S': getDate.getMilliseconds()\r\n }\r\n if (/(y+)/.test(fmt)) {\r\n fmt = fmt.replace(RegExp.$1, (getDate.getFullYear() + '').substr(4 - RegExp.$1.length))\r\n }\r\n for (let k in o) {\r\n if (new RegExp('(' + k + ')').test(fmt)) {\r\n fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))\r\n }\r\n }\r\n return fmt\r\n\r\n}\r\n\r\n\r\n/**\r\n * 数字格式化 '0,000.00'\r\n * @param {*} val 数值\r\n * @param {*} fmt 格式\r\n * @return {string} 数字字符串\r\n */\r\nexport function num(val, fmt) {\r\n if (isNaN(val) || val === '' || val === null) {\r\n return val;\r\n }\r\n\r\n // 移除了对Strings和Datetime的依赖,这些在当前上下文中未定义\r\n var numValue = parseFloat(val);\r\n var neg = numValue < 0 ? \"-\" : \"\"; // 正负数\r\n var absValue = Math.abs(numValue);\r\n\r\n // 解析格式字符串,确定小数位数\r\n var fix = 0;\r\n if (fmt && fmt.includes('.')) {\r\n fix = fmt.length - fmt.lastIndexOf('.') - 1;\r\n }\r\n\r\n // 是否需要千分位分隔符\r\n var needSep = fmt && fmt.includes(',');\r\n\r\n // 处理小数部分\r\n var xs = fix > 0 ? absValue.toFixed(fix) : Math.round(absValue);\r\n var decimalPart = fix > 0 ? '.' + xs.toString().split('.')[1] : '';\r\n\r\n // 处理整数部分\r\n var integerPart = fix > 0 ? Math.floor(absValue).toString() : xs.toString();\r\n\r\n // 添加千分位分隔符\r\n if (needSep && integerPart.length > 3) {\r\n integerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n }\r\n\r\n return neg + integerPart + decimalPart;\r\n}\r\n\r\n\r\n/**\r\n * 年龄\r\n * @param {*} val 时间 yyyy-MM-dd\r\n * @return {string} 年龄\r\n */\r\nexport function age(val) {\r\n let birthdays = new Date(val.slice(0, 10).replace(/-/g, \"/\"));\r\n let d = new Date();\r\n let age = d.getFullYear() - birthdays.getFullYear() - ((d.getMonth() < birthdays.getMonth() || (d.getMonth() === birthdays.getMonth() && d.getDate() < birthdays.getDate())) ? 1 : 0);\r\n return age;\r\n}\r\n\r\n/**\r\n * 指定中文大于len,用...省略号表示,达到美观效果\r\n * @param {*} val 需格式的中文\r\n * @param {*} len 需格式的长度\r\n */\r\nexport function txt(val, len) {\r\n if (val?.length > len) {\r\n return val.slice(0, len) + \"...\";\r\n } else {\r\n return val;\r\n }\r\n\r\n}\r\n\r\n/**\r\n * 取数据绝对值\r\n * @param {*} val 手机号\r\n */\r\nexport function abs(val) {\r\n return isNaN(val) ? 0 : Math.abs(val)\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/**\r\n * 脱敏手机号码\r\n * @param {*} val 手机号\r\n * @return {string} 手机号码\r\n */\r\nexport function mobile(val) {\r\n return val.replace(/(\\d{3})\\d{4}(\\d{4})/, \"$1****$2\");\r\n}\r\n\r\n\r\n/**\r\n * 脱敏身份证号\r\n * @param {*} val 身份证号\r\n * @return {string} 身份证号\r\n */\r\nexport function idcard(val) {\r\n if (val) {\r\n return val.replace(/^(.{4})(?:\\d+)(.{4})$/, \"$1** **** ****$2\");\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","export const red = {\n base: '#f44336',\n lighten5: '#ffebee',\n lighten4: '#ffcdd2',\n lighten3: '#ef9a9a',\n lighten2: '#e57373',\n lighten1: '#ef5350',\n darken1: '#e53935',\n darken2: '#d32f2f',\n darken3: '#c62828',\n darken4: '#b71c1c',\n accent1: '#ff8a80',\n accent2: '#ff5252',\n accent3: '#ff1744',\n accent4: '#d50000'\n};\nexport const pink = {\n base: '#e91e63',\n lighten5: '#fce4ec',\n lighten4: '#f8bbd0',\n lighten3: '#f48fb1',\n lighten2: '#f06292',\n lighten1: '#ec407a',\n darken1: '#d81b60',\n darken2: '#c2185b',\n darken3: '#ad1457',\n darken4: '#880e4f',\n accent1: '#ff80ab',\n accent2: '#ff4081',\n accent3: '#f50057',\n accent4: '#c51162'\n};\nexport const purple = {\n base: '#9c27b0',\n lighten5: '#f3e5f5',\n lighten4: '#e1bee7',\n lighten3: '#ce93d8',\n lighten2: '#ba68c8',\n lighten1: '#ab47bc',\n darken1: '#8e24aa',\n darken2: '#7b1fa2',\n darken3: '#6a1b9a',\n darken4: '#4a148c',\n accent1: '#ea80fc',\n accent2: '#e040fb',\n accent3: '#d500f9',\n accent4: '#aa00ff'\n};\nexport const deepPurple = {\n base: '#673ab7',\n lighten5: '#ede7f6',\n lighten4: '#d1c4e9',\n lighten3: '#b39ddb',\n lighten2: '#9575cd',\n lighten1: '#7e57c2',\n darken1: '#5e35b1',\n darken2: '#512da8',\n darken3: '#4527a0',\n darken4: '#311b92',\n accent1: '#b388ff',\n accent2: '#7c4dff',\n accent3: '#651fff',\n accent4: '#6200ea'\n};\nexport const indigo = {\n base: '#3f51b5',\n lighten5: '#e8eaf6',\n lighten4: '#c5cae9',\n lighten3: '#9fa8da',\n lighten2: '#7986cb',\n lighten1: '#5c6bc0',\n darken1: '#3949ab',\n darken2: '#303f9f',\n darken3: '#283593',\n darken4: '#1a237e',\n accent1: '#8c9eff',\n accent2: '#536dfe',\n accent3: '#3d5afe',\n accent4: '#304ffe'\n};\nexport const blue = {\n base: '#2196f3',\n lighten5: '#e3f2fd',\n lighten4: '#bbdefb',\n lighten3: '#90caf9',\n lighten2: '#64b5f6',\n lighten1: '#42a5f5',\n darken1: '#1e88e5',\n darken2: '#1976d2',\n darken3: '#1565c0',\n darken4: '#0d47a1',\n accent1: '#82b1ff',\n accent2: '#448aff',\n accent3: '#2979ff',\n accent4: '#2962ff'\n};\nexport const lightBlue = {\n base: '#03a9f4',\n lighten5: '#e1f5fe',\n lighten4: '#b3e5fc',\n lighten3: '#81d4fa',\n lighten2: '#4fc3f7',\n lighten1: '#29b6f6',\n darken1: '#039be5',\n darken2: '#0288d1',\n darken3: '#0277bd',\n darken4: '#01579b',\n accent1: '#80d8ff',\n accent2: '#40c4ff',\n accent3: '#00b0ff',\n accent4: '#0091ea'\n};\nexport const cyan = {\n base: '#00bcd4',\n lighten5: '#e0f7fa',\n lighten4: '#b2ebf2',\n lighten3: '#80deea',\n lighten2: '#4dd0e1',\n lighten1: '#26c6da',\n darken1: '#00acc1',\n darken2: '#0097a7',\n darken3: '#00838f',\n darken4: '#006064',\n accent1: '#84ffff',\n accent2: '#18ffff',\n accent3: '#00e5ff',\n accent4: '#00b8d4'\n};\nexport const teal = {\n base: '#009688',\n lighten5: '#e0f2f1',\n lighten4: '#b2dfdb',\n lighten3: '#80cbc4',\n lighten2: '#4db6ac',\n lighten1: '#26a69a',\n darken1: '#00897b',\n darken2: '#00796b',\n darken3: '#00695c',\n darken4: '#004d40',\n accent1: '#a7ffeb',\n accent2: '#64ffda',\n accent3: '#1de9b6',\n accent4: '#00bfa5'\n};\nexport const green = {\n base: '#4caf50',\n lighten5: '#e8f5e9',\n lighten4: '#c8e6c9',\n lighten3: '#a5d6a7',\n lighten2: '#81c784',\n lighten1: '#66bb6a',\n darken1: '#43a047',\n darken2: '#388e3c',\n darken3: '#2e7d32',\n darken4: '#1b5e20',\n accent1: '#b9f6ca',\n accent2: '#69f0ae',\n accent3: '#00e676',\n accent4: '#00c853'\n};\nexport const lightGreen = {\n base: '#8bc34a',\n lighten5: '#f1f8e9',\n lighten4: '#dcedc8',\n lighten3: '#c5e1a5',\n lighten2: '#aed581',\n lighten1: '#9ccc65',\n darken1: '#7cb342',\n darken2: '#689f38',\n darken3: '#558b2f',\n darken4: '#33691e',\n accent1: '#ccff90',\n accent2: '#b2ff59',\n accent3: '#76ff03',\n accent4: '#64dd17'\n};\nexport const lime = {\n base: '#cddc39',\n lighten5: '#f9fbe7',\n lighten4: '#f0f4c3',\n lighten3: '#e6ee9c',\n lighten2: '#dce775',\n lighten1: '#d4e157',\n darken1: '#c0ca33',\n darken2: '#afb42b',\n darken3: '#9e9d24',\n darken4: '#827717',\n accent1: '#f4ff81',\n accent2: '#eeff41',\n accent3: '#c6ff00',\n accent4: '#aeea00'\n};\nexport const yellow = {\n base: '#ffeb3b',\n lighten5: '#fffde7',\n lighten4: '#fff9c4',\n lighten3: '#fff59d',\n lighten2: '#fff176',\n lighten1: '#ffee58',\n darken1: '#fdd835',\n darken2: '#fbc02d',\n darken3: '#f9a825',\n darken4: '#f57f17',\n accent1: '#ffff8d',\n accent2: '#ffff00',\n accent3: '#ffea00',\n accent4: '#ffd600'\n};\nexport const amber = {\n base: '#ffc107',\n lighten5: '#fff8e1',\n lighten4: '#ffecb3',\n lighten3: '#ffe082',\n lighten2: '#ffd54f',\n lighten1: '#ffca28',\n darken1: '#ffb300',\n darken2: '#ffa000',\n darken3: '#ff8f00',\n darken4: '#ff6f00',\n accent1: '#ffe57f',\n accent2: '#ffd740',\n accent3: '#ffc400',\n accent4: '#ffab00'\n};\nexport const orange = {\n base: '#ff9800',\n lighten5: '#fff3e0',\n lighten4: '#ffe0b2',\n lighten3: '#ffcc80',\n lighten2: '#ffb74d',\n lighten1: '#ffa726',\n darken1: '#fb8c00',\n darken2: '#f57c00',\n darken3: '#ef6c00',\n darken4: '#e65100',\n accent1: '#ffd180',\n accent2: '#ffab40',\n accent3: '#ff9100',\n accent4: '#ff6d00'\n};\nexport const deepOrange = {\n base: '#ff5722',\n lighten5: '#fbe9e7',\n lighten4: '#ffccbc',\n lighten3: '#ffab91',\n lighten2: '#ff8a65',\n lighten1: '#ff7043',\n darken1: '#f4511e',\n darken2: '#e64a19',\n darken3: '#d84315',\n darken4: '#bf360c',\n accent1: '#ff9e80',\n accent2: '#ff6e40',\n accent3: '#ff3d00',\n accent4: '#dd2c00'\n};\nexport const brown = {\n base: '#795548',\n lighten5: '#efebe9',\n lighten4: '#d7ccc8',\n lighten3: '#bcaaa4',\n lighten2: '#a1887f',\n lighten1: '#8d6e63',\n darken1: '#6d4c41',\n darken2: '#5d4037',\n darken3: '#4e342e',\n darken4: '#3e2723'\n};\nexport const blueGrey = {\n base: '#607d8b',\n lighten5: '#eceff1',\n lighten4: '#cfd8dc',\n lighten3: '#b0bec5',\n lighten2: '#90a4ae',\n lighten1: '#78909c',\n darken1: '#546e7a',\n darken2: '#455a64',\n darken3: '#37474f',\n darken4: '#263238'\n};\nexport const grey = {\n base: '#9e9e9e',\n lighten5: '#fafafa',\n lighten4: '#f5f5f5',\n lighten3: '#eeeeee',\n lighten2: '#e0e0e0',\n lighten1: '#bdbdbd',\n darken1: '#757575',\n darken2: '#616161',\n darken3: '#424242',\n darken4: '#212121'\n};\nexport const shades = {\n black: '#000000',\n white: '#ffffff',\n transparent: '#ffffff00'\n};\nexport default {\n red,\n pink,\n purple,\n deepPurple,\n indigo,\n blue,\n lightBlue,\n cyan,\n teal,\n green,\n lightGreen,\n lime,\n yellow,\n amber,\n orange,\n deepOrange,\n brown,\n blueGrey,\n grey,\n shades\n};\n//# sourceMappingURL=colors.js.map","import colors from 'vuetify/lib/util/colors';\r\n\r\nconst theme_colors = [\r\n {\r\n name: 'Blue-light',\r\n scheme: 'md-blue-500-scheme',\r\n dark: true,\r\n primary: colors.blue.base,\r\n secondary: colors.blue.lighten4, // #FFCDD2\r\n accent: colors.blue.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Yellow-light',\r\n scheme: 'md-amber-a700-scheme',\r\n dark: true,\r\n primary: colors.amber.darken1,\r\n secondary: colors.amber.lighten4, // #FFCDD2\r\n accent: colors.amber.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Red-light',\r\n scheme: 'md-red-a400-scheme',\r\n dark: true,\r\n primary: colors.red.accent3,\r\n secondary: colors.red.lighten4, // #FFCDD2\r\n accent: colors.red.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Pink-light',\r\n dark: false,\r\n scheme: 'md-pink-a100-scheme',\r\n primary: colors.pink.accent1,\r\n secondary: colors.pink.lighten4, // #FFCDD2\r\n accent: colors.pink.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Purple-light',\r\n dark: false,\r\n scheme: 'md-purple-a700-scheme',\r\n primary: colors.purple.accent4,\r\n secondary: colors.purple.lighten4, // #FFCDD2\r\n accent: colors.purple.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'DeepPurple-light',\r\n dark: false,\r\n scheme: 'md-deep-purple-a700-scheme',\r\n primary: colors.deepPurple.base,\r\n secondary: colors.deepPurple.lighten4, // #FFCDD2\r\n accent: colors.deepPurple.accent2, // #3F51B5\r\n }\r\n];\r\n\r\nconst navi_colors = [\r\n {\r\n name: 'black',\r\n class: 'black'\r\n },\r\n {\r\n name: 'red-pink',\r\n class: 'gradient-red-pink'\r\n },\r\n {\r\n name: 'blue-grey-blue',\r\n class: 'gradient-blue-grey-blue'\r\n },\r\n {\r\n name: 'green-teal',\r\n class: 'gradient-green-teal'\r\n },\r\n {\r\n name: 'purple-deep-purple',\r\n class: 'gradient-purple-deep-purple'\r\n },\r\n {\r\n name: 'purple-amber',\r\n class: 'gradient-purple-amber'\r\n },\r\n {\r\n name: 'indigo-purple',\r\n class: 'gradient-indigo-purple'\r\n },\r\n {\r\n name: 'deep-purple-blue',\r\n class: 'gradient-deep-purple-blue'\r\n },\r\n {\r\n name: 'deep-orange-orange',\r\n class: 'gradient-deep-orange-orange'\r\n },\r\n {\r\n name: 'light-blue-cyan',\r\n class: 'gradient-light-blue-cyan'\r\n },\r\n {\r\n name: 'timber',\r\n class: 'gradient-timber'\r\n },\r\n {\r\n name: 'strawberry',\r\n class: 'gradient-strawberry'\r\n },\r\n {\r\n name: 'orange',\r\n class: 'gradient-orange'\r\n },\r\n {\r\n name: 'pomegranate',\r\n class: 'gradient-pomegranate'\r\n },\r\n {\r\n name: 'green-tea',\r\n class: 'gradient-green-tea'\r\n },\r\n {\r\n name: 'blackberry',\r\n class: 'gradient-blackberry'\r\n },\r\n {\r\n name: 'plum',\r\n class: 'gradient-plum'\r\n },\r\n {\r\n name: 'passion-fruit',\r\n class: 'gradient-passion-fruit'\r\n },\r\n {\r\n name: 'sublime-vivid',\r\n class: 'gradient-sublime-vivid'\r\n },\r\n {\r\n name: 'summer',\r\n class: 'gradient-summer'\r\n },\r\n {\r\n name: 'crystal-clear',\r\n class: 'gradient-crystal-clear'\r\n },\r\n {\r\n name: 'dawn',\r\n class: 'gradient-dawn'\r\n },\r\n {\r\n name: 'grapefruit-sunset',\r\n class: 'gradient-grapefruit-sunset'\r\n },\r\n {\r\n name: 'man-of-steel',\r\n class: 'gradient-man-of-steel'\r\n }\r\n]\r\n\r\nexport default { theme_colors, navi_colors }\r\n","/** https://github.com/shadowOfCode/bee.js */\r\nconst Validation = {\r\n //手机号码\r\n isMobile: function (input) {\r\n return /^(?:\\+86)?(?:13\\d|14[57]|15[0-35-9]|17[35-8]|18\\d)\\d{8}$|^(?:\\+86)?170[057-9]\\d{7}$/.test(input);\r\n },\r\n //手机号码简单校验,只校验长度\r\n isMobileSize: function (input) {\r\n return /^(?:\\+86)?1\\d{10}$/.test(input);\r\n },\r\n isPhone: function (input) {\r\n return /^(?:\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}(?:-\\d{1,4})?$/.test(input);\r\n },\r\n isCall: (input) => {\r\n return this.isPhone(input) || this.isMobile(input);\r\n },\r\n //邮箱格式校验\r\n isEmail: function (input) {\r\n return /^[-\\w+]+(?:\\.[-\\w]+)*@[-a-z0-9]+(?:\\.[a-z0-9]+)*(?:\\.[a-z]{2,})$/i.test(input);\r\n },\r\n //18位身份证简单校验\r\n isIdCardSimple: function (idCard) {\r\n return /^(?:1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5])\\d{4}(?:1[89]|20)\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])\\d{3}(?:\\d|[xX])$/.test(idCard);\r\n },\r\n // 真实姓名校验\r\n isName: function (input) {\r\n return /^([\\u4e00-\\u9fa5]{1,20}|[a-zA-Z.\\s]{1,20})$/.test(input);\r\n },\r\n //\r\n //18位身份证严格校验\r\n isIdCard: function (idCard) {\r\n let checkCode = (input) => {\r\n var multiplier = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\r\n var ids = input.split(\"\");\r\n var len = 17, sum = 0;\r\n for (var i = 0; i < len; i++) {\r\n sum += ids[i] * multiplier[i];\r\n }\r\n var remainder = sum % 11;\r\n var checkCodeArr = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\r\n var result = checkCodeArr[remainder];\r\n return result === input[17];\r\n }\r\n //先校验格式\r\n if (this.isIdCardSimple(idCard)) {\r\n //校验日期时间是否合法\r\n var dateStr = idCard.substr(6, 8);\r\n var dateStrNew = dateStr.replace(/(\\d{4})(\\d{2})(\\d{2})/, \"$1/$2/$3\");\r\n var dateObj = new Date(dateStrNew);\r\n var month = dateObj.getMonth() + 1;\r\n if (parseInt(dateStr.substr(4, 2)) === month) {\r\n return checkCode(idCard);\r\n }\r\n }\r\n return false;\r\n },\r\n getFromIdCard: (idCard) => {\r\n var area = idCard.substr(0, 6);\r\n var birth = idCard.substr(6, 8).replace(/(\\d{4})(\\d{2})(\\d{2})/, '$1年$2月$3日');\r\n var age = new Date().getFullYear() - idCard.substr(6, 4) + 1;\r\n var sex = (idCard.substr(16, 1) % 2 === 0) ? '女' : '男';\r\n\r\n return {\r\n 'area': area,\r\n 'birth': birth,\r\n 'age': age,\r\n 'sex': sex\r\n };\r\n }\r\n};\r\n\r\nexport default Validation;","<template>\r\n <VDialog v-model=\"isActive\" persistent :width=\"options.width\">\r\n <VCard :color=\"options.color\">\r\n <VCardTitle>{{ options.title }}</VCardTitle>\r\n <VCardText v-if=\"options.text\">\r\n {{ options.text }}\r\n </VCardText>\r\n <VCardActions>\r\n <VSpacer />\r\n <VBtn text @click=\"close_modal\">确定</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VDialog>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js' // 根据实际路径调整\r\n\r\nconst messageStore = useMessageStore()\r\n\r\n\r\n// 使用 computed 获取响应式数据\r\nconst isActive = computed(() => messageStore.alert?.isActive || false)\r\nconst options = computed(() => messageStore.alert?.options || {})\r\n\r\n// 关闭模态框方法\r\nconst close_modal = () => {\r\n messageStore.hide('alert')\r\n}\r\n</script>","<template>\r\n <VDialog v-model=\"isActive\" persistent :max-width=\"options.width || 400\">\r\n <VCard :color=\"options.color\">\r\n <VCardTitle>{{ options.title }}</VCardTitle>\r\n <VCardText v-if=\"options.text\">\r\n {{ options.text }}\r\n </VCardText>\r\n <VCardActions>\r\n <VSpacer />\r\n <VBtn text @click=\"cancel\">{{ options.cancelText || '取消' }}</VBtn>\r\n <VBtn text @click=\"confirm\">{{ options.confirmText || '确定' }}</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VDialog>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst messageStore = useMessageStore()\r\n\r\n// 使用 computed 获取响应式数据\r\nconst isActive = computed(() => messageStore.confirm?.isActive || false)\r\nconst options = computed(() => messageStore.confirm?.options || {})\r\n\r\n// 确认操作\r\nconst confirm = () => {\r\n // 如果 options.onConfirm 存在则执行回调\r\n if (typeof options.value.onConfirm === 'function') {\r\n options.value.onConfirm()\r\n }\r\n messageStore.hide('confirm')\r\n}\r\n\r\n// 取消操作\r\nconst cancel = () => {\r\n // 如果 options.onCancel 存在则执行回调\r\n if (typeof options.value.onCancel === 'function') {\r\n options.value.onCancel()\r\n }\r\n messageStore.hide('confirm')\r\n}\r\n</script>","<template>\r\n <v-overlay v-model=\"isActive\" persistent class=\"align-center justify-center\" :style=\"{ zIndex: 9999 }\">\r\n <v-progress-circular indeterminate size=\"64\" width=\"6\" color=\"primary\"></v-progress-circular>\r\n </v-overlay>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst messageStore = useMessageStore()\r\n\r\nconst isActive = computed(() => messageStore.loading?.isActive || false)\r\n</script>\r\n","<template>\r\n <div class=\"text-center\">\r\n <vtk-alert />\r\n <vtk-confirm />\r\n <vtk-loading />\r\n <vtk-prompt />\r\n <vtk-toast />\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport vtkAlert from \"./alert.vue\";\r\nimport vtkConfirm from \"./confirm.vue\";\r\nimport vtkLoading from \"./loading.vue\";\r\nimport vtkPrompt from \"./prompt.vue\";\r\nimport vtkToast from \"./toast.vue\";\r\nexport default {\r\n name: \"vtkMessage\",\r\n components: {\r\n vtkAlert,\r\n vtkConfirm,\r\n vtkLoading,\r\n vtkPrompt,\r\n vtkToast,\r\n },\r\n};\r\n</script>","<template>\r\n <VDialog v-model=\"isActive\" persistent :width=\"options.width\">\r\n <VCard :color=\"options.color\">\r\n <VCardTitle>{{ options.title }}</VCardTitle>\r\n <VCardText>\r\n <VTextField\r\n v-model=\"inputValue\"\r\n :label=\"options.label\"\r\n :placeholder=\"options.placeholder\"\r\n :type=\"options.inputType || 'text'\"\r\n outlined\r\n dense\r\n />\r\n <div v-if=\"options.text\" class=\"mt-2\">\r\n {{ options.text }}\r\n </div>\r\n </VCardText>\r\n <VCardActions>\r\n <VSpacer />\r\n <VBtn text @click=\"cancel\">{{ options.cancelText || '取消' }}</VBtn>\r\n <VBtn text @click=\"confirm\">{{ options.confirmText || '确定' }}</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VDialog>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst messageStore = useMessageStore()\r\nconst inputValue = ref('')\r\n\r\n// 使用 computed 获取响应式数据\r\nconst isActive = computed(() => messageStore.prompt?.isActive || false)\r\nconst options = computed(() => messageStore.prompt?.options || {})\r\n\r\n// 确认操作\r\nconst confirm = () => {\r\n // 如果 options.onConfirm 存在则执行回调\r\n if (typeof options.value.onConfirm === 'function') {\r\n options.value.onConfirm(inputValue.value)\r\n }\r\n messageStore.hide('prompt')\r\n inputValue.value = '' // 清空输入值\r\n}\r\n\r\n// 取消操作\r\nconst cancel = () => {\r\n // 如果 options.onCancel 存在则执行回调\r\n if (typeof options.value.onCancel === 'function') {\r\n options.value.onCancel()\r\n }\r\n messageStore.hide('prompt')\r\n inputValue.value = '' // 清空输入值\r\n}\r\n</script>","<template>\r\n\t<VSnackbar v-model=\"isActive\" :timeout=\"options.timeout > 0 ? options.timeout : 3000\" :color=\"options.color\" centered @update:modelValue=\"onModelUpdate\">\r\n\t\t{{ options.text }}\r\n\t\t<template v-slot:actions>\r\n\t\t\t<VBtn text icon @click=\"close_modal()\">\r\n\t\t\t\t<VIcon>mdi-close</VIcon>\r\n\t\t\t</VBtn>\r\n\t\t</template>\r\n\t</VSnackbar>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from \"vue\";\r\nimport { useMessageStore } from \"../../stores/message.js\";\r\n\r\nconst messageStore = useMessageStore();\r\n\r\nconst isActive = computed({\r\n\tget: () => messageStore.toast?.isActive || false,\r\n\tset: (value) => {\r\n\t\tif (messageStore.toast) {\r\n\t\t\tmessageStore.toast.isActive = value;\r\n\t\t}\r\n\t},\r\n});\r\n\r\nconst options = computed(() => messageStore.toast?.options || {});\r\n\r\nconst close_modal = () => {\r\n\tmessageStore.hide(\"toast\");\r\n};\r\n\r\n// 监听模型值更新\r\nconst onModelUpdate = (value) => {\r\n\tif (!value) {\r\n\t\t// Snackbar 关闭时确保 store 状态同步\r\n\t\tmessageStore.hide(\"toast\");\r\n\t}\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n:deep(.v-snackbar__wrapper) {\r\n\ttop: 24px;\r\n}\r\n</style>\r\n","/**\r\n * Specter PUI - Vue 3 组件库\r\n */\r\n\r\nexport { default as VtkArea } from \"./components/assembly/VtkArea.vue\";\r\nexport { default as VtkAreaTabs } from \"./components/assembly/VtkAreaTabs.vue\";\r\nexport { default as VtkBreadcrumb } from \"./components/assembly/VtkBreadcrumb.vue\";\r\nexport { default as VtkCheckbox } from \"./components/assembly/VtkCheckbox.vue\";\r\nexport { default as VtkCount } from \"./components/assembly/VtkCount.vue\";\nexport { default as VtkDatePicker } from \"./components/assembly/VtkDatePicker.vue\";\nexport { default as VtkDateSelector } from \"./components/assembly/VtkDateSelector.vue\";\nexport { default as VtkDateTimePicker } from \"./components/assembly/VtkDateTimePicker.vue\";\nexport { default as VtkDept } from \"./components/assembly/VtkDept.vue\";\nexport { default as VtkEmpty } from \"./components/assembly/VtkEmpty.vue\";\nexport { default as VtkEmptyNew } from \"./components/assembly/VtkEmptyNew.vue\";\nexport { default as VtkFab } from \"./components/assembly/VtkFab.vue\";\nexport { default as VtkFormItem } from \"./components/assembly/VtkFormItem.vue\";\nexport { default as VtkImg } from \"./components/assembly/VtkImg.vue\";\r\nexport { default as VtkPage } from \"./components/assembly/VtkPage.vue\";\r\nexport { default as VtkPdf } from \"./components/assembly/VtkPdf.vue\";\r\nexport { default as VtkProj } from \"./components/assembly/VtkProj.vue\";\r\nexport { default as VtkRadio } from \"./components/assembly/VtkRadio.vue\";\r\nexport { default as VtkSearch } from \"./components/assembly/VtkSearch.vue\";\nexport { default as VtkSelect } from \"./components/assembly/VtkSelect.vue\";\nexport { default as VtkSinglePage } from \"./components/assembly/VtkSinglePage.vue\";\nexport { default as VtkStepper } from \"./components/assembly/VtkStepper.vue\";\nexport { default as VtkUpload } from \"./components/assembly/VtkUpload.vue\";\r\n\r\nexport * from \"./commons/location.js\";\r\nexport * from \"./commons/filters/dictionary.js\";\r\nexport * from \"./commons/filters/format.js\";\r\nexport * from \"./commons/filters/mask.js\";\r\nexport { default as request } from \"./commons/request.js\";\r\nexport { default as storage } from \"./commons/storage.js\";\r\nexport { default as themes } from \"./commons/themes.js\";\r\nexport * from \"./commons/validation.js\";\r\n\r\nexport { useMixins } from \"./composables/usePage.js\";\r\nexport { default as vtkMessage } from \"./components/message/index.js\";\r\n\r\nimport vtkMessage from \"./components/message/index.js\";\r\nimport storage from \"./commons/storage.js\";\r\nimport themes from \"./commons/themes.js\";\r\nimport request from \"./commons/request.js\";\r\nimport * as location from \"./commons/location.js\";\r\nimport Validation from \"./commons/validation.js\";\r\nimport * as dictionary from \"./commons/filters/dictionary.js\";\r\nimport * as mask from \"./commons/filters/mask.js\";\r\nimport * as format from \"./commons/filters/format.js\";\r\n\r\nimport VtkArea from \"./components/assembly/VtkArea.vue\";\r\nimport VtkAreaTabs from \"./components/assembly/VtkAreaTabs.vue\";\r\nimport VtkBreadcrumb from \"./components/assembly/VtkBreadcrumb.vue\";\r\nimport VtkCheckbox from \"./components/assembly/VtkCheckbox.vue\";\r\nimport VtkCount from \"./components/assembly/VtkCount.vue\";\nimport VtkDatePicker from \"./components/assembly/VtkDatePicker.vue\";\nimport VtkDateSelector from \"./components/assembly/VtkDateSelector.vue\";\nimport VtkDateTimePicker from \"./components/assembly/VtkDateTimePicker.vue\";\nimport VtkDept from \"./components/assembly/VtkDept.vue\";\nimport VtkEmpty from \"./components/assembly/VtkEmpty.vue\";\nimport VtkEmptyNew from \"./components/assembly/VtkEmptyNew.vue\";\nimport VtkFab from \"./components/assembly/VtkFab.vue\";\nimport VtkFormItem from \"./components/assembly/VtkFormItem.vue\";\nimport VtkImg from \"./components/assembly/VtkImg.vue\";\r\nimport VtkPage from \"./components/assembly/VtkPage.vue\";\r\nimport VtkPdf from \"./components/assembly/VtkPdf.vue\";\r\nimport VtkProj from \"./components/assembly/VtkProj.vue\";\r\nimport VtkRadio from \"./components/assembly/VtkRadio.vue\";\r\nimport VtkSearch from \"./components/assembly/VtkSearch.vue\";\nimport VtkSelect from \"./components/assembly/VtkSelect.vue\";\nimport VtkSinglePage from \"./components/assembly/VtkSinglePage.vue\";\nimport VtkStepper from \"./components/assembly/VtkStepper.vue\";\nimport VtkUpload from \"./components/assembly/VtkUpload.vue\";\r\nimport VtkMessageComponent from \"./components/message/vtkMessage.vue\";\r\n\r\nfunction install(app, options = {}) {\r\n const components = {\r\n VtkArea,\r\n VtkAreaTabs,\r\n VtkBreadcrumb,\r\n VtkCheckbox,\r\n VtkCount,\n VtkDatePicker,\n VtkDateSelector,\n VtkDateTimePicker,\n VtkDept,\n VtkEmpty,\n VtkEmptyNew,\n VtkFab,\n VtkFormItem,\n VtkImg,\r\n VtkPage,\r\n VtkPdf,\r\n VtkProj,\r\n VtkRadio,\r\n VtkSearch,\n VtkSelect,\n VtkSinglePage,\n VtkStepper,\n VtkUpload,\r\n VtkMessage: VtkMessageComponent\r\n };\r\n\r\n Object.keys(components).forEach(name => {\r\n app.component(name, components[name]);\r\n });\r\n\r\n app.config.globalProperties.$vtk = {\r\n message: vtkMessage,\r\n request,\r\n storage,\r\n themes,\r\n location,\r\n Validation,\r\n filters: {\r\n ...dictionary,\r\n ...mask,\r\n ...format\r\n },\r\n ...options\r\n };\r\n\r\n return app;\r\n}\r\n\r\nexport default {\r\n install,\r\n VtkArea,\r\n VtkAreaTabs,\r\n VtkBreadcrumb,\r\n VtkCheckbox,\r\n VtkCount,\n VtkDatePicker,\n VtkDateSelector,\n VtkDateTimePicker,\n VtkDept,\n VtkEmpty,\n VtkEmptyNew,\n VtkFab,\n VtkFormItem,\r\n VtkImg,\r\n VtkPage,\r\n VtkPdf,\r\n VtkProj,\r\n VtkRadio,\r\n VtkSearch,\n VtkSelect,\n VtkSinglePage,\n VtkStepper,\n VtkUpload,\r\n request,\r\n storage,\r\n themes,\r\n vtkMessage\r\n};\r\n"],"names":["Storage","storage","type","key","js","value","useMessageStore","defineStore","options","Message","messageStore","defaultOptions","text","toastOptions","service","axios","config","tokenKey","_b","_a","error","response","res","header","handleRedirect","url","index","newUrl","Request","data","method","headers","responseType","proxy","getCurrentInstance","emit","__emit","entity","reactive","user","ref","areaData","onMounted","userKey","area","nextArea","areaCode","inputFn","e","clear","arr","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_component_VSelect","_cache","$event","__props","_createBlock","_c","_normalizeClass","_d","_e","_f","_g","_h","_i","_normalizeStyle","_j","props","menu","tab","tabItems","areaStorage","areaItems","current","itemValue","itemText","view","code","province","city","district","town","village","tabArea","areaChange","item","getTree","nextTick","getAreaName","save","val","lastItem","close","textClear","initCode","watch","newVal","oldVal","_component_v_menu","_withCtx","_component_v_btn","_mergeProps","$attrs","_createElementVNode","_toDisplayString","_component_v_icon","_component_v_card","_hoisted_2","_Fragment","_renderList","link","_component_v_sheet","_component_v_tabs","_component_v_tab","_createTextVNode","_vShow","_component_v_chip_group","_component_v_chip","_component_v_card_actions","_component_v_spacer","router","inject","route","breadcrumbItems","computed","matched","r","pathArray","p","path","routePath","handleBack","_component_v_breadcrumbs","_component_v_breadcrumbs_item","localValue","isUpdatingLocal","isUpdatingModel","attrs","useAttrs","inputAttrs","list","inline","modelValue","rest","checkboxAttrs","errorMessages","rules","hint","persistentHint","inputValue","items","statc","it","codeValue","miscs","_component_VInput","_component_VCheckbox","currentNumber","currentDigits","digitKey","isAnimating","formatNumber","num","result","targetNumberString","startNumberString","maxDigitString","target","start","getCurrentDigit","initDigitsArray","startStr","char","startChar","getDigitStyle","currentValue","digitValue","offset","translateY","startAnimation","startTime","startValue","endValue","diff","animate","currentTime","elapsed","progress","easeOutQuart","updateDigitArray","valueStr","maxStr","i","newStr","oldStr","endStr","__expose","digitChar","_hoisted_4","_hoisted_3","n","_hoisted_5","dateRange","startDateRange","endDateRange","displayValue","formatDate","textFieldProps","placeholder","disabled","min","max","showCurrent","format","separator","date","year","month","day","minDate","maxDate","newValue","dates","onStartDateChange","onEndDateChange","clearValue","cancel","confirm","sortedRange","date1","date2","_component_VMenu","activatorProps","_component_VTextField","_component_VIcon","_component_VCard","_component_VCardText","_component_VDatePicker","_component_VDivider","_component_VCardActions","_component_VSpacer","_component_VBtn","YEAR_PAGE_SIZE","YEAR_PAGE_CENTER_OFFSET","MONTHS","getYearPageStart","openPicker","yearPageStart","yearPage","_","canShowNextYearPage","isYearDisabled","isMonthDisabled","togglePicker","closePicker","shiftYearPage","nextStart","selectYear","selectMonth","handleNavigate","direction","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","YEAR_PANEL_SIZE","YEAR_PANEL_CENTER_OFFSET","showPicker","viewMode","currentYear","currentMonth","rightYear","rightMonth","selectedValue","tempValue","today","todayYear","todayMonth","todayDate","weekDays","monthList","menuAttach","menuLocation","menuOrigin","normalizeCssSize","nextValue","rootStyle","width","popupStyle","formatDisplay","week","yearList","startYear","weekList","weeks","firstDay","lastDay","currentDate","weekNumber","getWeekNumber","isToday","dayList","days","startDate","endDate","nextMonthYear","nextMonthMonth","nextMonthDayList","d","dayNum","yearStart","isYearSelected","v","isYearInRange","end","isMonthSelected","monthStr","isMonthInRange","isWeekSelected","weekStr","isWeekInRange","isDaySelected","isDayInRange","isDayRangeStart","isDayRangeEnd","isFutureYear","isFutureMonth","isFutureDay","yearStr","first","selectMonthRight","isMonthSelectedRight","isMonthInRangeRight","selectWeek","selectDay","prevPeriod","nextPeriod","prevMonth","nextMonthLeft","prevMonthRight","nextMonth","prevYear","nextYearLeft","prevYearRight","nextYear","changeViewMode","mode","initializePicker","isOpen","handleCancel","handleConfirm","menuProps","VtkDatePanelHeader","_unref","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","defaultStartTime","defaultEndTime","selectedDateTime","selectedRange","tempDate","tempRange","leftYear","leftMonth","selectedHour","selectedMinute","selectedSecond","activeRangeSide","activeTimeSide","activeSingleTime","isRange","menuWidth","minDateTime","parseValue","maxDateTime","hourOptions","minuteOptions","buildStepOptions","secondOptions","getDayList","leftDayList","rightDayList","formatByPattern","buildTempDateTime","singleTimeValue","pattern","canConfirm","isDateTimeDisabled","activeRangeDate","activeRangeHour","activeRangeMinute","activeRangeSecond","step","normalizedStep","startDay","daysInMonth","daysInPrevMonth","createDay","otherMonth","isSameDate","padTime","replacements","token","formatDatePart","formatTimePart","match","fallback","hour","minute","second","parseRangeValue","toModelValue","toModelRange","range","left","right","isDayDisabled","isTimePartDisabled","isRangeDaySelected","side","isRangeDayInRange","rangeDayClass","setSinglePanelFromDate","setRangePanelsFromDate","base","prevLeftMonth","nextRightMonth","selectRangeDay","selected","currentStart","currentEnd","selectHour","selectMinute","selectSecond","openRangeTime","selectRangeTime","part","clearTempRange","handleNow","now","_hoisted_21","pause","ms","resolve","dialog","areaSelectedData","areaActivatedData","getDeptList","getAreaList","getAreaNextList","parentCode","deptData","deptSelectedData","deptActivatedData","getPersonList","node","params","getDepNextList","selectAreaCode","selectPid","personData","selectedPersonData","allSelectedPersons","isRestoringSelection","selectedPersonList","uniqueMap","person","oldPerson","newPersonData","currentSelected","removeSelectedPerson","personId","globalIndex","currentIndex","add","selectedPersons","_component_v_dialog","_component_v_card_title","_component_v_divider","_component_v_card_text","_component_v_row","_component_v_col","_component_v_treeview","_component_v_avatar","_component_v_img","_component_v_list","_component_v_list_item","_component_v_empty_state","$slots","_renderSlot","_ctx","emptyImg","showFab","fabClass","handleScroll","scrollToTop","onBeforeUnmount","_Transition","_component_v_fab","processedMaxWidth","contentStyles","styles","showPreview","imageRotation","imageScale","imageTranslateX","imageTranslateY","imageDragState","srcWithToken","currentImageUrl","currentImage","currentImageRawUrl","currentImageDownloadUrl","currentImageTitle","currentImageDescription","hasPrev","hasNext","viewerImageStyle","openCurrentImageInNewWindow","imageMimeExtensionMap","imageExtensionMimeMap","getImageFileExtension","blob","mimeType","pathname","getCurrentImageFileName","extension","titleName","urlName","isDownloadRiskWebView","ua","getDownloadFailureReason","message","name","validateImageBlob","bitmap","reject","image","triggerBrowserDownload","fileName","triggerBrowserUrlDownload","showDownloadToast","color","toast","getDownloadFileHandle","isImageResponse","contentType","fetchImageBlob","fetchCurrentImageBlob","downloadCurrentImage","downloadUrl","fileHandle","writable","failureReason","resetImageTransform","openPreview","closePreview","prevImage","nextImage","rotateImage","degrees","zoomImage","nextScale","handleImageWheel","event","startImageDrag","moveImageDrag","endImageDrag","state","_component_v_progress_circular","_component_VCardTitle","_component_v_card_subtitle","_component_VDialog","_component_v_toolbar","_component_v_toolbar_title","_component_v_toolbar_items","pagination","pageSizeObjs","pageDatas","paginationChange","pageChange","pageSizeFormat","toPage","pageSizeChange","temp","obj","page","_component_VRow","_component_v_pagination","loading","pdfLoaded","currentPage","pageCount","pdfContainer","pdfDoc","loadPdf","renderPage","pageNum","prevPage","nextPage","downloadPdf","_component_VCol","_component_VSlider","useMixins","urlConfig","queryParam","desserts","superQueryParams","pageData","sumup","pageDataCopy","overlay","getQueryParams","codex","loadPage","pageInfo","id","record","modalFormRef","disposition","filename","newUrlConfig","getListPage","expData","mixinQueryParam","examType","permits","projName","projTip","bizType","expShow","menu1","expArr","formArr","select","selectAll","delItem","delNote","MprojRef","onActivated","examAll","chkAll","getUserInfo","examWait","toView","searchProj","param","searchQuery","exv","exp","del","delSave","tip","formatIdCard","idcard","dateStr","getServStateClass","getServStateText","getRateStateClass","getRateStateText","getServFromText","from","_component_VContainer","_component_VTabs","_component_VTab","_component_vtk_search","_component_vtk_area_tabs","_component_vtk_select","_component_VDataTable","_component_VChip","_component_vtk_empty","_component_vtk_page","_component_vtk_proj","_component_VTextarea","onUpdate","_component_VRadioGroup","_component_VRadio","instance","cloneValue","cloneQueryParam","source","isSameValue","a","b","initialQueryParam","externalQueryParam","initialIndex","initVal","contentStyle","minValue","maxValue","minHeight","maxHeight","nextExternalQueryParam","nextQueryParam","obtain","filterNull","search","reset","handleResetClick","_component_VBadge","filteredAttrs","multi","its","$emit","normalizePositiveInteger","parsedValue","initialLimit","rowCount","hasTotal","pageSizeItems","rowLength","hasNextPage","values","emitPageChange","goToPage","targetPage","handlePageSizeChange","previousPage","_component_v_select","_component_v_text_field","stepIndex","content","_component_VStepper","_component_VStepperHeader","_component_VStepperWindow","_component_VStepperWindowItem","inputRef","isDragover","previewVisible","previewFile","previewScale","previewRotation","previewTranslateX","previewTranslateY","previewDragState","fileList","isSyncingModel","localPreviewUrls","revokeAllLocalPreviews","normalizeFileList","uidCounter","genUid","getFileNameFromUrl","cleanUrl","isImageUrl","isImage","file","fileIcon","getPreviewSrc","revokeLocalPreview","preview","previewImageList","previewImageIndex","hasPreviewPrev","hasPreviewNext","previewImageStyle","triggerInput","onDragover","onDrop","processFiles","onInputChange","rawFiles","raw","errFile","buildFile","reader","beforeHook","addFile","uploadFile","status","syncModel","urls","f","formData","k","err","handleRemove","doRemove","isExcel","resetPreviewTransform","rotatePreview","zoomPreview","setImagePreviewFile","switchPreviewImage","nextFile","handlePreviewKeydown","startPreviewDrag","movePreviewDrag","endPreviewDrag","openFileInNewTab","fileUrl","blobUrl","win","openCurrentPreview","handlePreview","visible","_withModifiers","_component_v_progress_linear","isAid","str","getLinkFromResponse","buildUrlWithParams","appendParams","queryString","queryParams","newParams","joinSymbol","appendParamsToUrl","targetUrl","hashIndex","baseUrl","hashRoute","newHashRoute","resolveAidUrl","aid","buildAppendParams","sobject","sroute","stokenKey","storageKey","stoken","GetQueryString","reg","appendAppParams","dict","map","pre","maps","results","j","currentVal","kv","analyType","analyLevel","fmt","getDate","o","numValue","neg","absValue","fix","needSep","xs","decimalPart","integerPart","age","birthdays","txt","len","abs","mobile","colors","themes","Validation","input","this","idCard","checkCode","multiplier","ids","sum","remainder","checkCodeArr","dateStrNew","dateObj","birth","sex","isActive","close_modal","_component_v_overlay","_sfc_main","vtkAlert","vtkConfirm","vtkLoading","onModelUpdate","_component_VSnackbar","_component_vtk_alert","_component_vtk_confirm","_component_vtk_loading","_component_vtk_prompt","_component_vtk_toast","install","app","components","VtkArea","VtkAreaTabs","VtkBreadcrumb","VtkCheckbox","VtkCount","VtkDatePicker","VtkDateSelector","VtkDateTimePicker","VtkDept","VtkEmpty","VtkEmptyNew","VtkFab","VtkFormItem","VtkImg","VtkPage","VtkPdf","VtkProj","VtkRadio","VtkSearch","VtkSelect","VtkSinglePage","VtkStepper","VtkUpload","VtkMessageComponent","vtkMessage","request","location","dictionary","mask"],"mappings":"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","x_google_ignoreList":[34]}
1
+ {"version":3,"file":"specter-pui.umd.js","sources":["../src/commons/storage.js","../src/stores/message.js","../src/components/message/index.js","../src/commons/request.js","../src/components/assembly/VtkArea.vue","../src/components/assembly/VtkAreaTabs.vue","../src/components/assembly/VtkBreadcrumb.vue","../src/components/assembly/VtkCheckbox.vue","../src/components/assembly/VtkCount.vue","../src/components/assembly/VtkDatePicker.vue","../src/components/assembly/VtkDatePanelHeader.vue","../src/components/assembly/VtkDateSelector.vue","../src/components/assembly/VtkDateTimePicker.vue","../src/components/assembly/VtkDept.vue","../src/components/assembly/VtkEmpty.vue","../src/assets/img/empty.svg","../src/components/assembly/VtkEmptyNew.vue","../src/components/assembly/VtkFab.vue","../src/components/assembly/VtkFormItem.vue","../src/components/assembly/VtkImg.vue","../src/components/assembly/VtkPage.vue","../src/components/assembly/VtkPdf.vue","../src/composables/usePage.js","../src/components/assembly/VtkProj.vue","../src/components/assembly/VtkRadio.vue","../src/components/assembly/VtkSearch.vue","../src/components/assembly/VtkSelect.vue","../src/components/assembly/VtkSinglePage.vue","../src/components/assembly/VtkStepper.vue","../src/components/assembly/VtkUpload.vue","../src/commons/location.js","../src/commons/filters/dictionary.js","../src/commons/filters/format.js","../src/commons/filters/mask.js","../node_modules/vuetify/lib/util/colors.js","../src/commons/themes.js","../src/commons/validation.js","../src/components/message/alert.vue","../src/components/message/confirm.vue","../src/components/message/loading.vue","../src/components/message/vtkMessage.vue","../src/components/message/prompt.vue","../src/components/message/toast.vue","../src/index.js"],"sourcesContent":["const Storage = {};\r\n/** 获取Storage对象 */\r\nconst storage = (type = 'local') => {\r\n return type == \"local\" ? window.localStorage : window.sessionStorage;\r\n}\r\n/**\r\n * 获取对应缓存值JSON对象\r\n * @param {string} key 键\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n * @return {object} 对应的值JSON对象\r\n */\r\nStorage.get = (key, type = 'local') => {\r\n var js = storage(type).getItem(key);\r\n return /^[\\\\{|\\\\[].+[\\\\}|\\\\]]$/.test(js) ? JSON.parse(js) : js;\r\n};\r\n/**\r\n * 设置存储缓存取对象JSON\r\n * @param {string} key 键\r\n * @param {string} value 值(JSON对象)\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n */\r\nStorage.set = (key, value, type = 'local') => {\r\n value = (value.constructor === Object) ? JSON.stringify(value) : value\r\n storage(type).setItem(key, value);\r\n};\r\n/**\r\n * 删除对应的缓存对象JSON\r\n * @param {string} key 键\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n */\r\nStorage.remove = (key, type = 'local') => {\r\n storage(type).removeItem(key);\r\n};\r\n/**\r\n * 清空所有的缓存对象JSON\r\n * @param {string} type 默认为localStorage, 'session'为sessionStorage\r\n */\r\nStorage.clear = (type = 'local') => {\r\n storage(type).clear();\r\n};\r\n\r\nexport default Storage;\r\n","// stores/message.js\r\nimport { defineStore } from 'pinia'\r\n\r\nexport const useMessageStore = defineStore('message', {\r\n state: () => ({\r\n alert: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 500\r\n }\r\n },\r\n confirm: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 400,\r\n cancelText: '取消',\r\n confirmText: '确定'\r\n }\r\n },\r\n loading: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 300,\r\n indeterminate: true,\r\n value: 0,\r\n progressColor: 'primary',\r\n size: 64,\r\n circleWidth: 6\r\n }\r\n },\r\n prompt: {\r\n isActive: false,\r\n options: {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 500,\r\n label: '',\r\n placeholder: '',\r\n inputType: 'text',\r\n cancelText: '取消',\r\n confirmText: '确定'\r\n }\r\n },\r\n toast: {\r\n isActive: false,\r\n options: {\r\n text: '',\r\n color: '',\r\n timeout: 3000,\r\n position: 'top'\r\n }\r\n }\r\n }),\r\n \r\n actions: {\r\n hide(type) {\r\n if (this[type]) {\r\n this[type].isActive = false\r\n }\r\n },\r\n \r\n show(type, options) {\r\n if (this[type]) {\r\n this[type] = {\r\n isActive: true,\r\n options: options\r\n }\r\n }\r\n }\r\n }\r\n})","// components/message/index.js\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst Message = {\r\n // 显示 alert\r\n alert(options) {\r\n const messageStore = useMessageStore()\r\n messageStore.show('alert', options)\r\n },\r\n \r\n // 显示 confirm\r\n confirm(options) {\r\n const messageStore = useMessageStore()\r\n messageStore.show('confirm', options)\r\n },\r\n \r\n // loading 对象,包含 show 和 hide 方法\r\n loading: {\r\n show(options = {}) {\r\n const messageStore = useMessageStore()\r\n const defaultOptions = {\r\n title: '',\r\n text: '',\r\n color: '',\r\n width: 120,\r\n indeterminate: true,\r\n progressColor: 'primary',\r\n size: 64,\r\n circleWidth: 6\r\n }\r\n messageStore.show('loading', { ...defaultOptions, ...options })\r\n },\r\n hide() {\r\n const messageStore = useMessageStore()\r\n messageStore.hide('loading')\r\n }\r\n },\r\n \r\n // 显示 prompt\r\n prompt(options) {\r\n const messageStore = useMessageStore()\r\n messageStore.show('prompt', options)\r\n },\r\n \r\n // 显示 toast\r\n toast(text, options = {}) {\r\n \r\n const messageStore = useMessageStore()\r\n // 确保传入的是字符串时正确处理\r\n const toastOptions = typeof text === 'string' \r\n ? { text, ...options }\r\n : text\r\n messageStore.show('toast', toastOptions)\r\n },\r\n \r\n // 隐藏指定类型的消息\r\n hide(type) {\r\n const messageStore = useMessageStore()\r\n messageStore.hide(type)\r\n }\r\n}\r\n\r\nexport default Message","import axios from \"axios\";\r\nimport Storage from \"./storage.js\";\r\nimport Message from \"../components/message/index.js\";\r\n\r\n// create an axios instance\r\nconst service = axios.create({\r\n baseURL: window.VITE_APP_API_URL || import.meta.env.VITE_APP_API_URL || \"\",\r\n headers: {\r\n \"X-Requested-With\": \"XMLHttpRequest\",\r\n },\r\n withCredentials: false,\r\n timeout: 30000,\r\n});\r\n\r\n// request interceptor\r\nservice.interceptors.request.use(\r\n (config) => {\r\n // 获取配置的键名,如果没有配置则使用默认值\r\n const tokenKey = window.VTK_CONFIG?.storageKeys?.token || '_mis_acis_token';\r\n if (Storage.get(tokenKey)) {\r\n config.headers[\"X-Token\"] = \"1b0679be72ad976ad5d491ad57a5eec0\";\r\n config.headers[\"Authorization\"] = \"Bearer \" + Storage.get(tokenKey);\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n Message.toast(error.message || \"请求错误\");\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\n// response interceptor\r\nservice.interceptors.response.use(\r\n (response) => {\r\n let res = response.data;\r\n let header = response.headers[\"content-disposition\"];\r\n\r\n if (header != undefined && header.split(\";\")[0] == \"attachment\") {\r\n res = response;\r\n }\r\n if (response.status !== 200) {\r\n Message.toast(res.message || \"请求失败\", { color: \"error\" });\r\n return Promise.reject(new Error(res.message || \"请求失败\"));\r\n } else {\r\n // 检查登录过期\r\n if (\r\n res.meta &&\r\n !res.meta.success &&\r\n res.meta.message === \"specter_authorize_exception\"\r\n ) {\r\n Storage.clear(); //清除所有缓存\r\n const handleRedirect = () => {\r\n const url = window.location.href;\r\n const index = url.indexOf(\"#\");\r\n let newUrl;\r\n\r\n if (index > -1) {\r\n newUrl = url.substring(0, index) + \"#/\";\r\n } else {\r\n newUrl = url + \"#/\";\r\n }\r\n\r\n window.location.href = newUrl;\r\n };\r\n\r\n Message.confirm({\r\n title: \"提示\",\r\n text: \"对不起,您的登录信息过期!\",\r\n onConfirm: handleRedirect,\r\n onCancel: handleRedirect,\r\n });\r\n }\r\n return Promise.resolve(res);\r\n }\r\n },\r\n (error) => {\r\n console.log(\"err\" + error);\r\n Message.toast(error.message || \"网络错误\", { color: \"error\" });\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nconst Request = {};\r\n\r\nRequest.http = (\r\n url,\r\n data = {},\r\n method = \"GET\",\r\n headers = { \"content-type\": \"application/x-www-form-urlencoded\" },\r\n responseType = null\r\n) => {\r\n if (headers[\"content-type\"] === \"application/x-www-form-urlencoded\") {\r\n return service({\r\n url: url,\r\n params: data,\r\n method: method,\r\n headers: headers,\r\n responseType: responseType,\r\n });\r\n } else {\r\n return service({\r\n url: url,\r\n data: data,\r\n method: method,\r\n headers: headers,\r\n responseType: responseType,\r\n });\r\n }\r\n};\r\n\r\nRequest.getForm = (url, data = {}) => {\r\n return Request.http(url, data);\r\n};\r\n\r\nRequest.postForm = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\");\r\n};\r\n\r\nRequest.getJson = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\", {\r\n \"content-type\": \"application/json\",\r\n });\r\n};\r\n\r\nRequest.postJson = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\", {\r\n \"content-type\": \"application/json\",\r\n });\r\n};\r\n\r\nRequest.imp = (url, data = {}) => {\r\n return Request.http(url, data, \"POST\", {\r\n \"Content-Type\": \"multipart/form-data\",\r\n });\r\n};\r\n\r\nRequest.exp = (url, data = {}) => {\r\n return Request.http(\r\n url,\r\n data,\r\n \"POST\",\r\n { \"content-Type\": \"application/json\" },\r\n \"blob\"\r\n );\r\n};\r\n\r\nexport default Request;\r\n","<template>\r\n\t<div class=\"d-inline-block d-flex\">\r\n\t\t<VSelect\r\n\t\t\tv-model=\"entity.area2\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area2, 1)\"\r\n\t\t\t@click:clear=\"clear(1)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 2 ? entity.name2 : '---省级---'\"\r\n\t\t\t:items=\"areaData.area2\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box mr-3\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 2\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 4\"\r\n\t\t\tv-model=\"entity.area4\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area4, 2)\"\r\n\t\t\t@click:clear=\"clear(2)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 4 ? entity.name4 : '---市级---'\"\r\n\t\t\t:items=\"areaData.area4\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box\"\r\n\t\t\t:class=\"maxArea > 4 && 'mr-3'\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 4\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 6\"\r\n\t\t\tv-model=\"entity.area6\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area6, 3)\"\r\n\t\t\t@click:clear=\"clear(3)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 6 ? entity.name6 : '---区/县---'\"\r\n\t\t\t:items=\"areaData.area6\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box\"\r\n\t\t\t:class=\"maxArea > 6 && 'mr-3'\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 6\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 9\"\r\n\t\t\tv-model=\"entity.area9\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area9, 4)\"\r\n\t\t\t@click:clear=\"clear(4)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 9 ? entity.name9 : '---街/镇---'\"\r\n\t\t\t:items=\"areaData.area9\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block sel_box\"\r\n\t\t\t:class=\"maxArea > 9 && 'mr-3'\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 9\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t\t<VSelect\r\n\t\t\tv-if=\"maxArea >= 12\"\r\n\t\t\tv-model=\"entity.area12\"\r\n\t\t\t@update:model-value=\"nextArea(entity.area12, 5)\"\r\n\t\t\t@click:clear=\"clear(5)\"\r\n\t\t\t:placeholder=\"user.areacode?.length >= 12 ? entity.name12 : '---村/社---'\"\r\n\t\t\t:items=\"areaData.area12\"\r\n\t\t\titem-title=\"areaName\"\r\n\t\t\titem-value=\"areaCode\"\r\n\t\t\tclass=\"d-inline-block\"\r\n\t\t\tstyle=\"width: 188px\"\r\n\t\t\thide-details\r\n\t\t\tdensity=\"compact\"\r\n\t\t\tvariant=\"outlined\"\r\n\t\t\tclearable\r\n\t\t\t:disabled=\"user.areacode?.length >= 12\"\r\n\t\t\t:menu-props=\"{ offsetY: true }\"\r\n\t\t\t:style=\"areaStyle\"></VSelect>\r\n\t</div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, reactive, onMounted, getCurrentInstance } from 'vue';\r\n\r\nimport Request from \"../../commons/request\"\r\n\r\nconst { proxy } = getCurrentInstance();\r\n\r\n// 定义组件名称和选项\r\ndefineOptions({\r\n\tname: \"VtkArea\",\r\n\tinheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n\tmaxArea: {\r\n\t\ttype: Number,\r\n\t\tdefault: 12,\r\n\t},\r\n\tminArea: {\r\n\t\ttype: Number,\r\n\t\tdefault: null,\r\n\t},\r\n\tareaStyle: {\r\n\t\ttype: String,\r\n\t\tdefault: \"\",\r\n\t},\r\n});\r\n\r\n// 定义emits\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 响应式数据\r\nconst entity = reactive({\r\n\tarea2: null,\r\n\tarea4: null,\r\n\tarea6: null,\r\n\tarea9: null,\r\n\tarea12: null,\r\n\tname2: '',\r\n\tname4: '',\r\n\tname6: '',\r\n\tname9: '',\r\n\tname12: ''\r\n});\r\n\r\nconst user = ref({ areacode: \"\" });\r\nconst areaData = reactive({\r\n\tarea2: [],\r\n\tarea4: [],\r\n\tarea6: [],\r\n\tarea9: [],\r\n\tarea12: []\r\n});\r\n\r\n// 安全获取 vtk 对象\r\nconst getVtk = () => {\r\n if (typeof window !== 'undefined' && window.$vtk) {\r\n return window.$vtk;\r\n }\r\n return null;\r\n};\r\n\r\n// 组件挂载时执行\r\nonMounted(() => {\r\n\t// 获取配置的键名,如果没有配置则使用默认值\r\n\tconst userKey = window.VTK_CONFIG?.storageKeys?.user || '_mis_acis_users';\r\n\tuser.value = typeof(proxy.$vtk.storage.get(userKey)) != 'object' ? JSON.parse(proxy.$vtk.storage.get(userKey)) : proxy.$vtk.storage.get(userKey) || '';\r\n\tif (user.value) {\r\n\t\tarea();\r\n\t}\r\n});\r\n\r\n// 所属地区\r\nconst area = () => {\r\n try {\r\n proxy.$vtk.message.loading.show();\r\n Request.postForm(`/dict/area/show/${user.value.areacode}`).then((res) => {\r\n proxy.$vtk.message.loading.hide();\r\n if (res.meta.success) {\r\n entity[`area${res.data.areaLeve}`] = res.data.areaCode;\r\n entity.name2 = res.data.province;\r\n entity.name4 = res.data.city;\r\n entity.name6 = res.data.district;\r\n entity.name9 = res.data?.town;\r\n entity.name12 = res.data?.village;\r\n nextArea(user.value.areacode);\r\n } else {\r\n proxy.$vtk.message.toast(res.meta.message);\r\n }\r\n }).catch(error => {\r\n proxy.$vtk.message.loading.hide();\r\n proxy.$vtk.message.toast('加载区域数据失败');\r\n });\r\n } catch (error) {\r\n console.error('初始化区域数据失败:', error);\r\n if (proxy.$vtk.message?.loading?.hide) {\r\n proxy.$vtk.message.loading.hide();\r\n }\r\n }\r\n};\r\n\r\n// 下一级地区列表\r\nconst nextArea = (areaCode, index) => {\r\n\tinputFn(areaCode);\r\n \r\n\tif (areaCode?.length < 12) {\r\n\t\tRequest.postForm(`/dict/area/next/${areaCode}`).then((res) => {\r\n\t\t\tproxy.$vtk.message.loading.hide();\r\n\t\t\tif (res.meta.success) {\r\n\t\t\t\tif (index) {\r\n\t\t\t\t\tObject.keys(areaData)\r\n\t\t\t\t\t\t.slice(index, 5)\r\n\t\t\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\t\t\tareaData[e] = [];\r\n\t\t\t\t\t\t\tentity[e] = null;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tareaData[`area${res.data[0].areaLeve}`] = res.data;\r\n\t\t\t} else {\r\n\t\t\t\tproxy.$vtk.message.toast(res.meta.message);\r\n\t\t\t}\r\n\t\t}).catch(error => {\r\n console.error('加载下级区域数据失败:', error);\r\n proxy.$vtk.message.toast('加载下级区域数据失败');\r\n });\r\n\t}\r\n};\r\n\r\n// 清除\r\nconst clear = (index) => {\r\n\tlet arr = Object.keys(areaData);\r\n\tinputFn(entity[arr[index - 2]]);\r\n\tarr.slice(index, 5).forEach((e) => {\r\n\t\tareaData[e] = [];\r\n\t\tentity[e] = null;\r\n\t});\r\n};\r\n\r\n// 输入事件\r\nconst inputFn = (e) => {\r\n\te && emit(\"update:modelValue\", e);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.sel_box {\r\n\twidth: 164px;\r\n}\r\n</style>","<template>\r\n\t<v-menu v-model=\"menu\" :close-on-content-click=\"false\" max-width=\"520\" min-width=\"520\">\r\n\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t<v-btn\r\n\t\t\t\tv-bind=\"props\"\r\n\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\tcolor=\"primary\"\r\n\t\t\t\tclass=\"area-select-btn\"\r\n\t\t\t\t:style=\"$attrs.styles\"\r\n\t\t\t>\r\n\t\t\t\t<span class=\"btn-text\">{{ itemText || '选择地区' }}</span>\r\n\t\t\t\t<v-icon v-if=\"itemText\" size=\"small\" @click.stop=\"textClear\" class=\"ml-2\">mdi-close-circle</v-icon>\r\n\t\t\t</v-btn>\r\n\t\t</template>\r\n\t\t<v-card elevation=\"0\" style=\"width: 350px;\">\r\n\t\t\t<p class=\"pt-3 px-3\">\r\n\t\t\t\t<v-icon color=\"primary\" class=\"mr-1\" size=\"20\">mdi-map-marker-radius</v-icon>\r\n\t\t\t\t<span v-for=\"link in entity\" :key=\"link.areaCode\" class=\"link text-body-2 text-primary\">{{ link.areaName }}</span>\r\n\t\t\t</p>\r\n\t\t\t<v-sheet class=\"rounded-lg mx-3 mt-2\" color=\"#b1b1b117\">\r\n\t\t\t\t<v-tabs v-model=\"tab\" @update:model-value=\"tabArea\" class=\"pt-2 px-1\">\r\n\t\t\t\t\t<v-tab\r\n\t\t\t\t\t\tv-for=\"(item, index) in tabItems\"\r\n\t\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\t\tclass=\"mx-1\"\r\n\t\t\t\t\t\t:style=\"tab == index && 'color:white;opacity:1'\"\r\n\t\t\t\t\t\t:disabled=\"areaStorage.length <= index + 1\"\r\n\t\t\t\t\t\tv-show=\"minArea ? minArea >= item.leve : true\"\r\n\t\t\t\t\t>{{ item.text }}</v-tab>\r\n\t\t\t\t</v-tabs>\r\n\t\t\t\t<v-sheet\r\n\t\t\t\t\tv-show=\"index == tab\"\r\n\t\t\t\t\tv-for=\"(item, index) in tabItems\"\r\n\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\tclass=\"px-3 py-1\"\r\n\t\t\t\t\tmin-height=\"100\"\r\n\t\t\t\t\tcolor=\"rgba(0,0,0,0)\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<v-chip-group v-model=\"current\" selected-class=\"chipActive\" column>\r\n\t\t\t\t\t\t<v-chip\r\n\t\t\t\t\t\t\tv-for=\"area in areaItems\"\r\n\t\t\t\t\t\t\t:key=\"area.id\"\r\n\t\t\t\t\t\t\t@click=\"areaChange(area, index)\"\r\n\t\t\t\t\t\t\tclass=\"rounded\"\r\n\t\t\t\t\t\t\t:class=\"area.areaCode == user.areacode && 'active'\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{{ area.areaName }}\r\n\t\t\t\t\t\t</v-chip>\r\n\t\t\t\t\t</v-chip-group>\r\n\t\t\t\t</v-sheet>\r\n\t\t\t</v-sheet>\r\n\r\n\t\t\t<v-card-actions class=\"pr-0 py-3\">\r\n\t\t\t\t<v-spacer />\r\n\t\t\t\t<v-btn @click=\"close\" elevation=\"0\" size=\"small\"><v-icon class=\"pt-1 pr-1\">mdi-progress-close</v-icon> 取消</v-btn>\r\n\t\t\t\t<v-btn @click=\"save\" class=\"text-white mr-3\" color=\"primary\" elevation=\"0\" size=\"small\"><v-icon class=\"pt-1 pr-1\">mdi-progress-check</v-icon> 确定</v-btn>\r\n\t\t\t</v-card-actions>\r\n\t\t</v-card>\r\n\t</v-menu>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, watch, onMounted, getCurrentInstance, nextTick } from 'vue';\r\n\r\nconst props = defineProps({\r\n\tmodelValue: {\r\n\t\ttype: [String, Object],\r\n\t\tdefault: null,\r\n\t},\r\n\tminArea: {\r\n\t\ttype: Number,\r\n\t\tdefault: null,\r\n\t},\r\n\tareaNode: {\r\n\t\ttype: Number,\r\n\t\tdefault: null,\r\n\t},\r\n\tareaCode: {\r\n\t\ttype: String,\r\n\t\tdefault: null,\r\n\t},\r\n\treturnObj: {\r\n\t\ttype: Boolean,\r\n\t\tdefault: false,\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits(['update:modelValue', 'change']);\r\n\r\nconst { proxy } = getCurrentInstance();\r\n\r\nconst menu = ref(false);\r\nconst user = ref({});\r\nconst tab = ref(0);\r\nconst tabItems = ref([]);\r\nconst areaStorage = ref([]); //存储个级别地区数据\r\nconst areaItems = ref([]); //当前选择地区的所有列\r\nconst entity = ref([]); //存储选中的数据\r\nconst current = ref(null); //回显值选中\r\nconst itemValue = ref(\"\"); //传值:最终选择值\r\nconst itemText = ref(\"\"); //最终选择值\r\n\r\n// 值回显\r\nconst view = (code) => {\r\n\tproxy.$vtk.request.getForm(`/dict/area/show/${code}`).then((res) => {\r\n\t\tlet province = res.data.province ? `${res.data.province}` : \"\";\r\n\t\tlet city = res.data.city ? `/${res.data.city}` : \"\";\r\n\t\tlet district = res.data.district ? `/${res.data.district}` : \"\";\r\n\t\tlet town = res.data.town ? `/${res.data.town}` : \"\";\r\n\t\tlet village = res.data.village ? `/${res.data.village}` : \"\";\r\n\t\titemText.value = `${province}${city}${district}${town}${village}`;\r\n\t\tif (props.areaNode && props.areaNode > 0) {\r\n\t\t\titemText.value = itemText.value.split(\"/\").slice(-props.areaNode).join(\"/\");\r\n\t\t}\r\n\t});\r\n};\r\n\r\n// 切换Tab地区级别\r\nconst tabArea = (index) => {\r\n\tareaItems.value = [...areaStorage.value[index]];\r\n\tif (index < entity.value.length) {\r\n\t\tcurrent.value = areaItems.value.findIndex((e) => e.areaCode == entity.value[index].areaCode);\r\n\t} else {\r\n\t\tcurrent.value = null;\r\n\t}\r\n};\r\n\r\n//选择地区\r\nconst areaChange = (item, index) => {\r\n\tentity.value = entity.value.slice(0, index);\r\n\tentity.value.push(item);\r\n\tareaStorage.value = areaStorage.value.slice(0, index + 1);\r\n\tif (tabItems.value.length > tab.value + 1 && (props.minArea ? props.minArea > item.areaCode.length : true)) {\r\n\t\tgetTree(item.areaCode);\r\n\t\ttab.value++;\r\n\t}\r\n};\r\n\r\n// 加载下级地区\r\nconst getTree = (code) => {\r\n\tproxy.$vtk.request.getForm(`/dict/area/next/${code}`).then((res) => {\r\n\t\tareaItems.value = res.data;\r\n\t\tareaStorage.value.push(res.data);\r\n\t\tcurrent.value = null;\r\n\t\tnextTick(); //Vue 3中替代$forceUpdate\r\n\t});\r\n};\r\n\r\n// 加载第一个地区,用户所在地区\r\nconst getAreaName = (code) => {\r\n\tentity.value = [];\r\n\ttabItems.value = [\r\n\t\t{ text: \"省级\", leve: \"2\" },\r\n\t\t{ text: \"市级\", leve: \"4\" },\r\n\t\t{ text: \"区县\", leve: \"6\" },\r\n\t\t{ text: \"街镇\", leve: \"9\" },\r\n\t\t{ text: \"村社\", leve: \"12\" },\r\n\t].filter((e) => e.leve >= (props.areaCode || user.value?.areacode || user.value?.areaCode || '').length);\r\n\tareaStorage.value = [];\r\n\r\n\tproxy.$vtk.request.getForm(`/dict/area/show/${code}`).then((res) => {\r\n\t\tareaItems.value = [{ areaName: res.data.areaName, areaCode: res.data.areaCode }];\r\n\t\tareaStorage.value.push(areaItems.value);\r\n\t\tentity.value.push(areaItems.value[0]);\r\n\t});\r\n};\r\n\r\n//确认保存\r\nconst save = () => {\r\n\tlet text = [];\r\n\tlet val = [];\r\n\tentity.value.forEach((e) => {\r\n\t\ttext.push(e.areaName);\r\n\t\tval.push(e.areaCode);\r\n\t\titemValue.value = e.areaCode;\r\n\t});\r\n\tif (props.areaNode && props.areaNode > 0) {\r\n\t\ttext = text.slice(-props.areaNode);\r\n\t}\r\n\titemText.value = text.join().replace(/,/g, \"/\");\r\n\tconst lastItem = entity.value[entity.value.length - 1];\r\n\temit(\"update:modelValue\", props.returnObj ? { areaCode: lastItem?.areaCode, areaName: lastItem?.areaName } : itemValue.value);\r\n\temit(\"change\");\r\n\tclose();\r\n};\r\n\r\n// 清空\r\nconst textClear = () => {\r\n\ttab.value = 0;\r\n\tconst initCode = props.areaCode || user.value?.areacode || user.value?.areaCode;\r\n\tgetAreaName(initCode);\r\n\titemValue.value = initCode;\r\n\temit(\"update:modelValue\", itemValue.value);\r\n\temit(\"change\");\r\n};\r\n\r\n// 关闭弹窗\r\nconst close = () => {\r\n\tmenu.value = false;\r\n};\r\n\r\n// Watch modelValue\r\nwatch(() => props.modelValue, (newVal, oldVal) => {\r\n\tif (newVal && newVal != oldVal) {\r\n\t\tconst code = typeof newVal === 'object' ? newVal.areaCode : newVal;\r\n\t\tif (code) view(code);\r\n\t}\r\n});\r\n\r\n// 组件挂载时执行\r\nonMounted(() => {\r\n\t// 获取配置的键名,如果没有配置则使用默认值\r\n\tconst userKey = window.VTK_CONFIG?.storageKeys?.user || '_mis_acis_users';\r\n\tuser.value = proxy.$vtk.storage.get(userKey) && JSON.parse(proxy.$vtk.storage.get(userKey));\r\n\tconst initCode = props.areaCode || user.value?.areacode || user.value?.areaCode;\r\n\tif (initCode) {\r\n\t\tgetAreaName(initCode);\r\n\t}\r\n\tif (props.modelValue) {\r\n\t\tconst code = typeof props.modelValue === 'object' ? props.modelValue.areaCode : props.modelValue;\r\n\t\tif (code) view(code);\r\n\t}\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n// 圆形按钮样式\r\n.area-select-btn {\r\n\tborder-radius: 20px !important;\r\n\tpadding: 6px 20px !important;\r\n\tmin-width: 120px;\r\n\theight: 36px !important;\r\n\ttext-transform: none;\r\n\tletter-spacing: normal;\r\n\r\n\t.btn-text {\r\n\t\tfont-size: 14px;\r\n\t\tcolor: inherit;\r\n\t}\r\n\r\n\t&:hover {\r\n\t\tbackground-color: rgba(var(--v-theme-primary), 0.08);\r\n\t}\r\n}\r\n:deep(.v-tab__slider) {\r\n\theight: 0px !important;\r\n}\r\n\r\n.link::after {\r\n\tcontent: \" / \";\r\n\tfont-size: 14px;\r\n\tcolor: #999;\r\n}\r\n.link:last-of-type::after {\r\n\tcontent: \"\";\r\n}\r\n:deep(.v-chip:not(.v-chip--selected)) {\r\n\tbackground: #e0e0e000;\r\n}\r\n// Vuetify 3 tabs container styling\r\n:deep(.v-tabs) {\r\n\theight: 40px;\r\n}\r\n// Tab button styling\r\n:deep(.v-tab) {\r\n\tmin-width: 90px;\r\n\theight: 32px !important;\r\n\tborder-radius: 6px !important;\r\n\tcolor: rgba(0, 0, 0, .6);\r\n\ttransition: all 0.3s ease;\r\n\tz-index: 1;\r\n}\r\n// Active/selected tab styling\r\n:deep(.v-tab--selected) {\r\n\tbackground-color: rgb(var(--v-theme-primary));\r\n\tcolor: white !important;\r\n\topacity: 1;\r\n}\r\n// Hover effect\r\n:deep(.v-tab:hover) {\r\n\tbackground-color: rgba(var(--v-theme-primary), 0.9);\r\n\tcolor: white;\r\n}\r\n.tabActive {\r\n\tcolor: #fff;\r\n}\r\n.chipActive {\r\n\tcolor: #0095ff !important;\r\n\tbackground-color: #008eff05 !important;\r\n}\r\n.active {\r\n\tcolor: #0095ff !important;\r\n\tbackground-color: #008eff20 !important;\r\n}\r\n:deep(.v-slide-group__next),\r\n:deep(.v-slide-group__prev) {\r\n\tdisplay: none;\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"vtk-breadcrumb-wrapper d-flex align-center justify-space-between\">\r\n <!-- 左侧面包屑 -->\r\n <v-breadcrumbs :items=\"breadcrumbItems\" class=\"pa-0\">\r\n <template v-slot:divider>\r\n <v-icon>mdi-chevron-right</v-icon>\r\n </template>\r\n <template v-slot:item=\"{ item }\">\r\n <v-breadcrumbs-item\r\n :title=\"item.title\"\r\n :to=\"item.to\"\r\n :disabled=\"item.disabled\"\r\n :class=\"{ 'text-primary': !item.disabled }\"\r\n >\r\n {{ item.title }}\r\n </v-breadcrumbs-item>\r\n </template>\r\n </v-breadcrumbs>\r\n\r\n <!-- 右侧返回按钮 -->\r\n <v-btn\r\n v-if=\"showBack\"\r\n variant=\"text\"\r\n color=\"primary\"\r\n prepend-icon=\"mdi-arrow-left\"\r\n @click=\"handleBack\"\r\n style=\"height: 36px;\"\r\n >\r\n {{ backText }}\r\n </v-btn>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed, inject, getCurrentInstance } from 'vue'\r\n\r\nconst props = defineProps({\r\n // 面包屑项目数组\r\n items: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 是否显示返回按钮\r\n showBack: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 返回按钮文字\r\n backText: {\r\n type: String,\r\n default: '返回'\r\n },\r\n // 自定义返回路径,不传则返回上一级\r\n backTo: {\r\n type: [String, Object],\r\n default: null\r\n }\r\n})\r\n\r\nconst emit = defineEmits(['back'])\r\n\r\n// 使用inject安全地获取router和route\r\nconst router = inject('router', null)\r\nconst route = inject('route', null)\r\n\r\n// 处理面包屑数据\r\nconst breadcrumbItems = computed(() => {\r\n if (props.items && props.items.length > 0) {\r\n return props.items.map((item, index) => ({\r\n title: item.title || item.text || item.name,\r\n to: item.to || item.path || item.href,\r\n disabled: item.disabled !== undefined ? item.disabled : index === props.items.length - 1\r\n }))\r\n }\r\n\r\n // 如果route不可用,返回空数组\r\n if (!route) {\r\n return []\r\n }\r\n\r\n // 如果没有传入items,尝试从路由meta中获取\r\n const matched = route.matched?.filter(r => r.meta && r.meta.breadcrumb) || []\r\n if (matched.length > 0) {\r\n return matched.map((r, index) => ({\r\n title: r.meta.breadcrumb,\r\n to: r.path,\r\n disabled: index === matched.length - 1\r\n }))\r\n }\r\n\r\n // 默认返回当前路由路径生成的面包屑\r\n const pathArray = route.path?.split('/').filter(p => p) || []\r\n return pathArray.map((path, index) => {\r\n const routePath = '/' + pathArray.slice(0, index + 1).join('/')\r\n return {\r\n title: path.charAt(0).toUpperCase() + path.slice(1),\r\n to: routePath,\r\n disabled: index === pathArray.length - 1\r\n }\r\n })\r\n})\r\n\r\n// 处理返回按钮点击\r\nconst handleBack = () => {\r\n // 触发back事件\r\n emit('back')\r\n\r\n // 如果router不可用,仅触发事件\r\n if (!router) {\r\n return\r\n }\r\n\r\n // 如果传入了backTo参数,跳转到指定路径\r\n if (props.backTo) {\r\n if (typeof props.backTo === 'string') {\r\n router.push(props.backTo)\r\n } else {\r\n router.push(props.backTo)\r\n }\r\n } else {\r\n // 默认返回上一级\r\n router.back()\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-breadcrumb-wrapper {\r\n width: 100%;\r\n padding: 12px 0;\r\n\r\n :deep(.v-breadcrumbs) {\r\n flex-grow: 1;\r\n height: 36px;\r\n }\r\n\r\n :deep(.v-breadcrumbs-item) {\r\n font-size: 14px;\r\n }\r\n\r\n :deep(.v-breadcrumbs-divider) {\r\n padding: 0 8px;\r\n }\r\n\r\n :deep(.v-breadcrumbs-item--disabled) {\r\n opacity: 0.6;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <VInput \r\n v-bind=\"inputAttrs\" \r\n :model-value=\"inputValue\"\r\n >\r\n <div class=\"checkGroup\" :class=\"inline ? 'd-flex flex-wrap align-top' : 'd-inline-block'\">\r\n <VCheckbox\r\n v-for=\"item in items\"\r\n hide-details\r\n :key=\"item.id || item.code\"\r\n :label=\"item.codeValue\"\r\n :value=\"item.code\"\r\n v-model=\"localValue\"\r\n v-bind=\"checkboxAttrs\"\r\n :class=\"inline ? 'mr-4' : ''\"\r\n />\r\n </div>\r\n </VInput>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, useAttrs, computed, watch } from 'vue';\r\nimport Request from '../../commons/request';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkCheckbox\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n /**\r\n * 字典来源:\r\n * - 若为静态数据,格式如:\"0:否/1:是\"\r\n * - 若为字典键,格式如:\"DISABLE_TYPE\"\r\n */\r\n list: {\r\n type: String,\r\n required: true,\r\n },\r\n /**\r\n * 是否横向排列\r\n */\r\n inline: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 绑定值\r\n */\r\n modelValue: {\r\n type: [Array, String],\r\n default: () => []\r\n }\r\n});\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 本地选中值\r\nconst localValue = ref([]);\r\n\r\n// 防止递归更新的标志位\r\nconst isUpdatingLocal = ref(false);\r\nconst isUpdatingModel = ref(false);\r\n\r\n// 同步外部 modelValue 到本地值\r\nwatch(() => props.modelValue, (newVal) => {\r\n if (isUpdatingModel.value) {\r\n isUpdatingModel.value = false;\r\n return;\r\n }\r\n \r\n isUpdatingLocal.value = true;\r\n if (Array.isArray(newVal)) {\r\n localValue.value = [...newVal];\r\n } else if (typeof newVal === 'string') {\r\n localValue.value = newVal ? [newVal] : [];\r\n } else {\r\n localValue.value = [];\r\n }\r\n}, { immediate: true });\r\n\r\n// 同步本地值到外部 modelValue\r\nwatch(localValue, (newVal) => {\r\n if (isUpdatingLocal.value) {\r\n isUpdatingLocal.value = false;\r\n return;\r\n }\r\n \r\n isUpdatingModel.value = true;\r\n emit('update:modelValue', newVal);\r\n}, { deep: true });\r\n\r\n// 获取透传属性\r\nconst attrs = useAttrs();\r\n\r\n// 分离传递给 input 和传递给 checkbox 的属性\r\nconst inputAttrs = computed(() => {\r\n const { list, inline, modelValue, ...rest } = attrs;\r\n return rest;\r\n});\r\n\r\nconst checkboxAttrs = computed(() => {\r\n // 移除表单验证相关属性,避免重复应用\r\n const { \r\n list, \r\n inline, \r\n modelValue,\r\n error, \r\n 'error-messages': errorMessages, \r\n rules, \r\n hint, \r\n 'persistent-hint': persistentHint,\r\n ...rest \r\n } = attrs;\r\n return rest;\r\n});\r\n\r\n// 为 v-input 提供一个值\r\nconst inputValue = computed(() => {\r\n return localValue.value && localValue.value.length > 0 ? localValue.value : null;\r\n});\r\n\r\n// 响应式数据\r\nconst items = ref([]);\r\n\r\n// 处理静态数据(如 \"0:否/1:是\")\r\nconst statc = () => {\r\n props.list.split('/').forEach(it => {\r\n const [code, codeValue] = it.split(':');\r\n items.value.push({ code, codeValue });\r\n });\r\n};\r\n\r\n// 请求远程字典数据\r\nconst miscs = async () => {\r\n try {\r\n const res = await Request.getForm(`dict/misc/list/${props.list}`);\r\n items.value = res.data || [];\r\n } catch (error) {\r\n console.error('[VtkCheckbox] Failed to load dictionary:', error);\r\n items.value = [];\r\n }\r\n};\r\n\r\n// 组件挂载时初始化数据\r\nonMounted(() => {\r\n if (props.list.includes(':')) {\r\n statc();\r\n } else {\r\n miscs();\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n:deep(.v-checkbox .v-selection-control) {\r\n margin: 0;\r\n padding: 0;\r\n min-height: 32px;\r\n}\r\n\r\n:deep(.v-input__details) {\r\n padding-inline: 16px;\r\n}\r\n</style>","<!-- \r\n\r\n// 基础用法\r\n <VtkCount :start=\"0\" :end=\"12345\" :duration=\"3000\" suffix=\"次\" />\r\n \r\n//带前缀和分隔符\r\n <VtkCount \r\n :start=\"0\" \r\n :end=\"999999\" \r\n :duration=\"2000\" \r\n prefix=\"¥\" \r\n suffix=\"元\" \r\n :separator=\"true\" \r\n />\r\n \r\n//手动控制\r\n <VtkCount \r\n ref=\"countRef\" \r\n :start=\"0\" \r\n :end=\"100\" \r\n :autoplay=\"false\" \r\n @complete=\"onComplete\"\r\n />\r\n <VBtn @click=\"startCount\">开始计数</VBtn>\r\n -->\r\n\r\n<template>\r\n <div class=\"vtk-count\" :class=\"containerClass\">\r\n <div class=\"count-display\" :style=\"{ color: color }\">\r\n <!-- 前缀 -->\r\n <span v-if=\"prefix\" class=\"prefix\">{{ prefix }}</span>\r\n \r\n <!-- 数字容器 -->\r\n <div class=\"digits-container\">\r\n <div \r\n v-for=\"(digitChar, index) in maxDigitString\" \r\n :key=\"`digit-${index}-${digitKey}`\"\r\n class=\"digit-wrapper\"\r\n :class=\"{ 'digit-separator': isNaN(digitChar) }\"\r\n >\r\n <div \r\n v-if=\"!isNaN(digitChar)\" \r\n class=\"digit-scroll\"\r\n >\r\n <div \r\n v-for=\"n in 10\" \r\n :key=\"n\" \r\n class=\"digit-item\"\r\n :style=\"getDigitStyle(getCurrentDigit(index), n-1)\"\r\n >\r\n {{ n-1 }}\r\n </div>\r\n </div>\r\n <div v-else class=\"separator\">{{ digitChar }}</div>\r\n </div>\r\n </div>\r\n \r\n <!-- 后缀 -->\r\n <span v-if=\"suffix\" class=\"suffix\">{{ suffix }}</span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, onMounted, watch, nextTick } from 'vue'\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkCount\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 初始值\r\n start: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 目标值\r\n end: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 动画持续时间(毫秒)\r\n duration: {\r\n type: Number,\r\n default: 2000\r\n },\r\n // 是否自动开始动画\r\n autoplay: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 数字前缀\r\n prefix: {\r\n type: String,\r\n default: ''\r\n },\r\n // 数字后缀\r\n suffix: {\r\n type: String,\r\n default: ''\r\n },\r\n // 容器自定义类名\r\n containerClass: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否使用分隔符(千分位)\r\n separator: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 小数位数\r\n decimals: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 文字颜色\r\n color: {\r\n type: String,\r\n default: '#1976d2'\r\n }\r\n})\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['complete'])\r\n\r\n// 当前显示的数值\r\nconst currentNumber = ref(props.start)\r\n\r\n// 当前每个位置的数字值\r\nconst currentDigits = ref([])\r\n\r\n// 用于强制重新渲染的key\r\nconst digitKey = ref(0)\r\n\r\n// 是否正在动画中\r\nconst isAnimating = ref(false)\r\n\r\n// 格式化数字(处理小数和分隔符)\r\nconst formatNumber = (num) => {\r\n let result = num.toFixed(props.decimals)\r\n if (props.separator && props.decimals === 0) {\r\n result = result.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\r\n }\r\n return result\r\n}\r\n\r\n// 获取目标数字字符串\r\nconst targetNumberString = computed(() => {\r\n return formatNumber(props.end)\r\n})\r\n\r\n// 获取起始数字字符串\r\nconst startNumberString = computed(() => {\r\n return formatNumber(props.start)\r\n})\r\n\r\n// 获取最大位数的字符串(用于保持DOM结构稳定)\r\nconst maxDigitString = computed(() => {\r\n const target = targetNumberString.value\r\n const start = startNumberString.value\r\n return target.length >= start.length ? target : start\r\n})\r\n\r\n// 获取当前指定位置的数字\r\nconst getCurrentDigit = (index) => {\r\n if (index < currentDigits.value.length) {\r\n return currentDigits.value[index]\r\n }\r\n return '0'\r\n}\r\n\r\n// 初始化数字数组\r\nconst initDigitsArray = () => {\r\n const targetStr = targetNumberString.value\r\n const startStr = startNumberString.value\r\n \r\n // 初始化currentDigits数组,确保长度与maxDigitString一致\r\n currentDigits.value = maxDigitString.value.split('').map((char, index) => {\r\n if (isNaN(char)) {\r\n return char // 分隔符保持原样\r\n }\r\n \r\n // 从起始字符串对应位置获取数字\r\n if (index < startStr.length) {\r\n const startChar = startStr[index]\r\n return isNaN(startChar) ? '0' : startChar\r\n }\r\n return '0'\r\n })\r\n}\r\n\r\n// 获取数字样式\r\nconst getDigitStyle = (currentValue, digitValue) => {\r\n // 如果是分隔符,直接返回\r\n if (isNaN(currentValue) || isNaN(digitValue)) {\r\n return {\r\n transform: 'translateY(0)'\r\n }\r\n }\r\n \r\n const current = parseInt(currentValue) || 0\r\n const target = digitValue\r\n const offset = target - current\r\n \r\n // 处理循环滚动(9->0 或 0->9)\r\n let translateY\r\n if (offset > 5) {\r\n // 向下滚动(如 9->0)\r\n translateY = -(10 - offset) * 100\r\n } else if (offset < -5) {\r\n // 向上滚动(如 0->9)\r\n translateY = (10 + offset) * 100\r\n } else {\r\n translateY = -offset * 100\r\n }\r\n \r\n return {\r\n transform: `translateY(${translateY}%)`,\r\n transition: isAnimating.value ? 'transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)' : 'none',\r\n color: props.color\r\n }\r\n}\r\n\r\n// 开始数字动画\r\nconst startAnimation = () => {\r\n if (isAnimating.value) return\r\n \r\n isAnimating.value = true\r\n const startTime = performance.now()\r\n const startValue = props.start\r\n const endValue = props.end\r\n const diff = endValue - startValue\r\n \r\n // 初始化数字数组\r\n initDigitsArray()\r\n \r\n const animate = (currentTime) => {\r\n const elapsed = currentTime - startTime\r\n const progress = Math.min(elapsed / props.duration, 1)\r\n \r\n // 使用缓动函数使动画更自然\r\n const easeOutQuart = 1 - Math.pow(1 - progress, 4)\r\n currentNumber.value = startValue + diff * easeOutQuart\r\n \r\n // 更新每个数字位的当前值\r\n updateDigitArray(currentNumber.value)\r\n \r\n if (progress < 1) {\r\n requestAnimationFrame(animate)\r\n } else {\r\n currentNumber.value = endValue\r\n // 确保最终值准确\r\n updateDigitArray(endValue)\r\n isAnimating.value = false\r\n emit('complete')\r\n }\r\n }\r\n \r\n requestAnimationFrame(animate)\r\n}\r\n\r\n// 更新数字数组\r\nconst updateDigitArray = (value) => {\r\n const valueStr = formatNumber(value)\r\n const maxStr = maxDigitString.value\r\n \r\n // 保持数组长度不变,只更新值\r\n for (let i = 0; i < maxStr.length; i++) {\r\n if (i < valueStr.length) {\r\n currentDigits.value[i] = valueStr[i]\r\n } else {\r\n // 超出部分保持为'0'或分隔符\r\n currentDigits.value[i] = isNaN(maxStr[i]) ? maxStr[i] : '0'\r\n }\r\n }\r\n}\r\n\r\n// 监听 end 值变化,重新开始动画\r\nwatch(() => props.end, (newVal, oldVal) => {\r\n if (newVal !== oldVal) {\r\n // 当位数可能发生变化时,更新key强制重新渲染\r\n const newStr = formatNumber(newVal)\r\n const oldStr = formatNumber(oldVal)\r\n if (newStr.length !== oldStr.length) {\r\n digitKey.value += 1\r\n nextTick(() => {\r\n startAnimation()\r\n })\r\n } else {\r\n startAnimation()\r\n }\r\n }\r\n})\r\n\r\n// 组件挂载时开始动画\r\nonMounted(() => {\r\n if (props.autoplay) {\r\n // 检查初始值和目标值位数是否不同,如果不同则更新key\r\n const startStr = startNumberString.value\r\n const endStr = targetNumberString.value\r\n if (startStr.length !== endStr.length) {\r\n digitKey.value += 1\r\n }\r\n \r\n nextTick(() => {\r\n startAnimation()\r\n })\r\n }\r\n})\r\n\r\n// 提供外部调用方法\r\ndefineExpose({\r\n startAnimation\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.vtk-count {\r\n display: inline-block;\r\n}\r\n\r\n.count-display {\r\n display: flex;\r\n align-items: center;\r\n font-family: 'Roboto Mono', monospace;\r\n font-size: 24px;\r\n font-weight: bold;\r\n}\r\n\r\n.digits-container {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.digit-wrapper {\r\n position: relative;\r\n width: 1em;\r\n height: 1em;\r\n overflow: hidden;\r\n text-align: center;\r\n margin: 0 1px;\r\n}\r\n\r\n.digit-wrapper.digit-separator {\r\n width: auto;\r\n animation: none;\r\n}\r\n\r\n.digit-scroll {\r\n position: relative;\r\n height: 100%;\r\n}\r\n\r\n.digit-item {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.separator {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n font-weight: normal;\r\n}\r\n\r\n.prefix, .suffix {\r\n font-size: 0.8em;\r\n align-self: flex-end;\r\n margin-bottom: 0.1em;\r\n}\r\n\r\n.prefix {\r\n margin-right: 4px;\r\n}\r\n\r\n.suffix {\r\n margin-left: 4px;\r\n}\r\n\r\n/* 响应式设计 */\r\n@media (max-width: 768px) {\r\n .count-display {\r\n font-size: 20px;\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .count-display {\r\n font-size: 18px;\r\n }\r\n}\r\n</style>","<template>\r\n <div class=\"vtk-date-range-picker\">\r\n <VMenu\r\n v-model=\"menu\"\r\n :close-on-content-click=\"false\"\r\n transition=\"scale-transition\"\r\n offset-y\r\n min-width=\"auto\"\r\n eager\r\n >\r\n <template #activator=\"{ props: activatorProps }\">\r\n <VTextField\r\n v-bind=\"{ ...activatorProps, ...textFieldProps }\"\r\n v-model=\"displayValue\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n readonly\r\n clearable\r\n density=\"compact\"\r\n variant=\"outlined\"\r\n @click:clear=\"clearValue\"\r\n >\r\n <template #prepend-inner>\r\n <VIcon size=\"small\">mdi-calendar</VIcon>\r\n </template>\r\n </VTextField>\r\n </template>\r\n \r\n <VCard style=\"width: 650px;\">\r\n <VCardText class=\"pa-0\">\r\n <div class=\"date-picker-container\">\r\n <VDatePicker\r\n v-model=\"startDateRange\"\r\n hide-header\r\n :min=\"minDate\"\r\n :max=\"maxDate\"\r\n :show-current=\"showCurrent\"\r\n @update:model-value=\"onStartDateChange\"\r\n class=\"date-picker-item\"\r\n />\r\n <VDatePicker\r\n v-model=\"endDateRange\"\r\n hide-header\r\n :min=\"minDate\"\r\n :max=\"maxDate\"\r\n :show-current=\"showCurrent\"\r\n @update:model-value=\"onEndDateChange\"\r\n class=\"date-picker-item\"\r\n />\r\n </div>\r\n </VCardText>\r\n \r\n <VDivider></VDivider>\r\n \r\n <VCardActions>\r\n <VSpacer></VSpacer>\r\n <VBtn text @click=\"cancel\">取消</VBtn>\r\n <VBtn color=\"primary\" variant=\"tonal\" @click=\"confirm\">确定</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VMenu>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch, useAttrs } from 'vue';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkDatePicker\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n // v-model绑定值\r\n modelValue: {\r\n type: [Array, String],\r\n default: () => []\r\n },\r\n // 占位符\r\n placeholder: {\r\n type: String,\r\n default: '请选择日期范围'\r\n },\r\n // 禁用状态\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 最小日期\r\n min: {\r\n type: String,\r\n default: undefined\r\n },\r\n // 最大日期\r\n max: {\r\n type: String,\r\n default: undefined\r\n },\r\n // 是否显示当前日期\r\n showCurrent: {\r\n type: [Boolean, String],\r\n default: true\r\n },\r\n // 显示格式\r\n format: {\r\n type: String,\r\n default: 'YYYY-MM-DD'\r\n },\r\n // 分隔符\r\n separator: {\r\n type: String,\r\n default: ' 至 '\r\n }\r\n});\r\n\r\n// 定义emit事件\r\nconst emit = defineEmits(['update:modelValue', 'change']);\r\n\r\n// 获取透传属性\r\nconst attrs = useAttrs();\r\n\r\n// 菜单显示控制\r\nconst menu = ref(false);\r\n\r\n// 日期范围值\r\nconst dateRange = ref([]);\r\n\r\n// 为了横向排列,需要分别管理开始和结束日期选择器的值\r\nconst startDateRange = ref(null);\r\nconst endDateRange = ref(null);\r\n\r\n\r\n// 显示值\r\nconst displayValue = computed(() => {\r\n if (!dateRange.value || dateRange.value.length === 0) {\r\n return '';\r\n }\r\n \r\n if (dateRange.value.length === 1) {\r\n return formatDate(dateRange.value[0]);\r\n }\r\n \r\n return `${formatDate(dateRange.value[0])}${props.separator}${formatDate(dateRange.value[1])}`;\r\n});\r\n\r\n// 文本框属性\r\nconst textFieldProps = computed(() => {\r\n // 排除我们自己使用的属性\r\n const { \r\n modelValue, \r\n placeholder, \r\n disabled, \r\n min, \r\n max, \r\n showCurrent, \r\n format,\r\n separator,\r\n ...rest \r\n } = attrs;\r\n \r\n return rest;\r\n});\r\n\r\n// 格式化日期\r\nconst formatDate = (date) => {\r\n if (!date) return '';\r\n \r\n // 如果是字符串直接返回\r\n if (typeof date === 'string') {\r\n return date;\r\n }\r\n \r\n // 如果是 Date 对象\r\n if (date instanceof Date) {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n \r\n return date;\r\n};\r\n\r\n// 最小日期\r\nconst minDate = computed(() => props.min);\r\n\r\n// 最大日期\r\nconst maxDate = computed(() => props.max);\r\n\r\n// 监听外部modelValue变化\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n if (Array.isArray(newValue) && newValue.length > 0) {\r\n dateRange.value = [...newValue];\r\n // 同步到单独的日期选择器\r\n if (newValue[0]) startDateRange.value = newValue[0];\r\n if (newValue[1]) endDateRange.value = newValue[1];\r\n } else if (typeof newValue === 'string' && newValue) {\r\n // 处理字符串形式的日期范围,如 \"2023-01-01 至 2023-01-31\"\r\n const dates = newValue.split(props.separator);\r\n if (dates.length === 2) {\r\n dateRange.value = [dates[0].trim(), dates[1].trim()];\r\n startDateRange.value = dates[0].trim();\r\n endDateRange.value = dates[1].trim();\r\n } else {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n }\r\n } else {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n }\r\n },\r\n { immediate: true }\r\n);\r\n\r\n\r\n// 开始日期变化处理\r\nconst onStartDateChange = (value) => {\r\n // 更新日期范围的第一个值\r\n if (value) {\r\n dateRange.value = [value, dateRange.value[1] || null];\r\n } else {\r\n // 如果开始日期被清除,清除整个范围或只清除开始日期\r\n if (dateRange.value.length > 0) {\r\n dateRange.value = [null, dateRange.value[1] || null];\r\n }\r\n }\r\n};\r\n\r\n// 结束日期变化处理\r\nconst onEndDateChange = (value) => {\r\n // 更新日期范围的第二个值\r\n if (value) {\r\n dateRange.value = [dateRange.value[0] || null, value];\r\n } else {\r\n // 如果结束日期被清除,只清除结束日期\r\n if (dateRange.value.length > 1) {\r\n dateRange.value = [dateRange.value[0] || null, null];\r\n }\r\n }\r\n};\r\n\r\n// 清除值\r\nconst clearValue = () => {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n emit('update:modelValue', []);\r\n emit('change', []);\r\n menu.value = false;\r\n};\r\n\r\n// 取消\r\nconst cancel = () => {\r\n // 恢复到原始值\r\n if (Array.isArray(props.modelValue)) {\r\n dateRange.value = [...props.modelValue];\r\n if (props.modelValue[0]) startDateRange.value = props.modelValue[0];\r\n if (props.modelValue[1]) endDateRange.value = props.modelValue[1];\r\n } else {\r\n dateRange.value = [];\r\n startDateRange.value = null;\r\n endDateRange.value = null;\r\n }\r\n menu.value = false;\r\n};\r\n\r\n// 确认\r\nconst confirm = () => {\r\n // 确保日期按顺序排列\r\n let sortedRange = [...dateRange.value].filter(date => date !== null);\r\n if (sortedRange.length === 2) {\r\n const date1 = new Date(sortedRange[0]);\r\n const date2 = new Date(sortedRange[1]);\r\n if (date1 > date2) {\r\n sortedRange = [sortedRange[1], sortedRange[0]];\r\n }\r\n } else if (sortedRange.length === 1) {\r\n // 如果只有一个日期,复制为范围\r\n sortedRange = [sortedRange[0], sortedRange[0]];\r\n }\r\n \r\n emit('update:modelValue', sortedRange);\r\n emit('change', sortedRange);\r\n menu.value = false;\r\n};\r\n</script>\r\n\r\n<style scoped>\r\n.vtk-date-range-picker {\r\n width: 100%;\r\n}\r\n\r\n.date-picker-container {\r\n display: flex;\r\n flex-direction: row;\r\n gap: 0;\r\n}\r\n\r\n.date-picker-item {\r\n flex: 1;\r\n max-width: 50%;\r\n}\r\n\r\n.date-picker-item:first-child {\r\n border-right: 1px solid rgba(0, 0, 0, 0.12);\r\n}\r\n\r\n:deep(.v-picker) {\r\n border-radius: 0;\r\n}\r\n\r\n:deep(.v-date-picker-month__day--adjacent) {\r\n opacity: 0.5;\r\n}\r\n\r\n:deep(.v-date-picker-title) {\r\n display: none;\r\n}\r\n</style>","<template>\n <div ref=\"headerRef\" class=\"panel-header\" @keydown.esc.stop=\"closePicker\">\n <button type=\"button\" class=\"panel-nav\" aria-label=\"上一周期\" @click=\"handleNavigate('prev')\">‹</button>\n\n <div class=\"panel-title\">\n <button type=\"button\" class=\"title-trigger\" :class=\"{ active: openPicker === 'year' }\"\n :aria-expanded=\"openPicker === 'year'\" aria-label=\"选择年份\" @click.stop=\"togglePicker('year')\">\n {{ year }}年\n </button>\n <button v-if=\"showMonth\" type=\"button\" class=\"title-trigger month-trigger\"\n :class=\"{ active: openPicker === 'month' }\" :aria-expanded=\"openPicker === 'month'\" aria-label=\"选择月份\"\n @click.stop=\"togglePicker('month')\">\n {{ month + 1 }}月\n </button>\n </div>\n\n <button type=\"button\" class=\"panel-nav\" aria-label=\"下一周期\" @click=\"handleNavigate('next')\">›</button>\n\n <div v-if=\"openPicker\" class=\"panel-popover\" @click.stop>\n <template v-if=\"openPicker === 'year'\">\n <div class=\"picker-navigation\">\n <button type=\"button\" class=\"picker-nav\" aria-label=\"上一组年份\" @click=\"shiftYearPage(-YEAR_PAGE_SIZE)\">\n ‹\n </button>\n <span class=\"picker-range\">{{ yearPage[0] }} - {{ yearPage[yearPage.length - 1] }}</span>\n <button type=\"button\" class=\"picker-nav\" :disabled=\"!canShowNextYearPage\" aria-label=\"下一组年份\"\n @click=\"shiftYearPage(YEAR_PAGE_SIZE)\">\n ›\n </button>\n </div>\n <div class=\"picker-grid year-picker-grid\">\n <button v-for=\"item in yearPage\" :key=\"item\" type=\"button\" class=\"picker-option\"\n :class=\"{ selected: item === year }\" :disabled=\"isYearDisabled(item)\" @click=\"selectYear(item)\">\n {{ item }}\n </button>\n </div>\n </template>\n\n <template v-else>\n <div class=\"picker-caption\">{{ year }}年</div>\n <div class=\"picker-grid month-picker-grid\">\n <button v-for=\"(item, index) in MONTHS\" :key=\"item\" type=\"button\" class=\"picker-option\"\n :class=\"{ selected: index === month }\" :disabled=\"isMonthDisabled(index)\" @click=\"selectMonth(index)\">\n {{ item }}\n </button>\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkDatePanelHeader',\n});\n\nconst props = defineProps({\n year: {\n type: Number,\n required: true\n },\n month: {\n type: Number,\n default: 0\n },\n showMonth: {\n type: Boolean,\n default: true\n },\n maxYear: {\n type: Number,\n default: null\n },\n maxMonth: {\n type: Number,\n default: 11\n }\n});\n\nconst emit = defineEmits(['update:year', 'update:month', 'prev', 'next']);\n\nconst YEAR_PAGE_SIZE = 12;\nconst YEAR_PAGE_CENTER_OFFSET = 4;\nconst MONTHS = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];\n\nconst getYearPageStart = (year) => year - YEAR_PAGE_CENTER_OFFSET;\n\nconst openPicker = ref(null);\nconst yearPageStart = ref(getYearPageStart(props.year));\nconst headerRef = ref(null);\n\nconst yearPage = computed(() =>\n Array.from({ length: YEAR_PAGE_SIZE }, (_, index) => yearPageStart.value + index)\n);\n\nconst canShowNextYearPage = computed(() =>\n props.maxYear === null || yearPageStart.value + YEAR_PAGE_SIZE <= props.maxYear\n);\n\nconst isYearDisabled = (year) => props.maxYear !== null && year > props.maxYear;\n\nconst isMonthDisabled = (month) => {\n if (props.maxYear === null || props.year < props.maxYear) return false;\n if (props.year > props.maxYear) return true;\n return month > props.maxMonth;\n};\n\nconst togglePicker = (type) => {\n if (openPicker.value === type) {\n closePicker();\n return;\n }\n\n if (type === 'year') {\n yearPageStart.value = getYearPageStart(props.year);\n }\n openPicker.value = type;\n};\n\nconst closePicker = () => {\n openPicker.value = null;\n};\n\nconst shiftYearPage = (offset) => {\n const nextStart = yearPageStart.value + offset;\n if (offset > 0 && props.maxYear !== null && nextStart > props.maxYear) return;\n yearPageStart.value = nextStart;\n};\n\nconst selectYear = (year) => {\n if (isYearDisabled(year)) return;\n\n emit('update:year', year);\n if (props.showMonth) {\n if (props.maxYear !== null && year === props.maxYear && props.month > props.maxMonth) {\n emit('update:month', props.maxMonth);\n }\n openPicker.value = 'month';\n } else {\n closePicker();\n }\n};\n\nconst selectMonth = (month) => {\n if (isMonthDisabled(month)) return;\n emit('update:month', month);\n closePicker();\n};\n\nconst handleNavigate = (direction) => {\n closePicker();\n emit(direction);\n};\n\nconst handleOutsideClick = (event) => {\n if (openPicker.value && !headerRef.value?.contains(event.target)) {\n closePicker();\n }\n};\n\nwatch(() => props.year, (year) => {\n if (openPicker.value !== 'year') {\n yearPageStart.value = getYearPageStart(year);\n }\n});\n\nonMounted(() => document.addEventListener('click', handleOutsideClick));\nonBeforeUnmount(() => document.removeEventListener('click', handleOutsideClick));\n</script>\n\n<style scoped>\n.panel-header {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 30px;\n margin-bottom: 4px;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 112px;\n}\n\n.title-trigger,\n.panel-nav,\n.picker-nav,\n.picker-option {\n border: 0;\n outline: none;\n font: inherit;\n}\n\n.title-trigger {\n position: relative;\n padding: 5px 17px 5px 7px;\n border-radius: 5px;\n background: transparent;\n color: rgb(var(--v-theme-on-surface));\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n cursor: pointer;\n transition: color 0.18s ease, background 0.18s ease;\n}\n\n.title-trigger::after {\n position: absolute;\n top: 10px;\n right: 7px;\n width: 5px;\n height: 5px;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n content: '';\n transform: rotate(45deg);\n transition: transform 0.18s ease;\n}\n\n.title-trigger:hover,\n.title-trigger.active {\n background: rgb(var(--v-theme-primary), 0.1);\n color: rgb(var(--v-theme-primary));\n}\n\n.title-trigger.active::after {\n top: 12px;\n transform: rotate(225deg);\n}\n\n.month-trigger {\n margin-left: 1px;\n}\n\n.panel-nav,\n.picker-nav {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 5px;\n background: transparent;\n color: rgb(var(--v-theme-on-surface), 0.55);\n cursor: pointer;\n transition: color 0.18s ease, background 0.18s ease;\n}\n\n.panel-nav {\n width: 24px;\n height: 24px;\n font-size: 17px;\n}\n\n.panel-nav:hover,\n.picker-nav:hover:not(:disabled) {\n background: rgb(var(--v-theme-on-surface), 0.08);\n color: rgb(var(--v-theme-on-surface));\n}\n\n.panel-popover {\n position: absolute;\n z-index: 5;\n top: 34px;\n left: 50%;\n width: 204px;\n padding: 10px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 8px;\n background: rgb(var(--v-theme-surface));\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.16);\n transform: translateX(-50%);\n}\n\n.picker-navigation {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.picker-range,\n.picker-caption {\n color: rgb(var(--v-theme-on-surface), 0.72);\n font-size: 12px;\n font-weight: 600;\n}\n\n.picker-caption {\n margin-bottom: 8px;\n text-align: center;\n}\n\n.picker-nav {\n width: 24px;\n height: 24px;\n font-size: 16px;\n}\n\n.picker-nav:disabled {\n color: rgb(var(--v-theme-on-surface), 0.22);\n cursor: not-allowed;\n}\n\n.picker-grid {\n display: grid;\n gap: 6px;\n}\n\n.year-picker-grid,\n.month-picker-grid {\n grid-template-columns: repeat(4, 1fr);\n}\n\n.picker-option {\n min-width: 0;\n padding: 7px 2px;\n border-radius: 5px;\n background: transparent;\n color: rgb(var(--v-theme-on-surface), 0.82);\n font-size: 12px;\n cursor: pointer;\n transition: color 0.18s ease, background 0.18s ease;\n}\n\n.picker-option:hover:not(:disabled) {\n background: rgb(var(--v-theme-primary), 0.1);\n color: rgb(var(--v-theme-primary));\n}\n\n.picker-option.selected {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n font-weight: 600;\n}\n\n.picker-option:disabled {\n color: rgb(var(--v-theme-on-surface), 0.24);\n cursor: not-allowed;\n}\n</style>\n","<template>\r\n <div class=\"vtk-date-selector\" :style=\"rootStyle\">\n <VMenu\r\n v-if=\"!inline\"\r\n v-model=\"showPicker\"\r\n :attach=\"menuAttach\"\r\n :location=\"menuLocation\"\r\n :origin=\"menuOrigin\"\r\n offset=\"4\"\r\n :close-on-content-click=\"false\"\r\n >\r\n <template #activator=\"{ props: menuProps }\">\r\n <div class=\"date-input\">\r\n <VTextField :model-value=\"displayValue\" :placeholder=\"placeholder\" :disabled=\"disabled\" density=\"compact\"\r\n variant=\"outlined\" hide-details readonly v-bind=\"menuProps\" :clearable=\"!!displayValue && !disabled\"\r\n clear-icon=\"mdi-close-circle\" persistent-clear class=\"date-input-field\" @click:clear.stop=\"clearValue\">\r\n <template #append-inner>\r\n <span class=\"date-icon\" aria-hidden=\"true\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" class=\"date-icon-svg\">\r\n <path\r\n d=\"M7 2.75a.75.75 0 0 1 .75.75V5h8.5V3.5a.75.75 0 0 1 1.5 0V5h.75A2.5 2.5 0 0 1 21 7.5v10A2.5 2.5 0 0 1 18.5 20h-13A2.5 2.5 0 0 1 3 17.5v-10A2.5 2.5 0 0 1 5.5 5h.75V3.5A.75.75 0 0 1 7 2.75ZM4.5 10v7.5c0 .552.448 1 1 1h13c.552 0 1-.448 1-1V10h-15Zm1-3.5c-.552 0-1 .448-1 1v1h15v-1c0-.552-.448-1-1-1h-.75v1a.75.75 0 0 1-1.5 0v-1h-8.5v1a.75.75 0 0 1-1.5 0v-1H5.5Zm2.25 5.75a.75.75 0 0 1 .75.75v.25a.75.75 0 0 1-1.5 0V13a.75.75 0 0 1 .75-.75Zm4.25 0a.75.75 0 0 1 .75.75v.25a.75.75 0 0 1-1.5 0V13a.75.75 0 0 1 .75-.75Zm4.25 0a.75.75 0 0 1 .75.75v.25a.75.75 0 0 1-1.5 0V13a.75.75 0 0 1 .75-.75Zm-8.5 3.75a.75.75 0 0 1 .75.75V17a.75.75 0 0 1-1.5 0v-.25a.75.75 0 0 1 .75-.75Zm4.25 0a.75.75 0 0 1 .75.75V17a.75.75 0 0 1-1.5 0v-.25a.75.75 0 0 1 .75-.75Z\"\r\n fill=\"currentColor\" />\r\n </svg>\r\n </span>\r\n </template>\r\n </VTextField>\r\n </div>\r\n </template>\r\n <div class=\"date-picker-dropdown\" :style=\"popupStyle\" @click.stop @mousedown.stop>\n <!-- 头部控制区(非日期/月份范围选择模式时显示) -->\r\n <div v-if=\"!(mode === 'range' && (displayMode === 'day' || displayMode === 'month'))\" class=\"picker-header\">\r\n <button class=\"nav-btn\" @click=\"prevPeriod\">‹</button>\r\n <div class=\"header-title\">\r\n <span @click=\"changeViewMode('year')\" class=\"clickable\">{{ currentYear }}年</span>\r\n <span v-if=\"displayMode !== 'year' && viewMode !== 'month'\" @click=\"changeViewMode('month')\"\r\n class=\"clickable\">{{\r\n currentMonth + 1\r\n }}月</span>\r\n </div>\r\n <button class=\"nav-btn\" @click=\"nextPeriod\">›</button>\r\n </div>\r\n\r\n <!-- 年份选择视图 -->\r\n <div v-if=\"viewMode === 'year'\" class=\"picker-body\">\r\n <div class=\"year-grid\">\r\n <div v-for=\"year in yearList\" :key=\"year\"\r\n :class=\"['year-item', { 'selected': isYearSelected(year), 'in-range': isYearInRange(year), 'disabled': isFutureYear(year) }]\"\r\n @click=\"selectYear(year)\">\r\n {{ year }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 月份选择视图 -->\r\n <div v-else-if=\"viewMode === 'month'\" class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个年份的月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" :show-month=\"false\"\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYear\" @next=\"nextYearLeft\" />\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" :show-month=\"false\"\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYearRight\" @next=\"nextYear\" />\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelectedRight(index), 'in-range': isMonthInRangeRight(index), 'disabled': isFutureMonth(index, rightYear) }]\"\r\n @click=\"selectMonthRight(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个年份的月份 -->\r\n <div v-else>\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 周选择视图 -->\r\n <div v-else-if=\"viewMode === 'week'\" class=\"picker-body\">\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"week-grid\">\r\n <div v-for=\"week in weekList\" :key=\"week.weekNumber\"\r\n :class=\"['week-row', { 'selected': isWeekSelected(week), 'in-range': isWeekInRange(week) }]\"\r\n @click=\"selectWeek(week)\">\r\n <div class=\"week-number\">W{{ week.weekNumber }}</div>\r\n <div v-for=\"day in week.days\" :key=\"day.date\"\r\n :class=\"['day-cell', { 'other-month': day.otherMonth, 'today': day.isToday }]\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 日期选择视图(默认) -->\r\n <div v-else class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" v-model:month=\"currentMonth\"\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonth\"\n @next=\"nextMonthLeft\" />\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" v-model:month=\"rightMonth\"\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonthRight\"\n @next=\"nextMonth\" />\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in nextMonthDayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个月份 -->\r\n <div v-else>\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 底部操作区 -->\r\n <div v-if=\"mode === 'range' && (displayMode === 'day' || displayMode === 'month')\" class=\"range-display\">\r\n <span class=\"range-text\">\r\n <template v-if=\"tempValue && Array.isArray(tempValue) && tempValue.length > 0\">\r\n {{ tempValue[0] || (displayMode === 'month' ? '开始月份' : '开始日期') }}\r\n <span class=\"range-separator\"> - </span>\r\n {{ tempValue[1] || (displayMode === 'month' ? '结束月份' : '结束日期') }}\r\n </template>\r\n <template v-else>\r\n <span class=\"placeholder-text\">{{ displayMode === 'month' ? '请选择月份范围' : '请选择日期范围' }}</span>\r\n </template>\r\n </span>\r\n </div>\r\n <div class=\"picker-footer\">\r\n <button class=\"btn btn-text\" @click=\"handleCancel\">取消</button>\r\n <button class=\"btn btn-primary\" @click=\"handleConfirm\">确定</button>\r\n </div>\r\n </div>\r\n </VMenu>\r\n <div v-if=\"inline\" class=\"date-picker-dropdown inline-mode\" :style=\"popupStyle\" @click.stop @mousedown.stop>\n <!-- 头部控制区(非日期/月份范围选择模式时显示) -->\r\n <div v-if=\"!(mode === 'range' && (displayMode === 'day' || displayMode === 'month'))\" class=\"picker-header\">\r\n <button class=\"nav-btn\" @click=\"prevPeriod\">‹</button>\r\n <div class=\"header-title\">\r\n <span @click=\"changeViewMode('year')\" class=\"clickable\">{{ currentYear }}年</span>\r\n <span v-if=\"displayMode !== 'year' && viewMode !== 'month'\" @click=\"changeViewMode('month')\"\r\n class=\"clickable\">{{\r\n currentMonth + 1\r\n }}月</span>\r\n </div>\r\n <button class=\"nav-btn\" @click=\"nextPeriod\">›</button>\r\n </div>\r\n\r\n <!-- 年份选择视图 -->\r\n <div v-if=\"viewMode === 'year'\" class=\"picker-body\">\r\n <div class=\"year-grid\">\r\n <div v-for=\"year in yearList\" :key=\"year\"\r\n :class=\"['year-item', { 'selected': isYearSelected(year), 'in-range': isYearInRange(year), 'disabled': isFutureYear(year) }]\"\r\n @click=\"selectYear(year)\">\r\n {{ year }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 月份选择视图 -->\r\n <div v-else-if=\"viewMode === 'month'\" class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个年份的月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" :show-month=\"false\"\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYear\" @next=\"nextYearLeft\" />\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧年份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" :show-month=\"false\"\n :max-year=\"disableFuture ? todayYear : null\" @prev=\"prevYearRight\" @next=\"nextYear\" />\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelectedRight(index), 'in-range': isMonthInRangeRight(index), 'disabled': isFutureMonth(index, rightYear) }]\"\r\n @click=\"selectMonthRight(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个年份的月份 -->\r\n <div v-else>\r\n <div class=\"month-grid\">\r\n <div v-for=\"(month, index) in monthList\" :key=\"index\"\r\n :class=\"['month-item', { 'selected': isMonthSelected(index), 'in-range': isMonthInRange(index), 'disabled': isFutureMonth(index, currentYear) }]\"\r\n @click=\"selectMonth(index)\">\r\n {{ month }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 周选择视图 -->\r\n <div v-else-if=\"viewMode === 'week'\" class=\"picker-body\">\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"week-grid\">\r\n <div v-for=\"week in weekList\" :key=\"week.weekNumber\"\r\n :class=\"['week-row', { 'selected': isWeekSelected(week), 'in-range': isWeekInRange(week) }]\"\r\n @click=\"selectWeek(week)\">\r\n <div class=\"week-number\">W{{ week.weekNumber }}</div>\r\n <div v-for=\"day in week.days\" :key=\"day.date\"\r\n :class=\"['day-cell', { 'other-month': day.otherMonth, 'today': day.isToday }]\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 日期选择视图(默认) -->\r\n <div v-else class=\"picker-body\">\r\n <!-- 范围选择模式:显示两个月份 -->\r\n <div v-if=\"mode === 'range'\" class=\"dual-calendar\">\r\n <!-- 左侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"currentYear\" v-model:month=\"currentMonth\"\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonth\"\n @next=\"nextMonthLeft\" />\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-if=\"!singlePanel\">\r\n <!-- 分割线 -->\r\n <div class=\"calendar-divider\"></div>\r\n\r\n <!-- 右侧月份 -->\r\n <div class=\"calendar-panel\">\r\n <VtkDatePanelHeader v-model:year=\"rightYear\" v-model:month=\"rightMonth\"\n :max-year=\"disableFuture ? todayYear : null\" :max-month=\"todayMonth\" @prev=\"prevMonthRight\"\n @next=\"nextMonth\" />\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in nextMonthDayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday,\r\n 'disabled': isFutureDay(day)\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 单选模式:显示一个月份 -->\r\n <div v-else>\r\n <div class=\"week-header\">\r\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\r\n </div>\r\n <div class=\"day-grid\">\r\n <div v-for=\"day in dayList\" :key=\"day.date\" :class=\"['day-item', {\r\n 'other-month': day.otherMonth,\r\n 'selected': isDaySelected(day),\r\n 'in-range': isDayInRange(day),\r\n 'range-start': isDayRangeStart(day),\r\n 'range-end': isDayRangeEnd(day),\r\n 'today': day.isToday\r\n }]\" @click=\"selectDay(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 底部操作区 -->\r\n <div v-if=\"mode === 'range' && (displayMode === 'day' || displayMode === 'month')\" class=\"range-display\">\r\n <span class=\"range-text\">\r\n <template v-if=\"tempValue && Array.isArray(tempValue) && tempValue.length > 0\">\r\n {{ tempValue[0] || (displayMode === 'month' ? '开始月份' : '开始日期') }}\r\n <span class=\"range-separator\"> - </span>\r\n {{ tempValue[1] || (displayMode === 'month' ? '结束月份' : '结束日期') }}\r\n </template>\r\n <template v-else>\r\n <span class=\"placeholder-text\">{{ displayMode === 'month' ? '请选择月份范围' : '请选择日期范围' }}</span>\r\n </template>\r\n </span>\r\n </div>\r\n <div class=\"picker-footer\">\r\n <button class=\"btn btn-text\" @click=\"handleCancel\">取消</button>\r\n <button class=\"btn btn-primary\" @click=\"handleConfirm\">确定</button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</template>\r\n\r\n<script setup>\nimport { ref, computed, watch } from 'vue';\nimport VtkDatePanelHeader from './VtkDatePanelHeader.vue';\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: 'VtkDateSelector',\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // v-model 绑定值\r\n modelValue: {\r\n type: [String, Array],\r\n default: null\r\n },\r\n // 显示模式: 'day' | 'week' | 'month' | 'year'\r\n displayMode: {\r\n type: String,\r\n default: 'day',\r\n validator: (value) => ['day', 'week', 'month', 'year'].includes(value)\r\n },\r\n // 选择模式: 'single' | 'range'\r\n mode: {\r\n type: String,\r\n default: 'single',\r\n validator: (value) => ['single', 'range'].includes(value)\r\n },\r\n // 占位符\r\n placeholder: {\n type: String,\n default: '请选择日期'\n },\n // 输入框宽度,数字按 px 处理,也支持 100%、12rem 等 CSS 宽度\n width: {\n type: [String, Number],\n default: ''\n },\n // 日期弹层宽度,数字按 px 处理,也支持 100%、24rem 等 CSS 宽度\n popupWidth: {\n type: [String, Number],\n default: ''\n },\n // 禁用状态\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 日期格式\r\n format: {\r\n type: String,\r\n default: 'YYYY-MM-DD'\r\n },\r\n // 范围分隔符\r\n separator: {\r\n type: String,\r\n default: ' 至 '\r\n },\r\n // 内联模式(直接显示选择器,不需要点击输入框)\r\n inline: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 单面板模式(范围选择时只显示一个面板)\r\n singlePanel: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 禁用未来日期(大于当前日期的都置灰不可选)\r\n disableFuture: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 自定义取消方法\r\n onCancel: {\r\n type: Function,\r\n default: null\r\n },\r\n // 自定义确认方法\r\n onConfirm: {\r\n type: Function,\r\n default: null\r\n },\r\n // 禁用 Teleport 时,弹层保留在当前 DOM 树内\r\n noTeleport: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 下拉框对齐方式: 'left' | 'right'\r\n placement: {\r\n type: String,\r\n default: 'left',\r\n validator: (value) => ['left', 'right'].includes(value)\r\n }\r\n});\r\n\r\n// 定义 emit\r\nconst emit = defineEmits(['update:modelValue', 'change', 'cancel', 'confirm']);\r\n\r\n// 响应式数据\r\nconst showPicker = ref(false);\r\nconst viewMode = ref(props.displayMode);\r\nconst currentYear = ref(new Date().getFullYear());\r\nconst currentMonth = ref(new Date().getMonth());\r\nconst rightYear = ref(new Date().getFullYear());\r\nconst rightMonth = ref(new Date().getMonth() + 1);\r\nconst selectedValue = ref(null);\r\nconst tempValue = ref(null);\r\n\r\n// 当前日期(用于判断未来日期)\r\nconst today = new Date();\r\nconst todayYear = today.getFullYear();\r\nconst todayMonth = today.getMonth();\r\nconst todayDate = today.getDate();\r\n\r\n// 年份面板固定展示 12 个年份,并尽量让锚点年份落在中间偏前位置\r\nconst YEAR_PANEL_SIZE = 12;\r\nconst YEAR_PANEL_CENTER_OFFSET = 4;\r\n\r\n// 周和月份名称\r\nconst weekDays = ['日', '一', '二', '三', '四', '五', '六'];\r\nconst monthList = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];\r\n\r\n// 显示值\nconst menuAttach = computed(() => (props.noTeleport ? true : false));\n\nconst menuLocation = computed(() => props.placement === 'right' ? 'bottom end' : 'bottom start');\n\nconst menuOrigin = computed(() => props.placement === 'right' ? 'top end' : 'top start');\n\nconst normalizeCssSize = (value) => {\n if (value === null || value === undefined || value === '') return '';\n if (typeof value === 'number') return `${value}px`;\n const nextValue = String(value).trim();\n return /^\\d+(\\.\\d+)?$/.test(nextValue) ? `${nextValue}px` : nextValue;\n};\n\nconst rootStyle = computed(() => {\n const width = normalizeCssSize(props.width);\n return width ? { width } : {};\n});\n\nconst popupStyle = computed(() => {\n const width = normalizeCssSize(props.popupWidth);\n return width ? { width } : {};\n});\n\r\nconst displayValue = computed(() => {\r\n if (!selectedValue.value) return '';\r\n\r\n if (props.mode === 'range' && Array.isArray(selectedValue.value)) {\r\n if (selectedValue.value.length === 2) {\r\n return `${formatDisplay(selectedValue.value[0])}${props.separator}${formatDisplay(selectedValue.value[1])}`;\r\n }\r\n return '';\r\n }\r\n\r\n return formatDisplay(selectedValue.value);\r\n});\r\n\r\n// 格式化显示\r\nconst formatDisplay = (value) => {\r\n if (!value) return '';\r\n\r\n if (props.displayMode === 'year') {\r\n return `${value}年`;\r\n } else if (props.displayMode === 'month') {\r\n const [year, month] = value.split('-');\r\n return `${year}年${month}月`;\r\n } else if (props.displayMode === 'week') {\r\n const [year, week] = value.split('-W');\r\n return `${year}年第${week}周`;\r\n }\r\n\r\n return value;\r\n};\r\n\r\n// 年份列表(显示12年)\r\nconst yearList = computed(() => {\n // 年份面板打开时,以当前锚点年份为中心生成 12 个年份选项\n const startYear = currentYear.value - YEAR_PANEL_CENTER_OFFSET;\n return Array.from({ length: YEAR_PANEL_SIZE }, (_, i) => startYear + i);\n});\n\n// 周列表\nconst weekList = computed(() => {\n const weeks = [];\r\n const firstDay = new Date(currentYear.value, currentMonth.value, 1);\r\n const lastDay = new Date(currentYear.value, currentMonth.value + 1, 0);\r\n\r\n let currentDate = new Date(firstDay);\r\n currentDate.setDate(currentDate.getDate() - currentDate.getDay());\r\n\r\n let weekNumber = getWeekNumber(currentDate);\r\n\r\n while (currentDate <= lastDay || currentDate.getDay() !== 0) {\r\n const week = {\r\n weekNumber: weekNumber,\r\n startDate: new Date(currentDate),\r\n days: []\r\n };\r\n\r\n for (let i = 0; i < 7; i++) {\r\n const day = {\r\n date: formatDate(currentDate),\r\n day: currentDate.getDate(),\r\n month: currentDate.getMonth(),\r\n year: currentDate.getFullYear(),\r\n otherMonth: currentDate.getMonth() !== currentMonth.value,\r\n isToday: isToday(currentDate)\r\n };\r\n week.days.push(day);\r\n currentDate.setDate(currentDate.getDate() + 1);\r\n }\r\n\r\n weeks.push(week);\r\n weekNumber++;\r\n\r\n if (currentDate > lastDay && currentDate.getDay() === 0) break;\r\n }\r\n\r\n return weeks;\r\n});\r\n\r\n// 日期列表\r\nconst dayList = computed(() => {\r\n const days = [];\r\n const firstDay = new Date(currentYear.value, currentMonth.value, 1);\r\n const lastDay = new Date(currentYear.value, currentMonth.value + 1, 0);\r\n\r\n const startDate = new Date(firstDay);\r\n startDate.setDate(startDate.getDate() - startDate.getDay());\r\n\r\n const endDate = new Date(lastDay);\r\n endDate.setDate(endDate.getDate() + (6 - endDate.getDay()));\r\n\r\n let currentDate = new Date(startDate);\r\n\r\n while (currentDate <= endDate) {\r\n days.push({\r\n date: formatDate(currentDate),\r\n day: currentDate.getDate(),\r\n month: currentDate.getMonth(),\r\n year: currentDate.getFullYear(),\r\n otherMonth: currentDate.getMonth() !== currentMonth.value,\r\n isToday: isToday(currentDate)\r\n });\r\n currentDate.setDate(currentDate.getDate() + 1);\r\n }\r\n\r\n return days;\r\n});\r\n\r\n// 右侧日历的年份和月份(独立状态)\r\nconst nextMonthYear = computed(() => rightYear.value);\r\nconst nextMonthMonth = computed(() => rightMonth.value);\r\n\r\n// 下个月的日期列表\r\nconst nextMonthDayList = computed(() => {\r\n const days = [];\r\n const firstDay = new Date(nextMonthYear.value, nextMonthMonth.value, 1);\r\n const lastDay = new Date(nextMonthYear.value, nextMonthMonth.value + 1, 0);\r\n\r\n const startDate = new Date(firstDay);\r\n startDate.setDate(startDate.getDate() - startDate.getDay());\r\n\r\n const endDate = new Date(lastDay);\r\n endDate.setDate(endDate.getDate() + (6 - endDate.getDay()));\r\n\r\n let currentDate = new Date(startDate);\r\n\r\n while (currentDate <= endDate) {\r\n days.push({\r\n date: formatDate(currentDate),\r\n day: currentDate.getDate(),\r\n month: currentDate.getMonth(),\r\n year: currentDate.getFullYear(),\r\n otherMonth: currentDate.getMonth() !== nextMonthMonth.value,\r\n isToday: isToday(currentDate)\r\n });\r\n currentDate.setDate(currentDate.getDate() + 1);\r\n }\r\n\r\n return days;\r\n});\r\n\r\n// 工具函数\r\nconst formatDate = (date) => {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n};\r\n\r\nconst isToday = (date) => {\r\n const today = new Date();\r\n return date.getDate() === today.getDate() &&\r\n date.getMonth() === today.getMonth() &&\r\n date.getFullYear() === today.getFullYear();\r\n};\r\n\r\nconst getWeekNumber = (date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d - yearStart) / 86400000) + 1) / 7);\r\n};\r\n\r\n// 选择判断\r\nconst isYearSelected = (year) => {\r\n if (!tempValue.value) return false;\r\n if (props.mode === 'single') {\r\n return tempValue.value === year.toString();\r\n }\r\n if (Array.isArray(tempValue.value) && tempValue.value.length > 0) {\r\n return tempValue.value.some(v => v && v.startsWith(year.toString()));\r\n }\r\n return false;\r\n};\r\n\r\nconst isYearInRange = (year) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const [start, end] = tempValue.value.map(v => parseInt(v));\r\n return year > start && year < end;\r\n};\r\n\r\nconst isMonthSelected = (month) => {\r\n if (!tempValue.value) return false;\r\n const monthStr = `${currentYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n return tempValue.value === monthStr;\r\n }\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(monthStr);\r\n }\r\n return false;\r\n};\r\n\r\nconst isMonthInRange = (month) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const monthStr = `${currentYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n return monthStr > tempValue.value[0] && monthStr < tempValue.value[1];\r\n};\r\n\r\nconst isWeekSelected = (week) => {\r\n if (!tempValue.value) return false;\r\n const weekStr = `${currentYear.value}-W${String(week.weekNumber).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n return tempValue.value === weekStr;\r\n }\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(weekStr);\r\n }\r\n return false;\r\n};\r\n\r\nconst isWeekInRange = (week) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const weekStr = `${currentYear.value}-W${String(week.weekNumber).padStart(2, '0')}`;\r\n return weekStr > tempValue.value[0] && weekStr < tempValue.value[1];\r\n};\r\n\r\nconst isDaySelected = (day) => {\r\n if (!tempValue.value) return false;\r\n if (props.mode === 'single') {\r\n return tempValue.value === day.date;\r\n }\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(day.date);\r\n }\r\n return false;\r\n};\r\n\r\nconst isDayInRange = (day) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n return day.date > tempValue.value[0] && day.date < tempValue.value[1];\r\n};\r\n\r\nconst isDayRangeStart = (day) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length === 0) {\r\n return false;\r\n }\r\n return day.date === tempValue.value[0];\r\n};\r\n\r\nconst isDayRangeEnd = (day) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length < 2) {\r\n return false;\r\n }\r\n return day.date === tempValue.value[1];\r\n};\r\n\r\n// 判断是否是未来日期/月份/年份\r\nconst isFutureYear = (year) => {\r\n if (!props.disableFuture) return false;\r\n return year > todayYear;\r\n};\r\n\r\nconst isFutureMonth = (month, year) => {\r\n if (!props.disableFuture) return false;\r\n if (year > todayYear) return true;\r\n if (year === todayYear && month > todayMonth) return true;\r\n return false;\r\n};\r\n\r\nconst isFutureDay = (day) => {\r\n if (!props.disableFuture) return false;\r\n const [year, month, date] = day.date.split('-').map(Number);\r\n if (year > todayYear) return true;\r\n if (year === todayYear && month - 1 > todayMonth) return true;\r\n if (year === todayYear && month - 1 === todayMonth && date > todayDate) return true;\r\n return false;\r\n};\r\n\r\n// 选择操作\r\nconst selectYear = (year) => {\r\n // 如果是未来年份且禁用未来日期,则不允许选择\r\n if (isFutureYear(year)) return;\r\n\r\n const yearStr = year.toString();\r\n\r\n // 如果 displayMode 是 'year',则选择年份作为值\r\n if (props.displayMode === 'year') {\r\n if (props.mode === 'single') {\r\n tempValue.value = yearStr;\r\n if (props.inline) {\r\n // 内联模式直接确认\r\n confirm();\r\n }\r\n } else {\r\n // 范围选择\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [yearStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= yearStr ? [first, yearStr] : [yearStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [yearStr];\r\n }\r\n }\r\n } else {\r\n // 如果 displayMode 不是 'year',则只是切换年份,然后返回到原来的视图\r\n currentYear.value = year;\r\n // 切换回原来的显示模式\r\n viewMode.value = props.displayMode;\r\n }\r\n};\r\n\r\nconst selectMonth = (month) => {\r\n // 如果是未来月份且禁用未来日期,则不允许选择\r\n if (isFutureMonth(month, currentYear.value)) return;\r\n\r\n if (props.displayMode !== 'month') {\r\n currentMonth.value = month;\r\n viewMode.value = props.displayMode;\r\n return;\r\n }\r\n\r\n const monthStr = `${currentYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n tempValue.value = monthStr;\r\n if (props.displayMode === 'month' || props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [monthStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= monthStr ? [first, monthStr] : [monthStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [monthStr];\r\n }\r\n }\r\n};\r\n\r\nconst selectMonthRight = (month) => {\r\n // 如果是未来月份且禁用未来日期,则不允许选择\r\n if (isFutureMonth(month, rightYear.value)) return;\r\n\r\n const monthStr = `${rightYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [monthStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= monthStr ? [first, monthStr] : [monthStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [monthStr];\r\n }\r\n};\r\n\r\nconst isMonthSelectedRight = (month) => {\r\n if (!tempValue.value) return false;\r\n const monthStr = `${rightYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n if (Array.isArray(tempValue.value)) {\r\n return tempValue.value.includes(monthStr);\r\n }\r\n return false;\r\n};\r\n\r\nconst isMonthInRangeRight = (month) => {\r\n if (props.mode !== 'range' || !Array.isArray(tempValue.value) || tempValue.value.length !== 2) {\r\n return false;\r\n }\r\n const monthStr = `${rightYear.value}-${String(month + 1).padStart(2, '0')}`;\r\n return monthStr > tempValue.value[0] && monthStr < tempValue.value[1];\r\n};\r\n\r\nconst selectWeek = (week) => {\r\n const weekStr = `${currentYear.value}-W${String(week.weekNumber).padStart(2, '0')}`;\r\n if (props.mode === 'single') {\r\n tempValue.value = weekStr;\r\n confirm();\r\n } else {\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [weekStr];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= weekStr ? [first, weekStr] : [weekStr, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [weekStr];\r\n }\r\n }\r\n};\r\n\r\nconst selectDay = (day) => {\r\n // 如果是未来日期且禁用未来日期,则不允许选择\r\n if (isFutureDay(day)) return;\r\n\r\n if (props.mode === 'single') {\r\n tempValue.value = day.date;\r\n // 内联模式下单选直接确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n if (!tempValue.value || !Array.isArray(tempValue.value)) {\r\n tempValue.value = [day.date];\r\n } else if (tempValue.value.length === 1) {\r\n const [first] = tempValue.value;\r\n tempValue.value = first <= day.date ? [first, day.date] : [day.date, first];\r\n // 内联模式下范围选择完成后自动确认\r\n if (props.inline) {\r\n confirm();\r\n }\r\n } else {\r\n tempValue.value = [day.date];\r\n }\r\n }\r\n};\r\n\r\n// 导航操作\r\nconst prevPeriod = () => {\r\n if (viewMode.value === 'year') {\r\n currentYear.value -= 12;\r\n } else if (viewMode.value === 'month') {\r\n currentYear.value -= 1;\r\n } else {\r\n if (currentMonth.value === 0) {\r\n currentMonth.value = 11;\r\n currentYear.value -= 1;\r\n } else {\r\n currentMonth.value -= 1;\r\n }\r\n }\r\n};\r\n\r\nconst nextPeriod = () => {\r\n if (viewMode.value === 'year') {\r\n currentYear.value += 12;\r\n } else if (viewMode.value === 'month') {\r\n currentYear.value += 1;\r\n } else {\r\n if (currentMonth.value === 11) {\r\n currentMonth.value = 0;\r\n currentYear.value += 1;\r\n } else {\r\n currentMonth.value += 1;\r\n }\r\n }\r\n};\r\n\r\n// 月份导航(用于双日历)\r\nconst prevMonth = () => {\r\n // 只控制左侧日历\r\n if (currentMonth.value === 0) {\r\n currentMonth.value = 11;\r\n currentYear.value -= 1;\r\n } else {\r\n currentMonth.value -= 1;\r\n }\r\n};\r\n\r\nconst nextMonthLeft = () => {\r\n // 增加左侧日历月份\r\n if (currentMonth.value === 11) {\r\n currentMonth.value = 0;\r\n currentYear.value += 1;\r\n } else {\r\n currentMonth.value += 1;\r\n }\r\n};\r\n\r\nconst prevMonthRight = () => {\r\n // 减少右侧日历月份\r\n if (rightMonth.value === 0) {\r\n rightMonth.value = 11;\r\n rightYear.value -= 1;\r\n } else {\r\n rightMonth.value -= 1;\r\n }\r\n};\r\n\r\nconst nextMonth = () => {\r\n // 只控制右侧日历\r\n if (rightMonth.value === 11) {\r\n rightMonth.value = 0;\r\n rightYear.value += 1;\r\n } else {\r\n rightMonth.value += 1;\r\n }\r\n};\r\n\r\n// 年份导航(用于双月份面板)\r\nconst prevYear = () => {\r\n // 只控制左侧年份\r\n currentYear.value -= 1;\r\n};\r\n\r\nconst nextYearLeft = () => {\r\n // 增加左侧年份\r\n currentYear.value += 1;\r\n};\r\n\r\nconst prevYearRight = () => {\r\n // 减少右侧年份\r\n rightYear.value -= 1;\r\n};\r\n\r\nconst nextYear = () => {\r\n // 只控制右侧年份\r\n rightYear.value += 1;\r\n};\r\n\r\nconst changeViewMode = (mode) => {\r\n if (props.displayMode === 'year' && mode !== 'year') return;\r\n if (props.displayMode === 'month' && !['year', 'month'].includes(mode)) return;\r\n viewMode.value = mode;\r\n};\r\n\r\n// 面板操作\nconst parseCalendarValue = (value) => {\n if (typeof value !== 'string') return null;\n\n const match = value.match(/^(\\d{4})(?:-(\\d{2}))?/);\n if (!match) return null;\n\n const month = match[2] ? Number(match[2]) - 1 : null;\n return {\n year: Number(match[1]),\n month: month !== null && month >= 0 && month <= 11 ? month : null\n };\n};\n\nconst setRightPanelToNextMonth = () => {\n if (currentMonth.value === 11) {\n rightYear.value = currentYear.value + 1;\n rightMonth.value = 0;\n } else {\n rightYear.value = currentYear.value;\n rightMonth.value = currentMonth.value + 1;\n }\n};\n\nconst syncCalendarPanels = () => {\n const values = Array.isArray(selectedValue.value) ? selectedValue.value : [selectedValue.value];\n const start = parseCalendarValue(values[0]);\n const end = parseCalendarValue(values[1]);\n\n if (start) {\n currentYear.value = start.year;\n if (start.month !== null) currentMonth.value = start.month;\n }\n\n if (props.displayMode === 'year') return;\n\n if (props.displayMode === 'month') {\n rightYear.value = end && end.year !== currentYear.value ? end.year : currentYear.value + 1;\n return;\n }\n\n const endUsesDifferentMonth = end && end.month !== null &&\n (end.year !== currentYear.value || end.month !== currentMonth.value);\n\n if (props.mode === 'range' && endUsesDifferentMonth) {\n rightYear.value = end.year;\n rightMonth.value = end.month;\n } else {\n setRightPanelToNextMonth();\n }\n};\n\nconst initializePicker = () => {\n tempValue.value = selectedValue.value ?\n (Array.isArray(selectedValue.value) ? [...selectedValue.value] : selectedValue.value) :\n (props.mode === 'range' ? [] : null);\n viewMode.value = props.displayMode;\n syncCalendarPanels();\n};\n\nwatch(showPicker, (isOpen) => {\n if (isOpen) {\r\n initializePicker();\n }\n});\n\nwatch(() => props.modelValue, (newValue) => {\n selectedValue.value = newValue;\n if (props.inline) initializePicker();\n}, { immediate: true });\n\r\nconst closePicker = () => {\r\n showPicker.value = false;\r\n};\r\n\r\nconst clearValue = () => {\r\n selectedValue.value = props.mode === 'range' ? [] : null;\r\n emit('update:modelValue', selectedValue.value);\r\n emit('change', selectedValue.value);\r\n};\r\n\r\nconst confirm = () => {\r\n selectedValue.value = tempValue.value;\r\n emit('update:modelValue', selectedValue.value);\r\n emit('change', selectedValue.value);\r\n closePicker();\r\n};\r\n\r\n// 自定义取消和确认处理\r\nconst handleCancel = () => {\r\n if (props.onCancel) {\r\n props.onCancel();\r\n } else {\r\n emit('cancel');\r\n closePicker();\r\n }\r\n};\r\n\r\nconst handleConfirm = () => {\r\n if (props.onConfirm) {\r\n props.onConfirm(tempValue.value);\r\n } else {\r\n emit('confirm', tempValue.value);\r\n confirm();\r\n }\r\n};\r\n\r\n</script>\n\r\n<style scoped>\r\n.vtk-date-selector {\r\n position: relative;\r\n width: 100%;\r\n}\r\n\r\n.date-input {\r\n width: 100%;\r\n}\r\n\r\n.date-input-field {\r\n cursor: pointer;\r\n}\r\n\r\n:deep(.date-input-field .v-field),\r\n:deep(.date-input-field input) {\r\n cursor: pointer;\r\n}\r\n\r\n.date-icon {\r\n margin-left: 8px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.date-icon-svg {\r\n width: 16px;\r\n height: 16px;\r\n display: block;\r\n}\r\n\r\n.clear-icon {\r\n margin-left: 4px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n font-size: 18px;\r\n line-height: 1;\r\n cursor: pointer;\r\n padding: 2px;\r\n}\r\n\r\n.clear-icon:hover {\r\n color: rgb(var(--v-theme-on-surface), 0.87);\r\n}\r\n\r\n.date-picker-dropdown {\n box-sizing: border-box;\n max-width: calc(100vw - 24px);\n overflow-x: auto;\n background: rgb(var(--v-theme-surface));\n border-radius: 8px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n}\r\n\r\n.date-picker-dropdown.inline-mode {\r\n box-shadow: none;\r\n width: fit-content;\r\n border: none;\r\n}\r\n\r\n.picker-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 16px;\r\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n}\r\n\r\n.header-title {\r\n font-size: 16px;\r\n font-weight: 500;\r\n color: rgb(var(--v-theme-on-surface));\r\n}\r\n\r\n.clickable {\r\n cursor: pointer;\r\n padding: 4px 8px;\r\n border-radius: 4px;\r\n transition: background 0.2s;\r\n}\r\n\r\n.clickable:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.nav-btn {\r\n border: none;\r\n background: none;\r\n font-size: 20px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n cursor: pointer;\r\n padding: 4px 12px;\r\n border-radius: 4px;\r\n transition: background 0.2s;\r\n}\r\n\r\n.nav-btn:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.picker-body {\r\n padding: 8px;\r\n min-height: 200px;\r\n}\r\n\r\n.dual-calendar {\r\n display: flex;\r\n gap: 8px;\r\n}\r\n\r\n.calendar-divider {\r\n width: 1px;\r\n background: rgb(var(--v-theme-on-surface), 0.12);\r\n margin: 0 6px;\r\n}\r\n\r\n.calendar-panel {\r\n flex: 0 0 210px;\r\n width: 210px;\r\n min-width: 210px;\r\n max-width: 210px;\r\n}\r\n\r\n/* 单面板模式:放大以匹配底部范围显示的宽度 */\r\n.calendar-panel:only-child {\r\n flex: 0 0 340px;\r\n width: 340px;\r\n min-width: 340px;\r\n max-width: 340px;\r\n}\r\n\r\n.year-grid,\n.month-grid {\n display: grid;\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: 6px;\r\n}\r\n\r\n.year-item,\r\n.month-item {\r\n padding: 6px;\r\n text-align: center;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n border: 1px solid transparent;\r\n color: rgb(var(--v-theme-on-surface));\r\n font-size: 12px;\r\n}\r\n\r\n.year-item:hover,\r\n.month-item:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.year-item.selected,\r\n.month-item.selected {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.year-item.in-range,\r\n.month-item.in-range {\r\n background: rgb(var(--v-theme-primary), 0.12);\r\n}\r\n\r\n/* 禁用状态样式 */\r\n.year-item.disabled,\r\n.month-item.disabled,\r\n.day-item.disabled {\r\n color: rgb(var(--v-theme-on-surface), 0.26) !important;\r\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\r\n cursor: not-allowed !important;\r\n pointer-events: none;\r\n opacity: 0.5;\r\n}\r\n\r\n.year-item.disabled:hover,\r\n.month-item.disabled:hover,\r\n.day-item.disabled:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\r\n}\r\n\r\n.week-header {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: 2px;\r\n margin-bottom: 6px;\r\n}\r\n\r\n.week-day {\r\n text-align: center;\r\n padding: 6px 0;\r\n font-size: 12px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n font-weight: 500;\r\n}\r\n\r\n.week-grid {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.week-row {\r\n display: grid;\r\n grid-template-columns: 40px repeat(7, 1fr);\r\n gap: 4px;\r\n padding: 4px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: background 0.2s;\r\n}\r\n\r\n.week-row:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.week-row.selected {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.week-row.in-range {\r\n background: rgb(var(--v-theme-primary), 0.12);\r\n}\r\n\r\n.week-number {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 12px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n font-weight: 500;\r\n}\r\n\r\n.day-grid {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: 2px;\r\n}\r\n\r\n.day-item,\r\n.day-cell {\r\n aspect-ratio: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n font-size: 13px;\r\n color: rgb(var(--v-theme-on-surface));\r\n}\r\n\r\n.day-item:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.day-item.other-month,\r\n.day-cell.other-month {\r\n color: rgb(var(--v-theme-on-surface), 0.38);\r\n}\r\n\r\n.day-item.today,\r\n.day-cell.today {\r\n color: rgb(var(--v-theme-primary));\r\n font-weight: 600;\r\n}\r\n\r\n.day-item.selected {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.day-item.in-range {\r\n background: rgb(var(--v-theme-primary), 0.12);\r\n}\r\n\r\n.day-item.range-start,\r\n.day-item.range-end {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.range-display {\r\n padding: 12px 16px;\r\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n text-align: center;\r\n}\r\n\r\n.range-text {\r\n font-size: 14px;\r\n color: rgb(var(--v-theme-on-surface));\r\n}\r\n\r\n.range-separator {\r\n margin: 0 8px;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n}\r\n\r\n.placeholder-text {\r\n color: rgb(var(--v-theme-on-surface), 0.38);\r\n}\r\n\r\n.picker-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 8px;\r\n padding: 12px 16px;\r\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\r\n}\r\n\r\n.btn {\r\n padding: 8px 16px;\r\n border-radius: 4px;\r\n font-size: 14px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n border: none;\r\n outline: none;\r\n}\r\n\r\n.btn-text {\r\n background: none;\r\n color: rgb(var(--v-theme-on-surface), 0.6);\r\n}\r\n\r\n.btn-text:hover {\r\n background: rgb(var(--v-theme-on-surface), 0.08);\r\n}\r\n\r\n.btn-primary {\r\n background: rgb(var(--v-theme-primary));\r\n color: rgb(var(--v-theme-on-primary));\r\n}\r\n\r\n.btn-primary:hover {\r\n opacity: 0.9;\r\n}\r\n</style>\r\n","<template>\n <div class=\"vtk-date-time-picker\">\n <VMenu\n v-if=\"!inline\"\n v-model=\"showPicker\"\n :attach=\"menuAttach\"\n :location=\"menuLocation\"\n :origin=\"menuOrigin\"\n :width=\"menuWidth\"\n :min-width=\"menuWidth\"\n offset=\"4\"\n :close-on-content-click=\"false\"\n >\n <template #activator=\"{ props: menuProps }\">\n <div class=\"date-time-input\">\n <VTextField\n :model-value=\"displayValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n density=\"compact\"\n variant=\"outlined\"\n hide-details\n readonly\n v-bind=\"menuProps\"\n :clearable=\"clearable && !!displayValue && !disabled\"\n clear-icon=\"mdi-close-circle\"\n persistent-clear\n class=\"date-time-input-field\"\n @click:clear.stop=\"clearValue\"\n >\n <template #append-inner>\n <VIcon size=\"16\" class=\"date-time-icon\">mdi-clock-outline</VIcon>\n </template>\n </VTextField>\n </div>\n </template>\n\n <div class=\"date-time-picker-dropdown\" :class=\"{ 'range-mode': isRange }\" @click.stop @mousedown.stop>\n <template v-if=\"isRange\">\n <div class=\"range-input-row\">\n <input class=\"range-date-input\" :value=\"formatDatePart(tempRange[0])\" readonly placeholder=\"开始日期\" />\n <button\n class=\"range-time-input\"\n type=\"button\"\n :class=\"{ active: activeTimeSide === 'start' }\"\n @click=\"openRangeTime('start')\"\n >\n {{ formatTimePart(tempRange[0]) || defaultStartTime }}\n </button>\n <span class=\"range-arrow\">›</span>\n <input class=\"range-date-input\" :value=\"formatDatePart(tempRange[1])\" readonly placeholder=\"结束日期\" />\n <button\n class=\"range-time-input\"\n type=\"button\"\n :class=\"{ active: activeTimeSide === 'end' }\"\n @click=\"openRangeTime('end')\"\n >\n {{ formatTimePart(tempRange[1]) || defaultEndTime }}\n </button>\n\n <div v-if=\"activeTimeSide\" :class=\"['range-time-popover', activeTimeSide]\">\n <div class=\"time-columns compact\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === activeRangeHour }]\"\n @click=\"selectRangeTime('hour', hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === activeRangeMinute }]\"\n @click=\"selectRangeTime('minute', minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === activeRangeSecond }]\"\n @click=\"selectRangeTime('second', second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n <div class=\"time-popover-footer\">\n <button class=\"btn btn-text small\" type=\"button\" @click=\"activeTimeSide = null\">取消</button>\n <button class=\"btn btn-primary small\" type=\"button\" @click=\"activeTimeSide = null\">确定</button>\n </div>\n </div>\n </div>\n\n <div class=\"range-calendar-shell\">\n <div class=\"calendar-panel\">\n <div class=\"calendar-header\">\n <button class=\"nav-btn-small\" type=\"button\" @click=\"prevLeftMonth\">‹</button>\n <span class=\"month-title\">{{ leftYear }} 年 {{ leftMonth + 1 }} 月</span>\n <button class=\"nav-btn-small invisible\" type=\"button\">›</button>\n </div>\n <div class=\"week-header\">\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\n </div>\n <div class=\"day-grid\">\n <button\n v-for=\"day in leftDayList\"\n :key=\"day.date\"\n type=\"button\"\n :class=\"rangeDayClass(day)\"\n @click=\"selectRangeDay(day)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <div class=\"calendar-panel\">\n <div class=\"calendar-header\">\n <button class=\"nav-btn-small invisible\" type=\"button\">‹</button>\n <span class=\"month-title\">{{ rightYear }} 年 {{ rightMonth + 1 }} 月</span>\n <button class=\"nav-btn-small\" type=\"button\" @click=\"nextRightMonth\">›</button>\n </div>\n <div class=\"week-header\">\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\n </div>\n <div class=\"day-grid\">\n <button\n v-for=\"day in rightDayList\"\n :key=\"day.date\"\n type=\"button\"\n :class=\"rangeDayClass(day)\"\n @click=\"selectRangeDay(day)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n </div>\n </template>\n\n <template v-else>\n <div class=\"single-input-row\">\n <input class=\"single-date-input\" :value=\"formatDatePart(tempDate)\" readonly placeholder=\"请选择日期\" />\n <button\n class=\"single-time-input\"\n type=\"button\"\n :class=\"{ active: activeSingleTime }\"\n @click=\"activeSingleTime = true\"\n >\n {{ singleTimeValue }}\n </button>\n\n <div v-if=\"activeSingleTime\" class=\"single-time-popover\">\n <div class=\"time-columns compact\">\n <div class=\"time-column\">\n <button\n v-for=\"hour in hourOptions\"\n :key=\"hour\"\n type=\"button\"\n :class=\"['time-item', { selected: hour === selectedHour, disabled: isTimePartDisabled(hour, selectedMinute, selectedSecond) }]\"\n @click=\"selectHour(hour)\"\n >\n {{ padTime(hour) }}\n </button>\n </div>\n <div class=\"time-column\">\n <button\n v-for=\"minute in minuteOptions\"\n :key=\"minute\"\n type=\"button\"\n :class=\"['time-item', { selected: minute === selectedMinute, disabled: isTimePartDisabled(selectedHour, minute, selectedSecond) }]\"\n @click=\"selectMinute(minute)\"\n >\n {{ padTime(minute) }}\n </button>\n </div>\n <div v-if=\"showSeconds\" class=\"time-column\">\n <button\n v-for=\"second in secondOptions\"\n :key=\"second\"\n type=\"button\"\n :class=\"['time-item', { selected: second === selectedSecond, disabled: isTimePartDisabled(selectedHour, selectedMinute, second) }]\"\n @click=\"selectSecond(second)\"\n >\n {{ padTime(second) }}\n </button>\n </div>\n </div>\n <div class=\"time-popover-footer\">\n <button class=\"btn btn-text small\" type=\"button\" @click=\"activeSingleTime = false\">取消</button>\n <button class=\"btn btn-primary small\" type=\"button\" @click=\"activeSingleTime = false\">确定</button>\n </div>\n </div>\n </div>\n\n <div class=\"single-calendar-panel\">\n <div class=\"picker-header single-header\">\n <button class=\"nav-btn\" type=\"button\" @click=\"prevPeriod\">‹</button>\n <div class=\"header-title\">\n <span class=\"clickable\" @click=\"changeViewMode('year')\">{{ currentYear }} 年</span>\n <span v-if=\"viewMode !== 'year'\" class=\"clickable\" @click=\"changeViewMode('month')\">\n {{ currentMonth + 1 }} 月\n </span>\n </div>\n <button class=\"nav-btn\" type=\"button\" @click=\"nextPeriod\">›</button>\n </div>\n\n <div v-if=\"viewMode === 'year'\" class=\"picker-body\">\n <div class=\"year-grid\">\n <button\n v-for=\"year in yearList\"\n :key=\"year\"\n type=\"button\"\n :class=\"['year-item', { selected: year === currentYear, disabled: isYearDisabled(year) }]\"\n @click=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n </div>\n </div>\n\n <div v-else-if=\"viewMode === 'month'\" class=\"picker-body\">\n <div class=\"month-grid\">\n <button\n v-for=\"(month, index) in monthList\"\n :key=\"month\"\n type=\"button\"\n :class=\"['month-item', { selected: index === currentMonth, disabled: isMonthDisabled(index) }]\"\n @click=\"selectMonth(index)\"\n >\n {{ month }}\n </button>\n </div>\n </div>\n\n <div v-else class=\"picker-body\">\n <div class=\"week-header\">\n <div v-for=\"day in weekDays\" :key=\"day\" class=\"week-day\">{{ day }}</div>\n </div>\n <div class=\"day-grid\">\n <button\n v-for=\"day in dayList\"\n :key=\"day.date\"\n type=\"button\"\n :class=\"['day-item', {\n 'other-month': day.otherMonth,\n selected: isDaySelected(day),\n today: day.isToday,\n disabled: isDayDisabled(day)\n }]\"\n @click=\"selectDay(day)\"\n >\n {{ day.day }}\n </button>\n </div>\n </div>\n </div>\n </template>\n\n <div class=\"picker-footer\">\n <button v-if=\"!isRange\" class=\"btn btn-text\" type=\"button\" @click=\"handleNow\">此刻</button>\n <button v-if=\"isRange\" class=\"btn btn-text\" type=\"button\" @click=\"clearTempRange\">清空</button>\n <span class=\"footer-spacer\"></span>\n <button class=\"btn btn-text\" type=\"button\" @click=\"handleCancel\">取消</button>\n <button class=\"btn btn-primary\" type=\"button\" :disabled=\"!canConfirm\" @click=\"handleConfirm\">确定</button>\n </div>\n </div>\n </VMenu>\n\n <div v-if=\"inline\" class=\"date-time-picker-dropdown inline-mode\" :class=\"{ 'range-mode': isRange }\" @click.stop @mousedown.stop>\n <div class=\"inline-message\">内联模式请使用默认单选面板。</div>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkDateTimePicker',\n});\n\nconst props = defineProps({\n modelValue: {\n type: [String, Date, Number, Array],\n default: null\n },\n mode: {\n type: String,\n default: 'single',\n validator: (value) => ['single', 'range'].includes(value)\n },\n placeholder: {\n type: String,\n default: '请选择日期时间'\n },\n disabled: {\n type: Boolean,\n default: false\n },\n clearable: {\n type: Boolean,\n default: true\n },\n format: {\n type: String,\n default: 'YYYY-MM-DD HH:mm:ss'\n },\n valueFormat: {\n type: String,\n default: 'YYYY-MM-DD HH:mm:ss'\n },\n separator: {\n type: String,\n default: ' 至 '\n },\n min: {\n type: [String, Date, Number],\n default: null\n },\n max: {\n type: [String, Date, Number],\n default: null\n },\n disableFuture: {\n type: Boolean,\n default: false\n },\n minuteStep: {\n type: Number,\n default: 1\n },\n secondStep: {\n type: Number,\n default: 1\n },\n showSeconds: {\n type: Boolean,\n default: true\n },\n inline: {\n type: Boolean,\n default: false\n },\n placement: {\n type: String,\n default: 'left',\n validator: (value) => ['left', 'right'].includes(value)\n },\n noTeleport: {\n type: Boolean,\n default: false\n },\n onCancel: {\n type: Function,\n default: null\n },\n onConfirm: {\n type: Function,\n default: null\n }\n});\n\nconst emit = defineEmits(['update:modelValue', 'change', 'cancel', 'confirm']);\n\nconst showPicker = ref(false);\nconst selectedDateTime = ref(null);\nconst selectedRange = ref([]);\nconst tempDate = ref(null);\nconst tempRange = ref([null, null]);\nconst currentYear = ref(new Date().getFullYear());\nconst currentMonth = ref(new Date().getMonth());\nconst leftYear = ref(new Date().getFullYear());\nconst leftMonth = ref(new Date().getMonth());\nconst rightYear = ref(new Date().getMonth() === 11 ? new Date().getFullYear() + 1 : new Date().getFullYear());\nconst rightMonth = ref(new Date().getMonth() === 11 ? 0 : new Date().getMonth() + 1);\nconst viewMode = ref('day');\nconst selectedHour = ref(0);\nconst selectedMinute = ref(0);\nconst selectedSecond = ref(0);\nconst activeRangeSide = ref('start');\nconst activeTimeSide = ref(null);\nconst activeSingleTime = ref(false);\n\nconst weekDays = ['日', '一', '二', '三', '四', '五', '六'];\nconst monthList = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];\nconst defaultStartTime = '00:00:00';\nconst defaultEndTime = '23:59:59';\n\nconst isRange = computed(() => props.mode === 'range');\nconst menuAttach = computed(() => (props.noTeleport ? true : false));\nconst menuLocation = computed(() => props.placement === 'right' ? 'bottom end' : 'bottom start');\nconst menuOrigin = computed(() => props.placement === 'right' ? 'top end' : 'top start');\nconst menuWidth = computed(() => isRange.value ? 646 : 360);\nconst minDateTime = computed(() => parseValue(props.min));\nconst maxDateTime = computed(() => parseValue(props.max));\nconst hourOptions = computed(() => Array.from({ length: 24 }, (_, index) => index));\nconst minuteOptions = computed(() => buildStepOptions(props.minuteStep));\nconst secondOptions = computed(() => buildStepOptions(props.secondStep));\n\nconst yearList = computed(() => {\n const startYear = Math.floor(currentYear.value / 12) * 12;\n return Array.from({ length: 12 }, (_, index) => startYear + index);\n});\n\nconst dayList = computed(() => getDayList(currentYear.value, currentMonth.value));\nconst leftDayList = computed(() => getDayList(leftYear.value, leftMonth.value));\nconst rightDayList = computed(() => getDayList(rightYear.value, rightMonth.value));\n\nconst displayValue = computed(() => {\n if (isRange.value) {\n if (!selectedRange.value.length) return '';\n const [start, end] = selectedRange.value;\n return [start, end].filter(Boolean).map(date => formatByPattern(date, props.format)).join(props.separator);\n }\n return selectedDateTime.value ? formatByPattern(selectedDateTime.value, props.format) : '';\n});\n\nconst previewValue = computed(() => tempDate.value ? formatByPattern(buildTempDateTime(), props.format) : '');\nconst singleTimeValue = computed(() => {\n const pattern = props.showSeconds ? 'HH:mm:ss' : 'HH:mm';\n const date = buildTempDateTime() || new Date(2000, 0, 1, selectedHour.value, selectedMinute.value, selectedSecond.value);\n return formatByPattern(date, pattern);\n});\n\nconst canConfirm = computed(() => {\n if (isRange.value) {\n const [start, end] = tempRange.value;\n return !!start && !!end && start <= end && !isDateTimeDisabled(start) && !isDateTimeDisabled(end);\n }\n if (!tempDate.value) return false;\n return !isDateTimeDisabled(buildTempDateTime());\n});\n\nconst activeRangeDate = computed(() => {\n return activeTimeSide.value === 'end' ? tempRange.value[1] : tempRange.value[0];\n});\n\nconst activeRangeHour = computed(() => activeRangeDate.value ? activeRangeDate.value.getHours() : 0);\nconst activeRangeMinute = computed(() => activeRangeDate.value ? activeRangeDate.value.getMinutes() : 0);\nconst activeRangeSecond = computed(() => activeRangeDate.value ? activeRangeDate.value.getSeconds() : 0);\n\nconst buildStepOptions = (step) => {\n const normalizedStep = Number.isFinite(step) && step > 0 ? Math.max(1, Math.floor(step)) : 1;\n const options = [];\n for (let value = 0; value < 60; value += normalizedStep) {\n options.push(value);\n }\n return options;\n};\n\nconst getDayList = (year, month) => {\n const firstDay = new Date(year, month, 1);\n const startDay = firstDay.getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const daysInPrevMonth = new Date(year, month, 0).getDate();\n const today = new Date();\n const days = [];\n\n for (let index = startDay - 1; index >= 0; index -= 1) {\n days.push(createDay(new Date(year, month - 1, daysInPrevMonth - index), true, today));\n }\n for (let day = 1; day <= daysInMonth; day += 1) {\n days.push(createDay(new Date(year, month, day), false, today));\n }\n for (let day = 1; days.length < 42; day += 1) {\n days.push(createDay(new Date(year, month + 1, day), true, today));\n }\n\n return days;\n};\n\nconst createDay = (date, otherMonth, today) => ({\n date: formatByPattern(date, 'YYYY-MM-DD'),\n day: date.getDate(),\n year: date.getFullYear(),\n month: date.getMonth(),\n otherMonth,\n isToday: isSameDate(date, today)\n});\n\nconst padTime = (value) => String(value).padStart(2, '0');\n\nconst formatByPattern = (date, pattern) => {\n if (!(date instanceof Date) || Number.isNaN(date.getTime())) return '';\n const replacements = {\n YYYY: date.getFullYear(),\n MM: padTime(date.getMonth() + 1),\n DD: padTime(date.getDate()),\n HH: padTime(date.getHours()),\n mm: padTime(date.getMinutes()),\n ss: padTime(date.getSeconds())\n };\n return Object.keys(replacements).reduce((result, token) => {\n return result.replace(new RegExp(token, 'g'), replacements[token]);\n }, pattern);\n};\n\nconst formatDatePart = (date) => date ? formatByPattern(date, 'YYYY-MM-DD') : '';\nconst formatTimePart = (date) => date ? formatByPattern(date, props.showSeconds ? 'HH:mm:ss' : 'HH:mm') : '';\n\nconst parseValue = (value) => {\n if (!value && value !== 0) return null;\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : new Date(value.getTime());\n if (typeof value === 'number') {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n if (typeof value !== 'string') return null;\n\n const normalized = value.trim().replace(/\\//g, '-');\n const match = normalized.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[ T](\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?)?/);\n if (!match) {\n const fallback = new Date(value);\n return Number.isNaN(fallback.getTime()) ? null : fallback;\n }\n\n const [, year, month, day, hour = '0', minute = '0', second = '0'] = match;\n const date = new Date(Number(year), Number(month) - 1, Number(day), Number(hour), Number(minute), Number(second));\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\nconst parseRangeValue = (value) => {\n if (Array.isArray(value)) return value.map(parseValue).filter(Boolean).slice(0, 2);\n if (typeof value === 'string' && value.includes(props.separator)) {\n return value.split(props.separator).map(item => parseValue(item.trim())).filter(Boolean).slice(0, 2);\n }\n return [];\n};\n\nconst toModelValue = (date) => {\n if (!date) return null;\n if (props.valueFormat === 'timestamp') return date.getTime();\n if (props.valueFormat === 'Date') return new Date(date.getTime());\n return formatByPattern(date, props.valueFormat);\n};\n\nconst toModelRange = (range) => range.map(date => toModelValue(date));\n\nconst isSameDate = (left, right) => {\n return left.getFullYear() === right.getFullYear()\n && left.getMonth() === right.getMonth()\n && left.getDate() === right.getDate();\n};\n\nconst buildTempDateTime = (hour = selectedHour.value, minute = selectedMinute.value, second = selectedSecond.value) => {\n if (!tempDate.value) return null;\n return new Date(tempDate.value.getFullYear(), tempDate.value.getMonth(), tempDate.value.getDate(), hour, minute, props.showSeconds ? second : 0);\n};\n\nconst isDateTimeDisabled = (date) => {\n if (!date) return true;\n if (minDateTime.value && date < minDateTime.value) return true;\n if (maxDateTime.value && date > maxDateTime.value) return true;\n if (props.disableFuture && date > new Date()) return true;\n return false;\n};\n\nconst isYearDisabled = (year) => {\n const start = new Date(year, 0, 1, 0, 0, 0);\n const end = new Date(year, 11, 31, 23, 59, 59);\n if (minDateTime.value && end < minDateTime.value) return true;\n if (maxDateTime.value && start > maxDateTime.value) return true;\n if (props.disableFuture && start > new Date()) return true;\n return false;\n};\n\nconst isMonthDisabled = (month) => {\n const start = new Date(currentYear.value, month, 1, 0, 0, 0);\n const end = new Date(currentYear.value, month + 1, 0, 23, 59, 59);\n if (minDateTime.value && end < minDateTime.value) return true;\n if (maxDateTime.value && start > maxDateTime.value) return true;\n if (props.disableFuture && start > new Date()) return true;\n return false;\n};\n\nconst isDayDisabled = (day) => {\n const start = new Date(day.year, day.month, day.day, 0, 0, 0);\n const end = new Date(day.year, day.month, day.day, 23, 59, 59);\n if (minDateTime.value && end < minDateTime.value) return true;\n if (maxDateTime.value && start > maxDateTime.value) return true;\n if (props.disableFuture && start > new Date()) return true;\n return false;\n};\n\nconst isTimePartDisabled = (hour, minute, second) => {\n if (!tempDate.value) return false;\n return isDateTimeDisabled(buildTempDateTime(hour, minute, second));\n};\n\nconst isDaySelected = (day) => {\n if (!tempDate.value) return false;\n return tempDate.value.getFullYear() === day.year\n && tempDate.value.getMonth() === day.month\n && tempDate.value.getDate() === day.day;\n};\n\nconst isRangeDaySelected = (day, side) => {\n const date = tempRange.value[side === 'start' ? 0 : 1];\n return !!date && date.getFullYear() === day.year && date.getMonth() === day.month && date.getDate() === day.day;\n};\n\nconst isRangeDayInRange = (day) => {\n const [start, end] = tempRange.value;\n if (!start || !end) return false;\n const date = new Date(day.year, day.month, day.day, 12, 0, 0);\n return date > start && date < end;\n};\n\nconst rangeDayClass = (day) => ['day-item', {\n 'other-month': day.otherMonth,\n today: day.isToday,\n disabled: isDayDisabled(day),\n selected: isRangeDaySelected(day, 'start') || isRangeDaySelected(day, 'end'),\n 'range-start': isRangeDaySelected(day, 'start'),\n 'range-end': isRangeDaySelected(day, 'end'),\n 'in-range': isRangeDayInRange(day)\n}];\n\nconst setSinglePanelFromDate = (date) => {\n if (!date) return;\n currentYear.value = date.getFullYear();\n currentMonth.value = date.getMonth();\n tempDate.value = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n selectedHour.value = date.getHours();\n selectedMinute.value = date.getMinutes();\n selectedSecond.value = date.getSeconds();\n};\n\nconst setRangePanelsFromDate = (date) => {\n const base = date || new Date();\n leftYear.value = base.getFullYear();\n leftMonth.value = base.getMonth();\n const right = new Date(base.getFullYear(), base.getMonth() + 1, 1);\n rightYear.value = right.getFullYear();\n rightMonth.value = right.getMonth();\n};\n\nconst initializePicker = () => {\n if (isRange.value) {\n tempRange.value = selectedRange.value.length ? selectedRange.value.map(date => new Date(date.getTime())) : [null, null];\n setRangePanelsFromDate(tempRange.value[0] || new Date());\n activeRangeSide.value = tempRange.value[0] && !tempRange.value[1] ? 'end' : 'start';\n activeTimeSide.value = null;\n return;\n }\n setSinglePanelFromDate(selectedDateTime.value || new Date());\n viewMode.value = 'day';\n activeSingleTime.value = false;\n};\n\nconst prevPeriod = () => {\n if (viewMode.value === 'year') currentYear.value -= 12;\n else if (viewMode.value === 'month') currentYear.value -= 1;\n else if (currentMonth.value === 0) {\n currentMonth.value = 11;\n currentYear.value -= 1;\n } else currentMonth.value -= 1;\n};\n\nconst nextPeriod = () => {\n if (viewMode.value === 'year') currentYear.value += 12;\n else if (viewMode.value === 'month') currentYear.value += 1;\n else if (currentMonth.value === 11) {\n currentMonth.value = 0;\n currentYear.value += 1;\n } else currentMonth.value += 1;\n};\n\nconst prevLeftMonth = () => {\n const left = new Date(leftYear.value, leftMonth.value - 1, 1);\n leftYear.value = left.getFullYear();\n leftMonth.value = left.getMonth();\n const right = new Date(leftYear.value, leftMonth.value + 1, 1);\n rightYear.value = right.getFullYear();\n rightMonth.value = right.getMonth();\n};\n\nconst nextRightMonth = () => {\n const right = new Date(rightYear.value, rightMonth.value + 1, 1);\n rightYear.value = right.getFullYear();\n rightMonth.value = right.getMonth();\n const left = new Date(rightYear.value, rightMonth.value - 1, 1);\n leftYear.value = left.getFullYear();\n leftMonth.value = left.getMonth();\n};\n\nconst changeViewMode = (mode) => {\n viewMode.value = mode;\n};\n\nconst selectYear = (year) => {\n if (isYearDisabled(year)) return;\n currentYear.value = year;\n viewMode.value = 'month';\n};\n\nconst selectMonth = (month) => {\n if (isMonthDisabled(month)) return;\n currentMonth.value = month;\n viewMode.value = 'day';\n};\n\nconst selectDay = (day) => {\n if (isDayDisabled(day)) return;\n tempDate.value = new Date(day.year, day.month, day.day);\n};\n\nconst selectRangeDay = (day) => {\n if (isDayDisabled(day)) return;\n const selected = new Date(day.year, day.month, day.day);\n if (activeRangeSide.value === 'start' || !tempRange.value[0] || (tempRange.value[0] && tempRange.value[1])) {\n const currentStart = tempRange.value[0];\n selected.setHours(currentStart?.getHours() ?? 0, currentStart?.getMinutes() ?? 0, props.showSeconds ? currentStart?.getSeconds() ?? 0 : 0, 0);\n tempRange.value = [selected, null];\n activeRangeSide.value = 'end';\n } else {\n const currentEnd = tempRange.value[1];\n selected.setHours(currentEnd?.getHours() ?? 23, currentEnd?.getMinutes() ?? 59, props.showSeconds ? currentEnd?.getSeconds() ?? 59 : 0, 0);\n const start = tempRange.value[0];\n tempRange.value = start <= selected ? [start, selected] : [selected, start];\n activeRangeSide.value = 'start';\n }\n};\n\nconst selectHour = (hour) => {\n if (isTimePartDisabled(hour, selectedMinute.value, selectedSecond.value)) return;\n selectedHour.value = hour;\n};\n\nconst selectMinute = (minute) => {\n if (isTimePartDisabled(selectedHour.value, minute, selectedSecond.value)) return;\n selectedMinute.value = minute;\n};\n\nconst selectSecond = (second) => {\n if (isTimePartDisabled(selectedHour.value, selectedMinute.value, second)) return;\n selectedSecond.value = second;\n};\n\nconst openRangeTime = (side) => {\n activeTimeSide.value = side;\n activeRangeSide.value = side;\n const index = side === 'start' ? 0 : 1;\n if (!tempRange.value[index]) {\n const base = new Date();\n base.setHours(side === 'start' ? 0 : 23, side === 'start' ? 0 : 59, props.showSeconds ? side === 'start' ? 0 : 59 : 0, 0);\n tempRange.value[index] = base;\n }\n};\n\nconst selectRangeTime = (part, value) => {\n const index = activeTimeSide.value === 'end' ? 1 : 0;\n const fallback = new Date();\n const date = tempRange.value[index] ? new Date(tempRange.value[index].getTime()) : fallback;\n if (part === 'hour') date.setHours(value);\n if (part === 'minute') date.setMinutes(value);\n if (part === 'second') date.setSeconds(value);\n if (!props.showSeconds) date.setSeconds(0);\n date.setMilliseconds(0);\n tempRange.value[index] = date;\n};\n\nconst closePicker = () => {\n showPicker.value = false;\n activeSingleTime.value = false;\n};\n\nconst clearTempRange = () => {\n tempRange.value = [null, null];\n activeRangeSide.value = 'start';\n activeTimeSide.value = null;\n};\n\nconst clearValue = () => {\n if (isRange.value) {\n selectedRange.value = [];\n tempRange.value = [null, null];\n emit('update:modelValue', []);\n emit('change', []);\n } else {\n selectedDateTime.value = null;\n tempDate.value = null;\n emit('update:modelValue', null);\n emit('change', null);\n }\n};\n\nconst confirm = () => {\n if (!canConfirm.value) return;\n if (isRange.value) {\n selectedRange.value = tempRange.value.map(date => new Date(date.getTime()));\n const modelValue = toModelRange(selectedRange.value);\n emit('update:modelValue', modelValue);\n emit('change', modelValue);\n closePicker();\n return;\n }\n const nextValue = buildTempDateTime();\n selectedDateTime.value = nextValue;\n const modelValue = toModelValue(nextValue);\n emit('update:modelValue', modelValue);\n emit('change', modelValue);\n closePicker();\n};\n\nconst handleCancel = () => {\n if (props.onCancel) {\n props.onCancel();\n } else {\n emit('cancel');\n closePicker();\n }\n};\n\nconst handleConfirm = () => {\n const value = isRange.value ? toModelRange(tempRange.value) : toModelValue(buildTempDateTime());\n if (props.onConfirm) {\n props.onConfirm(value);\n } else {\n emit('confirm', value);\n confirm();\n }\n};\n\nconst handleNow = () => {\n const now = new Date();\n if (isDateTimeDisabled(now)) return;\n setSinglePanelFromDate(now);\n};\n\nwatch(showPicker, (isOpen) => {\n if (isOpen) initializePicker();\n});\n\nwatch(() => props.modelValue, (newValue) => {\n if (isRange.value) {\n selectedRange.value = parseRangeValue(newValue);\n } else {\n selectedDateTime.value = parseValue(newValue);\n }\n}, { immediate: true });\n</script>\n\n<style scoped>\n.vtk-date-time-picker {\n position: relative;\n width: 100%;\n}\n\n.date-time-input {\n width: 100%;\n}\n\n.date-time-input-field {\n cursor: pointer;\n}\n\n:deep(.date-time-input-field .v-field),\n:deep(.date-time-input-field input) {\n cursor: pointer;\n}\n\n.date-time-icon {\n margin-left: 8px;\n color: rgb(var(--v-theme-on-surface), 0.6);\n}\n\n.date-time-picker-dropdown {\n background: rgb(var(--v-theme-surface));\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n overflow: visible;\n}\n\n.date-time-picker-dropdown.range-mode {\n width: 646px;\n min-width: 646px;\n max-width: 646px;\n}\n\n.date-time-picker-dropdown:not(.range-mode) {\n width: 360px;\n min-width: 360px;\n max-width: none;\n}\n\n.date-time-picker-dropdown.inline-mode {\n box-shadow: none;\n width: fit-content;\n border: none;\n}\n\n.picker-shell,\n.range-calendar-shell {\n display: flex;\n align-items: stretch;\n flex-wrap: nowrap;\n}\n\n.date-panel {\n width: 288px;\n border-right: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.calendar-panel {\n flex: 0 0 322px;\n width: 322px;\n min-width: 322px;\n max-width: 322px;\n padding: 12px 16px 16px;\n box-sizing: border-box;\n}\n\n.calendar-divider {\n flex: 0 0 1px;\n width: 1px;\n background: rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.picker-header,\n.calendar-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.picker-header {\n padding: 12px 16px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.picker-header.single-header {\n border-bottom: none;\n padding: 14px 16px 8px;\n}\n\n.calendar-header {\n height: 36px;\n margin-bottom: 8px;\n}\n\n.header-title,\n.month-title {\n font-size: 16px;\n font-weight: 500;\n color: rgb(var(--v-theme-on-surface));\n}\n\n.clickable {\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background 0.2s;\n}\n\n.clickable:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.nav-btn,\n.nav-btn-small {\n border: none;\n background: none;\n color: rgb(var(--v-theme-on-surface), 0.6);\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.2s;\n}\n\n.nav-btn {\n font-size: 20px;\n padding: 4px 12px;\n}\n\n.nav-btn-small {\n font-size: 18px;\n padding: 4px 8px;\n}\n\n.nav-btn:hover,\n.nav-btn-small:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.nav-btn-small.invisible {\n visibility: hidden;\n}\n\n.picker-body {\n padding: 10px 16px 16px;\n min-height: 250px;\n}\n\n.year-grid,\n.month-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n\n.year-item,\n.month-item {\n height: 42px;\n border: 1px solid transparent;\n background: transparent;\n text-align: center;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s;\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n}\n\n.year-item:hover,\n.month-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.year-item.selected,\n.month-item.selected {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.week-header {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 2px;\n margin-bottom: 6px;\n}\n\n.week-day {\n text-align: center;\n padding: 6px 0;\n font-size: 12px;\n color: rgb(var(--v-theme-on-surface), 0.6);\n font-weight: 500;\n}\n\n.day-grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 2px;\n}\n\n.day-item {\n aspect-ratio: 1;\n border: 1px solid transparent;\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 13px;\n color: rgb(var(--v-theme-on-surface));\n}\n\n.day-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.day-item.other-month {\n color: rgb(var(--v-theme-on-surface), 0.38);\n}\n\n.day-item.today {\n color: rgb(var(--v-theme-primary));\n font-weight: 600;\n}\n\n.day-item.selected,\n.day-item.range-start,\n.day-item.range-end {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.day-item.in-range {\n background: rgb(var(--v-theme-primary), 0.1);\n}\n\n.year-item.disabled,\n.month-item.disabled,\n.day-item.disabled,\n.time-item.disabled {\n color: rgb(var(--v-theme-on-surface), 0.26) !important;\n background: rgb(var(--v-theme-on-surface), 0.04) !important;\n cursor: not-allowed !important;\n pointer-events: none;\n opacity: 0.5;\n}\n\n.time-panel {\n width: 156px;\n}\n\n.time-header {\n height: 49px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n font-weight: 500;\n color: rgb(var(--v-theme-on-surface));\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.time-columns {\n display: flex;\n height: 250px;\n}\n\n.time-columns.compact {\n height: 192px;\n}\n\n.time-column {\n flex: 1;\n overflow-y: auto;\n padding: 6px 0;\n border-right: 1px solid rgb(var(--v-theme-on-surface), 0.08);\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.time-column::-webkit-scrollbar {\n width: 0;\n height: 0;\n}\n\n.time-column:last-child {\n border-right: none;\n}\n\n.time-item {\n width: 100%;\n height: 28px;\n border: none;\n background: transparent;\n color: rgb(var(--v-theme-on-surface));\n cursor: pointer;\n font-size: 13px;\n transition: all 0.2s;\n}\n\n.time-item:hover {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.time-item.selected {\n color: rgb(var(--v-theme-primary));\n font-weight: 600;\n background: rgb(var(--v-theme-primary), 0.1);\n}\n\n.range-input-row {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: nowrap;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n box-sizing: border-box;\n}\n\n.single-input-row {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 9px 12px;\n border-bottom: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n box-sizing: border-box;\n}\n\n.single-date-input,\n.single-time-input {\n flex: 0 0 auto;\n width: 150px;\n height: 32px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.16);\n border-radius: 4px;\n background: rgb(var(--v-theme-surface));\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n padding: 0 12px;\n outline: none;\n}\n\n.single-time-input {\n text-align: left;\n cursor: pointer;\n}\n\n.single-time-input.active,\n.single-time-input:focus,\n.single-date-input:focus {\n border-color: rgb(var(--v-theme-primary));\n}\n\n.single-calendar-panel {\n width: 360px;\n}\n\n.range-date-input,\n.range-time-input {\n flex: 0 0 auto;\n height: 32px;\n border: 1px solid rgb(var(--v-theme-on-surface), 0.16);\n border-radius: 4px;\n background: rgb(var(--v-theme-surface));\n color: rgb(var(--v-theme-on-surface));\n font-size: 13px;\n padding: 0 12px;\n outline: none;\n}\n\n.range-date-input {\n width: 144px;\n}\n\n.range-time-input {\n width: 132px;\n text-align: left;\n cursor: pointer;\n}\n\n.range-time-input.active,\n.range-time-input:focus,\n.range-date-input:focus {\n border-color: rgb(var(--v-theme-primary));\n}\n\n.range-arrow {\n flex: 0 0 16px;\n width: 16px;\n text-align: center;\n color: rgb(var(--v-theme-on-surface), 0.6);\n font-size: 22px;\n}\n\n.range-time-popover {\n position: absolute;\n top: 45px;\n width: 180px;\n z-index: 2;\n background: rgb(var(--v-theme-surface));\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n}\n\n.single-time-popover {\n position: absolute;\n top: 45px;\n left: 156px;\n width: 180px;\n z-index: 2;\n background: rgb(var(--v-theme-surface));\n border: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n}\n\n.range-time-popover.start {\n left: 162px;\n}\n\n.range-time-popover.end {\n left: 430px;\n}\n\n.time-popover-footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 10px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.selected-display {\n padding: 10px 16px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n text-align: center;\n}\n\n.selected-text {\n font-size: 14px;\n color: rgb(var(--v-theme-on-surface));\n}\n\n.placeholder-text,\n.inline-message {\n font-size: 14px;\n color: rgb(var(--v-theme-on-surface), 0.38);\n}\n\n.inline-message {\n padding: 16px;\n}\n\n.picker-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border-top: 1px solid rgb(var(--v-theme-on-surface), 0.12);\n}\n\n.footer-spacer {\n flex: 1;\n}\n\n.btn {\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n outline: none;\n}\n\n.btn.small {\n padding: 4px 8px;\n font-size: 12px;\n}\n\n.btn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.btn-text {\n background: none;\n color: rgb(var(--v-theme-primary));\n}\n\n.btn-text:hover:not(:disabled) {\n background: rgb(var(--v-theme-on-surface), 0.08);\n}\n\n.btn-primary {\n background: rgb(var(--v-theme-primary));\n color: rgb(var(--v-theme-on-primary));\n}\n\n.btn-primary:hover:not(:disabled) {\n opacity: 0.9;\n}\n</style>\n","<script setup>\r\nimport { ref, computed, reactive, onMounted, getCurrentInstance, watch, nextTick } from \"vue\";\r\nconst { proxy } = getCurrentInstance();\r\n// 获取配置的键名,如果没有配置则使用默认值\r\nconst userKey = window.VTK_CONFIG?.storageKeys?.user || '_mis_acis_users';\r\nconst user = JSON.parse(proxy.$vtk.storage.get(userKey));\r\n\r\nconsole.log('window.VTK_CONFIG=', window.VTK_CONFIG)\r\nconsole.log('window.VTK_CONFIG?.storageKeys?.user', window.VTK_CONFIG?.storageKeys?.user)\r\nconsole.log('user', user)\r\nconst pause = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\r\n\r\n// 定义 props - 控制是否支持多选\r\nconst props = defineProps({\r\n multiple: {\r\n type: Boolean,\r\n default: false // 默认单选\r\n }\r\n});\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['selected']);\r\n\r\n// 定义响应式数据\r\nconst dialog = ref(false);\r\n\r\n\r\n// 地区列表\r\nconst areaData = ref([]);\r\nconst areaSelectedData = ref([]);\r\nconst areaActivatedData = ref([]);\r\n\r\nwatch(areaActivatedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.areaCode) {\r\n getDeptList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\nwatch(areaSelectedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.areaCode) {\r\n getDeptList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\n// 获取地区列表\r\nconst getAreaList = () => {\r\n if (user && user.areacode) {\r\n proxy.$vtk.request.getForm(`/dict/area/show/${user.areacode}`).then((res) => {\r\n console.log('res=', res);\r\n if (res && res.data) {\r\n areaData.value = [{\r\n areaCode: res.data.areaCode,\r\n areaName: res.data.areaName,\r\n children: []\r\n }];\r\n }\r\n });\r\n }\r\n};\r\n\r\n// 获取下级地区列表\r\nconst getAreaNextList = async (item) => {\r\n await pause(300);\r\n const parentCode = item.areaCode;\r\n proxy.$vtk.request.getForm(`/dict/area/next/${parentCode}`).then((res) => {\r\n if (res && res.data) {\r\n res.data.forEach((it) => {\r\n it.areaLeve < 12 && (it.children = []);\r\n item.children.push(it);\r\n });\r\n }\r\n });\r\n};\r\n\r\n// 部门列表\r\nconst deptData = ref([]);\r\nconst deptSelectedData = ref([]);\r\nconst deptActivatedData = ref([]);\r\n\r\nwatch(deptSelectedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.id) {\r\n getPersonList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\nwatch(deptActivatedData, (newVal, oldVal) => {\r\n // 检查数组非空且有有效数据\r\n if (newVal && newVal.length > 0 && newVal[0]?.id) {\r\n getPersonList(newVal);\r\n }\r\n}, { deep: true });\r\n\r\n// 点击叶子节点时调用的方法\r\nconst getDeptList = (node) => {\r\n const selectAreaCode = node[0].areaCode;\r\n const params = { codex: { area: selectAreaCode, type: \"0\" } };\r\n deptData.value = [];\r\n proxy.$vtk.request.postJson('/bizp/supported/dept/list', params).then((res) => {\r\n res.data.forEach((it) => {\r\n it.children = [];\r\n deptData.value.push(it);\r\n });\r\n });\r\n};\r\n\r\nconst getDepNextList = async (item) => {\r\n await pause(300);\r\n const selectAreaCode = item.areaCode;\r\n const selectPid = item.id;\r\n const params = { codex: { area: selectAreaCode, pid: selectPid } };\r\n proxy.$vtk.request.postJson('/bizp/supported/dept/list', params).then((res) => {\r\n if (res && res.data) {\r\n res.data.forEach((it) => {\r\n it.children = [];\r\n item.children.push(it);\r\n });\r\n }\r\n });\r\n};\r\n\r\n// 人员列表\r\nconst personData = ref([]);\r\nconst selectedPersonData = ref([]);\r\n// 全局已选人员列表(跨部门保存,用于去重和持久化选中状态)\r\nconst allSelectedPersons = ref([]);\r\n// 标记是否正在恢复选中状态(避免触发 watch 循环)\r\nconst isRestoringSelection = ref(false);\r\n\r\n// 已选中的人员列表(用于右侧显示)- 去重后的列表\r\nconst selectedPersonList = computed(() => {\r\n // 使用 Map 去重,key 为人员 id\r\n const uniqueMap = new Map();\r\n allSelectedPersons.value.forEach(person => {\r\n if (person && person.id) {\r\n uniqueMap.set(person.id, person);\r\n }\r\n });\r\n\r\n return Array.from(uniqueMap.values());\r\n});\r\n\r\n// 监听当前部门选中人员的变化\r\nwatch(selectedPersonData, (newVal, oldVal) => {\r\n // 如果正在恢复选中状态,不处理\r\n if (isRestoringSelection.value) {\r\n return;\r\n }\r\n\r\n // 单选模式:直接替换全局列表\r\n if (!props.multiple) {\r\n if (newVal && newVal.length > 0) {\r\n // 单选模式下只保留最新选中的一个\r\n allSelectedPersons.value = [newVal[0]];\r\n } else {\r\n // 取消选中时清空\r\n allSelectedPersons.value = [];\r\n }\r\n return;\r\n }\r\n\r\n // 多选模式:累加到全局列表\r\n // 处理新选中的人员\r\n if (newVal && newVal.length > 0) {\r\n newVal.forEach(person => {\r\n const exists = allSelectedPersons.value.some(p => p.id === person.id);\r\n if (!exists) {\r\n allSelectedPersons.value.push(person);\r\n }\r\n });\r\n }\r\n\r\n // 处理取消选中的人员\r\n if (oldVal && oldVal.length > 0) {\r\n oldVal.forEach(oldPerson => {\r\n const stillSelected = newVal?.some(p => p.id === oldPerson.id);\r\n if (!stillSelected) {\r\n // 从全局列表中移除\r\n const index = allSelectedPersons.value.findIndex(p => p.id === oldPerson.id);\r\n if (index > -1) {\r\n allSelectedPersons.value.splice(index, 1);\r\n }\r\n }\r\n });\r\n }\r\n}, { deep: true });\r\n\r\n// 监听部门切换,同步选中状态\r\nwatch(personData, async (newPersonData) => {\r\n if (!newPersonData || newPersonData.length === 0) {\r\n isRestoringSelection.value = true;\r\n selectedPersonData.value = [];\r\n await nextTick();\r\n isRestoringSelection.value = false;\r\n return;\r\n }\r\n\r\n // 等待 DOM 更新\r\n await nextTick();\r\n\r\n // 标记正在恢复选中状态\r\n isRestoringSelection.value = true;\r\n\r\n // 当人员列表更新时,恢复之前选中的状态\r\n const currentSelected = [];\r\n newPersonData.forEach(person => {\r\n const isSelected = allSelectedPersons.value.some(p => p.id === person.id);\r\n if (isSelected) {\r\n currentSelected.push(person);\r\n }\r\n });\r\n\r\n selectedPersonData.value = currentSelected;\r\n\r\n // 等待状态更新完成\r\n await nextTick();\r\n isRestoringSelection.value = false;\r\n}, { deep: true });\r\n\r\n// 移除已选中的人员\r\nconst removeSelectedPerson = (personId) => {\r\n // 从全局列表中移除\r\n const globalIndex = allSelectedPersons.value.findIndex(person => person.id === personId);\r\n if (globalIndex > -1) {\r\n allSelectedPersons.value.splice(globalIndex, 1);\r\n }\r\n\r\n // 从当前显示的选中列表中移除\r\n const currentIndex = selectedPersonData.value.findIndex(person => person.id === personId);\r\n if (currentIndex > -1) {\r\n selectedPersonData.value.splice(currentIndex, 1);\r\n }\r\n};\r\n\r\n\r\n// 点击叶子节点时调用的方法\r\n// \r\nconst getPersonList = (node) => {\r\n const selectAreaID = node[0].id;\r\n const params = { codex: { dept: selectAreaID } };\r\n\r\n proxy.$vtk.request.postJson('/bizp/supported/user/list', params).then((res) => {\r\n if (res && res.meta.success && res.data.length > 0) {\r\n personData.value = res.data\r\n } else {\r\n personData.value = null\r\n }\r\n });\r\n};\r\nconst add = () => {\r\n dialog.value = true;\r\n};\r\n\r\nconst close = () => {\r\n // 先设置标记,避免触发 watch\r\n isRestoringSelection.value = true;\r\n\r\n // 关闭对话框\r\n dialog.value = false;\r\n\r\n // 清空选中状态\r\n selectedPersonData.value = [];\r\n allSelectedPersons.value = [];\r\n areaSelectedData.value = [];\r\n areaActivatedData.value = [];\r\n deptSelectedData.value = [];\r\n deptActivatedData.value = [];\r\n personData.value = [];\r\n deptData.value = [];\r\n\r\n // 重置标记\r\n nextTick(() => {\r\n isRestoringSelection.value = false;\r\n });\r\n};\r\n\r\n// 确认选择\r\nconst confirm = () => {\r\n // 返回选中的人员列表给父组件\r\n const selectedPersons = selectedPersonList.value;\r\n // 通过 emit 将选中的人员传递给父组件\r\n emit('selected', selectedPersons);\r\n close();\r\n};\r\n\r\nonMounted(() => {\r\n // 获取地区列表\r\n getAreaList();\r\n});\r\n\r\n// 使组件方法可以被父组件调用\r\ndefineExpose({\r\n close,\r\n add,\r\n});\r\n</script>\r\n\r\n<template>\r\n <v-dialog v-model=\"dialog\" persistent width=\"1000\">\r\n <v-card>\r\n <v-card-title class=\"d-flex align-center\">\r\n <span class=\"text-h6\">人员选择</span>\r\n <v-spacer></v-spacer>\r\n <v-btn class=\"g-no-shadow\" icon @click=\"close\" size=\"small\">\r\n <v-icon>mdi-close</v-icon>\r\n </v-btn>\r\n </v-card-title>\r\n <v-divider />\r\n <v-card-text class=\"pb-0 mb-0 pl-0 pr-0\" style=\"height: 600px;\">\r\n <v-row style=\"margin-top:-16px; height: 100%;\">\r\n <v-col md=\"3\" class=\"pr-0 \" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">地区</span>\r\n </v-card-title>\r\n <v-sheet height=\"500\" style=\"overflow: auto\" class=\"mt-2 pl-2\">\r\n <v-treeview item-value=\"id\" item-title=\"areaName\" return-object :items=\"areaData\" density=\"compact\"\r\n color=\"primary\" item-props activatable v-model:selected=\"areaSelectedData\"\r\n v-model:activated=\"areaActivatedData\" :load-children=\"getAreaNextList\">\r\n <template v-slot:title=\"{ item }\">\r\n <span :title=\"item.areaName\">{{ item.areaName }}</span>\r\n </template>\r\n </v-treeview>\r\n </v-sheet>\r\n </v-col>\r\n <v-col md=\"3\" class=\"pr-0 pl-0\" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">部门</span>\r\n </v-card-title>\r\n <v-sheet height=\"500\" style=\"overflow: auto\" class=\"mt-2 pl-2\">\r\n <v-treeview v-if=\"deptData && deptData.length > 0\" item-value=\"id\" item-title=\"name\" return-object :items=\"deptData\" density=\"compact\"\r\n color=\"primary\" item-props activatable v-model:selected=\"deptSelectedData\"\r\n v-model:activated=\"deptActivatedData\" :load-children=\"getDepNextList\">\r\n <template v-slot:title=\"{ item }\">\r\n <span :title=\"item.name\">{{ item.name }}</span>\r\n </template>\r\n </v-treeview>\r\n <div v-else class=\"text-center pt-4 d-flex flex-column align-center justify-center\">\r\n <v-icon size=\"64\" color=\"grey-lighten-2\" class=\"mb-4\">\r\n mdi-office-building-outline\r\n </v-icon>\r\n <div class=\"text-grey\">暂无</div>\r\n </div>\r\n </v-sheet>\r\n </v-col>\r\n <v-col md=\"3\" class=\"pr-0 pl-0\" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">人员</span>\r\n </v-card-title>\r\n <v-sheet height=\"550\" style=\"overflow: auto;\" class=\"mt-2\">\r\n <v-treeview v-if=\"personData && personData.length > 0\"\r\n item-value=\"id\"\r\n item-title=\"username\"\r\n return-object\r\n :items=\"personData\"\r\n density=\"compact\"\r\n color=\"primary\"\r\n item-props\r\n selectable\r\n :select-strategy=\"multiple ? 'leaf' : 'single-leaf'\"\r\n v-model:selected=\"selectedPersonData\">\r\n <template v-slot:title=\"{ item }\">\r\n <div class=\"d-flex align-center\" :title=\"item.username\">\r\n <v-avatar size=\"24\" class=\"mr-2\">\r\n <v-img v-if=\"item.avatar\" :src=\"item.avatar\"></v-img>\r\n <v-icon v-else size=\"20\">mdi-account-circle</v-icon>\r\n </v-avatar>\r\n <span>{{ item.username }}</span>\r\n </div>\r\n </template>\r\n </v-treeview>\r\n <div v-else class=\"text-center pt-4 d-flex flex-column align-center justify-center\">\r\n <v-icon size=\"64\" color=\"grey-lighten-2\" class=\"mb-4\">\r\n mdi-account-group\r\n </v-icon>\r\n <div class=\"text-grey\">暂无</div>\r\n </div>\r\n </v-sheet>\r\n </v-col>\r\n <v-col md=\"3\" class=\"pr-0 pl-0\" style=\"border-right: 1px #ccc solid;height: 600px;\">\r\n <v-card-title class=\"text-center py-0 text-body-1 font-weight-bold \">\r\n <span class=\"mx-auto\">已选中人员 ({{ selectedPersonList.length }})</span>\r\n </v-card-title>\r\n <v-sheet height=\"550\" style=\"overflow: auto\" class=\"mt-2 px-2\">\r\n <v-list v-if=\"selectedPersonList.length > 0\" density=\"compact\">\r\n <v-list-item\r\n v-for=\"person in selectedPersonList\"\r\n :key=\"person.id\"\r\n :title=\"person.username\"\r\n class=\"px-2 mb-1 mr-2\"\r\n rounded=\"lg\"\r\n color=\"primary\"\r\n variant=\"tonal\">\r\n <template v-slot:prepend>\r\n <v-avatar size=\"32\">\r\n <v-img v-if=\"person.avatar\" :src=\"person.avatar\"></v-img>\r\n <v-icon v-else>mdi-account-circle</v-icon>\r\n </v-avatar>\r\n </template>\r\n <template v-slot:append>\r\n <v-btn\r\n icon\r\n size=\"x-small\"\r\n variant=\"text\"\r\n @click=\"removeSelectedPerson(person.id)\">\r\n <v-icon size=\"16\">mdi-close</v-icon>\r\n </v-btn>\r\n </template>\r\n </v-list-item>\r\n </v-list>\r\n <div v-else class=\"text-center pt-4 d-flex flex-column align-center justify-center\">\r\n <v-icon size=\"64\" color=\"grey-lighten-2\" class=\"mb-4\">\r\n mdi-account\r\n </v-icon>\r\n <div class=\"text-grey\">暂无选中</div>\r\n </div>\r\n </v-sheet>\r\n </v-col>\r\n </v-row>\r\n </v-card-text>\r\n <v-divider />\r\n <v-card-actions>\r\n <v-spacer></v-spacer>\r\n <v-btn color=\"darken-1\" text @click=\"close\">取消</v-btn>\r\n <v-btn color=\"blue darken-1\" text @click=\"confirm\">确定</v-btn>\r\n </v-card-actions>\r\n </v-card>\r\n </v-dialog>\r\n</template>\r\n\r\n<style scoped>\r\n:deep() .v-sheet[style*=\"overflow: auto\"] {\r\n &::-webkit-scrollbar {\r\n width: 5px;\r\n }\r\n\r\n &::-webkit-scrollbar-thumb {\r\n background: #ccc;\r\n border-radius: 4px;\r\n }\r\n}\r\n</style>","<!-- 空页面 -->\r\n<template>\r\n <v-empty-state\r\n :headline=\"headline\"\r\n :title=\"title\"\r\n :text=\"text\"\r\n :image=\"image\"\r\n :icon=\"icon\"\r\n :rounded=\"rounded\"\r\n :elevation=\"elevation\"\r\n >\r\n <!-- 图像插槽 -->\r\n <template v-if=\"$slots.media\" #media>\r\n <slot name=\"media\"></slot>\r\n </template>\r\n\r\n <!-- 标题插槽 -->\r\n <template v-if=\"$slots.title\" #title>\r\n <slot name=\"title\"></slot>\r\n </template>\r\n\r\n <!-- 文本插槽 -->\r\n <template v-if=\"$slots.text\" #text>\r\n <slot name=\"text\"></slot>\r\n </template>\r\n\r\n <!-- 操作按钮插槽 -->\r\n <template v-if=\"$slots.actions\" #actions>\r\n <slot name=\"actions\"></slot>\r\n </template>\r\n\r\n <!-- 底部插槽 -->\r\n <template v-if=\"$slots.bottom\" #bottom>\r\n <slot name=\"bottom\"></slot>\r\n </template>\r\n </v-empty-state>\r\n</template>\r\n\r\n<script setup>\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkEmpty\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 标题\r\n title: {\r\n type: String,\r\n default: ''\r\n },\r\n // 副标题/文本\r\n text: {\r\n type: String,\r\n default: ''\r\n },\r\n // 头部文本(更大字体)\r\n headline: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图标\r\n icon: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图像\r\n image: {\r\n type: String,\r\n default: ''\r\n },\r\n // 圆角\r\n rounded: {\r\n type: [Boolean, String, Number],\r\n default: 'circle'\r\n },\r\n // 阴影\r\n elevation: {\r\n type: [Number, String],\r\n default: 0\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n/* 可以添加自定义样式 */\r\n:deep(.v-empty-state) {\r\n padding: 24px;\r\n}\r\n\r\n:deep(.v-empty-state__media) {\r\n margin-bottom: 16px;\r\n}\r\n\r\n:deep(.v-empty-state__headline) {\r\n margin-bottom: 8px;\r\n}\r\n\r\n:deep(.v-empty-state__title) {\r\n margin-bottom: 8px;\r\n}\r\n\r\n:deep(.v-empty-state__actions) {\r\n margin-top: 16px;\r\n}\r\n</style>","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1749629552703'%20class='icon'%20viewBox='0%200%201396%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='13768'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='272.65625'%20height='200'%3e%3cpath%20d='M1264.425891%20814.340655c-6.050909-42.7008-33.233455-84.433455-74.202764-97.540655a199.028364%20199.028364%200%200%201%202.373818%20136.443345c-5.9392%2017.072873-14.373236%2035.439709-8.154763%2052.410182a44.274036%2044.274036%200%200%200%2023.021382%2023.514764%20132.096%20132.096%200%200%200%2032.423563%209.309091l2.169018%201.7408c16.5888-39.880145%2028.429964-83.232582%2022.369746-125.877527z'%20fill='%23F4F4F4'%20p-id='13769'%3e%3c/path%3e%3cpath%20d='M1191.666036%20718.773527c25.488291%2026.242327%2041.630255%2059.466473%2046.145164%2094.952728%201.089164%207.633455%200.893673%2015.378618-0.577164%2022.956218a41.648873%2041.648873%200%200%201-10.593745%2019.642182%2088.175709%2088.175709%200%200%200-13.898473%2016.27229%2024.669091%2024.669091%200%200%200-0.902982%2021.00131c3.723636%208.192%209.141527%2015.5648%2015.946473%2021.69949a66.187636%2066.187636%200%200%201%2017.7152%2024.315346c0.335127%201.135709%202.215564%200.539927%201.880436-0.651636-5.697164-16.821527-22.788655-26.158545-31.390254-41.239273a24.920436%2024.920436%200%200%201-2.215564-22.788655%2067.323345%2067.323345%200%200%201%2013.7216-16.877382%2043.976145%2043.976145%200%200%200%2011.394328-18.878836%2065.619782%2065.619782%200%200%200%201.42429-22.844509%20157.947345%20157.947345%200%200%200-13.6192-49.915345%20171.4176%20171.4176%200%200%200-33.540654-49.319564c-0.856436-0.930909-2.169018%200.539927-1.312582%201.461527l-0.176873%200.214109z'%20fill='%23FFFFFF'%20p-id='13770'%3e%3c/path%3e%3cpath%20d='M1228.418327%20845.460945c-8.033745-5.678545-14.038109-14.838691-16.821527-25.674472-0.279273-1.098473-1.629091-0.502691-1.387055%200.549236%202.913745%2011.282618%209.197382%2020.815127%2017.594182%2026.679855%200.8192%200.539927%201.424291-1.005382%200.6144-1.554619z'%20fill='%23FFFFFF'%20p-id='13771'%3e%3c/path%3e%3cpath%20d='M1070.545455%20804.770909l1.954909%201.135709c8.759855%204.980364%2017.035636%2010.630982%2024.734254%2016.886691%200.642327%200.437527%201.238109%200.912291%201.796655%201.4336a184.813382%20184.813382%200%200%201%2044.776727%2053.573818c4.421818%208.043055%208.154764%2016.384%2011.170909%2024.939055%204.189091%2011.803927%207.68%2024.687709%2015.685818%2034.564654%200.837818%201.014691%201.722182%201.992145%202.671709%202.913746l70.814255-1.135709H1247.418182a12.241455%2012.241455%200%200%200-0.381673-1.3312%203.351273%203.351273%200%200%200%200-0.791273%201.926982%201.926982%200%200%201%200-0.539927%201.303273%201.303273%200%200%201%200-0.446837c-0.763345-2.615855-1.582545-5.231709-2.345891-7.801018a246.225455%20246.225455%200%200%200-26.959127-58.963782%20166.288291%20166.288291%200%200%200-17.221818-22.760727%20137.746618%20137.746618%200%200%200-45.921746-33.978182c-25.013527-12.269382-54.346473-15.173818-81.696582-8.098909l-2.34589%200.400291z'%20fill='%23F4F4F4'%20p-id='13772'%3e%3c/path%3e%3cpath%20d='M1071.904582%20802.425018c35.169745%206.022982%2067.444364%2022.341818%2092.243782%2046.685091a69.678545%2069.678545%200%200%201%2013.451636%2017.594182c3.165091%206.395345%204.468364%2013.479564%203.742255%2020.517236a78.941091%2078.941091%200%200%200-0.651637%2019.893528c1.303273%206.823564%205.659927%2012.790691%2011.943564%2016.365381%207.7824%204.189091%2016.384%206.8608%2025.283491%207.847564a67.397818%2067.397818%200%200%201%2028.048291%208.722618c0.977455%200.670255%202.066618-0.8192%201.033309-1.536-14.270836-9.746618-33.093818-7.335564-48.835491-14.112582-7.493818-2.774109-13.2096-8.685382-15.453091-16.002327a60.229818%2060.229818%200%200%201%200-20.200727%2040.001164%2040.001164%200%200%200-2.885818-20.265891%2064.260655%2064.260655%200%200%200-12.6976-17.957236%20164.9664%20164.9664%200%200%200-40.364218-30.366255A180.140218%20180.140218%200%200%200%201071.522909%20800.581818c-1.247418%200-1.359127%201.582545%200%201.796655l0.372364%200.046545z'%20fill='%23FFFFFF'%20p-id='13773'%3e%3c/path%3e%3cpath%20d='M1148.220509%20837.520291c8.620218-8.145455%208.052364-19.725964-1.3312-27.387346-0.912291-0.7168-2.541382%200.316509-1.582545%201.03331%208.8064%207.121455%209.271855%2017.938618%201.098472%2025.451054-0.847127%200.809891%200.968145%201.675636%201.815273%200.902982z'%20fill='%23FFFFFF'%20p-id='13774'%3e%3c/path%3e%3cpath%20d='M269.963636%20102.4m20.107637%200l248.366545%200q20.107636%200%2020.107637%2020.107636l0%2080.802909q0%2020.107636-20.107637%2020.107637l-248.366545%200q-20.107636%200-20.107637-20.107637l0-80.802909q0-20.107636%2020.107637-20.107636Z'%20fill='%23F4F4F4'%20p-id='13775'%3e%3c/path%3e%3cpath%20d='M339.781818%20162.909091m-23.272727%200a23.272727%2023.272727%200%201%200%2046.545454%200%2023.272727%2023.272727%200%201%200-46.545454%200Z'%20fill='%23FFFFFF'%20p-id='13776'%3e%3c/path%3e%3cpath%20d='M513.889745%20158.217309H387.872582C384.372364%20157.789091%20381.672727%20153.767564%20381.672727%20148.945455s2.690327-8.843636%206.199855-9.271855h126.017163c2.569309-0.316509%205.045527%201.377745%206.404655%204.375273%201.349818%203.006836%201.349818%206.795636%200%209.793163-1.359127%202.997527-3.835345%204.691782-6.404655%204.375273zM477.435345%20195.490909h-89.125236c-3.667782%200-6.637382-4.170473-6.637382-9.309091s2.978909-9.309091%206.637382-9.309091h89.125236c3.667782%200%206.637382%204.170473%206.637382%209.309091s-2.978909%209.309091-6.637382%209.309091z'%20fill='%23FFFFFF'%20p-id='13777'%3e%3c/path%3e%3cpath%20d='M111.709091%20605.090909m20.107636%200l183.202909%200q20.107636%200%2020.107637%2020.107636l0%2090.112q0%2020.107636-20.107637%2020.107637l-183.202909%200q-20.107636%200-20.107636-20.107637l0-90.112q0-20.107636%2020.107636-20.107636Z'%20fill='%23E1EDFF'%20p-id='13778'%3e%3c/path%3e%3cpath%20d='M162.909091%20665.6m-23.272727%200a23.272727%2023.272727%200%201%200%2046.545454%200%2023.272727%2023.272727%200%201%200-46.545454%200Z'%20fill='%23FFFFFF'%20p-id='13779'%3e%3c/path%3e%3cpath%20d='M251.997091%20660.908218h-30.608291C217.264873%20660.489309%20214.109091%20656.477091%20214.109091%20651.636364s3.165091-8.852945%207.279709-9.271855h30.608291c2.997527-0.3072%205.892655%201.396364%207.4752%204.384582%201.582545%202.997527%201.582545%206.777018%200%209.774545-1.582545%202.997527-4.477673%204.691782-7.4752%204.384582zM282.0096%20698.181818h-61.328291c-3.723636-0.418909-6.572218-4.468364-6.572218-9.309091s2.848582-8.890182%206.572218-9.309091h61.328291c3.723636%200.418909%206.572218%204.468364%206.572218%209.309091s-2.848582%208.890182-6.572218%209.309091z'%20fill='%23FFFFFF'%20p-id='13780'%3e%3c/path%3e%3cpath%20d='M269.963636%20944.872727h1014.690909'%20fill='%2366676D'%20p-id='13781'%3e%3c/path%3e%3cpath%20d='M269.963636%20940.218182h1014.690909v9.309091H269.963636z'%20fill='%23E1EDFF'%20p-id='13782'%3e%3c/path%3e%3cpath%20d='M996.072727%20232.727273m-27.927272%200a27.927273%2027.927273%200%201%200%2055.854545%200%2027.927273%2027.927273%200%201%200-55.854545%200Z'%20fill='%23F4F4F4'%20p-id='13783'%3e%3c/path%3e%3cpath%20d='M1181.305018%20866.117818c-1.508073%203.956364-4.431127%206.656-7.7824%207.177309-0.893673%200-0.633018%201.8432%200%201.759418%203.695709-0.6144%206.925964-3.584%208.610909-7.940654a1.098473%201.098473%200%200%200%200.055855-0.865746c-0.093091-0.279273-0.297891-0.465455-0.539927-0.50269-0.232727-0.027927-0.465455%200.111709-0.605091%200.372363h0.260654z'%20fill='%23FFFFFF'%20p-id='13784'%3e%3c/path%3e%3cpath%20d='M1196.218182%20358.4m-32.581818%200a32.581818%2032.581818%200%201%200%2065.163636%200%2032.581818%2032.581818%200%201%200-65.163636%200Z'%20fill='%23FEDAC2'%20p-id='13785'%3e%3c/path%3e%3cpath%20d='M1027.537455%20679.563636H846.196364a26.437818%2026.437818%200%200%200-26.372655%2026.5216v11.347782c0%2010.426182-8.406109%2018.878836-18.776436%2018.878837H642.234182a18.832291%2018.832291%200%200%201-18.776437-18.822982v-11.403637A26.437818%2026.437818%200%200%200%20597.085091%20679.563636H415.529891c-8.415418%200-15.238982%206.8608-15.238982%2015.332073v239.299491A15.341382%2015.341382%200%200%200%20415.529891%20949.527273h611.849309a15.341382%2015.341382%200%200%200%2015.238982-15.332073V694.895709c0-8.406109-6.730473-15.248291-15.080727-15.332073z%20m7.382109%20254.585019c0%204.105309-3.295418%207.447273-7.382109%207.4752H415.688145a7.456582%207.456582%200%200%201-7.382109-7.4752V694.895709a7.186618%207.186618%200%200%201%202.169019-5.306182%207.316945%207.316945%200%200%201%205.268945-2.178327h181.341091a18.832291%2018.832291%200%200%201%2018.720582%2018.888145v11.347782a26.763636%2026.763636%200%200%200%2026.633309%2026.512291H801.047273a26.763636%2026.763636%200%200%200%2026.633309-26.512291v-11.357091c0-10.398255%208.378182-18.850909%2018.729891-18.878836h181.341091a7.456582%207.456582%200%200%201%207.3728%207.484509l-0.2048%20239.243636z'%20fill='%23D3D3D3'%20p-id='13786'%3e%3c/path%3e%3cpath%20d='M527.145891%20260.654545H934.632727c13.833309%200.977455%2024.417745%2013.163055%2024.203637%2027.368728l-0.046546%201.163636L958.836364%20684.218182h-6.460509l-0.046546-395.226764c0.6144-10.835782-6.944582-20.200727-16.905309-21.466763l-1.005382-0.093091-407.058618-0.009309c-10.333091%200.726109-18.255127%209.755927-18.208582%2020.666181l0.037237%201.098473%200.046545%20395.031273h-6.460509l-0.037236-394.835782c-0.791273-14.522182%209.4208-27.052218%2023.272727-28.625455l1.135709-0.1024z'%20fill='%23CACACC'%20p-id='13787'%3e%3c/path%3e%3cpath%20d='M823.975564%20381.672727H712.024436c-7.7824-0.446836-13.842618-6.572218-13.842618-13.963636s6.060218-13.5168%2013.842618-13.963636h111.951128c7.7824%200.446836%2013.842618%206.572218%2013.842618%2013.963636s-6.060218%2013.5168-13.842618%2013.963636zM878.964364%20381.672727h-17.128728c-8.266473-0.446836-14.708364-6.572218-14.708363-13.963636s6.441891-13.5168%2014.708363-13.963636h17.128728c8.266473%200.446836%2014.708364%206.572218%2014.708363%2013.963636s-6.441891%2013.5168-14.708363%2013.963636z'%20fill='%23F4F4F4'%20p-id='13788'%3e%3c/path%3e%3cpath%20d='M650.724073%20357.338764h-30.72V326.190545A10.333091%2010.333091%200%200%200%20609.745455%20316.509091a10.333091%2010.333091%200%200%200-10.24931%209.681454v31.148219h-30.72c-5.650618%200-10.230691%204.645236-10.23069%2010.370327%200%205.725091%204.580073%2010.370327%2010.221381%2010.370327h30.72v31.157527A10.333091%2010.333091%200%200%200%20609.745455%20418.909091a10.333091%2010.333091%200%200%200%2010.249309-9.681455v-31.148218h30.72c5.650618%200%2010.230691-4.645236%2010.230691-10.370327%200-5.725091-4.580073-10.370327-10.221382-10.370327z'%20fill='%231E73F7'%20p-id='13789'%3e%3c/path%3e%3cpath%20d='M558.545455%20474.763636m20.107636%200l304.221091%200q20.107636%200%2020.107636%2020.107637l0%2024.948363q0%2020.107636-20.107636%2020.107637l-304.221091%200q-20.107636%200-20.107636-20.107637l0-24.948363q0-20.107636%2020.107636-20.107637Z'%20fill='%23E1EDFF'%20p-id='13790'%3e%3c/path%3e%3cpath%20d='M558.545455%20549.236364m20.107636%200l118.039273%200q20.107636%200%2020.107636%2020.107636l0%2024.948364q0%2020.107636-20.107636%2020.107636l-118.039273%200q-20.107636%200-20.107636-20.107636l0-24.948364q0-20.107636%2020.107636-20.107636Z'%20fill='%23E1EDFF'%20p-id='13791'%3e%3c/path%3e%3cpath%20d='M251.345455%20437.527273m-18.618182%200a18.618182%2018.618182%200%201%200%2037.236363%200%2018.618182%2018.618182%200%201%200-37.236363%200Z'%20fill='%23E1EDFF'%20p-id='13792'%3e%3c/path%3e%3cpath%20d='M1079.854545%20539.927273m-9.30909%200a9.309091%209.309091%200%201%200%2018.618181%200%209.309091%209.309091%200%201%200-18.618181%200Z'%20fill='%23E1EDFF'%20p-id='13793'%3e%3c/path%3e%3cpath%20d='M558.545455%20810.942836v53.750691h5.920581V820.503273h0.214109l29.29571%2044.190254h6.060218v-53.750691h-5.911273v43.734109h-0.223418l-29.146764-43.734109zM632.943709%20809.890909c-7.791709%200-13.851927%202.708945-18.3296%208.126836-4.254255%205.12-6.3488%2011.748073-6.3488%2019.87491%200%208.052364%202.094545%2014.680436%206.3488%2019.800436%204.468364%205.343418%2010.537891%208.052364%2018.255127%208.052364%207.726545%200%2013.861236-2.708945%2018.338909-8.052364%204.189091-5.12%206.3488-11.6736%206.3488-19.800436%200-8.201309-2.169018-14.829382-6.358109-19.949382-4.468364-5.417891-10.603055-8.052364-18.245818-8.052364z%20m0%205.492364c5.920582%200%2010.537891%202.038691%2013.861236%206.171927%203.165091%204.068073%204.831418%209.495273%204.831419%2016.337455%200%206.777018-1.657018%2012.120436-4.840728%2016.188509-3.314036%204.058764-8.005818%206.171927-13.9264%206.171927-5.911273%200-10.603055-2.113164-13.9264-6.330182-3.165091-4.058764-4.756945-9.402182-4.756945-16.030254%200-6.702545%201.582545-12.045964%204.756945-16.104728%203.397818-4.291491%208.0896-6.404655%2014.000873-6.404654zM689.803636%20810.942836v53.750691h17.901382c8.080291%200%2014.289455-2.485527%2018.618182-7.382109%204.114618-4.663855%206.209164-11.217455%206.209164-19.493236%200-8.434036-1.954909-14.987636-5.771637-19.493237-4.189091-4.971055-10.323782-7.382109-18.478545-7.382109h-18.469237z%20m5.920582%205.343419h11.617746c6.795636%200%2011.692218%201.805964%2014.866618%205.492363%202.960291%203.472291%204.477673%208.815709%204.477673%2016.039564%200%207.000436-1.657018%2012.343855-4.840728%2015.955782-3.388509%203.695709-8.434036%205.576145-15.145891%205.576145h-10.975418v-43.063854zM755.842327%20810.942836l-20.2752%2053.750691h6.3488l5.483055-15.0528h23.663709l5.492364%2015.0528h6.423272l-20.284509-53.750691h-6.851491z%20m-6.572218%2033.503419l9.886255-26.875346h0.288581l9.746619%2026.875346h-19.921455zM784.197818%20810.942836v5.343419h18.189964v48.407272h5.846109v-48.407272h18.180654v-5.343419zM847.918545%20810.942836l-20.2752%2053.750691h6.3488l5.492364-15.0528h23.663709l5.492364%2015.0528H875.054545l-20.2752-53.750691h-6.8608z%20m-6.562909%2033.503419l9.886255-26.875346h0.279273l9.746618%2026.875346h-19.921455z'%20fill='%23E1EDFF'%20p-id='13794'%3e%3c/path%3e%3cpath%20d='M959.860364%20543.222691l-0.791273%201.954909-4.635927%204.244945%2077.367854%20123.233746c1.973527%203.146473%203.025455%206.814255%203.006837%2010.556509v251.308218a7.354182%207.354182%200%200%201-2.048%205.110691%206.907345%206.907345%200%200%201-4.961746%202.122473H415.371636a7.391418%207.391418%200%200%201-7.2704-7.512437V683.2128c0-3.751564%201.061236-7.419345%203.053382-10.556509L507.345455%20535.272727l-2.532073-10.873018-100.258909%20143.741673c-2.792727%204.440436-4.282182%209.616291-4.263564%2014.903854V922.344727c0%2015.015564%2011.803927%2027.191855%2026.372655%2027.191855h589.321309c14.605964%200%2026.484364-12.129745%2026.624-27.191855V683.045236c0-5.213091-1.4336-10.333091-4.161164-14.736291l-78.587345-125.086254z'%20fill='%23D3D3D3'%20p-id='13795'%3e%3c/path%3e%3c/svg%3e\"","<template>\n <v-card class=\"pa-4 mx-auto text-center pt-10\" color=\"transparent\" elevation=\"0\" style=\"border: none !important;box-shadow: none !important;\">\n <v-img contain width=\"120\" class=\"mx-auto\" :src=\"emptyImg\" alt=\"\" />\n <p class=\"text-grey mt-1\">{{ text || \"暂无数据\" }}</p>\n </v-card>\n</template>\n\n<script setup>\nimport emptyImg from '@/assets/img/empty.svg';\n\n// 定义 props\ndefineProps({\n text: {\n type: String,\n default: null,\n },\r\n items: {\r\n type: Array,\r\n default: null,\r\n },\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped></style>\n","<!-- 悬浮按钮 -->\r\n<template>\r\n <transition name=\"slide-up\">\r\n <v-fab\r\n v-if=\"showFab\"\r\n :class=\"fabClass\"\r\n color=\"primary\"\r\n icon=\"mdi-arrow-up\"\r\n @click=\"scrollToTop\"\r\n ></v-fab>\r\n </transition>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, onBeforeUnmount } from 'vue'\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkFab\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 控制悬浮按钮显示状态\r\nconst showFab = ref(false)\r\n// 自定义类名用于样式调整\r\nconst fabClass = ref('scroll-to-top-fab')\r\n\r\n// 监听滚动事件\r\nconst handleScroll = () => {\r\n showFab.value = window.scrollY > 100\r\n}\r\n\r\n// 滚动到顶部\r\nconst scrollToTop = () => {\r\n window.scrollTo({\r\n top: 0,\r\n behavior: 'smooth'\r\n })\r\n}\r\n\r\n// 组件挂载时添加滚动监听\r\nonMounted(() => {\r\n window.addEventListener('scroll', handleScroll)\r\n})\r\n\r\n// 组件卸载前移除监听\r\nonBeforeUnmount(() => {\r\n window.removeEventListener('scroll', handleScroll)\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.scroll-to-top-fab {\r\n position: fixed;\r\n bottom: 24px;\r\n right: 24px;\r\n z-index: 1004;\r\n}\r\n\r\n/* 滑动动画 */\r\n.slide-up-enter-active {\r\n transition: all 0.2s ease-out;\r\n}\r\n\r\n.slide-up-leave-active {\r\n transition: all 0.2s ease-in;\r\n}\r\n\r\n.slide-up-enter-from {\r\n opacity: 0;\r\n transform: translateY(30px);\r\n}\r\n\r\n.slide-up-leave-to {\r\n opacity: 0;\r\n transform: translateY(30px);\r\n}\r\n</style>","<template>\r\n <div\r\n class=\"box\"\r\n :class=\"{\r\n 'form-item--vertical': top,\r\n 'form-item--horizontal': !top\r\n }\"\r\n style=\"position: relative\"\r\n >\r\n <!-- label 在上方 (top模式) -->\r\n <div\r\n v-if=\"label && top\"\r\n class=\"pb-2 text-left\"\r\n >\r\n <span v-if=\"must\" class=\"text-red mr-1\">*</span>\r\n <span>{{ label }}</span>\r\n </div>\r\n\r\n <!-- label 在左侧 (默认模式) -->\r\n <div\r\n v-if=\"label && !top\"\r\n :class=\"left ? '' : 'vtk-width-2'\"\r\n class=\"d-inline-block text-right\"\r\n :style=\"Tstyle\"\r\n style=\"min-width: 120px !important;vertical-align: top;padding-top: 11px;\"\r\n >\r\n <span v-if=\"must\" class=\"text-red\">*</span>\r\n <span>{{ label }}</span>\r\n </div>\r\n\r\n <!-- 输入框容器 (top模式) -->\r\n <div\r\n v-if=\"top\"\r\n :style=\"contentStyles\"\r\n >\r\n <slot></slot>\r\n </div>\r\n\r\n <!-- 输入框容器 (默认模式) -->\r\n <div\r\n v-if=\"!top\"\r\n class=\"d-inline-block vtk-width-7 \"\r\n style=\"min-width: 350px;\"\r\n >\r\n <slot></slot>\r\n </div>\r\n\r\n <!-- help提示 (仅left模式) -->\r\n <div\r\n v-if=\"left && help && !top\"\r\n class=\"box_help tips py-3 px-4\"\r\n style=\"width: calc(30% - 160px)\"\r\n >\r\n <p class=\"mb-2 font-weight-bold text-body-1\">{{ label }}</p>\r\n <span v-html=\"help\"></span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\n\r\n// 定义组件名称和选项\r\ndefineOptions({\r\n name: \"VtkFormItem\",\r\n inheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n label: {\r\n type: String,\r\n default: null\r\n },\r\n must: {\r\n type: Boolean,\r\n default: false\r\n },\r\n left: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 标签在上方的垂直布局\r\n top: {\r\n type: Boolean,\r\n default: false\r\n },\r\n Tstyle: {\r\n type: String,\r\n default: null\r\n },\r\n help: {\r\n type: String,\r\n default: null\r\n },\r\n // 控制top模式下内容的最大宽度\r\n maxWidth: {\r\n type: [String, Number],\r\n default: '100%'\r\n }\r\n});\r\n\r\n// 处理maxWidth属性\r\nconst processedMaxWidth = computed(() => {\r\n if (typeof props.maxWidth === 'number') {\r\n return props.maxWidth + 'px';\r\n }\r\n return props.maxWidth;\r\n});\r\n\r\n// 内容样式(仅在top模式下应用maxWidth)\r\nconst contentStyles = computed(() => {\r\n const styles = {};\r\n\r\n // 在top模式下应用maxWidth\r\n if (props.top && props.maxWidth) {\r\n styles.maxWidth = processedMaxWidth.value;\r\n }\r\n\r\n return styles;\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.box:hover > .box_help {\r\n display: inline-block !important;\r\n border-top-right-radius: 24px;\r\n border-bottom-left-radius: 24px;\r\n}\r\n\r\n.box_help {\r\n display: none;\r\n}\r\n\r\n.tips {\r\n position: absolute;\r\n right: 8px;\r\n top: 0;\r\n border: 1px rgba(175, 175, 175, 0.341) solid;\r\n}\r\n\r\n.form-item--vertical {\r\n display: block;\r\n margin-bottom: 1rem;\r\n}\r\n\r\n.form-item--horizontal {\r\n display: block;\r\n margin-bottom: 0.5rem;\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"vtk-img-container\">\r\n <VCard \r\n :class=\"['vtk-img-card', { 'vtk-img-card--preview': preview }]\"\r\n @click=\"openPreview\"\r\n >\r\n <v-img \r\n v-bind=\"$attrs\" \r\n :src=\"srcWithToken\"\r\n class=\"vtk-img\"\r\n :aspect-ratio=\"aspectRatio\"\r\n cover\r\n >\r\n <template v-slot:placeholder>\r\n <div class=\"d-flex align-center justify-center fill-height\">\r\n <v-progress-circular indeterminate color=\"grey-lighten-1\"></v-progress-circular>\r\n </div>\r\n </template>\r\n </v-img>\r\n \r\n <!-- 图片标题和描述 -->\r\n <div class=\"vtk-img-info\" v-if=\"showTitle || showDescription\">\r\n <VCardTitle v-if=\"showTitle\" class=\"vtk-img-title text-subtitle-2 pa-2\">\r\n {{ title }}\r\n </VCardTitle>\r\n <v-card-subtitle v-if=\"showDescription\" class=\"vtk-img-description text-caption pa-2\">\r\n {{ description }}\r\n </v-card-subtitle>\r\n </div>\r\n </VCard>\r\n \r\n <!-- 使用 v-dialog 的图片预览 -->\r\n <VDialog \r\n v-model=\"showPreview\" \r\n max-width=\"90%\" \r\n fullscreen\r\n @click:outside=\"closePreview\"\r\n >\r\n <VCard class=\"image-viewer-card\">\r\n <v-toolbar dark color=\"primary\">\r\n <v-toolbar-title>{{ currentImageTitle }}</v-toolbar-title>\r\n <VSpacer></VSpacer>\r\n <v-toolbar-items>\r\n <VBtn icon dark title=\"新窗口打开\" @click=\"openCurrentImageInNewWindow\">\r\n <VIcon>mdi-open-in-new</VIcon>\r\n </VBtn>\r\n <VBtn icon dark title=\"下载图片\" @click=\"downloadCurrentImage\">\r\n <VIcon>mdi-download</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"zoomImage(-0.3)\">\r\n <VIcon>mdi-magnify-minus-outline</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"zoomImage(0.3)\">\r\n <VIcon>mdi-magnify-plus-outline</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"rotateImage(-90)\">\r\n <VIcon>mdi-rotate-left</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"rotateImage(90)\">\r\n <VIcon>mdi-rotate-right</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"resetImageTransform\">\r\n <VIcon>mdi-refresh</VIcon>\r\n </VBtn>\r\n <VBtn icon dark @click=\"closePreview\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n </v-toolbar-items>\r\n </v-toolbar>\r\n \r\n <div class=\"image-viewer-content\">\r\n <VBtn \r\n v-if=\"hasPrev\" \r\n icon \r\n class=\"nav-button prev-button\" \r\n @click=\"prevImage\"\r\n >\r\n <VIcon>mdi-chevron-left</VIcon>\r\n </VBtn>\r\n \r\n <div class=\"image-container\" @wheel.prevent=\"handleImageWheel\">\r\n <v-img\r\n :src=\"currentImageUrl\"\r\n class=\"viewer-image\"\r\n :class=\"{ 'viewer-image--draggable': imageScale > 1 }\"\r\n :style=\"viewerImageStyle\"\r\n draggable=\"false\"\r\n @pointerdown=\"startImageDrag\"\r\n />\r\n </div>\r\n \r\n <VBtn \r\n v-if=\"hasNext\" \r\n icon \r\n class=\"nav-button next-button\" \r\n @click=\"nextImage\"\r\n >\r\n <VIcon>mdi-chevron-right</VIcon>\r\n </VBtn>\r\n </div>\r\n \r\n <div class=\"image-info\">\r\n <p class=\"text-center\">{{ currentImageDescription }}</p>\r\n <p class=\"text-center text--secondary\">{{ currentIndex + 1 }} / {{ imageList.length }}</p>\r\n </div>\r\n </VCard>\r\n </VDialog>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch, getCurrentInstance } from 'vue';\r\n\r\ndefineOptions({\r\n name: 'VtkImg',\r\n inheritAttrs: true\r\n});\r\n\r\nconst { proxy } = getCurrentInstance();\r\n\r\nconst props = defineProps({\r\n src: {\r\n type: String,\r\n default: null,\r\n },\r\n downloadSrc: {\r\n type: String,\r\n default: '',\r\n },\r\n error: {\r\n type: String,\r\n default: new URL('../../assets/img/wxsq.png', import.meta.url).href,\r\n },\r\n preview: {\r\n type: Boolean,\r\n default: true\r\n },\r\n title: {\r\n type: String,\r\n default: ''\r\n },\r\n description: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图片列表,用于导航功能\r\n imageList: {\r\n type: Array,\r\n default: () => []\r\n },\r\n // 当前图片索引\r\n index: {\r\n type: Number,\r\n default: 0\r\n },\r\n // 是否显示标题\r\n showTitle: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 是否显示描述\r\n showDescription: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 图片宽高比\r\n aspectRatio: {\r\n type: [String, Number],\r\n default: 16/9\r\n }\r\n});\r\n\r\n// 预览状态\r\nconst showPreview = ref(false);\r\n// 图片旋转角度\r\nconst imageRotation = ref(0);\r\n// 图片缩放和拖动位置\r\nconst imageScale = ref(1);\r\nconst imageTranslateX = ref(0);\r\nconst imageTranslateY = ref(0);\r\nconst imageDragState = ref(null);\r\n// 当前图片索引(预览模式下使用)\r\nconst currentIndex = ref(0);\r\n\r\n// 使用计算属性处理带token的URL\r\nconst srcWithToken = computed(() => {\r\n if (!props.src) return props.src;\r\n \r\n try {\r\n // 首先尝试使用 $vtk.storage\r\n if (window.$vtk && typeof window.$vtk.storage?.get === 'function') {\r\n const token = window.$vtk.storage.get('_mis_acis_token');\r\n return token ? `${props.src}?stoken=${token}` : props.src;\r\n }\r\n // 如果 $vtk 不存在,尝试从 localStorage 获取 token\r\n else {\r\n const token = localStorage.getItem('_mis_acis_token');\r\n return token ? `${props.src}?stoken=${token}` : props.src;\r\n }\r\n } catch (error) {\r\n // 发生错误时返回原始src\r\n console.warn('VtkImg: Failed to get token, using src without token', error);\r\n return props.src;\r\n }\r\n});\r\n\r\n// 当前预览图片的URL\r\nconst currentImageUrl = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n if (currentImage) {\r\n // 支持 imageList 项为字符串(直接是URL)或对象(含 url 属性)\r\n const url = typeof currentImage === 'string' ? currentImage : currentImage?.url;\r\n if (url) {\r\n try {\r\n // 为图片列表中的图片也添加token\r\n if (window.$vtk && typeof window.$vtk.storage?.get === 'function') {\r\n const token = window.$vtk.storage.get('_mis_acis_token');\r\n return token ? `${url}?stoken=${token}` : url;\r\n } else {\r\n const token = localStorage.getItem('_mis_acis_token');\r\n return token ? `${url}?stoken=${token}` : url;\r\n }\r\n } catch (error) {\r\n return url;\r\n }\r\n }\r\n }\r\n }\r\n return srcWithToken.value;\r\n});\r\n\r\nconst currentImageRawUrl = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n const url = typeof currentImage === 'string' ? currentImage : currentImage?.url;\r\n return url || props.src;\r\n }\r\n\r\n return props.src;\r\n});\r\n\r\nconst currentImageDownloadUrl = computed(() => {\r\n if (props.downloadSrc) return props.downloadSrc;\r\n\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n if (currentImage && typeof currentImage === 'object') {\r\n return currentImage.downloadUrl || currentImage.downloadSrc || currentImage.url || props.src;\r\n }\r\n }\r\n\r\n return currentImageRawUrl.value;\r\n});\r\n\r\n// 当前图片标题\r\nconst currentImageTitle = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n return currentImage?.title || '';\r\n }\r\n return props.title;\r\n});\r\n\r\n// 当前图片描述\r\nconst currentImageDescription = computed(() => {\r\n if (props.imageList.length > 0 && currentIndex.value < props.imageList.length) {\r\n const currentImage = props.imageList[currentIndex.value];\r\n return currentImage?.description || '';\r\n }\r\n return props.description;\r\n});\r\n\r\n// 是否有上一张图片\r\nconst hasPrev = computed(() => {\r\n return props.imageList.length > 1 && currentIndex.value > 0;\r\n});\r\n\r\n// 是否有下一张图片\r\nconst hasNext = computed(() => {\r\n return props.imageList.length > 1 && currentIndex.value < props.imageList.length - 1;\r\n});\r\n\r\nconst viewerImageStyle = computed(() => ({\r\n transform: `translate(${imageTranslateX.value}px, ${imageTranslateY.value}px) scale(${imageScale.value}) rotate(${imageRotation.value}deg)`,\r\n}));\r\n\r\nconst openCurrentImageInNewWindow = () => {\r\n if (!currentImageRawUrl.value) return;\r\n\r\n window.open(currentImageRawUrl.value, '_blank', 'noopener');\r\n};\r\n\r\nconst imageMimeExtensionMap = {\r\n 'image/bmp': 'bmp',\r\n 'image/gif': 'gif',\r\n 'image/jpeg': 'jpg',\r\n 'image/png': 'png',\r\n 'image/svg+xml': 'svg',\r\n 'image/webp': 'webp',\r\n};\r\n\r\nconst imageExtensionMimeMap = {\r\n bmp: 'image/bmp',\r\n gif: 'image/gif',\r\n jpeg: 'image/jpeg',\r\n jpg: 'image/jpeg',\r\n png: 'image/png',\r\n svg: 'image/svg+xml',\r\n webp: 'image/webp',\r\n};\r\n\r\nconst getImageFileExtension = (blob) => {\r\n const mimeType = blob?.type?.split(';')[0]?.toLowerCase();\r\n\r\n if (mimeType && imageMimeExtensionMap[mimeType]) {\r\n return imageMimeExtensionMap[mimeType];\r\n }\r\n\r\n try {\r\n const { pathname } = new URL(currentImageRawUrl.value, window.location.href);\r\n const matched = pathname.match(/\\.([a-z0-9]+)$/i);\r\n return matched?.[1]?.toLowerCase() || 'png';\r\n } catch (error) {\r\n return 'png';\r\n }\r\n};\r\n\r\nconst getCurrentImageFileName = (blob) => {\n const extension = getImageFileExtension(blob);\n const titleName = currentImageTitle.value?.trim();\n\r\n if (titleName) {\r\n const safeTitle = titleName.replace(/[\\\\/:*?\"<>|]/g, '_').replace(/\\.[a-z0-9]+$/i, '');\r\n return `${safeTitle}.${extension}`;\r\n }\r\n\r\n try {\r\n const { pathname } = new URL(currentImageRawUrl.value, window.location.href);\r\n const urlName = decodeURIComponent(pathname.split('/').pop() || '')\r\n .replace(/[\\\\/:*?\"<>|]/g, '_')\r\n .replace(/\\.[a-z0-9]+$/i, '');\r\n return urlName ? `${urlName}.${extension}` : `image.${extension}`;\r\n } catch (error) {\r\n return `image.${extension}`;\r\n }\n};\n\nconst isDownloadRiskWebView = () => {\n const ua = window.navigator?.userAgent || '';\n const hasEmbeddedBridge = typeof window.dd !== 'undefined' || typeof window.AlipayJSBridge !== 'undefined';\n return hasEmbeddedBridge\n || /DingTalk|AliApp\\(DingTalk|zjzwfw|zzd|ZJGovernment|ZhejiangGovernment|GovDing|Electron|WebView|; wv\\)/i.test(ua);\n};\n\nconst getDownloadFailureReason = (error) => {\n const message = error?.message || '';\n const name = error?.name || '';\n\n if (name === 'AbortError') return '已取消下载';\n if (name === 'NotAllowedError' || name === 'SecurityError') return '当前客户端阻止了文件保存';\n if (name === 'QuotaExceededError') return '存储空间不足或客户端限制写入';\n if (/Failed to fetch|NetworkError|Load failed/i.test(message)) {\n return '图片地址不允许跨域读取,或当前网络无法访问图片';\n }\n if (/HTTP error! status:\\s*(\\d+)/i.test(message)) {\n return `图片请求失败,状态码 ${message.match(/HTTP error! status:\\s*(\\d+)/i)?.[1]}`;\n }\n if (/Response is not an image/i.test(message)) return '下载地址返回的不是图片文件';\n if (/Downloaded image is empty/i.test(message)) return '下载到的图片文件为空';\n if (/Downloaded file is not an image/i.test(message)) return '下载到的文件不是图片格式';\n if (/Downloaded image cannot be decoded/i.test(message)) return '下载到的图片无法被浏览器解析';\n\n return message || '未知错误';\n};\n\nconst validateImageBlob = async (blob) => {\n if (!blob || blob.size <= 0) {\n throw new Error('Downloaded image is empty');\n }\n\n const extension = getImageFileExtension(blob);\n const mimeType = blob.type?.split(';')[0]?.trim().toLowerCase();\n if (mimeType && !mimeType.startsWith('image/')) {\n throw new Error(`Downloaded file is not an image: ${mimeType}`);\n }\n\n if (typeof window.createImageBitmap === 'function' && mimeType !== 'image/svg+xml') {\n try {\n const bitmap = await window.createImageBitmap(blob);\n bitmap.close?.();\n return;\n } catch (error) {\n console.warn('VtkImg: createImageBitmap validation failed, fallback to Image validation', error);\n }\n }\n\n if (extension === 'svg') return;\n\n await new Promise((resolve, reject) => {\n const url = window.URL.createObjectURL(blob);\n const image = new Image();\n\n image.onload = () => {\n window.URL.revokeObjectURL(url);\n resolve();\n };\n image.onerror = () => {\n window.URL.revokeObjectURL(url);\n reject(new Error('Downloaded image cannot be decoded'));\n };\n image.src = url;\n });\n};\n\nconst triggerBrowserDownload = (blob, fileName) => {\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n setTimeout(() => window.URL.revokeObjectURL(url), 60 * 1000);\n};\n\r\nconst triggerBrowserUrlDownload = (url, fileName) => {\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n link.target = '_blank';\r\n link.rel = 'noopener';\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n};\r\n\r\nconst showDownloadToast = (message, color = 'info') => {\r\n try {\r\n const toast = proxy?.$vtk?.message?.toast || window.$vtk?.message?.toast;\r\n if (typeof toast === 'function') {\r\n toast(message, { color });\r\n return;\r\n }\r\n } catch (error) {\r\n console.warn('VtkImg: failed to show message toast', error);\r\n }\r\n\r\n if (color === 'error' || color === 'warning') {\r\n window.alert?.(message);\r\n }\r\n};\r\n\r\nconst getDownloadFileHandle = async (fileName, blob) => {\n if (isDownloadRiskWebView()) {\n return null;\n }\n\n if (typeof window.showSaveFilePicker !== 'function') {\n showDownloadToast('当前浏览器不支持选择保存目录,将使用默认下载方式。', 'warning');\n return null;\n }\n\r\n const extension = getImageFileExtension(blob);\r\n const mimeType = imageExtensionMimeMap[extension] || blob?.type || 'image/png';\r\n\r\n try {\r\n return await window.showSaveFilePicker({\r\n suggestedName: fileName,\r\n types: [\r\n {\r\n description: '图片文件',\r\n accept: {\r\n [mimeType]: [`.${extension}`],\r\n },\r\n },\r\n ],\r\n });\r\n } catch (error) {\r\n if (error?.name === 'AbortError') {\r\n showDownloadToast('已取消下载。');\r\n return false;\r\n }\r\n\r\n console.warn('VtkImg: showSaveFilePicker unavailable, fallback to browser download', error);\r\n return null;\r\n }\r\n};\r\n\r\nconst isImageResponse = (response, blob, url) => {\r\n const contentType = response.headers.get('content-type')?.split(';')[0]?.trim().toLowerCase();\r\n\r\n if (contentType?.startsWith('image/')) return true;\r\n if (blob.type?.startsWith('image/')) return true;\r\n\r\n const canFallbackToExtension = !contentType\r\n || contentType === 'application/octet-stream'\r\n || contentType === 'binary/octet-stream';\r\n if (!canFallbackToExtension) return false;\r\n\r\n try {\r\n const { pathname } = new URL(url, window.location.href);\r\n const extension = pathname.match(/\\.([a-z0-9]+)$/i)?.[1]?.toLowerCase();\r\n return Boolean(extension && imageExtensionMimeMap[extension]);\r\n } catch (error) {\r\n return false;\r\n }\r\n};\r\n\r\nconst fetchImageBlob = async (url) => {\r\n const response = await fetch(url, { mode: 'cors' });\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const blob = await response.blob();\r\n if (!isImageResponse(response, blob, url)) {\r\n const contentType = response.headers.get('content-type') || blob.type || 'unknown';\r\n throw new Error(`Response is not an image: ${contentType}`);\r\n }\r\n\r\n return blob;\r\n};\r\n\r\nconst fetchCurrentImageBlob = async () => {\r\n if (!currentImageDownloadUrl.value) {\r\n throw new Error('Image download url is empty');\r\n }\r\n\r\n return fetchImageBlob(currentImageDownloadUrl.value);\r\n};\r\n\r\nconst downloadCurrentImage = async () => {\r\n const downloadUrl = currentImageDownloadUrl.value;\r\n\r\n if (!downloadUrl) {\r\n showDownloadToast('暂无可下载的图片地址。', 'warning');\r\n return;\r\n }\r\n\r\n try {\n const blob = await fetchCurrentImageBlob();\n await validateImageBlob(blob);\n const fileName = getCurrentImageFileName(blob);\n const fileHandle = await getDownloadFileHandle(fileName, blob);\n if (fileHandle === false) return;\n\r\n if (fileHandle) {\r\n const writable = await fileHandle.createWritable();\r\n await writable.write(blob);\r\n await writable.close();\r\n showDownloadToast('图片下载成功。', 'success');\r\n return;\r\n }\n\n triggerBrowserDownload(blob, fileName);\n if (isDownloadRiskWebView()) {\n showDownloadToast('已使用兼容方式下载图片,如文件仍不可用,请在系统浏览器中打开后保存。');\n return;\n }\n\n showDownloadToast('图片已开始下载。', 'success');\n } catch (error) {\n const failureReason = getDownloadFailureReason(error);\n console.error(`下载图片失败:${failureReason}`, error);\n triggerBrowserUrlDownload(downloadUrl, getCurrentImageFileName());\n if (isDownloadRiskWebView()) {\n showDownloadToast(`下载失败:${failureReason}。已打开原图,请在系统浏览器中保存。`, 'warning');\n return;\n }\n\n showDownloadToast(`下载失败:${failureReason}。已切换为浏览器下载。`, 'warning');\n }\n};\n\r\nconst resetImageTransform = () => {\r\n imageRotation.value = 0;\r\n imageScale.value = 1;\r\n imageTranslateX.value = 0;\r\n imageTranslateY.value = 0;\r\n imageDragState.value = null;\r\n};\r\n\r\n// 监听预览状态变化\r\nwatch(showPreview, (newVal) => {\r\n if (newVal) {\r\n // 打开预览时重置旋转角度和当前索引\r\n resetImageTransform();\r\n currentIndex.value = props.index;\r\n }\r\n});\r\n\r\n// 打开预览\r\nconst openPreview = () => {\r\n if (props.preview) {\r\n showPreview.value = true;\r\n }\r\n};\r\n\r\n// 关闭预览\r\nconst closePreview = () => {\r\n showPreview.value = false;\r\n};\r\n\r\n// 上一张图片\r\nconst prevImage = () => {\r\n if (hasPrev.value) {\r\n currentIndex.value--;\r\n resetImageTransform();\r\n }\r\n};\r\n\r\n// 下一张图片\r\nconst nextImage = () => {\r\n if (hasNext.value) {\r\n currentIndex.value++;\r\n resetImageTransform();\r\n }\r\n};\r\n\r\n// 旋转图片\r\nconst rotateImage = (degrees) => {\r\n imageRotation.value += degrees;\r\n};\r\n\r\nconst zoomImage = (step) => {\r\n const nextScale = Number((imageScale.value + step).toFixed(2));\r\n imageScale.value = Math.min(3, Math.max(0.2, nextScale));\r\n if (imageScale.value <= 1) {\r\n imageTranslateX.value = 0;\r\n imageTranslateY.value = 0;\r\n }\r\n};\r\n\r\nconst handleImageWheel = (event) => {\r\n zoomImage(event.deltaY < 0 ? 0.2 : -0.2);\r\n};\r\n\r\nconst startImageDrag = (event) => {\r\n if (imageScale.value <= 1) return;\r\n event.preventDefault();\r\n const target = event.currentTarget;\r\n imageDragState.value = {\r\n pointerId: event.pointerId,\r\n startX: event.clientX,\r\n startY: event.clientY,\r\n translateX: imageTranslateX.value,\r\n translateY: imageTranslateY.value,\r\n };\r\n target.setPointerCapture?.(event.pointerId);\r\n target.addEventListener('pointermove', moveImageDrag);\r\n target.addEventListener('pointerup', endImageDrag, { once: true });\r\n target.addEventListener('pointercancel', endImageDrag, { once: true });\r\n};\r\n\r\nconst moveImageDrag = (event) => {\r\n const state = imageDragState.value;\r\n if (!state || state.pointerId !== event.pointerId) return;\r\n imageTranslateX.value = state.translateX + event.clientX - state.startX;\r\n imageTranslateY.value = state.translateY + event.clientY - state.startY;\r\n};\r\n\r\nconst endImageDrag = (event) => {\r\n event.currentTarget?.releasePointerCapture?.(event.pointerId);\r\n event.currentTarget?.removeEventListener('pointermove', moveImageDrag);\r\n imageDragState.value = null;\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-img-container {\r\n position: relative;\r\n display: inline-block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.vtk-img-card {\r\n height: 100%;\r\n}\r\n\r\n.vtk-img-card--preview {\r\n cursor: pointer;\r\n transition: transform 0.2s ease-in-out;\r\n}\r\n\r\n.vtk-img-card--preview:hover {\r\n transform: translateY(-5px);\r\n}\r\n\r\n.vtk-img {\r\n width: 100%;\r\n}\r\n\r\n.vtk-img-info {\r\n padding: 0;\r\n}\r\n\r\n.vtk-img-title {\r\n word-break: break-word;\r\n}\r\n\r\n.vtk-img-description {\r\n word-break: break-word;\r\n}\r\n\r\n/* 图片查看器样式 */\r\n.image-viewer-card {\r\n background-color: rgba(0, 0, 0, 0.3);\r\n color: white;\r\n}\r\n\r\n.image-viewer-content {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: calc(100vh - 150px);\r\n position: relative;\r\n}\r\n\r\n.image-container {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n overflow: hidden;\r\n}\r\n\r\n.viewer-image {\r\n max-width: 90%;\r\n max-height: 80vh;\r\n transform-origin: center center;\r\n transition: transform 0.3s ease;\r\n user-select: none;\r\n touch-action: none;\r\n}\r\n\r\n.viewer-image--draggable {\r\n cursor: grab;\r\n}\r\n\r\n.viewer-image--draggable:active {\r\n cursor: grabbing;\r\n}\r\n\r\n.nav-button {\r\n position: absolute;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n z-index: 10;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n color: white;\r\n width: 50px;\r\n height: 50px;\r\n}\r\n\r\n.prev-button {\r\n left: 20px;\r\n}\r\n\r\n.next-button {\r\n right: 20px;\r\n}\r\n\r\n.image-info {\r\n padding: 20px;\r\n background-color: rgba(0, 0, 0, 0.7);\r\n}\r\n\r\n.image-info p {\r\n margin: 5px 0;\r\n}\r\n\r\n:deep(.v-img__img) {\r\n background: v-bind('props.error') no-repeat center;\r\n background-size: cover;\r\n}\r\n\r\n:deep(.v-img__placeholder) {\r\n filter: blur(0px);\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"m_pagination\">\r\n <VRow v-if=\"pageDatas.rowCount > 0\" class=\"pagination box\" align=\"center\">\r\n <span class=\"page-total d-none d-md-flex align-center\">共{{ pageDatas.rowCount }}条</span>\r\n <VSelect\r\n v-model=\"pagination.limit\"\r\n :items=\"pageSizeObjs\"\r\n variant=\"outlined\"\r\n density=\"compact\"\r\n :menu-props=\"{ offsetY: true }\"\r\n hide-details\r\n class=\"page-select ml-2 d-none d-md-flex\"\r\n @update:model-value=\"pageSizeChange()\"\r\n />\r\n <span class=\"my-2\">\r\n <v-pagination\r\n v-model=\"pageDatas.pageno\"\r\n :total-visible=\"5\"\r\n :length=\"pageDatas.pageCount\"\r\n size=\"small\"\r\n @update:model-value=\"pageChange()\"\r\n />\r\n </span>\r\n <span class=\"page-total ml-3 d-none d-md-flex align-center\">到</span>\r\n <VTextField\r\n v-model=\"pagination.pageno\"\r\n variant=\"outlined\"\r\n density=\"compact\"\r\n hide-details\r\n class=\"page-go ml-2 d-none d-md-flex\"\r\n @keyup.enter=\"toPage()\"\r\n />\r\n <span class=\"page-total ml-2 d-none d-md-flex align-center\">页</span>\r\n </VRow>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, reactive, computed, watch, onMounted } from 'vue';\r\n\r\nconst props = defineProps({\r\n pageData: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n pageSizes: {\r\n type: Array,\r\n default: () => [10, 20, 30]\r\n }\r\n});\r\n\r\nconst emit = defineEmits(['pageChange']);\r\n\r\nconst pagination = reactive({\r\n pageno: 1,\r\n limit: 10\r\n});\r\n\r\nconst pageSizeObjs = ref([]);\r\nconst pageDatas = ref({ ...props.pageData });\r\n\r\nconst paginationChange = computed(() => pageDatas.value.pageno);\r\n\r\nwatch(paginationChange, () => {\r\n pagination.pageno = pageDatas.value.pageno;\r\n});\r\n\r\nwatch(() => props.pageData, (newVal) => {\r\n pageDatas.value = { ...newVal };\r\n if (newVal.rowCount < 1 && newVal.rows > 0) {\r\n pageDatas.value.pageno = newVal.pageno - 1;\r\n pageChange();\r\n }\r\n}, { deep: true });\r\n\r\nonMounted(() => {\r\n pageSizeFormat();\r\n});\r\n\r\nconst toPage = () => {\r\n const re = /^[0-9]+$/;\r\n if (re.test(pagination.pageno) && pagination.pageno <= pageDatas.value.pageCount) {\r\n pageDatas.value.pageno = parseInt(pagination.pageno);\r\n pageChange();\r\n } else {\r\n pagination.pageno = pageDatas.value.pageno;\r\n }\r\n};\r\n\r\nconst pageSizeChange = () => {\r\n pageDatas.value.pageCount = 1;\r\n pageChange();\r\n};\r\n\r\nconst pageSizeFormat = () => {\r\n const temp = props.pageSizes;\r\n temp.forEach((value) => {\r\n const obj = {\r\n title: value + \"条/页\",\r\n value: value\r\n };\r\n pageSizeObjs.value.push(obj);\r\n });\r\n pagination.limit = temp[0];\r\n};\r\n\r\nconst pageChange = () => {\r\n const page = {\r\n pageno: pageDatas.value.pageno,\r\n limit: pagination.limit\r\n };\r\n emit('pageChange', page);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.mt-1 {\r\n margin-top: 11px !important;\r\n}\r\n.my-5 {\r\n margin-top: 20px !important;\r\n margin-bottom: 20px !important;\r\n}\r\n.m_pagination {\r\n width: 100%;\r\n min-height: 52px;\r\n display: flex;\r\n align-items: center;\r\n .box {\r\n position: absolute;\r\n right: 32px;\r\n }\r\n}\r\n.page-total {\r\n display: flex;\r\n align-items: center;\r\n height: 36px;\r\n font-size: 13px;\r\n padding-top: 4px;\r\n}\r\n.page-select {\r\n padding-top: 4px;\r\n max-width: 115px;\r\n :deep(.v-input__control) {\r\n min-height: 36px !important;\r\n height: 36px !important;\r\n }\r\n :deep(.v-field) {\r\n height: 36px !important;\r\n font-size: 13px !important;\r\n }\r\n :deep(.v-field__input) {\r\n padding-top: 6px !important;\r\n padding-bottom: 6px !important;\r\n min-height: 36px !important;\r\n }\r\n}\r\n.page-go {\r\n max-width: 75px;\r\n :deep(.v-input__control) {\r\n min-height: 36px !important;\r\n height: 36px !important;\r\n }\r\n :deep(.v-field) {\r\n height: 36px !important;\r\n font-size: 13px !important;\r\n }\r\n :deep(.v-field__input) {\r\n padding-top: 6px !important;\r\n padding-bottom: 6px !important;\r\n min-height: 36px !important;\r\n }\r\n}\r\n\r\n// 分页按钮缩小\r\n.my-2 {\r\n :deep(.v-pagination__item),\r\n :deep(.v-pagination__prev),\r\n :deep(.v-pagination__next) {\r\n min-width: 32px !important;\r\n height: 36px !important;\r\n font-size: 13px !important;\r\n }\r\n}\r\n</style>","<template>\r\n <div class=\"vtk-pdf-container\">\r\n <VCard \r\n :class=\"['vtk-pdf-card', { 'vtk-pdf-card--preview': preview }]\"\r\n @click=\"openPreview\"\r\n >\r\n <!-- PDF封面或默认图标 -->\r\n <div class=\"vtk-pdf-cover\" :style=\"{ aspectRatio: aspectRatio }\">\r\n <VIcon size=\"48\" color=\"red\">mdi-file-pdf-box</VIcon>\r\n <div class=\"vtk-pdf-label\">PDF</div>\r\n </div>\r\n \r\n <!-- PDF标题和描述 -->\r\n <div class=\"vtk-pdf-info\" v-if=\"showTitle || showDescription\">\r\n <VCardTitle v-if=\"showTitle\" class=\"vtk-pdf-title text-subtitle-2 pa-2\">\r\n {{ title }}\r\n </VCardTitle>\r\n <v-card-subtitle v-if=\"showDescription\" class=\"vtk-pdf-description text-caption pa-2\">\r\n {{ description }}\r\n </v-card-subtitle>\r\n </div>\r\n </VCard>\r\n \r\n <!-- 使用 v-dialog 的PDF预览 -->\r\n <VDialog \r\n v-model=\"showPreview\" \r\n max-width=\"90%\" \r\n fullscreen\r\n @click:outside=\"closePreview\"\r\n >\r\n <VCard class=\"pdf-viewer-card\">\r\n <v-toolbar dark color=\"red darken-1\">\r\n <VBtn icon dark @click=\"closePreview\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n <v-toolbar-title>{{ title }}</v-toolbar-title>\r\n <VSpacer></VSpacer>\r\n <v-toolbar-items>\r\n <VBtn icon dark @click=\"downloadPdf\">\r\n <VIcon>mdi-download</VIcon>\r\n </VBtn>\r\n </v-toolbar-items>\r\n </v-toolbar>\r\n \r\n <div class=\"pdf-viewer-content\">\r\n <div class=\"pdf-container\" ref=\"pdfContainer\">\r\n <!-- PDF内容将通过PDF.js渲染 -->\r\n <div id=\"pdf-viewer\"></div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"pdf-viewer-footer\" v-if=\"pdfLoaded\">\r\n <VRow align=\"center\" justify=\"center\">\r\n <VCol cols=\"12\" sm=\"6\" class=\"d-flex justify-center\">\r\n <VBtn icon @click=\"prevPage\" :disabled=\"currentPage <= 1\">\r\n <VIcon>mdi-chevron-left</VIcon>\r\n </VBtn>\r\n <div class=\"mx-4\">\r\n <span>第 {{ currentPage }} 页 / 共 {{ pageCount }} 页</span>\r\n </div>\r\n <VBtn icon @click=\"nextPage\" :disabled=\"currentPage >= pageCount\">\r\n <VIcon>mdi-chevron-right</VIcon>\r\n </VBtn>\r\n </VCol>\r\n <VCol cols=\"12\" sm=\"6\" class=\"d-flex justify-center\">\r\n <VSlider\r\n v-model=\"currentPage\"\r\n :min=\"1\"\r\n :max=\"pageCount\"\r\n hide-details\r\n class=\"mx-4\"\r\n ></VSlider>\r\n </VCol>\r\n </VRow>\r\n </div>\r\n \r\n <div class=\"pdf-loading\" v-if=\"loading\">\r\n <v-progress-circular indeterminate color=\"red\"></v-progress-circular>\r\n <p class=\"mt-2\">正在加载PDF...</p>\r\n </div>\r\n </VCard>\r\n </VDialog>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, onMounted, onBeforeUnmount } from 'vue';\r\n// import * as pdfjsLib from 'pdfjs-dist';\r\n// 注意:在实际项目中,您需要安装 pdfjs-dist 库\r\n// npm install pdfjs-dist\r\n// import * as pdfjsLib from 'pdfjs-dist';\r\n\r\ndefineOptions({\r\n name: 'VtkPdf',\r\n inheritAttrs: true\r\n});\r\n\r\nconst props = defineProps({\r\n src: {\r\n type: String,\r\n default: null,\r\n },\r\n preview: {\r\n type: Boolean,\r\n default: true\r\n },\r\n title: {\r\n type: String,\r\n default: ''\r\n },\r\n description: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否显示标题\r\n showTitle: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 是否显示描述\r\n showDescription: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 封面宽高比\r\n aspectRatio: {\r\n type: [String, Number],\r\n default: 16/9\r\n }\r\n});\r\n\r\n// 预览状态\r\nconst showPreview = ref(false);\r\n// PDF相关状态\r\nconst loading = ref(false);\r\nconst pdfLoaded = ref(false);\r\nconst currentPage = ref(1);\r\nconst pageCount = ref(0);\r\nconst pdfContainer = ref(null);\r\n\r\n// PDF对象(实际使用时需要引入pdfjsLib)\r\nlet pdfDoc = null;\r\n\r\n// 使用计算属性处理带token的URL\r\nconst srcWithToken = computed(() => {\r\n if (!props.src) return props.src;\r\n \r\n try {\r\n // 首先尝试使用 $vtk.storage\r\n if (window.$vtk && typeof window.$vtk.storage?.get === 'function') {\r\n const token = window.$vtk.storage.get('_mis_acis_token');\r\n return token ? `${props.src}?stoken=${token}` : props.src;\r\n }\r\n // 如果 $vtk 不存在,尝试从 localStorage 获取 token\r\n else {\r\n const token = localStorage.getItem('_mis_acis_token');\r\n return token ? `${props.src}?stoken=${token}` : props.src;\r\n }\r\n } catch (error) {\r\n // 发生错误时返回原始src\r\n console.warn('VtkPdf: Failed to get token, using src without token', error);\r\n return props.src;\r\n }\r\n});\r\n\r\n// 打开预览\r\nconst openPreview = () => {\r\n if (props.preview) {\r\n showPreview.value = true;\r\n // 延迟加载PDF以确保DOM已准备好\r\n setTimeout(() => {\r\n loadPdf();\r\n }, 300);\r\n }\r\n};\r\n\r\n// 关闭预览\r\nconst closePreview = () => {\r\n showPreview.value = false;\r\n // 清理PDF对象\r\n pdfDoc = null;\r\n pdfLoaded.value = false;\r\n currentPage.value = 1;\r\n pageCount.value = 0;\r\n};\r\n\r\n// 加载PDF(示例实现,实际使用需要PDF.js库)\r\nconst loadPdf = async () => {\r\n if (!srcWithToken.value) return;\r\n \r\n loading.value = true;\r\n \r\n try {\r\n // 模拟PDF加载(实际实现需要使用PDF.js)\r\n /*\r\n // 实际使用时的代码示例:\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = '//cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.worker.min.js';\r\n \r\n const loadingTask = pdfjsLib.getDocument(srcWithToken.value);\r\n pdfDoc = await loadingTask.promise;\r\n pageCount.value = pdfDoc.numPages;\r\n pdfLoaded.value = true;\r\n \r\n // 渲染第一页\r\n renderPage(currentPage.value);\r\n */\r\n \r\n // 模拟加载过程\r\n await new Promise(resolve => setTimeout(resolve, 1000));\r\n pageCount.value = 10; // 模拟10页PDF\r\n pdfLoaded.value = true;\r\n } catch (error) {\r\n console.error('加载PDF失败:', error);\r\n } finally {\r\n loading.value = false;\r\n }\r\n};\r\n\r\n// 渲染PDF页面(示例实现)\r\nconst renderPage = async (pageNum) => {\r\n if (!pdfDoc || !pdfContainer.value) return;\r\n \r\n try {\r\n /*\r\n // 实际使用时的代码示例:\r\n const page = await pdfDoc.getPage(pageNum);\r\n const viewport = page.getViewport({ scale: 1.5 });\r\n \r\n // 准备canvas\r\n const canvas = document.createElement('canvas');\r\n const context = canvas.getContext('2d');\r\n canvas.height = viewport.height;\r\n canvas.width = viewport.width;\r\n \r\n // 清空容器\r\n pdfContainer.value.innerHTML = '';\r\n pdfContainer.value.appendChild(canvas);\r\n \r\n // 渲染页面\r\n const renderContext = {\r\n canvasContext: context,\r\n viewport: viewport\r\n };\r\n await page.render(renderContext).promise;\r\n */\r\n } catch (error) {\r\n console.error('渲染PDF页面失败:', error);\r\n }\r\n};\r\n\r\n// 上一页\r\nconst prevPage = () => {\r\n if (currentPage.value > 1) {\r\n currentPage.value--;\r\n renderPage(currentPage.value);\r\n }\r\n};\r\n\r\n// 下一页\r\nconst nextPage = () => {\r\n if (currentPage.value < pageCount.value) {\r\n currentPage.value++;\r\n renderPage(currentPage.value);\r\n }\r\n};\r\n\r\n// 下载PDF\r\nconst downloadPdf = async () => {\r\n if (!srcWithToken.value) return;\r\n \r\n try {\r\n // 获取PDF文件的二进制数据\r\n const response = await fetch(srcWithToken.value);\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n \r\n const blob = await response.blob();\r\n const fileName = props.title && props.title.trim() !== '' \r\n ? `${props.title}.pdf` \r\n : 'document.pdf';\r\n \r\n // 创建下载链接\r\n const url = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n \r\n // 清理\r\n document.body.removeChild(link);\r\n window.URL.revokeObjectURL(url);\r\n } catch (error) {\r\n console.error('下载PDF失败:', error);\r\n // 备用方案:在新窗口打开\r\n window.open(srcWithToken.value, '_blank');\r\n }\r\n};\r\n\r\n// 监听页码变化\r\nconst handlePageChange = (newPage) => {\r\n if (newPage >= 1 && newPage <= pageCount.value) {\r\n renderPage(newPage);\r\n }\r\n};\r\n\r\n// 监听 currentPage 变化\r\n// 在实际实现中,您需要使用 watch 监听 currentPage 变化\r\n// watch(currentPage, handlePageChange);\r\n\r\n// 组件销毁前清理\r\nonBeforeUnmount(() => {\r\n pdfDoc = null;\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-pdf-container {\r\n position: relative;\r\n display: inline-block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.vtk-pdf-card {\r\n height: 100%;\r\n}\r\n\r\n.vtk-pdf-card--preview {\r\n cursor: pointer;\r\n transition: transform 0.2s ease-in-out;\r\n}\r\n\r\n.vtk-pdf-card--preview:hover {\r\n transform: translateY(-5px);\r\n}\r\n\r\n.vtk-pdf-cover {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: #f5f5f5;\r\n border: 1px solid #ddd;\r\n width: 100%;\r\n}\r\n\r\n.vtk-pdf-label {\r\n margin-top: 8px;\r\n font-weight: 500;\r\n color: #666;\r\n}\r\n\r\n.vtk-pdf-info {\r\n padding: 0;\r\n}\r\n\r\n.vtk-pdf-title {\r\n word-break: break-word;\r\n}\r\n\r\n.vtk-pdf-description {\r\n word-break: break-word;\r\n}\r\n\r\n/* PDF查看器样式 */\r\n.pdf-viewer-card {\r\n background-color: #e0e0e0;\r\n color: #333;\r\n}\r\n\r\n.pdf-viewer-content {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: calc(100vh - 150px);\r\n position: relative;\r\n background-color: #555;\r\n overflow: auto;\r\n}\r\n\r\n.pdf-container {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n#pdf-viewer {\r\n max-width: 100%;\r\n max-height: 100%;\r\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\r\n background-color: white;\r\n /* 实际PDF内容将在此处渲染 */\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 500px;\r\n min-width: 400px;\r\n}\r\n\r\n.pdf-viewer-footer {\r\n padding: 16px;\r\n background-color: #f5f5f5;\r\n border-top: 1px solid #ddd;\r\n}\r\n\r\n.pdf-loading {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: rgba(255, 255, 255, 0.9);\r\n padding: 20px;\r\n border-radius: 8px;\r\n z-index: 100;\r\n}\r\n</style>","// composables/useMixins.js\r\nimport { ref, reactive } from 'vue'\r\nimport Request from '../commons/request.js'\r\nimport Message from '../components/message/index.js'\r\nimport storage from '../commons/storage.js'\r\n\r\n/**\r\n * 通用 mixins composable\r\n * @param {Object} urlConfig - URL 配置对象\r\n * @returns {Object} 包含所有状态和方法的对象\r\n */\r\nexport function useMixins(urlConfig = {}) {\r\n // 响应式数据\r\n const queryParam = reactive({})\r\n const desserts = ref([])\r\n const loading = ref(false)\r\n const superQueryParams = ref('')\r\n const page = reactive({\r\n pageno: 1,\r\n limit: 10\r\n })\r\n const pageData = ref({})\r\n const sumup = ref({})\r\n const pageDataCopy = ref([])\r\n const overlay = ref(false)\r\n const user = ref({})\r\n\r\n // URL 配置\r\n const url = reactive(urlConfig)\r\n\r\n /**\r\n * 获取查询参数\r\n * @returns {Object} 查询参数对象\r\n */\r\n const getQueryParams = () => {\r\n user.value = storage.get('_mis_acis_users')\r\n if (!queryParam.areaCode) {\r\n queryParam.areaCode = user.value?.areacode\r\n }\r\n const codex = Object.assign({}, queryParam)\r\n const params = {\r\n pageno: page.pageno,\r\n limit: page.limit,\r\n codex: codex\r\n }\r\n return params\r\n }\r\n\r\n /**\r\n * 加载页面数据\r\n */\r\n const loadPage = () => {\r\n if (!url.list) {\r\n Message.toast('请先设置url.list属性', { color: 'warning' })\r\n return\r\n }\r\n const params = getQueryParams()\r\n loading.value = true\r\n\r\n // 兼容处理 vtk 对象\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.show()\r\n }\r\n\r\n Request.postJson(url.list, params)\r\n .then((res) => {\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n\r\n if (res.meta.success || res.data) {\r\n desserts.value = res.data?.rows || []\r\n pageData.value = res.data\r\n sumup.value = res.data.sumup ? res.data.sumup : {}\r\n pageDataCopy.value = res.data\r\n }\r\n loading.value = false\r\n })\r\n .catch((error) => {\r\n console.error('加载页面数据失败:', error)\r\n loading.value = false\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 搜索查询\r\n */\r\n const searchQuery = () => {\r\n page.pageno = 1\r\n page.limit ??= 10\r\n loadPage()\r\n }\r\n\r\n /**\r\n * 分页变化处理\r\n * @param {Object} pageInfo - 分页信息\r\n */\r\n const getListPage = (pageInfo) => {\r\n page.pageno = pageInfo.pageno\r\n page.limit = pageInfo.limit\r\n loadPage()\r\n }\r\n\r\n /**\r\n * 删除项\r\n * @param {string|number} id - 要删除的项ID\r\n * @param {string} text - 确认提示文本\r\n */\r\n const deleteItem = (id, text) => {\r\n if (!url.delete) {\r\n Message.toast('请设置url.delete属性!', { color: 'warning' })\r\n return\r\n }\r\n\r\n Message.confirm(\r\n { title: '确认删除', text: text ? text : '是否删除?' },\r\n (result) => {\r\n if (result) {\r\n Request.getForm(url.delete, { id: id })\r\n .then((res) => {\r\n if (res.meta.success) {\r\n Message.toast('删除成功', { color: 'success' })\r\n loadPage()\r\n } else {\r\n Message.toast('删除失败', { color: 'warning' })\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('删除失败:', error)\r\n Message.toast('删除失败', { color: 'warning' })\r\n })\r\n }\r\n }\r\n )\r\n }\r\n\r\n /**\r\n * 复制项\r\n * @param {string|number} id - 要复制的项ID\r\n * @param {string} text - 确认提示文本\r\n */\r\n const copyItem = (id, text) => {\r\n if (!url.copy) {\r\n Message.toast('请设置url.copy!', { color: 'warning' })\r\n return\r\n }\r\n\r\n Message.confirm(\r\n { title: '拷贝', text: text ? text : '是否确认拷贝当前数据?' },\r\n (result) => {\r\n if (result) {\r\n Request.getForm(url.copy, { id: id })\r\n .then((res) => {\r\n if (res.meta.success) {\r\n Message.toast('拷贝成功', { color: 'success' })\r\n loadPage()\r\n } else {\r\n Message.toast('拷贝失败', { color: 'warning' })\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('拷贝失败:', error)\r\n Message.toast('拷贝失败', { color: 'warning' })\r\n })\r\n }\r\n }\r\n )\r\n }\r\n\r\n /**\r\n * 编辑项\r\n * @param {Object} record - 要编辑的记录\r\n * @param {Object} modalFormRef - 模态框引用\r\n */\r\n const edit = (record, modalFormRef) => {\r\n if (modalFormRef?.value) {\r\n modalFormRef.value.edit(record)\r\n }\r\n }\r\n\r\n /**\r\n * 添加新项\r\n * @param {Object} modalFormRef - 模态框引用\r\n */\r\n const add = (modalFormRef) => {\r\n if (modalFormRef?.value) {\r\n modalFormRef.value.add()\r\n }\r\n }\r\n\r\n /**\r\n * 模态框确认回调\r\n */\r\n const modalFormOk = () => {\r\n loadPage()\r\n }\r\n\r\n /**\r\n * 导出数据\r\n */\r\n const expData = () => {\r\n overlay.value = true\r\n\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.show()\r\n }\r\n\r\n const params = getQueryParams()\r\n Request.exp(url.exp, params)\r\n .then((res) => {\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n\r\n if (res) {\r\n const disposition = res.headers['content-disposition']\r\n const filename = decodeURI(\r\n disposition.substring(\r\n disposition.indexOf('filename=') + 9,\r\n disposition.length\r\n )\r\n )\r\n const blob = new Blob([res.data], {\r\n type: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\r\n })\r\n\r\n if (window.navigator.msSaveOrOpenBlob) {\r\n navigator.msSaveBlob(blob)\r\n } else {\r\n const link = document.createElement('a')\r\n link.style.display = 'none'\r\n link.href = URL.createObjectURL(blob)\r\n link.download = filename\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n }\r\n }\r\n overlay.value = false\r\n })\r\n .catch((error) => {\r\n console.error('导出数据失败:', error)\r\n overlay.value = false\r\n if (window.$vtk?.message?.loading) {\r\n window.$vtk.message.loading.hide()\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 重置查询参数\r\n */\r\n const resetQueryParams = () => {\r\n Object.keys(queryParam).forEach(key => {\r\n delete queryParam[key]\r\n })\r\n }\r\n\r\n /**\r\n * 重置分页\r\n */\r\n const resetPage = () => {\r\n page.pageno = 1\r\n page.limit = 10\r\n }\r\n\r\n /**\r\n * 更新 URL 配置\r\n * @param {Object} newUrlConfig - 新的 URL 配置\r\n */\r\n const updateUrlConfig = (newUrlConfig) => {\r\n Object.assign(url, newUrlConfig)\r\n }\r\n\r\n // 返回所有状态和方法\r\n return {\r\n // 响应式数据\r\n queryParam,\r\n desserts,\r\n loading,\r\n superQueryParams,\r\n page,\r\n pageData,\r\n sumup,\r\n pageDataCopy,\r\n overlay,\r\n user,\r\n url,\r\n\r\n // 方法\r\n getQueryParams,\r\n loadPage,\r\n searchQuery,\r\n getListPage,\r\n deleteItem,\r\n copyItem,\r\n edit,\r\n add,\r\n modalFormOk,\r\n expData,\r\n resetQueryParams,\r\n resetPage,\r\n updateUrlConfig\r\n }\r\n}\r\n\r\n// 默认导出保持向后兼容\r\nexport default useMixins","<template>\r\n\t<VContainer fluid class=\"vtk-height pa-0\">\r\n\t\t<VTabs v-model=\"examType\" bg-color=\"transparent\" height=\"38\" style=\"width: 100%\">\r\n\t\t\t<VTab @click=\"examAll()\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-clipboard-arrow-up</VIcon>全部</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"list\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-star-circle</VIcon>审核</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"tip\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-hand-heart</VIcon>实施</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"tip\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-comment-minus</VIcon>评价</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VTab @click=\"tip\">\r\n\t\t\t\t<span><VIcon size=\"16\" class=\"mr-1\">mdi-credit-card-check</VIcon>支付</span>\r\n\t\t\t</VTab>\r\n\t\t\t<VSpacer />\r\n\t\t</VTabs>\r\n\t\t<VCard elevation=\"0\" style=\"min-height: calc(100% - 38px)\">\r\n\t\t\t<VCardTitle style=\"height: 88px\">\r\n\t\t\t\t<VMenu v-if=\"examType == '0' && (expShow || user.grole >= 2)\" offset-y :close-on-content-click=\"false\" location=\"bottom\">\r\n\t\t\t\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t\t\t\t<VBtn @click=\"exv\" v-bind=\"props\" class=\"bg-orange text-white mr-3\" elevation=\"0\">\r\n\t\t\t\t\t\t\t<VIcon>mdi-export-variant</VIcon> 导出\r\n\t\t\t\t\t\t</VBtn>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<VCard class=\"pa-3\" width=\"300\">\r\n\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t<p class=\"mb-2 font-weight-bold\">公共字段</p>\r\n\t\t\t\t\t\t\t<p class=\"text-caption\">\r\n\t\t\t\t\t\t\t\t服务事项\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t所属区县\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t所属镇街\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t所属社区\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t申请人证件号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t申请人姓名\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t残疾人证号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t性别\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t申请人手机号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t补助金额\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t开户银行\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t银行卡号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t收款人姓名\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t收款人证件号\r\n\t\t\t\t\t\t\t\t<span class=\"text-grey mx-1\">|</span>\r\n\t\t\t\t\t\t\t\t状态\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t<VDivider />\r\n\t\t\t\t\t\t\t<div v-if=\"queryParam.servState == '1' && projName\">\r\n\t\t\t\t\t\t\t\t<VCardTitle class=\"pa-0 text-body-1 mb-2 pt-3\">\r\n\t\t\t\t\t\t\t\t\t<VCheckbox @update:model-value=\"chkAll\" v-model=\"select\" class=\"mt-n1\" hide-details>\r\n\t\t\t\t\t\t\t\t\t\t<template v-slot:append>\r\n\t\t\t\t\t\t\t\t\t\t\t<VIcon class=\"active\" style=\"display: none\" size=\"18\">mdi-check-circle</VIcon>\r\n\t\t\t\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t\t\t</VCheckbox>\r\n\t\t\t\t\t\t\t\t\t<span class=\"font-weight-bold ml-n2\">拓展字段</span>\r\n\t\t\t\t\t\t\t\t\t<VSpacer />\r\n\t\t\t\t\t\t\t\t</VCardTitle>\r\n\t\t\t\t\t\t\t\t<p v-if=\"formArr?.length > 0\" class=\"mb-0 expBox\">\r\n\t\t\t\t\t\t\t\t\t<VCheckbox\r\n\t\t\t\t\t\t\t\t\t\tv-for=\"(item, index) in formArr\"\r\n\t\t\t\t\t\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\t\t\t\t\t\tv-model=\"expArr\"\r\n\t\t\t\t\t\t\t\t\t\t:label=\"item.label\"\r\n\t\t\t\t\t\t\t\t\t\t:value=\"{ name: item.name, valu: `${item.label}${item.valu && item.valu.includes('/') && item.valu.includes(':') ? `(${item.valu})` : ''}` }\"\r\n\t\t\t\t\t\t\t\t\t\tclass=\"mt-2\"\r\n\t\t\t\t\t\t\t\t\t\tmultiple\r\n\t\t\t\t\t\t\t\t\t\thide-details>\r\n\t\t\t\t\t\t\t\t\t\t<template v-slot:append>\r\n\t\t\t\t\t\t\t\t\t\t\t<VIcon class=\"active\" style=\"display: none\" size=\"18\">mdi-check-circle</VIcon>\r\n\t\t\t\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t\t\t</VCheckbox>\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<p v-else class=\"text-red text-body-2 mb-2\">{{ projTip }}</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div v-else>\r\n\t\t\t\t\t\t\t\t<p class=\"mb-3 pt-3 font-weight-bold\">导出提示</p>\r\n\t\t\t\t\t\t\t\t<p :class=\"queryParam.servState == '1' ? 'text-green' : 'text-red'\" class=\"mb-3 text-body-2\">\r\n\t\t\t\t\t\t\t\t\t<VIcon size=\"20\" :color=\"queryParam.servState == '1' ? 'green' : 'red'\">{{ queryParam.servState == \"1\" ? \"mdi-progress-check\" : \"mdi-progress-close\" }}</VIcon>\r\n\t\t\t\t\t\t\t\t\t导出数据仅限已服务信息\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t<p class=\"mb-2 text-body-2\" :class=\"projName ? 'text-green' : 'text-red'\">\r\n\t\t\t\t\t\t\t\t\t<VIcon size=\"20\" :color=\"projName ? 'green' : 'red'\">{{ projName ? \"mdi-progress-check\" : \"mdi-progress-close\" }}</VIcon>\r\n\t\t\t\t\t\t\t\t\t至少选择一个服务事项导出\r\n\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<VBtn @click=\"exp\" :disabled=\"!(projName && queryParam.servState == '1')\" elevation=\"0\" color=\"primary\" class=\"vtk-width mt-3\" size=\"small\">确认导出</VBtn>\r\n\t\t\t\t\t</VCard>\r\n\t\t\t\t</VMenu>\r\n\t\t\t\t<VSpacer />\r\n\t\t\t\t<vtk-search v-model=\"queryParam\" @search=\"searchQuery\" placeholder=\"输入姓名/身份证查询\" :styles=\"'width:320px'\">\r\n\t\t\t\t\t<VTextField @click=\"searchProj\" v-model=\"projName\" :title=\"projName\" clearable readonly variant=\"outlined\" placeholder=\"服务事项\" density=\"compact\" hide-details class=\"my-3\"></VTextField>\r\n\t\t\t\t\t<vtk-area-tabs v-model=\"queryParam.areaCode\" :styles=\"'width:100%'\" />\r\n\t\t\t\t\t<div v-if=\"examType == 0\" style=\"width: 400px\">\r\n\t\t\t\t\t\t<vtk-select v-model=\"queryParam.servState\" @change=\"searchQuery\" placeholder=\"服务状态\" list=\"0:服务中/1:已服务\" class=\"mt-3 d-inline-block mr-3 mb-3\" style=\"width: calc(50% - 6px)\" hide-details density=\"compact\" variant=\"outlined\" clearable></vtk-select>\r\n\t\t\t\t\t\t<vtk-select v-model=\"queryParam.rateState\" @change=\"searchQuery\" placeholder=\"是否评价\" list=\"0:未评价/1:已评价\" class=\"mt-3 d-inline-block\" style=\"width: calc(50% - 6px)\" hide-details density=\"compact\" variant=\"outlined\" clearable></vtk-select>\r\n\t\t\t\t\t\t<VMenu v-model=\"menu\" :close-on-content-click=\"false\" transition=\"scale-transition\" location=\"bottom\" max-width=\"290px\" min-width=\"auto\">\r\n\t\t\t\t\t\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t\t\t\t\t\t<VTextField v-model=\"queryParam.servFtime0\" placeholder=\"开始时间\" persistent-hint append-icon=\"mdi-calendar\" class=\"d-inline-block\" style=\"width: calc(50% - 16px)\" hide-details variant=\"outlined\" density=\"compact\" v-bind=\"props\"></VTextField>\r\n\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t<VDatePicker v-model=\"queryParam.servFtime0\" title=\"\" @update:model-value=\"menu = false\" view-mode=\"month\" :max=\"queryParam.servFtime1\"></VDatePicker>\r\n\t\t\t\t\t\t</VMenu>\r\n\t\t\t\t\t\t<span class=\"mx-2\">至</span>\r\n\t\t\t\t\t\t<VMenu v-model=\"menu1\" :close-on-content-click=\"false\" transition=\"scale-transition\" location=\"bottom\" max-width=\"290px\" min-width=\"auto\">\r\n\t\t\t\t\t\t\t<template v-slot:activator=\"{ props }\">\r\n\t\t\t\t\t\t\t\t<VTextField v-model=\"queryParam.servFtime1\" placeholder=\"结束时间\" persistent-hint append-icon=\"mdi-calendar\" class=\"d-inline-block\" style=\"width: calc(50% - 15px)\" hide-details variant=\"outlined\" density=\"compact\" v-bind=\"props\"></VTextField>\r\n\t\t\t\t\t\t\t</template>\r\n\t\t\t\t\t\t\t<VDatePicker v-model=\"queryParam.servFtime1\" title=\"\" @update:model-value=\"menu1 = false\" view-mode=\"month\" :min=\"queryParam.servFtime0\"></VDatePicker>\r\n\t\t\t\t\t\t</VMenu>\r\n\t\t\t\t\t\t<vtk-select v-if=\"queryParam.servState == '1'\" @change=\"searchQuery\" v-model=\"queryParam.state\" class=\"mt-3\" placeholder=\"状态\" list=\"1:已通过/0:未通过\" hide-details density=\"compact\" variant=\"outlined\" clearable></vtk-select>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</vtk-search>\r\n\t\t\t</VCardTitle>\r\n\t\t\t<VCardText>\r\n\t\t\t\t<VDataTable :headers=\"headers\" :items=\"desserts\" :loading=\"loading\" disable-pagination loading-text=\"数据加载中...\" class=\"elevation-0\" hide-default-footer>\r\n\t\t\t\t\t<template v-slot:[`item.objsName`]=\"{ item }\">\r\n\t\t\t\t\t\t<div class=\"py-3\" @click=\"toView(item)\">\r\n\t\t\t\t\t\t\t<p class=\"vtk-cursor-pointer text-body-1 font-weight-bold mb-2\">\r\n\t\t\t\t\t\t\t\t{{ item.objsName }}<span class=\"ml-3 text-grey\">{{ formatIdCard(item.objsCode) }} </span>\r\n\t\t\t\t\t\t\t\t<VChip class=\"ml-2\" :class=\"getServStateClass(item.servState)\" size=\"small\" label>{{ getServStateText(item.servState) }} </VChip>\r\n\t\t\t\t\t\t\t\t<VChip class=\"ml-2\" :class=\"getRateStateClass(item.rateState)\" size=\"small\" label>{{ getRateStateText(item.rateState) }} </VChip>\r\n\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t<VChip class=\"bg-orange-lighten-5 text-orange\" size=\"small\" label> 事项编码:{{ item.projCode }} </VChip>\r\n\t\t\t\t\t\t\t\t<VChip class=\"text-primary ml-2\" size=\"small\" label> 办件编号:{{ item.inst }} </VChip>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<div class=\"mb-0 mt-2 text-grey\">\r\n\t\t\t\t\t\t\t\t<div class=\"d-inline-block\" style=\"min-width: 320px\">\r\n\t\t\t\t\t\t\t\t\t服务名称:<span class=\"text-blue\">{{ item.projName }}</span>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<span>补助金额:{{ item.servAmts }}元</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<VRow class=\"py-2\" style=\"color: #979797c2\">\r\n\t\t\t\t\t\t\t\t<VCol style=\"max-width: 320px\">\r\n\t\t\t\t\t\t\t\t\t<span :title=\"item.name\" class=\"d-block\" style=\"color: #979797c2\">申请途径:{{ getServFromText(item.servFrom) }}</span>\r\n\t\t\t\t\t\t\t\t</VCol>\r\n\t\t\t\t\t\t\t\t<VCol>\r\n\t\t\t\t\t\t\t\t\t<span :title=\"item.name\" class=\"d-block\" style=\"color: #979797c2\">申请时间:{{ formatDate(item.servCtime) }}</span>\r\n\t\t\t\t\t\t\t\t</VCol>\r\n\t\t\t\t\t\t\t</VRow>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<template v-slot:[`item.actions`]=\"{ item }\">\r\n\t\t\t\t\t\t<a v-if=\"item.state != 0 && user.areacode?.length == 6 && item.servState == '1'\" @click=\"del(item)\" class=\"text-error\" text>作废</a>\r\n\t\t\t\t\t\t<div v-if=\"item.state == 0\" class=\"state_btg text-right\"></div>\r\n\t\t\t\t\t</template>\r\n\t\t\t\t\t<template v-slot:no-data>\r\n\t\t\t\t\t\t<vtk-empty />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</VDataTable>\r\n\t\t\t\t<vtk-page :page-sizes=\"[10, 20]\" :page-data=\"pageData\" @pageChange=\"getListPage\" />\r\n\t\t\t</VCardText>\r\n\t\t</VCard>\r\n\t\t<!-- 服务事项 -->\r\n\t\t<vtk-proj ref=\"MprojRef\" @toPage=\"toPage\" />\r\n\t\t<!-- 删除服务 -->\r\n\t\t<VDialog v-model=\"dialog\" persistent max-width=\"500\">\r\n\t\t\t<VCard>\r\n\t\t\t\t<VCardTitle>作废</VCardTitle>\r\n\t\t\t\t<VCardText class=\"pb-0\">\r\n\t\t\t\t\t服务作废后将无法恢复,请谨慎操作!!!\r\n\t\t\t\t\t<VTextarea v-model=\"delNote\" variant=\"outlined\" label=\"请填写作废原因\" class=\"mt-3\" hide-details density=\"compact\"></VTextarea>\r\n\t\t\t\t</VCardText>\r\n\t\t\t\t<VCardActions>\r\n\t\t\t\t\t<VSpacer />\r\n\t\t\t\t\t<VBtn @click=\"dialog = false\" variant=\"text\">取消</VBtn>\r\n\t\t\t\t\t<VBtn @click=\"delSave(true)\" variant=\"text\">确定</VBtn>\r\n\t\t\t\t</VCardActions>\r\n\t\t\t</VCard>\r\n\t\t</VDialog>\r\n\t</VContainer>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, watch, onActivated } from 'vue';\r\nimport { useMixins } from '../../composables/useMixins'\r\nimport Request from '../../commons/request';\r\n\r\n// 定义组件选项\r\ndefineOptions({\r\n\tname: 'VtkProj',\r\n\tinheritAttrs: false,\r\n});\r\n\r\n// 表单列表 URL 配置\r\nconst urlConfig = {\r\n\tlist: '/kudas/xfwez/page',\r\n\texp: '/kudas/xfwez/exp',\r\n\tdelete: '/kudas/xfwez/delete'\r\n};\r\n\r\n// 使用 mixins composable\r\nconst {\r\n\tpageData,\r\n\tgetListPage,\r\n\tloadPage,\r\n\texpData,\r\n\tdesserts,\r\n\tloading,\r\n\tqueryParam: mixinQueryParam,\r\n\turl\r\n} = useMixins(urlConfig);\r\n\r\n// 合并 queryParam\r\nObject.assign(mixinQueryParam, {});\r\nconst queryParam = mixinQueryParam;\r\n\r\n// 响应式数据\r\nconst user = ref({});\r\nconst examType = ref(1);\r\n\r\nconst headers = ref([\r\n\t{ title: '事项', key: 'objsName', sortable: false },\r\n\t{ title: '状态', key: 'actions', sortable: false, align: 'end' },\r\n]);\r\n\r\n// 主题筛选\r\nconst permits = ref([]);\r\nconst projName = ref('');\r\nconst projTip = ref('');\r\nconst bizType = ref('');\r\nconst expShow = ref(false);\r\nconst menu = ref(false);\r\nconst menu1 = ref(false);\r\n\r\n// 导出\r\nconst expArr = ref([]);\r\nconst formArr = ref([]);\r\nconst select = ref(false);\r\nconst selectAll = ref([]);\r\n\r\n// 删除\r\nconst dialog = ref(false);\r\nconst delItem = ref({});\r\nconst delNote = ref('');\r\n\r\n// ref\r\nconst MprojRef = ref(null);\r\n\r\n// 监听器\r\nwatch(expArr, (newVal) => {\r\n\tif (newVal.length < selectAll.value.length) {\r\n\t\tselect.value = false;\r\n\t}\r\n}, { deep: true });\r\n\r\n// 生命周期\r\nonActivated(() => {\r\n\talert('onActivated');\r\n\tlist();\r\n\t// 监听接收消息,刷新页面\r\n\twindow.addEventListener('storage', (event) => {\r\n\t\tif (JSON.parse(event?.newValue)?.fwez) {\r\n\t\t\texamType.value == '0' ? examAll() : loadPage();\r\n\t\t}\r\n\t});\r\n});\r\n\r\n// 方法\r\n// 全选\r\nconst chkAll = (e) => {\r\n\texpArr.value = e ? selectAll.value : [];\r\n};\r\n\r\nconst list = () => {\r\n\tbizType.value = '';\r\n\texpShow.value = false;\r\n\tuser.value = getUserInfo();\r\n\tpermits.value = [];\r\n\tuser.value.permits?.forEach((e) => {\r\n\t\tif (e.permNkey.includes('biz_type')) {\r\n\t\t\tpermits.value.push(e);\r\n\t\t\tbizType.value = bizType.value + e.permNkey.slice(9) + ',';\r\n\t\t} else if (e.permNkey == 'btn_expo') {\r\n\t\t\texpShow.value = true;\r\n\t\t}\r\n\t});\r\n\tqueryParam.bizType = bizType.value;\r\n\texamWait();\r\n};\r\n\r\n// 获取用户信息\r\nconst getUserInfo = () => {\r\n\ttry {\r\n\t\t// 实际项目中从存储或状态管理获取\r\n\t\treturn window.$vtk?.storage?.get('_mis_acis_users') || {};\r\n\t} catch (error) {\r\n\t\tconsole.warn('获取用户信息失败:', error);\r\n\t\treturn {};\r\n\t}\r\n};\r\n\r\n// 待审\r\nconst examWait = () => {\r\n\texamType.value = 1;\r\n\tqueryParam.operateLeve = user.value.areacode?.length;\r\n\tqueryParam.servState = '0';\r\n\tloadPage();\r\n};\r\n\r\n// 全部审核\r\nconst examAll = () => {\r\n\texamType.value = 0;\r\n\tdelete queryParam.operateLeve;\r\n\tdelete queryParam.servState;\r\n\tloadPage();\r\n};\r\n\r\n// 审核\r\nconst toView = (item) => {\r\n\tconst url = item.servState == 1\r\n\t\t? `#/mino/suse/view/${item.inst}?ddtab=true`\r\n\t\t: `#/mino/suse/exam/${item.inst}?ddtab=true`;\r\n\twindow.open(url);\r\n};\r\n\r\n// 服务事项查询/筛选\r\nconst searchProj = () => {\r\n\tMprojRef.value?.add(queryParam.projCode);\r\n};\r\n\r\nconst toPage = (param) => {\r\n\tprojName.value = param.projName;\r\n\tqueryParam.projCode = param.projCode;\r\n\tdelete queryParam.bizType;\r\n\tsearchQuery();\r\n};\r\n\r\nconst searchQuery = () => {\r\n\t// 搜索查询逻辑\r\n\tloadPage();\r\n};\r\n\r\n// 导出相关\r\nconst exv = () => {\r\n\tif (projName.value && queryParam.servState == '1') {\r\n\t\texpArr.value = [];\r\n\t\tformArr.value = [];\r\n\t\t// 显示加载状态\r\n\t\tRequest.postJson('/kudas/xfwez/exv', { codex: queryParam }).then((res) => {\r\n\t\t\tif (res.meta.success) {\r\n\t\t\t\tJSON.parse(res.data.formJson).forEach((item) => {\r\n\t\t\t\t\tif (['text', 'radio', 'number', 'time', 'checkbox', 'textarea', 'select'].includes(item.type)) {\r\n\t\t\t\t\t\titem.value = {\r\n\t\t\t\t\t\t\tname: item.name,\r\n\t\t\t\t\t\t\tvalu: `${item.label}${item.valu && item.valu.includes('/') && item.valu.includes(':') ? `(${item.valu})` : ''}`\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\tformArr.value.push(item);\r\n\t\t\t\t\t\tselectAll.value.push(item.value);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tprojTip.value = res.meta.message;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n};\r\n\r\nconst exp = () => {\r\n\tqueryParam.fields = expArr.value;\r\n\texpData();\r\n};\r\n\r\n// 服务作废\r\nconst del = (item) => {\r\n\tdialog.value = true;\r\n\tdelItem.value = item;\r\n\tdelNote.value = '';\r\n};\r\n\r\nconst delSave = () => {\r\n\tif (delNote.value) {\r\n\t\tRequest.postForm(url.delete, { id: delItem.value.id, note: delNote.value }).then((res) => {\r\n\t\t\tif (res.meta.success) {\r\n\t\t\t\t// 显示成功消息\r\n\t\t\t\tdialog.value = false;\r\n\t\t\t\tloadPage();\r\n\t\t\t} else {\r\n\t\t\t\t// 显示失败消息\r\n\t\t\t}\r\n\t\t});\r\n\t} else {\r\n\t\t// 显示错误消息\r\n\t}\r\n};\r\n\r\n// 提示\r\nconst tip = () => {\r\n\t// 显示应用开发中的消息\r\n};\r\n\r\n// 工具函数\r\nconst formatIdCard = (idcard) => {\r\n\tif (!idcard) return '';\r\n\treturn idcard.replace(/^(.{6})(?:\\d+)(.{4})$/, '$1********$2');\r\n};\r\n\r\nconst formatDate = (dateStr) => {\r\n\tif (!dateStr) return '';\r\n\tconst date = new Date(dateStr);\r\n\treturn `${date.getFullYear()}年${String(date.getMonth() + 1).padStart(2, '0')}月${String(date.getDate()).padStart(2, '0')}日 ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`;\r\n};\r\n\r\nconst getServStateClass = (state) => {\r\n\treturn state == '0' ? 'bg-blue-lighten-5 text-blue' : 'bg-green-lighten-5 text-green';\r\n};\r\n\r\nconst getServStateText = (state) => {\r\n\treturn state == '0' ? '服务中' : '已服务';\r\n};\r\n\r\nconst getRateStateClass = (state) => {\r\n\treturn state == '0' ? 'bg-orange-lighten-5 text-orange' : 'bg-blue-lighten-5 text-blue';\r\n};\r\n\r\nconst getRateStateText = (state) => {\r\n\treturn state == '0' ? '未评价' : '已评价';\r\n};\r\n\r\nconst getServFromText = (from) => {\r\n\tconst fromMap = {\r\n\t\t'100': '特殊渠道',\r\n\t\t'101': '移动端代办',\r\n\t\t'102': '窗口端通办',\r\n\t\t'200': '特殊渠道',\r\n\t\t'210': '浙里办App',\r\n\t\t'211': '浙里办微信小程序',\r\n\t\t'212': '浙里办支付宝小程序',\r\n\t\t'230': '微信小程序',\r\n\t\t'240': '支付宝小程序',\r\n\t\t'250': '自助机',\r\n\t\t'300': '特殊渠道',\r\n\t\t'310': '服务外包代办'\r\n\t};\r\n\treturn fromMap[from] || from;\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.state_btg {\r\n\tpadding-right: 0;\r\n\theight: 100%;\r\n\tbackground: url(../../assets/img/objs_btg.png) no-repeat;\r\n\tbackground-size: 80px;\r\n\tbackground-position: 100% 100%;\r\n}\r\n\r\n:deep(.v-tab) {\r\n\tbackground: url(../../assets/img/tab-2.png) no-repeat;\r\n\tbackground-size: 100% 100%;\r\n\twidth: 150px;\r\n\tmargin-left: -11px;\r\n\tborder-top-left-radius: 20px;\r\n\tborder-top-right-radius: 20px;\r\n\tspan {\r\n\t\tz-index: 99;\r\n\t}\r\n}\r\n\r\n/* Dark theme */\r\n.v-theme--dark {\r\n\t:deep(.v-tab) {\r\n\t\tbackground: url(../../assets/img/tab-4.png) no-repeat;\r\n\t\tbackground-size: 100% 100%;\r\n\t}\r\n\r\n\t:deep(.v-tabs__slider) {\r\n\t\tbackground: url(../../assets/img/tab-3.png) no-repeat !important;\r\n\t\tbackground-size: 100% 100% !important;\r\n\t}\r\n}\r\n\r\n:deep(.v-tab::before),\r\n:deep(.v-tab:focus::before),\r\n:deep(.v-tab:hover::before) {\r\n\tbackground-color: transparent !important;\r\n\topacity: 0 !important;\r\n}\r\n\r\n:deep(.v-tabs__slider) {\r\n\theight: 38px !important;\r\n\tbackground: url(../../assets/img/tab-1.png) no-repeat;\r\n\tbackground-size: 100% 100%;\r\n}\r\n\r\n.expBox {\r\n\t:deep(td) {\r\n\t\tborder-bottom: thin solid rgba(123, 123, 123, 0.22);\r\n\t}\r\n\r\n\t:deep(.v-data-table__empty-wrapper td) {\r\n\t\tborder: none;\r\n\t}\r\n\r\n\t:deep(.v-checkbox.v-selection-control--dirty) {\r\n\t\tbackground-color: rgba(33, 149, 243, 0.06) !important;\r\n\r\n\t\t.v-label {\r\n\t\t\tcolor: rgb(33, 150, 243) !important;\r\n\t\t}\r\n\r\n\t\t.active {\r\n\t\t\tcolor: rgb(33, 150, 243);\r\n\t\t\tdisplay: inline-block !important;\r\n\t\t}\r\n\t}\r\n\r\n\t:deep(.v-selection-control__input) {\r\n\t\tdisplay: none;\r\n\t}\r\n\r\n\t:deep(.v-checkbox) {\r\n\t\tpadding: 4px 8px 4px 10px;\r\n\t\tborder-radius: 6px;\r\n\t\tbackground-color: rgba(117, 117, 117, 0.06);\r\n\r\n\t\t.v-label {\r\n\t\t\tmargin-top: 3px;\r\n\t\t\tfont-size: 12px;\r\n\t\t}\r\n\t}\r\n}\r\n</style>\r\n","<template>\r\n <VRadioGroup v-bind=\"attrs\" :modelValue=\"modelValue\" @update:modelValue=\"onUpdate\">\r\n <VRadio\r\n v-for=\"item in items\"\r\n :key=\"item.id || item.code\"\r\n :label=\"item.codeValue\"\r\n :value=\"item.code\"\r\n />\r\n </VRadioGroup>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, useAttrs } from 'vue';\r\nimport Request from '../../commons/request';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: \"VtkRadio\",\r\n inheritAttrs: false,\r\n});\r\n// 定义 props\r\nconst props = defineProps({\r\n /**\r\n * 字典来源:\r\n * - 静态数据,如:\"0:否/1:是\"\r\n * - 字典键名,如:\"DISABLE_TYPE\"\r\n */\r\n list: {\r\n type: String,\r\n required: true,\r\n },\r\n modelValue: {\r\n type: [String, Number],\r\n default: null,\r\n },\r\n});\r\n\r\n// 定义 emit 事件\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 获取透传属性(替代 $attrs)\r\nconst attrs = useAttrs();\r\n\r\n// 响应式数据\r\nconst items = ref([]);\r\n\r\n// 处理静态数据\r\nconst statc = () => {\r\n props.list.split('/').forEach(it => {\r\n const [code, codeValue] = it.split(':');\r\n items.value.push({ code, codeValue });\r\n });\r\n};\r\n\r\n// 请求远程字典\r\nconst miscs = async () => {\r\n try {\r\n const res = await Request.getForm(`dict/misc/list/${props.list}`);\r\n items.value = res.data || [];\r\n } catch (error) {\r\n console.error('[VtkRadio] Failed to load dictionary:', error);\r\n items.value = [];\r\n }\r\n};\r\n\r\n// 更新 v-model 值\r\nconst onUpdate = (val) => {\r\n emit('update:modelValue', val);\r\n};\r\n\r\n// 初始化数据\r\nonMounted(() => {\r\n if (props.list.includes(':')) {\r\n statc();\r\n } else {\r\n miscs();\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n</style>","<template>\r\n <div class=\"search\">\r\n <VMenu\r\n v-model=\"menu\"\r\n @update:model-value=\"obtain\"\r\n location=\"bottom end\"\r\n origin=\"top end\"\r\n offset=\"12\"\r\n :close-on-content-click=\"false\"\r\n >\r\n <template v-slot:activator=\"{ props }\">\r\n <VTextField\r\n v-model=\"queryParam.condition\"\r\n :placeholder=\"$attrs.placeholder || '请输入查询内容'\"\r\n :style=\"$attrs.styles\"\r\n class=\"box\"\r\n density=\"compact\"\r\n variant=\"outlined\"\r\n hide-details\r\n @click:append=\"search\"\r\n @keyup.enter=\"search\"\r\n @click:clear=\"(queryParam.condition = ''), search()\"\r\n clearable\r\n >\r\n <template v-slot:append-inner>\r\n <VBadge\r\n dot\r\n :content=\"initialIndex\"\r\n :model-value=\"initialIndex > 0\"\r\n color=\"error\"\r\n class=\"advanced-badge\"\r\n >\r\n <span\r\n v-bind=\"props\"\r\n class=\"text-blue vtk-cursor-pointer d-inline-flex align-center text-body-2\"\r\n >\r\n 高级\r\n </span>\r\n </VBadge>\r\n </template>\r\n </VTextField>\r\n </template>\r\n\r\n <VCard class=\"search-panel\">\r\n <VCardTitle class=\"pr-3 d-flex justify-space-between align-center pb-5\">\r\n <span>高级搜索</span>\r\n <VBtn class=\"mx-0\" variant=\"text\" icon @click=\"close\" size=\"small\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n </VCardTitle>\r\n\r\n <VCardText class=\"search-panel__body\">\r\n <div class=\"search-panel__content\" :style=\"contentStyle\">\r\n <slot :query-param=\"queryParam\"></slot>\r\n </div>\r\n </VCardText>\r\n\r\n <VCardActions class=\"pt-0 px-4 pb-3\">\r\n <slot name=\"actions\"></slot>\r\n <VSpacer />\r\n <VBtn @click=\"search\" variant=\"flat\" color=\"primary\">\r\n <VIcon class=\"mr-1\">mdi-magnify</VIcon>搜索\r\n </VBtn>\r\n <VBtn @click=\"handleResetClick\" variant=\"flat\" color=\"error\">\r\n <VIcon class=\"mr-1\">mdi-sync</VIcon>重置\r\n </VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VMenu>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed, getCurrentInstance, onMounted, ref, watch } from 'vue';\r\n\r\ndefineOptions({\r\n name: \"VtkSearch\"\r\n});\r\n\r\nconst props = defineProps({\r\n value: {\r\n type: Object,\r\n default: () => ({})\r\n },\r\n contentMinHeight: {\r\n type: [Number, String],\r\n default: 0\r\n },\r\n contentMaxHeight: {\r\n type: [Number, String],\r\n default: 360\r\n }\r\n});\r\n\r\nconst emit = defineEmits(['update:value', 'search', 'reset']);\r\nconst instance = getCurrentInstance();\n\nconst user = ref({});\nconst menu = ref(false);\n\nconst cloneValue = (val) => {\n if (Array.isArray(val)) return [...val];\n if (val && typeof val === 'object') return { ...val };\n return val;\n};\n\nconst cloneQueryParam = (source = {}) => {\n return Object.fromEntries(Object.entries(source || {}).map(([key, val]) => [key, cloneValue(val)]));\n};\n\nconst isSameValue = (a, b) => {\n if (\n Array.isArray(a) ||\n Array.isArray(b) ||\n (a && typeof a === 'object') ||\n (b && typeof b === 'object')\n ) {\n return JSON.stringify(a) === JSON.stringify(b);\n }\n\n return a === b;\n};\n\nconst queryParam = ref(cloneQueryParam(props.value));\nconst initialQueryParam = ref(cloneQueryParam(props.value));\nconst externalQueryParam = ref(cloneQueryParam(props.value));\n\nconst initialIndex = computed(() => {\n return Object.entries(queryParam.value).filter(([key, val]) => {\n if (key === 'condition') return false;\n const initVal = initialQueryParam.value[key];\n return !isSameValue(val, initVal);\n }).length;\n});\n\r\nconst contentStyle = computed(() => {\r\n const minValue = props.contentMinHeight;\r\n const maxValue = props.contentMaxHeight;\r\n const minHeight = typeof minValue === 'number' ? `${minValue}px` : minValue;\r\n const maxHeight = typeof maxValue === 'number' ? `${maxValue}px` : maxValue;\r\n\r\n return {\r\n ...(minValue ? { minHeight } : {}),\r\n maxHeight,\r\n };\r\n});\r\n\r\nwatch(\n () => props.value,\n (newVal = {}) => {\n const nextExternalQueryParam = cloneQueryParam(newVal);\n const nextQueryParam = { ...queryParam.value };\n\n Object.entries(nextExternalQueryParam).forEach(([key, val]) => {\n if (!isSameValue(val, externalQueryParam.value[key])) {\n nextQueryParam[key] = cloneValue(val);\n }\n });\n\n Object.keys(externalQueryParam.value).forEach((key) => {\n if (!(key in nextExternalQueryParam)) {\n delete nextQueryParam[key];\n }\n });\n\n queryParam.value = nextQueryParam;\n externalQueryParam.value = nextExternalQueryParam;\n },\n { deep: true }\n);\n\r\nonMounted(() => {\r\n user.value = JSON.parse(localStorage.getItem(\"_mis_acis_users\") || \"{}\");\r\n});\r\n\r\nconst obtain = () => {};\r\n\r\nconst close = () => {\r\n menu.value = false;\r\n obtain();\r\n};\r\n\r\nconst filterNull = (obj) => {\r\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== null && v !== undefined));\r\n};\r\n\r\nconst search = () => {\r\n close();\r\n emit('update:value', filterNull(queryParam.value));\r\n emit(\"search\");\r\n};\r\n\r\nconst reset = () => {\r\n queryParam.value = {\r\n ...initialQueryParam.value,\r\n condition: ''\r\n };\r\n emit('update:value', filterNull(queryParam.value));\r\n emit(\"search\");\r\n menu.value = false;\r\n};\r\n\r\nconst handleResetClick = () => {\r\n const hasParentResetHandler = Boolean(instance?.vnode.props?.onReset);\r\n\r\n if (hasParentResetHandler) {\r\n emit('reset', { ...queryParam.value });\r\n return;\r\n }\r\n\r\n reset();\r\n};\r\n\r\ndefineExpose({ search, reset });\r\n\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.search {\r\n position: relative;\r\n min-width: 380px;\r\n min-height: 40px;\r\n}\r\n\r\n.box {\r\n min-width: 380px;\r\n min-height: 40px;\r\n}\r\n\r\n.search-panel {\r\n width: 380px;\r\n margin-right: -16px;\r\n overflow: visible;\r\n}\r\n\r\n.search-panel__body {\r\n overflow: visible;\r\n}\r\n\r\n.search-panel__content {\r\n overflow-x: hidden;\r\n overflow-y: auto;\r\n scrollbar-gutter: stable;\r\n scrollbar-color: rgb(var(--v-theme-primary)) transparent;\r\n scrollbar-width: thin;\r\n}\r\n\r\n\r\n.search-panel__content::-webkit-scrollbar-track {\r\n background: transparent;\r\n}\r\n\r\n.search-panel__content::-webkit-scrollbar-thumb {\r\n background: rgb(var(--v-theme-primary));\r\n}\r\n\r\n:deep(.box .v-field__append-inner) {\r\n cursor: pointer;\r\n padding-left: 16px !important;\r\n padding-right: 4px !important;\r\n border-left: 1px #cccccc88 solid;\r\n min-width: 50px;\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n:deep(.advanced-badge .v-badge__badge) {\r\n transform: translate(10px, -2px);\r\n}\r\n</style>\r\n","<template>\r\n <VSelect \r\n v-bind=\"filteredAttrs\" \r\n :items=\"items\" \r\n item-title=\"codeValue\" \r\n item-value=\"code\" \r\n :multiple=\"multi\"\r\n :menu-props=\"{ offsetY: true }\" \r\n @update:model-value=\"$emit('update:modelValue', $event)\"\r\n />\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted, useAttrs, computed } from 'vue'\r\nimport Request from \"../../commons/request\";\r\n\r\n// 定义组件名称和选项\r\ndefineOptions({\r\n name: \"VtkSelect\",\r\n inheritAttrs: false\r\n});\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 数据库字段名字(DISABLE_TYPE) 或 静态的字段(0:否/1:是)\r\n list: {\r\n type: String,\r\n default: null,\r\n },\r\n multi: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n});\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\n// 获取所有传递的属性\r\nconst attrs = useAttrs();\r\n\r\n// 过滤属性,排除组件内部使用的属性\r\nconst filteredAttrs = computed(() => {\r\n const { list, multi, ...rest } = attrs;\r\n return rest;\r\n});\r\n\r\n// 响应式数据\r\nconst items = ref([]);\r\n\r\n// 方法定义\r\nconst miscs = () => {\r\n Request.getForm(`dict/misc/list/${props.list}`).then((res) => {\r\n items.value = res.data;\r\n });\r\n};\r\n\r\nconst statc = () => {\r\n if (!props.list) return;\r\n \r\n props.list.split(\"/\").forEach((it) => {\r\n const its = it.split(\":\");\r\n items.value.push({ code: its[0], codeValue: its[1] });\r\n });\r\n};\r\n\r\n// 生命周期钩子\r\nonMounted(() => {\r\n if (props.list) {\r\n if (props.list.includes(\":\")) {\r\n statc();\r\n } else {\r\n miscs();\r\n }\r\n }\r\n});\r\n\r\n// 使用方式\r\n// <vtk-select\r\n// v-model=\"value\"\r\n// list=\"YOUR_LIST\"\r\n// variant=\"outlined\" <!-- 样式变体 -->\r\n// density=\"compact\" <!-- 密度 'default' | 'comfortable' | 'compact' -->\r\n// clearable <!-- 可清除 -->\r\n// placeholder=\"请选择\" <!-- 占位符 -->\r\n// :rules=\"rules\" <!-- 验证规则 -->\r\n// disabled <!-- 禁用状态 -->\r\n// readonly <!-- 只读状态 -->\r\n// hide-details <!-- 隐藏详情信息 -->\r\n// />\r\n\r\n</script>\r\n\r\n<style scoped>\r\n::-webkit-scrollbar {\r\n width: 6px;\r\n}\r\n\r\n::-webkit-scrollbar-thumb {\r\n border-radius: 3px;\r\n height: 100px;\r\n background-color: #007acc;\r\n}\r\n</style>","<template>\n <div class=\"vtk-single-page\">\n <v-row class=\"pagination-row ma-0\" align=\"center\" justify=\"end\">\n <template v-if=\"hasTotal\">\n <span class=\"page-total d-none d-md-flex\">共 {{ rowCount }} 条</span>\n\n <v-select\n v-model=\"pagination.limit\"\n :items=\"pageSizeItems\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n class=\"page-select ml-2 d-none d-md-flex\"\n @update:model-value=\"handlePageSizeChange\"\n />\n\n <v-pagination\n v-model=\"currentPage\"\n :length=\"pageCount\"\n :total-visible=\"6\"\n density=\"comfortable\"\n size=\"small\"\n class=\"page-pagination\"\n @update:model-value=\"emitPageChange\"\n />\n\n <span class=\"page-total ml-2 d-none d-md-flex\">到</span>\n <v-text-field\n v-model=\"pagination.pageno\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n inputmode=\"numeric\"\n class=\"page-go ml-2 d-none d-md-flex\"\n @keyup.enter=\"goToPage\"\n />\n <span class=\"page-total ml-2 d-none d-md-flex\">页</span>\n </template>\n\n <template v-else>\n <span class=\"page-total d-none d-md-flex\">第 {{ currentPage }} 页</span>\n\n <v-select\n v-model=\"pagination.limit\"\n :items=\"pageSizeItems\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n class=\"page-select ml-2 d-none d-md-flex\"\n @update:model-value=\"handlePageSizeChange\"\n />\n\n <div class=\"d-flex\">\n <v-btn\n variant=\"outlined\"\n size=\"small\"\n height=\"36\"\n\t\t\tclass=\"mr-2\"\n :disabled=\"currentPage <= 1\"\n @click=\"previousPage\"\n >\n 上一页\n </v-btn>\n <v-btn\n variant=\"outlined\"\n size=\"small\"\n height=\"36\"\n :disabled=\"!hasNextPage\"\n @click=\"nextPage\"\n >\n 下一页\n </v-btn>\n </div>\n </template>\n </v-row>\n </div>\n</template>\n\n<script setup>\nimport { computed, reactive, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'VtkSinglePage'\n});\n\nconst props = defineProps({\n pageData: {\n type: Object,\n default: () => ({})\n },\n pageSizes: {\n type: Array,\n default: () => [15, 20, 30]\n }\n});\n\nconst emit = defineEmits(['pageChange']);\n\nconst normalizePositiveInteger = (value, fallback = 1) => {\n const parsedValue = Number.parseInt(value, 10);\n return Number.isInteger(parsedValue) && parsedValue > 0 ? parsedValue : fallback;\n};\n\nconst initialLimit = computed(() => normalizePositiveInteger(props.pageSizes[0], 15));\nconst currentPage = ref(normalizePositiveInteger(props.pageData.pageno));\nconst pagination = reactive({\n pageno: currentPage.value,\n limit: normalizePositiveInteger(props.pageData.limit, initialLimit.value)\n});\n\nconst rowCount = computed(() => Math.max(0, Number(props.pageData.rowCount) || 0));\nconst pageCount = computed(() => normalizePositiveInteger(props.pageData.pageCount));\nconst hasTotal = computed(() => rowCount.value > 0);\nconst pageSizeItems = computed(() => props.pageSizes.map(value => ({\n title: `${value} 条/页`,\n value\n})));\nconst rowLength = computed(() => {\n if (Array.isArray(props.pageData.rows)) {\n return props.pageData.rows.length;\n }\n\n return Number.isFinite(Number(props.pageData.rows))\n ? Number(props.pageData.rows)\n : null;\n});\nconst hasNextPage = computed(() => (\n rowLength.value === null || rowLength.value >= Number(pagination.limit)\n));\n\nwatch(\n () => props.pageData,\n newValue => {\n currentPage.value = normalizePositiveInteger(newValue.pageno, currentPage.value);\n pagination.pageno = currentPage.value;\n\n if (newValue.limit != null) {\n pagination.limit = normalizePositiveInteger(newValue.limit, pagination.limit);\n }\n },\n { deep: true }\n);\n\nwatch(currentPage, value => {\n pagination.pageno = value;\n});\n\nwatch(\n () => props.pageSizes,\n values => {\n if (!values.some(value => Number(value) === Number(pagination.limit))) {\n pagination.limit = initialLimit.value;\n }\n },\n { deep: true }\n);\n\nconst emitPageChange = () => {\n emit('pageChange', {\n pageno: currentPage.value,\n limit: Number(pagination.limit)\n });\n};\n\nconst goToPage = () => {\n const targetPage = Number(pagination.pageno);\n\n if (Number.isInteger(targetPage) && targetPage >= 1 && targetPage <= pageCount.value) {\n currentPage.value = targetPage;\n emitPageChange();\n return;\n }\n\n pagination.pageno = currentPage.value;\n};\n\nconst handlePageSizeChange = () => {\n currentPage.value = 1;\n emitPageChange();\n};\n\nconst previousPage = () => {\n if (currentPage.value <= 1) return;\n\n currentPage.value -= 1;\n emitPageChange();\n};\n\nconst nextPage = () => {\n if (!hasNextPage.value) return;\n\n currentPage.value += 1;\n emitPageChange();\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.vtk-single-page {\n width: 100%;\n min-height: 60px;\n}\n\n.pagination-row {\n min-height: 60px;\n padding: 8px 16px;\n}\n\n.page-total {\n align-items: center;\n min-height: 36px;\n color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity));\n font-size: 13px;\n}\n\n.page-select {\n max-width: 120px;\n}\n\n.page-go {\n max-width: 72px;\n}\n\n.page-select,\n.page-go {\n :deep(.v-input__control),\n :deep(.v-field) {\n min-height: 36px;\n height: 36px;\n font-size: 13px;\n }\n\n :deep(.v-field__input) {\n min-height: 36px;\n padding-top: 4px;\n padding-bottom: 4px;\n }\n}\n\n.page-pagination {\n :deep(.v-pagination__item),\n :deep(.v-pagination__prev),\n :deep(.v-pagination__next) {\n font-size: 13px;\n }\n}\n</style>\n","<template>\r\n\t<VStepper class=\"elevation-0\" v-model=\"stepIndex\">\r\n\t\t<VStepperHeader class=\"elevation-0\" style=\"overflow: hidden;\">\r\n\t\t\t<VRow class=\"stepList\">\r\n\t\t\t\t<VCol class=\"pl-0 colItem\" v-for=\"(item, index) in step\" :key=\"index\" style=\"\">\r\n\t\t\t\t\t<div class=\"first-box1 last-box pl-10 py-5 stepItem\" :class=\"stepIndex > index? 'selected' : ''\"\r\n\t\t\t\t\t\t:complete=\"stepIndex > index\" :step=\"index + 1\">\r\n\t\t\t\t\t\t{{ item }}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</VCol>\r\n\t\t\t</VRow>\r\n\t\t</VStepperHeader>\r\n\r\n\t\t<VStepperWindow>\r\n\t\t\t<VStepperWindowItem v-for=\"(item, index) in list\" :key=\"index\" :value=\"index + 1\">\r\n\t\t\t\t<slot :name=\"index + 1\"></slot>\r\n\t\t\t</VStepperWindowItem>\r\n\t\t\t<slot></slot>\r\n\t\t</VStepperWindow>\r\n\t</VStepper>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, watch, onMounted } from 'vue';\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n\tname: \"VtkStepper\",\r\n\tinheritAttrs: false,\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n\tlist: {\r\n\t\ttype: String,\r\n\t\tdefault: null,\r\n\t},\r\n\tel: {\r\n\t\ttype: Number,\r\n\t\tdefault: 1,\r\n\t},\r\n});\r\n\r\n// 响应式数据\r\nconst stepIndex = ref(props.el);\r\nconst step = ref([]);\r\n\r\n// 监听el属性变化\r\nwatch(() => props.el, (val) => {\r\n\tstepIndex.value = val;\r\n});\r\n\r\n// 处理内容\r\nconst content = () => {\r\n\tif (props.list) {\r\n\t\tstep.value = props.list.split(\",\");\r\n\t}\r\n};\r\n\r\n// 组件挂载时执行\r\nonMounted(() => {\r\n\tcontent();\r\n});\r\n\r\n// 监听list变化\r\nwatch(() => props.list, () => {\r\n\tcontent();\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n// 颜色变量定义\r\n$color-background: #c7ccd538;\r\n$color-selected: #165dff;\r\n$color-white: #fff;\r\n$color-light-bg: #f2f3f5;\r\n$color-dark-bg: #1e1e1e;\r\n\r\n.v-stepper__step {\r\n\tbackground: $color-background;\r\n\tposition: relative;\r\n}\r\n\r\n// 隐藏步骤数字\r\n:deep(.v-stepper__step__step) {\r\n\tdisplay: none !important;\r\n}\r\n\r\n.stepItem {\r\n\talign-items: center;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tpadding: 24px;\r\n\tposition: relative;\r\n\tbackground: $color-background;\r\n\r\n\t// 暗色主题样式\r\n\t.v-theme--dark & {\r\n\t\tcolor: rgba(255, 255, 255, 0.5);\r\n\t}\r\n\r\n\t// 选中状态\r\n\t&.selected {\r\n\t\tbackground: $color-selected;\r\n\t\tcolor: $color-white !important;\r\n\r\n\t\t&.last-box::after {\r\n\t\t\tborder-color: transparent transparent transparent $color-selected;\r\n\t\t}\r\n\r\n\t\t:deep(.v-stepper__label) {\r\n\t\t\tcolor: $color-white !important;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n.colItem {\r\n\t&:first-child .first-box1::before {\r\n\t\tborder-color: transparent !important;\r\n\t}\r\n\r\n\t&:last-child .last-box::after {\r\n\t\tborder-color: transparent !important;\r\n\t}\r\n}\r\n\r\n.first-box1::before {\r\n\tposition: absolute;\r\n\tleft: 0;\r\n\tcontent: \"\";\r\n\twidth: 0;\r\n\theight: 0;\r\n\tz-index: 0;\r\n\tborder: 30px solid;\r\n\tborder-color: transparent transparent transparent $color-white;\r\n\r\n\t.v-theme--dark & {\r\n\t\tborder-color: transparent transparent transparent $color-dark-bg;\r\n\t}\r\n}\r\n\r\n.last-box::after {\r\n\tposition: absolute;\r\n\tright: -69px;\r\n\tcontent: \"\";\r\n\tz-index: 1;\r\n\twidth: 0;\r\n\theight: 0;\r\n\tborder: 35px solid;\r\n\tborder-color: transparent transparent transparent $color-light-bg;\r\n\r\n\t.v-theme--dark & {\r\n\t\tborder-color: transparent transparent transparent $color-background;\r\n\t}\r\n}\r\n\r\n.theme--dark.v-stepper {\r\n\tbackground: transparent;\r\n}\r\n</style>","<template>\r\n <div class=\"vtk-upload\">\r\n <!-- 拖拽 / 点击上传区域 -->\r\n <div\r\n v-if=\"listType !== 'picture-card' && !detail\"\r\n :class=\"['vtk-upload__dragger', { 'is-dragover': isDragover, 'is-disabled': disabled }]\"\r\n title=\"点击上传\"\r\n @click=\"!disabled && triggerInput()\"\r\n @dragover.prevent=\"onDragover\"\r\n @dragleave.prevent=\"isDragover = false\"\r\n @drop.prevent=\"onDrop\"\r\n >\r\n <slot>\r\n <div class=\"vtk-upload__dragger-inner\">\r\n <VIcon size=\"40\" color=\"grey-lighten-1\">mdi-cloud-upload-outline</VIcon>\r\n <div class=\"text-body-2 mt-2 text-grey\">将文件拖到此处,或 <span class=\"text-primary\" style=\"cursor:pointer\">点击上传</span></div>\r\n <div v-if=\"tip\" class=\"text-caption text-grey-lighten-1 mt-1\">{{ tip }}</div>\r\n </div>\r\n </slot>\r\n </div>\r\n\r\n <!-- picture-card 模式 -->\r\n <div v-if=\"listType === 'picture-card'\" class=\"vtk-upload__picture-card-wrap\">\r\n <div\r\n v-for=\"file in fileList\"\r\n :key=\"file.uid\"\r\n class=\"vtk-upload__picture-card-item\"\r\n >\r\n <v-img :key=\"file.url || file.preview || file.uid\" :src=\"file.url || file.preview\" cover class=\"fill-height\" />\n <div class=\"vtk-upload__picture-card-mask\">\r\n <VBtn icon size=\"x-small\" variant=\"text\" color=\"white\" title=\"查看\" @click.stop=\"handlePreview(file)\">\r\n <VIcon>mdi-eye</VIcon>\r\n </VBtn>\r\n <VBtn v-if=\"!disabled && !detail\" icon size=\"x-small\" variant=\"text\" color=\"white\" title=\"删除\" @click.stop=\"handleRemove(file)\">\r\n <VIcon>mdi-delete</VIcon>\r\n </VBtn>\r\n </div>\r\n <!-- 上传进度 -->\r\n <div v-if=\"file.status === 'uploading'\" class=\"vtk-upload__picture-card-progress\">\r\n <v-progress-circular :model-value=\"file.percentage\" size=\"36\" color=\"white\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 添加按钮 -->\r\n <div\r\n v-if=\"!disabled && !detail && (limit === 0 || fileList.length < limit)\"\r\n :class=\"['vtk-upload__picture-card-add', { 'is-dragover': isDragover }]\"\r\n title=\"添加文件\"\r\n @click=\"triggerInput()\"\r\n @dragover.prevent=\"onDragover\"\r\n @dragleave.prevent=\"isDragover = false\"\r\n @drop.prevent=\"onDrop\"\r\n >\r\n <VIcon size=\"28\" color=\"grey-lighten-1\">mdi-plus</VIcon>\r\n </div>\r\n </div>\r\n\r\n <!-- 隐藏的 input -->\r\n <input\r\n ref=\"inputRef\"\r\n type=\"file\"\r\n class=\"vtk-upload__input\"\r\n :accept=\"accept\"\r\n :multiple=\"multiple\"\r\n @change=\"onInputChange\"\r\n />\r\n\r\n <!-- 文件列表 (非 picture-card) -->\r\n <div v-if=\"showFileList && listType !== 'picture-card' && fileList.length > 0\" class=\"vtk-upload__list mt-2\">\r\n <div\r\n v-for=\"file in fileList\"\r\n :key=\"file.uid\"\r\n :class=\"['vtk-upload__list-item', `is-${file.status}`]\"\r\n style=\"cursor: pointer;\"\r\n >\r\n <VIcon size=\"18\" class=\"mr-1\" :color=\"file.status === 'error' ? 'error' : 'primary'\">\r\n {{ fileIcon(file) }}\r\n </VIcon>\r\n <span class=\"vtk-upload__list-item-name flex-grow-1 text-truncate\" @click=\"handlePreview(file)\" :title=\"file.name\">{{ file.name }}</span>\r\n <span v-if=\"file.status === 'uploading'\" class=\"text-caption text-grey ml-2\">{{ file.percentage }}%</span>\r\n <VBtn\r\n v-if=\"!disabled && !detail\"\r\n icon\r\n size=\"x-small\"\r\n variant=\"text\"\r\n color=\"grey\"\r\n class=\"ml-1\"\r\n title=\"删除\"\r\n @click=\"handleRemove(file)\"\r\n >\r\n <VIcon size=\"16\">mdi-close</VIcon>\r\n </VBtn>\r\n <!-- 进度条 -->\r\n <v-progress-linear\r\n v-if=\"file.status === 'uploading'\"\r\n :model-value=\"file.percentage\"\r\n color=\"primary\"\r\n class=\"vtk-upload__list-progress\"\r\n height=\"2\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 预览 Dialog -->\r\n <VDialog v-model=\"previewVisible\" fullscreen scrollable @click:outside=\"closePreview\">\r\n <VCard class=\"vtk-upload__preview-card\">\r\n <v-toolbar color=\"primary\" density=\"comfortable\">\r\n <v-toolbar-title class=\"text-truncate\">{{ previewFile?.name }}</v-toolbar-title>\r\n <VSpacer />\r\n <VBtn icon variant=\"text\" title=\"新窗口打开\" @click=\"openCurrentPreview\">\r\n <VIcon>mdi-open-in-new</VIcon>\r\n </VBtn>\r\n <template v-if=\"isImage(previewFile)\">\r\n <VBtn icon variant=\"text\" :disabled=\"!hasPreviewPrev\" title=\"上一张\" @click=\"switchPreviewImage(-1)\">\r\n <VIcon>mdi-chevron-left</VIcon>\r\n </VBtn>\r\n <VBtn icon variant=\"text\" :disabled=\"!hasPreviewNext\" title=\"下一张\" @click=\"switchPreviewImage(1)\">\r\n <VIcon>mdi-chevron-right</VIcon>\r\n </VBtn>\r\n <VBtn icon variant=\"text\" title=\"缩小\" @click=\"zoomPreview(-0.3)\">\r\n <VIcon>mdi-magnify-minus-outline</VIcon>\r\n </VBtn>\r\n <VBtn icon variant=\"text\" title=\"放大\" @click=\"zoomPreview(0.3)\">\r\n <VIcon>mdi-magnify-plus-outline</VIcon>\r\n </VBtn>\r\n <VBtn icon variant=\"text\" title=\"向左旋转\" @click=\"rotatePreview(-90)\">\r\n <VIcon>mdi-rotate-left</VIcon>\r\n </VBtn>\r\n <VBtn icon variant=\"text\" title=\"向右旋转\" @click=\"rotatePreview(90)\">\r\n <VIcon>mdi-rotate-right</VIcon>\r\n </VBtn>\r\n <VBtn icon variant=\"text\" title=\"重置\" @click=\"resetPreviewTransform\">\r\n <VIcon>mdi-refresh</VIcon>\r\n </VBtn>\r\n </template>\r\n <VBtn icon variant=\"text\" title=\"关闭\" @click=\"closePreview\">\r\n <VIcon>mdi-close</VIcon>\r\n </VBtn>\r\n </v-toolbar>\r\n <div class=\"vtk-upload__preview-body\">\r\n <VBtn\r\n v-if=\"isImage(previewFile) && hasPreviewPrev\"\r\n icon\r\n class=\"vtk-upload__preview-nav vtk-upload__preview-nav--prev\"\r\n title=\"上一张\"\r\n @click.stop=\"switchPreviewImage(-1)\"\r\n >\r\n <VIcon size=\"36\">mdi-chevron-left</VIcon>\r\n </VBtn>\r\n <VBtn\r\n v-if=\"isImage(previewFile) && hasPreviewNext\"\r\n icon\r\n class=\"vtk-upload__preview-nav vtk-upload__preview-nav--next\"\r\n title=\"下一张\"\r\n @click.stop=\"switchPreviewImage(1)\"\r\n >\r\n <VIcon size=\"36\">mdi-chevron-right</VIcon>\r\n </VBtn>\r\n <div v-if=\"isImage(previewFile)\" class=\"vtk-upload__preview-image-wrap\">\r\n <img\r\n class=\"vtk-upload__preview-image\"\r\n :src=\"previewFile?._previewSrc\"\r\n :alt=\"previewFile?.name\"\r\n :style=\"previewImageStyle\"\r\n draggable=\"false\"\r\n @pointerdown=\"startPreviewDrag\"\r\n />\r\n </div>\r\n <div v-else class=\"vtk-upload__preview-empty\">\r\n <VIcon size=\"64\">{{ isExcel(previewFile) ? 'mdi-microsoft-excel' : 'mdi-file-outline' }}</VIcon>\r\n <div class=\"mt-2\">{{ previewFile?.name }}</div>\r\n <div class=\"text-caption mt-1\">This file cannot be previewed online.</div>\r\n </div>\r\n </div>\r\n </VCard>\r\n </VDialog>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\r\nimport Request from '../../commons/request.js';\r\n\r\ndefineOptions({\r\n name: 'VtkUpload',\r\n inheritAttrs: false,\r\n});\r\n\r\nconst props = defineProps({\r\n /** v-model 文件列表 */\r\n modelValue: {\r\n type: Array,\r\n default: () => [],\r\n },\r\n /** 上传地址 */\r\n action: {\r\n type: String,\r\n default: '',\r\n },\r\n /** 接受的文件类型,同原生 accept */\r\n accept: {\r\n type: String,\r\n default: '',\r\n },\r\n /** 是否多选 */\r\n multiple: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /** 最大上传数量,0 表示不限制 */\r\n limit: {\r\n type: Number,\r\n default: 0,\r\n },\r\n /** 单文件最大体积,单位 MB,0 表示不限制 */\r\n maxSize: {\r\n type: Number,\r\n default: 0,\r\n },\r\n /** 列表类型:text | picture | picture-card */\r\n listType: {\r\n type: String,\r\n default: 'text',\r\n validator: (v) => ['text', 'picture', 'picture-card'].includes(v),\r\n },\r\n /** 是否显示文件列表 */\r\n showFileList: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n /** 是否自动上传 */\r\n autoUpload: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n /** 是否禁用 */\r\n disabled: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /** 详情模式:隐藏上传和删除入口,仅展示已上传文件并保留查看 */\r\n detail: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /** 附加请求头 */\r\n headers: {\r\n type: Object,\r\n default: () => ({}),\r\n },\r\n /** 附加请求数据 */\r\n data: {\r\n type: Object,\r\n default: () => ({}),\r\n },\r\n /** 文件字段名 */\r\n name: {\r\n type: String,\r\n default: 'file',\r\n },\r\n /** 提示文字 */\r\n tip: {\r\n type: String,\r\n default: '',\r\n },\r\n /** 上传前钩子,返回 false 或 rejected Promise 则停止上传 */\r\n beforeUpload: {\r\n type: Function,\r\n default: null,\r\n },\r\n /** 移除前钩子 */\r\n beforeRemove: {\r\n type: Function,\r\n default: null,\r\n },\r\n});\r\n\r\nconst emit = defineEmits([\r\n 'update:modelValue',\r\n 'change',\r\n 'success',\r\n 'error',\r\n 'progress',\r\n 'remove',\r\n 'exceed',\r\n 'preview',\r\n]);\r\n\r\n/* -------------------- 内部状态 -------------------- */\r\nconst inputRef = ref(null);\r\nconst isDragover = ref(false);\r\nconst previewVisible = ref(false);\r\nconst previewFile = ref(null);\r\nconst previewScale = ref(1);\r\nconst previewRotation = ref(0);\r\nconst previewTranslateX = ref(0);\r\nconst previewTranslateY = ref(0);\r\nconst previewDragState = ref(null);\r\n\r\n// 内部维护文件列表\nconst fileList = ref([]);\nlet isSyncingModel = false;\nconst localPreviewUrls = new Set();\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n if (isSyncingModel) {\r\n isSyncingModel = false;\r\n return;\r\n }\r\n\r\n // Accept external URL lists or file object lists.\n revokeAllLocalPreviews();\n fileList.value = normalizeFileList(val || []);\n },\n);\n\r\n/* -------------------- 工具函数 -------------------- */\r\nlet uidCounter = 0;\r\nconst genUid = () => `vtk-upload-${Date.now()}-${uidCounter++}`;\r\n\r\nconst getFileNameFromUrl = (url) => {\n const cleanUrl = String(url || '').split('?')[0].split('#')[0];\n const name = cleanUrl.substring(cleanUrl.lastIndexOf('/') + 1);\n try {\n return decodeURIComponent(name || cleanUrl || 'file');\n } catch (e) {\r\n return name || cleanUrl || 'file';\r\n }\n};\n\nconst isImageUrl = (url) => {\n const value = String(url || '');\n const cleanUrl = value.split('?')[0].split('#')[0];\n return /^data:image\\//i.test(value) || /\\.(png|jpg|jpeg|gif|bmp|webp|svg)$/i.test(cleanUrl);\n};\n\nconst normalizeFileList = (value) => {\n if (!Array.isArray(value)) return [];\n\n return value\n .filter((item) => item)\r\n .map((item) => {\r\n if (typeof item === 'string') {\r\n return {\r\n uid: genUid(),\n name: getFileNameFromUrl(item),\n size: 0,\n type: props.listType === 'picture-card' || isImageUrl(item) ? 'image/*' : '',\n status: 'success',\n percentage: 100,\n raw: null,\n url: item,\r\n preview: '',\r\n response: null,\r\n };\r\n }\r\n\r\n return {\r\n uid: item.uid || genUid(),\n name: item.name || getFileNameFromUrl(item.url || item.preview),\n size: item.size || 0,\n type: item.type || (props.listType === 'picture-card' && (item.url || item.preview) ? 'image/*' : ''),\n status: item.status || 'success',\n percentage: item.percentage ?? 100,\n raw: item.raw || null,\n url: item.url || '',\r\n preview: item.preview || '',\r\n response: item.response || null,\r\n ...item,\r\n };\r\n });\r\n};\r\n\r\nfileList.value = normalizeFileList(props.modelValue || []);\r\n\r\nconst isImage = (file) => {\n if (!file) return false;\n return /image\\//.test(file.type) || isImageUrl(file.name) || isImageUrl(file.url) || isImageUrl(file.preview);\n};\n\r\nconst fileIcon = (file) => {\r\n if (file.status === 'error') return 'mdi-file-alert-outline';\r\n if (isImage(file)) return 'mdi-file-image-outline';\r\n return 'mdi-file-outline';\r\n};\r\n\r\nconst getPreviewSrc = (file) => file?.url || file?.preview || '';\n\nconst revokeLocalPreview = (file) => {\n const preview = file?.preview;\n if (preview && localPreviewUrls.has(preview)) {\n URL.revokeObjectURL(preview);\n localPreviewUrls.delete(preview);\n }\n};\n\nconst revokeAllLocalPreviews = () => {\n fileList.value.forEach(revokeLocalPreview);\n localPreviewUrls.forEach((url) => URL.revokeObjectURL(url));\n localPreviewUrls.clear();\n};\n\r\nconst previewImageList = computed(() => fileList.value.filter((file) => isImage(file) && getPreviewSrc(file)));\r\n\r\nconst previewImageIndex = computed(() => {\r\n if (!previewFile.value) return -1;\r\n return previewImageList.value.findIndex((file) => file.uid === previewFile.value.uid);\r\n});\r\n\r\nconst hasPreviewPrev = computed(() => previewImageIndex.value > 0);\r\nconst hasPreviewNext = computed(() => previewImageIndex.value >= 0 && previewImageIndex.value < previewImageList.value.length - 1);\r\n\r\nconst previewImageStyle = computed(() => ({\r\n transform: `translate(${previewTranslateX.value}px, ${previewTranslateY.value}px) scale(${previewScale.value}) rotate(${previewRotation.value}deg)`,\r\n}));\r\n\r\n/* -------------------- 触发 input -------------------- */\r\nconst triggerInput = () => {\r\n inputRef.value && inputRef.value.click();\r\n};\r\n\r\n/* -------------------- 拖拽 -------------------- */\r\nconst onDragover = () => {\r\n if (!props.disabled && !props.detail) isDragover.value = true;\r\n};\r\n\r\nconst onDrop = (e) => {\r\n isDragover.value = false;\r\n if (props.disabled || props.detail) return;\r\n processFiles(Array.from(e.dataTransfer.files));\r\n};\r\n\r\n/* -------------------- input change -------------------- */\r\nconst onInputChange = (e) => {\r\n if (props.disabled || props.detail) return;\r\n processFiles(Array.from(e.target.files));\r\n // 清空,允许重复选同一文件\r\n e.target.value = '';\r\n};\r\n\r\n/* -------------------- 文件处理 -------------------- */\r\nconst processFiles = (rawFiles) => {\r\n if (!rawFiles.length) return;\r\n\r\n // 数量限制检查\r\n if (props.limit > 0 && fileList.value.length + rawFiles.length > props.limit) {\r\n emit('exceed', rawFiles, fileList.value);\r\n return;\r\n }\r\n\r\n rawFiles.forEach((raw) => {\r\n // 体积检查\r\n if (props.maxSize > 0 && raw.size / 1024 / 1024 > props.maxSize) {\r\n const errFile = buildFile(raw, 'error');\r\n emit('error', new Error(`文件 ${raw.name} 超过最大限制 ${props.maxSize}MB`), errFile, fileList.value);\r\n return;\r\n }\r\n\r\n const file = buildFile(raw, 'ready');\r\n\r\n // 生成本地预览地址,保证 picture-card 选图后立即回显缩略图。\n if (isImage(raw)) {\n if (typeof URL !== 'undefined' && URL.createObjectURL) {\n file.preview = URL.createObjectURL(raw);\n localPreviewUrls.add(file.preview);\n } else {\n const reader = new FileReader();\n reader.onload = (e) => {\n file.preview = e.target.result;\n emit('change', file, fileList.value);\n };\n reader.readAsDataURL(raw);\n }\n }\n\r\n const beforeHook = props.beforeUpload ? props.beforeUpload(raw) : true;\r\n Promise.resolve(beforeHook).then((result) => {\r\n if (result === false) return;\r\n addFile(file);\r\n if (props.autoUpload && props.action) {\r\n uploadFile(file);\r\n }\r\n }).catch(() => {});\r\n });\r\n};\r\n\r\nconst buildFile = (raw, status) => ({\r\n uid: genUid(),\r\n name: raw.name,\r\n size: raw.size,\r\n type: raw.type,\r\n status,\r\n percentage: 0,\r\n raw,\r\n url: '',\r\n preview: '',\r\n response: null,\r\n});\r\n\r\nconst addFile = (file) => {\r\n fileList.value.push(file);\r\n syncModel();\r\n emit('change', file, fileList.value);\r\n};\r\n\r\nconst syncModel = () => {\r\n const urls = fileList.value\r\n .filter((f) => f.status === 'success' && f.url)\r\n .map((f) => String(f.url));\r\n isSyncingModel = true;\r\n emit('update:modelValue', urls);\r\n nextTick(() => {\r\n isSyncingModel = false;\r\n });\r\n};\r\n\r\n/* -------------------- 上传逻辑 -------------------- */\r\nconst uploadFile = (file) => {\r\n file.status = 'uploading';\r\n const formData = new FormData();\r\n formData.append(props.name, file.raw);\r\n Object.entries(props.data).forEach(([k, v]) => formData.append(k, v));\r\n\r\n // 使用 axios 直接调,以获得 onUploadProgress\r\n const tokenKey = window.VTK_CONFIG?.storageKeys?.token || '_mis_acis_token';\r\n const token = window.$vtk?.storage?.get(tokenKey) || localStorage.getItem(tokenKey);\r\n\r\n const headers = {\r\n 'content-type': 'multipart/form-data',\r\n ...props.headers,\r\n };\r\n if (token) headers['Authorization'] = `Bearer ${token}`;\r\n\r\n Request.http(props.action, formData, 'POST', headers).then((res) => {\r\n file.status = 'success';\r\n file.response = res;\r\n // 兼容 { data: 'url' } 和 { data: { url: '...' } } 两种结构\n const url = typeof res?.data === 'string' ? res.data : (res?.data?.url || res?.url || '');\n if (url) {\n file.url = url;\n revokeLocalPreview(file);\n }\n console.log('[VtkUpload] res:', res, '| file.url:', file.url, '| fileList:', JSON.parse(JSON.stringify(fileList.value)));\r\n syncModel();\r\n emit('success', res, file, fileList.value);\r\n emit('change', file, fileList.value);\r\n }).catch((err) => {\r\n file.status = 'error';\r\n syncModel();\r\n emit('error', err, file, fileList.value);\r\n emit('change', file, fileList.value);\r\n });\r\n};\r\n\r\n/* -------------------- 移除文件 -------------------- */\r\nconst handleRemove = (file) => {\r\n const doRemove = () => {\n revokeLocalPreview(file);\n fileList.value = fileList.value.filter((f) => f.uid !== file.uid);\n syncModel();\n emit('remove', file, fileList.value);\n };\r\n\r\n if (props.beforeRemove) {\r\n Promise.resolve(props.beforeRemove(file, fileList.value)).then((result) => {\r\n if (result !== false) doRemove();\r\n }).catch(() => {});\r\n } else {\r\n doRemove();\r\n }\r\n};\r\n\r\n/* -------------------- 预览 -------------------- */\r\nconst isExcel = (file) => /\\.(xlsx|xls)$/i.test(file?.name || '');\r\n\r\nconst resetPreviewTransform = () => {\r\n previewScale.value = 1;\r\n previewRotation.value = 0;\r\n previewTranslateX.value = 0;\r\n previewTranslateY.value = 0;\r\n};\r\n\r\nconst closePreview = () => {\r\n previewVisible.value = false;\r\n};\r\n\r\nconst rotatePreview = (degrees) => {\r\n previewRotation.value += degrees;\r\n};\r\n\r\nconst zoomPreview = (step) => {\r\n const nextScale = Number((previewScale.value + step).toFixed(2));\r\n previewScale.value = Math.min(3, Math.max(0.2, nextScale));\r\n};\r\n\r\nconst setImagePreviewFile = (file) => {\r\n previewFile.value = {\r\n ...file,\r\n _previewSrc: getPreviewSrc(file),\r\n };\r\n resetPreviewTransform();\r\n};\r\n\r\nconst switchPreviewImage = (step) => {\r\n if (!isImage(previewFile.value)) return;\r\n\r\n const index = previewImageIndex.value;\r\n const nextFile = previewImageList.value[index + step];\r\n if (!nextFile) return;\r\n\r\n emit('preview', nextFile);\r\n setImagePreviewFile(nextFile);\r\n};\r\n\r\nconst handlePreviewKeydown = (event) => {\r\n if (!previewVisible.value || !isImage(previewFile.value)) return;\r\n\r\n if (event.key === 'ArrowLeft' && hasPreviewPrev.value) {\r\n event.preventDefault();\r\n switchPreviewImage(-1);\r\n }\r\n\r\n if (event.key === 'ArrowRight' && hasPreviewNext.value) {\r\n event.preventDefault();\r\n switchPreviewImage(1);\r\n }\r\n};\r\n\r\nconst startPreviewDrag = (event) => {\r\n if (previewScale.value <= 1) return;\r\n event.preventDefault();\r\n const target = event.currentTarget;\r\n previewDragState.value = {\r\n pointerId: event.pointerId,\r\n startX: event.clientX,\r\n startY: event.clientY,\r\n translateX: previewTranslateX.value,\r\n translateY: previewTranslateY.value,\r\n };\r\n target.setPointerCapture?.(event.pointerId);\r\n target.addEventListener('pointermove', movePreviewDrag);\r\n target.addEventListener('pointerup', endPreviewDrag, { once: true });\r\n target.addEventListener('pointercancel', endPreviewDrag, { once: true });\r\n};\r\n\r\nconst movePreviewDrag = (event) => {\r\n const state = previewDragState.value;\r\n if (!state || state.pointerId !== event.pointerId) return;\r\n previewTranslateX.value = state.translateX + event.clientX - state.startX;\r\n previewTranslateY.value = state.translateY + event.clientY - state.startY;\r\n};\r\n\r\nconst endPreviewDrag = (event) => {\r\n event.currentTarget?.releasePointerCapture?.(event.pointerId);\r\n event.currentTarget?.removeEventListener('pointermove', movePreviewDrag);\r\n previewDragState.value = null;\r\n};\r\n\r\nconst openFileInNewTab = (file, fileUrl) => {\r\n if (fileUrl) {\r\n window.open(fileUrl, '_blank');\r\n return;\r\n }\r\n\r\n if (file.raw instanceof File || file.raw instanceof Blob) {\r\n const blobUrl = URL.createObjectURL(file.raw);\r\n const win = window.open(blobUrl, '_blank');\r\n win?.addEventListener('unload', () => URL.revokeObjectURL(blobUrl));\r\n }\r\n};\r\n\r\nconst openCurrentPreview = () => {\r\n if (!previewFile.value) return;\r\n openFileInNewTab(previewFile.value, previewFile.value._previewSrc || previewFile.value.url || previewFile.value.preview);\r\n};\r\n\r\nconst handlePreview = (file) => {\r\n emit('preview', file);\r\n\r\n const fileUrl = getPreviewSrc(file);\r\n\r\n // Non-image files open in a new tab.\r\n if (!isImage(file) && !isExcel(file)) {\r\n openFileInNewTab(file, fileUrl);\r\n return;\r\n }\r\n\r\n // Excel:Office Online 查看器(需要文件有公网 URL)\r\n if (isExcel(file)) {\r\n if (fileUrl && /^https?:\\/\\//.test(fileUrl)) {\r\n window.open(`https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(fileUrl)}`, '_blank');\r\n } else {\r\n // Excel without a public URL falls back to the dialog hint.\r\n previewFile.value = { ...file, _previewSrc: fileUrl };\r\n resetPreviewTransform();\r\n previewVisible.value = true;\r\n }\r\n return;\r\n }\r\n\r\n // Images preview inside the dialog.\r\n setImagePreviewFile(file);\r\n previewVisible.value = true;\r\n};\r\n\r\nwatch(previewVisible, (visible) => {\r\n if (visible) {\r\n window.addEventListener('keydown', handlePreviewKeydown);\r\n return;\r\n }\r\n\r\n window.removeEventListener('keydown', handlePreviewKeydown);\r\n resetPreviewTransform();\r\n});\r\n\r\nonBeforeUnmount(() => {\n window.removeEventListener('keydown', handlePreviewKeydown);\n revokeAllLocalPreviews();\n});\n\r\n/* -------------------- 对外暴露方法 -------------------- */\r\n/** 手动触发未上传文件的上传 */\r\nconst submit = () => {\r\n fileList.value\r\n .filter((f) => f.status === 'ready' && props.action)\r\n .forEach(uploadFile);\r\n};\r\n\r\n/** 清空文件列表 */\r\nconst clearFiles = () => {\n revokeAllLocalPreviews();\n fileList.value = [];\n syncModel();\n};\n\r\n/** 手动移除某个文件 */\r\nconst remove = (file) => handleRemove(file);\r\n\r\ndefineExpose({ submit, clearFiles, remove });\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.vtk-upload {\r\n width: 100%;\r\n}\r\n\r\n/* ---- 拖拽区域 ---- */\r\n.vtk-upload__dragger {\r\n border: 1px dashed rgba(0, 0, 0, 0.2);\r\n border-radius: 6px;\r\n padding: 24px 16px;\r\n text-align: center;\r\n cursor: pointer;\r\n transition: border-color 0.2s, background 0.2s;\r\n background: transparent;\r\n\r\n &:hover:not(.is-disabled) {\r\n border-color: rgb(var(--v-theme-primary));\r\n }\r\n\r\n &.is-dragover {\r\n border-color: rgb(var(--v-theme-primary));\r\n background: rgba(var(--v-theme-primary), 0.05);\r\n }\r\n\r\n &.is-disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n }\r\n}\r\n\r\n/* ---- 文件列表 ---- */\r\n.vtk-upload__list {\r\n border-top: 1px solid rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.vtk-upload__list-item {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n padding: 4px 4px 4px 8px;\r\n border-radius: 4px;\r\n font-size: 13px;\r\n transition: background 0.15s;\r\n\r\n &:hover {\r\n background: rgba(0, 0, 0, 0.04);\r\n }\r\n\r\n &.is-error {\r\n color: rgb(var(--v-theme-error));\r\n }\r\n\r\n &.is-success .vtk-upload__list-item-name {\r\n cursor: pointer;\r\n &:hover { color: rgb(var(--v-theme-primary)); }\r\n }\r\n}\r\n\r\n.vtk-upload__list-item-name {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n max-width: 500px;\r\n}\r\n\r\n.vtk-upload__list-progress {\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n}\r\n\r\n/* ---- picture-card ---- */\r\n.vtk-upload__picture-card-wrap {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n}\r\n\r\n.vtk-upload__picture-card-item,\r\n.vtk-upload__picture-card-add {\r\n width: 100px;\r\n height: 100px;\r\n border-radius: 6px;\r\n overflow: hidden;\r\n}\r\n\r\n.vtk-upload__picture-card-item {\r\n position: relative;\r\n border: 1px solid rgba(0, 0, 0, 0.12);\r\n\r\n &:hover .vtk-upload__picture-card-mask {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n.vtk-upload__picture-card-mask {\r\n position: absolute;\r\n inset: 0;\r\n background: rgba(0, 0, 0, 0.08);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 4px;\r\n opacity: 0;\r\n transition: opacity 0.2s;\r\n}\r\n\r\n.vtk-upload__picture-card-progress {\r\n position: absolute;\r\n inset: 0;\r\n background: rgba(0, 0, 0, 0.4);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.vtk-upload__picture-card-add {\r\n border: 1px dashed rgba(0, 0, 0, 0.2);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n transition: border-color 0.2s, background 0.2s;\r\n\r\n &:hover, &.is-dragover {\r\n border-color: rgb(var(--v-theme-primary));\r\n background: rgba(var(--v-theme-primary), 0.04);\r\n }\r\n}\r\n\r\n/* ---- 隐藏 input ---- */\r\n.vtk-upload__input {\r\n display: none;\r\n}\r\n\r\n/* ---- preview ---- */\r\n.vtk-upload__preview-card {\r\n --vtk-upload-preview-bg: rgba(0, 0, 0, 0.3);\r\n\r\n height: 100vh;\r\n background: var(--vtk-upload-preview-bg);\r\n}\r\n\r\n.vtk-upload__preview-body {\r\n height: calc(100vh - 64px);\r\n overflow: auto;\r\n background: var(--vtk-upload-preview-bg);\r\n position: relative;\r\n}\r\n\r\n.vtk-upload__preview-nav {\n position: fixed;\n top: 50%;\n z-index: 10;\n width: 50px;\n height: 50px;\n color: #fff;\n background: rgba(0, 0, 0, 0.5);\n transform: translateY(-50%);\n}\n\n.vtk-upload__preview-nav--prev {\n left: 20px;\n}\n\n.vtk-upload__preview-nav--next {\n right: 20px;\n}\n\r\n.vtk-upload__preview-image-wrap {\r\n min-width: 100%;\r\n min-height: 100%;\r\n padding: 32px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.vtk-upload__preview-image {\r\n display: block;\r\n max-width: 90vw;\r\n max-height: calc(100vh - 128px);\r\n object-fit: contain;\r\n transform-origin: center center;\r\n transition: transform 0.2s ease;\r\n user-select: none;\r\n cursor: grab;\r\n touch-action: none;\r\n\r\n &:active {\r\n cursor: grabbing;\r\n }\r\n}\r\n\r\n.vtk-upload__preview-empty {\r\n min-height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 32px;\r\n color: rgba(var(--v-theme-on-surface), 0.72);\r\n text-align: center;\r\n}\r\n</style>\r\n","import Request from \"./request.js\";\r\nimport Storage from \"./storage.js\";\r\nimport Message from \"../components/message/index.js\";\r\n\r\nfunction isAid(value) {\r\n const str = String(value || \"\");\r\n return !!str && !/^(https?:)?\\/\\//i.test(str) && !str.includes(\"/\") && !str.includes(\"?\");\r\n\r\n \r\n}\r\n\r\nfunction getLinkFromResponse(data) {\r\n if (!data) {\r\n return \"\";\r\n }\r\n\r\n if (typeof data === \"string\") {\r\n return data;\r\n }\r\n\r\n return data.puri || \"\";\r\n}\r\n\r\nfunction buildUrlWithParams(target, appendParams) {\r\n const queryString = target.includes(\"?\") ? target.split(\"?\")[1] : \"\";\r\n const queryParams = new URLSearchParams(queryString);\r\n const newParams = [];\r\n\r\n Object.entries(appendParams).forEach(([key, value]) => {\r\n if (!key || value === undefined || value === null || value === \"\") {\r\n return;\r\n }\r\n\r\n if (!queryParams.has(key)) {\r\n newParams.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\r\n }\r\n });\r\n\r\n if (!newParams.length) {\r\n return target;\r\n }\r\n\r\n const joinSymbol = target.includes(\"?\") ? \"&\" : \"?\";\r\n return `${target}${joinSymbol}${newParams.join(\"&\")}`;\r\n}\r\n\r\nfunction appendParamsToUrl(targetUrl, appendParams) {\r\n const hashIndex = targetUrl.indexOf(\"#\");\r\n\r\n if (hashIndex === -1) {\r\n return buildUrlWithParams(targetUrl, appendParams);\r\n }\r\n\r\n const baseUrl = targetUrl.slice(0, hashIndex);\r\n const hashRoute = targetUrl.slice(hashIndex + 1);\r\n const newHashRoute = buildUrlWithParams(hashRoute, appendParams);\r\n return `${baseUrl}#${newHashRoute}`;\r\n}\r\n\r\nasync function resolveAidUrl(aid) {\r\n if (!aid) {\r\n return aid;\r\n }\r\n\r\n try {\r\n const res = await Request.postForm(\"/kudas/xfwez/apps\", { aid });\r\n const realUrl = res?.meta?.success ? getLinkFromResponse(res.data) : \"\";\r\n return realUrl || aid;\r\n } catch (error) {\r\n return aid;\r\n }\r\n}\r\n\r\nfunction buildAppendParams(sobject, sroute, stokenKey) {\r\n const appendParams = {};\r\n const storageKey = stokenKey || \"_mis_acis_token\";\r\n const stoken = Storage.get(storageKey);\r\n\r\n if (stoken !== undefined && stoken !== null && stoken !== \"\") {\r\n appendParams.stoken = stoken;\r\n }\r\n\r\n if (sroute) {\r\n appendParams.sroute = sroute;\r\n }\r\n\r\n if (sobject && typeof sobject === \"object\" && Object.keys(sobject).length) {\r\n appendParams.sobject = btoa(encodeURIComponent(JSON.stringify(sobject)));\r\n }\r\n\r\n return appendParams;\r\n}\r\n\r\n/**\r\n * 解析地址中的指定参数值。\r\n * @param {string} name 参数名。\r\n * @param {string} url 要解析的地址,不传时默认使用当前地址。\r\n * @return {string} 参数值;未找到时返回空字符串。\r\n */\r\nexport function GetQueryString(name, url = window.location.href) {\r\n const reg = new RegExp(`[?&]${name}=([^&^#^/]*)`, \"i\");\r\n const res = String(url || \"\").match(reg);\r\n return res ? decodeURIComponent(res[1]) : \"\";\r\n}\r\n\r\n/**\r\n * 追加应用访问参数。\r\n * @param {string} url 链接地址或应用 aid;不传时默认取当前地址。\r\n * @param {Object} sobject 参数对象;会按 `btoa(encodeURIComponent(JSON.stringify(sobject)))` 编码后追加为 `sobject` 参数。\r\n * @param {string} sroute 页面路由标识;传值后会在最终地址中追加 `sroute=xxx`。\r\n * @param {string} stokenKey 取 `stoken` 的存储键名,默认 `_mis_acis_token`。\r\n * @return {Promise<string>} 拼接后的链接地址。\r\n */\r\nexport async function appendAppParams(url, sobject = {}, sroute = \"\", stokenKey = \"_mis_acis_token\") {\r\n if (url === undefined || url === null || url === \"\" || url === 0 || url === \"0\") {\r\n Message.toast(\"应用标识错误\", { color: \"error\" });\r\n return \"\";\r\n }\r\n\r\n const source = url || window.location.href;\r\n\r\n if (!source) {\r\n return \"\";\r\n }\r\n\r\n const targetUrl = isAid(source) ? await resolveAidUrl(source) : source;\r\n return appendParamsToUrl(targetUrl, buildAppendParams(sobject, sroute, stokenKey));\r\n}\r\n","/**\r\n * 将数值转换成中文 '0:未启/1:已启'\r\n * \r\n * @param {*} val 数值\r\n * @param {*} map 值对\r\n * @return {string} 中文值\r\n */\r\nexport function dict(val, map) {\r\n let value = \"\";\r\n if (val && val.includes(\",\")) {\r\n value = val.split(\",\").map(item => pre(item, map)).join();\r\n } else {\r\n value = pre(val, map)\r\n }\r\n return value;\r\n}\r\n\r\nfunction pre(value, map) {\r\n if (value) {\r\n var val = Array.isArray(value) ? value : value.split(\",\");\r\n var maps = map?.split(\"/\");\r\n var results = []; // 创建一个空数组,用于存储匹配到的值\r\n // 遍历 val 数组\r\n for (var j = 0; j < val?.length; j++) {\r\n var currentVal = val[j]; // 获取当前要查找的键\r\n for (var i in maps) {\r\n var kv = maps[i].split(\":\");\r\n if (kv[0] == currentVal) {\r\n results.push(kv[1]); // 将匹配到的值添加到结果数组中\r\n break; // 找到匹配项后,跳出内层循环\r\n }\r\n }\r\n }\r\n return results.length > 0 ? results.join() : \"其他\";\r\n }\r\n\r\n}\r\n\r\n\r\n/**\r\n * 1,2字符残疾类别转换\r\n * \r\n * @param {*} val 数值\r\n * @return {string} 中文值\r\n */\r\nexport function analyType(val) {\r\n if (!val) {\r\n return ''\r\n }\r\n let newVal = ''\r\n let arr = ['视力', '听力', '言语', '肢体', '智力', '精神', '多重']\r\n for (let i = 1; i < 8; i++) {\r\n if (i === 1) {\r\n newVal = val.replace(i.toString(), arr[i - 1])\r\n } else {\r\n newVal = newVal.replace(i.toString(), arr[i - 1])\r\n }\r\n }\r\n return newVal;\r\n}\r\nexport function analyLevel(val) {\r\n if (!val) {\r\n return ''\r\n }\r\n let newVal = ''\r\n let arr = ['一级', '二级', '三级', '四级', '不限等级']\r\n for (let i = 1; i < 7; i++) {\r\n if (i === 1) {\r\n newVal = val.replace(i.toString(), arr[i - 1])\r\n } else {\r\n newVal = newVal.replace(i.toString(), arr[i - 1])\r\n }\r\n }\r\n return newVal;\r\n}","/**\r\n * \r\n * @param {*} value 需格式化的时间\r\n * @param {*} fmt 格式\r\n */\r\nexport function date(value, fmt) {\r\n if (!value || value == '无' || value == null) {\r\n fmt = '无';\r\n return fmt;\r\n }\r\n let getDate = new Date(value)\r\n let o = {\r\n 'M+': getDate.getMonth() + 1,\r\n 'd+': getDate.getDate(),\r\n 'H+': getDate.getHours(),\r\n 'h+': getDate.getHours(),\r\n 'm+': getDate.getMinutes(),\r\n 's+': getDate.getSeconds(),\r\n 'q+': Math.floor((getDate.getMonth() + 3) / 3),\r\n 'S': getDate.getMilliseconds()\r\n }\r\n if (/(y+)/.test(fmt)) {\r\n fmt = fmt.replace(RegExp.$1, (getDate.getFullYear() + '').substr(4 - RegExp.$1.length))\r\n }\r\n for (let k in o) {\r\n if (new RegExp('(' + k + ')').test(fmt)) {\r\n fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))\r\n }\r\n }\r\n return fmt\r\n\r\n}\r\n\r\n\r\n/**\r\n * 数字格式化 '0,000.00'\r\n * @param {*} val 数值\r\n * @param {*} fmt 格式\r\n * @return {string} 数字字符串\r\n */\r\nexport function num(val, fmt) {\r\n if (isNaN(val) || val === '' || val === null) {\r\n return val;\r\n }\r\n\r\n // 移除了对Strings和Datetime的依赖,这些在当前上下文中未定义\r\n var numValue = parseFloat(val);\r\n var neg = numValue < 0 ? \"-\" : \"\"; // 正负数\r\n var absValue = Math.abs(numValue);\r\n\r\n // 解析格式字符串,确定小数位数\r\n var fix = 0;\r\n if (fmt && fmt.includes('.')) {\r\n fix = fmt.length - fmt.lastIndexOf('.') - 1;\r\n }\r\n\r\n // 是否需要千分位分隔符\r\n var needSep = fmt && fmt.includes(',');\r\n\r\n // 处理小数部分\r\n var xs = fix > 0 ? absValue.toFixed(fix) : Math.round(absValue);\r\n var decimalPart = fix > 0 ? '.' + xs.toString().split('.')[1] : '';\r\n\r\n // 处理整数部分\r\n var integerPart = fix > 0 ? Math.floor(absValue).toString() : xs.toString();\r\n\r\n // 添加千分位分隔符\r\n if (needSep && integerPart.length > 3) {\r\n integerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n }\r\n\r\n return neg + integerPart + decimalPart;\r\n}\r\n\r\n\r\n/**\r\n * 年龄\r\n * @param {*} val 时间 yyyy-MM-dd\r\n * @return {string} 年龄\r\n */\r\nexport function age(val) {\r\n let birthdays = new Date(val.slice(0, 10).replace(/-/g, \"/\"));\r\n let d = new Date();\r\n let age = d.getFullYear() - birthdays.getFullYear() - ((d.getMonth() < birthdays.getMonth() || (d.getMonth() === birthdays.getMonth() && d.getDate() < birthdays.getDate())) ? 1 : 0);\r\n return age;\r\n}\r\n\r\n/**\r\n * 指定中文大于len,用...省略号表示,达到美观效果\r\n * @param {*} val 需格式的中文\r\n * @param {*} len 需格式的长度\r\n */\r\nexport function txt(val, len) {\r\n if (val?.length > len) {\r\n return val.slice(0, len) + \"...\";\r\n } else {\r\n return val;\r\n }\r\n\r\n}\r\n\r\n/**\r\n * 取数据绝对值\r\n * @param {*} val 手机号\r\n */\r\nexport function abs(val) {\r\n return isNaN(val) ? 0 : Math.abs(val)\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/**\r\n * 脱敏手机号码\r\n * @param {*} val 手机号\r\n * @return {string} 手机号码\r\n */\r\nexport function mobile(val) {\r\n return val.replace(/(\\d{3})\\d{4}(\\d{4})/, \"$1****$2\");\r\n}\r\n\r\n\r\n/**\r\n * 脱敏身份证号\r\n * @param {*} val 身份证号\r\n * @return {string} 身份证号\r\n */\r\nexport function idcard(val) {\r\n if (val) {\r\n return val.replace(/^(.{4})(?:\\d+)(.{4})$/, \"$1** **** ****$2\");\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","export const red = {\n base: '#f44336',\n lighten5: '#ffebee',\n lighten4: '#ffcdd2',\n lighten3: '#ef9a9a',\n lighten2: '#e57373',\n lighten1: '#ef5350',\n darken1: '#e53935',\n darken2: '#d32f2f',\n darken3: '#c62828',\n darken4: '#b71c1c',\n accent1: '#ff8a80',\n accent2: '#ff5252',\n accent3: '#ff1744',\n accent4: '#d50000'\n};\nexport const pink = {\n base: '#e91e63',\n lighten5: '#fce4ec',\n lighten4: '#f8bbd0',\n lighten3: '#f48fb1',\n lighten2: '#f06292',\n lighten1: '#ec407a',\n darken1: '#d81b60',\n darken2: '#c2185b',\n darken3: '#ad1457',\n darken4: '#880e4f',\n accent1: '#ff80ab',\n accent2: '#ff4081',\n accent3: '#f50057',\n accent4: '#c51162'\n};\nexport const purple = {\n base: '#9c27b0',\n lighten5: '#f3e5f5',\n lighten4: '#e1bee7',\n lighten3: '#ce93d8',\n lighten2: '#ba68c8',\n lighten1: '#ab47bc',\n darken1: '#8e24aa',\n darken2: '#7b1fa2',\n darken3: '#6a1b9a',\n darken4: '#4a148c',\n accent1: '#ea80fc',\n accent2: '#e040fb',\n accent3: '#d500f9',\n accent4: '#aa00ff'\n};\nexport const deepPurple = {\n base: '#673ab7',\n lighten5: '#ede7f6',\n lighten4: '#d1c4e9',\n lighten3: '#b39ddb',\n lighten2: '#9575cd',\n lighten1: '#7e57c2',\n darken1: '#5e35b1',\n darken2: '#512da8',\n darken3: '#4527a0',\n darken4: '#311b92',\n accent1: '#b388ff',\n accent2: '#7c4dff',\n accent3: '#651fff',\n accent4: '#6200ea'\n};\nexport const indigo = {\n base: '#3f51b5',\n lighten5: '#e8eaf6',\n lighten4: '#c5cae9',\n lighten3: '#9fa8da',\n lighten2: '#7986cb',\n lighten1: '#5c6bc0',\n darken1: '#3949ab',\n darken2: '#303f9f',\n darken3: '#283593',\n darken4: '#1a237e',\n accent1: '#8c9eff',\n accent2: '#536dfe',\n accent3: '#3d5afe',\n accent4: '#304ffe'\n};\nexport const blue = {\n base: '#2196f3',\n lighten5: '#e3f2fd',\n lighten4: '#bbdefb',\n lighten3: '#90caf9',\n lighten2: '#64b5f6',\n lighten1: '#42a5f5',\n darken1: '#1e88e5',\n darken2: '#1976d2',\n darken3: '#1565c0',\n darken4: '#0d47a1',\n accent1: '#82b1ff',\n accent2: '#448aff',\n accent3: '#2979ff',\n accent4: '#2962ff'\n};\nexport const lightBlue = {\n base: '#03a9f4',\n lighten5: '#e1f5fe',\n lighten4: '#b3e5fc',\n lighten3: '#81d4fa',\n lighten2: '#4fc3f7',\n lighten1: '#29b6f6',\n darken1: '#039be5',\n darken2: '#0288d1',\n darken3: '#0277bd',\n darken4: '#01579b',\n accent1: '#80d8ff',\n accent2: '#40c4ff',\n accent3: '#00b0ff',\n accent4: '#0091ea'\n};\nexport const cyan = {\n base: '#00bcd4',\n lighten5: '#e0f7fa',\n lighten4: '#b2ebf2',\n lighten3: '#80deea',\n lighten2: '#4dd0e1',\n lighten1: '#26c6da',\n darken1: '#00acc1',\n darken2: '#0097a7',\n darken3: '#00838f',\n darken4: '#006064',\n accent1: '#84ffff',\n accent2: '#18ffff',\n accent3: '#00e5ff',\n accent4: '#00b8d4'\n};\nexport const teal = {\n base: '#009688',\n lighten5: '#e0f2f1',\n lighten4: '#b2dfdb',\n lighten3: '#80cbc4',\n lighten2: '#4db6ac',\n lighten1: '#26a69a',\n darken1: '#00897b',\n darken2: '#00796b',\n darken3: '#00695c',\n darken4: '#004d40',\n accent1: '#a7ffeb',\n accent2: '#64ffda',\n accent3: '#1de9b6',\n accent4: '#00bfa5'\n};\nexport const green = {\n base: '#4caf50',\n lighten5: '#e8f5e9',\n lighten4: '#c8e6c9',\n lighten3: '#a5d6a7',\n lighten2: '#81c784',\n lighten1: '#66bb6a',\n darken1: '#43a047',\n darken2: '#388e3c',\n darken3: '#2e7d32',\n darken4: '#1b5e20',\n accent1: '#b9f6ca',\n accent2: '#69f0ae',\n accent3: '#00e676',\n accent4: '#00c853'\n};\nexport const lightGreen = {\n base: '#8bc34a',\n lighten5: '#f1f8e9',\n lighten4: '#dcedc8',\n lighten3: '#c5e1a5',\n lighten2: '#aed581',\n lighten1: '#9ccc65',\n darken1: '#7cb342',\n darken2: '#689f38',\n darken3: '#558b2f',\n darken4: '#33691e',\n accent1: '#ccff90',\n accent2: '#b2ff59',\n accent3: '#76ff03',\n accent4: '#64dd17'\n};\nexport const lime = {\n base: '#cddc39',\n lighten5: '#f9fbe7',\n lighten4: '#f0f4c3',\n lighten3: '#e6ee9c',\n lighten2: '#dce775',\n lighten1: '#d4e157',\n darken1: '#c0ca33',\n darken2: '#afb42b',\n darken3: '#9e9d24',\n darken4: '#827717',\n accent1: '#f4ff81',\n accent2: '#eeff41',\n accent3: '#c6ff00',\n accent4: '#aeea00'\n};\nexport const yellow = {\n base: '#ffeb3b',\n lighten5: '#fffde7',\n lighten4: '#fff9c4',\n lighten3: '#fff59d',\n lighten2: '#fff176',\n lighten1: '#ffee58',\n darken1: '#fdd835',\n darken2: '#fbc02d',\n darken3: '#f9a825',\n darken4: '#f57f17',\n accent1: '#ffff8d',\n accent2: '#ffff00',\n accent3: '#ffea00',\n accent4: '#ffd600'\n};\nexport const amber = {\n base: '#ffc107',\n lighten5: '#fff8e1',\n lighten4: '#ffecb3',\n lighten3: '#ffe082',\n lighten2: '#ffd54f',\n lighten1: '#ffca28',\n darken1: '#ffb300',\n darken2: '#ffa000',\n darken3: '#ff8f00',\n darken4: '#ff6f00',\n accent1: '#ffe57f',\n accent2: '#ffd740',\n accent3: '#ffc400',\n accent4: '#ffab00'\n};\nexport const orange = {\n base: '#ff9800',\n lighten5: '#fff3e0',\n lighten4: '#ffe0b2',\n lighten3: '#ffcc80',\n lighten2: '#ffb74d',\n lighten1: '#ffa726',\n darken1: '#fb8c00',\n darken2: '#f57c00',\n darken3: '#ef6c00',\n darken4: '#e65100',\n accent1: '#ffd180',\n accent2: '#ffab40',\n accent3: '#ff9100',\n accent4: '#ff6d00'\n};\nexport const deepOrange = {\n base: '#ff5722',\n lighten5: '#fbe9e7',\n lighten4: '#ffccbc',\n lighten3: '#ffab91',\n lighten2: '#ff8a65',\n lighten1: '#ff7043',\n darken1: '#f4511e',\n darken2: '#e64a19',\n darken3: '#d84315',\n darken4: '#bf360c',\n accent1: '#ff9e80',\n accent2: '#ff6e40',\n accent3: '#ff3d00',\n accent4: '#dd2c00'\n};\nexport const brown = {\n base: '#795548',\n lighten5: '#efebe9',\n lighten4: '#d7ccc8',\n lighten3: '#bcaaa4',\n lighten2: '#a1887f',\n lighten1: '#8d6e63',\n darken1: '#6d4c41',\n darken2: '#5d4037',\n darken3: '#4e342e',\n darken4: '#3e2723'\n};\nexport const blueGrey = {\n base: '#607d8b',\n lighten5: '#eceff1',\n lighten4: '#cfd8dc',\n lighten3: '#b0bec5',\n lighten2: '#90a4ae',\n lighten1: '#78909c',\n darken1: '#546e7a',\n darken2: '#455a64',\n darken3: '#37474f',\n darken4: '#263238'\n};\nexport const grey = {\n base: '#9e9e9e',\n lighten5: '#fafafa',\n lighten4: '#f5f5f5',\n lighten3: '#eeeeee',\n lighten2: '#e0e0e0',\n lighten1: '#bdbdbd',\n darken1: '#757575',\n darken2: '#616161',\n darken3: '#424242',\n darken4: '#212121'\n};\nexport const shades = {\n black: '#000000',\n white: '#ffffff',\n transparent: '#ffffff00'\n};\nexport default {\n red,\n pink,\n purple,\n deepPurple,\n indigo,\n blue,\n lightBlue,\n cyan,\n teal,\n green,\n lightGreen,\n lime,\n yellow,\n amber,\n orange,\n deepOrange,\n brown,\n blueGrey,\n grey,\n shades\n};\n//# sourceMappingURL=colors.js.map","import colors from 'vuetify/lib/util/colors';\r\n\r\nconst theme_colors = [\r\n {\r\n name: 'Blue-light',\r\n scheme: 'md-blue-500-scheme',\r\n dark: true,\r\n primary: colors.blue.base,\r\n secondary: colors.blue.lighten4, // #FFCDD2\r\n accent: colors.blue.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Yellow-light',\r\n scheme: 'md-amber-a700-scheme',\r\n dark: true,\r\n primary: colors.amber.darken1,\r\n secondary: colors.amber.lighten4, // #FFCDD2\r\n accent: colors.amber.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Red-light',\r\n scheme: 'md-red-a400-scheme',\r\n dark: true,\r\n primary: colors.red.accent3,\r\n secondary: colors.red.lighten4, // #FFCDD2\r\n accent: colors.red.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Pink-light',\r\n dark: false,\r\n scheme: 'md-pink-a100-scheme',\r\n primary: colors.pink.accent1,\r\n secondary: colors.pink.lighten4, // #FFCDD2\r\n accent: colors.pink.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'Purple-light',\r\n dark: false,\r\n scheme: 'md-purple-a700-scheme',\r\n primary: colors.purple.accent4,\r\n secondary: colors.purple.lighten4, // #FFCDD2\r\n accent: colors.purple.accent2, // #3F51B5\r\n },\r\n {\r\n name: 'DeepPurple-light',\r\n dark: false,\r\n scheme: 'md-deep-purple-a700-scheme',\r\n primary: colors.deepPurple.base,\r\n secondary: colors.deepPurple.lighten4, // #FFCDD2\r\n accent: colors.deepPurple.accent2, // #3F51B5\r\n }\r\n];\r\n\r\nconst navi_colors = [\r\n {\r\n name: 'black',\r\n class: 'black'\r\n },\r\n {\r\n name: 'red-pink',\r\n class: 'gradient-red-pink'\r\n },\r\n {\r\n name: 'blue-grey-blue',\r\n class: 'gradient-blue-grey-blue'\r\n },\r\n {\r\n name: 'green-teal',\r\n class: 'gradient-green-teal'\r\n },\r\n {\r\n name: 'purple-deep-purple',\r\n class: 'gradient-purple-deep-purple'\r\n },\r\n {\r\n name: 'purple-amber',\r\n class: 'gradient-purple-amber'\r\n },\r\n {\r\n name: 'indigo-purple',\r\n class: 'gradient-indigo-purple'\r\n },\r\n {\r\n name: 'deep-purple-blue',\r\n class: 'gradient-deep-purple-blue'\r\n },\r\n {\r\n name: 'deep-orange-orange',\r\n class: 'gradient-deep-orange-orange'\r\n },\r\n {\r\n name: 'light-blue-cyan',\r\n class: 'gradient-light-blue-cyan'\r\n },\r\n {\r\n name: 'timber',\r\n class: 'gradient-timber'\r\n },\r\n {\r\n name: 'strawberry',\r\n class: 'gradient-strawberry'\r\n },\r\n {\r\n name: 'orange',\r\n class: 'gradient-orange'\r\n },\r\n {\r\n name: 'pomegranate',\r\n class: 'gradient-pomegranate'\r\n },\r\n {\r\n name: 'green-tea',\r\n class: 'gradient-green-tea'\r\n },\r\n {\r\n name: 'blackberry',\r\n class: 'gradient-blackberry'\r\n },\r\n {\r\n name: 'plum',\r\n class: 'gradient-plum'\r\n },\r\n {\r\n name: 'passion-fruit',\r\n class: 'gradient-passion-fruit'\r\n },\r\n {\r\n name: 'sublime-vivid',\r\n class: 'gradient-sublime-vivid'\r\n },\r\n {\r\n name: 'summer',\r\n class: 'gradient-summer'\r\n },\r\n {\r\n name: 'crystal-clear',\r\n class: 'gradient-crystal-clear'\r\n },\r\n {\r\n name: 'dawn',\r\n class: 'gradient-dawn'\r\n },\r\n {\r\n name: 'grapefruit-sunset',\r\n class: 'gradient-grapefruit-sunset'\r\n },\r\n {\r\n name: 'man-of-steel',\r\n class: 'gradient-man-of-steel'\r\n }\r\n]\r\n\r\nexport default { theme_colors, navi_colors }\r\n","/** https://github.com/shadowOfCode/bee.js */\r\nconst Validation = {\r\n //手机号码\r\n isMobile: function (input) {\r\n return /^(?:\\+86)?(?:13\\d|14[57]|15[0-35-9]|17[35-8]|18\\d)\\d{8}$|^(?:\\+86)?170[057-9]\\d{7}$/.test(input);\r\n },\r\n //手机号码简单校验,只校验长度\r\n isMobileSize: function (input) {\r\n return /^(?:\\+86)?1\\d{10}$/.test(input);\r\n },\r\n isPhone: function (input) {\r\n return /^(?:\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}(?:-\\d{1,4})?$/.test(input);\r\n },\r\n isCall: (input) => {\r\n return this.isPhone(input) || this.isMobile(input);\r\n },\r\n //邮箱格式校验\r\n isEmail: function (input) {\r\n return /^[-\\w+]+(?:\\.[-\\w]+)*@[-a-z0-9]+(?:\\.[a-z0-9]+)*(?:\\.[a-z]{2,})$/i.test(input);\r\n },\r\n //18位身份证简单校验\r\n isIdCardSimple: function (idCard) {\r\n return /^(?:1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5])\\d{4}(?:1[89]|20)\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])\\d{3}(?:\\d|[xX])$/.test(idCard);\r\n },\r\n // 真实姓名校验\r\n isName: function (input) {\r\n return /^([\\u4e00-\\u9fa5]{1,20}|[a-zA-Z.\\s]{1,20})$/.test(input);\r\n },\r\n //\r\n //18位身份证严格校验\r\n isIdCard: function (idCard) {\r\n let checkCode = (input) => {\r\n var multiplier = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\r\n var ids = input.split(\"\");\r\n var len = 17, sum = 0;\r\n for (var i = 0; i < len; i++) {\r\n sum += ids[i] * multiplier[i];\r\n }\r\n var remainder = sum % 11;\r\n var checkCodeArr = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\r\n var result = checkCodeArr[remainder];\r\n return result === input[17];\r\n }\r\n //先校验格式\r\n if (this.isIdCardSimple(idCard)) {\r\n //校验日期时间是否合法\r\n var dateStr = idCard.substr(6, 8);\r\n var dateStrNew = dateStr.replace(/(\\d{4})(\\d{2})(\\d{2})/, \"$1/$2/$3\");\r\n var dateObj = new Date(dateStrNew);\r\n var month = dateObj.getMonth() + 1;\r\n if (parseInt(dateStr.substr(4, 2)) === month) {\r\n return checkCode(idCard);\r\n }\r\n }\r\n return false;\r\n },\r\n getFromIdCard: (idCard) => {\r\n var area = idCard.substr(0, 6);\r\n var birth = idCard.substr(6, 8).replace(/(\\d{4})(\\d{2})(\\d{2})/, '$1年$2月$3日');\r\n var age = new Date().getFullYear() - idCard.substr(6, 4) + 1;\r\n var sex = (idCard.substr(16, 1) % 2 === 0) ? '女' : '男';\r\n\r\n return {\r\n 'area': area,\r\n 'birth': birth,\r\n 'age': age,\r\n 'sex': sex\r\n };\r\n }\r\n};\r\n\r\nexport default Validation;","<template>\r\n <VDialog v-model=\"isActive\" persistent :width=\"options.width\">\r\n <VCard :color=\"options.color\">\r\n <VCardTitle>{{ options.title }}</VCardTitle>\r\n <VCardText v-if=\"options.text\">\r\n {{ options.text }}\r\n </VCardText>\r\n <VCardActions>\r\n <VSpacer />\r\n <VBtn text @click=\"close_modal\">确定</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VDialog>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js' // 根据实际路径调整\r\n\r\nconst messageStore = useMessageStore()\r\n\r\n\r\n// 使用 computed 获取响应式数据\r\nconst isActive = computed(() => messageStore.alert?.isActive || false)\r\nconst options = computed(() => messageStore.alert?.options || {})\r\n\r\n// 关闭模态框方法\r\nconst close_modal = () => {\r\n messageStore.hide('alert')\r\n}\r\n</script>","<template>\r\n <VDialog v-model=\"isActive\" persistent :max-width=\"options.width || 400\">\r\n <VCard :color=\"options.color\">\r\n <VCardTitle>{{ options.title }}</VCardTitle>\r\n <VCardText v-if=\"options.text\">\r\n {{ options.text }}\r\n </VCardText>\r\n <VCardActions>\r\n <VSpacer />\r\n <VBtn text @click=\"cancel\">{{ options.cancelText || '取消' }}</VBtn>\r\n <VBtn text @click=\"confirm\">{{ options.confirmText || '确定' }}</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VDialog>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst messageStore = useMessageStore()\r\n\r\n// 使用 computed 获取响应式数据\r\nconst isActive = computed(() => messageStore.confirm?.isActive || false)\r\nconst options = computed(() => messageStore.confirm?.options || {})\r\n\r\n// 确认操作\r\nconst confirm = () => {\r\n // 如果 options.onConfirm 存在则执行回调\r\n if (typeof options.value.onConfirm === 'function') {\r\n options.value.onConfirm()\r\n }\r\n messageStore.hide('confirm')\r\n}\r\n\r\n// 取消操作\r\nconst cancel = () => {\r\n // 如果 options.onCancel 存在则执行回调\r\n if (typeof options.value.onCancel === 'function') {\r\n options.value.onCancel()\r\n }\r\n messageStore.hide('confirm')\r\n}\r\n</script>","<template>\r\n <v-overlay v-model=\"isActive\" persistent class=\"align-center justify-center\" :style=\"{ zIndex: 9999 }\">\r\n <v-progress-circular indeterminate size=\"64\" width=\"6\" color=\"primary\"></v-progress-circular>\r\n </v-overlay>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst messageStore = useMessageStore()\r\n\r\nconst isActive = computed(() => messageStore.loading?.isActive || false)\r\n</script>\r\n","<template>\r\n <div class=\"text-center\">\r\n <vtk-alert />\r\n <vtk-confirm />\r\n <vtk-loading />\r\n <vtk-prompt />\r\n <vtk-toast />\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport vtkAlert from \"./alert.vue\";\r\nimport vtkConfirm from \"./confirm.vue\";\r\nimport vtkLoading from \"./loading.vue\";\r\nimport vtkPrompt from \"./prompt.vue\";\r\nimport vtkToast from \"./toast.vue\";\r\nexport default {\r\n name: \"vtkMessage\",\r\n components: {\r\n vtkAlert,\r\n vtkConfirm,\r\n vtkLoading,\r\n vtkPrompt,\r\n vtkToast,\r\n },\r\n};\r\n</script>","<template>\r\n <VDialog v-model=\"isActive\" persistent :width=\"options.width\">\r\n <VCard :color=\"options.color\">\r\n <VCardTitle>{{ options.title }}</VCardTitle>\r\n <VCardText>\r\n <VTextField\r\n v-model=\"inputValue\"\r\n :label=\"options.label\"\r\n :placeholder=\"options.placeholder\"\r\n :type=\"options.inputType || 'text'\"\r\n outlined\r\n dense\r\n />\r\n <div v-if=\"options.text\" class=\"mt-2\">\r\n {{ options.text }}\r\n </div>\r\n </VCardText>\r\n <VCardActions>\r\n <VSpacer />\r\n <VBtn text @click=\"cancel\">{{ options.cancelText || '取消' }}</VBtn>\r\n <VBtn text @click=\"confirm\">{{ options.confirmText || '确定' }}</VBtn>\r\n </VCardActions>\r\n </VCard>\r\n </VDialog>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed } from 'vue'\r\nimport { useMessageStore } from '../../stores/message.js'\r\n\r\nconst messageStore = useMessageStore()\r\nconst inputValue = ref('')\r\n\r\n// 使用 computed 获取响应式数据\r\nconst isActive = computed(() => messageStore.prompt?.isActive || false)\r\nconst options = computed(() => messageStore.prompt?.options || {})\r\n\r\n// 确认操作\r\nconst confirm = () => {\r\n // 如果 options.onConfirm 存在则执行回调\r\n if (typeof options.value.onConfirm === 'function') {\r\n options.value.onConfirm(inputValue.value)\r\n }\r\n messageStore.hide('prompt')\r\n inputValue.value = '' // 清空输入值\r\n}\r\n\r\n// 取消操作\r\nconst cancel = () => {\r\n // 如果 options.onCancel 存在则执行回调\r\n if (typeof options.value.onCancel === 'function') {\r\n options.value.onCancel()\r\n }\r\n messageStore.hide('prompt')\r\n inputValue.value = '' // 清空输入值\r\n}\r\n</script>","<template>\r\n\t<VSnackbar v-model=\"isActive\" :timeout=\"options.timeout > 0 ? options.timeout : 3000\" :color=\"options.color\" centered @update:modelValue=\"onModelUpdate\">\r\n\t\t{{ options.text }}\r\n\t\t<template v-slot:actions>\r\n\t\t\t<VBtn text icon @click=\"close_modal()\">\r\n\t\t\t\t<VIcon>mdi-close</VIcon>\r\n\t\t\t</VBtn>\r\n\t\t</template>\r\n\t</VSnackbar>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from \"vue\";\r\nimport { useMessageStore } from \"../../stores/message.js\";\r\n\r\nconst messageStore = useMessageStore();\r\n\r\nconst isActive = computed({\r\n\tget: () => messageStore.toast?.isActive || false,\r\n\tset: (value) => {\r\n\t\tif (messageStore.toast) {\r\n\t\t\tmessageStore.toast.isActive = value;\r\n\t\t}\r\n\t},\r\n});\r\n\r\nconst options = computed(() => messageStore.toast?.options || {});\r\n\r\nconst close_modal = () => {\r\n\tmessageStore.hide(\"toast\");\r\n};\r\n\r\n// 监听模型值更新\r\nconst onModelUpdate = (value) => {\r\n\tif (!value) {\r\n\t\t// Snackbar 关闭时确保 store 状态同步\r\n\t\tmessageStore.hide(\"toast\");\r\n\t}\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n:deep(.v-snackbar__wrapper) {\r\n\ttop: 24px;\r\n}\r\n</style>\r\n","/**\r\n * Specter PUI - Vue 3 组件库\r\n */\r\n\r\nexport { default as VtkArea } from \"./components/assembly/VtkArea.vue\";\r\nexport { default as VtkAreaTabs } from \"./components/assembly/VtkAreaTabs.vue\";\r\nexport { default as VtkBreadcrumb } from \"./components/assembly/VtkBreadcrumb.vue\";\r\nexport { default as VtkCheckbox } from \"./components/assembly/VtkCheckbox.vue\";\r\nexport { default as VtkCount } from \"./components/assembly/VtkCount.vue\";\nexport { default as VtkDatePicker } from \"./components/assembly/VtkDatePicker.vue\";\nexport { default as VtkDateSelector } from \"./components/assembly/VtkDateSelector.vue\";\nexport { default as VtkDateTimePicker } from \"./components/assembly/VtkDateTimePicker.vue\";\nexport { default as VtkDept } from \"./components/assembly/VtkDept.vue\";\nexport { default as VtkEmpty } from \"./components/assembly/VtkEmpty.vue\";\nexport { default as VtkEmptyNew } from \"./components/assembly/VtkEmptyNew.vue\";\nexport { default as VtkFab } from \"./components/assembly/VtkFab.vue\";\nexport { default as VtkFormItem } from \"./components/assembly/VtkFormItem.vue\";\nexport { default as VtkImg } from \"./components/assembly/VtkImg.vue\";\r\nexport { default as VtkPage } from \"./components/assembly/VtkPage.vue\";\r\nexport { default as VtkPdf } from \"./components/assembly/VtkPdf.vue\";\r\nexport { default as VtkProj } from \"./components/assembly/VtkProj.vue\";\r\nexport { default as VtkRadio } from \"./components/assembly/VtkRadio.vue\";\r\nexport { default as VtkSearch } from \"./components/assembly/VtkSearch.vue\";\nexport { default as VtkSelect } from \"./components/assembly/VtkSelect.vue\";\nexport { default as VtkSinglePage } from \"./components/assembly/VtkSinglePage.vue\";\nexport { default as VtkStepper } from \"./components/assembly/VtkStepper.vue\";\nexport { default as VtkUpload } from \"./components/assembly/VtkUpload.vue\";\r\n\r\nexport * from \"./commons/location.js\";\r\nexport * from \"./commons/filters/dictionary.js\";\r\nexport * from \"./commons/filters/format.js\";\r\nexport * from \"./commons/filters/mask.js\";\r\nexport { default as request } from \"./commons/request.js\";\r\nexport { default as storage } from \"./commons/storage.js\";\r\nexport { default as themes } from \"./commons/themes.js\";\r\nexport * from \"./commons/validation.js\";\r\n\r\nexport { useMixins } from \"./composables/usePage.js\";\r\nexport { default as vtkMessage } from \"./components/message/index.js\";\r\n\r\nimport vtkMessage from \"./components/message/index.js\";\r\nimport storage from \"./commons/storage.js\";\r\nimport themes from \"./commons/themes.js\";\r\nimport request from \"./commons/request.js\";\r\nimport * as location from \"./commons/location.js\";\r\nimport Validation from \"./commons/validation.js\";\r\nimport * as dictionary from \"./commons/filters/dictionary.js\";\r\nimport * as mask from \"./commons/filters/mask.js\";\r\nimport * as format from \"./commons/filters/format.js\";\r\n\r\nimport VtkArea from \"./components/assembly/VtkArea.vue\";\r\nimport VtkAreaTabs from \"./components/assembly/VtkAreaTabs.vue\";\r\nimport VtkBreadcrumb from \"./components/assembly/VtkBreadcrumb.vue\";\r\nimport VtkCheckbox from \"./components/assembly/VtkCheckbox.vue\";\r\nimport VtkCount from \"./components/assembly/VtkCount.vue\";\nimport VtkDatePicker from \"./components/assembly/VtkDatePicker.vue\";\nimport VtkDateSelector from \"./components/assembly/VtkDateSelector.vue\";\nimport VtkDateTimePicker from \"./components/assembly/VtkDateTimePicker.vue\";\nimport VtkDept from \"./components/assembly/VtkDept.vue\";\nimport VtkEmpty from \"./components/assembly/VtkEmpty.vue\";\nimport VtkEmptyNew from \"./components/assembly/VtkEmptyNew.vue\";\nimport VtkFab from \"./components/assembly/VtkFab.vue\";\nimport VtkFormItem from \"./components/assembly/VtkFormItem.vue\";\nimport VtkImg from \"./components/assembly/VtkImg.vue\";\r\nimport VtkPage from \"./components/assembly/VtkPage.vue\";\r\nimport VtkPdf from \"./components/assembly/VtkPdf.vue\";\r\nimport VtkProj from \"./components/assembly/VtkProj.vue\";\r\nimport VtkRadio from \"./components/assembly/VtkRadio.vue\";\r\nimport VtkSearch from \"./components/assembly/VtkSearch.vue\";\nimport VtkSelect from \"./components/assembly/VtkSelect.vue\";\nimport VtkSinglePage from \"./components/assembly/VtkSinglePage.vue\";\nimport VtkStepper from \"./components/assembly/VtkStepper.vue\";\nimport VtkUpload from \"./components/assembly/VtkUpload.vue\";\r\nimport VtkMessageComponent from \"./components/message/vtkMessage.vue\";\r\n\r\nfunction install(app, options = {}) {\r\n const components = {\r\n VtkArea,\r\n VtkAreaTabs,\r\n VtkBreadcrumb,\r\n VtkCheckbox,\r\n VtkCount,\n VtkDatePicker,\n VtkDateSelector,\n VtkDateTimePicker,\n VtkDept,\n VtkEmpty,\n VtkEmptyNew,\n VtkFab,\n VtkFormItem,\n VtkImg,\r\n VtkPage,\r\n VtkPdf,\r\n VtkProj,\r\n VtkRadio,\r\n VtkSearch,\n VtkSelect,\n VtkSinglePage,\n VtkStepper,\n VtkUpload,\r\n VtkMessage: VtkMessageComponent\r\n };\r\n\r\n Object.keys(components).forEach(name => {\r\n app.component(name, components[name]);\r\n });\r\n\r\n app.config.globalProperties.$vtk = {\r\n message: vtkMessage,\r\n request,\r\n storage,\r\n themes,\r\n location,\r\n Validation,\r\n filters: {\r\n ...dictionary,\r\n ...mask,\r\n ...format\r\n },\r\n ...options\r\n };\r\n\r\n return app;\r\n}\r\n\r\nexport default {\r\n install,\r\n VtkArea,\r\n VtkAreaTabs,\r\n VtkBreadcrumb,\r\n VtkCheckbox,\r\n VtkCount,\n VtkDatePicker,\n VtkDateSelector,\n VtkDateTimePicker,\n VtkDept,\n VtkEmpty,\n VtkEmptyNew,\n VtkFab,\n VtkFormItem,\r\n VtkImg,\r\n VtkPage,\r\n VtkPdf,\r\n VtkProj,\r\n VtkRadio,\r\n VtkSearch,\n VtkSelect,\n VtkSinglePage,\n VtkStepper,\n VtkUpload,\r\n request,\r\n storage,\r\n themes,\r\n vtkMessage\r\n};\r\n"],"names":["Storage","storage","type","key","js","value","useMessageStore","defineStore","options","Message","messageStore","defaultOptions","text","toastOptions","service","axios","config","tokenKey","_b","_a","error","response","res","header","handleRedirect","url","index","newUrl","Request","data","method","headers","responseType","proxy","getCurrentInstance","emit","__emit","entity","reactive","user","ref","areaData","onMounted","userKey","area","nextArea","areaCode","inputFn","e","clear","arr","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_component_VSelect","_cache","$event","__props","_createBlock","_c","_normalizeClass","_d","_e","_f","_g","_h","_i","_normalizeStyle","_j","props","menu","tab","tabItems","areaStorage","areaItems","current","itemValue","itemText","view","code","province","city","district","town","village","tabArea","areaChange","item","getTree","nextTick","getAreaName","save","val","lastItem","close","textClear","initCode","watch","newVal","oldVal","_component_v_menu","_withCtx","_component_v_btn","_mergeProps","$attrs","_createElementVNode","_toDisplayString","_component_v_icon","_component_v_card","_hoisted_2","_Fragment","_renderList","link","_component_v_sheet","_component_v_tabs","_component_v_tab","_createTextVNode","_vShow","_component_v_chip_group","_component_v_chip","_component_v_card_actions","_component_v_spacer","router","inject","route","breadcrumbItems","computed","matched","r","pathArray","p","path","routePath","handleBack","_component_v_breadcrumbs","_component_v_breadcrumbs_item","localValue","isUpdatingLocal","isUpdatingModel","attrs","useAttrs","inputAttrs","list","inline","modelValue","rest","checkboxAttrs","errorMessages","rules","hint","persistentHint","inputValue","items","statc","it","codeValue","miscs","_component_VInput","_component_VCheckbox","currentNumber","currentDigits","digitKey","isAnimating","formatNumber","num","result","targetNumberString","startNumberString","maxDigitString","target","start","getCurrentDigit","initDigitsArray","startStr","char","startChar","getDigitStyle","currentValue","digitValue","offset","translateY","startAnimation","startTime","startValue","endValue","diff","animate","currentTime","elapsed","progress","easeOutQuart","updateDigitArray","valueStr","maxStr","i","newStr","oldStr","endStr","__expose","digitChar","_hoisted_4","_hoisted_3","n","_hoisted_5","dateRange","startDateRange","endDateRange","displayValue","formatDate","textFieldProps","placeholder","disabled","min","max","showCurrent","format","separator","date","year","month","day","minDate","maxDate","newValue","dates","onStartDateChange","onEndDateChange","clearValue","cancel","confirm","sortedRange","date1","date2","_component_VMenu","activatorProps","_component_VTextField","_component_VIcon","_component_VCard","_component_VCardText","_component_VDatePicker","_component_VDivider","_component_VCardActions","_component_VSpacer","_component_VBtn","YEAR_PAGE_SIZE","YEAR_PAGE_CENTER_OFFSET","MONTHS","getYearPageStart","openPicker","yearPageStart","headerRef","yearPage","_","canShowNextYearPage","isYearDisabled","isMonthDisabled","togglePicker","closePicker","shiftYearPage","nextStart","selectYear","selectMonth","handleNavigate","direction","handleOutsideClick","event","onBeforeUnmount","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","YEAR_PANEL_SIZE","YEAR_PANEL_CENTER_OFFSET","showPicker","viewMode","currentYear","currentMonth","rightYear","rightMonth","selectedValue","tempValue","today","todayYear","todayMonth","todayDate","weekDays","monthList","menuAttach","menuLocation","menuOrigin","normalizeCssSize","nextValue","rootStyle","width","popupStyle","formatDisplay","week","yearList","startYear","weekList","weeks","firstDay","lastDay","currentDate","weekNumber","getWeekNumber","isToday","dayList","days","startDate","endDate","nextMonthYear","nextMonthMonth","nextMonthDayList","d","dayNum","yearStart","isYearSelected","v","isYearInRange","end","isMonthSelected","monthStr","isMonthInRange","isWeekSelected","weekStr","isWeekInRange","isDaySelected","isDayInRange","isDayRangeStart","isDayRangeEnd","isFutureYear","isFutureMonth","isFutureDay","yearStr","first","selectMonthRight","isMonthSelectedRight","isMonthInRangeRight","selectWeek","selectDay","prevPeriod","nextPeriod","prevMonth","nextMonthLeft","prevMonthRight","nextMonth","prevYear","nextYearLeft","prevYearRight","nextYear","changeViewMode","mode","parseCalendarValue","match","setRightPanelToNextMonth","syncCalendarPanels","values","endUsesDifferentMonth","initializePicker","isOpen","handleCancel","handleConfirm","menuProps","VtkDatePanelHeader","_unref","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","defaultStartTime","defaultEndTime","selectedDateTime","selectedRange","tempDate","tempRange","leftYear","leftMonth","selectedHour","selectedMinute","selectedSecond","activeRangeSide","activeTimeSide","activeSingleTime","isRange","menuWidth","minDateTime","parseValue","maxDateTime","hourOptions","minuteOptions","buildStepOptions","secondOptions","getDayList","leftDayList","rightDayList","formatByPattern","buildTempDateTime","singleTimeValue","pattern","canConfirm","isDateTimeDisabled","activeRangeDate","activeRangeHour","activeRangeMinute","activeRangeSecond","step","normalizedStep","startDay","daysInMonth","daysInPrevMonth","createDay","otherMonth","isSameDate","padTime","replacements","token","formatDatePart","formatTimePart","fallback","hour","minute","second","parseRangeValue","toModelValue","toModelRange","range","left","right","isDayDisabled","isTimePartDisabled","isRangeDaySelected","side","isRangeDayInRange","rangeDayClass","setSinglePanelFromDate","setRangePanelsFromDate","base","prevLeftMonth","nextRightMonth","selectRangeDay","selected","currentStart","currentEnd","selectHour","selectMinute","selectSecond","openRangeTime","selectRangeTime","part","clearTempRange","handleNow","now","_hoisted_21","pause","ms","resolve","dialog","areaSelectedData","areaActivatedData","getDeptList","getAreaList","getAreaNextList","parentCode","deptData","deptSelectedData","deptActivatedData","getPersonList","node","params","getDepNextList","selectAreaCode","selectPid","personData","selectedPersonData","allSelectedPersons","isRestoringSelection","selectedPersonList","uniqueMap","person","oldPerson","newPersonData","currentSelected","removeSelectedPerson","personId","globalIndex","currentIndex","add","selectedPersons","_component_v_dialog","_component_v_card_title","_component_v_divider","_component_v_card_text","_component_v_row","_component_v_col","_component_v_treeview","_component_v_avatar","_component_v_img","_component_v_list","_component_v_list_item","_component_v_empty_state","$slots","_renderSlot","_ctx","emptyImg","showFab","fabClass","handleScroll","scrollToTop","_Transition","_component_v_fab","processedMaxWidth","contentStyles","styles","showPreview","imageRotation","imageScale","imageTranslateX","imageTranslateY","imageDragState","srcWithToken","currentImageUrl","currentImage","currentImageRawUrl","currentImageDownloadUrl","currentImageTitle","currentImageDescription","hasPrev","hasNext","viewerImageStyle","openCurrentImageInNewWindow","imageMimeExtensionMap","imageExtensionMimeMap","getImageFileExtension","blob","mimeType","pathname","getCurrentImageFileName","extension","titleName","urlName","isDownloadRiskWebView","ua","getDownloadFailureReason","message","name","validateImageBlob","bitmap","reject","image","triggerBrowserDownload","fileName","triggerBrowserUrlDownload","showDownloadToast","color","toast","getDownloadFileHandle","isImageResponse","contentType","fetchImageBlob","fetchCurrentImageBlob","downloadCurrentImage","downloadUrl","fileHandle","writable","failureReason","resetImageTransform","openPreview","closePreview","prevImage","nextImage","rotateImage","degrees","zoomImage","nextScale","handleImageWheel","startImageDrag","moveImageDrag","endImageDrag","state","_component_v_progress_circular","_component_VCardTitle","_component_v_card_subtitle","_component_VDialog","_component_v_toolbar","_component_v_toolbar_title","_component_v_toolbar_items","pagination","pageSizeObjs","pageDatas","paginationChange","pageChange","pageSizeFormat","toPage","pageSizeChange","temp","obj","page","_component_VRow","_component_v_pagination","loading","pdfLoaded","currentPage","pageCount","pdfContainer","pdfDoc","loadPdf","renderPage","pageNum","prevPage","nextPage","downloadPdf","_component_VCol","_component_VSlider","useMixins","urlConfig","queryParam","desserts","superQueryParams","pageData","sumup","pageDataCopy","overlay","getQueryParams","codex","loadPage","pageInfo","id","record","modalFormRef","disposition","filename","newUrlConfig","getListPage","expData","mixinQueryParam","examType","permits","projName","projTip","bizType","expShow","menu1","expArr","formArr","select","selectAll","delItem","delNote","MprojRef","onActivated","examAll","chkAll","getUserInfo","examWait","toView","searchProj","param","searchQuery","exv","exp","del","delSave","tip","formatIdCard","idcard","dateStr","getServStateClass","getServStateText","getRateStateClass","getRateStateText","getServFromText","from","_component_VContainer","_component_VTabs","_component_VTab","_component_vtk_search","_component_vtk_area_tabs","_component_vtk_select","_component_VDataTable","_component_VChip","_component_vtk_empty","_component_vtk_page","_component_vtk_proj","_component_VTextarea","onUpdate","_component_VRadioGroup","_component_VRadio","instance","cloneValue","cloneQueryParam","source","isSameValue","a","b","initialQueryParam","externalQueryParam","initialIndex","initVal","contentStyle","minValue","maxValue","minHeight","maxHeight","nextExternalQueryParam","nextQueryParam","obtain","filterNull","search","reset","handleResetClick","_component_VBadge","filteredAttrs","multi","its","$emit","normalizePositiveInteger","parsedValue","initialLimit","rowCount","hasTotal","pageSizeItems","rowLength","hasNextPage","emitPageChange","goToPage","targetPage","handlePageSizeChange","previousPage","_component_v_select","_component_v_text_field","stepIndex","content","_component_VStepper","_component_VStepperHeader","_component_VStepperWindow","_component_VStepperWindowItem","inputRef","isDragover","previewVisible","previewFile","previewScale","previewRotation","previewTranslateX","previewTranslateY","previewDragState","fileList","isSyncingModel","localPreviewUrls","revokeAllLocalPreviews","normalizeFileList","uidCounter","genUid","getFileNameFromUrl","cleanUrl","isImageUrl","isImage","file","fileIcon","getPreviewSrc","revokeLocalPreview","preview","previewImageList","previewImageIndex","hasPreviewPrev","hasPreviewNext","previewImageStyle","triggerInput","onDragover","onDrop","processFiles","onInputChange","rawFiles","raw","errFile","buildFile","reader","beforeHook","addFile","uploadFile","status","syncModel","urls","f","formData","k","err","handleRemove","doRemove","isExcel","resetPreviewTransform","rotatePreview","zoomPreview","setImagePreviewFile","switchPreviewImage","nextFile","handlePreviewKeydown","startPreviewDrag","movePreviewDrag","endPreviewDrag","openFileInNewTab","fileUrl","blobUrl","win","openCurrentPreview","handlePreview","visible","_withModifiers","_component_v_progress_linear","isAid","str","getLinkFromResponse","buildUrlWithParams","appendParams","queryString","queryParams","newParams","joinSymbol","appendParamsToUrl","targetUrl","hashIndex","baseUrl","hashRoute","newHashRoute","resolveAidUrl","aid","buildAppendParams","sobject","sroute","stokenKey","storageKey","stoken","GetQueryString","reg","appendAppParams","dict","map","pre","maps","results","j","currentVal","kv","analyType","analyLevel","fmt","getDate","o","numValue","neg","absValue","fix","needSep","xs","decimalPart","integerPart","age","birthdays","txt","len","abs","mobile","colors","themes","Validation","input","this","idCard","checkCode","multiplier","ids","sum","remainder","checkCodeArr","dateStrNew","dateObj","birth","sex","isActive","close_modal","_component_v_overlay","_sfc_main","vtkAlert","vtkConfirm","vtkLoading","onModelUpdate","_component_VSnackbar","_component_vtk_alert","_component_vtk_confirm","_component_vtk_loading","_component_vtk_prompt","_component_vtk_toast","install","app","components","VtkArea","VtkAreaTabs","VtkBreadcrumb","VtkCheckbox","VtkCount","VtkDatePicker","VtkDateSelector","VtkDateTimePicker","VtkDept","VtkEmpty","VtkEmptyNew","VtkFab","VtkFormItem","VtkImg","VtkPage","VtkPdf","VtkProj","VtkRadio","VtkSearch","VtkSelect","VtkSinglePage","VtkStepper","VtkUpload","VtkMessageComponent","vtkMessage","request","location","dictionary","mask"],"mappings":"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BACR,QAASA,GAAO,KAAK,QACrB,UAAWA,GAAO,KAAK,SACvB,OAAQA,GAAO,KAAK,OACxB,EACE,CACE,KAAM,eACN,KAAM,GACN,OAAQ,wBACR,QAASA,GAAO,OAAO,QACvB,UAAWA,GAAO,OAAO,SACzB,OAAQA,GAAO,OAAO,OAC1B,EACE,CACE,KAAM,mBACN,KAAM,GACN,OAAQ,6BACR,QAASA,GAAO,WAAW,KAC3B,UAAWA,GAAO,WAAW,SAC7B,OAAQA,GAAO,WAAW,OAC9B,CACA,EAqG+B,YAnGX,CAClB,CACE,KAAM,QACN,MAAO,OACX,EACE,CACE,KAAM,WACN,MAAO,mBACX,EACE,CACE,KAAM,iBACN,MAAO,yBACX,EACE,CACE,KAAM,aACN,MAAO,qBACX,EACE,CACE,KAAM,qBACN,MAAO,6BACX,EACE,CACE,KAAM,eACN,MAAO,uBACX,EACE,CACE,KAAM,gBACN,MAAO,wBACX,EACE,CACE,KAAM,mBACN,MAAO,2BACX,EACE,CACE,KAAM,qBACN,MAAO,6BACX,EACE,CACE,KAAM,kBACN,MAAO,0BACX,EACE,CACE,KAAM,SACN,MAAO,iBACX,EACE,CACE,KAAM,aACN,MAAO,qBACX,EACE,CACE,KAAM,SACN,MAAO,iBACX,EACE,CACE,KAAM,cACN,MAAO,sBACX,EACE,CACE,KAAM,YACN,MAAO,oBACX,EACE,CACE,KAAM,aACN,MAAO,qBACX,EACE,CACE,KAAM,OACN,MAAO,eACX,EACE,CACE,KAAM,gBACN,MAAO,wBACX,EACE,CACE,KAAM,gBACN,MAAO,wBACX,EACE,CACE,KAAM,SACN,MAAO,iBACX,EACE,CACE,KAAM,gBACN,MAAO,wBACX,EACE,CACE,KAAM,OACN,MAAO,eACX,EACE,CACE,KAAM,oBACN,MAAO,4BACX,EACE,CACE,KAAM,eACN,MAAO,uBACX,CACA,CAE0C,ECvJpCE,GAAa,CAEf,SAAU,SAAUC,EAAO,CACvB,MAAO,sFAAsF,KAAKA,CAAK,CAC3G,EAEA,aAAc,SAAUA,EAAO,CAC3B,MAAO,qBAAqB,KAAKA,CAAK,CAC1C,EACA,QAA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","x_google_ignoreList":[34]}