iZaiZaiA 2 年之前
父節點
當前提交
29309251ea
共有 58 個文件被更改,包括 570 次插入6059 次删除
  1. 1 1
      README.md
  2. 5 5
      package.json
  3. 1 1
      src/App.vue
  4. 2 2
      src/api/request/index.js
  5. 0 57
      src/components/btnTab/index.vue
  6. 0 75
      src/components/counter/index.vue
  7. 0 155
      src/components/dragModal/index.vue
  8. 0 61
      src/components/dragModal/modal.scss
  9. 0 93
      src/components/modal/SubmitApproval.vue
  10. 0 415
      src/components/plugins/element/HcTree.vue
  11. 0 99
      src/components/plugins/naive/HcPage.vue
  12. 0 59
      src/components/plugins/naive/HcTabs.vue
  13. 0 198
      src/components/reportModal/index.vue
  14. 0 286
      src/components/tasksUser/index.vue
  15. 0 139
      src/components/tasksUser/style.scss
  16. 170 0
      src/global/components/hc-context-menu/index.vue
  17. 1 1
      src/global/components/hc-report-modal/index.vue
  18. 2 2
      src/global/components/hc-tasks-user/index.vue
  19. 2 0
      src/global/components/index.js
  20. 4 5
      src/layout/modules/UserInfoBar.vue
  21. 0 656
      src/plugins/idCard/area.js
  22. 0 70
      src/plugins/idCard/verify.js
  23. 0 19
      src/plugins/naive.js
  24. 0 15
      src/router/modules/base.js
  25. 0 55
      src/utils/lib/date.js
  26. 0 91
      src/utils/lib/func.js
  27. 0 135
      src/utils/lib/isApp.js
  28. 0 103
      src/utils/lib/storage.js
  29. 0 135
      src/utils/lib/tools.js
  30. 0 77
      src/utils/lib/util.js
  31. 0 192
      src/utils/lib/validate.js
  32. 0 16
      src/utils/modules/storage.js
  33. 29 60
      src/views/data-fill/components/HcTreeData.vue
  34. 9 23
      src/views/data-fill/components/ListItem.vue
  35. 30 61
      src/views/data-fill/components/WbsTree.vue
  36. 9 83
      src/views/data-fill/components/nodeTree/children.vue
  37. 43 4
      src/views/data-fill/components/nodeTree/index.vue
  38. 13 14
      src/views/data-fill/wbs.vue
  39. 6 6
      src/views/gauge/bezier.vue
  40. 2 2
      src/views/gauge/station.vue
  41. 0 376
      src/views/ledger/components/construction.vue
  42. 0 317
      src/views/ledger/components/internal.vue
  43. 0 250
      src/views/ledger/components/weather.vue
  44. 2 381
      src/views/ledger/query.vue
  45. 1 38
      src/views/ledger/write.vue
  46. 1 1
      src/views/other-file/image-data.vue
  47. 1 1
      src/views/other-file/image-view.vue
  48. 1 111
      src/views/other/components/first-item-form.vue
  49. 2 353
      src/views/other/first-item.vue
  50. 2 2
      src/views/other/order-service.vue
  51. 2 139
      src/views/schedule/hc-data.vue
  52. 1 98
      src/views/schedule/hc-table.vue
  53. 1 95
      src/views/schedule/write.vue
  54. 1 1
      src/views/tasks/flow.vue
  55. 1 1
      src/views/tasks/hc-data.vue
  56. 0 67
      src/views/test/index.vue
  57. 1 1
      vite.config.js
  58. 224 356
      yarn.lock

+ 1 - 1
README.md

@@ -20,7 +20,7 @@ node -v
 
 ### 推荐使用  `yarn` 管理依赖
 
-如果电脑上还没有安装 `yarn` ,执行下命令安装 `yarn`
+如果电脑上还没有安装 `yarn` ,执行下命令安装 `yarn`
 
 ``` shell
 npm install -g yarn

+ 5 - 5
package.json

@@ -8,17 +8,19 @@
     },
     "dependencies": {
         "axios": "^0.27.2",
+        "click-outside-vue3": "^4.0.1",
         "crypto-js": "^4.1.1",
         "echarts": "^5.3.3",
-        "element-plus": "^2.2.15",
+        "element-plus": "^2.2.16",
         "js-base64": "^3.7.2",
         "js-cookie": "^3.0.1",
         "js-md5": "^0.7.3",
         "js-web-screen-shot": "^1.7.3",
         "moment": "^2.29.4",
-        "naive-ui": "^2.33.2",
+        "nprogress": "^0.2.0",
         "pinia": "^2.0.21",
         "remixicon": "^2.5.0",
+        "vooks": "^0.2.12",
         "vue": "^3.2.38",
         "vue-router": "^4.1.5",
         "vue-utils-plus": "^1.0.2",
@@ -28,14 +30,12 @@
         "@vitejs/plugin-vue": "^3.0.3",
         "@vue/compiler-sfc": "^3.2.38",
         "autoprefixer": "^10.4.7",
-        "nprogress": "^0.2.0",
         "postcss": "^8.4.16",
         "sass": "^1.54.8",
         "tailwindcss": "^3.1.8",
         "unplugin-auto-import": "^0.11.2",
         "unplugin-vue-components": "^0.22.4",
         "vfonts": "^0.0.3",
-        "vite": "^3.0.9",
-        "vooks": "^0.2.12"
+        "vite": "^3.0.9"
     }
 }

+ 1 - 1
src/App.vue

@@ -6,7 +6,7 @@
 
 <script setup>
 import {nextTick, ref, watch} from "vue";
-import {useAppStore} from "~src/store/index";
+import {useAppStore} from "~src/store";
 import AppConfig from "~com/AppConfig/index.vue";
 import {setMainColor} from "~src/utils/tools";
 import config from '~src/config/index';

+ 2 - 2
src/api/request/index.js

@@ -2,8 +2,8 @@ import axios from 'axios';
 import {Base64} from 'js-base64';
 import website from '~src/config';
 import router from '~src/router/index';
-import {serialize} from '~src/utils/lib/util';
 import appAuth from '~src/api/util/auth';
+import {toSerialize} from "vue-utils-plus"
 
 //默认超时时间
 axios.defaults.timeout = 20000;
@@ -29,7 +29,7 @@ axios.interceptors.request.use(config => {
     }
     //headers中配置serialize为true开启序列化
     if (config.method === 'post' && meta['isSerialize'] === true) {
-        config.data = serialize(config.data);
+        config.data = toSerialize(config.data);
     }
     return config
 }, error => {

+ 0 - 57
src/components/btnTab/index.vue

@@ -1,57 +0,0 @@
-<template>
-    <div class="hc-btn-tab-box">
-        <template v-for="(item,index) in datas" :key="item.key">
-            <n-button :type="curKey === item.key?'primary':''" :disabled="isDisabled" :color="curKey === item.key?'':'#999999'" :class="index > 0?'ml-3':''" ghost @click="tabClick(item)">
-                <i class="mr-1" :class="item.icon"/>
-                <span>{{item.label}}</span>
-            </n-button>
-        </template>
-    </div>
-</template>
-
-<script setup>
-import { ref, watch } from "vue";
-const props = defineProps({
-    datas: {
-        type: Array,
-        default: () => []
-    },
-    cur: {
-        type: [String,Number],
-        default: ''
-    },
-    disabled: {
-        type: Boolean,
-        default: false
-    },
-})
-
-//变量
-const curKey = ref(props.cur)
-const isDisabled = ref(props.disabled)
-
-//监听
-watch(() => [
-    props.cur,
-    props.disabled,
-], ([cur,disabled]) => {
-    curKey.value = cur
-    isDisabled.value = disabled
-})
-
-//事件
-const emit = defineEmits(['tabClick'])
-const tabClick = (item) => {
-    if (curKey.value !== item.key) {
-        curKey.value = item.key;
-        emit('tabClick', item.key)
-    }
-}
-</script>
-
-<style lang="scss" scoped>
-.hc-btn-tab-box {
-    position: relative;
-    display: inline-block;
-}
-</style>

+ 0 - 75
src/components/counter/index.vue

@@ -1,75 +0,0 @@
-<template>
-    <div :class="ui" class="hc-counter-box">
-        <div class="counter-box">
-            <n-button :disabled="modelVal <= 1"  @click="moveBtnClick">
-                <i class="_icon-move"/>
-            </n-button>
-            <div class='w-20 text-center'>
-                <span>{{modelVal}}</span>
-                <span class="ml-2" v-if="text">{{text}}</span>
-            </div>
-            <n-button @click="addBtnClick">
-                <i class="_icon-add"/>
-            </n-button>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import {ref, watch} from "vue";
-const props = defineProps({
-    ui: {
-        type: String,
-        default: ''
-    },
-    modelValue: {
-        type: [String,Number],
-        default: 1
-    },
-    text: {
-        type: String,
-        default: ''
-    },
-})
-
-const setModelVal = (value) => {
-    let val = value || 1;
-    val = parseInt(val)
-    return val;
-}
-
-const modelVal = ref(setModelVal(props.modelValue))
-const emit = defineEmits(['update:modelValue','addClick','moveClick'])
-
-watch(() => props.modelValue, (value) => {
-    modelVal.value = setModelVal(value)
-})
-
-const moveBtnClick = () => {
-    let val = modelVal.value - 1;
-    if (val <= 1) {
-        val = 1
-    }
-    modelVal.value =  val;
-    emit('update:modelValue', val)
-    emit('moveClick', val)
-}
-
-const addBtnClick = () => {
-    let val = modelVal.value + 1;
-    modelVal.value =  val;
-    emit('update:modelValue', val)
-    emit('addClick', val)
-}
-</script>
-
-<style lang="scss" scoped>
-.hc-counter-box {
-    position: relative;
-    display: inline-block;
-    .counter-box {
-        display: flex;
-        align-items: center;
-    }
-}
-</style>

+ 0 - 155
src/components/dragModal/index.vue

@@ -1,155 +0,0 @@
-<template>
-    <div class="ui-drag-modal-box-hide" v-if="isBody">
-        <Teleport to="#app">
-            <div class="ui-drag-modal-box" :class="[isModalShow?'ui-drag-modal-show':'']" :id="'drag-modal-' + uuid" :style="{left: dragModalLeft + 'px', top: dragModalTop + 'px'}">
-                <div class="ui-drag-modal-dialog shadow-xl" :class="[bg,ui]" :style="{width: widthVal + 'px', height: heightVal + 'px'}">
-                    <div class="ui-drag-modal-dialog-header" :class="titleBorder?'border-bottom':''">
-                        <div class="ui-drag-modal-dialog-title text-lg" :class="titleUi" @mousedown="dragModalMouseDown">
-                            <span v-if="title">{{title}}</span>
-                        </div>
-                        <div class="ui-drag-modal-dialog-close" v-if="closeIcon" @click="_closeClick()">
-                            <i class="_icon-close"/>
-                        </div>
-                    </div>
-                    <div class="ui-drag-modal-dialog-body">
-                        <slot></slot>
-                    </div>
-                    <span class="ui-drag-modal-resize" @mousedown="dragModalResizeMouseDown"/>
-                </div>
-            </div>
-        </Teleport>
-    </div>
-</template>
-
-<script setup>
-import { ref,nextTick,watch } from "vue"
-import {getRandom} from "~src/utils/lib/tools"
-const props = defineProps({
-    ui: {
-        type: String,
-        default: ''
-    },
-    bg: {
-        type: String,
-        default: ''
-    },
-    widths: {
-        type: [Number,String],
-        default: 340
-    },
-    title: {
-        type: String,
-        default: ''
-    },
-    titleUi: {
-        type: [String,Object,Array],
-        default: ''
-    },
-    titleBorder: {
-        type: Boolean,
-        default: false
-    },
-    closeIcon: {
-        type: Boolean,
-        default: false
-    },
-    isShow: {
-        type: Boolean,
-        default: false
-    },
-    lefts: {
-        type: [Number,String],
-        default: 0
-    },
-    tops: {
-        type: [Number,String],
-        default: 0
-    },
-})
-
-const uuid = getRandom()
-const isBody = ref(false)
-const isModalShow = ref(props.isShow)
-const dragModalLeft = ref(parseInt(props.lefts + ''))
-const dragModalTop = ref(parseInt(props.tops + ''))
-const widthVal = ref(parseInt(props.widths + ''))
-const heightVal = ref(700)
-
-watch(() => props.isShow, (isShow) => {
-    isModalShow.value = isShow;
-})
-
-nextTick(()=> {
-    //页面渲染完成后,再让 vue3 的 Teleport,把弹出框挂载到外部节点上。
-    isBody.value = true
-})
-
-//弹窗拖动
-const dragModalMouseDown = (event) => {
-    // 阻止默认事件和冒泡
-    event.preventDefault()
-    event.stopPropagation()
-    //获取相关dom元素
-    let body = document.body, dom = document.getElementById('drag-modal-' + uuid)
-    // 鼠标按下,计算当前元素距离可视区的距离
-    const disX = event.clientX - dom.offsetLeft, disY = event.clientY - dom.offsetTop
-    document.onmousemove = (ve) => {
-        // 通过事件委托,计算移动的距离
-        let left = ve.clientX - disX, top = ve.clientY - disY
-        // 判断是否超出可视区
-        if (left < 0) left = 0
-        if (left > body.clientWidth - dom.clientWidth) {
-            left = body.clientWidth - dom.clientWidth
-        }
-
-        if (top < 0) top = 0
-        if (top > body.clientHeight - dom.clientHeight) {
-            top = body.clientHeight - dom.clientHeight
-        }
-        // 移动当前元素
-        dragModalLeft.value = left
-        dragModalTop.value = top
-    }
-    document.onmouseup = () => {
-        document.onmousemove = null;
-        document.onmouseup = null;
-    }
-}
-
-//弹窗改变宽高
-const dragModalResizeMouseDown = (event) => {
-    // 阻止默认事件和冒泡
-    event.preventDefault()
-    event.stopPropagation()
-    //获取相关dom元素
-    let dom = document.getElementById('drag-modal-' + uuid)
-    let clientX = event.clientX, clientY = event.clientY;
-    let offsetWidth = dom.offsetWidth, clientHeight = dom.clientHeight;
-    document.onmousemove = (e) => {
-        widthVal.value = e.clientX - clientX + offsetWidth
-        heightVal.value = e.clientY - clientY + clientHeight
-    }
-    document.onmouseup = () => {
-        document.onmousemove = null;
-        document.onmouseup = null;
-    }
-}
-
-
-//事件
-const emit = defineEmits(['close'])
-const show = () => {
-    isModalShow.value = true;
-}
-const hide = () => {
-    isModalShow.value = false;
-}
-const _closeClick = () => {
-    hide();
-    emit('close', false)
-}
-</script>
-
-<style lang="scss" scoped>
-@import './modal.scss';
-</style>

+ 0 - 61
src/components/dragModal/modal.scss

@@ -1,61 +0,0 @@
-.ui-drag-modal-box-hide {
-    display: none;
-}
-.ui-drag-modal-box {
-    position: fixed;
-    top: 0;
-    left: 0;
-    opacity: 0;
-    z-index: -1024;
-    transition: opacity 0.3s, z-index 0.3s;
-    .ui-drag-modal-dialog {
-        position: relative;
-        min-width: 340px;
-        min-height: 380px;
-        background-color: #ffffff;
-        display: inline-block;
-        border-radius: 5px;
-        z-index: 8001;
-        .ui-drag-modal-dialog-header {
-            position: relative;
-            display: flex;
-            align-items: center;
-            .ui-drag-modal-dialog-title {
-                flex: 1;
-                padding: 15px 20px;
-                cursor: all-scroll;
-                user-select: none;
-            }
-            .ui-drag-modal-dialog-close {
-                display: flex;
-                align-items: center;
-                justify-content: flex-end;
-                cursor: pointer;
-                margin-right: 15px;
-                transition: opacity 0.3s;
-                i {
-                    font-size: 20px;
-                }
-                &:hover {
-                    opacity: .6;
-                }
-            }
-        }
-        .ui-drag-modal-dialog-body {
-            position: relative;
-            height: calc(100% - 58px);
-        }
-        .ui-drag-modal-resize {
-            position: absolute;
-            width: 15px;
-            height: 15px;
-            right: 0;
-            bottom: 0;
-            cursor: se-resize;
-        }
-    }
-    &.ui-drag-modal-show {
-        opacity: 1;
-        z-index: 8000;
-    }
-}

+ 0 - 93
src/components/modal/SubmitApproval.vue

@@ -1,93 +0,0 @@
-<template>
-    <n-modal v-model:show="showModal">
-        <n-card class="w-606" title="上报审批">
-            <n-form ref="reportFormRef" :model="reportModel" :rules="reportRules" label-placement="left" label-width="auto" require-mark-placement="right-hanging" size="large">
-                <n-form-item label="任务名称" path="taskName">
-                    <n-input v-model:value="reportModel.taskName" placeholder="任务名称" disabled/>
-                </n-form-item>
-                <n-form-item label="任务描述" path="taskDescribe">
-                    <n-input v-model:value="reportModel.taskDescribe" placeholder="请输入任务描述" type="textarea" :autosize="{minRows: 3,maxRows: 5}"/>
-                </n-form-item>
-                <n-form-item label="任务人流程" path="tasksProcess">
-                    <n-select v-model:value="reportModel.tasksProcess" placeholder="请选择任务人流程" :options="tasksProcessOptions"/>
-                </n-form-item>
-                <n-form-item label="任务人" path="tasksUser">
-                    <TasksUser class="w-full"/>
-                </n-form-item>
-                <n-form-item label="上报批次" path="batch">
-                    <Counter v-model="reportModel.batch" text="(批)"/>
-                </n-form-item>
-                <n-form-item label="限定审批时间" path="time">
-                    <Counter v-model="reportModel.time" text="(天)"/>
-                </n-form-item>
-            </n-form>
-            <template #action>
-                <div class="text-center">
-                    <n-button color="#A4ADB3" class="w-20">取消</n-button>
-                    <n-button type="primary" class="w-20 ml-3">上报</n-button>
-                </div>
-            </template>
-        </n-card>
-    </n-modal>
-</template>
-
-<script setup>
-import { ref, watch, onMounted } from "vue"
-import TasksUser from "~com/tasksUser/index.vue"
-import Counter from "~com/counter/index.vue"
-
-const props = defineProps({
-    show: {
-        type: Boolean,
-        default: false
-    }
-})
-
-//变量
-const showModal = ref(props.show)
-const reportModel = ref({
-    taskName: 'xxxxx',
-    taskDescribe: '',
-    tasksProcess: null,
-    batch: 1,
-    time: 1
-})
-const reportRules = ref({
-    taskDescribe: {
-        required: true,
-        trigger: ["blur", "input"],
-        message: "请输入任务描述"
-    },
-    tasksProcess: {
-        required: true,
-        trigger: ["blur", "change"],
-        message: "请选择任务人流程"
-    },
-})
-
-const tasksProcessOptions = ref([
-    {label: "Drive My Car", value: "song1"}, {label: "Norwegian Wood", value: "song2"},
-    {label: "You Won't See", value: "song3"}, {label: "Nowhere Man", value: "song4"}
-])
-
-watch(() => props.show, (value) => {
-    showModal.value = value
-})
-
-onMounted(() => {
-
-})
-
-//事件
-const emit = defineEmits(['update:show'])
-
-//更新值
-const upModelValue = (value = '') => {
-    searchKey.value = value
-    emit('update:modelValue', value)
-}
-</script>
-
-<style lang="scss" scoped>
-
-</style>

+ 0 - 415
src/components/plugins/element/HcTree.vue

@@ -1,415 +0,0 @@
-<template>
-    <ElTree ref="ElTreeRef" :props="ElTreeProps" :load="ElTreeLoadNode" :data="data" :node-key="nodeKey" :lazy="lazy" :default-expanded-keys="TreeExpandedKeys" highlight-current accordion @node-click="ElTreeClick" @node-contextmenu="ElTreeLabelContextMenu">
-        <template #default="{ node, data }">
-            <div class="data-custom-tree-node" :id="TreeIdPrefix + data[nodeKey]">
-                <!--树组件,节点名称-->
-                <div class="label" :class="node.level === 1?'text-bold':''">
-                    <span :class="data?.colorStatus === 2?'text-blue':data?.colorStatus === 3?'text-orange':data?.colorStatus === 4?'text-green':''" v-if="TreeIsColor">{{ node.label }}</span>
-                    <template v-else>
-                        {{ node.label }}
-                    </template>
-                </div>
-                <!--树组件,操作菜单-->
-                <div class="menu-icon" :class="node.showTreeMenu?'show':''" v-if="node.level !== 1 && menusData.length > 0" @click.stop>
-                    <n-dropdown placement="bottom-end" trigger="click" size="huge" :options="menusData" @select="ElTreeMenuClick($event,node,data)" @update:show="ElTreeMenuShow($event,node)">
-                        <div class="cu-tree-node-popover-menu-icon">
-                            <i class="hcicon-ego-menu"/>
-                        </div>
-                    </n-dropdown>
-                </div>
-                <!--树组件,操作菜单 END-->
-            </div>
-        </template>
-    </ElTree>
-    <n-dropdown placement="bottom" trigger="manual" :x="x" :y="y" size="huge" :options="menusData" :show="showDropdown" @clickoutside="onClickoutside" @select="handleMenuSelect" v-if="menusData.length > 0"/>
-</template>
-
-<script setup>
-//colorStatus, 未填报1 < 已填报-未上报2 < 已填报-待审批3 < 已审批4
-import {ref,nextTick,watch} from "vue";
-import imageData from '~api/other-file/imageData';
-import {queryWbsTree} from '~api/ledger/construction';
-import {queryNeiYeTree} from '~api/ledger/construction';
-import dataFillQuery from '~api/data-fill/query';
-import firstItemApi from '~api/other/first-item';
-
-//参数
-const props = defineProps({
-    menus: {
-        type: Array,
-        default: () => ([])
-    },
-    menuMark: {
-        type: Boolean,
-        default: false
-    },
-    data: {
-        type: Array,
-        default: () => ([])
-    },
-    nodeKey: {
-        type: String,
-        default: 'primaryKeyId'
-    },
-    props: {
-        type: Object,
-        default: () => ({
-            label: 'label',
-            children: 'children',
-            isLeaf: 'leaf'
-        })
-    },
-    type: {
-        type: String,
-        default: ''
-    },
-    lazy: {
-        type: Boolean,
-        default: false
-    },
-    params: {
-        type: Object,
-        default: () => ({})
-    },
-    autoExpandKeys: {
-        type: Array,
-        default: () => ([])
-    },
-    defaultExpandedKeys: {
-        type: Array,
-        default: () => ([])
-    },
-    currentNodeKey: {
-        type: [String,Number],
-        default: ''
-    },
-    idPrefix: {
-        type: [String,Number],
-        default: 'tree-node-'
-    },
-    isAutoRes: {
-        type: Boolean,
-        default: true
-    },
-    isColor: {
-        type: Boolean,
-        default: false
-    },
-})
-
-//变量
-const ElTreeRef = ref(null)
-const showDropdown = ref(false)
-const treeRefNode = ref(null)
-const treeRefData = ref(null)
-const ElTreeProps = ref({
-    label: props.props?.label || 'title',
-    children: props.props?.children || 'children',
-    isLeaf: props.props?.isLeaf || 'leaf'
-})
-const menusData = ref(props.menus)
-const x = ref(0);
-const y = ref(0);
-
-const TreeExpandKey = ref(props.autoExpandKeys)
-const TreeExpandedKeys = ref(props.defaultExpandedKeys)
-const TreeCurrentNodeKey = ref(props.currentNodeKey)
-const TreeIdPrefix = ref(props.idPrefix)
-const menuMark = ref(props.menuMark)
-const TreeIsColor = ref(props.isColor)
-
-//监听
-watch(() => [
-    props.menus,
-    props.autoExpandKeys,
-    props.defaultExpandedKeys,
-    props.currentNodeKey,
-    props.idPrefix,
-    props.menuMark,
-    props.isColor,
-], ([menus,expandKeys,expandedKeys,cnodeKey,idPrefix,isMark,isColor]) => {
-    menusData.value = menus
-    TreeExpandKey.value = expandKeys
-    TreeExpandedKeys.value = expandedKeys
-    TreeCurrentNodeKey.value = cnodeKey
-    TreeIdPrefix.value = idPrefix
-    menuMark.value = isMark
-    TreeIsColor.value = isColor
-    if (expandKeys?.length > 0) {
-        setTreeAutoExpandKey()
-    }
-    if (cnodeKey) {
-        setTreeNodeClick(idPrefix + cnodeKey)
-    }
-})
-
-nextTick().then(() => {
-    const idPrefix = TreeIdPrefix.value || ''
-    const nodeKey = TreeCurrentNodeKey.value
-    if (TreeExpandKey.value?.length > 0) {
-        setTreeAutoExpandKey()
-    }
-    if (nodeKey) {
-        setTreeNodeClick(idPrefix + nodeKey)
-    }
-});
-
-//设置模拟点击
-const setTreeNodeClick = (Id) => {
-    let timer = setInterval(() => {
-        document.getElementById(Id)?.click()
-        clearInterval(timer);
-    }, 800);
-}
-
-//懒加载tree,自动展开上次记忆的节点
-const treeClickNodes = ref(true)
-const setTreeAutoExpandKey = () => {
-    const keys = TreeExpandKey.value || []
-    const idPrefix = TreeIdPrefix.value || ''
-    let num = 0, numMax = keys.length;
-    treeClickNodes.value = props.isAutoRes //是否要返回点击事件的数据
-    let timer = setInterval(() => {
-        if(num < numMax) {
-            document.getElementById(idPrefix + keys[num])?.click()
-            num++;
-        } else {
-            clearInterval(timer);
-            treeClickNodes.value = true
-        }
-    }, 800);
-}
-
-//事件
-const emit = defineEmits(['menuTap','node-click','load-click'])
-
-//树形结构异步加载数据
-const ElTreeLoadNode = (node, resolve) => {
-    emit('load-click', {node, data:node.data})
-    const {contractId, wbsType} = props.params;
-    //获取数据
-    if (props.type === 'file-image-view') {
-        if (node.level === 0) {
-            imageData.getWbsTreeList({
-                contractId: contractId ||'',
-                parentId: ''
-            }).then(res => {
-                resolve(res?.data?.data || [])
-            }).catch(() => {
-                resolve([])
-            })
-        } else {
-            imageData.getWbsTreeList({
-                contractId: contractId ||'',
-                parentId: node.data.id
-            }).then(res => {
-                resolve(res?.data?.data || [])
-            }).catch(() => {
-                resolve([])
-            })
-        }
-    } else if (props.type === 'ledger-write-construction') {
-        if (node.level === 0) {
-            queryWbsTree({
-                wbsType: wbsType || '',
-                contractId: contractId || '',
-                parentId: ''
-            }).then(res => {
-                resolve(res?.data?.data || [])
-            }).catch(() => {
-                resolve([])
-            })
-        } else {
-            queryWbsTree({
-                wbsType: wbsType || '',
-                contractId: contractId || '',
-                parentId: node.data.id
-            }).then(res => {
-                resolve(res?.data?.data || [])
-            }).catch(() => {
-                resolve([])
-            })
-        }
-    } else if (props.type === 'ledger-write-internal') {
-        if (node.level === 0) {
-            queryNeiYeTree({
-                wbsType: wbsType || '',
-                contractId: contractId || '',
-                parentId: ''
-            }).then(res => {
-                resolve(res?.data?.data || [])
-            }).catch(() => {
-                resolve([])
-            })
-        } else {
-            queryNeiYeTree({
-                wbsType: wbsType || '',
-                contractId: contractId || '',
-                parentId: node.data?.id
-            }).then(res => {
-                resolve(res?.data?.data || [])
-            }).catch(() => {
-                resolve([])
-            })
-        }
-    } else if (props.type === 'data-fill-query' || props.type === 'data-fill-wbs') {
-        if (node.level === 0) {
-            dataFillQuery.queryWbsTreeData({
-                contractId: contractId ||'',
-                contractIdRelation: '',
-                parentId: ''
-            }).then(res => {
-                resolve(res?.data?.data || [])
-            }).catch(() => {
-                resolve([])
-            })
-        } else {
-            const {contractIdRelation: cid, primaryKeyId: key, id, oldId} = node.data
-            dataFillQuery.queryWbsTreeData({
-                contractId: contractId || '',
-                contractIdRelation: cid,
-                parentId: cid ? key : id // oldId ||
-            }).then(res => {
-                resolve(res?.data?.data || [])
-            }).catch(() => {
-                resolve([])
-            })
-        }
-    } else if (props.type === 'other-first-item') {
-        if (node.level === 0) {
-            firstItemApi.queryWbsTreeData({
-                contractId: contractId ||'',
-                parentId: ''
-            }).then(res => {
-                resolve(res?.data?.data || [])
-            }).catch(() => {
-                resolve([])
-            })
-        } else {
-            firstItemApi.queryWbsTreeData({
-                contractId: contractId ||'',
-                parentId: node.data.id
-            }).then(res => {
-                resolve(res?.data?.data || [])
-            }).catch(() => {
-                resolve([])
-            })
-        }
-    }
-}
-
-//节点被点击
-const ElTreeClick = (data,node,e) => {
-    if (treeClickNodes.value) {
-        emit('node-click', {node,data,e})
-    }
-}
-
-//鼠标右键事件
-const ElTreeLabelContextMenu = (e,data,node) => {
-    const rows = menusData.value || [];
-    if (node.level !== 1 && rows.length > 0) {
-        e.preventDefault();
-        treeRefNode.value = node;
-        treeRefData.value = data;
-        if (menuMark.value) {
-            for (let i = 0; i < rows.length; i++) {
-                if (rows[i].key === 'mark') {
-                    if (data.isFirst) {
-                        menusData.value[i].label = '取消标记为首件';
-                        menusData.value[i].key = 'cancel_mark';
-                    } else {
-                        menusData.value[i].label = '标记为首件';
-                        menusData.value[i].key = 'mark';
-                    }
-                    break;
-                }
-            }
-        }
-        nextTick().then(() => {
-            showDropdown.value = true;
-            x.value = e.clientX;
-            y.value = e.clientY;
-        });
-    }
-}
-
-//鼠标右键菜单被点击
-const handleMenuSelect = (key) => {
-    const node = treeRefNode.value;
-    const data = treeRefData.value;
-    showDropdown.value = false;
-    emit('menuTap', {key,node,data})
-}
-const onClickoutside = () => {
-    treeRefNode.value = null;
-    treeRefData.value = null;
-    showDropdown.value = false;
-}
-//菜单被点击
-const ElTreeMenuClick = (key,node,data) => {
-    emit('menuTap', {key,node,data})
-}
-//菜单是否显示
-const ElTreeMenuShow = (key,node) => {
-    node.showTreeMenu = key
-}
-
-//设置树菜单的标记数据
-const setElTreeMenuMark = (keys,isFirst) => {
-    keys.forEach(item => {
-        //根据 data 或者 key 拿到 Tree 组件中的 node
-        let node = ElTreeRef.value.getNode(item)
-        if (!!node) node.data.isFirst = isFirst;
-        //为节点设置新数据,只有当设置 node-key 属性的时候才可用	(key, data) 接收两个参数: 1. 节点的 key 2. 新数据
-        //ElTreeRef.value.updateKeyChildren(item,node)
-    })
-}
-
-//设置树菜单的标记数据
-const removeElTreeNode = (key) => {
-    //根据 data 或者 key 拿到 Tree 组件中的 node
-    let node = ElTreeRef.value.getNode(key)
-    //删除 Tree 中的一个节点,使用此方法必须设置 node-key 属性
-    ElTreeRef.value.remove(node)
-}
-
-// 暴露出去
-defineExpose({
-    setElTreeMenuMark,
-    removeElTreeNode
-})
-</script>
-
-<style lang="scss" scoped>
-.data-custom-tree-node {
-    position: relative;
-    display: flex;
-    align-items: center;
-    width: 100%;
-    color: var(--ui-TC);
-    .label {
-        flex: auto;
-        font-size: 16px;
-    }
-    .menu-icon {
-        position: relative;
-        font-size: 20px;
-        opacity: 0;
-        pointer-events: none;
-        transition: opacity 0.2s;
-    }
-    &:hover {
-        .menu-icon {
-            opacity: 1;
-            pointer-events: all;
-            cursor: context-menu;
-        }
-    }
-    .menu-icon.show {
-        opacity: 1;
-        pointer-events: all;
-        cursor: context-menu;
-    }
-}
-</style>

+ 0 - 99
src/components/plugins/naive/HcPage.vue

@@ -1,99 +0,0 @@
-<template>
-    <div class="card-page-box" :style="`justify-content:${align};`">
-        <n-pagination v-model:page="pagesData.current" v-model:page-size="pagesData.size" :item-count="pagesData.total" :page-sizes="sizes" show-size-picker show-quick-jumper
-                      @update:page="pageUpdate" @update:page-size="pageUpdateSize">
-            <template #prefix="{ itemCount }">
-                <span class="text-9">共 {{ itemCount }} 条</span>
-            </template>
-            <template #suffix>
-                <span class="text-9">页</span>
-            </template>
-        </n-pagination>
-    </div>
-</template>
-
-<script setup>
-import {ref,watch} from "vue";
-const props = defineProps({
-    sizes: {
-        type: Array,
-        default: () => ([20, 30, 40, 50])
-    },
-    pages: {
-        type: Object,
-        default: () => ({
-            current: 1,
-            size: 10,
-            total: 0
-        })
-    },
-    align: {
-        type: String,
-        default: 'flex-end'
-    },
-})
-
-//变量
-const pagesData = ref(JSON.parse(JSON.stringify(props.pages)))
-
-//监听
-watch(() => [
-    props.pages,
-    props.pages?.current,
-    props.pages?.size,
-    props.pages?.total
-], ([pages,current,size,total]) => {
-    pagesData.value = JSON.parse(JSON.stringify(pages));
-})
-
-//事件
-const emit = defineEmits(['change'])
-const pageUpdate = (val) => {
-    pagesData.value.current = val;
-    emit('change', pagesData.value)
-}
-const pageUpdateSize = (val) => {
-    pagesData.value.current = 1;
-    pagesData.value.size = val;
-    emit('change', pagesData.value)
-}
-</script>
-
-<style lang="scss" scoped>
-.card-page-box {
-    position: relative;
-    display: flex;
-    justify-content: flex-end;
-    align-items: center;
-}
-.text-9 {
-    color: #999999;
-}
-</style>
-
-<style lang="scss">
-.card-page-box .n-pagination {
-    --n-item-border-hover: 1px solid var(--n-item-text-color-active) !important;
-    .n-pagination-item {
-        border: var(--n-button-border);
-    }
-    .n-pagination-item.n-pagination-item--button {
-        background: white;
-    }
-    .n-pagination-item:not(.n-pagination-item--disabled).n-pagination-item--active {
-        background: var(--n-item-text-color-active);
-        border: var(--n-item-text-color-active);
-        color: white;
-    }
-    .n-pagination-quick-jumper {
-        margin-left: 20px;
-        color: #999999;
-    }
-}
-
-html.theme-dark {
-    .card-page-box .n-pagination .n-pagination-item.n-pagination-item--button {
-        background: var(--n-item-color-disabled);
-    }
-}
-</style>

+ 0 - 59
src/components/plugins/naive/HcTabs.vue

@@ -1,59 +0,0 @@
-<template>
-    <div class="hc-tabs-segment-box">
-        <n-tabs type="segment" v-if="datas.length > 0" :value="keys" @update:value="tabsUpdateValue">
-            <template v-for="item in datas" :key="item.key">
-                <n-tab :name="item.key">{{item.name}}</n-tab>
-            </template>
-        </n-tabs>
-    </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-const props = defineProps({
-    datas: {
-        type: Array,
-        default: () => ([])
-    },
-    keys: {
-        type: String,
-        default: ''
-    }
-})
-//事件
-const emit = defineEmits(['change'])
-//更新
-const tabsUpdateValue = (val) => {
-    emit('change', val)
-}
-</script>
-
-<style lang="scss">
-.hc-tabs-segment-box {
-    position: relative;
-    display: inline-block;
-    .n-tabs {
-        --n-tab-text-color-hover: var(--hc-primary) !important;
-        .n-tabs-tab {
-            color: var(--hc-primary);
-            padding: 6.5px 20px;
-        }
-        .n-tabs-rail {
-            padding: 0;
-            background-color: var(--hc-primary-light-6);
-            .n-tabs-tab-wrapper .n-tabs-tab.n-tabs-tab--active {
-                background-color: var(--hc-primary);
-                font-weight: inherit;
-                color: white;
-            }
-        }
-    }
-}
-
-html.theme-dark {
-    .hc-tabs-segment-box .n-tabs .n-tabs-rail {
-        padding: 0;
-        background-color: #303030;
-    }
-}
-</style>

+ 0 - 198
src/components/reportModal/index.vue

@@ -1,198 +0,0 @@
-<template>
-    <n-modal v-model:show="isShow">
-        <n-card class="w-750" :title="title" :segmented="{content: true}">
-            <n-form ref="formRef" :model="formModel" :rules="formRules" label-placement="left" label-width="auto" size="large">
-                <n-form-item label="任务名称" path="taskName">
-                    <n-input v-model:value="formModel.taskName" disabled/>
-                </n-form-item>
-                <n-form-item label="任务描述" path="taskContent">
-                    <n-input v-model:value="formModel.taskContent" placeholder="请输入任务描述" type="textarea" :autosize="{minRows: 3,maxRows: 5}"/>
-                </n-form-item>
-                <n-form-item label="任务流程" path="fixedFlowId">
-                    <n-select v-model:value="formModel.fixedFlowId" :options="processData" placeholder="任务流程" label-field="fixedFlowName" value-field="id" @update:value="handleProcessValue"/>
-                </n-form-item>
-                <n-form-item label="任务人" path="user" v-if="false">
-                    <TasksUser class="w-full"/>
-                </n-form-item>
-                <n-form-item label="任务人">{{linkUserJoinString}}</n-form-item>
-                <n-form-item label="上报批次" path="batch">
-                    <HcCounter v-model:value="formModel.batch" @update:modelValue="batchUpdateValue"/>
-                </n-form-item>
-                <n-form-item label="限定审批时间" path="restrictDay">
-                    <HcCounter v-model:value="formModel.restrictDay" @update:modelValue="restrictDayUpdateValue"/>
-                </n-form-item>
-            </n-form>
-            <template #action>
-                <div class="text-center">
-                    <n-button class="px-5" @click="cancelReportClick">取消</n-button>
-                    <n-button type="primary" class="px-5 ml-4" :loading="formReportLoading" @click="formReportClick">上报</n-button>
-                </div>
-            </template>
-        </n-card>
-    </n-modal>
-</template>
-
-<script setup>
-import {ref,watch,onMounted} from "vue";
-import TasksUser from "~com/tasksUser/index.vue"
-import HcCounter from "~com/counter/index.vue"
-import tasksFlowApi from '~api/tasks/flow';
-import {ApprovalApi} from '~api/other';
-
-const props = defineProps({
-    show: {
-        type: Boolean,
-        default: false
-    },
-    title: {
-        type: String,
-        default: '上报审批'
-    },
-    taskName: {
-        type: String,
-        default: ''
-    },
-    ids: {
-        type: String,
-        default: ''
-    },
-    projectId: {
-        type: [String,Number],
-        default: ''
-    },
-    contractId: {
-        type: [String,Number],
-        default: ''
-    },
-    url: {
-        type: [String,Number],
-        default: ''
-    },
-})
-
-//变量
-const isShow = ref(props.show)
-const projectId = ref(props.projectId)
-const contractId = ref(props.contractId)
-const ApiUrl = ref(props.url)
-
-//表单
-const formRef = ref(null)
-const processData = ref([])
-const formModel = ref({
-    projectId: projectId.value, contractId: contractId.value, ids: props.ids,
-    taskName: props.taskName, taskContent: '', fixedFlowId: '', batch: 1, restrictDay: 1
-})
-const formRules = ref({
-    taskContent: {
-        required: true,
-        trigger: ["blur", "input"],
-        message: "请输入任务描述"
-    },
-    fixedFlowId: {
-        required: true,
-        trigger: ["blur", "change"],
-        message: "请选择任务流程"
-    },
-    user: {
-        required: true,
-        trigger: ["blur", "change"],
-        message: "请选择任务人"
-    }
-})
-
-//监听
-watch(() => [
-    props.show,
-    props.projectId,
-    props.contractId,
-    props.taskName,
-    props.ids,
-    props.url,
-], ([val,pid,cid,name,ids,url]) => {
-    isShow.value = val
-    projectId.value = pid
-    contractId.value = cid
-    ApiUrl.value = url
-    //更新到表单数据
-    formModel.value.ids = ids
-    formModel.value.taskName = name
-    formModel.value.projectId = pid
-    formModel.value.contractId = cid
-})
-
-//渲染完成
-onMounted(() => {
-    getProcessData()
-})
-
-//获取流程数据
-const linkUserJoinString = ref('')
-const getProcessData = () => {
-    tasksFlowApi.getPageData({
-        projectId: projectId.value,
-        contractId: contractId.value,
-        current: 1, size: 100
-    }).then(({data}) => {
-        if (data.code === 200) {
-            let res = data['data'] || {}
-            processData.value = res['records'] || []
-        } else {
-            processData.value = []
-        }
-    }).catch(erro => {
-        processData.value = []
-    })
-}
-
-//流程数据切换
-const handleProcessValue = (_, data) => {
-    linkUserJoinString.value = data.linkUserJoinString
-}
-
-//上报批次改变
-const batchUpdateValue = (val) => {
-    formModel.value.batch = val
-}
-
-//上报批次改变
-const restrictDayUpdateValue = (val) => {
-    formModel.value.restrictDay = val
-}
-
-const emit = defineEmits(['hide','finish'])
-//取消
-const cancelReportClick = () => {
-    isShow.value = false
-    emit('hide', false)
-}
-//上报
-const formReportClick = () => {
-    formRef.value?.validate((errors) => {
-        if (!errors) batchApprovalApi()
-    });
-}
-
-//上报请求
-const formReportLoading = ref(false)
-const batchApprovalApi = () => {
-    formReportLoading.value = true
-    ApprovalApi(ApiUrl.value, {
-        projectId: projectId.value,
-        contractId: contractId.value,
-        ...formModel.value
-    }).then(({data})=> {
-        formReportLoading.value = false
-        if (data.code === 200) {
-            isShow.value = false
-            window.$message?.success('上报成功')
-            emit('hide', false)
-            emit('finish', data?.data)
-        } else {
-            window.$message?.error(data.msg || '上报异常')
-        }
-    }).catch(erro => {
-        formReportLoading.value = false
-    })
-}
-</script>

+ 0 - 286
src/components/tasksUser/index.vue

@@ -1,286 +0,0 @@
-<template>
-    <div :class="ui" class="hc-tasks-user">
-        <div class="tasks-user-box">
-            <div class="tag-user-list" @click="showModalClick">
-                <template v-for="(item,index) in UserDataList" :key="index">
-                    <n-tag type="primary" class="rounded">{{setCheckboxUserName(item)}}</n-tag>
-                    <span class="arrow-icon-tag" v-if="(UserDataList.length - 1) > index">
-                        <i class="_icon-arrow"/>
-                    </span>
-                </template>
-                <div class="tasks-placeholder" v-if="UserDataList.length <= 0"> 点击这里选择任务人 </div>
-            </div>
-        </div>
-
-        <n-modal v-model:show="showModal">
-            <n-card class="w-990" title="选择任务人" :segmented="{content: true}">
-                <template #header-extra>
-                    <span class="text-lg text-hover" @click="showModal = false">
-                        <i class="_icon-close"/>
-                    </span>
-                </template>
-                <div class="hc-tasks-user-modal-content-box">
-                    <div class="tree-box">
-                        <ElTree :data="ElTreeData" :props="ElTreeProps" node-key="roleId" :default-expanded-keys="[0]" highlight-current accordion @node-click="ElTreeNodeClick"/>
-                    </div>
-                    <div class="user-box">
-                        <div class="y-user-list-box">
-                            <div class="title-box">
-                                <div class="title">可选择</div>
-                            </div>
-                            <div class="user-list">
-                                <n-checkbox-group v-model:value="checkboxUserList">
-                                    <template v-for="item in signUserList" :key="item['certificateUserId']">
-                                        <div class="user-item checkbox-li">
-                                            <n-checkbox :value="`${item['certificateUserName']}-${item['certificateUserId']}`">
-                                                <div>{{item['certificateUserName']}}</div>
-                                            </n-checkbox>
-                                        </div>
-                                    </template>
-                                </n-checkbox-group>
-                            </div>
-                        </div>
-                        <div class="s-user-list-box">
-                            <div class="title-box">
-                                <div class="title">已选择({{checkboxUserList.length}})</div>
-                                <n-button color="#F0630A" size="small" @click="sequenceModal = true" v-if="false">调整顺序</n-button>
-                                <n-button type="primary" size="small" class="ml-3" @click="sureSignUserClick">确定</n-button>
-                            </div>
-                            <div class="user-list">
-                                <template v-for="(item,index) in checkboxUserList" :key="index">
-                                    <n-tag type="primary" :closable="true" class="rounded" @close="delCheckboxUser(index)">{{setCheckboxUserName(item)}}</n-tag>
-                                </template>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </n-card>
-        </n-modal>
-
-        <n-modal v-model:show="sequenceModal">
-            <n-card class="w-606" title="调整顺序" :segmented="{content: true}">
-                <template #header-extra>
-                    <span class="text-lg text-hover" @click="sequenceModal = false">
-                        <i class="_icon-close"/>
-                    </span>
-                </template>
-                <div class="hc-tasks-user-sequence-modal-box">
-                    <div class="sequence-user-list">
-                        <div class="user-item">
-                            <div class="index">1</div>
-                            <div class="name">name</div>
-                            <span class="icon">
-                                <i class="hcicon-direction-up"/>
-                            </span>
-                            <span class="icon sort">
-                                <i class="hcicon-direction-down"/>
-                            </span>
-                        </div>
-                        <div class="user-item">
-                            <div class="index">1</div>
-                            <div class="name">name</div>
-                            <span class="icon sort">
-                                <i class="hcicon-direction-up"/>
-                            </span>
-                            <span class="icon sort">
-                                <i class="hcicon-direction-down"/>
-                            </span>
-                        </div>
-                        <div class="user-item">
-                            <div class="index">1</div>
-                            <div class="name">name</div>
-                            <span class="icon sort">
-                                <i class="hcicon-direction-up"/>
-                            </span>
-                            <span class="icon">
-                                <i class="hcicon-direction-down"/>
-                            </span>
-                        </div>
-                    </div>
-                </div>
-            </n-card>
-        </n-modal>
-
-    </div>
-</template>
-
-<script setup>
-import { ref, watch, onMounted } from "vue";
-import {useAppStore} from "~src/store/index";
-import tasksFlowApi from '~api/tasks/flow';
-
-//初始变量
-const userStore = useAppStore()
-const contractId = ref(userStore.getContractId);
-
-//参数
-const props = defineProps({
-    ui: {
-        type: String,
-        default: ''
-    },
-    //选中的用户数组
-    users: {
-        type: String,
-        default: ''
-    }
-})
-
-//变量
-const showModal = ref(false)
-const sequenceModal = ref(false)
-const checkboxUserList = ref([])
-const UserDataList = ref([])
-
-//树数据
-const ElTreeProps = {children: 'childRoleList', label: 'roleName'}
-const ElTreeData = ref([{
-    roleName: '全部人员',
-    roleId: 0,
-    childRoleList: [],
-    signPfxFileList: []
-}])
-
-//监听
-watch(() => [
-    userStore.getContractId,
-    props.users
-], ([UserContractId,users]) => {
-    contractId.value = UserContractId
-    setUserDataList(users)
-})
-
-//渲染完成
-onMounted(() => {
-    if (props.users) {
-        setUserDataList(props.users)
-    }
-    queryAllRoleList()
-})
-
-//处理用户数据
-const setUserDataList = (users) => {
-    if (users) {
-        const usersArr = users.split(',')
-        UserDataList.value = usersArr
-        checkboxUserList.value = usersArr
-    } else {
-        UserDataList.value = []
-        checkboxUserList.value = []
-    }
-}
-
-//展开弹窗
-const showModalClick = () => {
-    //checkboxUserList
-    showModal.value = true
-}
-
-//获取系统所有角色划分
-const signUserList = ref([])
-const queryAllRoleList = () => {
-    tasksFlowApi.queryAllRoleList({
-        contractId: contractId.value
-    }).then(({data}) => {
-        if (data.code === 200) {
-            let signList = [], dataArr = data['data'] || []
-            ElTreeData.value[0].childRoleList = dataArr
-            if (dataArr.length > 0) {
-                dataArr.forEach(item => {
-                    signList = signList.concat(item.signPfxFileList)
-                })
-            }
-            ElTreeData.value[0].signPfxFileList = signList
-            signUserList.value = signList
-        } else {
-            signUserList.value = []
-            ElTreeData.value[0].childRoleList = []
-            ElTreeData.value[0].signPfxFileList = []
-        }
-    }).catch(erro => {
-        signUserList.value = []
-        ElTreeData.value[0].childRoleList = []
-        ElTreeData.value[0].signPfxFileList = []
-    })
-}
-
-//树被点击
-const ElTreeNodeClick = (data) => {
-    signUserList.value = data?.signPfxFileList || []
-}
-
-//处理已选择的用户问题
-const setCheckboxUserName = (item) => {
-    if (item) {
-        const itemArr = item.split('-')
-        if (itemArr.length > 0 && itemArr[0]) {
-            return itemArr[0]
-        } else {
-            return ''
-        }
-    } else {
-        return ''
-    }
-}
-
-//删除已选择的用户
-const delCheckboxUser = (index) => {
-    checkboxUserList.value.splice(index,1);
-}
-
-//事件
-const emit = defineEmits(['change'])
-
-//确认选择
-const sureSignUserClick = () => {
-    const dataList = JSON.parse(JSON.stringify(checkboxUserList.value))
-    UserDataList.value = dataList
-    showModal.value = false
-    //处理数据格式
-    let users = ''
-    if (dataList.length > 0) {
-        dataList.forEach(item => {
-            if (users) {
-                users += ',' + item
-            } else {
-                users = item
-            }
-        })
-    }
-    emit('change', users)
-}
-</script>
-
-<style lang="scss" scoped>
-@import './style.scss';
-</style>
-
-<style lang="scss">
-.hc-tasks-user .tasks-user-box .tag-user-list {
-    .n-tag {
-        margin: 5px 0;
-    }
-    .tasks-placeholder {
-        color: #c5c5c5;
-    }
-}
-.hc-tasks-user-modal-content-box {
-    .checkbox-li .n-checkbox {
-        width: 100%;
-        .n-checkbox-box-wrapper {
-            position: absolute;
-            right: 0;
-        }
-        .n-checkbox__label {
-            flex: auto;
-            padding: 0;
-        }
-    }
-    .user-list {
-        .n-tag {
-            margin-right: 10px;
-            margin-top: 12px;
-        }
-    }
-}
-</style>

+ 0 - 139
src/components/tasksUser/style.scss

@@ -1,139 +0,0 @@
-.hc-tasks-user {
-    position: relative;
-    .tasks-user-box {
-        position: relative;
-        border: 1px solid #e0e0e6;
-        border-radius: 3px;
-        padding: 0 12px;
-        cursor: pointer;
-        .tag-user-list {
-            position: relative;
-            padding: 5px 0;
-            display: flex;
-            align-items: center;
-            flex-flow: row wrap;
-            .arrow-icon-tag {
-                position: relative;
-                color: #a5673f;
-                font-size: 18px;
-                margin: 0 8px;
-            }
-        }
-    }
-}
-
-.hc-tasks-user-modal-content-box {
-    position: relative;
-    display: flex;
-    height: 460px;
-    .tree-box {
-        flex: 1;
-        user-select: none;
-        position: relative;
-        overflow: auto;
-        padding-right: 20px;
-        border-right: 1px solid var(--n-border-color);
-    }
-    .user-box {
-        flex: 2;
-        position: relative;
-        display: flex;
-        flex-direction: column;
-        .y-user-list-box, .s-user-list-box {
-            position: relative;
-            overflow: auto;
-            display: flex;
-            flex-direction: column;
-            .title-box {
-                position: relative;
-                padding: 12px 0 12px 12px;
-                display: flex;
-                align-items: center;
-                border-bottom: 1px solid var(--n-border-color);
-                .title {
-                    flex: auto;
-                }
-            }
-            .user-list {
-                position: relative;
-                padding: 0 12px;
-                overflow: auto;
-                .user-item {
-                    position: relative;
-                    padding: 10px 0;
-                }
-                .user-item + .user-item {
-                    border-top: 1px dashed var(--n-border-color);
-                }
-            }
-        }
-        .y-user-list-box {
-            flex: 1;
-            .title-box {
-                padding-top: 0;
-            }
-            .user-list {
-                flex: 1;
-            }
-        }
-        .s-user-list-box {
-            position: relative;
-            border-top: 1px solid var(--n-border-color);
-            .user-list {
-                height: 6rem;
-            }
-        }
-    }
-}
-
-.hc-tasks-user-sequence-modal-box {
-    position: relative;
-    max-height: 28rem;
-    overflow: auto;
-    .sequence-user-list {
-        position: relative;
-        font-size: 16px;
-        user-select: none;
-        .user-item {
-            position: relative;
-            display: flex;
-            align-items: center;
-            padding: 10px 0;
-            cursor: grab;
-            .index {
-                width: 24px;
-                text-align: center;
-                margin-right: 20px;
-            }
-            .name {
-                flex: 1;
-            }
-            .icon {
-                width: 22.4px;
-                text-align: center;
-                margin-left: 10px;
-                color: $grey;
-                &.sort {
-                    cursor: pointer;
-                    color: var(--hc-primary);
-                    transition: color 0.3s;
-                    &:hover {
-                        color: #2d68a1;
-                    }
-                }
-            }
-        }
-        .user-item + .user-item {
-            border-top: 1px dashed var(--n-border-color);
-        }
-    }
-}
-
-
-html.theme-dark {
-    .hc-tasks-user .tasks-user-box {
-        border: 1px solid #303030;
-        background-color: #424246;
-        border-radius: 5px;
-    }
-}

+ 170 - 0
src/global/components/hc-context-menu/index.vue

@@ -0,0 +1,170 @@
+<template>
+    <div class="hc-context-menu-box" :class="ui" :id="uuid" v-click-outside="onClickOutside">
+        <template v-for="item in menus">
+            <div class="hc-context-menu-item" @click.stop="optionClicked(item)">
+                <slot :name='item.key' :item="item" v-if="item.isSlot"/>
+                <template v-else>
+                    <HcIcon :name="item.icon" class="menu-item-icon" v-if="item.icon"/>
+                    <span class="menu-item-name">{{item.label}}</span>
+                </template>
+            </div>
+        </template>
+    </div>
+</template>
+
+<script setup>
+import {ref, useSlots, watch, nextTick, onMounted, onBeforeUnmount} from "vue";
+import clickOutsideVue from 'click-outside-vue3';
+import {UUID, deepClone} from "vue-utils-plus"
+const props = defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    datas: {
+        type: Array,
+        default: () => ([])
+    }
+})
+
+//初始变量
+const uuid = UUID()
+const menus = ref(props.datas)
+
+//挂载自定义指令
+const vClickOutside = clickOutsideVue.directive
+
+//监听表头
+watch(() => [
+    props.datas
+], ([datas]) => {
+    setIsSlots(datas)
+})
+
+//加载完成
+nextTick(()=>{
+    setIsSlots(props.datas)
+})
+
+//渲染完成
+onMounted(()=>{
+    document.body.addEventListener('keyup', onEscKeyRelease);
+})
+
+//判断<slot>是否有传值
+const slots = useSlots()
+const setIsSlots = (datas) => {
+    let arr = deepClone(datas)
+    for (let i = 0; i < arr.length; i++) {
+        arr[i].isSlot = !!slots[arr[i].key]
+    }
+    menus.value = arr
+}
+
+//显示菜单
+const showMenu = (event) => {
+    let menu = document.getElementById(uuid);
+    if (!menu) return;
+    //取宽高
+    menu.style.visibility = 'hidden';
+    menu.style.display = 'block';
+    let menuWidth = menu.offsetWidth;
+    let menuHeight = menu.offsetHeight;
+    menu.removeAttribute('style');
+    //宽
+    if (menuWidth + event.pageX >= window.innerWidth) {
+        menu.style.left = event.pageX - menuWidth + 2 + 'px';
+    } else {
+        menu.style.left = event.pageX - 2 + 'px';
+    }
+    //高
+    if (menuHeight + event.pageY >= window.innerHeight) {
+        menu.style.top = event.pageY - menuHeight + 2 + 'px';
+    } else {
+        menu.style.top = event.pageY - 2 + 'px';
+    }
+    menu.classList.add('active');
+}
+
+//事件
+const emit = defineEmits(['closed', 'item-click'])
+
+const hideContextMenu = () => {
+    const element = document.getElementById(uuid);
+    if (element) {
+        element.classList.remove('active');
+        emit('closed')
+    }
+}
+
+const onClickOutside = () => {
+    hideContextMenu()
+}
+
+//菜单被点击
+const optionClicked = (item) => {
+    hideContextMenu()
+    emit('item-click', item)
+}
+
+const onEscKeyRelease = (event) => {
+    if (event.keyCode === 27) {
+        hideContextMenu()
+    }
+}
+
+//卸载之前
+onBeforeUnmount(() => {
+    document.removeEventListener('keyup', onEscKeyRelease);
+})
+
+// 暴露出去
+defineExpose({
+    showMenu
+})
+</script>
+
+<style lang="scss" scoped>
+.hc-context-menu-box {
+    position: fixed;
+    background-color: #fff;
+    border-radius: 4px;
+    width: max-content;
+    display: none;
+    left: 0;
+    top: 0;
+    box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);
+    z-index: 1000000;
+    &.active {
+        display: block;
+    }
+    .hc-context-menu-item {
+        align-items: center;
+        padding: 5px 15px;
+        display: flex;
+        cursor: pointer;
+        position: relative;
+        height: 40px;
+        font-size: 16px;
+        color: #333639;
+        .menu-item-icon {
+            margin-right: 6px;
+        }
+        &:hover {
+            background-color: #f3f3f5;
+        }
+        &:first-of-type {
+            margin-top: 4px;
+        }
+        &:last-of-type {
+            margin-bottom: 4px;
+        }
+    }
+}
+</style>
+
+<style lang="scss">
+.hc-context-menu-box .hc-context-menu-item .menu-item-icon {
+    margin-right: 6px;
+}
+</style>

+ 1 - 1
src/global/components/hc-report-modal/index.vue

@@ -1,5 +1,5 @@
 <template>
-    <el-dialog v-model="isShow" :title="title" width="47rem" custom-class="hc-modal-border">
+    <el-dialog v-model="isShow" :title="title" width="47rem" class="hc-modal-border">
         <el-form ref="formRef" :model="formModel" :rules="formRules" label-width="auto" size="large">
             <el-form-item label="任务名称" prop="taskName">
                 <el-input v-model="formModel.taskName" disabled/>

+ 2 - 2
src/global/components/hc-tasks-user/index.vue

@@ -11,7 +11,7 @@
         </div>
 
         <!--选择任务人-->
-        <el-dialog v-model="showModal" title="选择任务人" width="62rem" custom-class="hc-modal-border hc-modal-nop">
+        <el-dialog v-model="showModal" title="选择任务人" width="62rem" class="hc-modal-border hc-modal-nop">
             <div class="hc-tasks-user-modal-content-box">
                 <div class="tree-box">
                     <el-scrollbar>
@@ -61,7 +61,7 @@
         </el-dialog>
 
         <!--调整顺序-->
-        <el-dialog v-model="sequenceModal" title="调整顺序" width="38rem" custom-class="hc-modal-border">
+        <el-dialog v-model="sequenceModal" title="调整顺序" width="38rem" class="hc-modal-border">
             <el-alert title="可拖动排序,也可在后面点击图标,切换排序" type="warning" :closable="false"/>
             <div class="sort-node-body-box list-group header">
                 <div class="list-group-item">

+ 2 - 0
src/global/components/index.js

@@ -13,6 +13,7 @@ import HcNewSwitch from './hc-new-switch/index.vue'
 import HcDragModal from './hc-drag-modal/index.vue'
 import HcReportModal from './hc-report-modal/index.vue'
 import HcTasksUser from './hc-tasks-user/index.vue'
+import HcContextMenu from './hc-context-menu/index.vue'
 
 //注册全局组件
 export const setupComponents = (App) => {
@@ -31,4 +32,5 @@ export const setupComponents = (App) => {
     App.component('HcDragModal', HcDragModal)
     App.component('HcReportModal', HcReportModal)
     App.component('HcTasksUser', HcTasksUser)
+    App.component('HcContextMenu', HcContextMenu)
 }

+ 4 - 5
src/layout/modules/UserInfoBar.vue

@@ -22,12 +22,11 @@
 import {onMounted, ref, watch} from "vue";
 import {useRouter} from 'vue-router'
 import {useAppStore} from "~src/store";
-import {getStore} from "~src/utils/lib/storage";
-import {calcDate} from "~src/utils/lib/date";
-import {validatenull} from "~src/utils/lib/validate";
 import website from "~src/config/index";
 import avatarPng from '~src/assets/images/avatar.png';
 import {RefreshToken,LogOut} from "~sto/user";
+import {getStoreData} from '~src/utils/storage'
+import {calcDate,isValueNull} from "vue-utils-plus"
 
 //变量
 const router = useRouter()
@@ -49,9 +48,9 @@ onMounted(() => {
 //刷新token
 const getRefreshToken = () => {
     setInterval(() => {
-        const token = getStore({name: "token", debug: true}) || {};
+        const token = getStoreData("token") || {};
         const date = calcDate(token.datetime, new Date().getTime());
-        if (validatenull(date)) return;
+        if (isValueNull(date)) return;
         if (date.seconds >= website.tokenTime && !refreshLock.value) {
             refreshLock.value = true;
             RefreshToken().then(() => {

+ 0 - 656
src/plugins/idCard/area.js

@@ -1,656 +0,0 @@
-/**
- * @file area.js
- * @description 行政区划(省市县三级)编码列表
- * @reference http://www.mca.gov.cn/article/sj/xzqh/1980/
- */
-export default [
-    110101, 110102, 110103, 110104, 110105, 110106, 110107, 110108, 110109, 110110, 110111, 110112, 110113, 110114, 110115, 110116, 110117, 110118, 110119, 110201, 110202, 110203, 110204, 110205, 110206, 110207, 110208,
-    110209, 110221, 110222, 110223, 110224, 110225, 110226, 110227, 110228, 110229, 120101, 120102, 120103, 120104, 120105, 120106, 120107, 120108, 120109, 120110, 120111, 120112, 120113, 120114, 120115, 120116, 120117,
-    120118, 120119, 120201, 120202, 120203, 120204, 120205, 120221, 120222, 120223, 120224, 120225, 130101, 130102, 130103, 130104, 130105, 130106, 130107, 130108, 130109, 130110, 130111, 130121, 130122, 130123, 130124,
-    130125, 130126, 130127, 130128, 130129, 130130, 130131, 130132, 130133, 130181, 130182, 130183, 130184, 130185, 130201, 130202, 130203, 130204, 130205, 130206, 130207, 130208, 130209, 130221, 130222, 130223, 130224,
-    130225, 130226, 130227, 130228, 130229, 130230, 130281, 130282, 130283, 130301, 130302, 130303, 130304, 130305, 130306, 130321, 130322, 130323, 130324, 130401, 130402, 130403, 130404, 130405, 130406, 130407, 130408,
-    130421, 130422, 130423, 130424, 130425, 130426, 130427, 130428, 130429, 130430, 130431, 130432, 130433, 130434, 130435, 130481, 130501, 130502, 130503, 130504, 130521, 130522, 130523, 130524, 130525, 130526, 130527,
-    130528, 130529, 130530, 130531, 130532, 130533, 130534, 130535, 130581, 130582, 130601, 130602, 130603, 130604, 130605, 130606, 130607, 130608, 130609, 130621, 130622, 130623, 130624, 130625, 130626, 130627, 130628,
-    130629, 130630, 130631, 130632, 130633, 130634, 130635, 130636, 130637, 130638, 130681, 130682, 130683, 130684, 130701, 130702, 130703, 130704, 130705, 130706, 130707, 130708, 130709, 130721, 130722, 130723, 130724,
-    130725, 130726, 130727, 130728, 130729, 130730, 130731, 130732, 130733, 130801, 130802, 130803, 130804, 130821, 130822, 130823, 130824, 130825, 130826, 130827, 130828, 130881, 130901, 130902, 130903, 130904, 130921,
-    130922, 130923, 130924, 130925, 130926, 130927, 130928, 130929, 130930, 130981, 130982, 130983, 130984, 131001, 131002, 131003, 131021, 131022, 131023, 131024, 131025, 131026, 131027, 131028, 131081, 131082, 131101,
-    131102, 131103, 131121, 131122, 131123, 131124, 131125, 131126, 131127, 131128, 131181, 131182, 132101, 132102, 132103, 132104, 132105, 132106, 132121, 132122, 132123, 132124, 132125, 132126, 132127, 132128, 132129,
-    132130, 132131, 132132, 132133, 132134, 132135, 132201, 132202, 132203, 132204, 132221, 132222, 132223, 132224, 132225, 132226, 132227, 132228, 132229, 132230, 132231, 132232, 132233, 132234, 132235, 132236, 132237,
-    132301, 132302, 132303, 132304, 132321, 132322, 132323, 132324, 132325, 132326, 132327, 132328, 132329, 132330, 132331, 132332, 132333, 132334, 132335, 132336, 132337, 132401, 132402, 132403, 132404, 132405, 132421,
-    132422, 132423, 132424, 132425, 132426, 132427, 132428, 132429, 132430, 132431, 132432, 132433, 132434, 132435, 132436, 132437, 132438, 132439, 132440, 132441, 132442, 132501, 132502, 132503, 132504, 132505, 132506,
-    132507, 132521, 132522, 132523, 132524, 132525, 132526, 132527, 132528, 132529, 132530, 132531, 132532, 132533, 132601, 132602, 132603, 132604, 132621, 132622, 132623, 132624, 132625, 132626, 132627, 132628, 132629,
-    132701, 132702, 132703, 132704, 132705, 132721, 132722, 132723, 132724, 132725, 132726, 132727, 132728, 132729, 132730, 132731, 132732, 132733, 132801, 132821, 132822, 132823, 132824, 132825, 132826, 132827, 132828,
-    132829, 132901, 132902, 132903, 132904, 132905, 132921, 132922, 132923, 132924, 132925, 132926, 132927, 132928, 132929, 132930, 132931, 132932, 132933, 132934, 133001, 133002, 133003, 133021, 133022, 133023, 133024,
-    133025, 133026, 133027, 133028, 133029, 133030, 133031, 139001, 139002, 139003, 139004, 139005, 139006, 139007, 139008, 139009, 139010, 139011, 139012, 139013, 139014, 139015, 139016, 139017, 139018, 139019, 139020,
-    140101, 140102, 140103, 140104, 140105, 140106, 140107, 140108, 140109, 140110, 140111, 140112, 140113, 140121, 140122, 140123, 140181, 140201, 140202, 140203, 140211, 140212, 140221, 140222, 140223, 140224, 140225,
-    140226, 140227, 140301, 140302, 140303, 140311, 140321, 140322, 140401, 140402, 140411, 140421, 140422, 140423, 140424, 140425, 140426, 140427, 140428, 140429, 140430, 140431, 140481, 140501, 140502, 140503, 140521,
-    140522, 140523, 140524, 140525, 140581, 140601, 140602, 140603, 140621, 140622, 140623, 140624, 140701, 140702, 140721, 140722, 140723, 140724, 140725, 140726, 140727, 140728, 140729, 140781, 140801, 140802, 140821,
-    140822, 140823, 140824, 140825, 140826, 140827, 140828, 140829, 140830, 140881, 140882, 140901, 140902, 140921, 140922, 140923, 140924, 140925, 140926, 140927, 140928, 140929, 140930, 140931, 140932, 140981, 141001,
-    141002, 141021, 141022, 141023, 141024, 141025, 141026, 141027, 141028, 141029, 141030, 141031, 141032, 141033, 141034, 141081, 141082, 141101, 141102, 141121, 141122, 141123, 141124, 141125, 141126, 141127, 141128,
-    141129, 141130, 141181, 141182, 142101, 142121, 142122, 142123, 142124, 142125, 142126, 142127, 142128, 142129, 142130, 142131, 142132, 142133, 142201, 142202, 142221, 142222, 142223, 142224, 142225, 142226, 142227,
-    142228, 142229, 142230, 142231, 142232, 142233, 142234, 142301, 142302, 142303, 142321, 142322, 142323, 142324, 142325, 142326, 142327, 142328, 142329, 142330, 142331, 142332, 142333, 142401, 142402, 142421, 142422,
-    142423, 142424, 142425, 142426, 142427, 142428, 142429, 142430, 142431, 142432, 142433, 142501, 142521, 142522, 142523, 142524, 142525, 142526, 142527, 142528, 142529, 142530, 142531, 142532, 142533, 142534, 142535,
-    142536, 142601, 142602, 142603, 142621, 142622, 142623, 142624, 142625, 142626, 142627, 142628, 142629, 142630, 142631, 142632, 142633, 142634, 142635, 142636, 142701, 142702, 142703, 142721, 142722, 142723, 142724,
-    142725, 142726, 142727, 142728, 142729, 142730, 142731, 142732, 142733, 149001, 149002, 149003, 150101, 150102, 150103, 150104, 150105, 150121, 150122, 150123, 150124, 150125, 150201, 150202, 150203, 150204, 150205,
-    150206, 150207, 150221, 150222, 150223, 150301, 150302, 150303, 150304, 150401, 150402, 150403, 150404, 150421, 150422, 150423, 150424, 150425, 150426, 150428, 150429, 150430, 150501, 150502, 150521, 150522, 150523,
-    150524, 150525, 150526, 150581, 150601, 150602, 150603, 150621, 150622, 150623, 150624, 150625, 150626, 150627, 150701, 150702, 150703, 150721, 150722, 150723, 150724, 150725, 150726, 150727, 150781, 150782, 150783,
-    150784, 150785, 150801, 150802, 150821, 150822, 150823, 150824, 150825, 150826, 150901, 150902, 150921, 150922, 150923, 150924, 150925, 150926, 150927, 150928, 150929, 150981, 152101, 152102, 152103, 152104, 152105,
-    152106, 152121, 152122, 152123, 152124, 152125, 152126, 152127, 152128, 152129, 152130, 152131, 152201, 152202, 152221, 152222, 152223, 152224, 152301, 152302, 152321, 152322, 152323, 152324, 152325, 152326, 152327,
-    152401, 152421, 152422, 152423, 152424, 152425, 152426, 152427, 152428, 152429, 152430, 152431, 152501, 152502, 152521, 152522, 152523, 152524, 152525, 152526, 152527, 152528, 152529, 152530, 152531, 152601, 152602,
-    152621, 152622, 152623, 152624, 152625, 152626, 152627, 152628, 152629, 152630, 152631, 152632, 152633, 152634, 152701, 152721, 152722, 152723,
-    152724, 152725, 152726, 152727, 152728, 152801, 152821, 152822, 152823,
-    152824, 152825, 152826, 152827, 152828, 152829, 152830, 152831, 152832,
-    152833, 152834, 152901, 152921, 152922, 152923, 210101, 210102, 210103,
-    210104, 210105, 210106, 210111, 210112, 210113, 210114, 210115, 210121,
-    210122, 210123, 210124, 210181, 210201, 210202, 210203, 210204, 210211,
-    210212, 210213, 210214, 210219, 210221, 210222, 210223, 210224, 210225,
-    210281, 210282, 210283, 210301, 210302, 210303, 210304, 210311, 210319,
-    210321, 210322, 210323, 210381, 210401, 210402, 210403, 210404, 210411,
-    210421, 210422, 210423, 210501, 210502, 210503, 210504, 210505, 210511,
-    210521, 210522, 210601, 210602, 210603, 210604, 210621, 210622, 210623,
-    210624, 210681, 210682, 210701, 210702, 210703, 210704, 210705, 210706,
-    210711, 210719, 210721, 210722, 210723, 210724, 210725, 210726, 210727,
-    210781, 210782, 210801, 210802, 210803, 210804, 210811, 210821, 210822,
-    210823, 210824, 210881, 210882, 210901, 210902, 210903, 210904, 210905,
-    210911, 210921, 210922, 211001, 211002, 211003, 211004, 211005, 211011,
-    211021, 211022, 211081, 211101, 211102, 211103, 211104, 211111, 211121,
-    211122, 211201, 211202, 211203, 211204, 211221, 211222, 211223, 211224,
-    211225, 211226, 211281, 211282, 211301, 211302, 211303, 211319, 211321,
-    211322, 211323, 211324, 211325, 211326, 211381, 211382, 211401, 211402,
-    211403, 211404, 211405, 211421, 211422, 211481, 212101, 212102, 212121,
-    212122, 212123, 212124, 212125, 212126, 212201, 212221, 212222, 212223,
-    212224, 212225, 212226, 219001, 219002, 219003, 219004, 219005, 219006,
-    219007, 219008, 219009, 219010, 219011, 219012, 219013, 219014, 219015,
-    219016, 220101, 220102, 220103, 220104, 220105, 220106, 220111, 220112,
-    220113, 220121, 220122, 220123, 220124, 220125, 220181, 220182, 220183,
-    220201, 220202, 220203, 220204, 220211, 220221, 220222, 220223, 220224,
-    220225, 220281, 220282, 220283, 220284, 220301, 220302, 220303, 220319,
-    220321, 220322, 220323, 220324, 220381, 220382, 220401, 220402, 220403,
-    220421, 220422, 220501, 220502, 220503, 220519, 220521, 220522, 220523,
-    220524, 220581, 220582, 220601, 220602, 220603, 220604, 220605, 220621,
-    220622, 220623, 220624, 220625, 220681, 220701, 220702, 220721, 220722,
-    220723, 220724, 220781, 220801, 220802, 220821, 220822, 220881, 220882,
-    222101, 222102, 222121, 222122, 222123, 222124, 222125, 222201, 222202,
-    222221, 222222, 222223, 222224, 222225, 222226, 222227, 222228, 222301,
-    222302, 222303, 222304, 222321, 222322, 222323, 222324, 222325, 222326,
-    222327, 222328, 222401, 222402, 222403, 222404, 222405, 222406, 222421,
-    222422, 222423, 222424, 222425, 222426, 222427, 222501, 222521, 222522,
-    222523, 222524, 222525, 222601, 222621, 222622, 222623, 222624, 222625,
-    229001, 229002, 229003, 229004, 229005, 229006, 229007, 229008, 229009,
-    229010, 229011, 229012, 230101, 230102, 230103, 230104, 230105, 230106,
-    230107, 230108, 230109, 230110, 230111, 230112, 230113, 230121, 230122,
-    230123, 230124, 230125, 230126, 230127, 230128, 230129, 230181, 230182,
-    230183, 230184, 230201, 230202, 230203, 230204, 230205, 230206, 230207,
-    230208, 230221, 230222, 230223, 230224, 230225, 230226, 230227, 230228,
-    230229, 230230, 230231, 230281, 230301, 230302, 230303, 230304, 230305,
-    230306, 230307, 230321, 230322, 230381, 230382, 230401, 230402, 230403,
-    230404, 230405, 230406, 230407, 230421, 230422, 230501, 230502, 230503,
-    230504, 230505, 230506, 230507, 230521, 230522, 230523, 230524, 230601,
-    230602, 230603, 230604, 230605, 230606, 230621, 230622, 230623, 230624,
-    230701, 230702, 230703, 230704, 230705, 230706, 230707, 230708, 230709,
-    230710, 230711, 230712, 230713, 230714, 230715, 230716, 230721, 230722,
-    230781, 230801, 230802, 230803, 230804, 230805, 230811, 230821, 230822,
-    230823, 230824, 230825, 230826, 230827, 230828, 230829, 230830, 230831,
-    230832, 230833, 230881, 230882, 230883, 230901, 230902, 230903, 230904,
-    230921, 231001, 231002, 231003, 231004, 231005, 231006, 231007, 231011,
-    231020, 231021, 231022, 231023, 231024, 231025, 231026, 231027, 231081,
-    231083, 231084, 231085, 231086, 231101, 231102, 231121, 231122, 231123,
-    231124, 231181, 231182, 231201, 231202, 231221, 231222, 231223, 231224,
-    231225, 231226, 231281, 231282, 231283, 232101, 232102, 232103, 232121,
-    232122, 232123, 232124, 232125, 232126, 232127, 232128, 232129, 232130,
-    232131, 232132, 232201, 232221, 232222, 232223, 232224, 232225, 232226,
-    232227, 232228, 232229, 232230, 232231, 232301, 232302, 232303, 232304,
-    232321, 232322, 232323, 232324, 232325, 232326, 232327, 232328, 232329,
-    232330, 232331, 232332, 232401, 232402, 232403, 232404, 232405, 232406,
-    232411, 232421, 232422, 232423, 232424, 232425, 232426, 232427, 232428,
-    232429, 232430, 232431, 232432, 232433, 232501, 232502, 232503, 232504,
-    232505, 232506, 232511, 232521, 232522, 232523, 232524, 232525, 232526,
-    232527, 232528, 232581, 232601, 232602, 232603, 232621, 232622, 232623,
-    232624, 232625, 232626, 232627, 232701, 232721, 232722, 232723, 239001,
-    239002, 239003, 239004, 239005, 239006, 239007, 239008, 239009, 239010,
-    239011, 310101, 310102, 310103, 310104, 310105, 310106, 310107, 310108,
-    310109, 310110, 310111, 310112, 310113, 310114, 310115, 310116, 310117,
-    310118, 310119, 310120, 310151, 310201, 310202, 310203, 310204, 310205,
-    310206, 310207, 310208, 310209, 310210, 310221, 310222, 310223, 310224,
-    310225, 310226, 310227, 310228, 310229, 310230, 320101, 320102, 320103,
-    320104, 320105, 320106, 320107, 320111, 320112, 320113, 320114, 320115,
-    320116, 320117, 320118, 320121, 320122, 320123, 320124, 320125, 320201,
-    320202, 320203, 320204, 320205, 320206, 320211, 320213, 320214, 320221,
-    320222, 320223, 320281, 320282, 320283, 320301, 320302, 320303, 320304,
-    320305, 320311, 320312, 320321, 320322, 320323, 320324, 320325, 320326,
-    320381, 320382, 320401, 320402, 320403, 320404, 320405, 320411, 320412,
-    320413, 320421, 320422, 320423, 320481, 320482, 320483, 320501, 320502,
-    320503, 320504, 320505, 320506, 320507, 320508, 320509, 320511, 320521,
-    320522, 320523, 320524, 320525, 320581, 320582, 320583, 320584, 320585,
-    320586, 320601, 320602, 320603, 320611, 320612, 320621, 320622, 320623,
-    320624, 320625, 320626, 320681, 320682, 320683, 320684, 320701, 320702,
-    320703, 320704, 320705, 320706, 320707, 320711, 320721, 320722, 320723,
-    320724, 320801, 320802, 320803, 320804, 320811, 320812, 320813, 320821,
-    320822, 320823, 320824, 320825, 320826, 320827, 320828, 320829, 320830,
-    320831, 320881, 320882, 320901, 320902, 320903, 320904, 320911, 320921,
-    320922, 320923, 320924, 320925, 320926, 320927, 320928, 320981, 320982,
-    321001, 321002, 321003, 321011, 321012, 321021, 321022, 321023, 321024,
-    321025, 321026, 321027, 321028, 321029, 321081, 321082, 321083, 321084,
-    321085, 321086, 321087, 321088, 321101, 321102, 321111, 321112, 321121,
-    321122, 321123, 321124, 321181, 321182, 321183, 321201, 321202, 321203,
-    321204, 321281, 321282, 321283, 321284, 321301, 321302, 321311, 321321,
-    321322, 321323, 321324, 322101, 322121, 322122, 322123, 322124, 322125,
-    322126, 322127, 322128, 322201, 322221, 322222, 322223, 322224, 322225,
-    322226, 322227, 322228, 322229, 322230, 322231, 322232, 322301, 322321,
-    322322, 322323, 322324, 322325, 322326, 322327, 322328, 322401, 322402,
-    322421, 322422, 322423, 322424, 322425, 322426, 322427, 322428, 322429,
-    322501, 322521, 322522, 322523, 322524, 322525, 322526, 322601, 322621,
-    322622, 322623, 322624, 322625, 322626, 322627, 322628, 322629, 322630,
-    322701, 322721, 322722, 322723, 322724, 322725, 322726, 322727, 322728,
-    329001, 329002, 329003, 329004, 329005, 329006, 329007, 329008, 329009,
-    329010, 329011, 329012, 329013, 329014, 329015, 329016, 329017, 329018,
-    329019, 329020, 329021, 329022, 329023, 329024, 329025, 329026, 329027,
-    329028, 330101, 330102, 330103, 330104, 330105, 330106, 330107, 330108,
-    330109, 330110, 330111, 330112, 330121, 330122, 330123, 330124, 330125,
-    330126, 330127, 330181, 330182, 330183, 330184, 330185, 330201, 330202,
-    330203, 330204, 330205, 330206, 330211, 330212, 330213, 330219, 330221,
-    330222, 330223, 330224, 330225, 330226, 330227, 330281, 330282, 330283,
-    330301, 330302, 330303, 330304, 330305, 330321, 330322, 330323, 330324,
-    330325, 330326, 330327, 330328, 330329, 330381, 330382, 330401, 330402,
-    330411, 330421, 330422, 330423, 330424, 330425, 330481, 330482, 330483,
-    330501, 330502, 330503, 330511, 330521, 330522, 330523, 330601, 330602,
-    330603, 330604, 330621, 330622, 330623, 330624, 330625, 330681, 330682,
-    330683, 330701, 330702, 330703, 330721, 330722, 330723, 330724, 330725,
-    330726, 330727, 330781, 330782, 330783, 330784, 330801, 330802, 330803,
-    330821, 330822, 330823, 330824, 330825, 330881, 330901, 330902, 330903,
-    330921, 330922, 331001, 331002, 331003, 331004, 331021, 331022, 331023,
-    331024, 331081, 331082, 331083, 331101, 331102, 331121, 331122, 331123,
-    331124, 331125, 331126, 331127, 331181, 332101, 332102, 332121, 332122,
-    332123, 332124, 332125, 332126, 332127, 332128, 332129, 332130, 332201,
-    332221, 332222, 332223, 332224, 332225, 332226, 332227, 332301, 332321,
-    332322, 332323, 332324, 332325, 332401, 332402, 332421, 332422, 332423,
-    332424, 332425, 332426, 332427, 332428, 332429, 332430, 332431, 332501,
-    332502, 332521, 332522, 332523, 332524, 332525, 332526, 332527, 332528,
-    332529, 332530, 332531, 332581, 332582, 332601, 332602, 332603, 332621,
-    332622, 332623, 332624, 332625, 332626, 332627, 332701, 332721, 332722,
-    332723, 332724, 332725, 332726, 332727, 332801, 332821, 332822, 332823,
-    332824, 339001, 339002, 339003, 339004, 339005, 339006, 339007, 339008,
-    339009, 339010, 339011, 339012, 339013, 339014, 339015, 339016, 339017,
-    339018, 339019, 339020, 339021, 340101, 340102, 340103, 340104, 340111,
-    340121, 340122, 340123, 340124, 340181, 340201, 340202, 340203, 340204,
-    340205, 340206, 340207, 340208, 340211, 340221, 340222, 340223, 340224,
-    340225, 340301, 340302, 340303, 340304, 340311, 340321, 340322, 340323,
-    340401, 340402, 340403, 340404, 340405, 340406, 340421, 340422, 340501,
-    340502, 340503, 340504, 340505, 340506, 340511, 340521, 340522, 340523,
-    340601, 340602, 340603, 340604, 340611, 340621, 340701, 340702, 340703,
-    340704, 340705, 340706, 340711, 340721, 340722, 340801, 340802, 340803,
-    340811, 340821, 340822, 340823, 340824, 340825, 340826, 340827, 340828,
-    340881, 340901, 341001, 341002, 341003, 341004, 341021, 341022, 341023,
-    341024, 341101, 341102, 341103, 341121, 341122, 341124, 341125, 341126,
-    341127, 341181, 341182, 341201, 341202, 341203, 341204, 341221, 341222,
-    341223, 341224, 341225, 341226, 341227, 341281, 341282, 341301, 341302,
-    341321, 341322, 341323, 341324, 341401, 341402, 341421, 341422, 341423,
-    341424, 341501, 341502, 341503, 341504, 341521, 341522, 341523, 341524,
-    341525, 341601, 341602, 341621, 341622, 341623, 341701, 341702, 341721,
-    341722, 341723, 341801, 341802, 341821, 341822, 341823, 341824, 341825,
-    341881, 342101, 342102, 342103, 342121, 342122, 342123, 342124, 342125,
-    342126, 342127, 342128, 342129, 342130, 342201, 342221, 342222, 342223,
-    342224, 342225, 342226, 342227, 342228, 342301, 342321, 342322, 342323,
-    342324, 342325, 342326, 342327, 342401, 342421, 342422, 342423, 342424,
-    342425, 342426, 342427, 342501, 342502, 342521, 342522, 342523, 342524,
-    342525, 342526, 342527, 342528, 342529, 342530, 342531, 342601, 342621,
-    342622, 342623, 342624, 342625, 342626, 342701, 342721, 342722, 342723,
-    342724, 342725, 342726, 342727, 342728, 342801, 342821, 342822, 342823,
-    342824, 342825, 342826, 342827, 342828, 342829, 342830, 342831, 342901,
-    342921, 342922, 342923, 349001, 349002, 350101, 350102, 350103, 350104,
-    350105, 350111, 350112, 350121, 350122, 350123, 350124, 350125, 350126,
-    350127, 350128, 350181, 350182, 350201, 350202, 350203, 350204, 350205,
-    350206, 350211, 350212, 350213, 350221, 350301, 350302, 350303, 350304,
-    350305, 350321, 350322, 350401, 350402, 350403, 350420, 350421, 350422,
-    350423, 350424, 350425, 350426, 350427, 350428, 350429, 350430, 350481,
-    350501, 350502, 350503, 350504, 350505, 350521, 350522, 350523, 350524,
-    350525, 350526, 350527, 350581, 350582, 350583, 350601, 350602, 350603,
-    350621, 350622, 350623, 350624, 350625, 350626, 350627, 350628, 350629,
-    350681, 350701, 350702, 350703, 350721, 350722, 350723, 350724, 350725,
-    350781, 350782, 350783, 350784, 350801, 350802, 350803, 350821, 350822,
-    350823, 350824, 350825, 350881, 350901, 350902, 350921, 350922, 350923,
-    350924, 350925, 350926, 350981, 350982, 352101, 352102, 352103, 352104,
-    352121, 352122, 352123, 352124, 352125, 352126, 352127, 352128, 352129,
-    352201, 352202, 352203, 352221, 352222, 352223, 352224, 352225, 352226,
-    352227, 352228, 352229, 352230, 352231, 352301, 352321, 352322, 352323,
-    352324, 352325, 352326, 352327, 352328, 352329, 352330, 352331, 352401,
-    352421, 352422, 352423, 352424, 352425, 352426, 352427, 352501, 352521,
-    352522, 352523, 352524, 352525, 352526, 352527, 352528, 352529, 352601,
-    352602, 352621, 352622, 352623, 352624, 352625, 352626, 352627, 352628,
-    352629, 352701, 352721, 352722, 352723, 352724, 352725, 352726, 352727,
-    352728, 352729, 352730, 352801, 352821, 352822, 352823, 352824, 352825,
-    352826, 352827, 352828, 352829, 352830, 359001, 359002, 359003, 359004,
-    359005, 359006, 359007, 359008, 359009, 359010, 359011, 360101, 360102,
-    360103, 360104, 360105, 360111, 360112, 360121, 360122, 360123, 360124,
-    360201, 360202, 360203, 360211, 360212, 360221, 360222, 360281, 360301,
-    360302, 360311, 360312, 360313, 360321, 360322, 360323, 360401, 360402,
-    360403, 360404, 360411, 360421, 360422, 360423, 360424, 360425, 360426,
-    360427, 360428, 360429, 360430, 360481, 360482, 360483, 360501, 360502,
-    360521, 360601, 360602, 360621, 360622, 360681, 360701, 360702, 360703,
-    360704, 360721, 360722, 360723, 360724, 360725, 360726, 360727, 360728,
-    360729, 360730, 360731, 360732, 360733, 360734, 360735, 360781, 360782,
-    360801, 360802, 360803, 360821, 360822, 360823, 360824, 360825, 360826,
-    360827, 360828, 360829, 360830, 360881, 360901, 360902, 360921, 360922,
-    360923, 360924, 360925, 360926, 360981, 360982, 360983, 361001, 361002,
-    361003, 361021, 361022, 361023, 361024, 361025, 361026, 361027, 361028,
-    361029, 361030, 361101, 361102, 361103, 361121, 361122, 361123, 361124,
-    361125, 361126, 361127, 361128, 361129, 361130, 361181, 362101, 362102,
-    362103, 362121, 362122, 362123, 362124, 362125, 362126, 362127, 362128,
-    362129, 362130, 362131, 362132, 362133, 362134, 362135, 362136, 362137,
-    362138, 362201, 362202, 362203, 362204, 362221, 362222, 362223, 362224,
-    362225, 362226, 362227, 362228, 362229, 362230, 362231, 362232, 362233,
-    362234, 362301, 362302, 362321, 362322, 362323, 362324, 362325, 362326,
-    362327, 362328, 362329, 362330, 362331, 362332, 362333, 362334, 362401,
-    362402, 362421, 362422, 362423, 362424, 362425, 362426, 362427, 362428,
-    362429, 362430, 362431, 362432, 362433, 362501, 362521, 362522, 362523,
-    362524, 362525, 362526, 362527, 362528, 362529, 362530, 362531, 362532,
-    362533, 362601, 362621, 362622, 362623, 362624, 362625, 362626, 362627,
-    362628, 362629, 362630, 362631, 362632, 362633, 362634, 362635, 362636,
-    362637, 362638, 369001, 369002, 370101, 370102, 370103, 370104, 370105,
-    370111, 370112, 370113, 370114, 370121, 370122, 370123, 370124, 370125,
-    370126, 370181, 370201, 370202, 370203, 370204, 370205, 370206, 370211,
-    370212, 370213, 370214, 370215, 370221, 370222, 370223, 370224, 370225,
-    370226, 370281, 370282, 370283, 370284, 370285, 370301, 370302, 370303,
-    370304, 370305, 370306, 370321, 370322, 370323, 370401, 370402, 370403,
-    370404, 370405, 370406, 370421, 370481, 370501, 370502, 370503, 370504,
-    370505, 370521, 370522, 370523, 370601, 370602, 370611, 370612, 370613,
-    370620, 370622, 370623, 370624, 370625, 370627, 370628, 370629, 370630,
-    370631, 370632, 370633, 370634, 370681, 370682, 370683, 370684, 370685,
-    370686, 370687, 370701, 370702, 370703, 370704, 370705, 370721, 370722,
-    370723, 370724, 370725, 370726, 370727, 370728, 370729, 370781, 370782,
-    370783, 370784, 370785, 370786, 370801, 370802, 370811, 370812, 370822,
-    370823, 370825, 370826, 370827, 370828, 370829, 370830, 370831, 370832,
-    370881, 370882, 370883, 370901, 370902, 370911, 370921, 370922, 370923,
-    370981, 370982, 370983, 371001, 371002, 371003, 371021, 371022, 371023,
-    371081, 371082, 371083, 371101, 371102, 371103, 371121, 371122, 371201,
-    371202, 371203, 371301, 371302, 371311, 371312, 371321, 371322, 371323,
-    371324, 371325, 371326, 371327, 371328, 371329, 371401, 371402, 371403,
-    371421, 371422, 371423, 371424, 371425, 371426, 371427, 371428, 371481,
-    371482, 371501, 371502, 371521, 371522, 371523, 371524, 371525, 371526,
-    371581, 371601, 371602, 371603, 371621, 371622, 371623, 371624, 371625,
-    371626, 371701, 371702, 371703, 371721, 371722, 371723, 371724, 371725,
-    371726, 371727, 371728, 372101, 372102, 372121, 372122, 372123, 372124,
-    372125, 372126, 372127, 372128, 372129, 372130, 372131, 372132, 372133,
-    372134, 372201, 372221, 372222, 372223, 372224, 372225, 372226, 372227,
-    372228, 372229, 372230, 372231, 372301, 372321, 372322, 372323, 372324,
-    372325, 372326, 372327, 372328, 372329, 372330, 372331, 372332, 372401,
-    372402, 372403, 372421, 372422, 372423, 372424, 372425, 372426, 372427,
-    372428, 372429, 372430, 372431, 372432, 372501, 372502, 372521, 372522,
-    372523, 372524, 372525, 372526, 372527, 372528, 372601, 372602, 372603,
-    372621, 372622, 372623, 372624, 372625, 372626, 372627, 372628, 372629,
-    372630, 372701, 372721, 372722, 372723, 372724, 372725, 372726, 372727,
-    372728, 372729, 372730, 372801, 372821, 372822, 372823, 372824, 372825,
-    372826, 372827, 372828, 372829, 372830, 372831, 372832, 372833, 372901,
-    372921, 372922, 372923, 372924, 372925, 372926, 372927, 372928, 372929,
-    372930, 379001, 379002, 379003, 379004, 379005, 379006, 379007, 379008,
-    379009, 379010, 379011, 379012, 379013, 379014, 379015, 379016, 379017,
-    379018, 379019, 379020, 379021, 379022, 379023, 379024, 379025, 379026,
-    379027, 379028, 379029, 410101, 410102, 410103, 410104, 410105, 410106,
-    410107, 410108, 410111, 410112, 410121, 410122, 410123, 410124, 410125,
-    410126, 410181, 410182, 410183, 410184, 410185, 410201, 410202, 410203,
-    410204, 410205, 410211, 410212, 410221, 410222, 410223, 410224, 410225,
-    410301, 410302, 410303, 410304, 410305, 410306, 410311, 410321, 410322,
-    410323, 410324, 410325, 410326, 410327, 410328, 410329, 410381, 410401,
-    410402, 410403, 410404, 410411, 410412, 410421, 410422, 410423, 410424,
-    410425, 410426, 410481, 410482, 410501, 410502, 410503, 410504, 410505,
-    410506, 410511, 410521, 410522, 410523, 410524, 410525, 410526, 410527,
-    410581, 410601, 410602, 410603, 410604, 410611, 410621, 410622, 410701,
-    410702, 410703, 410704, 410711, 410721, 410722, 410723, 410724, 410725,
-    410726, 410727, 410728, 410781, 410782, 410801, 410802, 410803, 410804,
-    410811, 410821, 410822, 410823, 410824, 410825, 410826, 410827, 410881,
-    410882, 410883, 410901, 410902, 410911, 410921, 410922, 410923, 410924,
-    410925, 410926, 410927, 410928, 411001, 411002, 411003, 411021, 411022,
-    411023, 411024, 411025, 411081, 411082, 411101, 411102, 411103, 411104,
-    411121, 411122, 411123, 411201, 411202, 411203, 411221, 411222, 411223,
-    411224, 411281, 411282, 411301, 411302, 411303, 411321, 411322, 411323,
-    411324, 411325, 411326, 411327, 411328, 411329, 411330, 411381, 411401,
-    411402, 411403, 411421, 411422, 411423, 411424, 411425, 411426, 411481,
-    411501, 411502, 411503, 411521, 411522, 411523, 411524, 411525, 411526,
-    411527, 411528, 411601, 411602, 411621, 411622, 411623, 411624, 411625,
-    411626, 411627, 411628, 411681, 411701, 411702, 411721, 411722, 411723,
-    411724, 411725, 411726, 411727, 411728, 411729, 412101, 412102, 412103,
-    412104, 412111, 412121, 412122, 412123, 412124, 412125, 412126, 412127,
-    412128, 412129, 412130, 412131, 412132, 412133, 412201, 412202, 412203,
-    412204, 412211, 412221, 412222, 412223, 412224, 412225, 412226, 412227,
-    412228, 412229, 412230, 412231, 412232, 412233, 412234, 412301, 412302,
-    412321, 412322, 412323, 412324, 412325, 412326, 412327, 412328, 412401,
-    412421, 412422, 412423, 412424, 412425, 412426, 412427, 412428, 412429,
-    412430, 412501, 412502, 412521, 412522, 412523, 412524, 412525, 412526,
-    412527, 412528, 412529, 412530, 412531, 412532, 412533, 412534, 412601,
-    412602, 412621, 412622, 412623, 412624, 412625, 412626, 412627, 412628,
-    412629, 412630, 412631, 412632, 412701, 412702, 412721, 412722, 412723,
-    412724, 412725, 412726, 412727, 412728, 412729, 412801, 412821, 412822,
-    412823, 412824, 412825, 412826, 412827, 412828, 412829, 412901, 412902,
-    412921, 412922, 412923, 412924, 412925, 412926, 412927, 412928, 412929,
-    412930, 412931, 412932, 413001, 413021, 413022, 413023, 413024, 413025,
-    413026, 413027, 413028, 413029, 419001, 419002, 419003, 419004, 419005,
-    419006, 419007, 419008, 419009, 419010, 419011, 419012, 419013, 419014,
-    419015, 419016, 419017, 419018, 420101, 420102, 420103, 420104, 420105,
-    420106, 420107, 420111, 420112, 420113, 420114, 420115, 420116, 420117,
-    420121, 420122, 420123, 420124, 420201, 420202, 420203, 420204, 420205,
-    420211, 420221, 420222, 420281, 420301, 420302, 420303, 420304, 420321,
-    420322, 420323, 420324, 420325, 420381, 420401, 420501, 420502, 420503,
-    420504, 420505, 420506, 420521, 420523, 420525, 420526, 420527, 420528,
-    420529, 420581, 420582, 420583, 420601, 420602, 420603, 420604, 420606,
-    420607, 420611, 420621, 420622, 420623, 420624, 420625, 420626, 420682,
-    420683, 420684, 420701, 420702, 420703, 420704, 420801, 420802, 420803,
-    420804, 420821, 420822, 420881, 420901, 420902, 420921, 420922, 420923,
-    420924, 420981, 420982, 420983, 420984, 421001, 421002, 421003, 421004,
-    421022, 421023, 421024, 421025, 421081, 421082, 421083, 421087, 421101,
-    421102, 421121, 421122, 421123, 421124, 421125, 421126, 421127, 421181,
-    421182, 421201, 421202, 421221, 421222, 421223, 421224, 421281, 421301,
-    421303, 421321, 421381, 422101, 422102, 422103, 422121, 422122, 422123,
-    422124, 422125, 422126, 422127, 422128, 422129, 422130, 422131, 422201,
-    422202, 422203, 422204, 422221, 422222, 422223, 422224, 422225, 422226,
-    422227, 422228, 422301, 422302, 422321, 422322, 422323, 422324, 422325,
-    422326, 422327, 422401, 422402, 422403, 422404, 422405, 422406, 422421,
-    422422, 422423, 422424, 422425, 422426, 422427, 422428, 422429, 422430,
-    422431, 422432, 422501, 422502, 422521, 422522, 422523, 422524, 422525,
-    422526, 422527, 422528, 422601, 422621, 422622, 422623, 422624, 422625,
-    422626, 422627, 422701, 422702, 422721, 422722, 422723, 422724, 422725,
-    422726, 422727, 422728, 422729, 422801, 422802, 422821, 422822, 422823,
-    422824, 422825, 422826, 422827, 422828, 422921, 429001, 429002, 429003,
-    429004, 429005, 429006, 429007, 429008, 429009, 429010, 429011, 429012,
-    429013, 429014, 429015, 429016, 429017, 429021, 430101, 430102, 430103,
-    430104, 430105, 430111, 430112, 430121, 430122, 430123, 430124, 430181,
-    430182, 430201, 430202, 430203, 430204, 430211, 430219, 430221, 430222,
-    430223, 430224, 430225, 430281, 430301, 430302, 430303, 430304, 430305,
-    430306, 430311, 430321, 430322, 430381, 430382, 430401, 430402, 430403,
-    430404, 430405, 430406, 430407, 430408, 430411, 430412, 430421, 430422,
-    430423, 430424, 430425, 430426, 430427, 430481, 430482, 430501, 430502,
-    430503, 430504, 430511, 430521, 430522, 430523, 430524, 430525, 430526,
-    430527, 430528, 430529, 430581, 430601, 430602, 430603, 430611, 430621,
-    430622, 430623, 430624, 430626, 430627, 430681, 430682, 430701, 430702,
-    430703, 430721, 430722, 430723, 430724, 430725, 430726, 430781, 430801,
-    430802, 430811, 430821, 430822, 430901, 430902, 430903, 430921, 430922,
-    430923, 430981, 431001, 431002, 431003, 431021, 431022, 431023, 431024,
-    431025, 431026, 431027, 431028, 431081, 431101, 431102, 431103, 431121,
-    431122, 431123, 431124, 431125, 431126, 431127, 431128, 431129, 431201,
-    431202, 431221, 431222, 431223, 431224, 431225, 431226, 431227, 431228,
-    431229, 431230, 431281, 431301, 431302, 431321, 431322, 431381, 431382,
-    432101, 432121, 432122, 432123, 432124, 432125, 432126, 432127, 432201,
-    432221, 432222, 432223, 432224, 432225, 432226, 432301, 432302, 432321,
-    432322, 432323, 432324, 432325, 432326, 432401, 432402, 432421, 432422,
-    432423, 432424, 432425, 432426, 432427, 432428, 432501, 432502, 432503,
-    432521, 432522, 432523, 432524, 432525, 432601, 432621, 432622, 432623,
-    432624, 432625, 432626, 432627, 432701, 432721, 432722, 432723, 432724,
-    432725, 432726, 432727, 432801, 432802, 432821, 432822, 432823, 432824,
-    432825, 432826, 432827, 432828, 432829, 432830, 432831, 432901, 432902,
-    432921, 432922, 432923, 432924, 432925, 432926, 432927, 432928, 432929,
-    432930, 433001, 433002, 433021, 433022, 433023, 433024, 433025, 433026,
-    433027, 433028, 433029, 433030, 433031, 433101, 433102, 433121, 433122,
-    433123, 433124, 433125, 433126, 433127, 433128, 433129, 433130, 439001,
-    439002, 439003, 439004, 439005, 439006, 439007, 439008, 439009, 439010,
-    439011, 440101, 440102, 440103, 440104, 440105, 440106, 440107, 440111,
-    440112, 440113, 440114, 440115, 440116, 440117, 440118, 440121, 440122,
-    440123, 440124, 440125, 440126, 440127, 440128, 440181, 440182, 440183,
-    440184, 440201, 440202, 440203, 440204, 440205, 440221, 440222, 440223,
-    440224, 440225, 440226, 440227, 440228, 440229, 440230, 440231, 440232,
-    440233, 440281, 440282, 440301, 440303, 440304, 440305, 440306, 440307,
-    440308, 440309, 440310, 440321, 440401, 440402, 440403, 440404, 440421,
-    440501, 440502, 440503, 440504, 440505, 440506, 440507, 440508, 440509,
-    440510, 440511, 440512, 440513, 440514, 440515, 440521, 440522, 440523,
-    440524, 440525, 440526, 440527, 440528, 440582, 440583, 440601, 440602,
-    440603, 440604, 440605, 440606, 440607, 440608, 440620, 440621, 440622,
-    440623, 440624, 440681, 440682, 440683, 440684, 440701, 440702, 440703,
-    440704, 440705, 440711, 440721, 440722, 440723, 440724, 440725, 440726,
-    440727, 440781, 440782, 440783, 440784, 440785, 440801, 440802, 440803,
-    440804, 440811, 440821, 440822, 440823, 440824, 440825, 440881, 440882,
-    440883, 440901, 440902, 440903, 440904, 440921, 440922, 440923, 440924,
-    440981, 440982, 440983, 441001, 441002, 441003, 441004, 441005, 441101,
-    441201, 441202, 441203, 441204, 441221, 441222, 441223, 441224, 441225,
-    441226, 441227, 441228, 441229, 441230, 441283, 441284, 441301, 441302,
-    441303, 441321, 441322, 441323, 441324, 441381, 441401, 441402, 441403,
-    441421, 441422, 441423, 441424, 441425, 441426, 441427, 441481, 441501,
-    441502, 441521, 441522, 441523, 441581, 441601, 441602, 441611, 441621,
-    441622, 441623, 441624, 441625, 441701, 441702, 441703, 441704, 441721,
-    441722, 441723, 441781, 441801, 441802, 441803, 441811, 441821, 441822,
-    441823, 441824, 441825, 441826, 441827, 441881, 441882, 441901, 442001,
-    442101, 442102, 442121, 442122, 442123, 442124, 442125, 442126, 442127,
-    442128, 442129, 442130, 442131, 442132, 442133, 442134, 442135, 442136,
-    442201, 442202, 442221, 442222, 442223, 442224, 442225, 442226, 442227,
-    442228, 442301, 442302, 442321, 442322, 442323, 442324, 442325, 442326,
-    442327, 442328, 442329, 442330, 442331, 442401, 442421, 442422, 442423,
-    442424, 442425, 442426, 442427, 442501, 442502, 442521, 442522, 442523,
-    442524, 442525, 442526, 442527, 442528, 442529, 442530, 442531, 442601,
-    442621, 442622, 442623, 442624, 442625, 442626, 442627, 442628, 442629,
-    442630, 442631, 442632, 442633, 442701, 442721, 442722, 442723, 442724,
-    442725, 442726, 442727, 442728, 442729, 442730, 442731, 442732, 442801,
-    442821, 442822, 442823, 442824, 442825, 442826, 442827, 442828, 442829,
-    442830, 442901, 442921, 442922, 442923, 442924, 442925, 442926, 442927,
-    442928, 442929, 442930, 442931, 445101, 445102, 445103, 445121, 445122,
-    445201, 445202, 445203, 445221, 445222, 445223, 445224, 445281, 445301,
-    445302, 445303, 445321, 445322, 445323, 445381, 449001, 449002, 449003,
-    449004, 449005, 449006, 449007, 449008, 449009, 449010, 449011, 449012,
-    449013, 449014, 449015, 449016, 449017, 449018, 449019, 449020, 449021,
-    449022, 449023, 449024, 449025, 449026, 449027, 449028, 449029, 449030,
-    449031, 450101, 450102, 450103, 450104, 450105, 450106, 450107, 450108,
-    450109, 450110, 450121, 450122, 450123, 450124, 450125, 450126, 450127,
-    450201, 450202, 450203, 450204, 450205, 450206, 450221, 450222, 450223,
-    450224, 450225, 450226, 450301, 450302, 450303, 450304, 450305, 450306,
-    450311, 450312, 450321, 450322, 450323, 450324, 450325, 450326, 450327,
-    450328, 450329, 450330, 450331, 450332, 450401, 450402, 450403, 450404,
-    450405, 450406, 450421, 450422, 450423, 450481, 450501, 450502, 450503,
-    450512, 450521, 450601, 450602, 450603, 450621, 450681, 450701, 450702,
-    450703, 450721, 450722, 450801, 450802, 450803, 450804, 450821, 450881,
-    450901, 450902, 450903, 450921, 450922, 450923, 450924, 450981, 451001,
-    451002, 451021, 451022, 451023, 451024, 451025, 451026, 451027, 451028,
-    451029, 451030, 451031, 451081, 451101, 451102, 451103, 451121, 451122,
-    451123, 451201, 451202, 451203, 451221, 451222, 451223, 451224, 451225,
-    451226, 451227, 451228, 451229, 451281, 451301, 451302, 451321, 451322,
-    451323, 451324, 451381, 451401, 451402, 451421, 451422, 451423, 451424,
-    451425, 451481, 452101, 452121, 452122, 452123, 452124, 452125, 452126,
-    452127, 452128, 452129, 452130, 452131, 452132, 452133, 452201, 452221,
-    452222, 452223, 452224, 452225, 452226, 452227, 452228, 452229, 452230,
-    452231, 452301, 452321, 452322, 452323, 452324, 452325, 452326, 452327,
-    452328, 452329, 452330, 452331, 452332, 452401, 452402, 452421, 452422,
-    452423, 452424, 452425, 452426, 452427, 452428, 452501, 452502, 452503,
-    452504, 452521, 452522, 452523, 452524, 452525, 452526, 452527, 452528,
-    452601, 452621, 452622, 452623, 452624, 452625, 452626, 452627, 452628,
-    452629, 452630, 452631, 452632, 452701, 452702, 452721, 452722, 452723,
-    452724, 452725, 452726, 452727, 452728, 452729, 452730, 452731, 452801,
-    452802, 452821, 452822, 452823, 452824, 452825, 452826, 460001, 460002,
-    460003, 460004, 460005, 460006, 460007, 460021, 460022, 460023, 460024,
-    460025, 460026, 460027, 460028, 460029, 460030, 460031, 460032, 460033,
-    460034, 460035, 460036, 460101, 460102, 460103, 460104, 460105, 460106,
-    460107, 460108, 460201, 460202, 460203, 460204, 460205, 460301, 460401,
-    469001, 469002, 469003, 469005, 469006, 469007, 469021, 469022, 469023,
-    469024, 469025, 469026, 469027, 469028, 469029, 469030, 500101, 500102,
-    500103, 500104, 500105, 500106, 500107, 500108, 500109, 500110, 500111,
-    500112, 500113, 500114, 500115, 500116, 500117, 500118, 500119, 500120,
-    500151, 500152, 500153, 500154, 500155, 500156, 500221, 500222, 500223,
-    500224, 500225, 500226, 500227, 500228, 500229, 500230, 500231, 500232,
-    500233, 500234, 500235, 500236, 500237, 500238, 500239, 500240, 500241,
-    500242, 500243, 500381, 500382, 500383, 500384, 510101, 510102, 510103,
-    510104, 510105, 510106, 510107, 510108, 510111, 510112, 510113, 510114,
-    510115, 510116, 510117, 510121, 510122, 510123, 510124, 510125, 510126,
-    510127, 510128, 510129, 510130, 510131, 510132, 510181, 510182, 510183,
-    510184, 510185, 510201, 510202, 510203, 510211, 510212, 510213, 510214,
-    510215, 510216, 510217, 510218, 510219, 510221, 510222, 510223, 510224,
-    510225, 510226, 510227, 510228, 510229, 510230, 510231, 510232, 510281,
-    510282, 510283, 510301, 510302, 510303, 510304, 510311, 510321, 510322,
-    510401, 510402, 510403, 510411, 510421, 510422, 510501, 510502, 510503,
-    510504, 510521, 510522, 510523, 510524, 510525, 510601, 510602, 510603,
-    510621, 510622, 510623, 510624, 510625, 510626, 510681, 510682, 510683,
-    510701, 510702, 510703, 510704, 510705, 510721, 510722, 510723, 510724,
-    510725, 510726, 510727, 510781, 510801, 510802, 510811, 510812, 510821,
-    510822, 510823, 510824, 510901, 510902, 510903, 510904, 510921, 510922,
-    510923, 511001, 511002, 511011, 511021, 511022, 511023, 511024, 511025,
-    511026, 511027, 511028, 511081, 511082, 511083, 511101, 511102, 511111,
-    511112, 511113, 511121, 511122, 511123, 511124, 511125, 511126, 511127,
-    511128, 511129, 511130, 511131, 511132, 511133, 511181, 511201, 511202,
-    511203, 511204, 511221, 511222, 511223, 511224, 511225, 511226, 511227,
-    511228, 511301, 511302, 511303, 511304, 511321, 511322, 511323, 511324,
-    511325, 511381, 511401, 511402, 511403, 511421, 511422, 511423, 511424,
-    511425, 511501, 511502, 511503, 511521, 511522, 511523, 511524, 511525,
-    511526, 511527, 511528, 511529, 511601, 511602, 511603, 511621, 511622,
-    511623, 511681, 511701, 511702, 511703, 511721, 511722, 511723, 511724,
-    511725, 511781, 511801, 511802, 511803, 511821, 511822, 511823, 511824,
-    511825, 511826, 511827, 511901, 511902, 511903, 511921, 511922, 511923,
-    512001, 512002, 512021, 512022, 512081, 512101, 512121, 512122, 512123,
-    512124, 512125, 512126, 512127, 512128, 512129, 512130, 512131, 512132,
-    512201, 512202, 512221, 512222, 512223, 512224, 512225, 512226, 512227,
-    512228, 512229, 512230, 512231, 512232, 512233, 512234, 512235, 512236,
-    512237, 512301, 512302, 512321, 512322, 512323, 512324, 512325, 512326,
-    512327, 512328, 512329, 512330, 512401, 512402, 512421, 512422, 512423,
-    512424, 512425, 512426, 512427, 512428, 512429, 512430, 512431, 512432,
-    512433, 512434, 512435, 512436, 512501, 512502, 512521, 512522, 512523,
-    512524, 512525, 512526, 512527, 512528, 512529, 512530, 512531, 512532,
-    512533, 512534, 512535, 512601, 512621, 512622, 512623, 512624, 512625,
-    512626, 512627, 512628, 512629, 512630, 512631, 512632, 512633, 512634,
-    512701, 512721, 512722, 512723, 512724, 512725, 512726, 512727, 512728,
-    512729, 512730, 512731, 512732, 512801, 512802, 512821, 512822, 512823,
-    512824, 512825, 512826, 512827, 512828, 512829, 512830, 512831, 512832,
-    512833, 512834, 512835, 512836, 512837, 512901, 512902, 512903, 512921,
-    512922, 512923, 512924, 512925, 512926, 512927, 512928, 512929, 512930,
-    512931, 512932, 513001, 513002, 513021, 513022, 513023, 513024, 513025,
-    513026, 513027, 513028, 513029, 513030, 513031, 513032, 513101, 513121,
-    513122, 513123, 513124, 513125, 513126, 513127, 513128, 513201, 513221,
-    513222, 513223, 513224, 513225, 513226, 513227, 513228, 513229, 513230,
-    513231, 513232, 513233, 513301, 513321, 513322, 513323, 513324, 513325,
-    513326, 513327, 513328, 513329, 513330, 513331, 513332, 513333, 513334,
-    513335, 513336, 513337, 513338, 513401, 513421, 513422, 513423, 513424,
-    513425, 513426, 513427, 513428, 513429, 513430, 513431, 513432, 513433,
-    513434, 513435, 513436, 513437, 513438, 513439, 513501, 513521, 513522,
-    513523, 513524, 513525, 513601, 513621, 513622, 513623, 513624, 513701,
-    513721, 513722, 513723, 513801, 513821, 513822, 513823, 513824, 513825,
-    513826, 513901, 513902, 513921, 513922, 517001, 517002, 517003, 517021,
-    517022, 517023, 517081, 519001, 519002, 519003, 519004, 519005, 519006,
-    519007, 519008, 519009, 519010, 519011, 519012, 519013, 520101, 520102,
-    520103, 520111, 520112, 520113, 520114, 520115, 520121, 520122, 520123,
-    520181, 520201, 520202, 520203, 520221, 520222, 520281, 520301, 520302,
-    520303, 520304, 520321, 520322, 520323, 520324, 520325, 520326, 520327,
-    520328, 520329, 520330, 520381, 520382, 520401, 520402, 520403, 520421,
-    520422, 520423, 520424, 520425, 520501, 520502, 520521, 520522, 520523,
-    520524, 520525, 520526, 520527, 520601, 520602, 520603, 520621, 520622,
-    520623, 520624, 520625, 520626, 520627, 520628, 522101, 522102, 522103,
-    522121, 522122, 522123, 522124, 522125, 522126, 522127, 522128, 522129,
-    522130, 522131, 522132, 522201, 522221, 522222, 522223, 522224, 522225,
-    522226, 522227, 522228, 522229, 522230, 522301, 522321, 522322, 522323,
-    522324, 522325, 522326, 522327, 522328, 522401, 522421, 522422, 522423,
-    522424, 522425, 522426, 522427, 522428, 522501, 522502, 522521, 522522,
-    522523, 522524, 522525, 522526, 522527, 522528, 522529, 522530, 522601,
-    522621, 522622, 522623, 522624, 522625, 522626, 522627, 522628, 522629,
-    522630, 522631, 522632, 522633, 522634, 522635, 522636, 522701, 522702,
-    522721, 522722, 522723, 522724, 522725, 522726, 522727, 522728, 522729,
-    522730, 522731, 522732, 530101, 530102, 530103, 530111, 530112, 530113,
-    530114, 530115, 530121, 530122, 530123, 530124, 530125, 530126, 530127,
-    530128, 530129, 530181, 530201, 530301, 530302, 530303, 530321, 530322,
-    530323, 530324, 530325, 530326, 530327, 530328, 530381, 530401, 530402,
-    530403, 530421, 530422, 530423, 530424, 530425, 530426, 530427, 530428,
-    530501, 530502, 530521, 530522, 530523, 530524, 530581, 530601, 530602,
-    530621, 530622, 530623, 530624, 530625, 530626, 530627, 530628, 530629,
-    530630, 530701, 530702, 530721, 530722, 530723, 530724, 530801, 530802,
-    530821, 530822, 530823, 530824, 530825, 530826, 530827, 530828, 530829,
-    530901, 530902, 530921, 530922, 530923, 530924, 530925, 530926, 530927,
-    532101, 532121, 532122, 532123, 532124, 532125, 532126, 532127, 532128,
-    532129, 532130, 532131, 532201, 532202, 532221, 532222, 532223, 532224,
-    532225, 532226, 532227, 532228, 532229, 532230, 532231, 532232, 532233,
-    532301, 532321, 532322, 532323, 532324, 532325, 532326, 532327, 532328,
-    532329, 532330, 532331, 532401, 532421, 532422, 532423, 532424, 532425,
-    532426, 532427, 532428, 532429, 532501, 532502, 532503, 532504, 532521,
-    532522, 532523, 532524, 532525, 532526, 532527, 532528, 532529, 532530,
-    532531, 532532, 532601, 532621, 532622, 532623, 532624, 532625, 532626,
-    532627, 532628, 532701, 532721, 532722, 532723, 532724, 532725, 532726,
-    532727, 532728, 532729, 532730, 532801, 532821, 532822, 532823, 532901,
-    532921, 532922, 532923, 532924, 532925, 532926, 532927, 532928, 532929,
-    532930, 532931, 532932, 533001, 533021, 533022, 533023, 533024, 533025,
-    533101, 533102, 533103, 533121, 533122, 533123, 533124, 533125, 533126,
-    533201, 533221, 533222, 533223, 533224, 533301, 533321, 533322, 533323,
-    533324, 533325, 533401, 533421, 533422, 533423, 533501, 533521, 533522,
-    533523, 533524, 533525, 533526, 533527, 533528, 540101, 540102, 540103,
-    540104, 540121, 540122, 540123, 540124, 540125, 540126, 540127, 540128,
-    540129, 540130, 540131, 540201, 540202, 540221, 540222, 540223, 540224,
-    540225, 540226, 540227, 540228, 540229, 540230, 540231, 540232, 540233,
-    540234, 540235, 540236, 540237, 540301, 540302, 540321, 540322, 540323,
-    540324, 540325, 540326, 540327, 540328, 540329, 540330, 540401, 540402,
-    540421, 540422, 540423, 540424, 540425, 540426, 540501, 540502, 540521,
-    540522, 540523, 540524, 540525, 540526, 540527, 540528, 540529, 540530,
-    540531, 540601, 540602, 540621, 540622, 540623, 540624, 540625, 540626,
-    540627, 540628, 540629, 540630, 542101, 542121, 542122, 542123, 542124,
-    542125, 542126, 542127, 542128, 542129, 542130, 542131, 542132, 542133,
-    542134, 542135, 542136, 542137, 542201, 542221, 542222, 542223, 542224,
-    542225, 542226, 542227, 542228, 542229, 542230, 542231, 542232, 542233,
-    542301, 542321, 542322, 542323, 542324, 542325, 542326, 542327, 542328,
-    542329, 542330, 542331, 542332, 542333, 542334, 542335, 542336, 542337,
-    542338, 542401, 542421, 542422, 542423, 542424, 542425, 542426, 542427,
-    542428, 542429, 542430, 542431, 542501, 542521, 542522, 542523, 542524,
-    542525, 542526, 542527, 542528, 542601, 542621, 542622, 542623, 542624,
-    542625, 542626, 542627, 542701, 542721, 542722, 542723, 542724, 542725,
-    542726, 542727, 610101, 610102, 610103, 610104, 610111, 610112, 610113,
-    610114, 610115, 610116, 610117, 610118, 610121, 610122, 610123, 610124,
-    610125, 610126, 610201, 610202, 610203, 610204, 610221, 610222, 610301,
-    610302, 610303, 610304, 610321, 610322, 610323, 610324, 610325, 610326,
-    610327, 610328, 610329, 610330, 610331, 610401, 610402, 610403, 610404,
-    610421, 610422, 610423, 610424, 610425, 610426, 610427, 610428, 610429,
-    610430, 610431, 610481, 610501, 610502, 610503, 610521, 610522, 610523,
-    610524, 610525, 610526, 610527, 610528, 610581, 610582, 610601, 610602,
-    610603, 610621, 610622, 610623, 610624, 610625, 610626, 610627, 610628,
-    610629, 610630, 610631, 610632, 610701, 610702, 610703, 610721, 610722,
-    610723, 610724, 610725, 610726, 610727, 610728, 610729, 610730, 610801,
-    610802, 610803, 610821, 610822, 610823, 610824, 610825, 610826, 610827,
-    610828, 610829, 610830, 610831, 610881, 610901, 610902, 610921, 610922,
-    610923, 610924, 610925, 610926, 610927, 610928, 610929, 611001, 611002,
-    611021, 611022, 611023, 611024, 611025, 611026, 612101, 612102, 612103,
-    612121, 612122, 612123, 612124, 612125, 612126, 612127, 612128, 612129,
-    612130, 612131, 612132, 612133, 612201, 612221, 612222, 612223, 612224,
-    612225, 612226, 612227, 612228, 612229, 612230, 612231, 612232, 612233,
-    612301, 612321, 612322, 612323, 612324, 612325, 612326, 612327, 612328,
-    612329, 612330, 612401, 612421, 612422, 612423, 612424, 612425, 612426,
-    612427, 612428, 612429, 612430, 612501, 612521, 612522, 612523, 612524,
-    612525, 612526, 612527, 612601, 612621, 612622, 612623, 612624, 612625,
-    612626, 612627, 612628, 612629, 612630, 612631, 612632, 612633, 612701,
-    612721, 612722, 612723, 612724, 612725, 612726, 612727, 612728, 612729,
-    612730, 612731, 612732, 619001, 619002, 619003, 620101, 620102, 620103,
-    620104, 620105, 620111, 620112, 620121, 620122, 620123, 620201, 620301,
-    620302, 620321, 620401, 620402, 620403, 620421, 620422, 620423, 620501,
-    620502, 620503, 620521, 620522, 620523, 620524, 620525, 620601, 620602,
-    620621, 620622, 620623, 620701, 620702, 620721, 620722, 620723, 620724,
-    620725, 620801, 620802, 620821, 620822, 620823, 620824, 620825, 620826,
-    620901, 620902, 620921, 620922, 620923, 620924, 620925, 620981, 620982,
-    621001, 621002, 621021, 621022, 621023, 621024, 621025, 621026, 621027,
-    621101, 621102, 621121, 621122, 621123, 621124, 621125, 621126, 621201,
-    621202, 621221, 621222, 621223, 621224, 621225, 621226, 621227, 621228,
-    622101, 622102, 622103, 622121, 622122, 622123, 622124, 622125, 622126,
-    622201, 622221, 622222, 622223, 622224, 622225, 622226, 622301, 622321,
-    622322, 622323, 622324, 622325, 622326, 622401, 622421, 622422, 622423,
-    622424, 622425, 622426, 622427, 622428, 622429, 622501, 622521, 622522,
-    622523, 622524, 622525, 622526, 622527, 622528, 622529, 622530, 622531,
-    622601, 622621, 622622, 622623, 622624, 622625, 622626, 622627, 622628,
-    622629, 622630, 622701, 622721, 622722, 622723, 622724, 622725, 622726,
-    622727, 622801, 622821, 622822, 622823, 622824, 622825, 622826, 622827,
-    622901, 622921, 622922, 622923, 622924, 622925, 622926, 622927, 623001,
-    623021, 623022, 623023, 623024, 623025, 623026, 623027, 630101, 630102,
-    630103, 630104, 630105, 630111, 630121, 630122, 630123, 630201, 630202,
-    630203, 630221, 630222, 630223, 630224, 630225, 632101, 632121, 632122,
-    632123, 632124, 632125, 632126, 632127, 632128, 632201, 632221, 632222,
-    632223, 632224, 632301, 632321, 632322, 632323, 632324, 632421, 632501,
-    632521, 632522, 632523, 632524, 632525, 632601, 632621, 632622, 632623,
-    632624, 632625, 632626, 632701, 632721, 632722, 632723, 632724, 632725,
-    632726, 632801, 632802, 632821, 632822, 632823, 640101, 640102, 640103,
-    640104, 640105, 640106, 640121, 640122, 640181, 640201, 640202, 640204,
-    640205, 640211, 640221, 640222, 640223, 640301, 640302, 640303, 640321,
-    640322, 640323, 640324, 640381, 640382, 640401, 640402, 640421, 640422,
-    640423, 640424, 640425, 640501, 640502, 640521, 640522, 642101, 642102,
-    642103, 642121, 642122, 642123, 642124, 642125, 642126, 642127, 642201,
-    642221, 642222, 642223, 642224, 642225, 642226, 650101, 650102, 650103,
-    650104, 650105, 650106, 650107, 650108, 650109, 650121, 650201, 650202,
-    650203, 650204, 650205, 650301, 650401, 650402, 650421, 650422, 650501,
-    650502, 650521, 650522, 652101, 652121, 652122, 652123, 652201, 652221,
-    652222, 652223, 652301, 652302, 652303, 652321, 652322, 652323, 652324,
-    652325, 652326, 652327, 652328, 652401, 652402, 652403, 652404, 652421,
-    652422, 652423, 652424, 652425, 652426, 652427, 652428, 652501, 652521,
-    652522, 652523, 652524, 652525, 652526, 652527, 652601, 652621, 652622,
-    652623, 652624, 652625, 652626, 652627, 652701, 652702, 652721, 652722,
-    652723, 652801, 652821, 652822, 652823, 652824, 652825, 652826, 652827,
-    652828, 652829, 652901, 652921, 652922, 652923, 652924, 652925, 652926,
-    652927, 652928, 652929, 653001, 653021, 653022, 653023, 653024, 653101,
-    653121, 653122, 653123, 653124, 653125, 653126, 653127, 653128, 653129,
-    653130, 653131, 653201, 653221, 653222, 653223, 653224, 653225, 653226,
-    653227, 654001, 654002, 654003, 654004, 654021, 654022, 654023, 654024,
-    654025, 654026, 654027, 654028, 654101, 654121, 654122, 654123, 654124,
-    654125, 654126, 654127, 654128, 654201, 654202, 654221, 654222, 654223,
-    654224, 654225, 654226, 654301, 654321, 654322, 654323, 654324, 654325,
-    654326, 659001, 659002, 659003, 659004, 659005, 659006, 659007, 659008,
-    659009, 659010, 710000, 810000, 820000, 830000,
-];

+ 0 - 70
src/plugins/idCard/verify.js

@@ -1,70 +0,0 @@
-import areaSet from './area'
-
-/**
- * @description 校验出生日期
- * @param {String} birth 8位出生日期 形如20210601
- * @returns {Boolean} 校验是否通过
- */
-const verifyBirthDate = (birth) => {
-  // 格式化传入的日期格式为 yyyy-mm-dd
-  const serializedBirth = `${birth.slice(0, 4)}-${birth.slice(4, 6)}-${birth.slice(6)}`;
-  const birthDate = new Date(serializedBirth).getTime();
-  // 如果日期格式无效,形如 2020-13-14、2021-02-29 等,则返回 false
-  // 无效的日期格式,Date.prototype.getTime() 会返回 NaN
-  if (Number.isNaN(birthDate)) return false;
-  // 如果传入的日期领先于当前日期,比如传入 20990102 则返回 false
-  if (birthDate > new Date().getTime()) return false;
-  // 否则返回 true,检验通过
-  return true;
-};
-
-/**
- * @description 校验码字符校验函数
- * @param {String} cardNum 传入的身份证号
- * @returns {Boolean} 校验是否通过
- */
-const verifyCheckCode = (cardNum) => {
-  // 本体码
-  const masterCode = cardNum.slice(0, 17).split("");
-  // 校验码
-  const checkCode = cardNum.slice(17).toLocaleLowerCase();
-  // 校验因子
-  const weightingFactor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
-  // 校验码换算关系
-  const pattern = {0: 1, 1: 0, 2: "x", 3: 9, 4: 8, 5: 7, 6: 6, 7: 5, 8: 4, 9: 3, 10: 2};
-  // 各位值与对应校验因子相乘,并求和
-  const sum = masterCode.reduce((pre, cur, ix) => pre + cur * weightingFactor[ix], 0);
-  // 累加值对11取余
-  const val = sum % 11;
-  // 能与换算关系对应上则返回true,否则返回false
-  return pattern[val] === checkCode;
-};
-
-/**
- * @description 身份证号码校验,判断输入的身份证号码是否合法
- * @param {String} cardNum 待校验身份证号码
- * @returns {Boolean} 是否校验通过
- */
-export const verifyCardNum = (cardNum = "") => {
-  // 对参数进行格式化
-  const serializedCardNum = cardNum.toString().trim();
-  // 长度校验
-  if (serializedCardNum.length !== 18) return false;
-  // 简单的正则校验
-  if (!/^[1-9]\d{5}(18|19|[2-9]\d)\d{9}[0-9Xx]$/.test(serializedCardNum)) {
-      return false;
-  }
-  // 地址码检验
-  const areaCode = Number(serializedCardNum.slice(0, 6));
-  if (areaSet.indexOf(areaCode) === -1) return false;
-
-  // 出生日期码校验
-  const birthCode = serializedCardNum.slice(6, 14);
-  if (!verifyBirthDate(birthCode)) return false;
-
-  // 校验码校验,(有bug,暂时不用)
-  //if (!verifyCheckCode(serializedCardNum)) return false;
-
-  // 所有校验通过后,返回true
-  return true;
-};

+ 0 - 19
src/plugins/naive.js

@@ -1,19 +0,0 @@
-import {
-    create, NInput, NButton, NForm, NFormItem, NCheckboxGroup, NCheckbox, NLayout, NLayoutHeader, NLayoutContent, NLayoutFooter, NDatePicker, NDataTable, NPagination, NAvatar, NImageGroup, NImage,
-    NLayoutSider, NMenu, NDropdown, NSpace, NTooltip, NTabs, NTabPane, NCard, NRow, NCol, NDrawer, NDrawerContent, NDivider, NSwitch, NGrid, NGridItem, NList, NListItem, NTag, NIcon, NPopselect,
-    NPopover, NSelect, NRadioGroup, NRadio, NInputGroup, NTable, NInputNumber, NModal, NUpload, NTree, NEl, NTab, NCollapse, NCollapseItem, NTimeline, NTimelineItem, NCascader, NSpin, NPopconfirm,
-    NBadge,
-} from 'naive-ui';
-
-const naive = create({
-    components: [
-        NInput, NButton, NForm, NFormItem, NCheckboxGroup, NCheckbox, NLayout, NLayoutHeader, NLayoutContent, NLayoutFooter, NDatePicker, NDataTable, NPagination, NAvatar, NImageGroup, NImage,
-        NLayoutSider, NMenu, NDropdown, NSpace, NTooltip, NTabs, NTabPane, NCard, NRow, NCol, NDrawer, NDrawerContent, NDivider, NSwitch, NGrid, NGridItem, NList, NListItem, NTag, NIcon, NPopselect,
-        NPopover, NSelect, NRadioGroup, NRadio, NInputGroup, NTable, NInputNumber, NModal, NUpload, NTree, NEl, NTab, NCollapse, NCollapseItem, NTimeline, NTimelineItem, NCascader, NSpin, NPopconfirm,
-        NBadge,
-    ],
-});
-
-export function setupNaive(app) {
-    app.use(naive);
-}

+ 0 - 15
src/router/modules/base.js

@@ -216,21 +216,6 @@ export default [
             }
         ],
     },
-    {
-        path: '/test',
-        name: 'test',
-        redirect: '/test/index',
-        meta: {title: '测试'},
-        component: Layout,
-        children: [
-            {
-                path: '/test/index',
-                name: 'test-index',
-                meta: {title: '测试'},
-                component: () => import('~src/views/test/index.vue')
-            },
-        ],
-    },
     {
         path: '/403',
         name: '403',

+ 0 - 55
src/utils/lib/date.js

@@ -1,55 +0,0 @@
-export const calcDate = (date1, date2) => {
-    let date3 = date2 - date1;
-
-    let days = Math.floor(date3 / (24 * 3600 * 1000))
-
-    let leave1 = date3 % (24 * 3600 * 1000) //计算天数后剩余的毫秒数
-    let hours = Math.floor(leave1 / (3600 * 1000))
-
-    let leave2 = leave1 % (3600 * 1000) //计算小时数后剩余的毫秒数
-    let minutes = Math.floor(leave2 / (60 * 1000))
-
-    let leave3 = leave2 % (60 * 1000) //计算分钟数后剩余的毫秒数
-    let seconds = Math.round(date3 / 1000)
-    return {
-        leave1,
-        leave2,
-        leave3,
-        days: days,
-        hours: hours,
-        minutes: minutes,
-        seconds: seconds,
-    }
-}
-
-//日期格式化
-export function dateFormat(date, format) {
-    format = format || 'yyyy-MM-dd hh:mm:ss';
-    if (date !== 'Invalid Date') {
-        let o = {
-            "M+": date.getMonth() + 1, //month
-            "d+": date.getDate(), //day
-            "h+": date.getHours(), //hour
-            "m+": date.getMinutes(), //minute
-            "s+": date.getSeconds(), //second
-            "q+": Math.floor((date.getMonth() + 3) / 3), //quarter
-            "S": date.getMilliseconds() //millisecond
-        }
-        if (/(y+)/.test(format)) {
-            format = format.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
-        }
-        for (let k in o) {
-            if (new RegExp("(" + k + ")").test(format)) {
-                format = format.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
-            }
-        }
-        return format;
-    }
-    return '';
-
-}
-
-//当前时间戳
-export function dateNow() {
-    return dateFormat(new Date(), "yyyyMMddhhmmss");
-}

+ 0 - 91
src/utils/lib/func.js

@@ -1,91 +0,0 @@
-//通用工具类
-export default class func {
-    /**
-     * 不为空
-     * @param val
-     * @returns {boolean}
-     */
-    static notEmpty(val) {
-        return !this.isEmpty(val);
-    }
-
-    /**
-     * 是否为定义
-     * @param val
-     * @returns {boolean}
-     */
-    static isUndefined(val) {
-        return val === null || typeof val === 'undefined';
-    }
-
-    /**
-     * 为空
-     * @param val
-     * @returns {boolean}
-     */
-    static isEmpty(val) {
-        if (
-            val === null ||
-            typeof val === 'undefined' ||
-            (typeof val === 'string' && val === '' && val !== 'undefined')
-        ) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * 强转int型
-     * @param val
-     * @param defaultValue
-     * @returns {number}
-     */
-    static toInt(val, defaultValue) {
-        if (this.isEmpty(val)) {
-            return defaultValue === undefined ? -1 : defaultValue;
-        }
-        const num = parseInt(val, 0);
-        return Number.isNaN(num) ? (defaultValue === undefined ? -1 : defaultValue) : num;
-    }
-
-    /**
-     * Json强转为Form类型
-     * @param obj
-     * @returns {FormData}
-     */
-    static toFormData(obj) {
-        const data = new FormData();
-        Object.keys(obj).forEach(key => {
-            data.append(key, Array.isArray(obj[key]) ? obj[key].join(',') : obj[key]);
-        });
-        return data;
-    }
-
-    /**
-     * date类转为字符串格式
-     * @param date
-     * @param format
-     * @returns {null}
-     */
-    static format(date, format = 'YYYY-MM-DD HH:mm:ss') {
-        return date ? date.format(format) : null;
-    }
-
-    /**
-     * 根据逗号联合
-     * @param arr
-     * @returns {string}
-     */
-    static join(arr) {
-        return arr ? arr.join(',') : '';
-    }
-
-    /**
-     * 根据逗号分隔
-     * @param str
-     * @returns {string}
-     */
-    static split(str) {
-        return str ? String(str).split(',') : '';
-    }
-}

+ 0 - 135
src/utils/lib/isApp.js

@@ -1,135 +0,0 @@
-const toString = Object.prototype.toString;
-
-/**
- * @description: 判断为空对象
- */
-export function isObjNull(val) {
-    return JSON.stringify(val) == "{}";
-}
-
-/**
- * @description: 判断值是否未某个类型
- */
-export function is(val, type) {
-  return toString.call(val) === `[object ${type}]`;
-}
-
-/**
- * @description:  是否为函数
- */
-export function isFunction(val) {
-  return is(val, 'Function');
-}
-
-/**
- * @description: 是否已定义
- */
-export const isDef = (val) => {
-  return typeof val !== 'undefined';
-};
-
-export const isUnDef = (val) => {
-  return !isDef(val);
-};
-
-/**
- * @description: 是否为对象
- */
-export const isObject = (val) => {
-  return val !== null && is(val, 'Object');
-};
-
-/**
- * @description:  是否为时间
- */
-export function isDate(val) {
-  return is(val, 'Date');
-}
-
-/**
- * @description:  是否为数值
- */
-export function isNumber(val) {
-  return is(val, 'Number');
-}
-
-/**
- * @description:  是否为AsyncFunction
- */
-export function isAsyncFunction(val) {
-  return is(val, 'AsyncFunction');
-}
-
-/**
- * @description:  是否为promise
- */
-export function isPromise(val) {
-  return is(val, 'Promise') && isObject(val) && isFunction(val.then) && isFunction(val.catch);
-}
-
-/**
- * @description:  是否为字符串
- */
-export function isString(val) {
-  return is(val, 'String');
-}
-
-/**
- * @description:  是否为boolean类型
- */
-export function isBoolean(val) {
-  return is(val, 'Boolean');
-}
-
-/**
- * @description:  是否为数组
- */
-export function isArray(val) {
-  return val && Array.isArray(val);
-}
-
-/**
- * @description: 是否客户端
- */
-export const isClient = () => {
-  return typeof window !== 'undefined';
-};
-
-/**
- * @description: 是否为浏览器
- */
-export const isWindow = (val) => {
-  return typeof window !== 'undefined' && is(val, 'Window');
-};
-
-export const isElement = (val) => {
-  return isObject(val) && !!val.tagName;
-};
-
-export const isServer = typeof window === 'undefined';
-
-// 是否为图片节点
-export function isImageDom(o) {
-  return o && ['IMAGE', 'IMG'].includes(o.tagName);
-}
-
-export function isNull(val) {
-  return val === null;
-}
-
-export function isNullAndUnDef(val) {
-  return isUnDef(val) && isNull(val);
-}
-
-export function isNullOrUnDef(val) {
-  return isUnDef(val) || isNull(val);
-}
-
-export function isNullAll(val) {
-    return typeof value === undefined || value === null || value === '';
-}
-
-//是否为空,采用ES6,最终效果和 isNullAll 一致
-export function isValueNull(val) {
-    return (val??'') === '';
-}

+ 0 - 103
src/utils/lib/storage.js

@@ -1,103 +0,0 @@
-import {validatenull} from './validate';
-import website from '~src/config/index'
-
-const keyName = website.key + '-';
-
-//存储localStorage
-export const setStore = (params = {}) => {
-    let {name, content, type,} = params;
-    name = keyName + name
-    let obj = {
-        dataType: typeof (content),
-        content: content,
-        type: type,
-        datetime: new Date().getTime()
-    }
-    if (type) {
-        window.sessionStorage.setItem(name, JSON.stringify(obj));
-    } else {
-        window.localStorage.setItem(name, JSON.stringify(obj));
-    }
-}
-
-//获取localStorage
-export const getStore = (params = {}) => {
-    let {name, debug} = params;
-    name = keyName + name
-    let obj = {}, content;
-    obj = window.sessionStorage.getItem(name);
-    if (validatenull(obj)) obj = window.localStorage.getItem(name);
-    if (validatenull(obj)) return;
-    try {
-        obj = JSON.parse(obj);
-    } catch {
-        return obj;
-    }
-    if (debug) {
-        return obj;
-    }
-    if (obj.dataType === 'string') {
-        content = obj.content;
-    } else if (obj.dataType === 'number') {
-        content = Number(obj.content);
-    } else if (obj.dataType === 'boolean') {
-        content = eval(obj.content);
-    } else if (obj.dataType === 'object') {
-        content = obj.content;
-    }
-    return content ?? '';
-}
-
-//删除localStorage
-export const removeStore = (params = {}) => {
-    let {name, type} = params;
-    name = keyName + name
-    if (type) {
-        window.sessionStorage.removeItem(name);
-    } else {
-        window.localStorage.removeItem(name);
-    }
-}
-
-//获取全部localStorage
-export const getAllStore = (params = {}) => {
-    let list = [], {type} = params;
-    if (type) {
-        for (let i = 0; i <= window.sessionStorage.length; i++) {
-            list.push({
-                name: window.sessionStorage.key(i),
-                content: getStore({
-                    name: window.sessionStorage.key(i),
-                    type: 'session'
-                })
-            })
-        }
-    } else {
-        for (let i = 0; i <= window.localStorage.length; i++) {
-            list.push({
-                name: window.localStorage.key(i),
-                content: getStore({
-                    name: window.localStorage.key(i),
-                })
-            })
-
-        }
-    }
-    return list;
-}
-
-//清空全部localStorage
-export const clearStore = (params = {}) => {
-    let {type} = params;
-    if (type) {
-        window.sessionStorage.clear();
-    } else {
-        window.localStorage.clear()
-    }
-}
-
-//清空全部localStorage
-export const clearStoreAll = () => {
-    window.sessionStorage.clear();
-    window.localStorage.clear()
-}

+ 0 - 135
src/utils/lib/tools.js

@@ -1,135 +0,0 @@
-
-// 下载文件
-export const download = (res) => {
-    let blob = new Blob([res.data], { type: "application/vnd.ms-excel" });//type是文件类,详情可以参阅blob文件类型
-    // 创建新的URL并指向File对象或者Blob对象的地址
-    const blobURL = window.URL.createObjectURL(blob)
-    // 创建a标签,用于跳转至下载链接
-    const tempLink = document.createElement('a')
-    tempLink.style.display = 'none'
-    tempLink.href = blobURL
-    tempLink.setAttribute('download', decodeURI(res.headers['content-disposition'].split(';')[1].split('=')[1]))
-    // 兼容:某些浏览器不支持HTML5的download属性
-    if (typeof tempLink.download === 'undefined') {
-        tempLink.setAttribute('target', '_blank')
-    }
-    // 挂载a标签
-    document.body.appendChild(tempLink)
-    tempLink.click()
-    document.body.removeChild(tempLink)
-    // 释放blob URL地址
-    window.URL.revokeObjectURL(blobURL)
-}
-
-
-//生成随机字符串
-export const getRandom = (num= 8) => {
-    const chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
-    let maxPos = chars.length, value = '';
-    for (let i = 0; i < num; i++) {
-        value += chars.charAt(Math.floor(Math.random() * maxPos));
-    }
-    return value;
-}
-
-export const getScreen = (text) => {
-    let width = document.body.clientWidth;
-    if (width >= 1200) {
-        return 3; //大屏幕
-    } else if (width >= 992) {
-        return 2; //中屏幕
-    } else if (width >= 768) {
-        return 1; //小屏幕
-    } else {
-        return 0; //超小屏幕
-    }
-};
-
-//数组随机打乱的方法
-export const arrShuffle = (array) => {
-    let m = array.length, t, i;
-    while (m) {
-        i = Math.floor(Math.random() * m--);
-        t = array[m];
-        array[m] = array[i];
-        array[i] = t;
-    }
-    return array;
-}
-
-/**
- * 工作流统一分类格式
- * @param category 分类字典号
- * @returns {string}
- */
-export function flowCategory(category) {
-    return `flow_${category}`;
-}
-
-/**
- * 根据key获取流程路由
- * @param routes
- * @param key
- */
-export function flowRoute(routes, key) {
-    const data = routes.filter(d => {
-        return d.routeKey === key;
-    });
-    return data.length === 0 ? [] : data[0].routeValue;
-}
-
-//复制文本
-export const copyText = (text) => {
-    let createInput = document.createElement('textarea');
-    createInput.value = text;
-    document.body.appendChild(createInput);
-    createInput.select();
-    document.execCommand('Copy');
-    createInput.className = 'createInput';
-    createInput.style.display = 'none';
-};
-
-/**
- * Lightens a 6 char HEX color according to the passed percentage
- * @param {string} color The color to change
- * @param {number} amount The amount to change the color by
- * @returns {string} The processed color represented as HEX
- */
-export function lighten(color, amount) {
-    color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color;
-    amount = Math.trunc((255 * amount) / 100);
-    return `#${addLight(color.substring(0, 2), amount)}${addLight(
-        color.substring(2, 4),
-        amount
-    )}${addLight(color.substring(4, 6), amount)}`;
-}
-
-/**
- * Sums the passed percentage to the R, G or B of a HEX color
- * @param {string} color The color to change
- * @param {number} amount The amount to change the color by
- * @returns {string} The processed part of the color
- */
-function addLight(color, amount) {
-    const cc = parseInt(color, 16) + amount;
-    const c = cc > 255 ? 255 : cc;
-    return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}`;
-}
-
-//颜色混合
-export const colourBlend = (c1, c2, ratio) => {
-    ratio = Math.max(Math.min(Number(ratio), 1), 0)
-    let r1 = parseInt(c1.substring(1, 3), 16)
-    let g1 = parseInt(c1.substring(3, 5), 16)
-    let b1 = parseInt(c1.substring(5, 7), 16)
-    let r2 = parseInt(c2.substring(1, 3), 16)
-    let g2 = parseInt(c2.substring(3, 5), 16)
-    let b2 = parseInt(c2.substring(5, 7), 16)
-    let r = Math.round(r1 * (1 - ratio) + r2 * ratio)
-    let g = Math.round(g1 * (1 - ratio) + g2 * ratio)
-    let b = Math.round(b1 * (1 - ratio) + b2 * ratio)
-    r = ('0' + (r || 0).toString(16)).slice(-2)
-    g = ('0' + (g || 0).toString(16)).slice(-2)
-    b = ('0' + (b || 0).toString(16)).slice(-2)
-    return '#' + r + g + b
-}

+ 0 - 77
src/utils/lib/util.js

@@ -1,77 +0,0 @@
-//对象深拷贝
-export const deepClone = data => {
-    let type = getObjType(data);
-    let obj;
-    if (type === 'array') {
-        obj = [];
-    } else if (type === 'object') {
-        obj = {};
-    } else {
-        //不再具有下一层次
-        return data;
-    }
-    if (type === 'array') {
-        for (let i = 0, len = data.length; i < len; i++) {
-            obj.push(deepClone(data[i]));
-        }
-    } else if (type === 'object') {
-        for (let key in data) {
-            obj[key] = deepClone(data[key]);
-        }
-    }
-    return obj;
-};
-
-//表单序列化
-export const serialize = data => {
-    let list = [];
-    Object.keys(data).forEach(ele => {
-        list.push(`${ele}=${data[ele]}`)
-    })
-    return list.join('&');
-};
-
-export const getObjType = obj => {
-    let toString = Object.prototype.toString;
-    let map = {
-        '[object Boolean]': 'boolean',
-        '[object Number]': 'number',
-        '[object String]': 'string',
-        '[object Function]': 'function',
-        '[object Array]': 'array',
-        '[object Date]': 'date',
-        '[object RegExp]': 'regExp',
-        '[object Undefined]': 'undefined',
-        '[object Null]': 'null',
-        '[object Object]': 'object'
-    };
-    if (obj instanceof Element) {
-        return 'element';
-    }
-    return map[toString.call(obj)];
-};
-
-//加密处理
-export const encryption = (params) => {
-    let {data, type, param, key} = params;
-    let result = JSON.parse(JSON.stringify(data));
-    if (type === 'Base64') {
-        param.forEach(ele => {
-            result[ele] = btoa(result[ele]);
-        })
-    } else if (type === 'Aes') {
-        param.forEach(ele => {
-            result[ele] = window.CryptoJS.AES.encrypt(result[ele], key).toString();
-        })
-
-    }
-    return result;
-};
-
-//生成随机len位数字
-export const randomLenNum = (len, date) => {
-    let random = '';
-    random = Math.ceil(Math.random() * 100000000000000).toString().substr(0, len ? len : 4);
-    if (date) random = random + Date.now();
-    return random;
-};

+ 0 - 192
src/utils/lib/validate.js

@@ -1,192 +0,0 @@
-
-export function isvalidUsername(str) {
-    const valid_map = ['admin', 'editor']
-    return valid_map.indexOf(str.trim()) >= 0
-}
-
-//合法uri
-export function validateURL(textval) {
-    const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
-    return urlregex.test(textval)
-}
-
-//邮箱
-export function isEmail(s) {
-    return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s)
-}
-
-//手机号码
-export function isMobile(s) {
-    return /^1[0-9]{10}$/.test(s)
-}
-
-//电话号码
-export function isPhone(s) {
-    return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s)
-}
-
-//URL地址
-export function isURL(s) {
-    return /^http[s]?:\/\/.*/.test(s)
-}
-
-//小写字母
-export function validateLowerCase(str) {
-    const reg = /^[a-z]+$/
-    return reg.test(str)
-}
-
-//大写字母
-export function validateUpperCase(str) {
-    const reg = /^[A-Z]+$/
-    return reg.test(str)
-}
-
-//大小写字母
-export function validatAlphabets(str) {
-    const reg = /^[A-Za-z]+$/
-    return reg.test(str)
-}
-
-//验证pad还是pc
-export const vaildatePc = function() {
-    const userAgentInfo = navigator.userAgent;
-    const Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
-    let flag = true;
-    for (let v = 0; v < Agents.length; v++) {
-        if (userAgentInfo.indexOf(Agents[v]) > 0) {
-            flag = false;
-            break;
-        }
-    }
-    return flag;
-}
-
-/**
- * validate email
- * @param email
- * @returns {boolean}
- */
-export function validateEmail(email) {
-    const re = /^(([^<>()\\[\]\\.,;:\s@"]+(\.[^<>()\\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
-    return re.test(email)
-}
-
-//判断身份证号码
-export function cardid(code) {
-    let list = [], result = true, msg = '';
-    let city = {
-        11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "黑龙江 ", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山东", 41: "河南", 42: "湖北 ",
-        43: "湖南", 44: "广东", 45: "广西", 46: "海南", 50: "重庆", 51: "四川", 52: "贵州", 53: "云南", 54: "西藏 ", 61: "陕西", 62: "甘肃", 63: "青海", 64: "宁夏", 65: "新疆", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外 "
-    };
-    if (!validatenull(code)) {
-        if (code.length === 18) {
-            if (!code || !/(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(code)) {
-                msg = "证件号码格式错误";
-            } else if (!city[code.substr(0, 2)]) {
-                msg = "地址编码错误";
-            } else {
-                //18位身份证需要验证最后一位校验位
-                code = code.split('');
-                //∑(ai×Wi)(mod 11)
-                //加权因子
-                let factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
-                //校验位
-                let parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2, 'x'];
-                let sum = 0, ai = 0, wi = 0;
-                for (let i = 0; i < 17; i++) {
-                    ai = code[i];
-                    wi = factor[i];
-                    sum += ai * wi;
-                }
-                if (parity[sum % 11] !== code[17]) {
-                    msg = "证件号码校验位错误";
-                } else {
-                    result = false;
-                }
-
-            }
-        } else {
-            msg = "证件号码长度不为18位";
-        }
-
-    } else {
-        msg = "证件号码不能为空";
-    }
-    list.push(result);
-    list.push(msg);
-    return list;
-}
-
-//判断手机号码是否正确
-export function isvalidatemobile(phone) {
-    let list = [], result = true, msg = '';
-    let isPhone = /^0\d{2,3}-?\d{7,8}$/;
-    //增加134 减少|1349[0-9]{7},增加181,增加145,增加17[678]
-    if (!validatenull(phone)) {
-        if (phone.length === 11) {
-            if (isPhone.test(phone)) {
-                msg = '手机号码格式不正确';
-            } else {
-                result = false;
-            }
-        } else {
-            msg = '手机号码长度不为11位';
-        }
-    } else {
-        msg = '手机号码不能为空';
-    }
-    list.push(result);
-    list.push(msg);
-    return list;
-}
-
-//判断姓名是否正确
-export function validatename(name) {
-    let regName = /^[\u4e00-\u9fa5]{2,4}$/;
-    if (!regName.test(name)) return false;
-    return true;
-}
-
-//判断是否为整数
-export function validatenum(num, type) {
-    let regName = /[^\d.]/g;
-    if (type == 1) {
-        if (!regName.test(num)) return false;
-    } else if (type == 2) {
-        regName = /[^\d]/g;
-        if (!regName.test(num)) return false;
-    }
-    return true;
-}
-
-//判断是否为小数
-export function validatenumord(num, type) {
-    let regName = /[^\d.]/g;
-    if (type == 1) {
-        if (!regName.test(num)) return false;
-    } else if (type == 2) {
-        regName = /[^\d.]/g;
-        if (!regName.test(num)) return false;
-    }
-    return true;
-}
-
-//判断是否为空
-export function validatenull(val) {
-    if (typeof val == 'boolean') {
-        return false;
-    }
-    if (typeof val == 'number') {
-        return false;
-    }
-    if (val instanceof Array) {
-        if (val.length === 0) return true;
-    } else if (val instanceof Object) {
-        if (JSON.stringify(val) === '{}') return true;
-    } else {
-        if (val == 'null' || val == null || val == 'undefined' || val == undefined || val == '') return true;
-        return false;
-    }
-    return false;
-}

+ 0 - 16
src/utils/modules/storage.js

@@ -1,16 +0,0 @@
-import { getStore, setStore, removeStore, clearStoreAll } from '~src/utils/lib/storage'
-
-export default {
-    getStoreData(name) {
-        return getStore({name: name})
-    },
-    setStoreData(name,value) {
-        return setStore({name: name, content: value})
-    },
-    delStoreData(name) {
-        return removeStore({name: name})
-    },
-    clearAllStore() {
-        return clearStoreAll()
-    }
-}

+ 29 - 60
src/views/data-fill/components/HcTreeData.vue

@@ -10,24 +10,29 @@
                 </div>
                 <!--树组件,操作菜单-->
                 <div class="menu-icon" :class="node.showTreeMenu?'show':''" v-if="node.level !== 1 && menusData.length > 0" @click.stop>
-                    <n-dropdown placement="bottom-end" trigger="click" size="huge" :options="menusData" @select="ElTreeMenuClick($event,node,data)" @update:show="ElTreeMenuShow($event,node)">
-                        <div class="cu-tree-node-popover-menu-icon">
-                            <HcIcon name="menu" ui="text-2xl"/>
-                        </div>
-                    </n-dropdown>
+                    <div class="cu-tree-node-popover-menu-icon" @click.prevent.stop="ElTreeLabelContextMenu($event,data,node)">
+                        <HcIcon name="menu" ui="text-2xl"/>
+                    </div>
                 </div>
                 <!--树组件,操作菜单 END-->
             </div>
         </template>
     </ElTree>
-    <n-dropdown placement="bottom" trigger="manual" :x="menusX" :y="menusY" size="huge" :options="menusData" :show="showDropdown" @clickoutside="onClickoutside" @select="handleMenuSelect" v-if="menusData.length > 0"/>
+    <!--右键菜单-->
+    <HcContextMenu ref="contextMenuRef" :datas="menusData" @item-click="handleMenuSelect" v-if="menusData.length > 0">
+        <template #mark="{item}">
+            <HcIcon :name="item.icon" :fill="treeRefData?.isFirst" class="menu-item-icon"/>
+            <span class="menu-item-name">{{treeRefData?.isFirst ? '取消标记为首件' : '标记为首件'}}</span>
+        </template>
+        <template #sort="{item}">
+            <HcIcon :name="item.icon" :line="false" class="menu-item-icon"/>
+            <span class="menu-item-name">{{item.label}}</span>
+        </template>
+    </HcContextMenu>
 </template>
 
 <script setup>
-import {ref,nextTick,watch} from "vue";
-import {hIconJs} from "~src/plugins/renderele";
-import {NDropdown} from 'naive-ui';
-
+import {ref,watch} from "vue";
 //参数
 const props = defineProps({
     menus: {
@@ -66,7 +71,6 @@ const props = defineProps({
 
 //变量
 const ElTreeRef = ref(null)
-const showDropdown = ref(false)
 const treeRefNode = ref(null)
 const treeRefData = ref(null)
 const ElTreeProps = ref({
@@ -75,9 +79,6 @@ const ElTreeProps = ref({
     isLeaf: 'notExsitChild'
 })
 const menusData = ref(props.menus)
-const menusX = ref(0);
-const menusY = ref(0);
-
 const menuMark = ref(props.isMark)
 const isAutoKeys = ref(props.isAutoKeys)
 const TreeExpandKey = ref(props.autoExpandKeys)
@@ -124,65 +125,33 @@ const getNodeExpandKeys = async (node, newKeys) => {
 }
 
 //鼠标右键事件
+const contextMenuRef = ref(null)
 const ElTreeLabelContextMenu = (e,data,node) => {
     const rows = menusData.value || [];
     if (node.level !== 1 && rows.length > 0) {
         e.preventDefault();
         treeRefNode.value = node;
         treeRefData.value = data;
-        if (menuMark.value) {
-            setMenuMarkVal(rows,data)
-        }
-        nextTick(() => {
-            menusX.value = e.clientX;
-            menusY.value = e.clientY;
-            showDropdown.value = true;
-        });
-    }
-}
-
-//设置菜单标记状态
-const setMenuMarkVal = (rows,item) => {
-    for (let i = 0; i < rows.length; i++) {
-        if (rows[i].key === 'mark' || rows[i].key === 'cancel_mark') {
-            if (item.isFirst) {
-                menusData.value[i].label = '取消标记为首件';
-                menusData.value[i].key = 'cancel_mark';
-                menusData.value[i].icon = hIconJs({
-                    name: 'star', fill: true, ui: 'text-lg'
-                });
-            } else {
-                menusData.value[i].label = '标记为首件';
-                menusData.value[i].key = 'mark';
-                menusData.value[i].icon = hIconJs({name: 'star', ui: 'text-lg'});
-            }
-            break;
-        }
+        //展开菜单
+        contextMenuRef.value?.showMenu(e)
     }
 }
 
 //鼠标右键菜单被点击
-const handleMenuSelect = (key) => {
+const handleMenuSelect = ({key}) => {
     const node = treeRefNode.value;
     const data = treeRefData.value;
-    showDropdown.value = false;
-    emit('menuTap', {key,node,data})
-}
-const onClickoutside = () => {
-    treeRefNode.value = null;
-    treeRefData.value = null;
-    showDropdown.value = false;
-}
-
-//菜单被点击
-const ElTreeMenuClick = (key,node,data) => {
-    emit('menuTap', {key,node,data})
-}
-//菜单是否显示
-const ElTreeMenuShow = (key,node) => {
-    node.showTreeMenu = key
+    //如果为标记菜单
+    if (key === 'mark' && menuMark.value) {
+        if (data.isFirst === true) {
+            emit('menuTap', {key: 'cancel_mark', node, data})
+        } else {
+            emit('menuTap', {key: 'mark', node, data})
+        }
+    } else {
+        emit('menuTap', {key, node, data})
+    }
 }
-
 //设置树菜单的标记数据
 const setElTreeMenuMark = (keys,isFirst) => {
     keys.forEach(item => {

+ 9 - 23
src/views/data-fill/components/ListItem.vue

@@ -75,14 +75,14 @@
             </template>
         </el-collapse>
     </div>
-    <!--鼠标右键菜单-->
-    <n-dropdown placement="bottom" trigger="manual" :x="tableFormMenuX" :y="tableFormMenuY" size="huge" :options="tableFormMenu" :show="tableFormMenuShow" @clickoutside="onClickoutside" @select="handleMenuSelect"/>
+    <!--右键菜单-->
+    <HcContextMenu ref="contextMenuRef" :datas="tableFormMenu" @item-click="handleMenuSelect"></HcContextMenu>
     <!--上传文件-->
-    <el-dialog v-model="uploadModal" title="上传文件" width="38rem" custom-class="hc-modal-border">
+    <el-dialog v-model="uploadModal" title="上传文件" width="38rem" class="hc-modal-border">
         <HcUpload :fileList="fileListData" :datas="uploadData" @change='uploadChange'/>
     </el-dialog>
     <!--插入设计值/频率-->
-    <el-dialog v-model="IDVFModal" title="插入设计值/频率" width="600px" custom-class="hc-modal-border">
+    <el-dialog v-model="IDVFModal" title="插入设计值/频率" width="600px" class="hc-modal-border">
         <el-alert title="填写完设计值和频率,系统自动计算实测值" type="warning" :closable="false"/>
         <el-form ref="formIDVFRef" :model="formIDVFModel" :rules="formIDVFRules" label-width="auto" size="large">
             <el-form-item label="设计值" prop="designValue">
@@ -100,7 +100,7 @@
         </template>
     </el-dialog>
     <!--插入特殊字符-->
-    <el-dialog v-model="specialModal" title="插入特殊字符" width="600px" custom-class="hc-modal-border">
+    <el-dialog v-model="specialModal" title="插入特殊字符" width="600px" class="hc-modal-border">
         <el-form ref="specialFormRef" :model="specialFormModel" :rules="specialFormRules" label-width="0px" size="large" class="mb-6">
             <el-form-item prop="val" class="special-form-item">
                 <el-input v-model="specialFormModel.val" ref="specialRef" id="specialId" placeholder="请选择特殊字符代码" clearable @blur="specialInputBlur"/>
@@ -121,7 +121,7 @@
         </template>
     </el-dialog>
     <!--关联试验数据-->
-    <el-dialog v-model="CTDModal" title="关联试验数据" width="850px" custom-class="hc-modal-border">
+    <el-dialog v-model="CTDModal" title="关联试验数据" width="850px" class="hc-modal-border">
         开发中...
         <template #footer>
             <div class="dialog-footer">
@@ -139,7 +139,6 @@ import {HTableForm} from "~src/plugins/HTableForm"
 import {utilsText, isType, toParse, formValidate} from "vue-utils-plus"
 import wbsApi from "~api/data-fill/wbs"
 import HcUpload from "./HcUpload.vue"
-import {NDropdown} from 'naive-ui';
 //初始
 const props = defineProps({
     datas: {
@@ -452,9 +451,6 @@ const uploadChange = async ({type}) => {
 
 //相关变量
 const tableFormItemNode = ref({})
-const tableFormMenuShow = ref(false)
-const tableFormMenuX = ref(0);
-const tableFormMenuY = ref(0);
 
 //菜单数据
 const tableFormMenu = ref([
@@ -469,6 +465,7 @@ const onUploadFinish = (link, KeyName, index) => {
 }
 
 //鼠标右键事件
+const contextMenuRef = ref(null)
 const onRightClick = (event, KeyName, index) => {
     //取光标位置
     const specialDom = document.getElementById(KeyName + "")
@@ -476,17 +473,11 @@ const onRightClick = (event, KeyName, index) => {
     const endPos = specialDom?.selectionEnd || 0
     //存储临时信息
     tableFormItemNode.value = {KeyName, index, startPos, endPos}
-    //取鼠标右键菜单的坐标
-    nextTick(() => {
-        tableFormMenuShow.value = true;
-        tableFormMenuX.value = event.clientX;
-        tableFormMenuY.value = event.clientY;
-    })
+    contextMenuRef.value?.showMenu(event) //展开菜单
 }
 
 //鼠标右键菜单被点击
-const handleMenuSelect = (key) => {
-    tableFormMenuShow.value = false;
+const handleMenuSelect = ({key}) => {
     if (key === 'IDVF') {
         IDVFModal.value = true
     } else if (key === 'special') {
@@ -496,11 +487,6 @@ const handleMenuSelect = (key) => {
     }
 }
 
-const onClickoutside = () => {
-    tableFormItemNode.value = {};
-    tableFormMenuShow.value = false;
-}
-
 //插入设计值
 const IDVFModal = ref(false)
 const formIDVFRef = ref(null)

+ 30 - 61
src/views/data-fill/components/WbsTree.vue

@@ -9,26 +9,32 @@
                     <span v-else>{{ node.label }}</span>
                 </div>
                 <!--树组件,操作菜单-->
-                <div class="menu-icon" :class="node.showTreeMenu?'show':''" v-if="node.level !== 1 && menusData.length > 0" @click.stop>
-                    <n-dropdown placement="bottom-end" trigger="click" size="huge" :options="menusData" @select="ElTreeMenuClick($event,node,data)" @update:show="ElTreeMenuShow($event,node)">
-                        <div class="cu-tree-node-popover-menu-icon">
-                            <HcIcon name="menu" ui="text-2xl"/>
-                        </div>
-                    </n-dropdown>
+                <div class="menu-icon" :class="node.showTreeMenu?'show':''" v-if="node.level !== 1 && menusData.length > 0">
+                    <div class="cu-tree-node-popover-menu-icon" @click.prevent.stop="ElTreeLabelContextMenu($event,data,node)">
+                        <HcIcon name="menu" ui="text-2xl"/>
+                    </div>
                 </div>
                 <!--树组件,操作菜单 END-->
             </div>
         </template>
     </ElTree>
-    <n-dropdown placement="bottom" trigger="manual" :x="menusX" :y="menusY" size="huge" :options="menusData" :show="showDropdown" @clickoutside="onClickoutside" @select="handleMenuSelect" v-if="menusData.length > 0"/>
+    <!--右键菜单-->
+    <HcContextMenu ref="contextMenuRef" :datas="menusData" @item-click="handleMenuSelect" v-if="menusData.length > 0">
+        <template #mark="{item}">
+            <HcIcon :name="item.icon" :fill="treeRefData?.isFirst" class="menu-item-icon"/>
+            <span class="menu-item-name">{{treeRefData?.isFirst ? '取消标记为首件' : '标记为首件'}}</span>
+        </template>
+        <template #sort="{item}">
+            <HcIcon :name="item.icon" :line="false" class="menu-item-icon"/>
+            <span class="menu-item-name">{{item.label}}</span>
+        </template>
+    </HcContextMenu>
 </template>
 
 <script setup>
 import {ref,nextTick,watch} from "vue";
-import {hIconJs} from "~src/plugins/renderele";
 import dataFillQuery from '~api/data-fill/query';
-import {isItem,getArrValue,getIndex} from "vue-utils-plus"
-import {NDropdown} from 'naive-ui';
+import {isItem,getArrValue} from "vue-utils-plus"
 
 //参数
 const props = defineProps({
@@ -72,7 +78,6 @@ const props = defineProps({
 
 //变量
 const ElTreeRef = ref(null)
-const showDropdown = ref(false)
 const treeRefNode = ref(null)
 const treeRefData = ref(null)
 const ElTreeProps = ref({
@@ -81,9 +86,6 @@ const ElTreeProps = ref({
     isLeaf: 'notExsitChild'
 })
 const menusData = ref(props.menus)
-const menusX = ref(0);
-const menusY = ref(0);
-
 const menuMark = ref(props.isMark)
 const isAutoKeys = ref(props.isAutoKeys)
 const TreeExpandKey = ref(props.autoExpandKeys)
@@ -185,65 +187,32 @@ const getNodeExpandKeys = async (node, newKeys) => {
 }
 
 //鼠标右键事件
+const contextMenuRef = ref(null)
 const ElTreeLabelContextMenu = (e,data,node) => {
     const rows = menusData.value || [];
     if (node.level !== 1 && rows.length > 0) {
         e.preventDefault();
         treeRefNode.value = node;
         treeRefData.value = data;
-        if (menuMark.value) {
-            setMenuMarkVal(rows,data)
-        }
-        nextTick(() => {
-            menusX.value = e.clientX;
-            menusY.value = e.clientY;
-            showDropdown.value = true;
-        });
-    }
-}
-
-//设置菜单标记状态
-const setMenuMarkVal = (rows,item) => {
-    let indexs = getIndex(rows, 'key', 'mark')
-    if (indexs === -1) {
-        indexs = getIndex(rows, 'key', 'cancel_mark')
-    }
-    const index = indexs
-    if (index !== -1) {
-        if (item.isFirst === true) {
-            menusData.value[index].label = '取消标记为首件';
-            menusData.value[index].key = 'cancel_mark';
-            menusData.value[index].icon = hIconJs({
-                name: 'star', fill: true, ui: 'text-lg'
-            });
-        } else {
-            menusData.value[index].label = '标记为首件';
-            menusData.value[index].key = 'mark';
-            menusData.value[index].icon = hIconJs({name: 'star', ui: 'text-lg'});
-        }
+        //展开菜单
+        contextMenuRef.value?.showMenu(e)
     }
 }
 
 //鼠标右键菜单被点击
-const handleMenuSelect = (key) => {
+const handleMenuSelect = ({key}) => {
     const node = treeRefNode.value;
     const data = treeRefData.value;
-    showDropdown.value = false;
-    emit('menuTap', {key,node,data})
-}
-const onClickoutside = () => {
-    treeRefNode.value = null;
-    treeRefData.value = null;
-    showDropdown.value = false;
-}
-
-//菜单被点击
-const ElTreeMenuClick = (key,node,data) => {
-    emit('menuTap', {key,node,data})
-}
-//菜单是否显示
-const ElTreeMenuShow = (key,node) => {
-    node.showTreeMenu = key
+    //如果为标记菜单
+    if (key === 'mark' && menuMark.value) {
+        if (data.isFirst === true) {
+            emit('menuTap', {key: 'cancel_mark', node, data})
+        } else {
+            emit('menuTap', {key: 'mark', node, data})
+        }
+    } else {
+        emit('menuTap', {key, node, data})
+    }
 }
 
 //设置树菜单的标记数据

+ 9 - 83
src/views/data-fill/components/nodeTree/children.vue

@@ -3,7 +3,7 @@
         <div class="cu-tree-node-view is-leaf" v-for="item in nodes" :key="item['primaryKeyId']">
             <div class="cu-tree-node-label">
                 <div class="cu-tree-node-label-text">
-                    <div class="cu-tree-node-label-name" :id="`node-tree-${item.key}`" @click="nodeLabelClick(item)" @dblclick="nodeLabelDblClick(item)" @contextmenu="nodeLabelContextMenu($event,item)">
+                    <div class="cu-tree-node-label-name" :id="`node-tree-${item.key}`" @click="nodeLabelClick(item)" @dblclick="nodeLabelDblClick(item)" @contextmenu.prevent.stop="nodeLabelContextMenu($event,item,item?.data)">
                         <el-button hc-btn color="#0081ff" :loading="item.loading" v-if="item?.colorStatus === 2">{{item.label}}</el-button>
                         <el-button hc-btn color="#f37b1d" :loading="item.loading" v-else-if="item?.colorStatus === 3">{{item.label}}</el-button>
                         <el-button type="primary" hc-btn :loading="item.loading" v-else-if="item?.colorStatus === 4">{{item.label}}</el-button>
@@ -12,20 +12,15 @@
                     <span class="cu-tree-node-label-btn" :class="[ifExpanded(item)?'expanded':'']" v-if="isExpanded(item)" @click="expandedClick(item)"/>
                 </div>
             </div>
-            <TreeNodeChildren :data="item.childNodes" :menus="menusData" :isMark="menuMark" :parentNodes="item" v-if="ifExpanded(item)"
-                              @expandClick="ChildrenExpandedClick" @nodeClick="ChildrenNodeLabelClick" @nodeDblClick="ChildrenNodeLabelDblClick" @menuClick="ChildrenCpoverMenuClick"/>
+            <TreeNodeChildren :data="item.childNodes" :parentNodes="item" v-if="ifExpanded(item)" @expandClick="ChildrenExpandedClick" @nodeClick="ChildrenNodeLabelClick" @nodeDblClick="ChildrenNodeLabelDblClick" @menuClick="ChildrenCpoverMenuClick"/>
         </div>
     </div>
-    <!--菜单-->
-    <n-dropdown placement="bottom" trigger="manual" :x="x" :y="y" size="huge" :options="menusData" :show="showDropdown" @clickoutside="onClickoutside" @select="handleMenuSelect"/>
 </template>
 
 <script setup>
-import {ref,watch,onMounted,nextTick} from "vue";
+import {ref,watch,onMounted} from "vue";
 import TreeNodeChildren from "./children.vue"
-import {hIconJs} from "~src/plugins/renderele";
 import {isObject,isBoolean} from "vue-utils-plus"
-import {NDropdown} from 'naive-ui';
 const props = defineProps({
     data: {
         type: Array,
@@ -35,14 +30,6 @@ const props = defineProps({
         type: Object,
         default: () => ({})
     },
-    menus: {
-        type: Array,
-        default: () => ([])
-    },
-    isMark: {
-        type: Boolean,
-        default: false
-    },
     accordion: {
         type: Boolean,
         default: false
@@ -52,26 +39,14 @@ const props = defineProps({
 //初始数据
 const datas = ref(props.data)
 const parent = ref(props.parentNodes)
-const menusData = ref(props.menus)
-const menuMark = ref(props.isMark)
 const nodes = ref([])
 
-//树的菜单相关变量
-const showDropdown = ref(false)
-const menuRefItem = ref(null)
-const x = ref(0);
-const y = ref(0);
-
 //监听
 watch(() => [
     props.data,
-    props.parentNodes,
-    props.menus,
-    props.isMark,
-], ([val,Nodes,menus,isMark]) => {
+    props.parentNodes
+], ([val,Nodes]) => {
     datas.value = val
-    menusData.value = menus
-    menuMark.value = isMark
     if (isDataType(Nodes)) {
         parent.value = Nodes
         setDatasToNodes()
@@ -165,7 +140,6 @@ const ChildrenExpandedClick = ({node,data}) => {
     emit('expandClick', {node,data})
 }
 
-
 //鼠标左键单击事件
 const nodeLabelClick = (item) => {
     emit('nodeClick', {
@@ -189,61 +163,13 @@ const ChildrenNodeLabelDblClick = ({node,data}) => {
 }
 
 //鼠标右键事件
-const nodeLabelContextMenu = (e,item) => {
-    const rows = menusData.value || [];
-    if (rows.length > 0) {
-        e.preventDefault();
-        menuRefItem.value = item;
-        if (menuMark.value) {
-            setMenuMarkVal(rows, item)
-        }
-        nextTick().then(() => {
-            showDropdown.value = true;
-            x.value = e.clientX;
-            y.value = e.clientY;
-        });
-    }
-}
-
-//设置菜单标记状态
-const setMenuMarkVal = (rows,item) => {
-    for (let i = 0; i < rows.length; i++) {
-        if (rows[i].key === 'mark' || rows[i].key === 'cancel_mark') {
-            if (item?.data?.isFirst) {
-                menusData.value[i].label = '取消标记为首件';
-                menusData.value[i].key = 'cancel_mark';
-                menusData.value[i].icon = hIconJs({
-                    name: 'star', fill: true, ui: 'text-lg'
-                });
-            } else {
-                menusData.value[i].label = '标记为首件';
-                menusData.value[i].key = 'mark';
-                menusData.value[i].icon = hIconJs({name: 'star', ui: 'text-lg'});
-            }
-            break;
-        }
-    }
-}
-
-const onClickoutside = () => {
-    menuRefItem.value = null;
-    showDropdown.value = false;
-}
-
-//鼠标右键菜单被点击
-const handleMenuSelect = (key) => {
-    const item = menuRefItem.value;
-    showDropdown.value = false;
-    emit('menuClick', {
-        key,
-        node: item,
-        data: item.data
-    })
+const nodeLabelContextMenu = (event, node, data) => {
+    emit('menuClick', event, node, data)
 }
 
 //菜单被点击
-const ChildrenCpoverMenuClick = ({key,node,data}) => {
-    emit('menuClick', {key,node,data})
+const ChildrenCpoverMenuClick = (event, node, data) => {
+    emit('menuClick', event, node, data)
 }
 </script>
 

+ 43 - 4
src/views/data-fill/components/nodeTree/index.vue

@@ -9,9 +9,20 @@
                         </div>
                     </div>
                 </div>
-                <TreeNodeChildren :data="nodes.childNodes" :menus="menus" :parentNodes="nodes" :isMark="menuMark" @expandClick="expandClick" @nodeClick="nodeLabelClick" @nodeDblClick="nodeLabelDblClick" @menuClick="poverMenuClick"/>
+                <TreeNodeChildren :data="nodes.childNodes" :parentNodes="nodes" @expandClick="expandClick" @nodeClick="nodeLabelClick" @nodeDblClick="nodeLabelDblClick" @menuClick="poverMenuClick"/>
             </div>
         </div>
+        <!--右键菜单-->
+        <HcContextMenu ref="contextMenuRef" :datas="menusData" @item-click="handleMenuSelect" v-if="menusData.length > 0">
+            <template #mark="{item}">
+                <HcIcon :name="item.icon" :fill="treeRefData?.isFirst" class="menu-item-icon"/>
+                <span class="menu-item-name">{{treeRefData?.isFirst ? '取消标记为首件' : '标记为首件'}}</span>
+            </template>
+            <template #sort="{item}">
+                <HcIcon :name="item.icon" :line="false" class="menu-item-icon"/>
+                <span class="menu-item-name">{{item.label}}</span>
+            </template>
+        </HcContextMenu>
     </div>
 </template>
 
@@ -54,19 +65,24 @@ const props = defineProps({
 const uuid = getRandom()
 const datas = ref({})
 const nodes = ref({})
+const menusData = ref(props.menus)
 const menuMark = ref(props.isMark)
 const projectId = ref(props.projectId);
 const contractId = ref(props.contractId);
 const TreeExpandKey = ref(props.autoExpandKeys)
+const treeRefNode = ref(null)
+const treeRefData = ref(null)
 
 //监听
 watch(() => [
     props.autoExpandKeys,
+    props.menus,
     props.isMark,
     props.projectId,
     props.contractId,
-], ([expandKeys, isMark, UserProjectId, UserContractId]) => {
+], ([expandKeys, menus, isMark, UserProjectId, UserContractId]) => {
     TreeExpandKey.value = expandKeys
+    menusData.value = menus
     menuMark.value = isMark
     projectId.value = UserProjectId
     contractId.value = UserContractId
@@ -280,8 +296,31 @@ const nodeLabelDblClick = (item) => {
 }
 
 //菜单被点击
-const poverMenuClick = (item) => {
-    emit('menuClick', item)
+const contextMenuRef = ref(null)
+const poverMenuClick = (event, node, data) => {
+    const rows = menusData.value || [];
+    if (rows.length > 0) {
+        event.preventDefault();
+        treeRefNode.value = node;
+        treeRefData.value = data;
+        contextMenuRef.value?.showMenu(event)
+    }
+}
+
+//鼠标右键菜单被点击
+const handleMenuSelect = ({key}) => {
+    const node = treeRefNode.value;
+    const data = treeRefData.value;
+    //如果为标记菜单
+    if (key === 'mark' && menuMark.value) {
+        if (data.isFirst === true) {
+            emit('menuClick', {key: 'cancel_mark', node, data})
+        } else {
+            emit('menuClick', {key: 'mark', node, data})
+        }
+    } else {
+        emit('menuClick', {key, node, data})
+    }
 }
 </script>
 

+ 13 - 14
src/views/data-fill/wbs.vue

@@ -178,7 +178,7 @@
             </div>
         </HcDragModal>
         <!--编辑节点-->
-        <el-dialog v-model="editNodeModal" title="编辑节点" width="600px" custom-class="hc-modal-border">
+        <el-dialog v-model="editNodeModal" title="编辑节点" width="600px" class="hc-modal-border">
             <el-form ref="formEditNodeRef" :model="formEditNodeModel" :rules="formEditNodeRules" label-width="auto" size="large">
                 <el-form-item label="节点名称" prop="title">
                     <el-input v-model="formEditNodeModel.title"  placeholder="请输入节点名称"/>
@@ -203,7 +203,7 @@
             </template>
         </el-dialog>
         <!--复制节点-->
-        <el-dialog v-model="copyNodeModal" title="复制节点" :width="copyNodeTabKey === '1'?'600px':'1200px'" custom-class="hc-modal-border">
+        <el-dialog v-model="copyNodeModal" title="复制节点" :width="copyNodeTabKey === '1'?'600px':'1200px'" class="hc-modal-border">
             <el-form ref="formCopyNodeModelRef" :model="formCopyNodeModel" :rules="formCopyNodeModelRules" label-width="auto" size="large" v-if="copyNodeTabKey !== '3'">
                 <el-form-item label="节点名称" prop="title" style="margin-bottom: 0;">
                     <el-input v-model="formCopyNodeModel.title" placeholder="请输入节点名称"/>
@@ -253,7 +253,7 @@
             </template>
         </el-dialog>
         <!--新增子节点-->
-        <el-dialog v-model="addNodeModal" title="新增子节点" width="720px" custom-class="hc-modal-border">
+        <el-dialog v-model="addNodeModal" title="新增子节点" width="720px" class="hc-modal-border">
             <el-alert title="双击节点,可编辑节点名称,编辑完成后,请按回车或输入框消失后,再点提交" type="warning" :closable="false"/>
             <HcTreeNode :projectId="projectId" :nodeId="addTreeNodeId" :oldId="addTreeNodeOldId" @check-change="addTreeNodeCheckChange" v-if="addTreeNodeType === '1'"/>
             <HcTreeNode :projectId="projectId" :nodeId="addTreeNodeId" :oldId="addTreeNodeOldId" strictly @check-change="addTreeNodeCheckChange" v-if="addTreeNodeType === '2'"/>
@@ -274,7 +274,7 @@
             </template>
         </el-dialog>
         <!--调整排序-->
-        <el-dialog v-model="sortNodeModal" title="调整排序" width="700px" custom-class="hc-modal-border">
+        <el-dialog v-model="sortNodeModal" title="调整排序" width="700px" class="hc-modal-border">
             <el-alert title="可拖动排序,也可在后面点击图标,切换排序" type="warning" :closable="false"/>
             <div class="sort-node-body-box list-group header">
                 <div class="list-group-item">
@@ -316,7 +316,6 @@
 import {ref,watch,onMounted} from "vue";
 import {useRouter, useRoute} from 'vue-router'
 import {useAppStore} from "~src/store";
-import {hIconJs} from "~src/plugins/renderele";
 import {HcIsButton} from "~src/plugins/IsButtons";
 import ListItem from "./components/ListItem.vue"
 import NodeTree from "./components/nodeTree/index.vue"
@@ -419,33 +418,33 @@ const setElTreeMenu = (contractType) => {
     let newArr = [];
     if (contractType === 1) {
         if (HcIsButton('wbs_tree_edit')) {
-            newArr.push({icon: hIconJs({name:'draft', ui: 'text-lg'}), label: '编辑节点', key: "edit"})
+            newArr.push({icon: 'draft', label: '编辑节点', key: "edit"})
         }
         if (HcIsButton('wbs_tree_mark')) {
-            newArr.push({icon: hIconJs({name:'star', ui: 'text-lg'}), label: '标记为首件', key: "mark"})
+            newArr.push({icon: 'star', label: '标记为首件', key: "mark"})
             TreeMark.value = true
         }
         if (HcIsButton('wbs_tree_copy')) {
-            newArr.push({icon: hIconJs({name:'file-copy-2', ui: 'text-lg'}), label: '复制节点', key: "copy"})
+            newArr.push({icon: 'file-copy-2', label: '复制节点', key: "copy"})
         }
         if (HcIsButton('wbs_tree_add')) {
-            newArr.push({icon: hIconJs({name:'add-circle', ui: 'text-lg'}), label: '新增节点', key: "add"})
+            newArr.push({icon: 'add-circle', label: '新增节点', key: "add"})
         }
         if (HcIsButton('wbs_tree_upload')) {
-            newArr.push({icon: hIconJs({name:'file-upload', ui: 'text-lg'}), label: '上传图纸', key: "upload"})
+            newArr.push({icon: 'file-upload', label: '上传图纸', key: "upload"})
         }
         if (HcIsButton('wbs_tree_del')) {
-            newArr.push({icon: hIconJs({name:'delete-bin', ui: 'text-lg'}), label: '删除节点', key: "del"})
+            newArr.push({icon: 'delete-bin', label: '删除节点', key: "del"})
         }
         if (HcIsButton('wbs_tree_sort')) {
-            newArr.push({icon: hIconJs({name:'sort-asc', line: false, ui: 'text-lg'}), label: '调整排序', key: "sort"})
+            newArr.push({icon: 'sort-asc', label: '调整排序', key: "sort"})
         }
     } else if (contractType === 2) {
         if (HcIsButton('wbs_tree_copy')) {
-            newArr.push({icon: hIconJs({name:'file-copy-2', ui: 'text-lg'}), label: '复制节点', key: "copy"})
+            newArr.push({icon: 'file-copy-2', label: '复制节点', key: "copy"})
         }
         if (HcIsButton('wbs_tree_add')) {
-            newArr.push({icon: hIconJs({name:'add-circle', ui: 'text-lg'}), label: '新增节点', key: "add"})
+            newArr.push({icon: 'add-circle', label: '新增节点', key: "add"})
         }
     }
     ElTreeMenu.value = newArr

+ 6 - 6
src/views/gauge/bezier.vue

@@ -72,7 +72,7 @@
             </template>
         </HcCard>
         <!--管理片段弹框-->
-        <el-dialog v-model="showAdminPartModal" title="管理片段" width="47rem" custom-class="hc-modal-border">
+        <el-dialog v-model="showAdminPartModal" title="管理片段" width="47rem" class="hc-modal-border">
             <div class="admin-part-data-table">
                 <el-scrollbar>
                     <div class="hc-table-ref-box">
@@ -112,7 +112,7 @@
             </template>
         </el-dialog>
         <!--新增片段弹框-->
-        <el-dialog v-model="showAddPartModal" title="新增片段" width="38rem" draggable custom-class="hc-modal-border">
+        <el-dialog v-model="showAddPartModal" title="新增片段" width="38rem" draggable class="hc-modal-border">
             <el-form ref="partFormRef" :model="partForm" :rules="partRules" label-width="auto" size="large">
                 <el-form-item label="名称" prop="name">
                     <el-input v-model="partForm.name" placeholder="请输入名称"/>
@@ -129,7 +129,7 @@
             </template>
         </el-dialog>
         <!--添加/编辑线元弹框-->
-        <el-dialog v-model="showLineEleModal" :title="(formLineEleValue.id === -1 || !formLineEleValue.id)?'添加线元':'编辑线元'" draggable width="40rem" custom-class="hc-modal-border">
+        <el-dialog v-model="showLineEleModal" :title="(formLineEleValue.id === -1 || !formLineEleValue.id)?'添加线元':'编辑线元'" draggable width="40rem" class="hc-modal-border">
             <el-form :model="formLineEleValue" label-width="auto" size="large">
                 <el-form-item label="类型">
                     <el-radio-group v-model="formLineEleValue.type">
@@ -196,7 +196,7 @@
             </template>
         </el-dialog>
         <!--里程转换坐标-->
-        <el-dialog v-model="showToModal" title="里程转换坐标" width="38rem" draggable custom-class="hc-modal-border">
+        <el-dialog v-model="showToModal" title="里程转换坐标" width="38rem" draggable class="hc-modal-border">
             <el-form :model="formToValue" label-width="auto" size="large">
                 <el-form-item label="里程">
                     <el-input v-model="formToValue.value" placeholder="请输入名称"/>
@@ -222,7 +222,7 @@
             </template>
         </el-dialog>
         <!--逐桩坐标弹框-->
-        <el-dialog v-model="showPileModal" title="逐桩坐标" width="62rem" draggable custom-class="hc-modal-border">
+        <el-dialog v-model="showPileModal" title="逐桩坐标" width="62rem" draggable class="hc-modal-border">
             <el-form :model="formPileValue" label-width="auto" size="large" inline label-position="top">
                 <el-form-item label="开始桩号">
                     <el-input v-model="formPileValue.x" placeholder="开始桩号"/>
@@ -259,7 +259,7 @@
             </div>
         </el-dialog>
         <!--导入弹框-->
-        <el-dialog v-model="showImportModal" title="导入线元" width="32rem" custom-class="hc-modal-border">
+        <el-dialog v-model="showImportModal" title="导入线元" width="32rem" class="hc-modal-border">
             <div class="text-center">
                 <el-upload ref="uploadRef" :action="action" :headers="getTokenHeader()" :accept="accept" :data="addition" :limit="1" :auto-upload="false" v-model:file-list="fileList"
                            :on-exceed="handleUploadExceed" :on-progress="handleUploadProgress" :on-success="handleUploadFinish" :on-error="handleUploadError">

+ 2 - 2
src/views/gauge/station.vue

@@ -61,7 +61,7 @@
             </template>
         </HcCard>
         <!--新增/编辑 弹框-->
-        <el-dialog v-model="showRowModal" :title="`${formRowValue?.id ? '编辑' : '新增'}${tabsTypeKey==='1'?'导线点':'水准点'}`" width="47rem" custom-class="hc-modal-border">
+        <el-dialog v-model="showRowModal" :title="`${formRowValue?.id ? '编辑' : '新增'}${tabsTypeKey==='1'?'导线点':'水准点'}`" width="47rem" class="hc-modal-border">
             <el-form ref="formRowRef" :model="formRowValue" :rules="rulesRow" label-width="auto" size="large">
                 <el-form-item label="点名称" prop="name">
                     <el-input v-model="formRowValue.name" placeholder="请输入点名称"/>
@@ -92,7 +92,7 @@
             </template>
         </el-dialog>
         <!--导入 弹框-->
-        <el-dialog v-model="showImportModal" :title="`导入${tabsTypeKey==='1'?'导线点':'水准点'}`" width="47rem" custom-class="hc-modal-border">
+        <el-dialog v-model="showImportModal" :title="`导入${tabsTypeKey==='1'?'导线点':'水准点'}`" width="47rem" class="hc-modal-border">
             <div class="hc-import-modal-box">
                 <div class="tip-box">
                     <span>请先下载导入模板(</span>

+ 0 - 376
src/views/ledger/components/construction.vue

@@ -1,376 +0,0 @@
-<template>
-    <div class="hc-layout-box">
-        <div class="hc-layout-left-box" :style="'width:' + leftWidth + 'px;'">
-            <div class="hc-project-box">
-                <div class="text-xl text-cut project-alias-box">
-                    <i class="hcicon-xiangmu"/>
-                    <span class="ml-2">{{projectInfo['projectAlias']}}</span>
-                </div>
-                <div class="text-xs text-cut project-name">{{projectInfo['name']}}</div>
-            </div>
-            <div class="hc-el-tree-box">
-                <HcTree type="ledger-write-construction" lazy :params="treeParams" :props="ElTreeProps" @node-click="nodeElTreeClick"/>
-            </div>
-            <!--左右拖动-->
-            <div class="horizontal-drag-line" @mousedown="onmousedown"/>
-        </div>
-        <div class="hc-layout-content-box">
-            <n-card class="hc-card-overflow-p-box" :segmented="{content: true}">
-                <n-data-table :loading="tableLoading" :columns="tableColumns" :data="tableData" :row-key="row => row.id" :pagination="false" :single-line="false" striped/>
-                <template #action>
-                    <HcPage :pages="searchForm" @change="pageChange"/>
-                </template>
-            </n-card>
-        </div>
-        <n-modal v-model:show="showEditModal">
-            <n-card class="w-606" title="编辑施工台账" :segmented="{content: true}">
-                <template #header-extra>
-                    <span class="text-lg text-hover" @click="showEditModal = false">
-                        <i class="_icon-close"/>
-                    </span>
-                </template>
-                <div class="modal-box">
-                    <n-form ref="formRef" :model="formValue" :rules="rules" label-placement="left" label-width="auto" size="large">
-                        <n-form-item label="施工起止日期" path="siteTimeStr">
-                            <n-date-picker class="flex-1" v-model:formatted-value="siteTime" value-format="yyyy-MM-dd" type="daterange" clearable @update:value="siteTimeUpdate"/>
-                        </n-form-item>
-                        <n-form-item label="检测起止日期" path="detectionTimeStr">
-                            <n-date-picker class="flex-1" v-model:formatted-value="detectionTime" value-format="yyyy-MM-dd" type="daterange" clearable @update:value="detectionTimeUpdate"/>
-                        </n-form-item>
-                        <div class="flex">
-                            <n-form-item class="flex-1" label="设计方量">
-                                <n-input v-model:value="formValue.designVolume" placeholder="请输入设计方量"/>
-                            </n-form-item>
-                            <n-form-item class="flex-1" label="实际方量">
-                                <n-input v-model:value="formValue.actualVolume" placeholder="请输入实际方量"/>
-                            </n-form-item>
-                        </div>
-                    </n-form>
-                </div>
-                <template #action>
-                    <div class="text-center">
-                        <n-button class="w-20 ml-4" @click="showEditModal = false">取消</n-button>
-                        <n-button :loading="saveLoading" type="primary" class="w-20 ml-4" @click="saveClick">保存</n-button>
-                    </div>
-                </template>
-            </n-card>
-        </n-modal>
-    </div>
-</template>
-
-<script setup>
-import {ref,watch} from "vue";
-import {useAppStore} from "~src/store/index";
-import HcPage from "~com/plugins/naive/HcPage.vue"
-import HcTree from "~com/plugins/element/HcTree.vue"
-import {queryWbsTable, updateWbsTable} from '~api/ledger/construction';
-//import {smallButton, smallPopover} from "~src/plugins/renderele";
-
-const useAppState = useAppStore()
-const projectId = ref(useAppState.getProjectId);
-const contractId = ref(useAppState.getContractId);
-const projectInfo = ref(useAppState.getProjectInfo);
-
-//按钮气泡开关
-const bubbleVal = ref(useAppState.getBubble);
-
-//监听
-watch(() => [
-    useAppState.getProjectId,
-    useAppState.getContractId,
-    useAppState.getProjectInfo,
-    useAppState.getBubble,
-], ([UserProjectId, UserContractId,UserProjectInfo,Bubble]) => {
-    //项目合同数据
-    projectId.value = UserProjectId
-    contractId.value = UserContractId
-    projectInfo.value = UserProjectInfo
-
-    //按钮气泡开关
-    bubbleVal.value = Bubble
-})
-
-//获取气泡数据
-const getButtonsVal = (value) => {
-    return useAppState.getButtonsVal(value)
-}
-
-//气泡数据
-const btn_edit = ref(getButtonsVal('write_construction_edit'))
-
-//树形结构数据
-const ElTreeProps = {label: 'title', children: 'children', isLeaf: 'exsitChild'}
-const treeParams = ref({wbsType: 1, contractId: contractId.value})
-
-//左右拖动,改变树形结构宽度
-const leftWidth = ref(382);
-const onmousedown = () => {
-    document.onmousemove = (ve) => {
-        let diffVal = ve.clientX + 2;
-        if (diffVal >= 310 && diffVal <= 900) {
-            leftWidth.value = diffVal;
-        }
-    }
-    document.onmouseup = () => {
-        document.onmousemove = null;
-        document.onmouseup = null;
-    }
-}
-
-//表格表头
-const tableLoading = ref(false)
-const searchForm = ref({wbsIds: [], current: 1, size: 20, total: 0})
-const tableData = ref([]);
-const showEditModal = ref(false)
-const saveLoading = ref(false)
-const formRef = ref(null)
-
-const siteTime = ref()
-const detectionTime = ref()
-
-const formValue = ref({
-    siteTimeStr: null,
-    detectionTimeStr: null,
-    designVolume: null,
-    actualVolume: null,
-})
-
-const createTableColumns = ({edit}) => {
-    return [
-        {title: '序号', key: 'index', width: 80, align: 'center',
-            render(_, index) {
-                return index + 1
-            }
-        },
-        {title: '施工桩号', key: 'station'},
-        {title: '施工部位', key: 'site'},
-        {title: '施工起止日期', key: 'siteStartTime',
-            render(row) {
-                return row['siteTimeStr'] + ' ~ ' + row['detectionTimeStr']
-            }
-        },
-        {title: '检测日期', key: 'detectionStartTime',
-            render(row) {
-                return row['detectionStartTimeValue'] + ' ~ ' + row['detectionEndTimeValue']
-            }
-        },
-        {title: '设计方量', key: 'designVolume'},
-        {title: '实际方量', key: 'actualVolume'},
-        {
-            title: "操作", key: "actions", width: 100, align: 'center',
-            render(row) {
-                let disabled = !bubbleVal.value || !btn_edit.value?.textInfo;
-                if (btn_edit.value) {
-                    //return smallPopover(disabled,btn_edit.value?.textInfo, smallButton("编辑", row, edit))
-                } else {
-                    //return smallButton("编辑", row, edit);
-                }
-            }
-        }
-    ];
-};
-
-//处理时间格式
-const getDateTimeData = (dateTime) => {
-    return dateTime?dateTime.split(' ')[0]: null
-}
-
-const tableColumns = createTableColumns({
-    edit(row) {
-        formValue.value = row
-        //施工时间
-        if (row['siteStartTime'] && row['siteEndTime']) {
-            const siteStartTime = getDateTimeData(row['siteStartTime'])
-            const siteEndTime = getDateTimeData(row['siteEndTime'])
-            siteTime.value = [siteStartTime, siteEndTime]
-            formValue.value.siteTimeStr = siteStartTime + '~' + siteEndTime
-        } else {
-            siteTime.value = null
-            formValue.value.siteTimeStr = ''
-        }
-        //检测时间
-        if (row['detectionStartTime'] && row['detectionEndTime']) {
-            const detectionStartTime = getDateTimeData(row['detectionStartTime'])
-            const detectionEndTime = getDateTimeData(row['detectionEndTime'])
-            detectionTime.value = [detectionStartTime, detectionEndTime]
-            formValue.value.detectionTimeStr = detectionStartTime + '~' + detectionEndTime
-        } else {
-            detectionTime.value = null
-            formValue.value.detectionTimeStr = ''
-        }
-        formValue.value.projectId = projectId.value
-        formValue.value.contractId = contractId.value
-        showEditModal.value = true
-    }
-})
-
-//树被点击
-const nodeElTreeClick = ({data}) => {
-    if (data.leaf === true) {
-        searchForm.value.wbsIds = [data['primaryKeyId']]
-        getTableData()
-    } else {
-        tableData.value = []
-        searchForm.value.total = 0
-    }
-}
-
-//分页被点击
-const pageChange = (res) => {
-    searchForm.value.current = res.current;
-    searchForm.value.size = res.size;
-    getTableData()
-}
-
-//获取数据
-const getTableData = async () => {
-    tableLoading.value = true
-    const {data} = await queryWbsTable(searchForm.value)
-    let res = data['data'] || {}
-    searchForm.value.total = res.total || 0
-    tableData.value = res['records'] || []
-    tableLoading.value = false
-}
-
-const rules = {
-    siteTimeStr: {
-        required: true,
-        trigger: ["blur", "change"],
-        message: "请选择施工起止日期"
-    },
-    detectionTimeStr: {
-        required: false,
-        validator(rule, value) {
-            const siteTimeA = siteTime.value || [];
-            const detectionTimeA = detectionTime.value || [];
-            if (value && siteTimeA.length !== 2) {
-                return new Error("请先选择施工起止日期");
-            } else if (value && siteTimeA[1] > detectionTimeA[0]) {
-                return new Error("检测起止日期不能小于施工起止日期");
-            }
-            return true;
-        },
-        trigger: ["blur", "change"]
-    }
-}
-
-//施工时间
-const siteTimeUpdate = (_,formVal) => {
-    //处理日期范围
-    const dateArr = formVal || []
-    if (dateArr.length > 0) {
-        formValue.value.siteTimeStr = dateArr[0] + '~' + dateArr[1]
-    } else {
-        formValue.value.siteTimeStr = null
-    }
-}
-
-//检测时间
-const detectionTimeUpdate = (_,formVal) => {
-    const dateArr = formVal || []
-    if (dateArr.length > 0) {
-        formValue.value.detectionTimeStr = dateArr[0] + '~' + dateArr[1]
-    } else {
-        formValue.value.detectionTimeStr = null
-    }
-}
-
-//保存数据
-const saveClick = () => {
-    formRef.value?.validate((errors) => {
-        if (!errors) {
-            saveLoading.value = true;
-            updateWbsTable(formValue.value).then(res => {
-                window.$message?.success('保存成功')
-                saveLoading.value = false;
-                showEditModal.value = false;
-                getTableData()
-            }).catch(erro => {
-                saveLoading.value = false;
-                getTableData()
-            })
-        }
-    });
-}
-
-</script>
-
-<style lang="scss" scoped>
-.hc-layout-box {
-    display: flex;
-    position: relative;
-    height: calc(100% - 55px);
-    .hc-layout-left-box {
-        position: relative;
-        background: white;
-        overflow: auto;
-        margin-top: 15px;
-        border-top: 1px solid #EEEEEE;
-        border-right: 1px solid #EEEEEE;
-        width: 382px;
-        .horizontal-drag-line {
-            position: absolute;
-            right: 0;
-            top: 0;
-            width: 2px;
-            height: 100%;
-            user-select: none;
-            cursor: col-resize;
-            background-color: #e4e4e4;
-            transition: background-color 0.2s;
-            &:hover {
-                background-color: rgba(119, 119, 119, .5);
-            }
-        }
-        .hc-project-box {
-            position: relative;
-            padding: 15px 24px;
-            border-bottom: 1px solid #EEEEEE;
-            .project-alias-box {
-                position: relative;
-                color: var(--hc-primary);
-            }
-            .project-name {
-                position: relative;
-                color: #999999;
-                margin-top: 10px;
-            }
-        }
-        .hc-el-tree-box {
-            position: relative;
-            padding: 15px 20px;
-            height: calc(100% - 85px);
-            overflow: auto;
-        }
-    }
-    .hc-layout-content-box {
-        flex: 1;
-        overflow: auto;
-        position: relative;
-        padding: 15px 24px;
-    }
-}
-.hc-card-header {
-    position: relative;
-    font-size: initial;
-    font-weight: initial;
-}
-
-html.theme-dark {
-    .hc-layout-box .hc-layout-left-box {
-        background: var(--hc-bg-color);
-        border-top: 1px solid #303030;
-        border-right: 1px solid #303030;
-    }
-    .hc-layout-box .hc-layout-left-box .hc-project-box {
-        border-bottom: 1px solid #303030;
-    }
-    .hc-layout-box .hc-tree-foot-tip-box {
-        border-top: 1px solid #303030;
-    }
-    .hc-layout-box .hc-layout-left-box .horizontal-drag-line {
-        background-color: #303030;
-    }
-}
-
-</style>

+ 0 - 317
src/views/ledger/components/internal.vue

@@ -1,317 +0,0 @@
-<template>
-    <div class="hc-layout-box">
-        <div class="hc-layout-left-box" :style="'width:' + leftWidth + 'px;'">
-            <div class="hc-project-box">
-                <div class="text-xl text-cut project-alias-box">
-                    <i class="hcicon-xiangmu"/>
-                    <span class="ml-2">{{projectInfo['projectAlias']}}</span>
-                </div>
-                <div class="text-xs text-cut project-name">{{projectInfo['name']}}</div>
-            </div>
-            <div class="hc-el-tree-box">
-                <HcTree type="ledger-write-internal" lazy :params="treeParams" :props="ElTreeProps" @node-click="nodeElTreeClick"/>
-            </div>
-            <!--左右拖动-->
-            <div class="horizontal-drag-line" @mousedown="onmousedown"/>
-        </div>
-        <div class="hc-layout-content-box">
-            <n-card class="hc-card-overflow-p-box" :segmented="{content: true}">
-                <template #header>
-                    <div class="hc-card-header flex items-center">
-                        <div class="w-32">
-                            <n-select v-model:value="searchForm.taskStatus" :options="approvalData" placeholder="审批状态" clearable/>
-                        </div>
-                        <div class="w-32 ml-3">
-                            <n-select v-model:value="searchForm.isEvaluate" :options="assessData" placeholder="是否评定" clearable/>
-                        </div>
-                        <div class="w-32 ml-3">
-                            <n-select v-model:value="searchForm.reportNumber" :options="reportBatch" placeholder="上报批次" clearable/>
-                        </div>
-                        <div class="w-32 ml-3">
-                            <n-select v-model:value="searchForm.isExperiment" :options="associationTest" placeholder="是否关联试验" clearable/>
-                        </div>
-                        <div class="w-60 ml-3">
-                            <n-input v-model:value="searchForm.queryStr" type="text" placeholder="请输入工程名称关键词检索" @keyup="keyUpEvent" clearable/>
-                        </div>
-                        <div class="ml-3">
-                            <n-button type="primary" class="w-20" @click="searchClick">搜索</n-button>
-                        </div>
-                        <div class="ml-10">
-                            <n-popover trigger="hover" :disabled="!bubbleVal || !btn_download?.textInfo" v-if="btn_download">
-                                <template #trigger>
-                                    <n-button strong secondary type="primary" class="w-20">下载</n-button>
-                                </template>
-                                <span>{{btn_download?.textInfo}}</span>
-                            </n-popover>
-                            <n-popover trigger="hover" :disabled="!bubbleVal || !btn_print?.textInfo" v-if="btn_print">
-                                <template #trigger>
-                                    <n-button strong secondary type="primary" class="w-20 ml-3">打印</n-button>
-                                </template>
-                                <span>{{btn_print?.textInfo}}</span>
-                            </n-popover>
-                        </div>
-                    </div>
-                </template>
-                <div class="mb-4 title-box">
-                    <span class="text-xl">文件列表</span>
-                    <span class="ml-2">(已生成"文件题名"的文件)</span>
-                </div>
-                <n-data-table :loading="tableLoading" :columns="tableColumns" :data="tableData" :row-key="row => row.partProject" :pagination="false" :single-line="false" striped/>
-                <template #action>
-                    <HcPage :pages="searchForm" @change="pageChange"/>
-                </template>
-            </n-card>
-        </div>
-    </div>
-</template>
-
-<script setup>
-import {ref,watch} from "vue";
-import {useAppStore} from "~src/store/index";
-import {queryNeiYeTable} from '~api/ledger/construction';
-import HcTree from "~com/plugins/element/HcTree.vue"
-import HcPage from "~com/plugins/naive/HcPage.vue"
-
-const useAppState = useAppStore()
-const projectId = ref(useAppState.getProjectId);
-const contractId = ref(useAppState.getContractId);
-const projectInfo = ref(useAppState.getProjectInfo);
-
-//按钮气泡开关
-const bubbleVal = ref(useAppState.getBubble);
-
-//监听
-watch(() => [
-    useAppState.getProjectId,
-    useAppState.getContractId,
-    useAppState.getProjectInfo,
-    useAppState.getBubble,
-], ([UserProjectId, UserContractId,UserProjectInfo,Bubble]) => {
-    //项目合同数据
-    projectId.value = UserProjectId
-    contractId.value = UserContractId
-    projectInfo.value = UserProjectInfo
-    //按钮气泡开关
-    bubbleVal.value = Bubble
-})
-
-//获取气泡数据
-const getButtonsVal = (value) => {
-    return useAppState.getButtonsVal(value)
-}
-
-//气泡数据
-const btn_download= ref(getButtonsVal('write_industry_download'))
-const btn_print = ref(getButtonsVal('write_industry_print'))
-
-//树形结构数据
-const ElTreeProps = {label: 'title', children: 'children', isLeaf: 'exsitChild'}
-const treeParams = ref({wbsType: 1, contractId: contractId.value})
-
-//左右拖动,改变树形结构宽度
-const leftWidth = ref(382);
-const onmousedown = () => {
-    document.onmousemove = (ve) => {
-        let diffVal = ve.clientX + 2;
-        if (diffVal >= 310 && diffVal <= 900) {
-            leftWidth.value = diffVal;
-        }
-    }
-    document.onmouseup = () => {
-        document.onmousemove = null;
-        document.onmouseup = null;
-    }
-}
-
-//审批状态
-const approvalData = ref([{label: "未上报", value: "1"}, {label: "待审批", value: "2"}, {label: "已审批", value: "3"}])
-//是否评定
-const assessData = ref([{label: "是", value: true}, {label: "否", value: false}])
-
-//上报批次
-const reportBatch = ref([{label: "1", value: "1"}, {label: "2", value: "2"}, {label: "3", value: "3"}])
-//是否关联试验
-
-const associationTest = ref([{label: "是", value: true}, {label: "否", value: false}])
-
-//搜索和分页数据
-const searchForm = ref({
-    parentId: null, contractId: contractId.value, queryStr: null, isEvaluate: null, isExperiment: null, reportNumber: null, taskStatus: null,
-    current: 1, size: 20, total: 0
-})
-
-//表格数据
-const tableLoading = ref(false)
-const tableData = ref([]);
-const tableColumns = [
-    {type: 'selection'},
-    {title: '序号', key: 'index', width: 80, align: 'center',
-        render(_, index) {
-            return index + 1
-        }
-    },
-    {title: '单位工程', key: 'unitProject'},
-    {title: '分部工程', key: 'partProject'},
-    {title: '子分部工程', key: 'key3'},
-    {title: '分项工程', key: 'subentryProject'},
-    {title: '子分项工程', key: 'key5'},
-    {title: '工序', key: 'process'},
-    {title: '审批状态', key: 'taskStatus',
-        render(row) {
-            if (row.taskStatus === 1) {
-                return '未上报'
-            } else if (row.taskStatus === 2) {
-                return '待审批'
-            } else if (row.taskStatus === 3) {
-                return '已审批'
-            } else {
-                return '-'
-            }
-        }
-    },
-    {title: '上报批次', key: 'reportNumber'},
-    {title: '是否评定', key: 'isEvaluate',
-        render(row) {
-            return row.isEvaluate ? '是' : '否'
-        }
-    },
-    {title: '是否关联试验', key: 'isExperiment',
-        render(row) {
-            return row.isExperiment ? '是' : '否'
-        }
-    },
-]
-
-//表格勾选
-const checkedRowKeysRef = ref([])
-const tableHandleCheck = (rowKeys) => {
-    checkedRowKeysRef.value = rowKeys
-}
-
-//树被点击
-const nodeElTreeClick = ({data}) => {
-    if (data.leaf === true) {
-        searchForm.value.wbsIds = [data['primaryKeyId']]
-        searchForm.value.current = 1;
-        getTableData()
-    } else {
-        tableData.value = []
-        searchForm.value.total = 0
-    }
-}
-
-//分页被点击
-const pageChange = (res) => {
-    searchForm.value.current = res.current;
-    searchForm.value.size = res.size;
-    getTableData()
-}
-
-//获取数据
-const getTableData = () => {
-    tableLoading.value = true
-    queryNeiYeTable(searchForm.value).then(({data}) => {
-        let res = data['data'] || {}
-        searchForm.value.total = res.total || 0
-        tableData.value = res['records'] || []
-        tableLoading.value = false
-    }).catch(erro => {
-        tableData.value = []
-        searchForm.value.total = 0
-        tableLoading.value = false
-    })
-}
-
-//回车搜索
-const keyUpEvent = (e) => {
-    if (e.key === "Enter") {
-        searchForm.value.current = 1;
-        getTableData()
-    }
-}
-
-//搜索
-const searchClick = () => {
-    searchForm.value.current = 1;
-    getTableData()
-}
-</script>
-
-<style lang="scss" scoped>
-.hc-layout-box {
-    display: flex;
-    position: relative;
-    height: calc(100% - 55px);
-    .hc-layout-left-box {
-        position: relative;
-        background: white;
-        overflow: auto;
-        margin-top: 15px;
-        border-top: 1px solid #EEEEEE;
-        border-right: 1px solid #EEEEEE;
-        width: 382px;
-        .horizontal-drag-line {
-            position: absolute;
-            right: 0;
-            top: 0;
-            width: 2px;
-            height: 100%;
-            user-select: none;
-            cursor: col-resize;
-            background-color: #e4e4e4;
-            transition: background-color 0.2s;
-            &:hover {
-                background-color: rgba(119, 119, 119, .5);
-            }
-        }
-        .hc-project-box {
-            position: relative;
-            padding: 15px 24px;
-            border-bottom: 1px solid #EEEEEE;
-            .project-alias-box {
-                position: relative;
-                color: var(--hc-primary);
-            }
-            .project-name {
-                position: relative;
-                color: #999999;
-                margin-top: 10px;
-            }
-        }
-        .hc-el-tree-box {
-            position: relative;
-            padding: 15px 20px;
-            height: calc(100% - 85px);
-            overflow: auto;
-        }
-    }
-    .hc-layout-content-box {
-        flex: 1;
-        overflow: auto;
-        position: relative;
-        padding: 15px 24px;
-    }
-}
-.hc-card-header {
-    position: relative;
-    font-size: initial;
-    font-weight: initial;
-}
-html.theme-dark {
-    .hc-layout-box .hc-layout-left-box {
-        background: var(--hc-bg-color);
-        border-top: 1px solid #303030;
-        border-right: 1px solid #303030;
-    }
-    .hc-layout-box .hc-layout-left-box .hc-project-box {
-        border-bottom: 1px solid #303030;
-    }
-    .hc-layout-box .hc-tree-foot-tip-box {
-        border-top: 1px solid #303030;
-    }
-    .hc-layout-box .hc-layout-left-box .horizontal-drag-line {
-        background-color: #303030;
-    }
-}
-
-</style>

+ 0 - 250
src/views/ledger/components/weather.vue

@@ -1,250 +0,0 @@
-<template>
-    <div class="p-6 pt-3 hc-layout-box">
-        <n-card class="hc-card-overflow-p-box" :segmented="{content: true}">
-            <template #header>
-                <div class="hc-card-header flex items-center">
-                    <div class="w-64">
-                        <Suspense>
-                            <n-date-picker v-model:formatted-value="pickerDate" value-format="yyyy-MM-dd" type="daterange" clearable/>
-                            <!-- 加载中状态 -->
-                            <template #fallback>
-                                <n-spin size="small" />
-                            </template>
-                        </Suspense>
-                    </div>
-                    <n-button type="primary" class="px-8 ml-2" @click="searchClick">搜索</n-button>
-                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_print?.textInfo" v-if="btn_print">
-                        <template #trigger>
-                            <n-button strong secondary type="primary" class="px-8 ml-5">打印</n-button>
-                        </template>
-                        <span>{{btn_print?.textInfo}}</span>
-                    </n-popover>
-                </div>
-            </template>
-            <n-data-table :loading="tableLoading" :columns="tableColumns" :data="tableData" :row-key="row => row.id" :pagination="false" :single-line="false" striped/>
-            <template #action>
-                <HcPage :pages="searchForm" @change="pageChange"/>
-            </template>
-        </n-card>
-        <n-modal v-model:show="showEditModal">
-            <n-card class="w-606" title="编辑天气台账" :segmented="{content: true}">
-                <template #header-extra>
-                    <span class="text-lg text-hover" @click="showEditModal = false">
-                        <i class="_icon-close"/>
-                    </span>
-                </template>
-                <div class="modal-box">
-                    <n-form ref="formRef" :model="weatherForm" :rules="weatherRules" label-placement="left" label-width="auto" size="large">
-                        <n-form-item label="日期">
-                            <n-input v-model:value="weatherForm.recordTime" disabled />
-                        </n-form-item>
-                        <n-form-item label="天气" path="weather">
-                            <n-input v-model:value="weatherForm.weather" placeholder="请输入天气" />
-                        </n-form-item>
-                        <n-form-item label="最低温度" path="tempLow">
-                            <n-input type="number" v-model:value="weatherForm.tempLow" placeholder=""/>
-                        </n-form-item>
-                        <n-form-item label="最高温度" path="tempHigh">
-                            <n-input type="number" v-model:value="weatherForm.tempHigh" placeholder=""/>
-                        </n-form-item>
-                        <n-form-item label="风力" path="windLevel">
-                            <n-input v-model:value="weatherForm.windLevel" placeholder="请输入风力" />
-                        </n-form-item>
-                    </n-form>
-                </div>
-                <template #action>
-                    <div class="text-center">
-                        <n-button class="w-20 ml-4" @click="showEditModal = false">取消</n-button>
-                        <n-button type="primary" :loading="saveLoading" class="w-20 ml-4" @click="saveClick">保存</n-button>
-                    </div>
-                </template>
-            </n-card>
-        </n-modal>
-    </div>
-</template>
-
-<script setup>
-import {onMounted, ref, watch} from "vue";
-import {useAppStore} from "~src/store/index";
-import HcPage from "~com/plugins/naive/HcPage.vue"
-//import {smallButton, smallPopover} from "~src/plugins/renderele";
-import { queryWeatherPage, updateWeatherById } from '~api/ledger/weather';
-import {deepClone} from "~src/utils/lib/util";
-
-const useAppState = useAppStore()
-const projectId = ref(useAppState.getProjectId);
-const contractId = ref(useAppState.getContractId);
-
-//按钮气泡开关
-const bubbleVal = ref(useAppState.getBubble);
-
-//监听
-watch(() => [
-    useAppState.getProjectId,
-    useAppState.getContractId,
-    useAppState.getBubble,
-], ([UserContractId,Bubble]) => {
-    //项目合同数据
-    contractId.value = UserContractId
-    //按钮气泡开关
-    bubbleVal.value = Bubble
-})
-
-//获取气泡数据
-const getButtonsVal = (value) => {
-    return useAppState.getButtonsVal(value)
-}
-
-//气泡数据
-const btn_print = ref(getButtonsVal('write_weather_print'))
-const btn_edit = ref(getButtonsVal('write_weather_edit'))
-
-//变量
-const pickerDate = ref(null)
-const tableLoading = ref(false)
-const searchForm = ref({recordTime: null, contractId: contractId.value, current: 1, size: 20, total: 0})
-const tableData = ref([]);
-const showEditModal = ref(false)
-const saveLoading = ref(false)
-const formRef = ref(null)
-const weatherForm = ref({})
-const weatherRules = {
-    weather: {
-        required: true,
-        trigger: ["blur", "input"],
-        message: "请输入天气"
-    },
-    tempLow: {
-        required: true,
-        validator(rule, value) {
-            const val = Number(value)
-            const tempHigh = Number(weatherForm.value?.tempHigh || '');
-            if (!val) {
-                return new Error("请输入最低温度");
-            } else if (val > tempHigh) {
-                return new Error("最低温度不能高于最高温度");
-            } else if (val === tempHigh) {
-                return new Error("最低温度和最高温度,不能一致");
-            }
-            return true;
-        },
-        trigger: ["blur", "input"]
-    },
-    tempHigh: {
-        required: true,
-        validator(rule, value) {
-            const val = Number(value)
-            const tempLow = Number(weatherForm.value?.tempLow || '');
-            if (!val) {
-                return new Error("请输入最高温度");
-            } else if (tempLow > val) {
-                return new Error("最高温度不能低于最低温度");
-            } else if (val === tempLow) {
-                return new Error("最高温度和最低温度,不能一致");
-            }
-            return true;
-        },
-        trigger: ["blur", "input"]
-    },
-    windLevel: {
-        required: true,
-        trigger: ["blur", "input"],
-        message: "请输入风力"
-    },
-}
-//表格表头
-const createColumns = ({edit}) => {
-    return [
-        {title: '日期', key: 'recordTime'},
-        {title: '天气', key: 'weather'},
-        {title: '温度 ℃', key: 'tempLow',
-            render(row) {
-                return row['tempLow'] + ' ~ ' + row['tempHigh']
-            }
-        },
-        {title: '平均温度 ℃', key: 'airTemp'},
-        {title: '风力', key: 'windLevel'},
-        {title: "操作", key: "actions", width: 100, align: 'center',
-            render(row) {
-                let disabled = !bubbleVal.value || !btn_edit.value?.textInfo;
-                if (btn_edit.value) {
-                    //return smallPopover(disabled,btn_edit.value?.textInfo, smallButton("编辑", row, edit))
-                } else {
-                    //return smallButton("编辑", row, edit);
-                }
-            }
-        }
-    ];
-};
-const tableColumns = createColumns({
-    edit(row) {
-        showEditModal.value = true
-        weatherForm.value = deepClone(row)
-    }
-})
-
-onMounted(() => {
-    getTableData()
-})
-
-//搜索数据
-const searchClick = () => {
-    //处理日期范围
-    const dateArr = pickerDate.value || []
-    if (dateArr.length > 0) {
-        searchForm.value.recordTime = dateArr[0] + '~' + dateArr[1]
-    } else {
-        searchForm.value.recordTime = null
-    }
-    //从第一页开始
-    searchForm.value.current = 1;
-    getTableData()
-}
-
-//分页被点击
-const pageChange = (res) => {
-    searchForm.value.current = res.current;
-    searchForm.value.size = res.size;
-    getTableData()
-}
-
-//获取表格数据
-const getTableData = async () => {
-    tableLoading.value = true
-    const {data} = await queryWeatherPage(searchForm.value)
-    let res = data['data'] || {}
-    searchForm.value.total = res.total || 0
-    tableData.value = res['records'] || []
-    tableLoading.value = false
-}
-
-//保存天气
-const saveClick = () => {
-    formRef.value?.validate((errors) => {
-        if (!errors) {
-            saveLoading.value = true;
-            updateWeatherById(weatherForm.value).then(res => {
-                window.$message?.success('保存成功');
-                saveLoading.value = false;
-                showEditModal.value = false;
-                getTableData()
-            }).catch(erro => {
-                saveLoading.value = false;
-                getTableData()
-            })
-        }
-    });
-}
-</script>
-
-<style lang="scss" scoped>
-.hc-layout-box {
-    position: relative;
-    height: calc(100% - 60px);
-}
-.hc-card-header {
-    position: relative;
-    font-size: initial;
-    font-weight: initial;
-}
-</style>

+ 2 - 381
src/views/ledger/query.vue

@@ -1,377 +1,8 @@
 <template>
-    <n-divider dashed title-placement="left">日志管理</n-divider>
-    <div class="hc-layout-box">
-        <div class="hc-layout-menu-box">
-            <n-menu ref="menuInstRef" :options="menuOptions" accordion v-model:value="menuKey" @update:value="handleMenuValue"/>
-        </div>
-        <div class="hc-layout-content-box">
-            <div class="p-6 pt-0 card-content-box" v-show="viewType==='table'">
-                <n-card class="hc-card-overflow-p-box" :segmented="{content: true}">
-                    <template #header>
-                        <div class="hc-card-header flex items-center">
-                            <div class="w-96">
-                                <n-date-picker v-model:formatted-value="betweenTime" value-format="yyyy-MM-dd" type="datetimerange" clearable @update:value="betweenTimeUpdate"/>
-                            </div>
-                            <div class="w-36 ml-3">
-                                <n-select v-model:value="searchForm.createUser" :options="recordData" placeholder="请选择记录人" clearable/>
-                            </div>
-                            <n-button type="primary" class="px-8 ml-3"  @click="searchClick">搜索</n-button>
-                        </div>
-                    </template>
-                    <template #header-extra>
-                        <n-popover trigger="hover" :disabled="!bubbleVal || !btn_report?.textInfo" v-if="btn_report">
-                            <template #trigger>
-                                <n-button type="primary" class="px-8" @click="reportModalClick">上报</n-button>
-                            </template>
-                            <span>{{btn_report?.textInfo}}</span>
-                        </n-popover>
-                        <n-popover trigger="hover" :disabled="!bubbleVal || !btn_abolish?.textInfo" v-if="btn_abolish">
-                            <template #trigger>
-                                <n-button type="primary" strong secondary class="px-8 ml-5" @click="batchAbolishClick">批量废除</n-button>
-                            </template>
-                            <span>{{btn_abolish?.textInfo}}</span>
-                        </n-popover>
-                        <n-popover trigger="hover" :disabled="!bubbleVal || !btn_print?.textInfo" v-if="btn_print">
-                            <template #trigger>
-                                <n-button type="primary" strong secondary class="px-8 ml-5">预览/打印</n-button>
-                            </template>
-                            <span>{{btn_print?.textInfo}}</span>
-                        </n-popover>
-                    </template>
-                    <n-data-table :columns="tableColumns" :data="tableData" :row-key="row => row.id" :pagination="false" :single-line="false" striped :loading="tableLoading" :checked-row-keys="tableCheckedRowKeys" @update:checked-row-keys="tableHandleCheck"/>
-                    <template #action>
-                        <HcPage :pages="searchForm" @change="pageChange"/>
-                    </template>
-                </n-card>
-            </div>
-            <div class="form-content-box" v-show="viewType==='form'">
-                <div class="table-form-box">
-                    表格表单,暂无数据测试
-                </div>
-                <div class="table-form-tools-box">
-                    <DateCalendar></DateCalendar>
-                    <div class="text-orange mt-4">提示:绿色代表当天已填写过日志</div>
-                </div>
-                <div class="foot-btn-box">
-                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_save_form?.textInfo" v-if="btn_save_form">
-                        <template #trigger>
-                            <n-button type="primary" class="px-8">保存</n-button>
-                        </template>
-                        <span>{{btn_save_form?.textInfo}}</span>
-                    </n-popover>
-                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_report_form?.textInfo" v-if="btn_report_form">
-                        <template #trigger>
-                            <n-button type="primary" strong secondary class="px-8 ml-5" @click="reportModalClick">上报</n-button>
-                        </template>
-                        <span>{{btn_report_form?.textInfo}}</span>
-                    </n-popover>
-                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_preview_form?.textInfo" v-if="btn_preview_form">
-                        <template #trigger>
-                            <n-button type="primary" strong secondary class="px-8 ml-5">预览</n-button>
-                        </template>
-                        <span>{{btn_preview_form?.textInfo}}</span>
-                    </n-popover>
-                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_copy_form?.textInfo" v-if="btn_copy_form">
-                        <template #trigger>
-                            <n-button type="primary" strong secondary class="px-8 ml-5">复制当前表格及内容</n-button>
-                        </template>
-                        <span>{{btn_copy_form?.textInfo}}</span>
-                    </n-popover>
-                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_add_form?.textInfo" v-if="btn_add_form">
-                        <template #trigger>
-                            <n-button type="primary" strong secondary class="px-8 ml-5">新增表格</n-button>
-                        </template>
-                        <span>{{btn_add_form?.textInfo}}</span>
-                    </n-popover>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <!--批量上报审批-->
-    <HcReportModal  title="批量上报审批" url="contractLog/batchTask" :show="showReportModal" :projectId="projectId" :contractId="contractId"
-                    :taskName="reportTaskName" :ids="reportIds" @hide="showReportModal= false" @finish="showReportFinish"/>
-
+    <div>台账日志</div>
 </template>
 
 <script setup>
-import {ref, watch, onMounted, nextTick} from "vue";
-import {useAppStore} from "~src/store/index";
-import {hIconJs} from "~src/plugins/renderele";
-import HcPage from "~com/plugins/naive/HcPage.vue"
-import DateCalendar from "~com/dateCalendar/index.vue"
-import HcReportModal from "~com/reportModal/index.vue"
-import ledgerQuery from '~api/ledger/query';
-
-//初始变量
-const useAppState = useAppStore()
-const projectId = ref(useAppState.getProjectId);
-const contractId = ref(useAppState.getContractId);
-const projectInfo = ref(useAppState.getProjectInfo);
-
-//按钮气泡开关
-const bubbleVal = ref(useAppState.getBubble);
-
-//监听
-watch(() => [
-    useAppState.getProjectId,
-    useAppState.getContractId,
-    useAppState.getProjectInfo,
-    useAppState.getBubble,
-], ([UserProjectId, UserContractId,UserProjectInfo,Bubble]) => {
-    //项目合同数据
-    projectId.value = UserProjectId
-    contractId.value = UserContractId
-    projectInfo.value = UserProjectInfo
-    //按钮气泡开关
-    bubbleVal.value = Bubble
-})
-
-//获取气泡数据
-const getButtonsVal = (value) => {
-    return useAppState.getButtonsVal(value)
-}
-
-//表格的按钮气泡
-const btn_report = ref(getButtonsVal('ledger_query_report'))
-const btn_abolish = ref(getButtonsVal('ledger_query_abolish'))
-const btn_print = ref(getButtonsVal('ledger_query_print'))
-
-//表单的按钮气泡
-const btn_save_form = ref(getButtonsVal('ledger_query_save_form'))
-const btn_report_form = ref(getButtonsVal('ledger_query_report_form'))
-const btn_preview_form = ref(getButtonsVal('ledger_query_preview_form'))
-const btn_copy_form = ref(getButtonsVal('ledger_query_copy_form'))
-const btn_add_form = ref(getButtonsVal('ledger_query_add_form'))
-
-//记录人
-const recordData = ref([])
-//搜索表单
-const searchForm = ref({queryTime: null, wbsNodeId: null, createUser: null, current: 1, size: 20, total: 0})
-//左侧菜单
-const viewType = ref('form')
-const menuInstRef = ref(null)
-const menuOptions = ref([]);
-const menuKey = ref(null)
-const primaryKeyId = ref(null)
-//获取当前合同段下的日志类型
-const queryLogList = () => {
-    ledgerQuery.queryLogList({
-        contractId: contractId.value
-    }).then(({data}) => {
-        let res = data?.data || [], newArr = [];
-        for (let i = 0; i < res.length; i++) {
-            const key = res[i].primaryKeyId || null;
-            newArr.push({
-                key: key,
-                label: res[i].title,
-                icon: res[i]['iconValue']?hIconJs(res[i]['iconValue']):null,
-                children: [
-                    {label: "日志填报", key: `${key}-form`, pid: key, type: 'form'},
-                    {label: "日志列表查看", key: `${key}-table`, pid: key, type: 'table'},
-                ]
-            })
-            if (i === 0) {
-                const keys = key?`${key}-form`:null
-                menuKey.value = keys
-                primaryKeyId.value = key
-                nextTick(() => {
-                    menuInstRef.value?.showOption(keys)
-                })
-            }
-        }
-        menuOptions.value = newArr
-    })
-}
-
-const handleMenuValue = (_, item) => {
-    viewType.value = item.type
-    primaryKeyId.value = item.pid
-    searchForm.value.wbsNodeId = item.pid
-    if (item.type === 'table') {
-        queryFillUser()
-        getTableData()
-    }
-}
-
-//获取记录人数据
-const queryFillUser = () => {
-    ledgerQuery.queryFillUser({
-        contractId: contractId.value,
-        primaryKeyId: primaryKeyId.value
-    }).then(({data}) => {
-        let res = data?.data || [], userArr = [];
-        res.forEach(item => {
-            userArr.push({
-                label: item?.userName,
-                value: item?.userId
-            })
-        })
-        recordData.value = userArr
-    })
-}
-
-//表格表头
-const tableColumns = [
-    {type: 'selection'},
-    {title: '序号', key: 'index', width: 80, align: 'center',
-        render(_, index) {
-            return index + 1
-        }
-    },
-    {title: '施工日期', key: 'recordTime'},
-    {title: '分项工程', key: 'projectPileno'},
-    {title: '施工部位', key: 'projectPart'},
-    {title: '流程状态', key: 'statusValue'},
-    {title: '记录人', key: 'createUserName'},
-]
-//表格数据
-const tableData = ref([]);
-
-//渲染完成
-onMounted(()=> {
-    queryLogList()
-})
-
-//获取数据
-const tableLoading = ref(false)
-const getTableData = () => {
-    tableData.value = []
-    tableCheckedRowKeys.value = []
-    tableLoading.value = true
-    ledgerQuery.constructionLogPage({
-        projectId: projectId.value,
-        contractId: contractId.value,
-        ...searchForm.value
-    }).then(({data}) => {
-        tableLoading.value = false
-        if (data.code === 200) {
-            let res = data['data'] || {}
-            tableData.value = res['records'] || []
-            searchForm.value.total = res.total || 0
-        } else {
-            tableData.value = []
-            searchForm.value.total = 0
-        }
-    }).catch(() => {
-        tableLoading.value = false
-    })
-}
-
-//表格勾选
-const tableCheckedRowKeys = ref([])
-const checkedRowKeysRef = ref([])
-const tableHandleCheck = (keys,rows) => {
-    tableCheckedRowKeys.value = keys
-    checkedRowKeysRef.value = rows.filter((item) => {
-        return (item??'') !== '';
-    })
-}
-
-//日期时间被选择
-const betweenTime = ref(null)
-const betweenTimeUpdate = (_,res) => {
-    res = res || []
-    if (res.length > 0) {
-        searchForm.value.queryTime = res[0] + '~' + res[1]
-    } else {
-        searchForm.value.queryTime = null
-    }
-    searchForm.value.current = 1;
-}
-
-const searchClick = () => {
-    searchForm.value.current = 1;
-    getTableData()
-}
-
-//分页被点击
-const pageChange = (res) => {
-    searchForm.value.current = res.current;
-    searchForm.value.size = res.size;
-    getTableData()
-}
-
-//批量上报
-const reportIds = ref('')
-const reportTaskName = ref('')
-const showReportModal = ref(false)
-const reportModalClick = () => {
-    const rows = checkedRowKeysRef.value;
-    if (rows.length > 0) {
-        let ids = '', report = true;
-        for (let i = 0; i < rows.length; i++) {
-            ids += `${ids?`,${rows[i]['id']}`:rows[i]['id']}`
-            if (rows[i].status === 1 || rows[i].status === 2) {
-                report = false
-                break;
-            }
-        }
-        //判断状态
-        if (report) {
-            reportIds.value = ids
-            reportTaskName.value = rows.length > 1?`${rows[0].fileName}等${rows.length}个文件`:rows[0].fileName
-            showReportModal.value = true
-        } else {
-            window.$message?.warning('已上报的文件不能进行再次上报,若要重新上报,要先撤回之前的上报,再重新上报')
-        }
-    } else {
-        window.$message?.warning('请先勾选要上报的数据')
-    }
-}
-//上报完成
-const showReportFinish = () => {
-    showReportModal.value = false
-    getTableData()
-}
-
-//批量废除
-const batchAbolishClick = () => {
-    const rows = checkedRowKeysRef.value
-    if (rows.length > 0) {
-        let report = true, ids = '';
-        for (let i = 0; i < rows.length; i++) {
-            ids += `${ids?`,${rows[i]['id']}`:rows[i]['id']}`
-            if (rows[i].status === 0 || rows[i].status === 3) {
-                report = false
-                break;
-            }
-        }
-        //判断状态
-        if (report) {
-            window?.$dialog?.warning({
-                title: "确认操作",
-                content: "是否废除勾选的已上报文件?",
-                positiveText: "确定废除",
-                negativeText: "取消",
-                onPositiveClick: () => {
-                    batchAbolishSave(ids)
-                }
-            });
-        } else {
-            window.$message?.warning('未上报的文件不能废除')
-        }
-    } else {
-        window.$message?.warning('请先勾选要废除的数据')
-    }
-}
-//废除勾选的已上报文件
-const batchAbolishSave = (ids) => {
-    if (ids) {
-        ledgerQuery.batchAbolish({
-            ids: ids
-        }).then(({data}) => {
-            if (data.code === 200) {
-                window.$message?.success('批量废除成功')
-                getTableData()
-            } else {
-                window.$message?.error(data.msg || '批量废除失败')
-            }
-        })
-    } else {
-        window.$message?.warning('请先勾选要废除的数据')
-    }
-}
 
 </script>
 
@@ -379,15 +10,5 @@ const batchAbolishSave = (ids) => {
 @import "../../styles/ledger/query.scss";
 </style>
 <style lang="scss">
-.hc-layout-menu-box .n-menu .n-menu-item-content .n-menu-item-content__icon {
-    font-size: 16px !important;
-    margin-right: 5px !important;
-}
-.table-form-tools-box .hc-date-calendar-box {
-    left: 28px;
-    top: 30px;
-    transform: scale(1.2);
-    margin-bottom: 70px;
-    box-shadow: 0 -3px 6px rgba(0,0,0,0.06);
-}
+
 </style>

+ 1 - 38
src/views/ledger/write.vue

@@ -1,44 +1,7 @@
 <template>
-    <div class="hc-line-menu">
-        <BtnTab :datas="btnTabData" :cur="btnTabKey" @tabClick="BtnTabClick"/>
-    </div>
-    <Internal v-if="btnTabKey === 'internal'"/>
-    <Construction v-if="btnTabKey === 'construction'"/>
-    <Weather v-if="btnTabKey === 'weather'"/>
+    <div>台账记录</div>
 </template>
 
 <script setup>
-import {ref} from "vue";
-import {useRoute} from 'vue-router'
-import router from '~src/router/index';
-import BtnTab from "~com/btnTab/index.vue"
-import Weather from "./components/weather.vue"
-import Construction from "./components/construction.vue"
-import Internal from "./components/internal.vue"
 
-const useRoutes = useRoute()
-const routerQuery = useRoutes?.query;
-const MenuBarKey = routerQuery?.MenuBarKey || '';
-let typeName = routerQuery?.type || 'weather'
-
-const btnTabData = [
-    {key: "internal", label: "内业台账", icon: 'hcicon-shujutongji'},
-    {key: "construction", label: "施工台账", icon: 'hcicon-shigong'},
-    {key: "weather", label: "天气台账", icon: 'hcicon-tianqi'}
-]
-if (btnTabData.findIndex(item => item.key === typeName) === -1) {
-    typeName = 'weather'
-}
-const btnTabKey = ref(typeName)
-
-const BtnTabClick = (val) => {
-    btnTabKey.value = val
-    router.push({
-        path: useRoutes.path,
-        query: {
-            MenuBarKey: MenuBarKey,
-            type: val
-        }
-    })
-}
 </script>

+ 1 - 1
src/views/other-file/image-data.vue

@@ -40,7 +40,7 @@
             </el-scrollbar>
         </HcCard>
         <!--分类管理 弹框-->
-        <el-dialog v-model="showSortModal" title="分类管理" width="62rem" custom-class="hc-modal-border">
+        <el-dialog v-model="showSortModal" title="分类管理" width="62rem" class="hc-modal-border">
             <el-alert title="隐藏分类之后,在主页面不会显示该分类入口" type="warning" :closable="false"/>
             <div class="modal-dialog">
                 <el-scrollbar>

+ 1 - 1
src/views/other-file/image-view.vue

@@ -99,7 +99,7 @@
             </HcCard>
         </div>
         <!--视频预览 弹框-->
-        <el-dialog v-model="previewVideoModal" title="预览" width="47rem" destroy-on-close custom-class="hc-modal-border">
+        <el-dialog v-model="previewVideoModal" title="预览" width="47rem" destroy-on-close class="hc-modal-border">
             <video class="preview-video" :src="previewVideoUrl" controls="controls" autoplay="autoplay" v-if="previewVideoUrl">
                 您的浏览器不支持 video
             </video>

+ 1 - 111
src/views/other/components/first-item-form.vue

@@ -1,119 +1,9 @@
 <template>
-    <n-divider dashed title-placement="left">
-        <span class="text-hover" @click="goToBack()">首件工程</span>
-        <span class="ml-2">/</span>
-        <span class="ml-2">上报首件</span>
-    </n-divider>
-    <div class="hc-layout-box">
-        <div class="hc-layout-content-box">
-            <n-card class="hc-card-overflow-p-box" :segmented="{content: true}">
-                表格表单
-            </n-card>
-        </div>
-        <div class="hc-layout-card-box">
-            <n-card class="hc-card-overflow-p-box" :segmented="{content: true}">
-                <template #header>
-                    <div class="hc-card-header flex items-center">
-                        <div>上传总结报告:</div>
-                        <div class="ml-2">
-                            <n-upload :action="action" :headers="getTokenHeader()" :data="upData" :max="1" :accept="accept" :default-upload="false" multiple
-                                      :show-file-list="false" @before-upload="beforeUpload" @finish="uploadFinish">
-                                <n-button type="primary" class="px-4">选择文件</n-button>
-                            </n-upload>
-                        </div>
-                        <div class="ml-5 text-purple">xxxxx.word</div>
-                    </div>
-                </template>
-                <n-data-table :columns="tableColumns" :data="tableData" :row-key="row => row.name" :pagination="false" :single-line="false" striped/>
-                <template #action>
-                    <div class="text-center">
-                        <n-button class="px-5" @click="goToBack">取消</n-button>
-                        <n-button type="primary" class="px-5 ml-6">保存</n-button>
-                        <n-button type="primary" strong secondary class="px-5 ml-6">预览</n-button>
-                        <n-button type="primary" strong secondary class="px-5 ml-6" @click="reportModalClick">上报</n-button>
-                    </div>
-                </template>
-            </n-card>
-        </div>
-    </div>
-    <!--批量上报审批-->
-    <HcReportModal :show="showReportModal" @hide="showReportModal= false"/>
+    <div>首件工程上报</div>
 </template>
 
 <script setup>
-import {onMounted,ref,watch} from 'vue'
-import {getTokenHeader} from '~src/api/request/header';
-import HcReportModal from "~com/reportModal/index.vue"
-const props = defineProps({
-    //输入框占位文本
-    placeholder: {
-        type: String,
-        default: ''
-    },
-    //值
-    modelValue: {
-        type: String,
-        default: ""
-    },
-    //语音输入
-    mic: {
-        type: Boolean,
-        default: false
-    }
-})
-//监听
-/*watch(() => [
-    userStore.getUserProjectId, userStore.getUserContractId, useAppState.getBubble
-], ([UserProjectId,UserContractId]) => {
-    //项目合同数据
-    projectId.value = UserProjectId
-    contractId.value = UserContractId
-})*/
-
-//渲染完成
-onMounted(() => {
-
-})
-
-//文件上传
-const action = '/api/blade-business/dap/import';
-const accept = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel';
-const upData = ref({})
-//上传前
-const beforeUpload = (options) => {
-    console.log(options)
-}
-//上传完成
-const uploadFinish = ({event}) => {
-    let res = JSON.parse(event?.target?.response);
-    console.log(res)
-}
 
-//表格表头
-const tableColumns = [
-    {title: '文件名称', key: 'name'},
-    {title: '操作', key: 'tesk2', width: 120}
-]
-
-//表格数据
-const tableData = ref([
-    { name: "test1" }, { name: "test2" }, { name: "test3" },
-    { name: "test4" }, { name: "test5" }, { name: "test6" }
-]);
-
-//事件
-const emit = defineEmits(['ToClose'])
-
-//批量上报
-const showReportModal = ref(false)
-const reportModalClick = () => {
-    showReportModal.value = true
-}
-
-//关闭
-const goToBack = () => {
-    emit('ToClose')
-}
 </script>
 
 <style lang="scss" scoped>

+ 2 - 353
src/views/other/first-item.vue

@@ -1,364 +1,13 @@
 <template>
-    <div class="hc-drawer-target" id="drawer-target">
-        <n-divider dashed title-placement="left">首件工程</n-divider>
-        <div class="hc-layout-box">
-            <div class="hc-layout-left-box" :style="'width:' + leftWidth + 'px;'">
-                <div class="hc-project-box">
-                    <div class="text-xl text-cut project-alias-box">
-                        <i class="hcicon-xiangmu"/>
-                        <span class="ml-2">{{projectInfo['projectAlias']}}</span>
-                    </div>
-                    <div class="text-xs text-cut project-name">{{projectInfo['name']}}</div>
-                </div>
-                <div class="hc-el-tree-box">
-                    <HcTree type="other-first-item" :params="treeParams" :props="wbsElTreeProps" lazy @node-click="nodeWbsElTreeClick"/>
-                </div>
-                <!--左右拖动-->
-                <div class="horizontal-drag-line" @mousedown="onmousedown"/>
-            </div>
-            <div class="hc-layout-content-box">
-                <n-card class="hc-card-overflow-box" :segmented="{content: true}">
-                    <template #header>
-                        <div class="hc-card-header flex items-center">
-                            <div class="w-40">
-                                <n-select v-model:value="searchForm.status" :options="processStatus" placeholder="流程状态" clearable label-field="dictValue" value-field="dictKey"/>
-                            </div>
-                            <div class="w-40 ml-3">
-                                <n-select v-model:value="searchForm.reportNumber" :options="reportBatch" placeholder="上报批次" clearable label-field="batch" value-field="batch"/>
-                            </div>
-                            <div class="w-96 ml-3">
-                                <n-date-picker v-model:formatted-value="datePickerValue" value-format="yyyy-MM-dd" type="daterange" clearable @update:formatted-value="updateFormattedValue"/>
-                            </div>
-                            <div class="w-60 ml-3">
-                                <n-input v-model:value="searchForm.queryValue" type="text" placeholder="请输入名称关键词检索" @keyup="keyUpEvent"/>
-                            </div>
-                            <n-button type="primary" class="ml-2" @click="searchClick">搜索</n-button>
-                        </div>
-                    </template>
-                    <template #header-extra>
-                        <HcTabs :datas="tabTypeTab" :keys="tabTypeKey" @change="tabTypeChange"/>
-                    </template>
-                    <div class="hc-sticky-box p-6">
-                        <template v-if="tabTypeKey === 'mark'">
-                            <n-popover trigger="hover" :disabled="!bubbleVal || !btn_report?.textInfo" v-if="btn_report">
-                                <template #trigger>
-                                    <n-button type="primary" class="px-5" @click="firstReportClick">上报首件</n-button>
-                                </template>
-                                <span>{{btn_report?.textInfo}}</span>
-                            </n-popover>
-                        </template>
-
-                        <template v-if="tabTypeKey==='query'">
-                            <n-popover trigger="hover" :disabled="!bubbleVal || !btn_report_approval?.textInfo" v-if="btn_report_approval">
-                                <template #trigger>
-                                    <n-button type="primary" class="px-5" @click="reportModalClick">上报审批</n-button>
-                                </template>
-                                <span>{{btn_report_approval?.textInfo}}</span>
-                            </n-popover>
-                            <n-popover trigger="hover" :disabled="!bubbleVal || !btn_repeal?.textInfo" v-if="btn_repeal">
-                                <template #trigger>
-                                    <n-button type="primary" strong secondary class="px-5 ml-4">废除</n-button>
-                                </template>
-                                <span>{{btn_repeal?.textInfo}}</span>
-                            </n-popover>
-                        </template>
-
-                        <n-popover trigger="hover" :disabled="!bubbleVal || !btn_down_print?.textInfo" v-if="btn_down_print">
-                            <template #trigger>
-                                <n-button type="primary" strong secondary class="px-5 ml-4">下载/打印</n-button>
-                            </template>
-                            <span>{{btn_down_print?.textInfo}}</span>
-                        </n-popover>
-                    </div>
-                    <div class="p-6 pt-0">
-                        <n-data-table :columns="tableColumns" :data="tableData" :row-key="row => row.name" :pagination="false" :single-line="false" striped/>
-                    </div>
-                    <template #action>
-                        <HcPage :pages="searchForm" @change="pageChange"/>
-                    </template>
-                </n-card>
-            </div>
-        </div>
+    <div>
+        首件工程
     </div>
-    <n-drawer v-model:show="drawerShow" height="100%" placement="top" to="#drawer-target" style="background-color: #F5F5F5;">
-        <FirstItemForm @ToClose="drawerShow = false"/>
-    </n-drawer>
-    <!--批量上报审批-->
-    <HcReportModal :show="showReportModal" title="批量上报审批" @hide="showReportModal= false"/>
 </template>
 
 <script setup>
-import {onMounted,ref,watch} from 'vue'
-import {useRoute} from 'vue-router'
-import {useAppStore} from "~src/store/index";
-import HcTree from "~com/plugins/element/HcTree.vue"
-import HcPage from "~com/plugins/naive/HcPage.vue"
-import HcTabs from "~com/plugins/naive/HcTabs.vue"
-import FirstItemForm from "./components/first-item-form.vue"
-import HcReportModal from "~com/reportModal/index.vue"
-import tasksDataApi from '~api/tasks/data';
-import firstItemApi from '~api/other/first-item';
-
-//初始变量
-const useRoutes = useRoute()
-const useAppState = useAppStore()
-
-const routerQuery = useRoutes?.query;
-const projectId = ref(useAppState.getProjectId);
-const contractId = ref(useAppState.getContractId);
-const projectInfo = ref(useAppState.getProjectInfo);
-
-//按钮气泡开关
-const bubbleVal = ref(useAppState.getBubble);
-
-//结构类型tab数据和相关处理
-const tabTypeKey = ref('mark')
-const tabTypeTab = ref([{key:'mark',  name: '已标记为首件'}, {key:'query', name: '首件查询'}]);
-const tabTypeChange = (value) => {
-    tabTypeKey.value = value;
-}
-
-//监听
-watch(() => [
-    useAppState.getProjectId,
-    useAppState.getContractId,
-    useAppState.getProjectInfo,
-    useAppState.getBubble,
-], ([UserProjectId,UserContractId,UserProjectInfo,Bubble]) => {
-    //项目合同数据
-    projectId.value = UserProjectId
-    contractId.value = UserContractId
-    projectInfo.value = UserProjectInfo
-    //按钮气泡开关
-    bubbleVal.value = Bubble
-})
-
-//获取气泡数据
-const getButtonsVal = (value) => {
-    return useAppState.getButtonsVal(value)
-}
-
-//气泡数据
-const btn_report = ref(getButtonsVal('other-first-item-report'))
-const btn_report_approval = ref(getButtonsVal('other-first-item-report-approval'))
-const btn_repeal = ref(getButtonsVal('other-first-item-repeal'))
-const btn_down_print = ref(getButtonsVal('other-first-item-down-print'))
-
-//流程状态
-const processStatus = ref([])
-//上报批次
-const reportBatch = ref([])
-//搜索和分页数据
-const searchForm = ref({
-    projectId:projectId.value, contractId: contractId.value, wbsNodeIds: null,
-    status: null, reportNumber: null, queryValue: null, betweenTime: null,
-    current: 1, size: 20, total: 0
-})
-
-//渲染完成
-onMounted(() => {
-    firstTaskStatus()
-    getTableData()
-})
-
-//获取任务类型
-const firstTaskStatus = () => {
-    tasksDataApi.queryTaskTypeStatus({
-        typeOrStatus: 'first_task_status'
-    }).then(({data}) => {
-        if (data.code === 200) {
-            processStatus.value = data['data']
-        } else {
-            processStatus.value = []
-        }
-    })
-}
-
-//日期选择处理
-const datePickerValue = ref(null)
-const updateFormattedValue = (val) => {
-    if (val && val.length > 0) {
-        searchForm.value.betweenTime = val[0] + '~' + val[1]
-    } else {
-        searchForm.value.betweenTime = null
-    }
-}
-
-
-//树形结构数据
-const wbsElTreeProps = {label: 'title', children: 'children', isLeaf: 'exsitChild'}
-const treeParams = ref({contractId: contractId.value})
-//树被点击
-const nodeWbsElTreeClick = ({data}) => {
-    if (data.leaf === true) {
-        searchForm.value.wbsNodeIds = data['primaryKeyId'] || ''
-        searchForm.value.current = 1;
-        getTableData()
-    } else {
-        tableData.value = []
-        searchForm.value.total = 0
-    }
-}
-
-//表格表头
-const tableColumns = [
-    {type: 'selection'},
-    {title: '序号', key: 'num', width: 80, align: 'center',
-        render(_, index) {
-            return index + 1
-        }
-    },
-    {title: '文件名称', key: 'name'},
-    {title: '开始时间', key: 'date1', width: 180},
-    {title: '流程状态', key: 'tesk1', width: 140},
-    {title: '上报批次', key: 'tesk2', width: 120}
-]
-
-//表格数据
-const tableData = ref([]);
-//表格勾选
-const checkedRowKeysRef = ref([])
-const tableHandleCheck = (rowKeys) => {
-    checkedRowKeysRef.value = rowKeys
-    console.log(rowKeys)
-}
-
-//回车搜索
-const keyUpEvent = (e) => {
-    if (e.key === "Enter") {
-        searchForm.value.current = 1;
-        getTableData()
-    }
-}
-
-//搜索
-const searchClick = () => {
-    searchForm.value.current = 1;
-    getTableData()
-}
-//分页被点击
-const pageChange = (res) => {
-    searchForm.value.current = res.current;
-    searchForm.value.size = res.size;
-    getTableData()
-}
-
-//获取数据
-const getTableData = () => {
-    firstItemApi.getPageData({
-        projectId: projectId.value,
-        contractId: contractId.value,
-        ...searchForm.value
-    }).then(({data}) => {
-        let res = data['data'] || {}
-        console.log(res)
-        //tableData.value = res['records'] || []
-        //searchForm.value.total = res.total || 0
-    })
-}
-
-//上报首件
-const drawerShow = ref(false)
-const firstReportClick = () => {
-    drawerShow.value = true
-}
-
-//批量上报
-const showReportModal = ref(false)
-const reportModalClick = () => {
-    showReportModal.value = true
-}
 
-//左右拖动,改变树形结构宽度
-const leftWidth = ref(382);
-const onmousedown = () => {
-    document.onmousemove = (ve) => {
-        let diffVal = ve.clientX + 2;
-        if (diffVal >= 310 && diffVal <= 900) {
-            leftWidth.value = diffVal;
-        }
-    }
-    document.onmouseup = () => {
-        document.onmousemove = null;
-        document.onmouseup = null;
-    }
-}
 </script>
 
 <style lang="scss" scoped>
-.hc-layout-box {
-    display: flex;
-    position: relative;
-    height: calc(100% - 60px);
-    .hc-layout-left-box {
-        position: relative;
-        background: white;
-        overflow: auto;
-        border-top: 1px solid #EEEEEE;
-        border-right: 1px solid #EEEEEE;
-        width: 382px;
-        .horizontal-drag-line {
-            position: absolute;
-            right: 0;
-            top: 0;
-            width: 2px;
-            height: 100%;
-            user-select: none;
-            cursor: col-resize;
-            background-color: #e4e4e4;
-            transition: background-color 0.2s;
-            &:hover {
-                background-color: rgba(119, 119, 119, .5);
-            }
-        }
-        .hc-project-box {
-            position: relative;
-            padding: 15px 24px;
-            border-bottom: 1px solid #EEEEEE;
-            .project-alias-box {
-                position: relative;
-                color: var(--hc-primary);
-            }
-            .project-name {
-                position: relative;
-                color: #999999;
-                margin-top: 10px;
-            }
-        }
-        .hc-el-tree-box {
-            position: relative;
-            padding: 15px 20px;
-            height: calc(100% - 85px);
-            overflow: auto;
-        }
-    }
-    .hc-layout-content-box {
-        flex: 1;
-        overflow: auto;
-        position: relative;
-        padding: 0 24px 15px 20px;
-    }
-}
-.hc-card-header {
-    position: relative;
-    font-size: initial;
-    font-weight: initial;
-}
 
-html.theme-dark {
-    .hc-layout-box .hc-layout-left-box {
-        background: var(--hc-bg-color);
-        border-top: 1px solid #303030;
-        border-right: 1px solid #303030;
-    }
-    .hc-layout-box .hc-layout-left-box .hc-project-box {
-        border-bottom: 1px solid #303030;
-    }
-    .hc-layout-box .hc-tree-foot-tip-box {
-        border-top: 1px solid #303030;
-    }
-    .hc-layout-box .hc-layout-left-box .horizontal-drag-line {
-        background-color: #303030;
-    }
-}
 </style>

+ 2 - 2
src/views/other/order-service.vue

@@ -117,7 +117,7 @@
             <div class="horizontal-drag-line" @mousedown="onmousedown"/>
         </div>
         <!--提交工单-->
-        <el-dialog v-model="showModal" title="发起新工单服务" width="720px" custom-class="hc-modal-border" :before-close="handleModalClose">
+        <el-dialog v-model="showModal" title="发起新工单服务" width="720px" class="hc-modal-border" :before-close="handleModalClose">
             <div class="title">请选择您需要反馈的问题类型</div>
             <div class="hc-type-tabs my-5">
                 <el-radio-group v-model="typeTabKey" size="large" @change="typeTabChange">
@@ -153,7 +153,7 @@
         </el-dialog>
 
         <!--提示框-->
-        <el-dialog v-model="showTipModal" title="感谢" width="600px" custom-class="hc-modal-border" :before-close="handleTipModalClose">
+        <el-dialog v-model="showTipModal" title="感谢" width="600px" class="hc-modal-border" :before-close="handleTipModalClose">
             <div class="tip-modal-icon-box">
                 <HcIcon name="emotion" fill/>
             </div>

+ 2 - 139
src/views/schedule/hc-data.vue

@@ -1,148 +1,11 @@
 <template>
-    <n-divider dashed title-placement="left">内业资料进度</n-divider>
-    <div class="hc-layout-box">
-        <div class="hc-grid-box">
-            <n-grid x-gap="30" :cols="4">
-                <n-gi>
-                    <div class="hc-grid-card-box shadow-md">
-                        <div class="card-title font-bold">开工报告</div>
-                        <div class="card-body flex items-center">
-                            <div class="card-flex">
-                                <RoundChart/>
-                                <div class="text-num">30%</div>
-                            </div>
-                            <div class="card-flex-text flex-1">
-                                <div class="text-div">应填:<span class="font-bold text-blue">5210</span>(份)</div>
-                                <div class="text-div">已填:<span class="font-bold text-green">3210</span>(份)</div>
-                                <div class="text-div">完成率:<span class="font-bold">30%</span></div>
-                            </div>
-                        </div>
-                    </div>
-                </n-gi>
-                <n-gi>
-                    <div class="hc-grid-card-box shadow-md">
-                        <div class="card-title font-bold">工序资料</div>
-                        <div class="card-body flex items-center">
-                            <div class="card-flex">
-                                <RoundChart/>
-                                <div class="text-num">30%</div>
-                            </div>
-                            <div class="card-flex-text flex-1">
-                                <div class="text-div">应填:<span class="font-bold text-blue">5210</span>(份)</div>
-                                <div class="text-div">已填:<span class="font-bold text-green">3210</span>(份)</div>
-                                <div class="text-div">完成率:<span class="font-bold">30%</span></div>
-                            </div>
-                        </div>
-                    </div>
-                </n-gi>
-                <n-gi>
-                    <div class="hc-grid-card-box shadow-md">
-                        <div class="card-title font-bold">评定资料</div>
-                        <div class="card-body flex items-center">
-                            <div class="card-flex">
-                                <RoundChart/>
-                                <div class="text-num">30%</div>
-                            </div>
-                            <div class="card-flex-text flex-1">
-                                <div class="text-div">应填:<span class="font-bold text-blue">5210</span>(份)</div>
-                                <div class="text-div">已填:<span class="font-bold text-green">3210</span>(份)</div>
-                                <div class="text-div">完成率:<span class="font-bold">30%</span></div>
-                            </div>
-                        </div>
-                    </div>
-                </n-gi>
-                <n-gi>
-                    <div class="hc-grid-card-box shadow-md">
-                        <div class="card-title font-bold">中间交工</div>
-                        <div class="card-body flex items-center">
-                            <div class="card-flex">
-                                <RoundChart/>
-                                <div class="text-num">30%</div>
-                            </div>
-                            <div class="card-flex-text flex-1">
-                                <div class="text-div">应填:<span class="font-bold text-blue">5210</span>(份)</div>
-                                <div class="text-div">已填:<span class="font-bold text-green">3210</span>(份)</div>
-                                <div class="text-div">完成率:<span class="font-bold">30%</span></div>
-                            </div>
-                        </div>
-                    </div>
-                </n-gi>
-            </n-grid>
-        </div>
-
-        <div class="hc-chart-flex-box">
-            <n-grid x-gap="30" :cols="2">
-                <n-gi>
-                    <div class="hc-chart-flex-left">
-                        <div class="hc-chart-title font-bold">报表资料审批统计(总计:已审批<span class="text-green">36520</span>份)</div>
-                        <div class="hc-report-chart-box">
-                            <ReportChart/>
-                        </div>
-                    </div>
-                </n-gi>
-                <n-gi>
-                    <div class="hc-chart-flex-right">
-                        <div class="hc-chart-title font-bold">
-                            声像媒体资料统计
-                            <div class="hc-chart-btn-view">
-                                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_wbs_data?.textInfo" v-if="btn_wbs_data">
-                                    <template #trigger>
-                                        <n-button type="primary" strong secondary class="px-4" @click="toTableClick">查看WBS节点进度</n-button>
-                                    </template>
-                                    <span>{{btn_wbs_data?.textInfo}}</span>
-                                </n-popover>
-                            </div>
-                        </div>
-                        <div class="hc-report-chart-box">
-                            <MediaChart/>
-                        </div>
-                    </div>
-                </n-gi>
-            </n-grid>
-        </div>
-
+    <div>
+        内业资料进度
     </div>
 </template>
 
 <script setup>
-import {ref, watch} from "vue";
-import {useRoute} from 'vue-router'
-import router from '~src/router/index';
-import {useAppStore} from "~src/store/index";
-import RoundChart from "~com/echarts/RoundChart.vue"
-import ReportChart from "~com/echarts/ReportChart.vue"
-import MediaChart from "~com/echarts/MediaChart.vue"
-
-//初始变量
-const useRoutes = useRoute()
-const useAppState = useAppStore()
-
-const routerQuery = useRoutes?.query;
-const MenuBarKey = routerQuery?.MenuBarKey || '';
-
-//按钮气泡开关
-const bubbleVal = ref(useAppState.getBubble);
-
-//监听
-watch(() => [
-    useAppState.getBubble
-], ([Bubble]) => {
-    bubbleVal.value = Bubble
-})
-//获取气泡数据
-const getButtonsVal = (value) => {
-    return useAppState.getButtonsVal(value)
-}
-//气泡数据
-const btn_wbs_data = ref(getButtonsVal('schedule-wbs-data'))
 
-//查看WBS节点进度
-const toTableClick = () => {
-    router.push({
-        path: '/schedule/table',
-        query: {MenuBarKey: MenuBarKey}
-    })
-}
 </script>
 
 <style lang="scss" scoped>

+ 1 - 98
src/views/schedule/hc-table.vue

@@ -1,108 +1,11 @@
 <template>
-    <n-divider dashed title-placement="left">
-        <span class="text-hover" @click="toBackClick">内业资料进度</span>
-        <span class="ml-2">/</span>
-        <span class="ml-2">WBS进度</span>
-    </n-divider>
     <div class="hc-layout-box">
-        <n-card class="hc-card-overflow-p-box" :segmented="{content: true}">
-            <el-table :data="tableData" lazy :load="loadData" ref="multipleTable2" border height="100%" size="small" row-key="id" v-loading="tableLoading">
-                <el-table-column prop="name" label="节点名称"></el-table-column>
-                <el-table-column label="施工台账" align="center">
-                    <el-table-column prop="numlist.shigongweikaishi" label="未开始" align="center" width="80"></el-table-column>
-                    <el-table-column prop="numlist.shigongyiwancheng" label="已完成" align="center" width="80"></el-table-column>
-                </el-table-column>
-                <el-table-column label="工序资料" align="center">
-                    <el-table-column prop="numlist.weikaishi4" label="未开始" align="center" width="80"></el-table-column>
-                    <el-table-column prop="numlist.weishangbao4" label="未上报" align="center" width="80"></el-table-column>
-                    <el-table-column prop="numlist.daishenpi4" label="待审批" align="center" width="80"></el-table-column>
-                    <el-table-column prop="numlist.yishenpi4" label="已审批" align="center" width="80"></el-table-column>
-                </el-table-column>
-                <el-table-column label="质量评定" align="center">
-                    <el-table-column prop="numlist.weikaishi21" label="未开始" align="center" width="80"></el-table-column>
-                    <el-table-column prop="numlist.weishangbao21" label="未上报" align="center" width="80"></el-table-column>
-                    <el-table-column prop="numlist.daishenpi21" label="待审批" align="center" width="80"></el-table-column>
-                    <el-table-column prop="numlist.yishenpi21" label="已审批" align="center" width="80"></el-table-column>
-                </el-table-column>
-                <el-table-column label="中间交工" align="center">
-                    <el-table-column prop="numlist.weikaishi22" label="未开始" align="center" width="80"></el-table-column>
-                    <el-table-column prop="numlist.weishangbao22" label="未上报" align="center" width="80"></el-table-column>
-                    <el-table-column prop="numlist.daishenpi22" label="待审批" align="center" width="80"></el-table-column>
-                    <el-table-column prop="numlist.yishenpi22" label="已审批" align="center" width="80"></el-table-column>
-                </el-table-column>
-            </el-table>
-            <template #action>
-                <div class="text-center">
-                    <n-button type="primary" strong secondary class="px-4" @click="toBackClick">返回上一级</n-button>
-                </div>
-            </template>
-        </n-card>
+        内业资料进度
     </div>
 </template>
 
 <script setup>
-import {onMounted,ref,watch} from 'vue'
-import {useRoute} from 'vue-router'
-import router from '~src/router/index';
-import {useAppStore} from "~src/store/index";
 
-//初始变量
-const useRoutes = useRoute()
-const useAppState = useAppStore()
-const projectId = ref(useAppState.getProjectId);
-const contractId = ref(useAppState.getContractId);
-const projectInfo = ref(useAppState.getProjectInfo);
-
-const routerQuery = useRoutes?.query;
-const MenuBarKey = routerQuery?.MenuBarKey || '';
-
-const tableLoading = ref(false)
-
-//监听
-watch(() => [
-    useAppState.getProjectId,
-    useAppState.getContractId,
-    useAppState.getProjectInfo,
-], ([UserProjectId, UserContractId,UserProjectInfo]) => {
-    //项目合同数据
-    projectId.value = UserProjectId
-    contractId.value = UserContractId
-    projectInfo.value = UserProjectInfo
-})
-
-//渲染完成
-onMounted(() => {
-
-})
-
-const cacheData = ref([])
-const tableData = ref([])
-const loadData = (tree, treeNode, resolve) => {
-    let arr = [];
-    let tmpLevels = tree.levels;
-    let levelsArr = tmpLevels.split(",");
-    let tmp = null;
-    //level 是第几层
-    for (let i = 0; i < (treeNode.level+1); i++) {
-        if(i === 0){
-            tmp = cacheData.value[0].children;
-        }else{
-            tmp = tmp[Number(levelsArr[i])].children;
-        }
-    }
-    for (let i = 0; i < tmp.length; i++) {
-        arr.push(Object.assign({},tmp[i],{children:null,hasChildren:tmp[i].children.length > 0,levels:tmpLevels+','+i}));
-    }
-    resolve(arr)
-}
-
-//返回上级
-const toBackClick = () => {
-    router.push({
-        path: '/schedule/hc-data',
-        query: {MenuBarKey: MenuBarKey}
-    })
-}
 </script>
 
 <style lang="scss" scoped>

+ 1 - 95
src/views/schedule/write.vue

@@ -1,105 +1,11 @@
 <template>
-    <n-divider dashed title-placement="left">内外业进度</n-divider>
     <div class="hc-layout-box">
-        <div class="hc-layout-left-box" :style="'width:' + leftWidth + 'px;'">
-            <div class="hc-project-box">
-                <div class="text-xl text-cut project-alias-box">
-                    <i class="hcicon-xiangmu"/>
-                    <span class="ml-2">{{projectInfo['projectAlias']}}</span>
-                </div>
-                <div class="text-xs text-cut project-name">{{projectInfo['name']}}</div>
-            </div>
-            <div class="hc-el-tree-box">
-                <HcTree type="file-image-view" :params="treeParams" :props="wbsElTreeProps" lazy @node-click="nodeWbsElTreeClick"/>
-            </div>
-            <!--左右拖动-->
-            <div class="horizontal-drag-line" @mousedown="onmousedown"/>
-        </div>
-        <div class="hc-layout-content-box">
-            <n-card class="hc-card-overflow-p-box" :segmented="{content: true}">
-                <BarChart/>
-            </n-card>
-        </div>
+        内外业进度
     </div>
 </template>
 
 <script setup>
-import {onMounted,ref,watch} from 'vue'
-import {useAppStore} from "~src/store/index";
-import HcTree from "~com/plugins/element/HcTree.vue"
-import BarChart from "~com/echarts/BarChart.vue"
 
-//初始变量
-const useAppState = useAppStore()
-const projectId = ref(useAppState.getProjectId);
-const contractId = ref(useAppState.getContractId);
-const projectInfo = ref(useAppState.getProjectInfo);
-
-//按钮气泡开关
-const bubbleVal = ref(useAppState.getBubble);
-//监听
-watch(() => [
-    useAppState.getProjectId,
-    useAppState.getContractId,
-    useAppState.getProjectInfo,
-    useAppState.getBubble
-], ([UserProjectId,UserContractId,UserProjectInfo,Bubble]) => {
-    //项目合同数据
-    projectId.value = UserProjectId
-    contractId.value = UserContractId
-    projectInfo.value = UserProjectInfo
-    //按钮气泡开关
-    bubbleVal.value = Bubble
-})
-//获取气泡数据
-const getButtonsVal = (value) => {
-    return useAppState.getButtonsVal(value)
-}
-//气泡数据
-const btn_download = ref(getButtonsVal('project-scanning-download'))
-const btn_report = ref(getButtonsVal('project-scanning-report'))
-
-//搜索表单
-const searchForm = ref({projectId:projectId.value, contractId: contractId.value})
-
-const nodeItemInfo = ref({})
-const nodeDataInfo = ref({})
-
-//树形结构数据
-const wbsElTreeProps = {label: 'title', children: 'children', isLeaf: 'exsitChild'}
-const treeParams = ref({contractId: contractId.value})
-
-//树被点击
-const wbsNodeIdsStr = ref('')
-const nodeWbsElTreeClick = ({data,node}) => {
-    nodeItemInfo.value = node
-    nodeDataInfo.value = data
-    if (data.leaf === true) {
-        wbsNodeIdsStr.value = data?.primaryKeyId || ''
-    } else {
-
-    }
-}
-
-//渲染完成
-onMounted(() => {
-
-})
-
-//左右拖动,改变树形结构宽度
-const leftWidth = ref(382);
-const onmousedown = () => {
-    document.onmousemove = (ve) => {
-        let diffVal = ve.clientX + 2;
-        if (diffVal >= 310 && diffVal <= 900) {
-            leftWidth.value = diffVal;
-        }
-    }
-    document.onmouseup = () => {
-        document.onmousemove = null;
-        document.onmouseup = null;
-    }
-}
 </script>
 
 <style lang="scss" scoped>

+ 1 - 1
src/views/tasks/flow.vue

@@ -24,7 +24,7 @@
             </template>
         </HcCard>
         <!--新增/编辑流程 弹框-->
-        <el-dialog v-model="showEditModal" :title="`${flowFormData.id?'编辑':'新增'}流程`" width="47rem" custom-class="hc-modal-border">
+        <el-dialog v-model="showEditModal" :title="`${flowFormData.id?'编辑':'新增'}流程`" width="47rem" class="hc-modal-border">
             <el-form ref="formFlowRef" :model="flowFormData" :rules="formFlowRules" label-width="auto" size="large">
                 <el-form-item label="流程名称" prop="fixedFlowName">
                     <el-input v-model="flowFormData.fixedFlowName" placeholder="请输入流程名称"/>

+ 1 - 1
src/views/tasks/hc-data.vue

@@ -85,7 +85,7 @@
         </div>
         <!--任务审核-->
         <!--设置重签规则-->
-        <el-dialog v-model="showSetSignRulesModal" title="设置重签规则" width="38rem" custom-class="hc-modal-border">
+        <el-dialog v-model="showSetSignRulesModal" title="设置重签规则" width="38rem" class="hc-modal-border">
             <div class="text-orange mb-10">
                 <span class="mr-4">提示:设置默认时长,在任务被废除需要重签的时候,规定的重签上报时间提示时间段内,系统提示用户重签信息,但是超过处理时间,系统可默认自动授权重签</span>
                 <el-checkbox v-model="setPactVal" label="Option 1" size="large">

+ 0 - 67
src/views/test/index.vue

@@ -1,67 +0,0 @@
-<template>
-    <div>
-        测试
-    </div>
-</template>
-
-<script setup>
-import {ref,onMounted} from "vue";
-import wbsApi from "~api/data-fill/wbs"
-import {isType, utilsArray} from "vue-utils-plus"
-const {getObjValue,getArrValue} = isType()
-const { isItem } = utilsArray()
-
-const contractId = '1538759610948120577'
-const keys = ['1551394315475877907', '1551394315480072251', '1551394315475877982', '1551394315480072305', '1557182703722299392', '1557182703722299393']
-
-onMounted(() => {
-    getTreeOneLevel()
-})
-
-//首个获取
-const getTreeOneLevel = async () => {
-    const data = await queryMappingStructureTree({
-        contractId: contractId,
-        contractIdRelation: '',
-        parentId: '0',
-    })
-    const res = getObjValue(data[0])
-    //自动展开第二级
-    const children = await queryMappingStructureTree({
-        contractId: contractId,
-        contractIdRelation: res?.contractIdRelation,
-        parentId: res?.contractIdRelation ? res?.primaryKeyId: res?.id,
-    })
-    if (children.length > 0) {
-        await setTreeExpandKey(children, res)
-    }
-    console.log(res)
-}
-
-//设置自动展开
-const setTreeExpandKey = async (arr,res) => {
-    res.children = []
-    for (const item of arr) {
-        if (isItem(keys, item?.primaryKeyId)) {
-            const children = await queryMappingStructureTree({
-                contractId: contractId,
-                contractIdRelation: item?.contractIdRelation,
-                parentId: item?.contractIdRelation ? item?.primaryKeyId: item?.id,
-            })
-            if (children.length > 0) {
-                await setTreeExpandKey(children, item)
-            }
-        }
-        res.children.push(item)
-    }
-}
-
-//获取数据
-const queryMappingStructureTree = async (form) => {
-    const {data} = await wbsApi.queryMappingStructureTree({
-        ...form,
-        wbsType: 1
-    })
-    return getArrValue(data?.data)
-}
-</script>

+ 1 - 1
vite.config.js

@@ -37,7 +37,7 @@ export default defineConfig({
     ],
     server: {
         port: '3001',
-        host: '0.0.0.0',
+        //host: '0.0.0.0',
         proxy: {
             '/api': {
                 ws: true,

+ 224 - 356
yarn.lock

@@ -8,19 +8,9 @@
   integrity sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==
 
 "@babel/parser@^7.16.4":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539"
-  integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==
-
-"@css-render/plugin-bem@^0.15.10":
-  version "0.15.10"
-  resolved "https://registry.yarnpkg.com/@css-render/plugin-bem/-/plugin-bem-0.15.10.tgz#a42daf1089ad725743f6c77aa3cab969ae41b947"
-  integrity sha512-V7b08sM2PWJlXI7BJiVIa0Sg30H3u/jHay4AclNXfF2yRFwwb4ZJjggsMfzwj3WSihAdNf2WTqvOU5qsOD80Dg==
-
-"@css-render/vue3-ssr@^0.15.10":
-  version "0.15.10"
-  resolved "https://registry.yarnpkg.com/@css-render/vue3-ssr/-/vue3-ssr-0.15.10.tgz#0a5f58e8480b3e125f0667137b33217eee0b8f95"
-  integrity sha512-keGKnkB2nyVGoA8GezMKNsmvTGXEzgLOGGlgshwOTSEzd1dsROyZ2m/khJ9jV5zbzDM4rWeAWbWF0zwHemsJcw==
+  version "7.18.13"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.13.tgz#5b2dd21cae4a2c5145f1fbd8ca103f9313d3b7e4"
+  integrity sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==
 
 "@ctrl/tinycolor@^3.4.1":
   version "3.4.1"
@@ -28,31 +18,26 @@
   integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==
 
 "@element-plus/icons-vue@^2.0.6":
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/@element-plus/icons-vue/-/icons-vue-2.0.6.tgz#8490e7a3193c17515d10c3be0544d800afe6a228"
-  integrity sha512-lPpG8hYkjL/Z97DH5Ei6w6o22Z4YdNglWCNYOPcB33JCF2A4wye6HFgSI7hEt9zdLyxlSpiqtgf9XcYU+m5mew==
+  version "2.0.9"
+  resolved "https://registry.yarnpkg.com/@element-plus/icons-vue/-/icons-vue-2.0.9.tgz#b7777c57534522e387303d194451d50ff549d49a"
+  integrity sha512-okdrwiVeKBmW41Hkl0eMrXDjzJwhQMuKiBOu17rOszqM+LS/yBYpNQNV5Jvoh06Wc+89fMmb/uhzf8NZuDuUaQ==
 
-"@emotion/hash@~0.8.0":
-  version "0.8.0"
-  resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
-  integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
+"@esbuild/linux-loong64@0.14.54":
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028"
+  integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==
 
-"@floating-ui/core@^0.7.3":
-  version "0.7.3"
-  resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-0.7.3.tgz#d274116678ffae87f6b60e90f88cc4083eefab86"
-  integrity sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==
+"@floating-ui/core@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.0.1.tgz#00e64d74e911602c8533957af0cce5af6b2e93c8"
+  integrity sha512-bO37brCPfteXQfFY0DyNDGB3+IMe4j150KFQcgJ5aBP295p9nBGeHEs/p0czrRbtlHq4Px/yoPXO/+dOCcF4uA==
 
-"@floating-ui/dom@^0.5.4":
-  version "0.5.4"
-  resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-0.5.4.tgz#4eae73f78bcd4bd553ae2ade30e6f1f9c73fe3f1"
-  integrity sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==
+"@floating-ui/dom@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.0.1.tgz#3321d4e799d6ac2503e729131d07ad0e714aabeb"
+  integrity sha512-wBDiLUKWU8QNPNOTAFHiIAkBv1KlHauG2AhqjSeh2H+wR8PX+AArXfz8NkRexH5PgMJMmSOS70YS89AbWYh5dA==
   dependencies:
-    "@floating-ui/core" "^0.7.3"
-
-"@juggle/resize-observer@^3.3.1":
-  version "3.3.1"
-  resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.3.1.tgz#b50a781709c81e10701004214340f25475a171a0"
-  integrity sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==
+    "@floating-ui/core" "^1.0.1"
 
 "@nodelib/fs.scandir@2.1.5":
   version "2.1.5"
@@ -95,15 +80,10 @@
   dependencies:
     "@types/lodash" "*"
 
-"@types/lodash@*", "@types/lodash@^4.14.181", "@types/lodash@^4.14.182":
-  version "4.14.182"
-  resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2"
-  integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==
-
-"@types/node@~17.0.5":
-  version "17.0.45"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190"
-  integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==
+"@types/lodash@*", "@types/lodash@^4.14.182":
+  version "4.14.184"
+  resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.184.tgz#23f96cd2a21a28e106dc24d825d4aa966de7a9fe"
+  integrity sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==
 
 "@types/web-bluetooth@^0.0.15":
   version "0.0.15"
@@ -211,24 +191,24 @@
   integrity sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==
 
 "@vueuse/core@^9.1.0":
-  version "9.1.0"
-  resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.1.0.tgz#f0fb13fd99768c0eb617169a2d2c1cbd5f5a52eb"
-  integrity sha512-BIroqvXEqt826aE9r3K5cox1zobuPuAzdYJ36kouC2TVhlXvFKIILgFVWrpp9HZPwB3aLzasmG3K87q7TSyXZg==
+  version "9.1.1"
+  resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.1.1.tgz#a5c09c33ccee58cfd53bc3ec2d5a0d304155529e"
+  integrity sha512-QfuaNWRDMQcCUwXylCyYhPC3ScS9Tiiz4J0chdwr3vOemBwRToSywq8MP+ZegKYFnbETzRY8G/5zC+ca30wrRQ==
   dependencies:
     "@types/web-bluetooth" "^0.0.15"
-    "@vueuse/metadata" "9.1.0"
-    "@vueuse/shared" "9.1.0"
+    "@vueuse/metadata" "9.1.1"
+    "@vueuse/shared" "9.1.1"
     vue-demi "*"
 
-"@vueuse/metadata@9.1.0":
-  version "9.1.0"
-  resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.1.0.tgz#194d4bd47f7acb91e348c0f436e678ddf7ee235b"
-  integrity sha512-8OEhlog1iaAGTD3LICZ8oBGQdYeMwByvXetOtAOZCJOzyCRSwqwdggTsmVZZ1rkgYIEqgUBk942AsAPwM21s6A==
+"@vueuse/metadata@9.1.1":
+  version "9.1.1"
+  resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.1.1.tgz#b3fe4b97e62096f7566cd8eb107c503998b2c9a6"
+  integrity sha512-XZ2KtSW+85LLHB/IdGILPAtbIVHasPsAW7aqz3BRMzJdAQWRiM/FGa1OKBwLbXtUw/AmjKYFlZJo7eOFIBXRog==
 
-"@vueuse/shared@9.1.0":
-  version "9.1.0"
-  resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.1.0.tgz#d8459a45324f32fb05a2a56ed754637c3d0efaeb"
-  integrity sha512-pB/3njQu4tfJJ78ajELNda0yMG6lKfpToQW7Soe09CprF1k3QuyoNi1tBNvo75wBDJWD+LOnr+c4B5HZ39jY/Q==
+"@vueuse/shared@9.1.1":
+  version "9.1.1"
+  resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.1.1.tgz#811f47629e281a19013ae6dcdf11ed3e1e91e023"
+  integrity sha512-c+IfcOYmHiHqoEa3ED1Tbpue5GHmoUmTp8PtO4YbczthtY155Rt6DmWhjxMLXBF1Bcidagxljmp/7xtAzEHXLw==
   dependencies:
     vue-demi "*"
 
@@ -269,7 +249,7 @@ arg@^5.0.2:
   resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
   integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
 
-async-validator@^4.0.7, async-validator@^4.2.5:
+async-validator@^4.2.5:
   version "4.2.5"
   resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339"
   integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
@@ -344,9 +324,9 @@ camelcase-css@^2.0.1:
   integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
 
 caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001373:
-  version "1.0.30001373"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz#2dc3bc3bfcb5d5a929bec11300883040d7b4b4be"
-  integrity sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==
+  version "1.0.30001390"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001390.tgz#158a43011e7068ef7fc73590e9fd91a7cece5e7f"
+  integrity sha512-sS4CaUM+/+vqQUlCvCJ2WtDlV81aWtHhqeEVkLokVJJa3ViN4zDxAGfq9R8i1m90uGHxo99cy10Od+lvn3hf0g==
 
 "chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3:
   version "3.5.3"
@@ -363,6 +343,11 @@ caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001373:
   optionalDependencies:
     fsevents "~2.3.2"
 
+click-outside-vue3@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/click-outside-vue3/-/click-outside-vue3-4.0.1.tgz#81a6ac01696b301764b42db6fdbdf28e7cd8ef95"
+  integrity sha512-sbplNecrup5oGqA3o4bo8XmvHRT6q9fvw21Z67aDbTqB9M6LF7CuYLTlLvNtOgKU6W3zst5H5zJuEh4auqA34g==
+
 color-name@^1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
@@ -387,15 +372,6 @@ css-line-break@^2.1.0:
   dependencies:
     utrie "^1.0.2"
 
-css-render@^0.15.10:
-  version "0.15.10"
-  resolved "https://registry.yarnpkg.com/css-render/-/css-render-0.15.10.tgz#a0f2c7e119597a47cd0b0c9055a85a78ec313db4"
-  integrity sha512-6j5acvm81sXTHJiF47FNNICtDpF74YoWk1xEK3qQvdqgW6vc+OXrPqflL6m8f5GE6XuFYrbACNEd17kraCSBAQ==
-  dependencies:
-    "@emotion/hash" "~0.8.0"
-    "@types/node" "~17.0.5"
-    csstype "~3.0.5"
-
 cssesc@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
@@ -406,25 +382,10 @@ csstype@^2.6.8:
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.20.tgz#9229c65ea0b260cf4d3d997cb06288e36a8d6dda"
   integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==
 
-csstype@~3.0.5:
-  version "3.0.11"
-  resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33"
-  integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==
-
-date-fns-tz@^1.3.3:
-  version "1.3.6"
-  resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.3.6.tgz#4195a58a2f86eda55ea69fb477f3ed8a6e2188ac"
-  integrity sha512-C8q7mErvG4INw1ZwAFmPlGjEo5Sv4udjKVbTc03zpP9cu6cp5AemFzKhz0V68LGcWEtX5mJudzzg3G04emIxLA==
-
-date-fns@^2.28.0:
-  version "2.29.1"
-  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.1.tgz#9667c2615525e552b5135a3116b95b1961456e60"
-  integrity sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw==
-
 dayjs@^1.11.3:
-  version "1.11.4"
-  resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.4.tgz#3b3c10ca378140d8917e06ebc13a4922af4f433e"
-  integrity sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==
+  version "1.11.5"
+  resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.5.tgz#00e8cc627f231f9499c19b38af49f56dc0ac5e93"
+  integrity sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==
 
 debug@^4.3.4:
   version "4.3.4"
@@ -471,18 +432,18 @@ echarts@^5.3.3:
     zrender "5.3.2"
 
 electron-to-chromium@^1.4.202:
-  version "1.4.206"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz#580ff85b54d7ec0c05f20b1e37ea0becdd7b0ee4"
-  integrity sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==
+  version "1.4.241"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.241.tgz#5aa03ab94db590d8269f4518157c24b1efad34d6"
+  integrity sha512-e7Wsh4ilaioBZ5bMm6+F4V5c11dh56/5Jwz7Hl5Tu1J7cnB+Pqx5qIF2iC7HPpfyQMqGSvvLP5bBAIDd2gAtGw==
 
-element-plus@^2.2.15:
-  version "2.2.15"
-  resolved "https://registry.yarnpkg.com/element-plus/-/element-plus-2.2.15.tgz#862bb6ecbd15b2d82d79dcf56bbbc30010771132"
-  integrity sha512-SMIx8xKB1YawT9JocyFhbs3Av2rXFfxrCVTLMYS0DK0xnW+fKvwjZngLfwF6MyRzXIuzNW17XFtu0iP3tlJHbA==
+element-plus@^2.2.16:
+  version "2.2.16"
+  resolved "https://registry.yarnpkg.com/element-plus/-/element-plus-2.2.16.tgz#84c00fc4a2d84031ec18d0f28820593c6e451513"
+  integrity sha512-rvaTMFIujec9YDC5lyaiQv2XVUCHuhVDq2k+9vQxP78N8Wd07iEOGa9pvEVOO2uYc75l4rSl2RE/IWPH/6Mdzw==
   dependencies:
     "@ctrl/tinycolor" "^3.4.1"
     "@element-plus/icons-vue" "^2.0.6"
-    "@floating-ui/dom" "^0.5.4"
+    "@floating-ui/dom" "^1.0.1"
     "@popperjs/core" "npm:@sxzz/popperjs-es@^2.11.7"
     "@types/lodash" "^4.14.182"
     "@types/lodash-es" "^4.17.6"
@@ -496,131 +457,132 @@ element-plus@^2.2.15:
     memoize-one "^6.0.0"
     normalize-wheel-es "^1.2.0"
 
-esbuild-android-64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.51.tgz#414a087cb0de8db1e347ecca6c8320513de433db"
-  integrity sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==
-
-esbuild-android-arm64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.51.tgz#55de3bce2aab72bcd2b606da4318ad00fb9c8151"
-  integrity sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==
-
-esbuild-darwin-64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.51.tgz#4259f23ed6b4cea2ec8a28d87b7fb9801f093754"
-  integrity sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==
-
-esbuild-darwin-arm64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.51.tgz#d77b4366a71d84e530ba019d540b538b295d494a"
-  integrity sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==
-
-esbuild-freebsd-64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.51.tgz#27b6587b3639f10519c65e07219d249b01f2ad38"
-  integrity sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==
-
-esbuild-freebsd-arm64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.51.tgz#63c435917e566808c71fafddc600aca4d78be1ec"
-  integrity sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==
-
-esbuild-linux-32@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.51.tgz#c3da774143a37e7f11559b9369d98f11f997a5d9"
-  integrity sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==
-
-esbuild-linux-64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.51.tgz#5d92b67f674e02ae0b4a9de9a757ba482115c4ae"
-  integrity sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==
-
-esbuild-linux-arm64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.51.tgz#dac84740516e859d8b14e1ecc478dd5241b10c93"
-  integrity sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==
-
-esbuild-linux-arm@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.51.tgz#b3ae7000696cd53ed95b2b458554ff543a60e106"
-  integrity sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==
-
-esbuild-linux-mips64le@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.51.tgz#dad10770fac94efa092b5a0643821c955a9dd385"
-  integrity sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==
-
-esbuild-linux-ppc64le@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.51.tgz#b68c2f8294d012a16a88073d67e976edd4850ae0"
-  integrity sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==
-
-esbuild-linux-riscv64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.51.tgz#608a318b8697123e44c1e185cdf6708e3df50b93"
-  integrity sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==
-
-esbuild-linux-s390x@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.51.tgz#c9e7791170a3295dba79b93aa452beb9838a8625"
-  integrity sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==
-
-esbuild-netbsd-64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.51.tgz#0abd40b8c2e37fda6f5cc41a04cb2b690823d891"
-  integrity sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==
-
-esbuild-openbsd-64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.51.tgz#4adba0b7ea7eb1428bb00d8e94c199a949b130e8"
-  integrity sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==
-
-esbuild-sunos-64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.51.tgz#4b8a6d97dfedda30a6e39607393c5c90ebf63891"
-  integrity sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==
-
-esbuild-windows-32@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.51.tgz#d31d8ca0c1d314fb1edea163685a423b62e9ac17"
-  integrity sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==
-
-esbuild-windows-64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.51.tgz#7d3c09c8652d222925625637bdc7e6c223e0085d"
-  integrity sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==
-
-esbuild-windows-arm64@0.14.51:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.51.tgz#0220d2304bfdc11bc27e19b2aaf56edf183e4ae9"
-  integrity sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==
+esbuild-android-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be"
+  integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==
+
+esbuild-android-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771"
+  integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==
+
+esbuild-darwin-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25"
+  integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==
+
+esbuild-darwin-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73"
+  integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==
+
+esbuild-freebsd-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d"
+  integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==
+
+esbuild-freebsd-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48"
+  integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==
+
+esbuild-linux-32@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5"
+  integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==
+
+esbuild-linux-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652"
+  integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==
+
+esbuild-linux-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b"
+  integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==
+
+esbuild-linux-arm@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59"
+  integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==
+
+esbuild-linux-mips64le@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34"
+  integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==
+
+esbuild-linux-ppc64le@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e"
+  integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==
+
+esbuild-linux-riscv64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8"
+  integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==
+
+esbuild-linux-s390x@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6"
+  integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==
+
+esbuild-netbsd-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81"
+  integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==
+
+esbuild-openbsd-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b"
+  integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==
+
+esbuild-sunos-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da"
+  integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==
+
+esbuild-windows-32@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31"
+  integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==
+
+esbuild-windows-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4"
+  integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==
+
+esbuild-windows-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982"
+  integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==
 
 esbuild@^0.14.47:
-  version "0.14.51"
-  resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.51.tgz#1c8ecbc8db3710da03776211dc3ee3448f7aa51e"
-  integrity sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==
+  version "0.14.54"
+  resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2"
+  integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==
   optionalDependencies:
-    esbuild-android-64 "0.14.51"
-    esbuild-android-arm64 "0.14.51"
-    esbuild-darwin-64 "0.14.51"
-    esbuild-darwin-arm64 "0.14.51"
-    esbuild-freebsd-64 "0.14.51"
-    esbuild-freebsd-arm64 "0.14.51"
-    esbuild-linux-32 "0.14.51"
-    esbuild-linux-64 "0.14.51"
-    esbuild-linux-arm "0.14.51"
-    esbuild-linux-arm64 "0.14.51"
-    esbuild-linux-mips64le "0.14.51"
-    esbuild-linux-ppc64le "0.14.51"
-    esbuild-linux-riscv64 "0.14.51"
-    esbuild-linux-s390x "0.14.51"
-    esbuild-netbsd-64 "0.14.51"
-    esbuild-openbsd-64 "0.14.51"
-    esbuild-sunos-64 "0.14.51"
-    esbuild-windows-32 "0.14.51"
-    esbuild-windows-64 "0.14.51"
-    esbuild-windows-arm64 "0.14.51"
+    "@esbuild/linux-loong64" "0.14.54"
+    esbuild-android-64 "0.14.54"
+    esbuild-android-arm64 "0.14.54"
+    esbuild-darwin-64 "0.14.54"
+    esbuild-darwin-arm64 "0.14.54"
+    esbuild-freebsd-64 "0.14.54"
+    esbuild-freebsd-arm64 "0.14.54"
+    esbuild-linux-32 "0.14.54"
+    esbuild-linux-64 "0.14.54"
+    esbuild-linux-arm "0.14.54"
+    esbuild-linux-arm64 "0.14.54"
+    esbuild-linux-mips64le "0.14.54"
+    esbuild-linux-ppc64le "0.14.54"
+    esbuild-linux-riscv64 "0.14.54"
+    esbuild-linux-s390x "0.14.54"
+    esbuild-netbsd-64 "0.14.54"
+    esbuild-openbsd-64 "0.14.54"
+    esbuild-sunos-64 "0.14.54"
+    esbuild-windows-32 "0.14.54"
+    esbuild-windows-64 "0.14.54"
+    esbuild-windows-arm64 "0.14.54"
 
 escalade@^3.1.1:
   version "3.1.1"
@@ -643,11 +605,6 @@ estree-walker@^2.0.1, estree-walker@^2.0.2:
   integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
 
 evtd@^0.2.2:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/evtd/-/evtd-0.2.3.tgz#185158d533b4440ee831a0fa0cffde16e8bda504"
-  integrity sha512-tmiT1YUVqFjTY+BSBOAskL83xNx41iUfpvKP6Gcd/xMHjg3mnER98jXGXJyKnxCG19uPc6EhZiUC+MUyvoqCtw==
-
-evtd@^0.2.4:
   version "0.2.4"
   resolved "https://registry.yarnpkg.com/evtd/-/evtd-0.2.4.tgz#0aac39ba44d6926e6668948ac27618e0795b9d07"
   integrity sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==
@@ -727,11 +684,6 @@ has@^1.0.3:
   dependencies:
     function-bind "^1.1.1"
 
-highlight.js@^11.5.0:
-  version "11.6.0"
-  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.6.0.tgz#a50e9da05763f1bb0c1322c8f4f755242cff3f5a"
-  integrity sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw==
-
 html2canvas@^1.0.0-rc.7:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543"
@@ -753,9 +705,9 @@ is-binary-path@~2.1.0:
     binary-extensions "^2.0.0"
 
 is-core-module@^2.9.0:
-  version "2.9.0"
-  resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
-  integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
+  version "2.10.0"
+  resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed"
+  integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==
   dependencies:
     has "^1.0.3"
 
@@ -798,10 +750,10 @@ js-web-screen-shot@^1.7.3:
   dependencies:
     html2canvas "^1.0.0-rc.7"
 
-jsonc-parser@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.1.0.tgz#73b8f0e5c940b83d03476bc2e51a20ef0932615d"
-  integrity sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==
+jsonc-parser@^3.1.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76"
+  integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==
 
 lilconfig@^2.0.5, lilconfig@^2.0.6:
   version "2.0.6"
@@ -836,9 +788,9 @@ magic-string@^0.25.7:
     sourcemap-codec "^1.4.8"
 
 magic-string@^0.26.2:
-  version "0.26.2"
-  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.2.tgz#5331700e4158cd6befda738bb6b0c7b93c0d4432"
-  integrity sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==
+  version "0.26.3"
+  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.3.tgz#25840b875140f7b4785ab06bddc384270b7dd452"
+  integrity sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==
   dependencies:
     sourcemap-codec "^1.4.8"
 
@@ -884,22 +836,15 @@ minimist@^1.2.6:
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
   integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
 
-mlly@^0.5.3:
-  version "0.5.5"
-  resolved "https://registry.yarnpkg.com/mlly/-/mlly-0.5.5.tgz#80643b3a96671a0d6f41411e3daf7e4e188544d5"
-  integrity sha512-2R4JT/SxRDPexomw4rmHYY/gWAGmL9Kkq1OR76Ua6w+P340a1aBDTWzKo2kAlxzrG82OdXs5VB9Lmcmyit0Obg==
-  dependencies:
-    pathe "^0.3.2"
-    pkg-types "^0.3.3"
-
-mlly@^0.5.7:
-  version "0.5.7"
-  resolved "https://registry.yarnpkg.com/mlly/-/mlly-0.5.7.tgz#3b058c36268314a1670f89767d40eead66099b93"
-  integrity sha512-rz+n2i9862ymLH+UDlHpsuTVyCIAs+9WejS2De2VUlAKdpq8OJ9x/C2M7nNUMLEW1H+D6n0uZlpz8+tMGxCmyQ==
+mlly@^0.5.13, mlly@^0.5.7:
+  version "0.5.14"
+  resolved "https://registry.yarnpkg.com/mlly/-/mlly-0.5.14.tgz#1aead555f8ffafd29f192676f4697805e25112c3"
+  integrity sha512-DgRgNUSX9NIxxCxygX4Xeg9C7GX7OUx1wuQ8cXx9o9LE0e9wrH+OZ9fcnrlEedsC/rtqry3ZhUddC759XD/L0w==
   dependencies:
     acorn "^8.8.0"
-    pathe "^0.3.3"
-    pkg-types "^0.3.3"
+    pathe "^0.3.5"
+    pkg-types "^0.3.4"
+    ufo "^0.8.5"
 
 moment@^2.29.4:
   version "2.29.4"
@@ -911,29 +856,6 @@ ms@2.1.2:
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
 
-naive-ui@^2.33.2:
-  version "2.33.2"
-  resolved "https://registry.yarnpkg.com/naive-ui/-/naive-ui-2.33.2.tgz#c74e8b7c944f6af18cd850bd640f6d3485a47f05"
-  integrity sha512-XT18dOE7dK15xedO9MlrPsD3AXBKncr0lqlsxakHl/DckqOaAbdA7yxDl/qtVTBC+1Rlf29cFP/th7P7DSy5zg==
-  dependencies:
-    "@css-render/plugin-bem" "^0.15.10"
-    "@css-render/vue3-ssr" "^0.15.10"
-    "@types/lodash" "^4.14.181"
-    "@types/lodash-es" "^4.17.6"
-    async-validator "^4.0.7"
-    css-render "^0.15.10"
-    date-fns "^2.28.0"
-    date-fns-tz "^1.3.3"
-    evtd "^0.2.4"
-    highlight.js "^11.5.0"
-    lodash "^4.17.21"
-    lodash-es "^4.17.21"
-    seemly "^0.3.6"
-    treemate "^0.3.11"
-    vdirs "^0.1.8"
-    vooks "^0.2.12"
-    vueuc "^0.4.47"
-
 nanoid@^3.3.4:
   version "3.3.4"
   resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
@@ -974,15 +896,10 @@ path-parse@^1.0.7:
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
   integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
 
-pathe@^0.3.0, pathe@^0.3.2:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/pathe/-/pathe-0.3.2.tgz#016345ed643027404d7a9ed8d1454ad997a1483a"
-  integrity sha512-qhnmX0TOqlCvdWWTkoM83wh5J8fZ2yhbDEc9MlsnAEtEc+JCwxUKEwmd6pkY9hRe6JR1Uecbc14VcAKX2yFSTA==
-
-pathe@^0.3.3:
-  version "0.3.3"
-  resolved "https://registry.yarnpkg.com/pathe/-/pathe-0.3.3.tgz#8d6d70a25d4db6024ed4d59e59c1bf80fcf18753"
-  integrity sha512-x3nrPvG0HDSDzUiJ0WqtzhN4MD+h5B+dFJ3/qyxVuARlr4Y3aJv8gri2cZzp9Z8sGs2a+aG9gNbKngh3gme57A==
+pathe@^0.3.3, pathe@^0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/pathe/-/pathe-0.3.5.tgz#87e5c1164ded1bebeb9dea5dab63563144062303"
+  integrity sha512-grU/QeYP0ChuE5kjU2/k8VtAeODzbernHlue0gTa27+ayGIu3wqYBIPGfP9r5xSqgCgDd4nWrjKXEfxMillByg==
 
 picocolors@^1.0.0:
   version "1.0.0"
@@ -1007,14 +924,14 @@ pinia@^2.0.21:
     "@vue/devtools-api" "^6.2.1"
     vue-demi "*"
 
-pkg-types@^0.3.3:
-  version "0.3.3"
-  resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-0.3.3.tgz#3c25e45274e1c586ec7811dcc3449afde846e463"
-  integrity sha512-6AJcCMnjUQPQv/Wk960w0TOmjhdjbeaQJoSKWRQv9N3rgkessCu6J0Ydsog/nw1MbpnxHuPzYbfOn2KmlZO1FA==
+pkg-types@^0.3.4:
+  version "0.3.4"
+  resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-0.3.4.tgz#bafb9ce824f78c93e50aaafb5accf41d8f2ef92f"
+  integrity sha512-s214f/xkRpwlwVBToWq9Mu0XlU3HhZMYCnr2var8+jjbavBHh/VCh4pBLsJW29rJ//B1jb4HlpMIaNIMH+W2/w==
   dependencies:
-    jsonc-parser "^3.0.0"
-    mlly "^0.5.3"
-    pathe "^0.3.0"
+    jsonc-parser "^3.1.0"
+    mlly "^0.5.13"
+    pathe "^0.3.5"
 
 postcss-import@^14.1.0:
   version "14.1.0"
@@ -1060,16 +977,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
   integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
 
-postcss@^8.1.10, postcss@^8.4.14:
-  version "8.4.14"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf"
-  integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==
-  dependencies:
-    nanoid "^3.3.4"
-    picocolors "^1.0.0"
-    source-map-js "^1.0.2"
-
-postcss@^8.4.16:
+postcss@^8.1.10, postcss@^8.4.14, postcss@^8.4.16:
   version "8.4.16"
   resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c"
   integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==
@@ -1149,16 +1057,6 @@ scule@^0.3.2:
   resolved "https://registry.yarnpkg.com/scule/-/scule-0.3.2.tgz#472445cecd8357165a94a067f78cee40e700b596"
   integrity sha512-zIvPdjOH8fv8CgrPT5eqtxHQXmPNnV/vHJYffZhE43KZkvULvpCTvOt1HPlFaCZx287INL9qaqrZg34e8NgI4g==
 
-seemly@^0.3.1:
-  version "0.3.5"
-  resolved "https://registry.yarnpkg.com/seemly/-/seemly-0.3.5.tgz#7f680d1b8f9ecdfbd6358d62c72b9af10a485b3d"
-  integrity sha512-Z0QAytAEpkAeWbQZBQ+zb+9YYn86+AFBdWA4y7FwFtJ+ZcIO55QEVdT0sJ0DxuX8FWD4UTuwaftz/UX+MmHlhw==
-
-seemly@^0.3.6:
-  version "0.3.6"
-  resolved "https://registry.yarnpkg.com/seemly/-/seemly-0.3.6.tgz#7ef97e8083dea00804965e2662f572a5df9cb18e"
-  integrity sha512-lEV5VB8BUKTo/AfktXJcy+JeXns26ylbMkIUco8CYREsQijuz4mrXres2Q+vMLdwkuLxJdIPQ8IlCIxLYm71Yw==
-
 sortablejs@1.14.0:
   version "1.14.0"
   resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.14.0.tgz#6d2e17ccbdb25f464734df621d4f35d4ab35b3d8"
@@ -1233,16 +1131,16 @@ to-regex-range@^5.0.1:
   dependencies:
     is-number "^7.0.0"
 
-treemate@^0.3.11:
-  version "0.3.11"
-  resolved "https://registry.yarnpkg.com/treemate/-/treemate-0.3.11.tgz#7d52f8f69ab9ce326f8d139e0a3d1ffb25e48222"
-  integrity sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==
-
 tslib@2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e"
   integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
 
+ufo@^0.8.5:
+  version "0.8.5"
+  resolved "https://registry.yarnpkg.com/ufo/-/ufo-0.8.5.tgz#e367b4205ece9d9723f2fa54f887d43ed1bce5d0"
+  integrity sha512-e4+UtA5IRO+ha6hYklwj6r7BjiGMxS0O+UaSg9HbaTefg4kMkzj4tXzEBajRR+wkxf+golgAWKzLbytCUDMJAA==
+
 unimport@^0.6.7:
   version "0.6.7"
   resolved "https://registry.yarnpkg.com/unimport/-/unimport-0.6.7.tgz#7b2e2063b88ee8ea363d2d751f7c82a6960beac3"
@@ -1287,20 +1185,10 @@ unplugin-vue-components@^0.22.4:
     resolve "^1.22.1"
     unplugin "^0.9.0"
 
-unplugin@^0.9.0:
-  version "0.9.0"
-  resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-0.9.0.tgz#ebad287d61aa1b1f16de60feea74e8dd12224819"
-  integrity sha512-6o7q8Y9yxdPi5yCPmRuFfeNnVzGumRNZSK6hIkvZ6hd0cfigVdm0qBx/GgQ/NEjs54eUV1qTjvMYKRs9yh3rzw==
-  dependencies:
-    acorn "^8.8.0"
-    chokidar "^3.5.3"
-    webpack-sources "^3.2.3"
-    webpack-virtual-modules "^0.4.4"
-
-unplugin@^0.9.3:
-  version "0.9.3"
-  resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-0.9.3.tgz#baeec1e3d70d18f693597ef3fcc441779e164e7f"
-  integrity sha512-GWXxizZG+tobNs8fuGTCeilerkkfZTZax2iivuE4pxLaF9wTnPJHOq8tbLKDb5ohVb+2BXNjrU9xx59yWTUnuw==
+unplugin@^0.9.0, unplugin@^0.9.3:
+  version "0.9.5"
+  resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-0.9.5.tgz#2e546c044e0631e699ebd6fb521eeb7bbcb8899f"
+  integrity sha512-luraheyfxwtvkvHpsOvMNv7IjLdORTWKZp0gWYNHGLi2ImON3iIZOj464qEyyEwLA/EMt12fC415HW9zRpOfTg==
   dependencies:
     acorn "^8.8.0"
     chokidar "^3.5.3"
@@ -1308,9 +1196,9 @@ unplugin@^0.9.3:
     webpack-virtual-modules "^0.4.4"
 
 update-browserslist-db@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38"
-  integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz#16279639cff1d0f800b14792de43d97df2d11b7d"
+  integrity sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==
   dependencies:
     escalade "^3.1.1"
     picocolors "^1.0.0"
@@ -1327,13 +1215,6 @@ utrie@^1.0.2:
   dependencies:
     base64-arraybuffer "^1.0.2"
 
-vdirs@^0.1.4, vdirs@^0.1.8:
-  version "0.1.8"
-  resolved "https://registry.yarnpkg.com/vdirs/-/vdirs-0.1.8.tgz#a103bc43baca738f8dea912a7e9737154a19dbc2"
-  integrity sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==
-  dependencies:
-    evtd "^0.2.2"
-
 vfonts@^0.0.3:
   version "0.0.3"
   resolved "https://registry.yarnpkg.com/vfonts/-/vfonts-0.0.3.tgz#999d66fecea18efee3f2b966c81101ae8ce01a29"
@@ -1351,7 +1232,7 @@ vite@^3.0.9:
   optionalDependencies:
     fsevents "~2.3.2"
 
-vooks@^0.2.12, vooks@^0.2.4:
+vooks@^0.2.12:
   version "0.2.12"
   resolved "https://registry.yarnpkg.com/vooks/-/vooks-0.2.12.tgz#2b6e23330b77bac81c7f7a344c4ca3e9f4f6c373"
   integrity sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==
@@ -1359,9 +1240,9 @@ vooks@^0.2.12, vooks@^0.2.4:
     evtd "^0.2.2"
 
 vue-demi@*:
-  version "0.13.6"
-  resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.13.6.tgz#f9433cbd75e68a970dec066647f4ba6c08ced48f"
-  integrity sha512-02NYpxgyGE2kKGegRPYlNQSL1UWfA/+JqvzhGCOYjhfbLWXU5QQX0+9pAm/R2sCOPKr5NBxVIab7fvFU0B1RxQ==
+  version "0.13.11"
+  resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.13.11.tgz#7d90369bdae8974d87b1973564ad390182410d99"
+  integrity sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==
 
 vue-router@^4.1.5:
   version "4.1.5"
@@ -1393,19 +1274,6 @@ vuedraggable@^4.1.0:
   dependencies:
     sortablejs "1.14.0"
 
-vueuc@^0.4.47:
-  version "0.4.47"
-  resolved "https://registry.yarnpkg.com/vueuc/-/vueuc-0.4.47.tgz#b6395f09a3b8a70a0d5a75040152f61af00f8e7b"
-  integrity sha512-lBxGeTWLFp0O36SlcAeBrh29dxE/GboOH/0eUJhocUuE9DRrzUcVmwGau7v7ZWsxjivjJC3Qup7l9sCyA3it+g==
-  dependencies:
-    "@css-render/vue3-ssr" "^0.15.10"
-    "@juggle/resize-observer" "^3.3.1"
-    css-render "^0.15.10"
-    evtd "^0.2.2"
-    seemly "^0.3.1"
-    vdirs "^0.1.4"
-    vooks "^0.2.4"
-
 webpack-sources@^3.2.3:
   version "3.2.3"
   resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"