iZaiZaiA 2 лет назад
Родитель
Сommit
d16eca57d5

+ 6 - 6
package.json

@@ -16,21 +16,21 @@
         "js-md5": "^0.7.3",
         "js-web-screen-shot": "^1.7.3",
         "moment": "^2.29.4",
-        "naive-ui": "^2.32.2",
-        "pinia": "^2.0.20",
+        "naive-ui": "^2.33.2",
+        "pinia": "^2.0.21",
         "remixicon": "^2.5.0",
-        "vue": "^3.2.37",
-        "vue-router": "^4.1.4",
+        "vue": "^3.2.38",
+        "vue-router": "^4.1.5",
         "vue-utils-plus": "^1.0.2",
         "vuedraggable": "^4.1.0"
     },
     "devDependencies": {
         "@vitejs/plugin-vue": "^3.0.3",
-        "@vue/compiler-sfc": "^3.2.37",
+        "@vue/compiler-sfc": "^3.2.38",
         "autoprefixer": "^10.4.7",
         "nprogress": "^0.2.0",
         "postcss": "^8.4.16",
-        "sass": "^1.54.5",
+        "sass": "^1.54.8",
         "tailwindcss": "^3.1.8",
         "unplugin-auto-import": "^0.11.2",
         "unplugin-vue-components": "^0.22.4",

+ 8 - 0
src/api/modules/data-fill/query.js

@@ -90,4 +90,12 @@ export default {
             params: form
         })
     },
+    //获取流程状态
+    async getFirstTaskStatus(form) {
+        return httpApi({
+            url: '/api/blade-business/task/query-task-type-status?typeOrStatus=first_task_status',
+            method: 'get',
+            params: form
+        })
+    },
 }

+ 2 - 0
src/global/components/hc-card/index.vue

@@ -114,6 +114,8 @@ const isSlotSearchBar = ref(!!slots.search);
         .hc-card-search-bar {
             position: relative;
             margin-bottom: 20px;
+            display: flex;
+            align-items: center;
         }
         .hc-card-main-box {
             position: relative;

+ 1 - 0
src/main.js

@@ -16,6 +16,7 @@ import { setupComponents } from './global/index'
 //导入其它样式
 import "./styles/font/index.scss"
 import 'remixicon/fonts/remixicon.css'
+import "./styles/icon/index.scss"
 import "./styles/index.scss"
 
 //创建实例

+ 11 - 2
src/plugins/HTableForm.js

@@ -5,7 +5,7 @@ import {ElInput,ElDatePicker,ElUpload,ElInputNumber,ElTimePicker,ElSelect,ElOpti
 const components = {ElInput, ElDatePicker, ElUpload, ElInputNumber, ElTimePicker, ElSelect, ElOption, ElRadioGroup, ElRadio, ElCheckbox, ElCheckboxGroup}
 
 //表单渲染
-export const HTableForm = ({template, formData, appId, onRight, uploadFinish}) => {
+export const HTableForm = ({template, formData, appId, onRight, onDatePicker, uploadFinish}) => {
     const app = createApp({
         data() {
             return {
@@ -16,6 +16,7 @@ export const HTableForm = ({template, formData, appId, onRight, uploadFinish}) =
         template,
         components,
         methods: {
+            //鼠标右键事件
             RightClick(a,b,c,d,e,f,event) {
                 event.preventDefault();
                 const KeyName = event?.target?.getAttribute('keyname') || ''
@@ -23,7 +24,15 @@ export const HTableForm = ({template, formData, appId, onRight, uploadFinish}) =
                     onRight(event, KeyName)
                 }
             },
-            getInformation() {},
+            getInformation() {}, //焦点事件
+            //日期框选择事件
+            datePickerChange(val,key) {
+                this.formData[key] = val
+                if (onDatePicker) {
+                    onDatePicker(val,key)
+                }
+            },
+            //上传成功事件
             formUploadSuccess(res,key) {
                 if (uploadFinish) {
                     uploadFinish(res,key)

BIN
src/styles/font/iconfont.ttf


BIN
src/styles/font/iconfont.woff


BIN
src/styles/font/iconfont.woff2


Разница между файлами не показана из-за своего большого размера
+ 3 - 0
src/styles/icon/index.scss


+ 25 - 80
src/styles/other-file/project-scanning.scss

@@ -1,14 +1,13 @@
 .hc-layout-box {
     display: flex;
     position: relative;
-    height: calc(100% - 60px);
+    height: 100%;
     .hc-layout-left-box {
-        position: relative;
-        background: white;
-        overflow: auto;
-        border-top: 1px solid #EEEEEE;
-        border-right: 1px solid #EEEEEE;
         width: 382px;
+        position: relative;
+        background: #f1f5f8;
+        border-radius: 10px;
+        box-shadow: -2px 0 10px 0 rgba(32,37,50,0.03), 0 10px 21px 20px rgba(32,37,50,0.03);
         .horizontal-drag-line {
             position: absolute;
             right: 0;
@@ -17,95 +16,41 @@
             height: 100%;
             user-select: none;
             cursor: col-resize;
-            background-color: #e4e4e4;
-            transition: background-color 0.2s;
-            &:hover {
-                background-color: rgba(119, 119, 119, .5);
-            }
+            background-color: #00000000;
         }
         .hc-project-box {
             position: relative;
             padding: 15px 24px;
-            border-bottom: 1px solid #EEEEEE;
-            .project-alias-box {
-                position: relative;
-                color: var(--hc-primary);
+            display: flex;
+            align-items: flex-start;
+            border-bottom: 1px solid #E9E9E9;
+            .hc-project-icon-box {
+                font-size: 30px;
+                color: var(--el-color-primary);
             }
-            .project-name {
+            .project-name-box {
+                flex: auto;
                 position: relative;
-                color: #999999;
-                margin-top: 10px;
+                overflow: hidden;
+                .project-alias {
+                    color: var(--el-color-primary);
+                }
+                .project-name {
+                    margin-top: 6px;
+                    color: #838791;
+                }
             }
         }
-        .hc-el-tree-box {
+        .hc-tree-box {
             position: relative;
             padding: 15px 20px;
-            height: calc(100% - 85px);
-            overflow: auto;
+            height: calc(100% - 80px);
         }
     }
     .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;
-}
-.hc-card-body-flex {
-    position: relative;
-    display: flex;
-    width: 100%;
-    height: 100%;
-    .flex-table {
-        position: relative;
-        margin-right: 24px;
-        width: 40%;
-        .data-table {
-            position: relative;
-            height: calc(100% - 50px);
-            border: 1px solid #efeff5;
-            border-radius: 3px;
-            overflow: auto;
-        }
-        .action-btn-box {
-            position: relative;
-            text-align: center;
-            padding-top: 15px;
-        }
-    }
-    .flex-iframe {
         flex: 1;
         position: relative;
-        height: 720px;
-        border:1px solid #777;
-        overflow: hidden;
+        margin-left: 24px;
     }
 }
 
-.upload-modal-data-table {
-    position: relative;
-    max-height: 720px;
-    overflow: auto;
-}
-
-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;
-    }
-}

+ 67 - 31
src/views/data-fill/components/ListItem.vue

@@ -158,6 +158,10 @@ const props = defineProps({
         type: [String,Number],
         default: ''
     },
+    status: {
+        type: [String,Number],
+        default: ''
+    },
 })
 const {isString, getObjNullValue, getArrValue} = isType()
 const {setPosInsert, setPosRange} = utilsText()
@@ -165,6 +169,7 @@ const projectId = ref(props.projectId)
 const contractId = ref(props.contractId)
 const listDatas = ref(props.datas)
 const classify = ref(props.classify)
+const isStatus = ref(props.status)
 
 //监听
 watch(() => [
@@ -180,6 +185,14 @@ watch(() => [
     setFormDataNum(datas)
 })
 
+//监听
+watch(() => [
+    props.status
+], ([val]) => {
+    //1 未填报,2待上报,3已上报
+    isStatus.value = val
+})
+
 //渲染完成
 nextTick(() => {
     setFormDataNum(props.datas)
@@ -242,6 +255,9 @@ const getExcelHtml = async (item,index) => {
                 onRight: (event, KeyName) => {
                     onRightClick(event, KeyName, index)
                 },
+                onDatePicker(val,key) {
+                    formData.value[index][key] = val
+                },
                 uploadFinish: (res, KeyName) => {
                     if (res.code === 200) {
                         const link = res.data?.link || '';
@@ -287,10 +303,14 @@ const getBussDataInfo = async (pkeyId, index) => {
 
 //单个保存
 const tableFormSaveClick = async (item,index) => {
-    const res = await saveExcelBussData(item,index)
-    if (res) {
-        await getBussPdfInfo(item)
-        renewData()
+    if (isStatus.value !== '3') {
+        const res = await saveExcelBussData(item,index)
+        if (res) {
+            await getBussPdfInfo(item)
+            renewData()
+        }
+    } else {
+        window?.$message?.warning('已上报的资料,不允许保存。')
     }
 }
 
@@ -331,51 +351,67 @@ const getBussPdfInfo = async (item, showTip = true) => {
 
 //删除本表
 const delClick = async (item) => {
-    const {error, code} = await wbsApi.removeBussTabInfo({
-        pkeyid: item.pkeyId + '',
-        classify: classify.value,
-    })
-    if (!error && code === 200) {
-        window?.$message?.warning('操作成功')
-        renewData()
+    if (isStatus.value !== '3') {
+        const {error, code} = await wbsApi.removeBussTabInfo({
+            pkeyid: item.pkeyId + '',
+            classify: classify.value,
+        })
+        if (!error && code === 200) {
+            window?.$message?.warning('操作成功')
+            renewData()
+        }
+    } else {
+        window?.$message?.warning('已上报的资料,不允许删除')
     }
 }
 
 //复制本表
 const copyClick = async (item,index) => {
-    const res = await saveExcelBussData(item,index,false)
-    if (res) {
-        const {error, code} = await wbsApi.copeBussTab({pkeyId: item.pkeyId + ''})
-        if (!error && code === 200) {
-            window?.$message?.warning('操作成功')
-            renewData()
+    if (isStatus.value !== '3') {
+        const res = await saveExcelBussData(item,index,false)
+        if (res) {
+            const {error, code} = await wbsApi.copeBussTab({pkeyId: item.pkeyId + ''})
+            if (!error && code === 200) {
+                window?.$message?.warning('操作成功')
+                renewData()
+            }
+        } else {
+            window?.$message?.warning('复制本表操作失败')
         }
     } else {
-        window?.$message?.warning('复制本表操作失败')
+        window?.$message?.warning('已上报的资料,不允许复制')
     }
 }
 
 //隐藏本表
 const hideClick = async (item) => {
-    const isBussShow = item?.isBussShow === 2 ? 1 : 2 //状态(1显示 2隐藏)
-    const {error, code} = await wbsApi.showBussTab({
-        pkeyId: item.pkeyId + '',
-        status: isBussShow
-    })
-    if (!error && code === 200) {
-        window?.$message?.warning('操作成功')
-        renewData()
+    if (isStatus.value !== '3') {
+        const isBussShow = item['isBussShow'] === 2 ? 1 : 2 //状态(1显示 2隐藏)
+        const {error, code} = await wbsApi.showBussTab({
+            pkeyId: item.pkeyId + '',
+            status: isBussShow
+        })
+        if (!error && code === 200) {
+            window?.$message?.warning('操作成功')
+            renewData()
+        }
+    } else {
+        window?.$message?.warning('已上报的资料,不允许隐藏')
     }
 }
 
 //预览
 const previewClick = async (item,index) => {
-    const res = await saveExcelBussData(item, index, false)
-    if (res) {
-        await getBussPdfInfo(item)
-        renewData()
+    if (isStatus.value !== '3') {
+        const res = await saveExcelBussData(item, index, false)
+        if (res) {
+            await getBussPdfInfo(item)
+            renewData()
+        } else {
+            window?.$message?.warning('操作失败')
+        }
     } else {
-        window?.$message?.warning('操作失败')
+        await getBussPdfInfo(item)
     }
 }
 

+ 56 - 21
src/views/data-fill/query.vue

@@ -3,7 +3,7 @@
         <div class="hc-layout-left-box" id="wbs-left-tree" :style="'width:' + leftWidth + 'px;'">
             <div class="hc-project-box">
                 <div class="hc-project-icon-box">
-                    <HcIcon name="layers"/>
+                    <HcIcon name="stack"/>
                 </div>
                 <div class="ml-2 project-name-box">
                     <span class="text-xl text-cut project-alias">{{projectInfo['projectAlias']}}</span>
@@ -116,9 +116,30 @@
                         </div>
                     </div>
                 </template>
-                <HcTable ref="tableListRef" :column="tableListColumn" :datas="tableListData" :loading="tableLoading" isCheck @selection-change="tableSelectionChange"/>
+                <HcTable ref="tableListRef" :column="tableListColumn" :datas="tableListData" :loading="tableLoading" isCheck @selection-change="tableSelectionChange">
+                    <template #name="{row}">
+                        <span class="text-link" @click="tableRowName(row)">{{row?.name}}</span>
+                    </template>
+                    <template #waitingUserList="{row}">
+                        <template v-for="item in row['waitingUserList']">
+                            <el-tag :type="`${item.status === 2 ? 'success' : item.status === 3 ? 'warning' : item.status === 999 ? 'danger' : 'info'}`"
+                                    class="mx-1" effect="dark" v-if="item['waitingUserName']">{{item['waitingUserName']}}</el-tag>
+                        </template>
+                    </template>
+                </HcTable>
                 <template #action>
-                    <HcPages :pages="searchForm" @change="pageChange"/>
+                    <div class="lr-dialog-footer">
+                        <div class="left">
+                            <span class="text-success">任务人员中:</span>
+                            <el-tag type="info" class="mx-1" effect="dark">未签字</el-tag>
+                            <el-tag type="success" class="mx-1" effect="dark">已签字</el-tag>
+                            <el-tag type="warning" class="mx-1" effect="dark">已废除</el-tag>
+                            <el-tag type="danger" class="mx-1" effect="dark">签字异常</el-tag>
+                        </div>
+                        <div class="right">
+                            <HcPages :pages="searchForm" @change="pageChange"/>
+                        </div>
+                    </div>
                 </template>
             </HcCard>
         </div>
@@ -130,7 +151,7 @@
 </template>
 
 <script setup>
-import {ref,watch,onMounted} from "vue";
+import {ref, watch, onMounted} from "vue";
 import {useAppStore} from "~src/store";
 import WbsTree from "./components/WbsTree.vue"
 import HcTreeData from "./components/HcTreeData.vue"
@@ -160,8 +181,8 @@ const treeAutoExpandKeys = ref(getStoreData('wbsTreeExpandKeys') || [])
 onMounted(() => {
     getFileUser()
     getReportNumber()
-    getDictBizClassify('flowTaskStatus')
-    getDictBizClassify('fileType')
+    getFirstTaskStatus()
+    getDictBizClassify()
 })
 
 //树搜索
@@ -254,25 +275,29 @@ const getReportNumber = async () => {
         reportBatchData.value = []
     }
 }
+
+//获取流程状态
+const getFirstTaskStatus = async () => {
+    const {error, code, data} = await queryApi.getFirstTaskStatus()
+    //判断状态
+    if (!error && code === 200) {
+        processStatusData.value = getArrValue(data)
+    } else {
+        processStatusData.value = []
+    }
+}
+
 //获取流程状态分类和文件类型分类
-const getDictBizClassify = async (type) => {
+const getDictBizClassify = async () => {
     const {error, code, data} = await queryApi.getDictBizClassify({
         contractId: contractId.value,
-        code: type
+        code: 'fileType'
     })
     //判断状态
     if (!error && code === 200) {
-        if (code === 'flowTaskStatus') {
-            processStatusData.value = getArrValue(data)
-        } else if (code === 'fileType') {
-            fileTypeData.value = getArrValue(data)
-        }
+        fileTypeData.value = getArrValue(data)
     } else {
-        if (code === 'flowTaskStatus') {
-            processStatusData.value = []
-        } else if (code === 'fileType') {
-            fileTypeData.value = []
-        }
+        fileTypeData.value = []
     }
 }
 
@@ -319,7 +344,7 @@ const tableListColumn = ref([
     {key:'taskStatusStr', name: '流程状态'},
     {key:'reportNumber', name: '上报批次'},
     {key:'fileUserIdAndName', name: '填报人'},
-    {key:'tesk', name: '任务人'}
+    {key:'waitingUserList', name: '任务人'}
 ])
 
 const tableListData = ref([])
@@ -355,6 +380,18 @@ const tableSelectionChange = (rows) => {
     })
 }
 
+//名称被点击
+const tableRowName = (row) => {
+    //如果 evisaPdfUrl 不为空,使用evisaPdfUrl,反之使用pdfUrl
+    if (row['evisaPdfUrl']) {
+        window.open(row['evisaPdfUrl'],'_blank')
+    } else if (row['pdfUrl']) {
+        window.open(row['pdfUrl'],'_blank')
+    } else {
+        window.$message?.warning('文件不存在')
+    }
+}
+
 //上报
 const reportIds = ref('')
 const reportTaskName = ref('')
@@ -385,7 +422,6 @@ const showReportFinish = () => {
     getTableData()
 }
 
-
 //下载
 const downloadLoading = ref(false)
 const batchDownload = async () => {
@@ -518,7 +554,6 @@ const rowsToId = (rows) => {
     }).join(",")
 }
 
-
 //左右拖动,改变树形结构宽度
 const leftWidth = ref(382);
 const onmousedown = () => {

+ 3 - 3
src/views/data-fill/wbs.vue

@@ -33,7 +33,7 @@
             <HcDrawer :show="isDrawer" :scrollbar="false" actionSize="lg" to-id="wbs-node-tree-card-target">
                 <!--清表列表-->
                 <el-scrollbar ref="ListItemScrollRef">
-                    <ListItem ref="ListItemRef" :datas="ListItemDatas" :projectId="projectId" :contractId="contractId" :classify="authBtnTabKey" @offsetTop="ListItemOffsetTop" @renew="getTableDataAll"/>
+                    <ListItem ref="ListItemRef" :datas="ListItemDatas" :status="NodeStatus" :projectId="projectId" :contractId="contractId" :classify="authBtnTabKey" @offsetTop="ListItemOffsetTop" @renew="getTableDataAll"/>
                 </el-scrollbar>
                 <!--底部按钮区域-->
                 <template #action>
@@ -72,7 +72,7 @@
             <div class="hc-layout-left-box" id="wbs-left-tree" :style="'width:' + leftWidth + 'px;'">
                 <div class="hc-project-box">
                     <div class="hc-project-icon-box">
-                        <HcIcon name="layers"/>
+                        <HcIcon name="stack"/>
                     </div>
                     <div class="ml-2 project-name-box">
                         <span class="text-xl text-cut project-alias">{{projectInfo['projectAlias']}}</span>
@@ -133,7 +133,7 @@
                     </template>
                     <!--清表列表-->
                     <el-scrollbar ref="ListItemScrollRef">
-                        <ListItem ref="ListItemRef" :datas="ListItemDatas" :projectId="projectId" :contractId="contractId" :classify="authBtnTabKey" @offsetTop="ListItemOffsetTop" @renew="getTableDataAll"/>
+                        <ListItem ref="ListItemRef" :datas="ListItemDatas" :status="NodeStatus" :projectId="projectId" :contractId="contractId" :classify="authBtnTabKey" @offsetTop="ListItemOffsetTop" @renew="getTableDataAll"/>
                     </el-scrollbar>
                     <!--底部按钮区域-->
                     <template #action>

+ 30 - 11
src/views/other-file/image-form.vue

@@ -3,7 +3,7 @@
         <div class="hc-layout-left-box" :style="'width:' + leftWidth + 'px;'"  v-if="dataType === 1">
             <div class="hc-project-box">
                 <div class="hc-project-icon-box">
-                    <HcIcon name="layers"/>
+                    <HcIcon name="stack"/>
                 </div>
                 <div class="ml-2 project-name-box">
                     <span class="text-xl text-cut project-alias">{{projectInfo['projectAlias']}}</span>
@@ -19,7 +19,9 @@
             <div class="horizontal-drag-line" @mousedown="onmousedown"/>
         </div>
         <div class="hc-layout-content-box" v-loading="queryByLoading" element-loading-text="获取数据中...">
-            <HcCard :title="`上传${fileType === 1 ? '视频' : fileType === 2 ? '图片' : ''}`" :scrollbar="false" actionSize="lg">
+            <HcCard :title="`${treeItemInfo?.title ?? ''} 上传${fileType === 1 ? '视频' : fileType === 2 ? '图片' : ''}`" :scrollbar="false" actionSize="lg">
+                <el-alert style="margin-bottom: 14px" title="请先在左边项目树,选择一个节点" type="warning" effect="dark" :closable="false" v-if="dataType === 1 && !wbsId"/>
+
                 <el-row class="hc-form-row-box" :gutter="20">
                     <el-col :span="10">
                         <el-scrollbar>
@@ -71,11 +73,11 @@
                         </el-scrollbar>
                     </el-col>
                     <el-col :span="14">
-                        <HcTable :column="tableColumn" :datas="tableData"/>
+                        <HcTable :column="tableColumn" :datas="tableData" v-if="dataType === 2"/>
                     </el-col>
                 </el-row>
                 <template #action>
-                    <el-button type="primary" :disabled="uploadsLoading" hc-btn :loading="saveLoading" @click="saveClick">
+                    <el-button type="primary" :disabled="uploadsLoading || (dataType === 1 && !wbsId)" hc-btn :loading="saveLoading" @click="saveClick">
                         <HcIcon name="save"/>
                         <span>保存</span>
                     </el-button>
@@ -84,7 +86,7 @@
                         <span>保存并再次添加</span>
                     </el-button>
                     <el-button hc-btn @click="toBackClick">
-                        <HcIcon name="undo"/>
+                        <HcIcon name="arrow-go-back"/>
                         <span>返回</span>
                     </el-button>
                 </template>
@@ -135,11 +137,10 @@ const TreeAutoExpandKeys = ref([])
 //渲染完成
 onMounted(() => {
     if (dataType === 1) {
-        //NodeExpandKeys()
-    } else if (dataType === 2) {
-        TreeAutoExpandKeys.value = getStoreData('TreeExpandKeys') || []
-        queryById()
+        TreeAutoExpandKeys.value = getStoreData('TreeExpandKeys')
     }
+    formDataFormat({})
+    queryById()
 })
 
 //详情
@@ -157,8 +158,21 @@ const queryById = async () => {
 }
 
 //项目树被点击
-const nodeWbsElTreeClick = () => {
-
+const wbsId = ref('')
+const treeItemInfo = ref({})
+const nodeWbsElTreeClick = ({data, keys}) => {
+    if (data.leaf === true) {
+        treeItemInfo.value = data
+        wbsId.value = data['primaryKeyId']
+        formValue.value.wbsId = data['primaryKeyId']
+        //缓存自动展开
+        TreeAutoExpandKeys.value = keys
+        setStoreData('TreeExpandKeys', keys)
+    } else {
+        wbsId.value = ''
+        treeItemInfo.value = {}
+        formValue.value.wbsId = null
+    }
 }
 
 //表单相关数据
@@ -210,6 +224,8 @@ const rules = {
 const formDataFormat = (info) => {
     //表单数据
     formValue.value = {
+        uploadTime: toDayDate,
+        shootingTimeStr: toDayDate,
         ...info,
         type: fileType || '2',
         wbsId: info?.wbsId || wbsNodeIds,
@@ -451,4 +467,7 @@ const onmousedown = () => {
         }
     }
 }
+.preview-video {
+    width: 100%;
+}
 </style>

+ 33 - 14
src/views/other-file/image-view.vue

@@ -4,7 +4,7 @@
             <template v-if="dataType === 1">
                 <div class="hc-project-box">
                     <div class="hc-project-icon-box">
-                        <HcIcon name="layers"/>
+                        <HcIcon name="stack"/>
                     </div>
                     <div class="ml-2 project-name-box">
                         <span class="text-xl text-cut project-alias">{{projectInfo['projectAlias']}}</span>
@@ -29,7 +29,7 @@
             <HcCard :scrollbar="false" actionSize="lg">
                 <template #header>
                     <HcTooltip keys="image-data-add">
-                        <el-button type="primary" hc-btn :disabled="!queryKey && fileType === 1" @click="addFormFile">
+                        <el-button type="primary" hc-btn :disabled="!queryKey && dataType === 1" @click="addFormFile">
                             <HcIcon name="add_box"/>
                             <span>新增文件</span>
                         </el-button>
@@ -76,7 +76,7 @@
                     </template>
                     <template #operate="{row}">
                         <HcTooltip keys="image-data-preview">
-                            <el-button type="primary" size="small" text @click="previewClick(row)">查看</el-button>
+                            <el-button type="primary" size="small" text :loading="previewLoading" @click="previewClick(row)">查看</el-button>
                         </HcTooltip>
                         <HcTooltip keys="image-data-edit">
                             <el-button type="primary" size="small" text @click="editClick(row)">编辑</el-button>
@@ -86,7 +86,10 @@
                 <template #action>
                     <div class="lr-dialog-footer">
                         <div class="left">
-                            <el-button size="large" @click="goToBack">返回上级</el-button>
+                            <el-button size="large" @click="goToBack">
+                                <HcIcon name="arrow-go-back"/>
+                                <span>返回</span>
+                            </el-button>
                         </div>
                         <div class="right">
                             <HcPages :pages="searchForm" @change="pageChange"/>
@@ -138,13 +141,18 @@ watch(() => [
 })
 
 //自动展开缓存
-const TreeAutoExpandKeys = ref(getStoreData('TreeExpandKeys') || [])
-const TreeExpandedKeys = ref(getStoreData('TreeExpandedKeys') || [])
+const TreeAutoExpandKeys = ref([])
+const TreeExpandedKeys = ref([])
 const TreeCurrentNodeKey = ref(getStoreData('TreeCurrentNodeKey') || '')
 
 //渲染完成
 onMounted(() => {
     const nodeKey = TreeCurrentNodeKey.value
+    if (dataType === 1) {
+        TreeAutoExpandKeys.value = getStoreData('TreeExpandKeys') || []
+    } else {
+        TreeExpandedKeys.value = getStoreData('TreeExpandedKeys') || []
+    }
     if (dataType === 2 && dataId) {
         getYearDateTree()
         queryKey.value = nodeKey
@@ -249,7 +257,7 @@ const tableListData = ref([])
 const tableListColumn = ref([
     {key:'info', name: '文件详情'},
     {key:'textContent', name: '文字说明'},
-    {key:'operate', name: '操作', align: 'center', width: '130'},
+    {key:'operate', name: '操作', align: 'center', width: '140'},
 ])
 const getTableData = async () => {
     tableLoading.value = true
@@ -294,23 +302,32 @@ const setImageUrl = (url) => {
 //预览
 const previewVideoUrl = ref('')
 const previewVideoModal = ref(false)
-const previewClick = async ({id,type,imageUrl}) => {
-    if (imageUrl) {
-        if (parseInt(type) === 1) {
+const previewLoading = ref(false)
+const previewClick = async (item) => {
+    const {id,type,imageUrl,margePdfUrl} = item
+    if (parseInt(type) === 1) {
+        if (imageUrl) {
             previewVideoUrl.value = imageUrl
             previewVideoModal.value = true
         } else {
+            window.$message?.warning('暂无可预览的资料文件');
+        }
+    } else if (parseInt(type) === 2) {
+        if(margePdfUrl) {
+            window.open(margePdfUrl, "_blank");
+        } else {
+            previewLoading.value = true
             const {error, code, data} = await imageApi.imageClassificationFile({ids: id}, false)
             //判断状态
+            previewLoading.value = false
             const imgUrl = getObjNullValue(data)
             if (!error && code === 200 && imgUrl) {
-                window.open(data?.data,"_blank");
+                item.margePdfUrl = imgUrl
+                window.open(imgUrl,"_blank");
             } else {
                 window.$message?.warning('预览资料文件异常');
             }
         }
-    } else {
-        window.$message?.warning('暂无可预览的资料文件');
     }
 }
 
@@ -431,5 +448,7 @@ const onmousedown = () => {
 </style>
 
 <style lang="scss">
-
+.preview-video {
+    width: 100%;
+}
 </style>

Разница между файлами не показана из-за своего большого размера
+ 143 - 944
src/views/other-file/project-scanning.vue


+ 42 - 61
src/views/other/order-service.vue

@@ -2,7 +2,7 @@
     <div class="hc-order-service">
         <div class="order-service-content">
             <el-scrollbar ref="scrollbarRef">
-                <div class="content-box">
+                <div class="content-box" v-loading="dataLoading" element-loading-text="获取数据中...">
                     <div class="comment-card-box" v-for="(item,index) in orderDataList" :key="item.id">
                         <div class="user-avatar-box">
                             <el-avatar :size="50" :src="item.avatar || avatarPng" />
@@ -20,11 +20,11 @@
                             </div>
                             <div class="foot-tools-box">
                                 <div class="icon-box" :class="item['commentsNumber'] >= 1 ? 'active' : ''" @click="commentExpanded(item)">
-                                    <HcIcon name="chat" class="icon"/>
+                                    <HcIcon name="question-answer" class="icon" :fill="item['commentsNumber'] >= 1"/>
                                     <span class="badge" v-if="item['commentsNumber'] >= 1">{{item['commentsNumber']}}</span>
                                 </div>
                                 <div class="icon-box" :class="item['currentUserGood'] ? 'active' : ''" :data-index="item['expandedName']" @click="likeClick(item)">
-                                    <HcIcon name="thumb_up" class="icon"/>
+                                    <i class="hc-icon-i icon" :class="item['currentUserGood'] ? 'hcicon-praise_fill ': 'hcicon-praise'"></i>
                                     <span class="badge" v-if="item['goodNumber'] >= 1">{{item['goodNumber']}}</span>
                                 </div>
                             </div>
@@ -56,7 +56,7 @@
                 </div>
             </el-scrollbar>
             <div class="page-top-btn" @click="scrollToTop">
-                <HcIcon name="vertical_align_top" class="icon"/>
+                <HcIcon name="arrow-up" class="icon"/>
             </div>
         </div>
         <!--我的工单服务-->
@@ -70,7 +70,7 @@
                 <template #extra>
                     <el-tooltip effect="dark" content="发起新工单服务" placement="top">
                         <el-button type="primary" hc-btn class="hc-add-icon" @click="newOrderServiceClick">
-                            <HcIcon name="add"/>
+                            <HcIcon name="add" style="margin-right: 0"/>
                         </el-button>
                     </el-tooltip>
                 </template>
@@ -85,7 +85,7 @@
                             <template v-for="(item,index) in orderFlowList" :key="index">
                                 <el-timeline-item :class="item['currentBol']?'success':item['current']?'primary':''" size="large">
                                     <div class="timeline-item-icon">
-                                        <HcIcon name="done" class="check-icon" v-if="item['currentBol']"/>
+                                        <HcIcon name="check" class="check-icon" v-if="item['currentBol']"/>
                                         <span v-else>{{index + 1}}</span>
                                     </div>
                                     <div class="reply-name">{{item['replyName']}}</div>
@@ -135,11 +135,11 @@
                 <el-input v-model="opinionContent" :rows="3" type="textarea" placeholder="请输入你宝贵的建议,我们将会跟踪解决"/>
             </div>
             <div class="mt-3 upload-img" v-loading="spinShow">
-                <el-upload v-model:file-list="uploadFileList" :action="uploadAction" :headers="getTokenHeader()" :limit="3" :accept="uploadAccept" list-type="picture-card" multiple
-                           :before-upload="beforeUpload" :on-change="uploadChange" :on-exceed="uploadExceed" :on-preview="handlePreview" :on-remove="removeUpload">
-                    <HcIcon name="add" class="hc-upload-icon"/>
-                </el-upload>
-                <el-image-viewer v-if="showViewer" :initial-index="initialIndex" :url-list="previewFileList" @close="showViewer = false"/>
+                <div class="w-full">
+                    <HcUploads :fileList="uploadFileList" :accept="uploadAccept" action="put-file" :limit="3" :size="30" :viewer="false"
+                               @change="uploadChange" @progress="uploadsProgress" @del="removeUpload" @preview="handlePreview"/>
+                </div>
+                <el-image-viewer v-if="showViewer" :initial-index="initialIndex" :url-list="previewFileList" @close="previewModalClose"/>
             </div>
             <div class="mt-3">
                 <el-alert title="请上传JPG、PNG格式的图片文件,最多上传 3 张图片,文件大小不超过30M" type="error" :closable="false"/>
@@ -147,7 +147,7 @@
             <template #footer>
                 <div class="dialog-footer">
                     <el-button size="large" @click="handleModalClose">取消</el-button>
-                    <el-button type="primary" hc-btn @click="saveClick">提交</el-button>
+                    <el-button type="primary" hc-btn :disabled="uploadsLoading" @click="saveClick">提交</el-button>
                 </div>
             </template>
         </el-dialog>
@@ -155,7 +155,7 @@
         <!--提示框-->
         <el-dialog v-model="showTipModal" title="感谢" width="600px" custom-class="hc-modal-border" :before-close="handleTipModalClose">
             <div class="tip-modal-icon-box">
-                <HcIcon name="sentiment_very_satisfied"/>
+                <HcIcon name="emotion" fill/>
             </div>
             <div class="tip-modal-text-box">感谢您的仗义直言,大恩不言谢,有事联系我们,我们随时都在</div>
             <template #footer>
@@ -170,18 +170,17 @@
 
 <script setup>
 import {nextTick, onMounted, ref, watch} from "vue";
-import {useAppStore} from "~src/store/index";
+import {useAppStore} from "~src/store";
 import orderServe from '~api/other/orderServe';
-import {getTokenHeader} from '~src/api/request/header';
 import avatarPng from '~src/assets/images/avatar.png';
 import Web515Png from '~src/assets/images/Web515.png';
 import {userConfigSave} from "~api/other";
-import {isType, isSize, base64ToFile, getIndex} from "vue-utils-plus"
-import oss from "~api/oss";
+import {isType, base64ToFile} from "vue-utils-plus"
+import ossApi from "~api/oss";
 
 //初始变量
-const { getArrValue, getObjValue, getObjNullValue } = isType()
 const useAppState = useAppStore()
+const { getArrValue, getObjValue } = isType()
 const projectId = ref(useAppState.getProjectId);
 const contractId = ref(useAppState.getContractId);
 const isScreenShort = ref(useAppState.getScreenShort)
@@ -222,8 +221,11 @@ onMounted(() => {
 })
 
 //获取列表数据
+const dataLoading = ref(false)
 const queryUserOpinionPage = async () => {
+    dataLoading.value = true
     const { error, code, data } = await orderServe.queryUserOpinionPage(searchForm.value)
+    dataLoading.value = false
     if (!error && code === 200) {
         orderDataList.value = getArrValue(data['records'])
     } else {
@@ -385,66 +387,45 @@ const queryDictBizList = async () => {
 const opinionContent = ref('')
 
 //上传
-const uploadFileList = ref([])
-const uploadAction = "/api/blade-resource/oss/endpoint/put-file"
 const uploadAccept = "image/png,image/jpg,image/jpeg"
+const uploadFileList = ref([])
 
-//上传前
-const beforeUpload = (res) => {
-    if (isSize(res?.size,30)) {
-        return true;
-    } else {
-        window?.$message?.warning('文件大小,不能过30M!');
-        return false;
-    }
-}
-
-//状态改变
-const uploadChange = (_, uploadFiles) => {
-    console.log(uploadFiles)
-    //暂时不知道怎么搞。。。
+//上传的文件结果
+const uploadChange = ({ fileList}) => {
+    uploadFileList.value = fileList
 }
 
-//超出限制时
-const uploadExceed = () => {
-    window?.$message?.warning('请上传JPG、PNG格式的图片文件,最多上传 3 张图片,文件大小不超过30M');
+//上传进度
+const uploadsLoading = ref(false)
+const uploadsProgress = (val) => {
+    uploadsLoading.value = val
 }
 
-//预览
+//预览上传的文件
 const showViewer = ref(false)
+const initialIndex = ref(-1)
 const previewFileList = ref([])
-const initialIndex = ref(0)
-const handlePreview = (file) => {
-    let fileArr = getUploadFileUrl()
-    const fileList = uploadFileList.value ?? [];
-    const index = getIndex(fileList, 'uid', file?.uid)
+const handlePreview = ({ index, fileArr}) => {
     previewFileList.value = fileArr
     initialIndex.value = index
     showViewer.value = true
 }
 
-//获取文件URL
-const getUploadFileUrl = () => {
-    let fileArr = [], fileList = uploadFileList.value ?? [];
-    fileList.forEach(item => {
-        fileArr.push(item?.response?.data?.link)
-    })
-    return fileArr
+//预览关闭
+const previewModalClose = () => {
+    initialIndex.value = -1
+    showViewer.value = false
 }
 
-//删除文件
-const removeUpload = async (file) => {
-    const fileName = file?.response?.data?.name
-    const { error, code } = await oss.removeFile({
-        fileName: fileName
-    })
-    if (!error && code === 200) {
-        return true
-    } else {
-        return false
+//删除上传的文件
+const removeUpload = async ({link}) => {
+    const arrUrl = link.split(".com//");
+    if (arrUrl.length > 0) {
+        await ossApi.removeFile({fileName: arrUrl[1]},false)
     }
 }
 
+
 //上传截图文件
 const spinShow = ref(false)
 const uploadImgFile = async (base64) => {
@@ -454,7 +435,7 @@ const uploadImgFile = async (base64) => {
     //上传文件
     spinShow.value = true
     newOrderServiceClick()
-    const { error, code, data } = await oss.putFile(formData, false)
+    const { error, code, data } = await ossApi.putFile(formData, false)
     spinShow.value = false
     if (!error && code === 200) {
         let res = getObjValue(data)

+ 7 - 46
src/views/tasks/hc-data.vue

@@ -57,10 +57,14 @@
                         <span class="text-link" @click="rowTaskName(row)">{{row?.taskName}}</span>
                     </template>
                     <template #taskStatus="{row}">
-                        {{ setStatusTag(row?.taskStatus) }}
+                        <el-tag :type="`${row['taskStatus']['status'] === 2 ? 'success' : row['taskStatus']['status'] === 3 ? 'warning' : 'info'}`"
+                                class="mx-1" effect="dark" v-if="row?.taskStatus?.statusValue">{{row['taskStatus']['statusValue']}}</el-tag>
                     </template>
                     <template #waitingUserList="{row}">
-                        {{ setUserTag(row?.waitingUserList) }}
+                        <template v-for="item in row['waitingUserList']">
+                            <el-tag :type="`${item.status === 2 ? 'success' : item.status === 3 ? 'warning' : item.status === 999 ? 'danger' : 'info'}`"
+                                    class="mx-1" effect="dark" v-if="item['waitingUserName']">{{item['waitingUserName']}}</el-tag>
+                        </template>
                     </template>
                 </HcTable>
                 <template #action>
@@ -107,13 +111,12 @@
 </template>
 
 <script setup>
-import {h, ref, onMounted} from "vue";
+import {ref, onMounted} from "vue";
 import {useAppStore} from "~src/store";
 import tasksApi from '~api/tasks/data';
 import {useRouter, useRoute} from 'vue-router'
 import HcSbTable from "~com/hc-sb-table/index.vue";
 import {isType, formValidate, deepClone} from "vue-utils-plus"
-import {ElTag} from 'element-plus'
 
 //初始变量
 const router = useRouter()
@@ -326,48 +329,6 @@ const tableSelectionChange = (rows) => {
     })
 }
 
-//设置状态标签
-const setStatusTag = (taskStatus) => {
-    const item = getObjValue(taskStatus)
-    return h(ElTag, {
-        type: `${item['status'] === 2 ? 'success' : item['status'] === 3 ? 'warning' : 'info'}`,
-        effect: "dark",
-        class: "mx-1"
-    }, {
-        default: () => item['statusValue']
-    })
-}
-
-//设置用户标签
-const setUserTag = (UserList) => {
-    const list = getArrValue(UserList)
-    if (list.length > 0) {
-        return h('div', {}, {
-            default: () => setUserTags(list)
-        })
-    } else {
-        return ''
-    }
-}
-const setUserTags = (list) => {
-    let tagArr = [];
-    for (let i = 0; i < list.length; i++) {
-        let item = getObjValue(list[i]);
-        if (item['waitingUserName']) {
-            tagArr.push(
-                h(ElTag, {
-                    type: `${item.status === 2 ? 'success' : item.status === 3 ? 'warning' : item.status === 999 ? 'danger' : 'info'}`,
-                    effect: "dark",
-                    class: "mx-1"
-                }, {
-                    default: () => item['waitingUserName']
-                })
-            )
-        }
-    }
-    return tagArr
-}
-
 //任务审核
 const rowTaskName = () => {
 

+ 84 - 84
yarn.lock

@@ -115,100 +115,100 @@
   resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-3.0.3.tgz#7e3e401ccb30b4380d2279d9849281413f1791ef"
   integrity sha512-U4zNBlz9mg+TA+i+5QPc3N5lQvdUXENZLO2h0Wdzp56gI1MWhqJOv+6R+d4kOzoaSSq6TnGPBdZAXKOe4lXy6g==
 
-"@vue/compiler-core@3.2.37":
-  version "3.2.37"
-  resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.37.tgz#b3c42e04c0e0f2c496ff1784e543fbefe91e215a"
-  integrity sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==
+"@vue/compiler-core@3.2.38":
+  version "3.2.38"
+  resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.38.tgz#0a2a7bffd2280ac19a96baf5301838a2cf1964d7"
+  integrity sha512-/FsvnSu7Z+lkd/8KXMa4yYNUiqQrI22135gfsQYVGuh5tqEgOB0XqrUdb/KnCLa5+TmQLPwvyUnKMyCpu+SX3Q==
   dependencies:
     "@babel/parser" "^7.16.4"
-    "@vue/shared" "3.2.37"
+    "@vue/shared" "3.2.38"
     estree-walker "^2.0.2"
     source-map "^0.6.1"
 
-"@vue/compiler-dom@3.2.37":
-  version "3.2.37"
-  resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz#10d2427a789e7c707c872da9d678c82a0c6582b5"
-  integrity sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==
+"@vue/compiler-dom@3.2.38":
+  version "3.2.38"
+  resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.38.tgz#53d04ed0c0c62d1ef259bf82f9b28100a880b6fd"
+  integrity sha512-zqX4FgUbw56kzHlgYuEEJR8mefFiiyR3u96498+zWPsLeh1WKvgIReoNE+U7gG8bCUdvsrJ0JRmev0Ky6n2O0g==
   dependencies:
-    "@vue/compiler-core" "3.2.37"
-    "@vue/shared" "3.2.37"
+    "@vue/compiler-core" "3.2.38"
+    "@vue/shared" "3.2.38"
 
-"@vue/compiler-sfc@3.2.37", "@vue/compiler-sfc@^3.2.37":
-  version "3.2.37"
-  resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz#3103af3da2f40286edcd85ea495dcb35bc7f5ff4"
-  integrity sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==
+"@vue/compiler-sfc@3.2.38", "@vue/compiler-sfc@^3.2.38":
+  version "3.2.38"
+  resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.38.tgz#9e763019471a535eb1fceeaac9d4d18a83f0940f"
+  integrity sha512-KZjrW32KloMYtTcHAFuw3CqsyWc5X6seb8KbkANSWt3Cz9p2qA8c1GJpSkksFP9ABb6an0FLCFl46ZFXx3kKpg==
   dependencies:
     "@babel/parser" "^7.16.4"
-    "@vue/compiler-core" "3.2.37"
-    "@vue/compiler-dom" "3.2.37"
-    "@vue/compiler-ssr" "3.2.37"
-    "@vue/reactivity-transform" "3.2.37"
-    "@vue/shared" "3.2.37"
+    "@vue/compiler-core" "3.2.38"
+    "@vue/compiler-dom" "3.2.38"
+    "@vue/compiler-ssr" "3.2.38"
+    "@vue/reactivity-transform" "3.2.38"
+    "@vue/shared" "3.2.38"
     estree-walker "^2.0.2"
     magic-string "^0.25.7"
     postcss "^8.1.10"
     source-map "^0.6.1"
 
-"@vue/compiler-ssr@3.2.37":
-  version "3.2.37"
-  resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz#4899d19f3a5fafd61524a9d1aee8eb0505313cff"
-  integrity sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==
+"@vue/compiler-ssr@3.2.38":
+  version "3.2.38"
+  resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.38.tgz#933b23bf99e667e5078eefc6ba94cb95fd765dfe"
+  integrity sha512-bm9jOeyv1H3UskNm4S6IfueKjUNFmi2kRweFIGnqaGkkRePjwEcfCVqyS3roe7HvF4ugsEkhf4+kIvDhip6XzQ==
   dependencies:
-    "@vue/compiler-dom" "3.2.37"
-    "@vue/shared" "3.2.37"
+    "@vue/compiler-dom" "3.2.38"
+    "@vue/shared" "3.2.38"
 
 "@vue/devtools-api@^6.1.4", "@vue/devtools-api@^6.2.1":
   version "6.2.1"
   resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.2.1.tgz#6f2948ff002ec46df01420dfeff91de16c5b4092"
   integrity sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==
 
-"@vue/reactivity-transform@3.2.37":
-  version "3.2.37"
-  resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz#0caa47c4344df4ae59f5a05dde2a8758829f8eca"
-  integrity sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==
+"@vue/reactivity-transform@3.2.38":
+  version "3.2.38"
+  resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.38.tgz#a856c217b2ead99eefb6fddb1d61119b2cb67984"
+  integrity sha512-3SD3Jmi1yXrDwiNJqQ6fs1x61WsDLqVk4NyKVz78mkaIRh6d3IqtRnptgRfXn+Fzf+m6B1KxBYWq1APj6h4qeA==
   dependencies:
     "@babel/parser" "^7.16.4"
-    "@vue/compiler-core" "3.2.37"
-    "@vue/shared" "3.2.37"
+    "@vue/compiler-core" "3.2.38"
+    "@vue/shared" "3.2.38"
     estree-walker "^2.0.2"
     magic-string "^0.25.7"
 
-"@vue/reactivity@3.2.37":
-  version "3.2.37"
-  resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.37.tgz#5bc3847ac58828e2b78526e08219e0a1089f8848"
-  integrity sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==
+"@vue/reactivity@3.2.38":
+  version "3.2.38"
+  resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.38.tgz#d576fdcea98eefb96a1f1ad456e289263e87292e"
+  integrity sha512-6L4myYcH9HG2M25co7/BSo0skKFHpAN8PhkNPM4xRVkyGl1K5M3Jx4rp5bsYhvYze2K4+l+pioN4e6ZwFLUVtw==
   dependencies:
-    "@vue/shared" "3.2.37"
+    "@vue/shared" "3.2.38"
 
-"@vue/runtime-core@3.2.37":
-  version "3.2.37"
-  resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.37.tgz#7ba7c54bb56e5d70edfc2f05766e1ca8519966e3"
-  integrity sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==
+"@vue/runtime-core@3.2.38":
+  version "3.2.38"
+  resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.38.tgz#d19cf591c210713f80e6a94ffbfef307c27aea06"
+  integrity sha512-kk0qiSiXUU/IKxZw31824rxmFzrLr3TL6ZcbrxWTKivadoKupdlzbQM4SlGo4MU6Zzrqv4fzyUasTU1jDoEnzg==
   dependencies:
-    "@vue/reactivity" "3.2.37"
-    "@vue/shared" "3.2.37"
+    "@vue/reactivity" "3.2.38"
+    "@vue/shared" "3.2.38"
 
-"@vue/runtime-dom@3.2.37":
-  version "3.2.37"
-  resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz#002bdc8228fa63949317756fb1e92cdd3f9f4bbd"
-  integrity sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==
+"@vue/runtime-dom@3.2.38":
+  version "3.2.38"
+  resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.38.tgz#fec711f65c2485991289fd4798780aa506469b48"
+  integrity sha512-4PKAb/ck2TjxdMSzMsnHViOrrwpudk4/A56uZjhzvusoEU9xqa5dygksbzYepdZeB5NqtRw5fRhWIiQlRVK45A==
   dependencies:
-    "@vue/runtime-core" "3.2.37"
-    "@vue/shared" "3.2.37"
+    "@vue/runtime-core" "3.2.38"
+    "@vue/shared" "3.2.38"
     csstype "^2.6.8"
 
-"@vue/server-renderer@3.2.37":
-  version "3.2.37"
-  resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.37.tgz#840a29c8dcc29bddd9b5f5ffa22b95c0e72afdfc"
-  integrity sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==
+"@vue/server-renderer@3.2.38":
+  version "3.2.38"
+  resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.38.tgz#01a4c0f218e90b8ad1815074208a1974ded109aa"
+  integrity sha512-pg+JanpbOZ5kEfOZzO2bt02YHd+ELhYP8zPeLU1H0e7lg079NtuuSB8fjLdn58c4Ou8UQ6C1/P+528nXnLPAhA==
   dependencies:
-    "@vue/compiler-ssr" "3.2.37"
-    "@vue/shared" "3.2.37"
+    "@vue/compiler-ssr" "3.2.38"
+    "@vue/shared" "3.2.38"
 
-"@vue/shared@3.2.37":
-  version "3.2.37"
-  resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.37.tgz#8e6adc3f2759af52f0e85863dfb0b711ecc5c702"
-  integrity sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==
+"@vue/shared@3.2.38":
+  version "3.2.38"
+  resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.38.tgz#e823f0cb2e85b6bf43430c0d6811b1441c300f3c"
+  integrity sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==
 
 "@vueuse/core@^9.1.0":
   version "9.1.0"
@@ -911,10 +911,10 @@ 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.32.2:
-  version "2.32.2"
-  resolved "https://registry.yarnpkg.com/naive-ui/-/naive-ui-2.32.2.tgz#40f593df0b86b36f6af5635d9299417d45d6d96a"
-  integrity sha512-vTNuZ8LBlfo/cdiv4S8o6Cg5g7p9V9cR5rK+Fag2cplOnng5twTILD3sBaCqw3k/BV1331Xdk26ml8Me8QJ7iA==
+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"
@@ -999,10 +999,10 @@ pify@^2.3.0:
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
   integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
 
-pinia@^2.0.20:
-  version "2.0.20"
-  resolved "https://registry.yarnpkg.com/pinia/-/pinia-2.0.20.tgz#3b7f1a5a660282fab6a0c83bae62c48ee0b1bc1f"
-  integrity sha512-fdHHumXW/0U5HhxmY1emo3I4z85p8NJPdbtFQSlmJXFe3ktuF0pYNVgVtk2q+j2zCtTufY763xzaEMx0t6T59g==
+pinia@^2.0.21:
+  version "2.0.21"
+  resolved "https://registry.yarnpkg.com/pinia/-/pinia-2.0.21.tgz#2a6599ad3736fa71866f4b053ffb0073cd482270"
+  integrity sha512-6ol04PtL29O0Z6JHI47O3JUSoyOJ7Og0rstXrHVMZSP4zAldsQBXJCNF0i/H7m8vp/Hjd/CSmuPl7C5QAwpeWQ==
   dependencies:
     "@vue/devtools-api" "^6.2.1"
     vue-demi "*"
@@ -1135,10 +1135,10 @@ run-parallel@^1.1.9:
   dependencies:
     queue-microtask "^1.2.2"
 
-sass@^1.54.5:
-  version "1.54.5"
-  resolved "https://registry.yarnpkg.com/sass/-/sass-1.54.5.tgz#93708f5560784f6ff2eab8542ade021a4a947b3a"
-  integrity sha512-p7DTOzxkUPa/63FU0R3KApkRHwcVZYC0PLnLm5iyZACyp15qSi32x7zVUhRdABAATmkALqgGrjCJAcWvobmhHw==
+sass@^1.54.8:
+  version "1.54.8"
+  resolved "https://registry.yarnpkg.com/sass/-/sass-1.54.8.tgz#4adef0dd86ea2b1e4074f551eeda4fc5f812a996"
+  integrity sha512-ib4JhLRRgbg6QVy6bsv5uJxnJMTS2soVcCp9Y88Extyy13A8vV0G1fAwujOzmNkFQbR3LvedudAMbtuNRPbQww==
   dependencies:
     chokidar ">=3.0.0 <4.0.0"
     immutable "^4.0.0"
@@ -1363,10 +1363,10 @@ vue-demi@*:
   resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.13.6.tgz#f9433cbd75e68a970dec066647f4ba6c08ced48f"
   integrity sha512-02NYpxgyGE2kKGegRPYlNQSL1UWfA/+JqvzhGCOYjhfbLWXU5QQX0+9pAm/R2sCOPKr5NBxVIab7fvFU0B1RxQ==
 
-vue-router@^4.1.4:
-  version "4.1.4"
-  resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.1.4.tgz#290540caaf2c54e37a14dec047bd074002eca175"
-  integrity sha512-UgYen33gOtwT3cOG1+yRen+Brk9py8CSlC9LEa3UjvKZ4EAoSo8NjZPDeDnmNerfazorHIJG1NC7qdi1SuQJnQ==
+vue-router@^4.1.5:
+  version "4.1.5"
+  resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.1.5.tgz#256f597e3f5a281a23352a6193aa6e342c8d9f9a"
+  integrity sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==
   dependencies:
     "@vue/devtools-api" "^6.1.4"
 
@@ -1375,16 +1375,16 @@ vue-utils-plus@^1.0.2:
   resolved "https://registry.yarnpkg.com/vue-utils-plus/-/vue-utils-plus-1.0.2.tgz#8069c00c30a0e5cb83d7277c6975843814d8d452"
   integrity sha512-Fg/2U0ysqpE2flCZ1Vmg5pRSnkmlmakmkEJ+w7ULDalme7SvoPp2sbe9UukZRL5eAm6ZqpKprrwLaj81nEyiRQ==
 
-vue@^3.2.37:
-  version "3.2.37"
-  resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.37.tgz#da220ccb618d78579d25b06c7c21498ca4e5452e"
-  integrity sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==
+vue@^3.2.38:
+  version "3.2.38"
+  resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.38.tgz#cda3a414631745b194971219318a792dbbccdec0"
+  integrity sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q==
   dependencies:
-    "@vue/compiler-dom" "3.2.37"
-    "@vue/compiler-sfc" "3.2.37"
-    "@vue/runtime-dom" "3.2.37"
-    "@vue/server-renderer" "3.2.37"
-    "@vue/shared" "3.2.37"
+    "@vue/compiler-dom" "3.2.38"
+    "@vue/compiler-sfc" "3.2.38"
+    "@vue/runtime-dom" "3.2.38"
+    "@vue/server-renderer" "3.2.38"
+    "@vue/shared" "3.2.38"
 
 vuedraggable@^4.1.0:
   version "4.1.0"

Некоторые файлы не были показаны из-за большого количества измененных файлов