Kaynağa Gözat

外委实验

ZaiZai 2 yıl önce
ebeveyn
işleme
68ecc438c4

+ 0 - 8
src/api/modules/tentative/detect/third.js

@@ -33,12 +33,4 @@ export default {
             data: form
         }, msg);
     },
-    //查询关联样品信息列表
-    async samplingData(form, msg = true) {
-        return httpApi({
-            url: '/api/blade-business/detection/sample/list-info',
-            method: 'get',
-            params: form
-        }, msg);
-    },
 }

+ 2 - 0
src/styles/tentative/detect/third.scss

@@ -10,8 +10,10 @@
     .hc-links-sample-tree-box {
         margin-right: 24px;
         border: 1px solid #EEEEEE;
+        width: 300px;
     }
     .hc-links-sample-table-box {
+        display: inline-grid;
         flex: 1;
     }
 }

+ 208 - 0
src/views/tentative/detect/components/FormItemUpload.vue

@@ -0,0 +1,208 @@
+<template>
+    <div class="form-item-dashed hover flex" @click="importModalClick">
+        <div class="flex-1 truncate" v-if="uploadValue">{{fileNameValue}}</div>
+        <div class="flex-1" v-else>点此上传文件</div>
+        <div class="text-hover" @click.stop="previewClick" v-if="uploadValue">预览文件</div>
+    </div>
+
+    <!--上传-->
+    <HcDialog :show="importModal" title="上传文件" widths="38rem" saveText="确认上传" :loading="uploadDisabled" @close="importModalClose" @save="importModalYesClick">
+        <el-upload ref="uploadRef" class="hc-upload-border approach" drag :action="api + action" :headers="getTokenHeader()" :data="uploadData" :accept="accept" :disabled="uploadDisabled" :limit="1" :show-file-list="false"
+                   :before-upload="beforeUpload" :on-exceed="uploadExceed" :on-progress="uploadprogress" :on-success="uploadSuccess" :on-error="uploadError" :on-change="uploadChange" :auto-upload="false">
+            <div class="hc-upload-loading upload-file-info" v-loading="uploadDisabled" element-loading-text="上传中...">
+                <template v-if="uploadFileInfo?.name">
+                    <HcIcon name="file-text" class="upload-file-icon"/>
+                    <div class="upload-file-name">{{uploadFileInfo?.name}}</div>
+                </template>
+                <template v-else>
+                    <HcIcon name="upload-cloud" class="upload-icon"/>
+                    <div class="el-upload__text">拖动文件到这里 或 <em>点击这里选择文件</em> 并上传</div>
+                </template>
+            </div>
+            <template #tip>
+                <div class="el-upload__tip">允许格式:{{formatTip}}, 文件大小 小于 {{size}}MB</div>
+            </template>
+        </el-upload>
+    </HcDialog>
+</template>
+
+<script setup>
+import {ref, watch, onMounted} from "vue";
+import {getTokenHeader} from '~src/api/request/header';
+import {isSize} from "vue-utils-plus"
+import {genFileId} from "element-plus";
+const props = defineProps({
+    modelValue: {
+        type: String,
+        default: ''
+    },
+    datas: {
+        type: Object,
+        default: () => ({})
+    },
+    action: {
+        type: String,
+        default: "upload-file"
+    },
+    accept: {
+        type: String,
+        default: "image/png,image/jpg,image/jpeg,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,application/pdf,.doc,.docx,application/msword"
+    },
+    size: {
+        type: Number,
+        default: 20
+    },
+    formatTip: {
+        type: String,
+        default: "png/jpg/jpeg/excel/pdf/doc/docx"
+    },
+})
+
+//变量
+const uploadRef = ref(null)
+const uploadData = ref(props.datas)
+const uploadFileInfo = ref({})
+const uploadDisabled = ref(false)
+const uploadValue = ref(props.modelValue)
+
+const api = '/api/blade-resource/oss/endpoint/';
+
+//监听
+watch(() => [
+    props.datas,
+    props.modelValue
+], ([datas,val]) => {
+    uploadData.value = datas
+    uploadValue.value = val
+    getFileName(val)
+})
+
+onMounted(() => {
+    getFileName(props.modelValue)
+})
+
+//事件
+const emit = defineEmits(['progress', 'change', 'update:modelValue'])
+
+//上传弹窗
+const importModal = ref(false)
+const importModalClick = () => {
+    importModal.value = true
+}
+
+//确认上传
+const importModalYesClick = () => {
+    uploadRef.value?.submit()
+}
+
+//关闭上传
+const importModalClose = () => {
+    uploadRef.value?.clearFiles()
+    importModal.value = false
+}
+
+//获取文件名
+const fileNameValue = ref('')
+const getFileName = (url) => {
+    if (url) {
+        let num = url.lastIndexOf('/') + 1
+        fileNameValue.value = url.substring(num)
+    } else {
+        fileNameValue.value = ''
+    }
+}
+
+
+//上传前
+const beforeUpload = async (file) => {
+    if (isSize(file?.size,props.size)) {
+        return true;
+    } else {
+        window?.$message?.warning('文件大小, 不能过' + props.size + 'M!');
+        return false;
+    }
+}
+
+//超出限制时
+const uploadExceed = (files) => {
+    uploadRef.value?.clearFiles()
+    const file = files[0]
+    file.uid = genFileId()
+    uploadRef.value?.handleStart(file)
+}
+
+//上传中
+const uploadprogress = () => {
+    uploadDisabled.value = true
+    emit('progress', true)
+}
+
+//上传完成
+const uploadSuccess = ({code, data}) => {
+    uploadDisabled.value = false
+    emit('progress', false)
+    const pdfUrl = data?.pdfUrl ?? ''
+    if (code === 200 && pdfUrl) {
+        uploadValue.value = pdfUrl
+        window?.$message?.success('上传成功');
+        importModal.value = false
+        getFileName(pdfUrl)
+        //事件
+        emit('update:modelValue', pdfUrl)
+        emit('change', pdfUrl)
+    } else {
+        window?.$message?.error('上传失败');
+    }
+}
+
+//上传失败
+const uploadError = () => {
+    uploadDisabled.value = false
+    emit('progress', false)
+    window?.$message?.error('上传失败');
+}
+
+//文件改变时
+const uploadChange = (file) => {
+    uploadFileInfo.value = file
+}
+
+//预览文件
+const previewClick = () => {
+    const pdfUrl = uploadValue.value ?? ''
+    if (pdfUrl) window.open(pdfUrl,'_blank')
+}
+</script>
+
+<style lang="scss">
+.hc-upload-border.approach {
+    .el-upload-dragger {
+        padding: 24px;
+    }
+    .hc-upload-loading.upload-file-info {
+        .hc-icon-i {
+            font-size: 40px;
+        }
+        .upload-icon {
+            color: var(--el-text-color-placeholder);
+        }
+        .upload-file-icon {
+            color: var(--el-color-primary-light-5);
+        }
+        .el-upload__text {
+            margin-top: 10px;
+        }
+        .upload-file-name {
+            margin-top: 10px;
+            font-size: 14px;
+            text-align: center;
+            color: var(--el-color-primary);
+        }
+    }
+    .el-upload__tip {
+        font-size: 14px;
+        margin-top: 16px;
+        color: var(--el-text-color-placeholder);
+    }
+}
+</style>

+ 6 - 1
src/views/tentative/detect/components/HcTreeData.vue

@@ -35,7 +35,7 @@
 </template>
 
 <script setup>
-import {onMounted, ref, watch} from "vue";
+import {nextTick, onMounted, ref, watch} from "vue";
 import {HcIsButton} from "~src/plugins/IsButtons";
 import {formValidate, getArrValue} from "vue-utils-plus"
 import {getTreeAll, submitTree, removeTree} from "~api/tentative/detect"
@@ -118,6 +118,11 @@ const getTreeDatas = async () => {
     })
     if (!error && code === 200) {
         treeDatas.value = getArrValue(data[dataType.value])
+        if (treeKey.value) {
+            await nextTick(() => {
+                document.getElementById(`${idPrefix.value}${treeKey.value}`)?.click()
+            })
+        }
     } else {
         treeDatas.value = []
     }

+ 276 - 103
src/views/tentative/detect/third.vue

@@ -22,25 +22,25 @@
             <HcCard :scrollbar="false" actionSize="lg">
                 <template #header>
                     <HcTooltip keys="tentative_detect_third_add">
-                        <el-button type="primary" hc-btn @click="addFormModalClick">
+                        <el-button type="primary" hc-btn :disabled="!thirdTreeKeys" @click="addFormModalClick">
                             <HcIcon name="add-circle"/>
                             <span>新增</span>
                         </el-button>
                     </HcTooltip>
                     <HcTooltip keys="tentative_detect_third_edit">
-                        <el-button hc-btn @click="editFormModalClick">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="editFormModalClick">
                             <HcIcon name="edit"/>
                             <span>编辑</span>
                         </el-button>
                     </HcTooltip>
                     <HcTooltip keys="tentative_detect_third_copy">
-                        <el-button hc-btn @click="copyTableModalClick">
+                        <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" :loading="copyLoading" @click="copyTableModalClick">
                             <HcIcon name="file-copy-2"/>
                             <span>复制</span>
                         </el-button>
                     </HcTooltip>
                     <HcTooltip keys="tentative_detect_third_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>
@@ -76,118 +76,126 @@
         </div>
 
         <!--新增/编辑-->
-        <HcDialog :show="addEditFormModal" title="新增/编辑 外委试验信息" widths="70rem" isRowFooter :isClose="false" @close="addEditFormModalClose">
+        <HcDialog :show="addEditFormModal" :title="formModalTitle + ' 外委试验信息'" widths="70rem" isRowFooter :isClose="false" @close="addEditFormModalClose">
             <template #extra>
                 <HcNewSwitch :datas="tabTypeTab" :keys="tabTypeKey" @change="tabTypeChange"/>
             </template>
             <el-form ref="addEditFormRef" :model="addEditFormModel" :rules="addEditFormRules" label-width="auto" size="large" v-if="tabTypeKey === 'tab1'">
                 <div class="hc-form-item">
                     <el-form-item label="合同段">
-                        <el-select v-model="addEditFormModel.key1" block placeholder="请选择合同段">
+                        <el-select v-model="addEditFormModel.contractId" block placeholder="请选择合同段">
                             <el-option v-for="item in projectInfo?.contractInfoList" :key="item.id" :label="item['name']" :value="item['id']"/>
                         </el-select>
                     </el-form-item>
                     <el-form-item label="合格状态">
-                        <el-radio-group v-model="addEditFormModel.key2" size="large">
-                            <el-radio :label="1">不合格</el-radio>
-                            <el-radio :label="2">合格</el-radio>
+                        <el-radio-group v-model="addEditFormModel.status" size="large">
+                            <el-radio :label="0">不合格</el-radio>
+                            <el-radio :label="1">合格</el-radio>
                         </el-radio-group>
                     </el-form-item>
                 </div>
                 <div class="hc-form-item">
                     <el-form-item label="委托编号">
-                        <el-input v-model="addEditFormModel.key3"/>
+                        <el-input v-model="addEditFormModel.entrustNo"/>
                     </el-form-item>
                     <el-form-item label="样品名称">
-                        <el-input v-model="addEditFormModel.key4"/>
+                        <el-input v-model="addEditFormModel.materialName"/>
                     </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="委托单位" prop="entrustCompany">
+                        <el-input v-model="addEditFormModel.entrustCompany"/>
                     </el-form-item>
                     <el-form-item label="样品编号">
-                        <el-input v-model="addEditFormModel.key6"/>
+                        <el-input v-model="addEditFormModel.specificationNumber"/>
                     </el-form-item>
                 </div>
                 <div class="hc-form-item">
                     <el-form-item label="证书编号">
-                        <el-input v-model="addEditFormModel.key7" placeholder="检测机构资质证书编号"/>
+                        <el-input v-model="addEditFormModel.testingAgencyCertificateNo" placeholder="检测机构资质证书编号"/>
                     </el-form-item>
                     <el-form-item label="样品数量">
-                        <el-input v-model="addEditFormModel.key8"/>
+                        <el-input v-model="addEditFormModel.materialCount"/>
                     </el-form-item>
                 </div>
                 <div class="hc-form-item">
                     <el-form-item label="取样人">
-                        <el-input v-model="addEditFormModel.key9"/>
+                        <el-input v-model="addEditFormModel.userName"/>
                     </el-form-item>
                     <el-form-item label="代表数量">
-                        <el-input v-model="addEditFormModel.key10"/>
+                        <el-input v-model="addEditFormModel.representativeCount"/>
                     </el-form-item>
                 </div>
                 <div class="hc-form-item">
                     <el-form-item label="见证人">
-                        <el-input v-model="addEditFormModel.key11"/>
+                        <el-input v-model="addEditFormModel.witness"/>
                     </el-form-item>
                     <el-form-item label="检测机构">
-                        <el-input v-model="addEditFormModel.key12"/>
+                        <el-input v-model="addEditFormModel.inspectionOrganization"/>
                     </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.sampleDeliveryDate" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
                     </el-form-item>
                     <el-form-item label="产地">
-                        <el-input v-model="addEditFormModel.key14"/>
+                        <el-input v-model="addEditFormModel.placeOfOrigin"/>
                     </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.samplingDate" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
                     </el-form-item>
                     <el-form-item label="取样地点">
-                        <el-input v-model="addEditFormModel.key14"/>
+                        <el-input v-model="addEditFormModel.samplingLocation"/>
                     </el-form-item>
                 </div>
                 <div class="hc-form-item">
                     <el-form-item label="报告日期">
-                        <el-date-picker type="date" v-model="addEditFormModel.key15" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
+                        <el-date-picker type="date" v-model="addEditFormModel.reportDate" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
                     </el-form-item>
                     <el-form-item label="生产批号">
-                        <el-input v-model="addEditFormModel.key16"/>
+                        <el-input v-model="addEditFormModel.batchNumber"/>
                     </el-form-item>
                 </div>
                 <div class="hc-form-item">
                     <el-form-item label="报告编号">
-                        <el-input v-model="addEditFormModel.key17"/>
+                        <el-input v-model="addEditFormModel.reportNo"/>
                     </el-form-item>
                     <el-form-item label="工程部位">
-                        <el-input v-model="addEditFormModel.key18"/>
+                        <el-input v-model="addEditFormModel.projectPosition"/>
                     </el-form-item>
                 </div>
-                <el-form-item label="委托单附件" prop="key13">
-                    <div class="form-item-dashed hover">上传文件(待定,看后端接口后,再定)</div>
+                <div class="hc-form-item">
+                    <el-form-item label="试验类型">
+                        <el-input v-model="addEditFormModel.trialType"/>
+                    </el-form-item>
+                    <el-form-item label="规格型号">
+                        <el-input v-model="addEditFormModel.specificationModel"/>
+                    </el-form-item>
+                </div>
+                <el-form-item label="委托单附件">
+                    <FormItemUpload v-model="addEditFormModel.delegationOrderUrl"/>
                 </el-form-item>
-                <el-form-item label="记录表附件" prop="key13">
-                    <div class="form-item-dashed hover">上传文件(待定,看后端接口后,再定)</div>
+                <el-form-item label="记录表附件">
+                    <FormItemUpload v-model="addEditFormModel.recordTableUrl"/>
                 </el-form-item>
-                <el-form-item label="报告单附件" prop="key13">
-                    <div class="form-item-dashed hover">上传文件(待定,看后端接口后,再定)</div>
+                <el-form-item label="报告单附件">
+                    <FormItemUpload v-model="addEditFormModel.reportAttachmentUrl"/>
                 </el-form-item>
             </el-form>
             <el-form ref="addEditFormRef" :model="addEditFormModel" label-position="top" label-width="auto" size="large" v-if="tabTypeKey === 'tab2'">
                 <el-form-item label="检测依据">
-                    <el-input v-model="addEditFormModel.desc1" type="textarea" placeholder="请输入检测依据" :autosize="{ minRows: 3}"/>
+                    <el-input v-model="addEditFormModel.testBasisText" type="textarea" placeholder="请输入检测依据" :autosize="{ minRows: 3}"/>
                 </el-form-item>
                 <el-form-item label="评定标准">
-                    <el-input v-model="addEditFormModel.desc2" type="textarea" placeholder="请输入评定标准" :autosize="{ minRows: 3}"/>
+                    <el-input v-model="addEditFormModel.evaluationCriteriaText" type="textarea" placeholder="请输入评定标准" :autosize="{ minRows: 3}"/>
                 </el-form-item>
                 <el-form-item label="检测结论">
-                    <el-input v-model="addEditFormModel.desc3" type="textarea" placeholder="请输入检测结论" :autosize="{ minRows: 3}"/>
+                    <el-input v-model="addEditFormModel.testConclusionText" type="textarea" placeholder="请输入检测结论" :autosize="{ minRows: 3}"/>
                 </el-form-item>
                 <el-form-item label="备注">
-                    <el-input v-model="addEditFormModel.desc4" type="textarea" placeholder="请输入备注" :autosize="{ minRows: 3}"/>
+                    <el-input v-model="addEditFormModel.remarks" type="textarea" placeholder="请输入备注" :autosize="{ minRows: 3}"/>
                 </el-form-item>
             </el-form>
             <template #leftRowFooter>
@@ -209,17 +217,35 @@
         </HcDialog>
 
         <!--选择样品信息-->
-        <HcDialog :show="linksSampleModal" title="选择样品信息" widths="70%" isTable saveText="确认" @close="linksSampleModalClose" @save="linksSampleModalSave">
+        <HcDialog :show="linksSampleModal" title="选择样品信息" widths="70%" isTable isRowFooter @close="linksSampleModalClose">
             <div class="hc-links-sample-modal-box">
                 <div class="hc-links-sample-tree-box">
                     <el-scrollbar>
-                        <!--WbsTree :autoExpandKeys="treeAutoExpandKeys" :projectId="projectId" :contractId="contractId"/-->
+                        <TestTree :projectId="projectId"
+                            :wbsTempId="projectInfo?.referenceWbsTemplateIdTrial"
+                            :wbsType="2"
+                            :tenantId="userInfo?.tenant_id"
+                            @nodeTap="sampleTreeClick"/>
                     </el-scrollbar>
                 </div>
                 <div class="hc-links-sample-table-box">
-                    <HcTable ref="tableSampleRef" :column="linksSampleTableColumn" :datas="linksSampleTableData" :loading="linksSampleTableLoading" :isIndex="false" isCheck @selection-change="linksSampleTableSelection"/>
+                    <HcTable :column="linksSampleTableColumn" :datas="linksSampleTableData" :loading="linksSampleTableLoading" :isIndex="false">
+                        <template #action="{row}">
+                            <el-button type="primary" size="small" plain v-if="addEditFormModel.sampleId === row.id">已选择</el-button>
+                            <el-button type="primary" size="small" plain @click="linksSampleRow(row)" v-else>选择</el-button>
+                        </template>
+                    </HcTable>
                 </div>
             </div>
+            <template #leftRowFooter>
+                <el-button size="large" @click="linksSampleModalClose">
+                    <HcIcon name="close"/>
+                    <span>取消</span>
+                </el-button>
+            </template>
+            <template #rightRowFooter>
+                <HcPages :pages="searchSampleForm" @change="pageSampleChange"/>
+            </template>
         </HcDialog>
 
     </div>
@@ -229,15 +255,20 @@
 import {ref, watch, onMounted} from "vue";
 import {useAppStore} from "~src/store";
 import HcTreeData from "./components/HcTreeData.vue"
+import FormItemUpload from "./components/FormItemUpload.vue"
+import TestTree from "../material/components/TestTree.vue"
 import {getStoreData, setStoreData} from '~src/utils/storage'
 import dataApi from "~api/tentative/detect/third";
-import {getArrValue} from "vue-utils-plus";
+import samplingApi from "~api/tentative/material/sampling"
+import {formValidate, getArrValue} from "vue-utils-plus";
+import {delMessage, rowsToId} from "~uti/tools";
 
 //变量
 const useAppState = useAppStore()
 const projectId = ref(useAppState.getProjectId);
 const contractId = ref(useAppState.getContractId);
 const projectInfo = ref(useAppState.getProjectInfo);
+const userInfo = ref(useAppState.getUserInfo);
 const isCollapse = ref(useAppState.getCollapse)
 
 //监听
@@ -318,20 +349,20 @@ const pageChange = ({current, size}) => {
 //表格数据
 const tableRef = ref(null)
 const tableColumn = ref([
-    {key:'entrustNo', name: '委托编号'},
-    {key:'reportNo', name: '报告编号'},
-    {key:'specificationNumber', name: '样品编号'},
-    {key:'trialTypeName', name: '试验类型'},
-    {key:'materialName', name: '样品名称'},
-    {key:'specificationModel', name: '规格型号'},
-    {key:'entrustCompany', name: '委托单位'},
-    {key:'inspectionOrganization', name: '检测机构'},
-    {key:'projectPosition', name: '工程部位'},
-    {key:'userName', name: '送样人'},
-    {key:'sampleDeliveryDate', name: '送样日期'},
-    {key:'reportDate', name: '报告日期'},
-    {key:'testConclusionText', name: '检测结果'},
-    {key:'remarks', name: '备注'},
+    {key:'entrustNo', name: '委托编号', width: 150},
+    {key:'reportNo', name: '报告编号', width: 150},
+    {key:'specificationNumber', name: '样品编号', width: 150},
+    {key:'trialType', name: '试验类型', width: 150},
+    {key:'materialName', name: '样品名称', width: 150},
+    {key:'specificationModel', name: '规格型号', width: 150},
+    {key:'entrustCompany', name: '委托单位', width: 150},
+    {key:'inspectionOrganization', name: '检测机构', width: 150},
+    {key:'projectPosition', name: '工程部位', width: 150},
+    {key:'userName', name: '送样人', width: 100},
+    {key:'sampleDeliveryDate', name: '送样日期', width: 150},
+    {key:'reportDate', name: '报告日期', width: 150},
+    {key:'testConclusionText', name: '检测结果', width: 150},
+    {key:'remarks', name: '备注', width: 180},
 ])
 const tableData = ref([])
 
@@ -363,14 +394,36 @@ const tableSelection = (rows) => {
 
 //新增/编辑
 const addEditFormModal = ref(false)
+const formModalTitle = ref('新增')
 const addFormModalClick = () => {
-    addEditFormModal.value = true
+    const { data } = nodeItemInfo.value
+    if (data?.id) {
+        addEditFormModel.value = {
+            nodeId: data.id, trialType: data.nodeName, status: 1
+        }
+        formModalTitle.value = '新增'
+        addEditFormModal.value = true
+    } else {
+        window.$message.warning('请先选择一个树节点')
+    }
 }
+
+//编辑
 const editFormModalClick = () => {
-    addEditFormModal.value = true
+    const keys = tableCheckedKeys.value
+    if (keys.length === 1) {
+        addEditFormModel.value = keys[0]
+        formModalTitle.value = '编辑'
+        addEditFormModal.value = true
+    } else if (keys.length > 1) {
+        window?.$message?.warning('只能选择一条数据编辑')
+    }
 }
+
+//关闭
 const addEditFormModalClose = () => {
     addEditFormModal.value = false
+    addEditFormModel.value = {}
 }
 
 //类型tab数据和相关处理
@@ -387,93 +440,213 @@ const tabTypeChange = (item) => {
 const addEditFormRef = ref(null)
 const addEditFormModel = ref({})
 const addEditFormRules = {
-    key5: {
+    entrustCompany: {
         required: true,
         trigger: 'blur',
-        message: "请输入"
+        message: "请输入委托单位"
     }
 }
 
-//新增/编辑 保存
+//新增/编辑/复制弹窗 保存
 const addEditFormLoading = ref(false)
-const addEditFormClick = () => {
+const addEditFormClick = async () => {
+    const validate = await formValidate(addEditFormRef.value)
+    if (validate) {
+        if (formModalTitle.value === '复制') {
+            await copyFormApi()
+        } else {
+            await submitFormApi()
+        }
+    }
+}
 
+//新增、编辑 提交保存
+const submitFormApi = async () => {
+    addEditFormLoading.value = true
+    const { error, code } = await dataApi.submitForm({
+        ...addEditFormModel.value,
+        projectId: projectId.value,
+        contractId: contractId.value
+    })
+    //处理数据
+    addEditFormLoading.value = false
+    if (!error && code === 200) {
+        window?.$message?.success('操作成功')
+        addEditFormModal.value = false
+        await getTableData()
+    }
 }
 
 //复制
 const copyTableModalClick = () => {
-    addEditFormModal.value = true
+    const rows = tableCheckedKeys.value
+    if (rows.length === 1) {
+        addEditFormModel.value = rows[0]
+        formModalTitle.value = '复制'
+        addEditFormModal.value = true
+    } else if (rows.length > 1) {
+        const ids = rowsToId(rows)
+        batchCopyFormApi(ids)
+    }
+}
+
+//复制提交保存
+const copyFormApi = async () => {
+    addEditFormLoading.value = true
+    const { error, code } = await dataApi.copyData({
+        ...addEditFormModel.value,
+        projectId: projectId.value,
+        contractId: contractId.value
+    })
+    //处理数据
+    addEditFormLoading.value = false
+    if (!error && code === 200) {
+        window?.$message?.success('操作成功')
+        addEditFormModal.value = false
+        await getTableData()
+    }
+}
+
+//批量复制 提交保存
+const copyLoading = ref(false)
+const batchCopyFormApi = async (ids) => {
+    copyLoading.value = true
+    const { error, code } = await dataApi.copyData({
+        projectId: projectId.value,
+        contractId: contractId.value,
+        ids: ids,
+    })
+    //处理数据
+    copyLoading.value = false
+    if (!error && code === 200) {
+        window?.$message?.success('操作成功')
+        await getTableData()
+    }
 }
 
 //删除
 const delModalClick = () => {
-    window?.$messageBox?.alert('请谨慎考虑后,确认是否需要删除?', '删除提醒', {
-        showCancelButton: true,
-        confirmButtonText: '确认删除',
-        cancelButtonText: '取消',
-        type: 'warning',
-        callback: (action) => {
-            if (action === 'confirm') {
-                //removeContractTreeNode()
-            }
-        }
+    delMessage(() => {
+        tableRemoveData()
     })
 }
 
+//批量删除
+const tableRemoveData = async () => {
+    const rows = tableCheckedKeys.value
+    if (rows.length > 0 ) {
+        const ids = rowsToId(rows)
+        //删除请求
+        const { error, code } = await dataApi.removeData({
+            projectId: projectId.value,
+            contractId: contractId.value,
+            ids: ids,
+        })
+        //处理数据
+        if (!error && code === 200) {
+            window?.$message?.success('操作成功')
+            searchClick()
+        }
+    }
+}
+
+//关联数据搜索
+const searchSampleForm = ref({
+    current: 1, size: 20, total: 0
+})
+
 //关联进场材料
 const linksSampleModal = ref(false)
-const linksSampleModalClick = (row) => {
+const linksSampleModalClick = () => {
+    searchSampleForm.value.current = 1;
+    linksSampleTableData.value = []
     linksSampleModal.value = true
 }
 
+//树被点击
+const sampleTreeClick = ({data}) => {
+    searchSampleForm.value.nodeId = data['primaryKeyId'] || ''
+    searchSampleForm.value.current = 1;
+    getLinksSampleTable()
+}
+
+//分页被点击
+const pageSampleChange = ({current, size}) => {
+    searchSampleForm.value.current = current
+    searchSampleForm.value.size = size
+    getLinksSampleTable()
+}
+
 //关联进场材料数据
-const tableSampleRef = ref(null)
 const linksSampleTableColumn = 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:'materialName', name: '取样名称'},
+    {key:'samplingDate', name: '取样日期'},
+    {key:'specificationNumber', name: '样品编号'},
+    {key:'specificationModel', name: '规格型号'},
+    {key:'materialCount', name: '试样数量'},
+    {key:'calculationUnit', name: '计算单位'},
+    {key:'proposedPosition', name: '拟用部位'},
+    {key:'representativeCount', name: '代表数量'},
+    {key:'userName', name: '取样人'}
 ])
 const linksSampleTableData = ref([])
-const linksSampleTableLoading = ref(false)
 
-//多选
-const tableSampleCheckedKeys = ref([]);
-const linksSampleTableSelection = (rows) => {
-    tableSampleCheckedKeys.value = rows.filter((item) => {
-        return (item??'') !== '';
-    })
+//获取关联数据
+const linksSampleTableLoading = ref(false)
+const getLinksSampleTable = async () => {
+    const { nodeId } = searchSampleForm.value
+    if (nodeId) {
+        linksSampleTableLoading.value = true
+        const { error, code, data } = await samplingApi.queryPage({
+            ...searchSampleForm.value,
+            projectId: projectId.value,
+            contractId: contractId.value
+        })
+        //处理数据
+        linksSampleTableLoading.value = false
+        if (!error && code === 200) {
+            linksSampleTableData.value = getArrValue(data['records'])
+            searchSampleForm.value.total = data.total || 0
+        } else {
+            linksSampleTableData.value = []
+            searchSampleForm.value.total = 0
+        }
+    } else {
+        window?.$message?.warning('请先选择一个树节点')
+    }
 }
 
-const linksSampleModalSave = () => {
-
+//确认关联
+const linksSampleRow = (row) => {
+    const form = addEditFormModel.value;
+    form.materialName = row.materialName ?? ''                  //样品名称
+    form.specificationNumber = row.specificationNumber ?? ''    //样品编号
+    form.materialCount = row.materialCount ?? ''                //试样数量
+    form.userName = row.userName ?? ''                          //取样人
+    form.representativeCount = row.representativeCount ?? ''    //代表数量
+    form.samplingDate = row.samplingDate ?? ''                  //取样日期
+    form.samplingLocation = row.samplingLocation ?? ''          //取样地点
+    form.batchNumber = row.batchNumber ?? ''                    //生产批号
+    form.specificationModel = row.specificationModel ?? ''      //规格型号
+    form.sampleId = row.id                                      //关联ID
+    //更新数据
+    addEditFormModel.value = form
 }
 
 //关闭关联进场材料
 const linksSampleModalClose = () => {
     linksSampleModal.value = false
-}
-
-
-//拼接ID
-const rowsToId = (rows) => {
-    return rows.map((obj) => {
-        return obj.id;
-    }).join(",")
+    linksSampleTableData.value = []
+    searchSampleForm.value.current = 1;
 }
 
 //左右拖动,改变树形结构宽度
-const leftWidth = ref(382);
+const leftWidth = ref(300);
 const onmousedown = () => {
     const leftNum = isCollapse.value ? 142 : 272
     document.onmousemove = (ve) => {
         let diffVal = ve.clientX - leftNum;
-        if(diffVal >= 310 && diffVal <= 900) {
+        if(diffVal >= 260 && diffVal <= 700) {
             leftWidth.value = diffVal;
         }
     }