Pārlūkot izejas kodu

试验,设备进场,接口调试

iZaiZaiA 2 gadi atpakaļ
vecāks
revīzija
e3f8ca5732

+ 30 - 22
src/api/modules/tentative/device/approach.js

@@ -1,60 +1,68 @@
 import {httpApi} from "../../../request/httpApi";
 
 export default {
-    //进场材料分页条件查询
-    async queryPage(form, msg = true) {
+    //分类列表
+    async getClassList(form, msg = true) {
         return httpApi({
-            url: '/api/blade-business/material/mobilization/page',
+            url: '/api/blade-business/device/class-list',
             method: 'get',
             params: form
         }, msg);
     },
-    //进场材料新增或修改
-    async submitForm(form, msg = true) {
+    //分类新增或修改
+    async getClassSubmit(form, msg = true) {
         return httpApi({
-            url: '/api/blade-business/material/mobilization/submit',
+            url: '/api/blade-business/device/class-submit',
             method: 'post',
             data: form
         }, msg);
     },
-    //进场材料批量删除
-    async removeData(form, msg = true) {
+    //分类删除
+    async setClassRemove(form, msg = true) {
         return httpApi({
-            url: '/api/blade-business/material/mobilization/remove',
-            method: 'post',
+            url: '/api/blade-business/device/class-remove',
+            method: 'get',
             params: form
         }, msg);
     },
-    //校验材料编号是否唯一
-    async verification(form, msg = true) {
+    //分页条件查询
+    async queryPage(form, msg = true) {
         return httpApi({
-            url: '/api/blade-business/material/mobilization/verification',
+            url: '/api/blade-business/device/mobilization/page',
             method: 'get',
             params: form
         }, msg);
     },
-    //进场材料批量复制
-    async copyData(form, msg = true) {
+    //新增或修改
+    async submitForm(form, msg = true) {
         return httpApi({
-            url: '/api/blade-business/material/mobilization/copy',
+            url: '/api/blade-business/device/mobilization/submit',
             method: 'post',
             data: form
         }, msg);
     },
-    //批量打印进场材料Pdf
+    //批量删除
+    async removeData(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-business/device/mobilization/remove',
+            method: 'post',
+            params: form
+        }, msg);
+    },
+    //批量打印Pdf
     async exportPdf(form, msg = true) {
         return httpApi({
-            url: '/api/blade-business/material/mobilization/export-pdf',
+            url: '/api/blade-business/device/mobilization/print-pdf',
             method: 'post',
             params: form
         }, msg);
     },
-    //材料取样记录
+    //导入数据保存
     async samplingRecord(form, msg = true) {
         return httpApi({
-            url: '/api/blade-business/material/mobilization/sampling-record',
-            method: 'get',
-            params: form
+            url: '/api/blade-business/device/mobilization/save-batch',
+            method: 'post',
+            data: form
         }, msg);
     },
 }

+ 74 - 0
src/global/components/hc-auto-complete/index.vue

@@ -0,0 +1,74 @@
+<template>
+    <el-autocomplete :class="[block ? 'block' : '', ui]" v-model="modelValues" :fetch-suggestions="queryFetch" :value-key="keys" :placeholder="placeholder" @select="handleFetchSelect" @change="handleFetchChange"/>
+</template>
+
+<script setup>
+import {ref,watch} from "vue";
+const props = defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    modelValue: {
+        type: String,
+        default: ''
+    },
+    datas: {
+        type: Array,
+        default: () => ([])
+    },
+    keys: {
+        type: String,
+        default: 'userName'
+    },
+    placeholder: {
+        type: String,
+        default: '请选择或输入'
+    },
+    block: {
+        type: Boolean,
+        default: true
+    },
+})
+
+//初始变量
+const queryData = ref(props.datas)
+const modelValues = ref(props.modelValue)
+
+//监听
+watch(() => [
+    props.datas,
+    props.modelValue,
+], ([datas, val]) => {
+    queryData.value = datas;
+    modelValues.value = val;
+})
+
+//数据筛选处理
+const queryFetch = (key, cb) => {
+    const results = key ? queryData.value.filter(createFilter(key)) : queryData.value
+    cb(results)
+}
+const createFilter = (key) => {
+    return (item) => {
+        const str = item[props.keys]
+        return (str.toLowerCase().indexOf(key.toLowerCase()) === 0)
+    }
+}
+
+//事件
+const emit = defineEmits(['change', 'update:modelValue'])
+
+//被选择
+const handleFetchSelect = (item) => {
+    const str = item[props.keys]
+    emit('update:modelValue', str)
+    emit('change', str)
+}
+
+//失去焦点
+const handleFetchChange = (val) => {
+    emit('update:modelValue', val)
+    emit('change', val)
+}
+</script>

+ 25 - 17
src/global/components/hc-counter/index.vue

@@ -1,9 +1,9 @@
 <template>
     <div class="hc-counter-box" :class="[block?'hc-counter-block':'', size, ui]">
         <div class="counter-box">
-            <div class="counter-btn first" :disabled="modelVal <= 1" @click="moveBtnClick">-</div>
+            <div class="counter-btn first" :disabled="modelValues <= 1" @click="moveBtnClick">-</div>
             <div class='counter-val w-20'>
-                <span>{{modelVal}}</span>
+                <span>{{modelValues}}</span>
                 <span class="ml-2" v-if="text">{{text}}</span>
             </div>
             <div class="counter-btn end" @click="addBtnClick">+</div>
@@ -12,7 +12,7 @@
 </template>
 
 <script setup>
-import {ref, watch} from "vue";
+import {nextTick, ref, watch} from "vue";
 const props = defineProps({
     ui: {
         type: String,
@@ -36,38 +36,46 @@ const props = defineProps({
     },
 })
 
-//转换
-const setModelVal = (value) => {
-    return parseInt(value || 1 + '');
-}
+const modelValues = ref(1)
 
-const modelVal = ref(setModelVal(props.modelValue))
+nextTick(() => {
+    setModelVal(props.modelValue)
+})
 
 //监听
-watch(() => props.modelValue, (value) => {
-    modelVal.value = setModelVal(value)
+watch(() => [
+    props.modelValue,
+], ([val]) => {
+    setModelVal(val)
 })
 
-const emit = defineEmits(['update:modelValue','addClick','moveClick'])
+//转换
+const setModelVal = (val) => {
+    modelValues.value = Number(val)
+}
+
+const emit = defineEmits(['update:modelValue','addClick','moveClick', 'change'])
 
 //减少
 const moveBtnClick = () => {
-    let val = modelVal.value - 1;
-    if (val <= 1) {
-        modelVal.value =  1;
+    let val = modelValues.value - 1;
+    if (val < 1) {
+        modelValues.value =  1;
     } else {
-        modelVal.value =  val;
+        modelValues.value =  val;
         emit('update:modelValue', val)
         emit('moveClick', val)
+        emit('change', val)
     }
 }
 
 //增加
 const addBtnClick = () => {
-    let val = modelVal.value + 1;
-    modelVal.value =  val;
+    let val = modelValues.value + 1;
+    modelValues.value =  val;
     emit('update:modelValue', val)
     emit('addClick', val)
+    emit('change', val)
 }
 </script>
 

+ 39 - 15
src/global/components/hc-menu-simple/index.vue

@@ -1,14 +1,14 @@
 <template>
     <div class="hc-menu-simple-box" :class="ui">
-        <template v-for="item in datas" :key="item.key">
-            <div class="item-box" :class="item?.key === keysValue ? 'active' : ''" @click="MenuClick(item)" @contextmenu.prevent.stop="menuLabelContextMenu($event,item)">
-                <div class="icon-box" v-if="item?.icon">
-                    <HcIcon :name="item?.icon" fill/>
+        <template v-for="item in datas" :key="item[menuProps.key]">
+            <div class="item-box" :class="item[menuProps.key] === keysValue ? 'active' : ''" @click="MenuClick(item)" @contextmenu.prevent.stop="menuLabelContextMenu($event,item)">
+                <div class="icon-box" v-if="item[menuProps.icon]">
+                    <HcIcon :name="item[menuProps.icon]" fill/>
                 </div>
-                <div class="label-box truncate">{{item?.label}}</div>
-                <el-badge :value="item?.badge" v-if="item?.badge > 0"/>
+                <div class="label-box truncate">{{item[menuProps.label]}}</div>
+                <el-badge :value="item[menuProps.badge]" v-if="item[menuProps.badge] > 0"/>
                 <!--操作菜单-->
-                <div class="menu-icon" :class="item.showMenuIcon?'show':''" v-if="menusData.length > 0">
+                <div class="menu-icon" :class="item.showMenuIcon?'show':''" v-if="menusData.length > 0 && !item.isNoContextMenu">
                     <div class="menu-popover-icon" @click.prevent.stop="menuLabelContextMenu($event,item)">
                         <HcIcon name="apps" ui="text-2xl"/>
                     </div>
@@ -22,8 +22,8 @@
 </template>
 
 <script setup>
-import { ref,watch } from "vue";
-import {getObjValue, isValueNull} from "vue-utils-plus"
+import {nextTick, ref, watch} from "vue";
+import {getObjValue, getObjNullValue} from "vue-utils-plus"
 const props = defineProps({
     ui: {
         type: String,
@@ -41,26 +41,50 @@ const props = defineProps({
         type: Array,
         default: () => ([])
     },
+    props: {
+        type: Object,
+        default: () => ({})
+    },
 })
 
 //初始变量
 const keysValue = ref(props.keys)
 const menusData = ref(props.menus)
 const menuItemData = ref({})
+const menuProps = ref({})
 
 //监听
 watch(() => [
     props.keys,
-    props.menus
-], ([keys, menus]) => {
+    props.menus,
+    props.props,
+], ([keys, menus, prop]) => {
     menusData.value = menus
     keysValue.value = keys
+    setMenuProps(prop)
+})
+
+nextTick(() => {
+    setMenuProps(props.props)
 })
 
+
+//设置属性
+const setMenuProps = (prop) => {
+    const obj = getObjValue(prop)
+    menuProps.value = {
+        key: obj.key ?? 'key',
+        icon: obj.icon ?? 'icon',
+        label: obj.label ?? 'label',
+        badge: obj.badge ?? 'badge'
+    }
+}
+
 //事件
 const emit = defineEmits(['change', 'menuTap'])
 const MenuClick = (item) => {
-    if (item?.key !== keysValue.value) {
+    const keys = menuProps.value
+    if (item[keys.key] !== keysValue.value) {
         emit('change', item)
     }
 }
@@ -69,7 +93,7 @@ const MenuClick = (item) => {
 const contextMenuRef = ref(null)
 const menuLabelContextMenu = (e,item) => {
     const rows = menusData.value || [];
-    if (rows.length > 0) {
+    if (rows.length > 0 && !item.isNoContextMenu) {
         e.preventDefault();
         menuItemData.value = item;
         item.showMenuIcon = true
@@ -90,8 +114,8 @@ const handleMenuSelect = ({key}) => {
 //菜单关闭
 const handleMenuClosed = () => {
     const item = menuItemData.value;
-    if (!isValueNull(item)) {
-        menuItemData.value['showMenuIcon'] = false
+    if (getObjNullValue(item)) {
+        menuItemData.value.showMenuIcon = false
     }
 }
 </script>

+ 46 - 0
src/global/components/hc-no-data/index.vue

@@ -0,0 +1,46 @@
+<template>
+    <div class="hc-no-data-box">
+        <div class="no-data-c">
+            <img :src="src?src:notableform" alt=""/>
+            <div class="desc">{{tip}}</div>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import notableform from '~src/assets/view/notableform.svg';
+const props = defineProps({
+    src: {
+        type: [String,Number],
+        default: ''
+    },
+    tip: {
+        type: [String,Number],
+        default: '暂无数据'
+    },
+})
+</script>
+
+<style lang="scss" scoped>
+.hc-no-data-box {
+    position: relative;
+    height: 100%;
+    width: 100%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    .no-data-c {
+        position: relative;
+        width: 160px;
+        img {
+            width: 100%;
+            height: 100%;
+        }
+        .desc {
+            text-align: center;
+            font-size: 12px;
+            color: #9cbdf7;
+        }
+    }
+}
+</style>

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

@@ -19,6 +19,8 @@ import HcContextMenu from './hc-context-menu/index.vue'
 import HcTabsSimple from './hc-tabs-simple/index.vue'
 import HcStatus from './hc-status/index.vue'
 import HcPageHeader from './hc-page-header/index.vue'
+import HcNoData from './hc-no-data/index.vue'
+import hcAutoComplete from './hc-auto-complete/index.vue'
 
 //注册全局组件
 export const setupComponents = (App) => {
@@ -43,4 +45,6 @@ export const setupComponents = (App) => {
     App.component('HcTabsSimple', HcTabsSimple)
     App.component('HcStatus', HcStatus)
     App.component('HcPageHeader', HcPageHeader)
+    App.component('HcNoData', HcNoData)
+    App.component('hcAutoComplete', hcAutoComplete)
 }

+ 4 - 0
src/styles/app/element.scss

@@ -188,6 +188,10 @@
     width: 100%;
 }
 
+.el-autocomplete.block {
+    width: 100%;
+}
+
 //个人中心项目列表
 .hc-project-menu.el-menu {
     --el-menu-level: 0;

+ 233 - 121
src/views/tentative/device/approach.vue

@@ -11,7 +11,7 @@
             </div>
             <div class="hc-menu-contents-box">
                 <el-scrollbar>
-                    <HcMenuSimple :datas="menus" :keys="menuKey" :menus="contextMenu" @change="menuChange" @menuTap="contextMenuClick"/>
+                    <HcMenuSimple :props="menusProps" :datas="menus" :keys="menuKey" :menus="contextMenu" @change="menuChange" @menuTap="contextMenuClick"/>
                 </el-scrollbar>
             </div>
             <!--左右拖动-->
@@ -53,15 +53,15 @@
                 </template>
                 <template #search>
                     <div class="w-32">
-                        <el-select v-model="searchForm.type" placeholder="是否需要效验" clearable>
-                            <el-option label="是" value="1"/>
-                            <el-option label="否" value="2"/>
+                        <el-select v-model="searchForm.isCalibration" placeholder="是否需要效验" clearable>
+                            <el-option label="是" :value="1"/>
+                            <el-option label="否" :value="0"/>
                         </el-select>
                     </div>
                     <div class="w-32 ml-2">
-                        <el-select v-model="searchForm.state" placeholder="状态" clearable>
-                            <el-option label="启用中" value="1"/>
-                            <el-option label="已停用" value="2"/>
+                        <el-select v-model="searchForm.status" placeholder="状态" clearable>
+                            <el-option label="启用中" :value="1"/>
+                            <el-option label="已停用" :value="0"/>
                         </el-select>
                     </div>
                     <div class="w-64 ml-2">
@@ -77,7 +77,14 @@
                         </el-button>
                     </div>
                 </template>
-                <HcTable ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading" isCheck @selection-change="tableSelection"/>
+                <HcTable ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading" isCheck @selection-change="tableSelection">
+                    <template #status="{row}">
+                        {{row.status === 1?'启用中':'已停用'}}
+                    </template>
+                    <template #isCalibration="{row}">
+                        {{row.isCalibration === 1?'是':'否'}}
+                    </template>
+                </HcTable>
                 <template #action>
                     <HcPages :pages="searchForm" @change="pageChange"/>
                 </template>
@@ -85,107 +92,91 @@
         </div>
 
         <!--新增/编辑 节点-->
-        <HcDialog :show="addEditNodeFormModal" title="新增/编辑 分类" widths="30rem" :loading="addEditNodeFormLoading" @save="addEditNodeFormModalSave" @close="addEditNodeFormModalClose">
-            <el-form :model="addEditNodeFormModel" label-width="auto" label-position="top" size="large">
-                <el-form-item class="mb-0" label="分类名称">
-                    <el-input v-model="addEditNodeFormModel.key1" placeholder="请输入分类名称"/>
+        <HcDialog :show="addEditNodeFormModal" :title="`${addEditNodeFormModel.id?'编辑':'新增'}分类`" widths="30rem" :loading="addEditNodeFormLoading" @save="addEditNodeFormModalSave" @close="addEditNodeFormModalClose">
+            <el-form ref="addEditNodeFormRef" :model="addEditNodeFormModel" :rules="addEditNodeFormRules" label-width="auto" label-position="top" size="large">
+                <el-form-item class="mb-0" label="分类名称" prop="className">
+                    <el-input v-model="addEditNodeFormModel.className" placeholder="请输入分类名称"/>
                 </el-form-item>
             </el-form>
         </HcDialog>
 
         <!--新增/编辑-->
-        <HcDialog :show="addEditFormModal" title="新增/编辑 设备信息" widths="50rem" :loading="addEditFormLoading" @close="addEditFormModalClose" @save="addEditFormClick">
+        <HcDialog :show="addEditFormModal" :title="`${addEditFormModel.id?'编辑':'新增'}设备信息`" widths="50rem" :loading="addEditFormLoading" @close="addEditFormModalClose" @save="addEditFormClick">
             <el-form ref="addEditFormRef" :model="addEditFormModel" :rules="addEditFormRules" label-width="auto" size="large">
                 <div class="hc-form-item">
-                    <el-form-item label="设备名称" prop="key1">
-                        <el-input v-model="addEditFormModel.key1"/>
+                    <el-form-item label="设备名称" prop="deviceName">
+                        <el-input v-model="addEditFormModel.deviceName"/>
                     </el-form-item>
                     <el-form-item label="进场日期">
-                        <el-date-picker type="date" v-model="addEditFormModel.key2" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
+                        <el-date-picker type="date" v-model="addEditFormModel.mobilizationDate" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
                     </el-form-item>
                 </div>
                 <div class="hc-form-item">
-                    <el-form-item label="设备分类" prop="key3">
-                        <el-select v-model="addEditFormModel.key3" block>
-                            <el-option v-for="item in menus" :label="item.label" :value="item.key"/>
+                    <el-form-item label="设备分类" prop="deviceClassId">
+                        <el-select v-model="addEditFormModel.deviceClassId" block>
+                            <el-option v-for="item in typeData" :label="item.className" :value="item.id"/>
                         </el-select>
                     </el-form-item>
                     <el-form-item label="测量范围">
-                        <el-input v-model="addEditFormModel.key4"/>
+                        <el-input v-model="addEditFormModel.measuringRange"/>
                     </el-form-item>
                 </div>
                 <div class="hc-form-item">
-                    <el-form-item label="设备编号" prop="key5">
-                        <el-input v-model="addEditFormModel.key5"/>
+                    <el-form-item label="设备编号">
+                        <el-input v-model="addEditFormModel.deviceNumber"/>
                     </el-form-item>
-                    <el-form-item label="精准度" prop="key6">
-                        <el-input v-model="addEditFormModel.key6"/>
+                    <el-form-item label="精准度">
+                        <el-input v-model="addEditFormModel.accuracy"/>
                     </el-form-item>
                 </div>
                 <div class="hc-form-item">
-                    <el-form-item label="设备型号" prop="key7">
-                        <el-input v-model="addEditFormModel.key7"/>
+                    <el-form-item label="设备型号">
+                        <el-input v-model="addEditFormModel.deviceModel"/>
                     </el-form-item>
-                    <el-form-item label="效验周期" prop="key8">
-                        <HcCounter v-model:value="addEditFormModel.key8" text="(月)" size="large" block/>
+                    <el-form-item label="效验周期">
+                        <HcCounter v-model="addEditFormModel.calibrationCycle" text="(月)" size="large" block/>
                     </el-form-item>
                 </div>
                 <div class="hc-form-item">
-                    <el-form-item label="生产厂家" prop="key9">
-                        <el-input v-model="addEditFormModel.key9"/>
-                    </el-form-item>
-                    <el-form-item label="拟用部位" prop="key10">
-                        <el-input v-model="addEditFormModel.key10"/>
-                    </el-form-item>
-                </div>
-                <div class="hc-form-item">
-                    <el-form-item label="供应商单位" prop="key11">
-                        <el-input v-model="addEditFormModel.key11"/>
+                    <el-form-item label="生产厂家">
+                        <el-input v-model="addEditFormModel.manufacturer"/>
                     </el-form-item>
                     <el-form-item label="最近效验时间">
-                        <el-date-picker type="date" v-model="addEditFormModel.key12" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
+                        <el-date-picker type="date" v-model="addEditFormModel.lastCalibrationTime" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
                     </el-form-item>
                 </div>
                 <div class="hc-form-item">
                     <el-form-item label="出厂日期">
-                        <el-date-picker type="date" v-model="addEditFormModel.key13" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
+                        <el-date-picker type="date" v-model="addEditFormModel.factoryDate" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
                     </el-form-item>
                     <el-form-item label="状态">
-                        <el-select v-model="addEditFormModel.key14" placeholder="状态" block>
-                            <el-option label="启用中" value="1"/>
-                            <el-option label="已停用" value="2"/>
+                        <el-select v-model="addEditFormModel.status" placeholder="状态" block>
+                            <el-option label="启用中" :value="1"/>
+                            <el-option label="已停用" :value="0"/>
                         </el-select>
                     </el-form-item>
                 </div>
                 <div class="hc-form-item">
-                    <el-form-item class="flex-1" label="出厂编号" style="margin-right: 24px;">
-                        <el-input v-model="addEditFormModel.key15"/>
+                    <el-form-item label="出厂编号">
+                        <el-input v-model="addEditFormModel.factoryNumber"/>
+                    </el-form-item>
+                    <el-form-item label="管理人员">
+                        <hcAutoComplete v-model="addEditFormModel.managerName" :datas="userListData" keys="userName" placeholder="请选择或输入试验人员名称"/>
                     </el-form-item>
-                    <div class="flex flex-1">
-                        <el-form-item class="flex-1" label="管理人员" style="margin-right: 0;">
-                            <el-select v-model="addEditFormModel.key16" placeholder="试验人员名称" block>
-                                <el-option label="启用中" value="1"/>
-                                <el-option label="已停用" value="2"/>
-                            </el-select>
-                        </el-form-item>
-                        <el-form-item class="w-32" no-label style="margin-left: 10px; flex: initial;">
-                            <el-input v-model="addEditFormModel.key17" block/>
-                        </el-form-item>
-                    </div>
                 </div>
                 <div class="hc-form-item">
                     <el-form-item label="设备采集编号">
-                        <el-input v-model="addEditFormModel.key18"/>
+                        <el-input v-model="addEditFormModel.equipmentAcquisitionNumber"/>
                     </el-form-item>
                     <el-form-item label="是否需要效验">
-                        <el-select v-model="addEditFormModel.key19" block disabled>
-                            <el-option label="是" value="1"/>
-                            <el-option label="否" value="2"/>
+                        <el-select v-model="addEditFormModel.isCalibration" block disabled>
+                            <el-option label="是" :value="1"/>
+                            <el-option label="否" :value="0"/>
                         </el-select>
                     </el-form-item>
                 </div>
                 <el-form-item label="备注">
-                    <el-input v-model="addEditFormModel.desc" type="textarea" placeholder="备注" :autosize="{ minRows: 3}"/>
+                    <el-input v-model="addEditFormModel.remarks" type="textarea" placeholder="备注" :autosize="{ minRows: 3}"/>
                 </el-form-item>
             </el-form>
         </HcDialog>
@@ -210,8 +201,12 @@
 import {ref, onMounted, watch} from "vue";
 import {useAppStore} from "~src/store";
 import {HcIsButton} from "~src/plugins/IsButtons";
-import {getArrValue, getIndex} from "vue-utils-plus"
 import HcDragUpload from "./components/HcDragUpload.vue"
+import approachApi from "~api/tentative/device/approach";
+import {formValidate, getArrValue} from "vue-utils-plus"
+import samplingApi from "~api/tentative/material/sampling";
+import {getContractUserList} from "~api/other";
+//import {getDictionary} from "~api/other";
 
 //初始变量
 const useAppState = useAppStore()
@@ -228,23 +223,47 @@ watch(() => [
 
 //渲染完成
 onMounted(() => {
+    getClassListData()
     setContextMenu()
+    getTableData()
+    getUserListData()
 })
 
+//获取用户列表
+const userListData = ref([])
+const getUserListData = async () => {
+    const { data } = await getContractUserList({
+        contractId: contractId.value
+    })
+    userListData.value = getArrValue(data)
+}
+
 //左侧菜单
-const menuKey = ref('all')
+const menuKey = ref('0')
 const menuItem = ref({})
-const menus = ref([
-    {key: 'all', label: '全部'},
-    {key: 'key1', label: '力学室'},
-    {key: 'key2', label: '集料室'},
-    {key: 'key3', label: '水土室'},
-    {key: 'key4', label: '水泥室'},
-]);
+const menusProps = ref({
+    key: 'id',
+    label: 'className'
+})
+//获取菜单数据
+const menus = ref([]);
+const typeData = ref([]);
+const getClassListData = async () => {
+    const { data } = await approachApi.getClassList({
+        contractId: contractId.value
+    })
+    const arr = getArrValue(data)
+    typeData.value = arr
+    menus.value = [{id: '0', className: '全部', isNoContextMenu: true}, ...arr]
+}
+
 //菜单被点击
 const menuChange = (item) => {
     menuItem.value = item
-    menuKey.value = item?.key
+    menuKey.value = item?.id
+    searchForm.value.deviceClassId = item?.id
+    searchForm.value.current = 1;
+    getTableData()
 }
 
 //菜单的右键菜单
@@ -261,27 +280,29 @@ const setContextMenu = () => {
 }
 
 //菜单的右键菜单被点击
-const contextMenuItem = ref({})
 const contextMenuClick = ({key, item}) => {
-    contextMenuItem.value = item
     if (key === 'edit') {
+        addEditNodeFormModel.value = item
         addEditNodeFormModal.value = true
     } else if (key === 'del') {
-        delNodeModalClick()
+        delNodeModalClick(item.id)
     }
 }
 
 //搜索表单
 const searchForm = ref({
-    type: null, state: null, betweenTime: null, queryValue: null,
+    deviceClassId: '', isCalibration: null, status: null, startTime: null, endTime: null, queryValue: null,
     current: 1, size: 20, total: 0
 })
 
 //日期时间被选择
 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]
+    }
 }
 
 //回车搜索
@@ -308,30 +329,44 @@ const pageChange = ({current, size}) => {
 //表格数据
 const tableRef = ref(null)
 const tableColumn = ref([
-    {key:'key1', name: '设备名称'},
-    {key:'key2', name: '设备分类'},
-    {key:'key3', name: '设备编号'},
-    {key:'key4', name: '设备型号'},
-    {key:'key5', name: '生产厂家'},
-    {key:'key6', name: '出厂日期'},
-    {key:'key7', name: '出厂编号'},
-    {key:'key8', name: '进场日期'},
-    {key:'key9', name: '测量范围'},
-    {key:'key10', name: '精准度'},
-    {key:'key11', name: '校准周期(月)'},
-    {key:'key12', name: '最近效验时间'},
-    {key:'key13', name: '状态'},
-    {key:'key14', name: '是否需要效验'},
-    {key:'key15', name: '设备采集编号'},
-    {key:'key16', name: '设备管理人员'},
-    {key:'key17', name: '备注'},
+    {key:'deviceName', name: '设备名称'},
+    {key:'deviceClassName', name: '设备分类'},
+    {key:'deviceNumber', name: '设备编号'},
+    {key:'deviceModel', name: '设备型号'},
+    {key:'manufacturer', name: '生产厂家'},
+    {key:'factoryDate', name: '出厂日期'},
+    {key:'factoryNumber', name: '出厂编号'},
+    {key:'mobilizationDate', name: '进场日期'},
+    {key:'measuringRange', name: '测量范围'},
+    {key:'accuracy', name: '精准度'},
+    {key:'calibrationCycle', name: '校准周期(月)'},
+    {key:'lastCalibrationTime', name: '最近效验时间'},
+    {key:'status', name: '状态'},
+    {key:'isCalibration', name: '是否需要效验'},
+    {key:'equipmentAcquisitionNumber', name: '设备采集编号'},
+    {key:'managerName', name: '设备管理人员'},
+    {key:'remarks', name: '备注'},
 ])
-const tableLoading = ref(false)
 const tableData = ref([])
 
 //获取数据
-const getTableData = () => {
-
+const tableLoading = ref(false)
+const getTableData = async () => {
+    tableLoading.value = true
+    const { error, code, data } = await approachApi.queryPage({
+        projectId: projectId.value,
+        contractId: contractId.value,
+        ...searchForm.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
+    }
 }
 
 //多选
@@ -344,24 +379,55 @@ const tableSelection = (rows) => {
 
 
 //新增/编辑 分类
+const addEditNodeFormRef = ref(null)
 const addEditNodeFormModal = ref(false)
-const addEditNodeFormModel = ref({key1: ''})
+
+//分类表单
+const addEditNodeFormModel = ref({
+    className: ''
+})
+const addEditNodeFormRules = {
+    className: {
+        required: true,
+        trigger: 'blur',
+        message: "请输入分类名称"
+    },
+}
+
+//新增分类弹窗打开
 const addEditNodeFormModalClick = () => {
+    addEditNodeFormModel.value = {}
     addEditNodeFormModal.value = true
 }
 
 //保存节点信息
 const addEditNodeFormLoading = ref(false)
-const addEditNodeFormModalSave = () => {
-    addEditNodeFormModal.value = false
+const addEditNodeFormModalSave = async () => {
+    const validate = await formValidate(addEditNodeFormRef.value)
+    if (validate) {
+        addEditNodeFormLoading.value = true
+        const { error, code } = await approachApi.getClassSubmit({
+            ...addEditNodeFormModel.value,
+            projectId: projectId.value,
+            contractId: contractId.value
+        })
+        //处理数据
+        addEditNodeFormLoading.value = false
+        if (!error && code === 200) {
+            window?.$message?.success('操作成功')
+            addEditNodeFormModal.value = false
+            await getClassListData()
+        }
+    }
 }
 //关闭分类编辑弹窗
 const addEditNodeFormModalClose = () => {
+    addEditNodeFormModel.value = {}
     addEditNodeFormModal.value = false
 }
 
 //删除分类
-const delNodeModalClick = () => {
+const delNodeModalClick = (id) => {
     window?.$messageBox?.alert('请谨慎考虑后,确认是否需要删除?', '删除提醒', {
         showCancelButton: true,
         confirmButtonText: '确认删除',
@@ -369,12 +435,26 @@ const delNodeModalClick = () => {
         type: 'warning',
         callback: (action) => {
             if (action === 'confirm') {
-                //removeContractTreeNode()
+                setClassRemove(id)
             }
         }
     })
 }
 
+//删除分类
+const setClassRemove = async (id) => {
+    const { error, code } = await approachApi.setClassRemove({
+        projectId: projectId.value,
+        contractId: contractId.value,
+        id: id
+    })
+    //处理数据
+    if (!error && code === 200) {
+        window?.$message?.success('操作成功')
+        await getClassListData()
+    }
+}
+
 
 //导入
 const importModal = ref(false)
@@ -407,41 +487,73 @@ const tableImportSelection = (rows) => {
 }
 
 
-
-//新增/编辑 材料进场
-const addEditFormModal = ref(false)
-const addFormModalClick = () => {
-    addEditFormModal.value = true
-}
-const editFormModalClick = () => {
-    addEditFormModal.value = true
-}
-const addEditFormModalClose = () => {
-    addEditFormModal.value = false
-}
-
 //新增/编辑 表单
 const addEditFormRef = ref(null)
 const addEditFormModel = ref({})
 const addEditFormRules = {
-    key1: {
+    deviceName: {
         required: true,
         trigger: 'blur',
-        message: "请输入"
+        message: "请输入设备名称"
     },
-    key2: {
+    deviceClassId: {
         required: true,
         trigger: 'blur',
-        message: "请选择"
+        message: "请选择设备分类"
     },
 }
 
+//新增 设备信息
+const addEditFormModal = ref(false)
+const addFormModalClick = () => {
+    addEditFormModel.value = {
+        isCalibration: 0,
+        status: 1,
+    }
+    addEditFormModal.value = true
+}
+
+//编辑 设备信息
+const editFormModalClick = () => {
+    addEditFormModal.value = true
+}
+
+//关闭新增/编辑的弹窗
+const addEditFormModalClose = () => {
+    addEditFormModal.value = false
+    addEditFormModel.value = {
+        isCalibration: 0,
+        status: 1
+    }
+}
+
 //新增/编辑 保存
 const addEditFormLoading = ref(false)
-const addEditFormClick = () => {
-
+const addEditFormClick = async () => {
+    const validate = await formValidate(addEditFormRef.value)
+    if (validate) {
+        addEditFormLoading.value = true
+        const { error, code } = await approachApi.submitForm({
+            ...addEditFormModel.value,
+            projectId: projectId.value,
+            contractId: contractId.value
+        })
+        //处理数据
+        addEditFormLoading.value = false
+        if (!error && code === 200) {
+            window?.$message?.success('操作成功')
+            addEditFormModal.value = false
+            await getTableData()
+        }
+    }
 }
 
+//拼接ID
+const rowsToId = (rows) => {
+    return rows.map((obj) => {
+        return obj.id;
+    }).join(",")
+}
 
 //左右拖动,改变树形结构宽度
 const leftWidth = ref(240);

+ 1 - 1
src/views/tentative/material/sampling.vue

@@ -80,7 +80,7 @@
         </div>
 
         <!--新增/编辑-->
-        <HcDialog :show="addEditFormModal" title="新增/编辑 样品信息" widths="50rem" isRowFooter @close="addEditFormModalClose">
+        <HcDialog :show="addEditFormModal" :title="`${addEditFormModel.id?'编辑':'新增'}样品信息`" widths="50rem" isRowFooter @close="addEditFormModalClose">
             <el-form ref="addEditFormRef" :model="addEditFormModel" :rules="addEditFormRules" label-width="auto" size="large">
                 <div class="hc-form-item">
                     <el-form-item label="样品名称" prop="materialName">