Browse Source

试验接口

iZaiZaiA 2 years ago
parent
commit
12fc324f24

+ 5 - 5
package.json

@@ -7,11 +7,11 @@
         "build": "vite build"
     },
     "dependencies": {
-        "axios": "^1.2.0",
+        "axios": "^1.2.1",
         "crypto-js": "^4.1.1",
-        "dayjs": "^1.11.6",
+        "dayjs": "^1.11.7",
         "echarts": "^5.4.0",
-        "element-plus": "^2.2.25",
+        "element-plus": "^2.2.26",
         "js-base64": "^3.7.3",
         "js-cookie": "^3.0.1",
         "js-md5": "^0.7.3",
@@ -30,11 +30,11 @@
         "autoprefixer": "^10.4.13",
         "codemirror": "^6.0.1",
         "postcss": "^8.4.19",
-        "sass": "^1.56.1",
+        "sass": "^1.56.2",
         "tailwindcss": "3.1.8",
         "unplugin-auto-import": "^0.12.0",
         "unplugin-vue-components": "^0.22.11",
         "vfonts": "^0.0.3",
-        "vite": "^3.2.4"
+        "vite": "^3.2.5"
     }
 }

+ 44 - 0
src/api/modules/tentative/detect/test.js

@@ -0,0 +1,44 @@
+import {httpApi} from "../../../request/httpApi";
+
+export default {
+    //自检记录分页查询
+    async queryPage(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/detection/self/page',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+    //根据所属方查询节点下表单
+    async searchNodeTables(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-manager/wbsPrivate/search-node-tables',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //获取试验表的HTML
+    async getExcelHtml(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-manager/wbsPrivate/get-excel-html',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //获取试验用户保存数据
+    async getBussDataInfo(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-manager/exceltab/get-buss-dataInfo-trial',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //保存表单
+    async saveExcelBussData(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/detection/self/submit',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+}

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

@@ -94,7 +94,8 @@ const isSlotSearchBar = ref(!!slots.search);
         height: 70px;
         padding: 14px 24px;
         border-bottom: 1px solid #e9e9e9;
-        overflow: auto;
+        overflow-x: auto;
+        overflow-y: hidden;
     }
     .hc-card-header-box {
         position: relative;
@@ -122,7 +123,8 @@ const isSlotSearchBar = ref(!!slots.search);
             margin-bottom: 20px;
             display: flex;
             align-items: center;
-            overflow: auto;
+            overflow-x: auto;
+            overflow-y: hidden;
         }
         .hc-card-main-box {
             position: relative;

+ 61 - 58
src/views/tentative/detect/components/ListItem.vue

@@ -1,8 +1,8 @@
 <template>
     <div class="data-fill-list-box">
         <el-collapse v-model="ActiveKey" accordion @change="CollapseChange">
-            <template v-for="(item,index) in listDatas" :key="item?.pkeyId">
-                <el-collapse-item :name="`item-${index}-${item?.pkeyId}`" :disabled="item['isBussShow'] === 2" :id="`item-${index}-${item?.pkeyId}`">
+            <template v-for="(item,index) in listDatas" :key="item?.pKeyId">
+                <el-collapse-item :name="`item-${index}-${item?.pKeyId}`" :disabled="item['isBussShow'] === 2" :id="`item-${index}-${item?.pKeyId}`">
                     <template #title>
                         <div class="hc-collapse-item-header">
                             <div class="text-lg truncate item-title">{{item.nodeName}}</div>
@@ -34,7 +34,7 @@
                     </template>
                     <div class="data-fill-list-item-content">
                         <div class="data-fill-table-form-box">
-                            <div class="hc-excel-table-form-view" :id="`table-form-${item?.pkeyId}`"/>
+                            <div class="hc-excel-table-form-view" :id="`table-form-${item?.pKeyId}`"/>
                             <div class="hc-no-table-form" v-if="item?.isTableForm === false">
                                 <div class="table-form-no">
                                     <img :src="notableform" alt=""/>
@@ -137,10 +137,11 @@
 
 <script setup>
 import {ref,watch,nextTick} from "vue";
-import notableform from '~src/assets/view/notableform.svg';
-import HTableForm from "~src/plugins/HTableForm"
 import wbsApi from "~api/data-fill/wbs"
 import HcUpload from "./HcUpload.vue"
+import HTableForm from "~src/plugins/HTableForm"
+import dataApi from "~api/tentative/detect/test";
+import notableform from '~src/assets/view/notableform.svg';
 import {utilsText, isType, formValidate, deepClone} from "vue-utils-plus"
 
 //初始
@@ -149,51 +150,38 @@ const props = defineProps({
         type: Array,
         default: () => ([])
     },
-    classify: {
-        type: [String,Number],
-        default: ''
-    },
     status: {
         type: [String,Number],
         default: ''
     },
-    primaryKeyId: {
-        type: [String,Number],
-        default: ''
-    },
-    contractId: {
-        type: [String,Number],
-        default: ''
+    baseData: {
+        type: Object,
+        default: () => ({})
     },
 })
+
 const {isString, getObjNullValue, getArrValue} = isType()
 const {setPosInsert, setPosRange} = utilsText()
 const listDatas = ref(props.datas)
-const classify = ref(props.classify)
 const isStatus = ref(props.status)
-const isPrimaryKeyId = ref(props.primaryKeyId)
-const contractId = ref(props.contractId)
+const baseData = ref(props.baseData)
 
 //监听
 watch(() => [
     props.datas,
-    props.classify,
-    props.primaryKeyId,
-    props.contractId,
-], ([datas, classifyVal, primaryKeyId, cid]) => {
+], ([datas]) => {
     listDatas.value = datas
-    classify.value = classifyVal
-    isPrimaryKeyId.value = primaryKeyId
-    contractId.value = cid
     setFormDataNum(datas)
 })
 
 //监听
 watch(() => [
-    props.status
-], ([val]) => {
+    props.status,
+    props.baseData,
+], ([val, base]) => {
     //1 未填报,2待上报,3已上报
     isStatus.value = val
+    baseData.value = base
 })
 
 //渲染完成
@@ -201,14 +189,19 @@ nextTick(() => {
     setFormDataNum(props.datas)
 })
 
+//获取pKeyId
+const getValString = (val) => {
+    return val ? val + '' : ''
+}
+
 //获取表单初始数据
-const getFormDataInit = (item, pkeyId) => {
+const getFormDataInit = ({projectId, contractId, pKeyId}) => {
+    const { nodeId } = baseData.value
     return {
-        projectId: item?.projectId,
-        contractId: item?.contractId,
-        classify: classify.value,
-        pkeyId: pkeyId ? pkeyId + '' : '',
-        nodeId: isPrimaryKeyId.value
+        projectId: projectId,
+        contractId: contractId,
+        pkeyId: getValString(pKeyId),
+        nodeId: nodeId
     }
 }
 
@@ -219,7 +212,7 @@ const setFormDataNum = (datas) => {
     let newArr = [];
     for (let i = 0; i < datas.length; i++) {
         newArr.push({
-            ...getFormDataInit(datas[i], datas[i].pkeyId),
+            ...getFormDataInit(datas[i]),
             isCollapseLoad: false,
         })
     }
@@ -236,10 +229,10 @@ const CollapseChange = async (name) => {
         getOffsetTop(name)
         const index = names[1]
         const item = listDatas.value[index]
-        formKeyIds.value = item.pkeyId ? item.pkeyId + '' : ''
+        formKeyIds.value = getValString(item.pKeyId)
         if (!item.isTableFormRender) {
             //获取已填写的数据
-            await getBussDataInfo(item,item.pkeyId, index)
+            await getBussDataInfo(item, index)
             //渲染表单
             await getExcelHtml(item,index)
         }
@@ -252,10 +245,12 @@ const CollapseChange = async (name) => {
 //获取模板标签数据
 const formRegExpJson = ref({})
 const getExcelHtml = async (item,index) => {
-    const pkeyIds = item.pkeyId ? item.pkeyId + '' : ''
+    const pkeyIds = getValString(item.pKeyId)
     if (pkeyIds) {
-        const {error, code, data} = await wbsApi.getExcelHtml({pkeyId: pkeyIds}, false)
-        const resData = isString(data) ? data || '' : ''
+        const {error, code, data} = await dataApi.getExcelHtml({
+            primaryKeyId: pkeyIds
+        }, false)
+        const resData = isString(data.data) ? data.data || '' : ''
         if (!error && code === 200 && resData) {
             item.isTableForm = true
             //渲染表单
@@ -296,7 +291,7 @@ const setTableFormBlurReg = (pkeyId, event, key, reg, val, msg, item, index) =>
                 delete formRegExpJson.value[pkeyId]
                 dom.style = ''
             } else {
-                formRegExpJson.value[pkeyId] = {key, reg, val, msg, state, nodeName: item.nodeName, itemId: `item-${index}-${item?.pkeyId}`}
+                formRegExpJson.value[pkeyId] = {key, reg, val, msg, state, nodeName: item.nodeName, itemId: `item-${index}-${item?.pKeyId}`}
                 dom.style = '--el-input-border-color: #fe0000; box-shadow: 0 0 0 2px #fe0000 inset;'
                 window?.$message?.warning(msg)
             }
@@ -308,19 +303,25 @@ const setTableFormBlurReg = (pkeyId, event, key, reg, val, msg, item, index) =>
 }
 
 //获取已填写的数据
-const getBussDataInfo = async (item, pkeyId, index) => {
-    const pkeyIds = pkeyId ? pkeyId + '' : ''
+const getBussDataInfo = async (item, index) => {
+    const pkeyIds = getValString(item.pKeyId)
     if (pkeyIds) {
-        const {error, code, data} = await wbsApi.getBussDataInfo({
+        const {error, code, data} = await dataApi.getBussDataInfo({
             pkeyId: pkeyIds
         }, false)
         const resData = getObjNullValue(data)
         if (!error && code === 200 && resData) {
             HTableForm.setPickerKey(resData)
-            const InitObj = getFormDataInit(item, pkeyId) //有数据,关联数据
-            formData.value[index] = {...resData, ...InitObj, isCollapseLoad: true}
+            const InitObj = getFormDataInit(item) //有数据,关联数据
+            formData.value[index] = {
+                ...resData, ...InitObj,
+                isCollapseLoad: true
+            }
         } else {
-            formData.value[index] = {...getFormDataInit(item, pkeyId), isCollapseLoad: true}
+            formData.value[index] = {
+                ...getFormDataInit(item),
+                isCollapseLoad: true
+            }
         }
     } else {
         window?.$message?.warning('pkeyId为空')
@@ -333,7 +334,7 @@ const tableFormSaveClick = async (item,index) => {
     if (isStatus.value !== '3') {
         const res = await saveExcelBussData(item,index)
         if (res) {
-            await getBussPdfInfo(item)
+            //await getBussPdfInfo(item)
             renewData()
         }
     } else {
@@ -345,10 +346,12 @@ const tableFormSaveClick = async (item,index) => {
 const saveExcelBussData = async (item, index, showTip = true) => {
     if (!getObjNullValue(formRegExpJson.value)) {
         tableFormSaveLoading.value = true
-        const InitObj = getFormDataInit(item, item.pkeyId)
-        const {error, code, data} = await wbsApi.saveExcelBussData({
-            ...formData.value[index],
-            ...InitObj
+        const InitObj = getFormDataInit(item)
+        const {error, code} = await dataApi.saveExcelBussData({
+            ...baseData.value,
+            dataInfo: {
+                orderList: [{...formData.value[index], ...InitObj}]
+            }
         })
         //处理数据
         tableFormSaveLoading.value = false
@@ -366,7 +369,7 @@ const saveExcelBussData = async (item, index, showTip = true) => {
 
 //预览PDF
 const getBussPdfInfo = async (item, showTip = true) => {
-    const pkeyIds = item.pkeyId ? item.pkeyId + '' : ''
+    const pkeyIds = item.pKeyId ? item.pKeyId + '' : ''
     if (pkeyIds) {
         const {error, code, data} = await wbsApi.getBussPdfInfo({
             pkeyId: pkeyIds
@@ -389,7 +392,7 @@ const getBussPdfInfo = async (item, showTip = true) => {
 
 //删除本表
 const delClick = async (item) => {
-    const pkeyIds = item.pkeyId ? item.pkeyId + '' : ''
+    const pkeyIds = item.pKeyId ? item.pKeyId + '' : ''
     if (pkeyIds) {
         if (isStatus.value !== '3') {
             const {error, code} = await wbsApi.removeBussTabInfo({
@@ -410,7 +413,7 @@ const delClick = async (item) => {
 
 //复制本表
 const copyClick = async (item,index) => {
-    const pkeyIds = item.pkeyId ? item.pkeyId + '' : ''
+    const pkeyIds = item.pKeyId ? item.pKeyId + '' : ''
     if (pkeyIds) {
         if (isStatus.value !== '3') {
             if (!item.isRenderTableForm) {
@@ -448,7 +451,7 @@ const copeBussTab = async (pkeyIds) => {
 
 //隐藏本表
 const hideClick = async (item) => {
-    const pkeyIds = item.pkeyId ? item.pkeyId + '' : ''
+    const pkeyIds = item.pKeyId ? item.pKeyId + '' : ''
     if (pkeyIds) {
         if (isStatus.value !== '3') {
             const isBussShow = item['isBussShow'] === 2 ? 1 : 2 //状态(1显示 2隐藏)
@@ -480,7 +483,7 @@ const uploadData = ref({})
 
 //上传被点击
 const uploadClick = (item,index) => {
-    const pkeyIds = item.pkeyId ? item.pkeyId + '' : ''
+    const pkeyIds = item.pKeyId ? item.pKeyId + '' : ''
     const keyName = `item-${index}-${pkeyIds}`
     if (pkeyIds) {
         if (isStatus.value !== '3' && item.isTableForm) {
@@ -733,7 +736,7 @@ defineExpose({
     .data-fill-list-item-content {
         position: relative;
         display: flex;
-        height: calc(100vh - 386px);
+        height: calc(100vh - 428px);
         .data-fill-table-form-box {
             position: relative;
             padding: 24px 20px;

+ 94 - 43
src/views/tentative/detect/test-form.vue

@@ -13,7 +13,7 @@
             </template>
             <template #extra>
                 <el-button type="primary" hc-btn @click="linksRelateModalClick">关联工程用途及部位</el-button>
-                <el-button type="primary" hc-btn @click="linksRawModalClick">关联原材检测报告</el-button>
+                <el-button :type="isMixRatioTestIds ? 'primary' : ''" hc-btn :disabled="!isMixRatioTestIds" @click="linksRawModalClick">关联原材检测报告</el-button>
                 <el-button type="primary" hc-btn @click="linksSampleModalClick">关联取样</el-button>
             </template>
             <template #search>
@@ -21,31 +21,29 @@
                     <HcNewSwitch :datas="tabTypeTab" :keys="tabTypeKey" @change="tabTypeChange" size="default" :round="false"/>
                 </div>
                 <div class="hc-search-top-form">
-                    <div class="w-36" v-if="tabTypeKey === 'tab2'">
-                        <el-date-picker type="date" v-model="topFormModel.key1" class="block" value-format="YYYY-MM-DD" :clearable="false" placeholder="请选择报告日期"/>
+                    <div class="w-40">
+                        <el-input v-model="listItemBaseData.trialUserName" placeholder="请输入试验人员" clearable/>
                     </div>
-                    <div class="w-28 ml-2" v-if="tabTypeKey === 'tab2'">
-                        <el-select v-model="topFormModel.key2" placeholder="是否合格" block>
+                    <div class="w-36 ml-2" v-if="tabTypeKey === '2'">
+                        <el-date-picker type="date" v-model="listItemBaseData.reportDate" class="block" value-format="YYYY-MM-DD" :clearable="false" placeholder="请选择报告日期"/>
+                    </div>
+                    <div class="w-28 ml-2" v-if="tabTypeKey === '2'">
+                        <el-select v-model="listItemBaseData.detection_result" placeholder="是否合格" block>
                             <el-option label="合格" value="1" />
                             <el-option label="不合格" value="2" />
                         </el-select>
                     </div>
                     <div class="w-36 ml-2">
-                        <el-select v-model="topFormModel.key3" placeholder="选择检测类型" block>
-                            <el-option label="自检" value="1" />
-                            <el-option label="抽检" value="2" />
-                            <el-option label="平行试验" value="3" />
-                            <el-option label="验证试验" value="4" />
-                            <el-option label="中心实验室抽检" value="5" />
+                        <el-select v-model="listItemBaseData.detectionCategory" placeholder="选择检测类型" block>
+                            <el-option v-for="item in categoryData" :label="item['dictValue']" :value="item['dictKey']"/>
                         </el-select>
                     </div>
                 </div>
             </template>
             <!--清表列表-->
-            清表列表(等待接口,然后把资料填报的组件,搬过来改一下即可。目前没数据,搞起来麻烦。)
-            <!--el-scrollbar ref="ListItemScrollRef" v-loading="ListItemLoading" v-if="ListItemDatas.length > 0">
-                <ListItem ref="ListItemRef" :datas="ListItemDatas" :status="NodeStatus" :classify="authBtnTabKey" @offsetTop="ListItemOffsetTop" :primaryKeyId="primaryKeyId" :contractId="contractId" @renew="getTableDataAll"/>
-            </el-scrollbar-->
+            <el-scrollbar ref="ListItemScrollRef" v-loading="isLoading" v-if="listItemData.length > 0">
+                <ListItem ref="ListItemRef" :datas="listItemData" :status="1" :baseData="listItemBaseData" @offsetTop="ListItemOffsetTop" @renew="getTableDataAll"/>
+            </el-scrollbar>
             <template #action>
                 <el-button type="primary" hc-btn>
                     <HcIcon name="save"/>
@@ -124,7 +122,11 @@ import {ref, watch, onMounted} from "vue";
 import {useAppStore} from "~src/store";
 import {useRouter, useRoute} from 'vue-router'
 import ListItem from "./components/ListItem.vue"
+import dataApi from "~api/tentative/detect/test";
+import {getStoreData} from '~src/utils/storage'
 import WbsTree from "../../data-fill/components/WbsTree.vue"
+import {getArrValue, getObjValue} from "vue-utils-plus";
+import {getDictionary} from "~api/other";
 import dayjs from "dayjs"
 
 //变量
@@ -139,56 +141,105 @@ const contractInfo = ref(useAppState.getContractInfo);
 const routerQuery = useRoutes?.query;
 //存储目录格式 1按部位存储,2按日期存储
 const dataId = routerQuery?.id || '';
-const dataType = parseInt(routerQuery?.type + '') || 1;
-const fileType = parseInt(routerQuery?.fileType + '') || 2;
+const nodeId = routerQuery?.nodeId || '';
+const dataType = routerQuery?.dataType || '1';
 
 const dayDate = dayjs().format('YYYY-MM-DD')
+const testTreeItem = ref(getStoreData('testTreeItem'));
+const isMixRatioTestIds = ref(false);
 
 //渲染完成
 onMounted(() => {
-    setContractType(contractInfo.value?.contractType)
-    topFormModel.value.key1 = dayDate
+    const { title, mixRatioTestIds } = getObjValue(testTreeItem.value);
+    isMixRatioTestIds.value = !(!mixRatioTestIds || mixRatioTestIds <= 0);
+    listItemBaseData.value.contractId = contractId.value
+    listItemBaseData.value.trialProjectName = title
+    listItemBaseData.value.reportDate = dayDate
+
+    getSearchNodeTables()
+    getCategoryData()
 })
 
 //身份按钮切换数据
-const authBtnTabKey = ref('1')
+const authBtnTabKey = ref(dataType)
 const authBtnTabClick = (val) => {
     if (val !== authBtnTabKey.value) {
         authBtnTabKey.value = val
-        //getTableDataAll()
-    }
-}
-
-//contractType,  1施工,2监理
-const setContractType = (contractType) => {
-    if (contractType <= 0) {
-        authBtnTabKey.value = '1'
-        authBtnTabKey.value = '1'
-        topFormModel.value.key3 = '1'
-    } else {
-        authBtnTabKey.value = contractType + ''
-        if (contractType < 3) {
-            topFormModel.value.key3 = contractType + ''
-        } else {
-            topFormModel.value.key3 = '1'
-        }
+        listItemBaseData.value.type = val
+        getSearchNodeTables()
     }
 }
 
 //类型tab数据和相关处理
-const tabTypeKey = ref('tab1')
+const tabTypeKey = ref('1')
 const tabTypeTab = ref([
-    {key:'tab1',  name: '记录表'},
-    {key:'tab2', name: '报告单'},
+    {key:'1',  name: '记录表'},
+    {key:'2', name: '报告单'},
 ]);
-const tabTypeChange = (item) => {
-    tabTypeKey.value = item?.key
+const tabTypeChange = ({key}) => {
+    tabTypeKey.value = key
+    listItemBaseData.value.tableType = key
+    getSearchNodeTables()
+}
+
+//获取检测类别类型
+const categoryData = ref([])
+const getCategoryData = async () => {
+    const { data } = await getDictionary({
+        code: 'trial_detection_category'
+    })
+    const arrData = getArrValue(data)
+    arrData.forEach(item => {
+        item.dictKey = Number(item.dictKey)
+    })
+    categoryData.value = arrData
 }
 
 //顶部表单
 const topFormModel = ref({})
+const listItemBaseData = ref({
+    sampleIds: '', contractId: null, nodeId: nodeId, trialProjectName: null, type: dataType, tableType: '1',
+    detectionCategory: '', detection_result: '', reportDate: '', trialUserName: '',
+})
+
+//获取数据
+const isLoading = ref(false)
+const listItemData = ref([])
+const getSearchNodeTables = async () => {
+    isLoading.value = true
+    const { error, code, data } = await dataApi.searchNodeTables({
+        projectId: projectId.value,
+        contractId: contractId.value,
+        primaryKeyId: nodeId,
+        type: authBtnTabKey.value,
+        tableType: tabTypeKey.value
+    })
+    //处理数据
+    isLoading.value = false
+    if (!error && code === 200) {
+        listItemData.value = getArrValue(data)
+    } else {
+        listItemData.value = []
+    }
+}
+//获取数据
+const getTableDataAll = () => {
+    getSearchNodeTables()
+    //queryNodeStatus()
+}
+
+//设置滚动条位置
+const ListItemScrollRef = ref(null)
+const ListItemOffsetTop = (offsetTop) => {
+    if (offsetTop > 0) {
+        setTimeout(() => {
+            ListItemScrollRef.value?.setScrollTop(offsetTop)
+        }, 350)
+    } else {
+        ListItemScrollRef.value?.setScrollTop(offsetTop)
+    }
+}
 
-const searchForm = ref({})
 
 //关联工程用途及部位 树
 const linksRelateModal = ref(false)

+ 87 - 38
src/views/tentative/detect/test.vue

@@ -12,7 +12,13 @@
             </div>
             <div class="hc-tree-box">
                 <el-scrollbar>
-                    <WbsTree :autoExpandKeys="treeAutoExpandKeys" :projectId="projectId" :contractId="contractId" isColor @nodeTap="wbsElTreeClick"/>
+                    <TestTree
+                        :autoExpandKeys="treeAutoExpandKeys"
+                        :projectId="projectId"
+                        :wbsTempId="projectInfo?.referenceWbsTemplateIdTrial"
+                        :wbsType="2"
+                        :tenantId="userInfo?.tenant_id"
+                        @nodeTap="wbsElTreeClick"/>
                 </el-scrollbar>
             </div>
             <!--左右拖动-->
@@ -22,44 +28,52 @@
             <HcCard :scrollbar="false" actionSize="lg">
                 <template #header>
                     <HcTooltip keys="tentative_detect_test_add">
-                        <el-button type="primary" hc-btn @click="addFormModalClick">
+                        <el-button type="primary" hc-btn :disabled="!primaryKeyId" @click="addFormModalClick">
                             <HcIcon name="add-circle"/>
                             <span>新增</span>
                         </el-button>
                     </HcTooltip>
                     <HcTooltip keys="tentative_detect_test_copy">
-                        <el-button hc-btn>
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
                             <HcIcon name="file-copy-2"/>
                             <span>复制</span>
                         </el-button>
                     </HcTooltip>
                     <HcTooltip keys="tentative_detect_test_del">
-                        <el-button hc-btn @click="delModalClick">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="delModalClick">
                             <HcIcon name="delete-bin-2"/>
                             <span>删除</span>
                         </el-button>
                     </HcTooltip>
                     <HcTooltip keys="tentative_detect_test_print">
-                        <el-button hc-btn>
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
                             <HcIcon name="printer"/>
                             <span>批量打印</span>
                         </el-button>
                     </HcTooltip>
                     <HcTooltip keys="tentative_detect_test_null">
-                        <el-button hc-btn>
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0">
                             <HcIcon name="printer"/>
                             <span>打印空表</span>
                         </el-button>
                     </HcTooltip>
                 </template>
+                <template #extra>
+                    <el-button :type="authBtnTabKey === '1'?'primary':''" hc-btn @click="authBtnTabClick('1')">
+                        <HcIcon name="folder-user"/>
+                        <span>施工质检</span>
+                    </el-button>
+                    <el-button :type="authBtnTabKey === '2'?'primary':''" hc-btn @click="authBtnTabClick('2')">
+                        <HcIcon name="folder-shield"/>
+                        <span>监理质检</span>
+                    </el-button>
+                </template>
                 <template #search>
                     <div class="w-40">
-                        <el-select v-model="searchForm.user" placeholder="请选择试验人员" clearable>
-                            <el-option v-for="item in userData" :key="item.value" :label="item['label']" :value="item['value']"/>
-                        </el-select>
+                        <el-input v-model="searchForm.trialUserName" placeholder="请输入试验人员" clearable @keyup="keyUpEvent"/>
                     </div>
                     <div class="w-40 ml-2">
-                        <el-select v-model="searchForm.qualified" placeholder="请选择是否合格" clearable>
+                        <el-select v-model="searchForm.queryStatus" placeholder="请选择是否合格" clearable>
                             <el-option v-for="item in qualifiedData" :key="item.value" :label="item['label']" :value="item['value']"/>
                         </el-select>
                     </div>
@@ -132,17 +146,21 @@
 import {ref, watch, onMounted} from "vue";
 import {useRouter} from 'vue-router'
 import {useAppStore} from "~src/store";
-import WbsTree from "../../data-fill/components/WbsTree.vue"
+import TestTree from "../material/components/TestTree.vue"
 import {getStoreData, setStoreData} from '~src/utils/storage'
 import HcDragUpload from "./components/HcDragUpload.vue"
-import notableform from '~src/assets/view/notableform.svg';
+import dataApi from "~api/tentative/detect/test";
+//import {delMessage, rowsToId} from "~uti/tools";
+import {getArrValue} from "vue-utils-plus";
 
 //变量
 const router = useRouter()
 const useAppState = useAppStore()
+const userInfo = ref(useAppState.getUserInfo);
 const projectId = ref(useAppState.getProjectId);
 const contractId = ref(useAppState.getContractId);
 const projectInfo = ref(useAppState.getProjectInfo);
+const contractInfo = ref(useAppState.getContractInfo);
 const isCollapse = ref(useAppState.getCollapse)
 const isBubble = ref(useAppState.getBubble);
 
@@ -161,50 +179,73 @@ const getButtonsVal = (value) => {
 }
 
 //自动展开缓存
-const treeAutoExpandKeys = ref(getStoreData('wbsTreeExpandKeys') || [])
+const treeAutoExpandKeys = ref(getStoreData('testTreeExpandKeys') || [])
 const btn_edit = ref(false)
 
 //渲染完成
 onMounted(() => {
     btn_edit.value = getButtonsVal('tentative_detect_test_edit')
+    setContractType(contractInfo.value?.contractType)
 })
 
-const userData = ref([
-    {label: 'xxx', value: '1'}
-])
-
 const qualifiedData = ref([
-    {label: '是', value: '1'}
+    {label: '不合格', value: '0'},
+    {label: '合格', value: '1'}
 ])
 
 //搜索表单
-const searchForm = ref({user: null, qualified: null, betweenTime: null, queryValue: null, current: 1, size: 20, total: 0})
+const searchForm = ref({
+    trialUserName: null, queryStatus: null, queryValue: null, type: '1',
+    current: 1, size: 20, total: 0
+})
 
 //树相关的变量
 const primaryKeyId = ref('')
-const nodeItemInfo = ref({})
 const nodeDataInfo = ref({})
 
 //树被点击
-const wbsElTreeClick = ({node, data, keys}) => {
-    nodeItemInfo.value = node
+const wbsElTreeClick = ({data, keys}) => {
     nodeDataInfo.value = data
     primaryKeyId.value = data['primaryKeyId'] || ''
+    setStoreData('testTreeItem',data)
     //缓存自动展开
     treeAutoExpandKeys.value = keys
-    setStoreData('wbsTreeExpandKeys',keys)
+    setStoreData('testTreeExpandKeys',keys)
     //改变搜索表单数据
-    //searchForm.value.wbsId = data['contractIdRelation'] ? data['id'] : data['primaryKeyId']
-    //searchForm.value.contractIdRelation = data['contractIdRelation']
+    searchForm.value.nodeId = data['primaryKeyId'];
     searchForm.value.current = 1;
     getTableData()
 }
 
+//身份按钮切换数据
+const authBtnTabKey = ref('1')
+const authBtnTabClick = (val) => {
+    if (val !== authBtnTabKey.value) {
+        authBtnTabKey.value = val
+        searchForm.value.type = val;
+        searchForm.value.current = 1;
+        getTableData()
+    }
+}
+//contractType,  1施工,2监理
+const setContractType = (contractType) => {
+    let typeValue = '1';
+    if (contractType > 0) {
+        typeValue = contractType + ''
+    }
+    authBtnTabKey.value = typeValue
+    searchForm.value.type = typeValue
+    searchForm.value.current = 1;
+}
+
 //日期时间被选择
 const betweenTime = ref(null)
-const betweenTimeUpdate = ({arr,query}) => {
+const betweenTimeUpdate = ({arr}) => {
     betweenTime.value = arr
-    searchForm.value.betweenTime = query
+    if (arr.length > 0) {
+        searchForm.value.startTime = arr[0]
+        searchForm.value.endTime = arr[1]
+    }
 }
 
 //回车搜索
@@ -249,22 +290,32 @@ const tableColumn = ref([
     {key:'key16', name: '任务状态'},
     {key:'action', name: '操作', width: 150, fixed: 'right', align: 'center'},
 ])
+const tableData = ref([])
 
 //获取数据
 const tableLoading = ref(false)
-const tableData = ref([
-    {key5: '测试测试测试'}
-])
 const getTableData = async () => {
-
+    tableLoading.value = true
+    const { error, code, data } = await dataApi.queryPage({
+        ...searchForm.value,
+        projectId: projectId.value,
+        contractId: contractId.value
+    })
+    //处理数据
+    tableLoading.value = false
+    if (!error && code === 200) {
+        tableData.value = getArrValue(data['records'])
+        searchForm.value.total = data.total || 0
+    } else {
+        tableData.value = []
+        searchForm.value.total = 0
+    }
 }
 
 //多选
 const tableCheckedKeys = ref([]);
 const tableSelection = (rows) => {
-    tableCheckedKeys.value = rows.filter((item) => {
-        return (item??'') !== '';
-    })
+    tableCheckedKeys.value = rows
 }
 
 //新增
@@ -272,10 +323,8 @@ const addFormModalClick = () => {
     router.push({
         path: '/tentative/detect/test-form',
         query: {
-            //wbsId: queryKey.value,  //树节点ID
-            //dataType: dataType,     //存储目录格式 1按部位存储,2按日期存储
-            //fileType: fileType,     //文件类型,1视频文件,2图片文件
-            //classifyId: dataId,     //classifyId,分类ID,
+            nodeId: primaryKeyId.value,
+            dataType: authBtnTabKey.value,
         }
     })
 }

+ 20 - 20
yarn.lock

@@ -365,10 +365,10 @@ autoprefixer@^10.4.13:
     picocolors "^1.0.0"
     postcss-value-parser "^4.2.0"
 
-axios@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.npmmirror.com/axios/-/axios-1.2.0.tgz#1cb65bd75162c70e9f8d118a905126c4a201d383"
-  integrity sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==
+axios@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.1.tgz#44cf04a3c9f0c2252ebd85975361c026cb9f864a"
+  integrity sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==
   dependencies:
     follow-redirects "^1.15.0"
     form-data "^4.0.0"
@@ -500,10 +500,10 @@ dayjs@^1.11.3:
   resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.5.tgz#00e8cc627f231f9499c19b38af49f56dc0ac5e93"
   integrity sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==
 
-dayjs@^1.11.6:
-  version "1.11.6"
-  resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.6.tgz#2e79a226314ec3ec904e3ee1dd5a4f5e5b1c7afb"
-  integrity sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==
+dayjs@^1.11.7:
+  version "1.11.7"
+  resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2"
+  integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==
 
 debug@^4.3.4:
   version "4.3.4"
@@ -554,10 +554,10 @@ electron-to-chromium@^1.4.251:
   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.256.tgz#c735032f412505e8e0482f147a8ff10cfca45bf4"
   integrity sha512-x+JnqyluoJv8I0U9gVe+Sk2st8vF0CzMt78SXxuoWCooLLY2k5VerIBdpvG7ql6GKI4dzNnPjmqgDJ76EdaAKw==
 
-element-plus@^2.2.25:
-  version "2.2.25"
-  resolved "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.25.tgz#ebf1e8a57300eb2d8ed337cf23ee5a566bebc402"
-  integrity sha512-HC8CWY31e6pPyBpgqI0QnWkBgs0vRzdYnEw3mpdM/NlKfp0PtNFX7NESQLomqoIulH5ftL09hjQmJNvZBQpthQ==
+element-plus@^2.2.26:
+  version "2.2.26"
+  resolved "https://registry.yarnpkg.com/element-plus/-/element-plus-2.2.26.tgz#5e46aa5d8127786bb158713957f8a253b35bf019"
+  integrity sha512-O/rdY5m9DkclpVg8r3GynyqCunm7MxSR142xSsjrZA77bi7bcwA3SIy6SPEDqHi5R4KqgkGYgKSp4Q4e3irbYg==
   dependencies:
     "@ctrl/tinycolor" "^3.4.1"
     "@element-plus/icons-vue" "^2.0.6"
@@ -1175,10 +1175,10 @@ run-parallel@^1.1.9:
   dependencies:
     queue-microtask "^1.2.2"
 
-sass@^1.56.1:
-  version "1.56.1"
-  resolved "https://registry.npmmirror.com/sass/-/sass-1.56.1.tgz#94d3910cd468fd075fa87f5bb17437a0b617d8a7"
-  integrity sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==
+sass@^1.56.2:
+  version "1.56.2"
+  resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.2.tgz#9433b345ab3872996c82a53a58c014fd244fd095"
+  integrity sha512-ciEJhnyCRwzlBCB+h5cCPM6ie/6f8HrhZMQOf5vlU60Y1bI1rx5Zb0vlDZvaycHsg/MqFfF1Eq2eokAa32iw8w==
   dependencies:
     chokidar ">=3.0.0 <4.0.0"
     immutable "^4.0.0"
@@ -1358,10 +1358,10 @@ vfonts@^0.0.3:
   resolved "https://registry.yarnpkg.com/vfonts/-/vfonts-0.0.3.tgz#999d66fecea18efee3f2b966c81101ae8ce01a29"
   integrity sha512-nguyw8L6Un8eelg1vQ31vIU2ESxqid7EYmy8V+MDeMaHBqaRSkg3dTBToC1PR00D89UzS/SLkfYPnx0Wf23IQQ==
 
-vite@^3.2.4:
-  version "3.2.4"
-  resolved "https://registry.npmmirror.com/vite/-/vite-3.2.4.tgz#d8c7892dd4268064e04fffbe7d866207dd24166e"
-  integrity sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw==
+vite@^3.2.5:
+  version "3.2.5"
+  resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.5.tgz#dee5678172a8a0ab3e547ad4148c3d547f90e86a"
+  integrity sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==
   dependencies:
     esbuild "^0.15.9"
     postcss "^8.4.18"