Newer
Older
xc-business-system / src / views / equipement / standard / book / components / basic.vue
dutingting on 9 May 2024 53 KB bug修复
<!-- 标准装置台账信息 基本信息 -->
<script name="StandardBookBasic" lang="ts" setup>
import type { Ref } from 'vue'
import { onMounted, ref } from 'vue'
import dayjs from 'dayjs'
import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
import type { FormRules } from 'element-plus'
import type { IForm, ITech, ITechFiles } from '../book-interface'
import selectBuildStandardDialog from '../dialog/selectBuildStandardDialog.vue'
import selectTechFiles from '@/views/equipement/standard/book/dialog/selectTechFiles.vue'
import { getDictByCode } from '@/api/system/dict'
import useUserStore from '@/store/modules/user'
import type { deptType, dictType } from '@/global'
import { getDeptTreeList } from '@/api/system/dept'
import showPhoto from '@/components/showPhoto/index.vue'
import { UploadFile } from '@/api/file'
import { toTreeList } from '@/utils/structure'
import { SCHEDULE } from '@/utils/scheduleDict'
import { useCheckList } from '@/commonMethods/useCheckList'
import { useSetAllRowReadable } from '@/commonMethods/useSetAllRowReadable'
import { getStaffList } from '@/api/resource/register'
import { addStandard, failUpdateStandard, getInfo, submit, updateStandard } from '@/api/equipment/standard/book'
import selectStaffPerson from '@/views/equipement/standard/book/dialog/selectPerson.vue'
import { getUid } from '@/utils/getUid'
import { getDeptIdByLabAndGroup } from '@/api/equipment/info/book'

const props = defineProps({
  pageType: { // 页面类型 add新建 edit编辑 detail详情
    type: String,
    require: true,
    default: 'detail',
  },
  id: {
    type: String,
    require: true,
  },
  approvalStatusName: { // 审批状态名称
    type: String,
    require: true,
  },
})
const emits = defineEmits(['submitSuccess', 'addSuccess', 'saveSuccess', 'giveApprovalType'])
const user = useUserStore() // 用户信息
const infoId = ref('') // id
const form: Ref<IForm> = ref({ // 基本信息表单
  approvalType: '', // 审批类型
  createUserId: '', // 创建人id
  createUserName: '', // 创建人名称
  createTime: '', // 创建时间
  standardNo: '', // 标准代码
  standardName: '', // 标准装置名称
  storageLocation: '', // 存放地点code
  storageLocationName: '', // 存放地点名称
  major: '', // 所属专业code
  majorName: '', // 所属专业名称
  majorType: '', //	专业类别(字典code)
  majorTypeName: '', //	专业类别(字典value)
  buildStandardName: '', // 建标申请名称
  buildStandardId: '', // 建标申请表id
  // buildStandardName: '', // 建标名称
  // buildStandardDate: '', // 建标日期
  standardCertNo: '', // 计量标准证书号
  lastReviewDate: '', // 最近复查日期
  deptId: '', // 标准所在部门id
  deptName: '', // 标准所在部门名称
  directorId: '', // 标准负责人id
  directorName: '', // 标准负责人id
  manageStatus: '', // 使用状态code
  manageStatusName: '', // 使用状态名称
  buildStandardReportFile: '', // 建标报告word
  buildStandardReportPdfFile: '', // 建标报告pdf
  examTableFile: '', // 考核表word
  examTablePdfFile: '', // 考核表pdf
  labCodeName: '', // 实验室
  labCode: '', // 实验室
  groupCode: '',

  standardImageFile: '', // 标准装置图片
  // temperature: '', // 温度(℃)
  // humidity: '', // 相对湿度
  // voltage: '', // 电源电压
  // powerFrequency: '', // 电源频率
  // surroundEnvironment: '', // 周围环境
  // electricField: '', // 电磁场

  // measureRange: '', // 测量范围
  // uncertainty: '', // 不确定度或允许误差极限或准确度等级
  // measureItem: '', // 检定或校准项目
})
const rules = reactive<FormRules>({ // 表单验证规则
  standardNo: [{ required: true, message: '标准代码不能为空', trigger: ['blur', 'change'] }],
  standardName: [{ required: true, message: '标准装置名称不能为空', trigger: ['blur', 'change'] }],
  storageLocation: [{ required: true, message: '存放地点不能为空', trigger: ['blur', 'change'] }],
  major: [{ required: true, message: '所属专业不能为空', trigger: ['blur', 'change'] }],
  // buildStandardId: [{ required: true, message: '建标申请不能为空', trigger: ['blur', 'change'] }],
  standardCertNo: [{ required: true, message: '计量标准证书号不能为空', trigger: ['blur', 'change'] }],
  lastReviewDate: [{ required: true, message: '最近复查日期不能为空', trigger: ['blur', 'change'] }],
  directorId: [{ required: true, message: '标准负责人不能为空', trigger: ['blur', 'change'] }],
  manageStatus: [{ required: true, message: '使用状态不能为空', trigger: ['blur', 'change'] }],
  // deptId: [{ required: true, message: '部门不能为空', trigger: ['blur', 'change'] }],
  groupCode: [{ required: true, message: '部门不能为空', trigger: ['blur', 'change'] }],
  // deptName: [{ required: true, message: '部门不能为空', trigger: ['blur', 'change'] }],
  labCode: [{ required: true, message: '实验室不能为空', trigger: ['blur', 'change'] }],
  labCodeName: [{ required: true, message: '实验室不能为空', trigger: ['blur', 'change'] }],
  majorType: [{ required: true, message: '专业类别不能为空', trigger: ['blur', 'change'] }],
  standardAlias: [{ required: true, message: '标准装置别名不能为空', trigger: ['blur', 'change'] }],
  nextReviewDate: [{ required: true, message: '下次复查日期不能为空', trigger: ['blur', 'change'] }],
  buildStandardReportPdfFile: [{ required: true, message: '建标报告(pdf版本)不能为空', trigger: ['blur', 'change'] }],
  examTablePdfFile: [{ required: true, message: '考核表(pdf版本)不能为空', trigger: ['blur', 'change'] }],
  createTime: [{ required: true, message: '创建时间不能为空', trigger: ['blur', 'change'] }],
})
const getInfoForm: Ref<{ [key: string]: string }> = ref({})
// ------------------------------------------字典----------------------------------------------
const storageLocationList = ref<dictType[]>([]) // 存放地点
const approvalTypeList = ref<dictType[]>([]) // 审批类型
const majorList = ref<dictType[]>([]) // 所属专业
const deptList = ref<deptType[]>([]) // 所属部门列表(平铺,非树形结构)
const userList = ref<{ [key: string]: string }[]>([]) // 用户列表
const manageStatusList = ref<dictType[]>([]) // 使用状态
const approvalTypeMap = ref({}) as any // 审批类型{1: 新建}
const standardList = ref<dictType[]>([])// 检校标准装置
const useDeptList = ref<deptType[]>([]) // 所属部门列表
const useDeptDict = ref([]) as any // 所属部门字典
const labNameList = ref<deptType[]>([]) // 实验室列表
const labNameDict = ref([]) as any // 实验室字典
const bizMajorTypeList = ref<dictType[]>([]) // 所属专业
/**
 * 获取字典
 */
async function getDict() {
  // 实验室
  const responseLab = await getDictByCode('bizGroupCodeEquipment')
  labNameList.value = responseLab.data
  labNameList.value.forEach((item) => {
    labNameDict.value[item.value] = item.name
  })
  // 部门
  const responseDept = await getDictByCode('bizGroupCode')
  useDeptList.value = responseDept.data
  useDeptList.value.forEach((item) => {
    useDeptDict.value[item.value] = item.name
  })
  // 专业类别
  getDictByCode('bizMajorType').then((response) => {
    bizMajorTypeList.value = response.data
  })

  // 审批类型
  getDictByCode('approvalType').then((response) => {
    response.data.forEach((item: any) => {
      approvalTypeMap.value[`${item.value}`] = item.name
    })
    approvalTypeList.value = response.data
  })
  // 所属专业
  getDictByCode('bizMeasureMajor').then((response) => {
    majorList.value = response.data
  })
  // 获取用户列表
  getStaffList({ offset: 1, limit: 999999 }).then((res: any) => {
    userList.value = res.data.rows
  })
  // 使用状态
  getDictByCode('bizStandardManagerState').then((response) => {
    manageStatusList.value = response.data
  })
  // 检校标准装置
  getDictByCode('bizStandardEquipmentType').then((response) => {
    standardList.value = response.data
  })
}
// ------------------------------------------建标申请-------------------------------------------
const selectBuildStandardRef = ref() // 建标申请ref
// 点击选择建标申请
const selectBuildStandard = () => {
  selectBuildStandardRef.value.initDialog()
}
// 选择好建标申请
const confirmSelectBuildStandard = (val: any) => {
  form.value.buildStandardName = val[0].applyName // 建标申请名称
  form.value.buildStandardId = val[0].id // 建标申请id
}
// -------------------------------------------文件上传--------------------------------------
// 文件上传
const fileRefStandardImageFile = ref() // 标准装置图片
const fileRefBuildStandardReport = ref() // 建标报告ref-word
const fileRefBuildStandardReportPdfFile = ref() // 建标报告ref-pdf
const fileRefExamTableFile = ref() // 考核表ref
const fileRefExamTablePdfFile = ref() // 标准证书ref

// 标准装置图片上传
const onStandardImageFileChange = (event: any) => {
  if (event.target.files[0].type !== 'image/png' && event.target.files[0].type !== 'image/jpeg') {
    ElMessage.warning('请上传png、jpg格式')
    return
  }
  UploadFileFn(event, 'standardImageFile', '图片上传成功')
}
// 建标报告word上传文件,在 Input 值改变时触发
const onBuildStandardReportFileChange = (event: any) => {
  if (event.target.files[0].type !== 'application/msword' && event.target.files[0].type !== 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {
    ElMessage.warning('请上传doc、docx文件格式')
    return
  }
  UploadFileFn(event, 'buildStandardReportFile', '文件上传成功')
}
// 建标报告pdf上传文件,在 Input 值改变时触发
const onBuildStandardReportPdfFile = (event: any) => {
  if (event.target.files[0].type !== 'application/pdf') {
    ElMessage.warning('请上传pdf格式')
    return
  }
  UploadFileFn(event, 'buildStandardReportPdfFile', '文件上传成功')
}
// 考核表word
const onExamTableFileChange = (event: any) => {
  if (event.target.files[0].type !== 'application/msword' && event.target.files[0].type !== 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {
    ElMessage.warning('请上传doc、docx文件格式')
    return
  }
  UploadFileFn(event, 'examTableFile', '文件上传成功')
}
// 考核表pdf
const onExamTablePdfFileChange = (event: any) => {
  if (event.target.files[0].type !== 'application/pdf') {
    ElMessage.warning('请上传pdf格式')
    return
  }
  UploadFileFn(event, 'examTablePdfFile', '文件上传成功')
}

// 上传文件操作
function UploadFileFn(event: any, prop: string, message: string) {
  if (event.target.files?.length !== 0) {
    // 创建formdata对象
    const fd = new FormData()
    fd.append('multipartFile', event.target.files[0])
    const loading = ElLoading.service({
      lock: true,
      background: 'rgba(255, 255, 255, 0.8)',
    })
    UploadFile(fd).then((res) => {
      if (res.code === 200) {
        form.value[prop] = res.data[0]
        // 重置当前验证
        ElMessage.success(message)
        loading.close()
      }
      else {
        ElMessage.error(res.message)
        loading.close()
      }
    })
  }
}

const upload = (fileRef: any) => {
  fileRef.click()
}
// -----------------------------------------依据的技术文件------------------------------
const checkoutFilesList = ref<ITechFiles[]>([]) // 技术文件多选
const technologyRelationList = ref<ITechFiles[]>([]) // 所依据的技术文件
const selectFliesIndex = ref() // 技术文件表格-点击选择的index---点击第几行
const techFileRef = ref() // 所依据的技术文件组件ref
const isMultiFiles = ref(false) // 选择依据的技术文件是否多选
// 所依据的技术文件表头
const techFilesColumns = [
  { text: '文件编号', value: 'technologyFileNo', required: true, align: 'center', width: '240' },
  { text: '文件名称', value: 'technologyFileName', required: true, align: 'center' },
  { text: '启用时间', value: 'enableTime', align: 'center' },
  { text: '文件附件', value: 'fileArr', align: 'center', isLink: true },
]

// 点击技术文件批量增加
const multiFilesAdd = () => {
  isMultiFiles.value = true
  techFileRef.value.initDialog(isMultiFiles.value)
}

// 点击技术文件增加行
const addFilesRow = () => {
  const index = technologyRelationList.value.findIndex((item: ITechFiles) => !item.technologyFileNo)
  if (index !== -1) {
    ElMessage.warning('请完善上一条文件信息')
    return
  }
  technologyRelationList.value.push({
    remark: '', //	备注
    standardNo: '', //	标准代码
    technologyFileId: '', //	依据的技术文件id
    technologyFileName: '', //	依据的技术文件名称
  })
}

// 技术文件表格多选
const handleSelectionChangeFiles = (e: any) => {
  checkoutFilesList.value = e
}

// 点击技术文件删除行
const delFilesRow = () => {
  if (checkoutFilesList.value.length <= 0) {
    ElMessage({
      message: '请选中要删除的行',
      type: 'warning',
    })
  }
  else {
    checkoutFilesList.value.forEach((item: ITechFiles) => {
      technologyRelationList.value.forEach((element: ITechFiles, index: number) => {
        if (element.technologyFileId === item.technologyFileId) {
          technologyRelationList.value.splice(index, 1)
          solveTemperatureHumidity()
        }
      })
    })
  }
}

// 点击选择文件编号
const handleClickFiles = (index: number) => {
  isMultiFiles.value = false // 单选
  selectFliesIndex.value = index
  techFileRef.value.initDialog(isMultiFiles.value)
}

// 选好文件
const confirmSelectTechFile = (val: any) => {
  if (val && val.length) {
    if (isMultiFiles.value) { // 多选
      val.forEach((item: any) => {
      // 只添加列表里不存在的
        const index = technologyRelationList.value.findIndex((i: ITechFiles) => item.fileNo === i.technologyFileNo)
        if (index === -1) {
          const param = {
            technologyFileNo: item.fileNo, // 文件编号
            technologyFileName: item.fileName, // 文件名称
            remark: item.remark, // 备注
            technologyFileId: item.id, // id
            fileArr: [item.file],
            fileAttachment: item.file,
            enableTime: item.activeDate ? dayjs(item.activeDate).format('YYYY-MM-DD') : item.activeDate, // 启用时间
            temperatureLowLimit: item.temperatureLowLimit,
            temperatureHighLimit: item.temperatureHighLimit,
            humidityLowLimit: item.humidityLowLimit,
            humidityHighLimit: item.humidityHighLimit,
          }
          technologyRelationList.value.push(param)
        }
      })
    }
    else { // 单选
      const index = technologyRelationList.value.findIndex((i: ITechFiles) => val[0].fileNo === i.technologyFileNo)
      if (index !== -1) {
        ElMessage.warning('此文件已添加过')
        return
      }
      const fileParam = {
        technologyFileNo: val[0].fileNo, // 文件编号
        technologyFileName: val[0].fileName, // 文件名称
        remark: val[0].remark, // 备注
        technologyFileId: val[0].id, // id
        fileArr: [val[0].file],
        fileAttachment: val[0].file,
        enableTime: val[0].activeDate ? dayjs(val[0].activeDate).format('YYYY-MM-DD') : val[0].activeDate, // 启用时间
        temperatureLowLimit: val[0].temperatureLowLimit,
        temperatureHighLimit: val[0].temperatureHighLimit,
        humidityLowLimit: val[0].humidityLowLimit,
        humidityHighLimit: val[0].humidityHighLimit,
      }
      technologyRelationList.value.splice(selectFliesIndex.value, 1, fileParam)
    }

    solveTemperatureHumidity()
  }
}

// ------------------------------------------环境条件----------------------------------------
const environmentalConditionsColumns = [ // 环境条件表头
  { text: '温度(℃)', value: 'temperature', align: 'center', required: false },
  { text: '相对湿度(%)', value: 'humidity', align: 'center', required: false },
  { text: '电源电压(v)', value: 'voltage', align: 'center', required: false },
  { text: '其他要求', value: 'otherRequirement', align: 'center', required: false },
]
const environmentalConditionsList = ref([{
  temperature: '', // 温度(℃)
  humidity: '', // 相对湿度
  voltage: '', // 电源电压
  otherRequirement: '', // 其他要求
  editable: true, // 是否可编辑
}])

// 处理温湿度
function solveTemperatureHumidity() {
  const list = technologyRelationList.value as any
  let minTemperature = list[0].temperatureLowLimit // 温度找下限的最大值
  let maxTemperature = list[0].temperatureHighLimit // 温度找上限的最小值
  let minHumidity = list[0].humidityLowLimit // 湿度找下限的最大值
  let maxHumidity = list[0].humidityHighLimit // 湿度找上限的最小值
  for (let i = 1; i < list.length; i++) {
    const tempMinTemperature = list[i].temperatureLowLimit
    const tempMaxTemperature = list[i].temperatureHighLimit
    const tempMinHumidity = list[i].humidityLowLimit
    const tempMaxHumidity = list[i].humidityHighLimit
    minTemperature = Number(tempMinTemperature) > Number(minTemperature) ? tempMinTemperature : minTemperature
    maxTemperature = Number(tempMaxTemperature) < Number(maxTemperature) ? tempMaxTemperature : maxTemperature
    minHumidity = Number(tempMinHumidity) > Number(minHumidity) ? tempMinHumidity : minHumidity
    maxHumidity = Number(tempMaxHumidity) < Number(maxHumidity) ? tempMaxHumidity : maxHumidity
  }
  environmentalConditionsList.value[0].temperature = `${minTemperature}~${maxTemperature}`
  environmentalConditionsList.value[0].humidity = `${minHumidity}~${maxHumidity}`
  if (Number(minTemperature) > Number(maxTemperature)) { // 无交集
    environmentalConditionsList.value[0].temperature = '——'
  }
  if (Number(minHumidity) > Number(maxHumidity)) { // 无交集
    environmentalConditionsList.value[0].humidity = '——'
  }
}
// --------------------------------------------选择负责人(计量人员)------------------------------------
const selectStaffPersonRef = ref()

// 点击选择负责人
const handleClickSelectStaff = () => {
  selectStaffPersonRef.value.initDialog()
}
// 选择计量人员
const confirmSelectStaff = (list: any) => {
  if (!list.length) { return }
  form.value.directorId = list[0].id	// 负责人(计量人员)id
  form.value.directorName = list[0].staffName	// 负责人(计量人员)名字
}

// -------------------------------------------技术指标----------------------------------------
const technicalIndexColumns = [ // 技术指标表头
  { text: '检定或校准项目', value: 'measureItem', align: 'center', required: true },
  { text: '测量范围', value: 'measureRange', align: 'center', required: true },
  { text: '不确定度或允许误差极限或准确度等级', value: 'uncertainty', align: 'center', required: true },
]
const checkoutTechnicalIndex = ref<ITech[]>([]) // 选中
const technologyIndexRelationList = ref<ITech[]>([]) // 技术指标

// 技术文件表格多选
const handleSelectionTechIndex = (e: any) => {
  checkoutTechnicalIndex.value = e
}

// 点击增加行
const addTechnicalIndexRow = () => {
  if (!useCheckList(technologyIndexRelationList.value, technicalIndexColumns, '技术指标')) {
    return false
  }
  technologyIndexRelationList.value.push({
    measureRange: '', // 测量范围
    uncertainty: '', // 不确定度或允许误差极限或准确度等级
    measureItem: '', // 检定或校准项目
    editable: true, // 是否可编辑
    frontId: getUid(),
  })
}

// 点击删除行
const delTechnicalIndexRow = () => {
  if (checkoutTechnicalIndex.value.length <= 0) {
    ElMessage({
      message: '请选中要删除的行',
      type: 'warning',
    })
  }
  else {
    checkoutTechnicalIndex.value.forEach((item: ITech) => {
      technologyIndexRelationList.value.forEach((element: ITech, index: number) => {
        if (element.frontId === item.frontId) {
          technologyIndexRelationList.value.splice(index, 1)
        }
      })
    })
  }
}
// -------------------------------------------获取详情信息----------------------------------------
/**
 * 获取详情
 * @param isCopy 是否备份,判断基本信息是否变化
 */
function fetchInfo(isCopy = false) {
  const loading = ElLoading.service({
    lock: true,
    background: 'rgba(255, 255, 255, 0.8)',
  })
  getDict() // 获取字典
  getInfo({ id: infoId.value!, type: window.sessionStorage.getItem('infoParamType')! }).then((res) => {
    form.value = res.data.standardInfoApproval // 表单数据
    technologyRelationList.value = res.data.technologyRelationList // 技术文件
    environmentalConditionsList.value = [{ // 环境数据
      temperature: res.data.standardInfoApproval.temperature, // 温度(℃)
      humidity: res.data.standardInfoApproval.humidity, // 相对湿度
      voltage: res.data.standardInfoApproval.voltage, // 电源电压
      otherRequirement: res.data.standardInfoApproval.otherRequirement, // 其他要求
      editable: props.pageType !== 'detail', // 是否可编辑
    }]
    technologyIndexRelationList.value = res.data.technologyIndexRelationList.map((item: ITech) => { // 技术指标数据
      return {
        measureRange: item.measureRange, // 测量范围
        uncertainty: item.uncertainty, // 不确定度或允许误差极限或准确度等级
        measureItem: item.measureItem, // 检定或校准项目
        editable: props.pageType !== 'detail', // 是否可编辑
      }
    })

    form.value.approvalType = `${res.data.standardInfoApproval.approvalType}` // 审批类型
    emits('giveApprovalType', form.value.approvalType)
    const tempGetInfoForm = window.sessionStorage.getItem('standardGetInfoForm') ? JSON.parse(window.sessionStorage.getItem('standardGetInfoForm')!) : window.sessionStorage.getItem('standardGetInfoForm')
    if (isCopy && (!tempGetInfoForm || (tempGetInfoForm && !tempGetInfoForm.standardName))) {
      getInfoForm.value = {
        standardCertNo: res.data.standardInfoApproval.standardCertNo, // 计量标准证书号
        standardName: res.data.standardInfoApproval.standardName, // 标准装置名称
        standardAliasId: res.data.standardInfoApproval.standardAliasId, // 标准装置别名id
        labCodeName: res.data.standardInfoApproval.labCodeName, // 实验室
        // deptId: res.data.standardInfoApproval.deptId, // 部门id
        // deptName: res.data.standardInfoApproval.deptName, // 部门
        groupCode: res.data.standardInfoApproval.groupCode, // 部门
        directorId: res.data.standardInfoApproval.directorId, // 标准负责人id
        directorName: res.data.standardInfoApproval.directorName, // 标准负责人id
        majorType: res.data.standardInfoApproval.majorType, // 专业类别
        lastReviewDate: res.data.standardInfoApproval.lastReviewDate, // 最近复查日期
        nextReviewDate: res.data.standardInfoApproval.nextReviewDate, // 下次复查日期
        manageStatus: res.data.standardInfoApproval.manageStatus, // 管理状态
        buildStandardReportPdfFile: res.data.standardInfoApproval.buildStandardReportPdfFile, // 建表报告
        examTablePdfFile: res.data.standardInfoApproval.examTablePdfFile, // 考核表pdf

        // storageLocation: res.data.standardInfoApproval.storageLocation, // 存放地点code
        // storageLocationName: res.data.standardInfoApproval.storageLocationName, // 存放地点名称
        // major: res.data.standardInfoApproval.major, // 所属专业code
        // majorName: res.data.standardInfoApproval.majorName, // 所属专业名称
        // buildStandardId: res.data.standardInfoApproval.buildStandardId, // 建标申请表id
        // buildStandardName: res.data.standardInfoApproval.buildStandardName, // 建标名称
        // buildStandardDate: res.data.standardInfoApproval.buildStandardDate, // 建标日期
        // standardCertNo: res.data.standardInfoApproval.standardCertNo, // 计量标准证书号
        // lastReviewDate: res.data.standardInfoApproval.lastReviewDate, // 最近复查日期
        // deptId: res.data.standardInfoApproval.deptId, // 标准所在部门id
        // deptName: res.data.standardInfoApproval.deptName, // 标准所在部门名称
        // directorId: res.data.standardInfoApproval.directorId, // 标准负责人id
        // directorName: res.data.standardInfoApproval.directorName, // 标准负责人id
        // manageStatus: res.data.standardInfoApproval.manageStatus, // 使用状态code
        // manageStatusName: res.data.standardInfoApproval.manageStatusName, // 使用状态名称
        // buildStandardReportFile: res.data.standardInfoApproval.buildStandardReportFile, // 建标报告
        // examTableFile: res.data.standardInfoApproval.examTableFile, // 考核表
        // standardCertFile: res.data.standardInfoApproval.standardCertFile, // 标准证书
        // temperature: res.data.standardInfoApproval.temperature, // 温度(℃)
        // humidity: res.data.standardInfoApproval.humidity, // 相对湿度
        // voltage: res.data.standardInfoApproval.voltage, // 电源电压
        // powerFrequency: res.data.standardInfoApproval.powerFrequency, // 电源频率
        // surroundEnvironment: res.data.standardInfoApproval.surroundEnvironment, // 周围环境
        // electricField: res.data.standardInfoApproval.electricField, // 电磁场
        // measureRange: res.data.standardInfoApproval.measureRange, // 测量范围
        // uncertainty: res.data.standardInfoApproval.uncertainty, // 不确定度或允许误差极限或准确度等级
        // measureItem: res.data.standardInfoApproval.measureItem, // 检定或校准项目
      } // 保存用于比较修改需要审批的字段
      console.log('保存用于比较修改需要审批的字段')
      window.sessionStorage.setItem('standardGetInfoForm', JSON.stringify(getInfoForm.value))
    }
    loading.close()
  })
}
// ---------------------------------------检查基本信息变化-------------------------------------

/**
 * 检查信息是否有变化
 * @param tempObject 要检查的对象
 */
const checkBasicInfo = (tempObject: any) => {
  const tempGetInfoForm = window.sessionStorage.getItem('standardGetInfoForm') ? JSON.parse(window.sessionStorage.getItem('standardGetInfoForm')!) : window.sessionStorage.getItem('standardGetInfoForm')
  console.log('================')
  console.log(tempGetInfoForm)

  // 检查基本信息有没有变化
  for (const key in tempGetInfoForm) {
    console.log(key, tempGetInfoForm[key])
    console.log(key, tempObject[key])
    console.log(tempGetInfoForm[key] == tempObject[key])

    if (tempGetInfoForm[key] != tempObject[key]) {
      return true // 有变化
    }
  }
  return false // 没变化
}
// ----------------------------------------------- 保存---------------------------------------
const ruleFormRef = ref() // 基本信息表单ref
/**
 * 点击保存
 * @param ruleFormRef 基本信息表单ref
 */
function saveForm() {
  if (!useCheckList(technologyRelationList.value, techFilesColumns, '依据的技术文件')) {
    return false
  }
  if (!technologyRelationList.value.length) {
    ElMessage.warning('依据的技术文件不能为空')
    return false
  }

  if (!useCheckList(environmentalConditionsList.value, environmentalConditionsColumns, '环境条件')) {
    return false
  }

  if (!useCheckList(technologyIndexRelationList.value, technicalIndexColumns, '技术指标')) {
    return false
  }
  ruleFormRef.value.validate((valid: boolean) => {
    if (valid) { // 基本信息表单通过校验
      ElMessageBox.confirm(
        '确认保存吗?',
        '提示',
        {
          confirmButtonText: '确认',
          cancelButtonText: '取消',
          type: 'warning',
        },
      ).then(() => {
        const params = { // 请求参数
          technologyRelationList: technologyRelationList.value.map((item) => {
            return {
              ...item,
              standardNo: form.value.standardNo, // 标准代码
              id: '', // 解决编辑的时候报生成编号重复问题
            }
          }), // 依据的技术文件
          technologyIndexRelationList: technologyIndexRelationList.value.map((item) => {
            return {
              ...item,
              standardNo: form.value.standardNo, // 标准代码
            }
          }), // 技术指标
          standardInfoApproval: { // 表单、环境、指标
            ...form.value,
            ...environmentalConditionsList.value[0], // 环境
            id: form.value.id,
            // 如果填写最近复查日期,此处为最近复查日期+5年;
            // 如果未填写最近复查日期,此处为创建时间+5年
            // nextReviewDate: form.value.lastReviewDate ? form.value.nextReviewDate : dayjs(form.value.createTime).add(5, 'year').format('YYYY-MM-DD'), // 下次复查日期
          },
        }
        const loading = ElLoading.service({
          lock: true,
          text: '加载中...',
          background: 'rgba(255, 255, 255, 0.6)',
        })
        if (props.pageType === 'add') { // 新建
          addStandard(params).then((res) => {
            loading.close()
            form.value.standardNo = res.data.standardNo // 设备编号
            infoId.value = res.data.id // id
            emits('addSuccess', form.value.standardNo, infoId.value, form.value.standardName)
            ElMessage.success('已保存')
          }).catch(() => {
            loading.close()
          })
        }
        else if (props.pageType === 'edit') { // 编辑
          switch (props.approvalStatusName) {
            case '草稿箱':
              updateStandard(params).then((res) => {
                loading.close()
                ElMessage.success('已保存')
                emits('saveSuccess')
                window.sessionStorage.setItem('infoParamType', '0')
                useSetAllRowReadable(technologyRelationList.value) // 技术指标进入不可编辑状态
              }).catch(() => {
                loading.close()
              })
              break
            case '全部': // 全部的编辑-保存相当于新建一个草稿
              params.standardInfoApproval.id = '' // 新建一个草稿,所以id需要置空
              params.standardInfoApproval.approvalType = '2' // 审批类型
              addStandard(params).then((res) => {
                loading.close()
                form.value.standardNo = res.data.standardNo // 设备编号
                infoId.value = res.data.id // id
                emits('addSuccess', form.value.standardNo, infoId.value, form.value.standardName)
                window.sessionStorage.setItem('infoParamType', '0') // 全部编辑相当于新建一个草稿,所以去查草稿箱的详情传0
                ElMessage.success('已保存')
              }).catch(() => {
                loading.close()
              })
              break
            default: // '未通过' || '已取消'
              failUpdateStandard(params).then((res) => {
                loading.close()
                ElMessage.success('已保存')
                emits('submitSuccess', form.value.standardNo, infoId.value, form.value.standardName)
                window.sessionStorage.setItem('infoParamType', '0')
                fetchInfo() // 获取详情信息
                useSetAllRowReadable(technologyRelationList.value) // 技术指标进入不可编辑状态
              }).catch(() => {
                loading.close()
              })
              break
          }
        }
      })
    }
  })
}

// ----------------------------------------------提交--------------------------------------------

const submitForm = (processId = '') => {
  if (infoId.value) {
    // 未通过编辑、已取消编辑、新建正常走审批流程
    if (props.approvalStatusName === '未通过' || props.approvalStatusName === '已取消') {
      // 未通过、已取消直接进流程,所以不需要查看基本信息有没有变化
      handleSubmit(processId, '')
    }
    if (props.approvalStatusName === '全部' || props.approvalStatusName === '草稿箱') {
      if (form.value.approvalType === '1' && props.approvalStatusName === '草稿箱') { // 草稿箱新建
        handleSubmit(processId, '')
      }
      else {
        // 检查基本信息有没有变化--除了依据技术文件剩下的变化就走审批
        const tempObject = {
          ...form.value,
          ...environmentalConditionsList.value[0],
        }
        if (!checkBasicInfo(tempObject)) {
          console.log('信息没变化')
          // 信息没变化
          handleSubmit(processId, '2', '1')
          window.sessionStorage.setItem('infoParamType', '1')
        }
        else { // 信息有变化
          handleSubmit(processId, '2', '0') // 信息有变化正常走审批流程
        }
      }
    }
  }
  else {
    ElMessage.warning('请先保存')
  }
}
// 提交
/**
 *
 * @param processId 流程实例id
 * @param approvalType // 审批类型 1新建、2编辑、3删除
 * @param changeFlag // 基本信息是否变化 1、信息没变化、0信息有变化
 */
function handleSubmit(processId: string, approvalType: string, changeFlag?: string) {
  const loading = ElLoading.service({
    lock: true,
    text: '加载中...',
    background: 'rgba(255, 255, 255, 0.6)',
  })
  submit({ id: infoId.value!, formId: SCHEDULE.STANDARD_BOOK_APPROVAL, processId, approvalType, changeFlag }).then((res) => {
    if (props.approvalStatusName === '草稿箱' && changeFlag === '1') { // 全部且信息无变化
      infoId.value = res.data.id // id
      ElMessage.success('无基本信息变更,无需审批,更新成功')
    }
    else {
      ElMessage.success('已提交')
    }
    emits('submitSuccess', form.value.standardNo, infoId.value, form.value.standardName)
    fetchInfo(false) // 获取详细信息
    loading.close()
  })
}
// -------------------------------------------钩子------------------------------------------------
// 监听pageType处理审批类型
watch(() => props.pageType, (newValue) => {
  console.log('监听页面类型', newValue)
  form.value.approvalType = newValue === 'add' ? '1' : newValue === 'edit' ? '2' : ''
  console.log(form.value.approvalType, ';;')
}, { immediate: true })

// 监听pageType处理审批类型
watch(() => props.approvalStatusName, (newValue) => {
  console.log('approvalStatusName', newValue)
  if (newValue) {
    if (newValue === '全部') {
      window.sessionStorage.setItem('infoParamType', '1')
    // infoParamType.value = '1' // 从全部过来第一次传1,保存之后传0(因为保存到草稿箱里面了)
    }
    else {
    // infoParamType.value = '0'
      window.sessionStorage.setItem('infoParamType', '0')
    }
  }
})

watch(() => props.id, (newValue) => {
  infoId.value = newValue!
  if (newValue) {
    console.log('watchID', props.approvalStatusName)

    if (props.approvalStatusName) {
      fetchInfo(false) // 获取详情信息
    }
  }
}, { immediate: true })

// 实验室选中变化--给labName赋值
const changeLabName = (val: string) => {
  const index = labNameList.value.findIndex(item => item.value === val)
  if (index !== -1) {
    form.value.labCodeName = labNameList.value[index].name
  }
}

// 部门选中变化
const changeGroupCode = (groupCode: any) => {
  console.log('bizLabCode', user.bizLabCode)
  console.log('groupNo', user.groupNo)
  console.log('注意:此用户没有实验室或者组别代码')
  const index = useDeptList.value.findIndex(item => item.value === groupCode)
  if (index !== -1) {
    form.value.groupCodeName = useDeptList.value[index].name
  }
  if (index !== -1 && `${user.bizLabCode}` !== '' && `${groupCode}` !== '') {
    // 通过实验室组别获取部门id、并赋值给deptId
    fetchDeptIdByLabAndGroup(user.bizLabCode, groupCode)
  }
}

// 根据实验室代码和组别代码获取deptId
function fetchDeptIdByLabAndGroup(labCode: string, groupNo: string) {
  getDeptIdByLabAndGroup({ labCode, groupNo }).then((res) => {
    form.value.deptId = res.data.deptId
  })
}

// 专业类别变化
const changeMajorType = (val: string) => {
  if (val) {
    const index = bizMajorTypeList.value.findIndex(item => item.value === val)
    if (index !== -1) {
      form.value.majorTypeName = bizMajorTypeList.value[index].name
    }
  }
}

// 最近复查日期变化
const changeLastReviewDate = (val: Date) => {
  if (val) {
    form.value.nextReviewDate = dayjs(val).add(5, 'year').format('YYYY-MM-DD')
  }
  else {
    form.value.nextReviewDate = dayjs(form.value.createTime).add(5, 'year').format('YYYY-MM-DD')
  }
}
// 创建日期变化
const changeCreateTime = (val: string) => {
  if (!form.value.lastReviewDate) {
    form.value.nextReviewDate = dayjs(val).add(5, 'year').format('YYYY-MM-DD')
  }
}

onMounted(async () => {
  await getDict() // 获取字典
  form.value.createUserId = user.id// 创建人id
  form.value.createUserName = user.name // 创建人
  form.value.createTime = dayjs().format('YYYY-MM-DD')// 申请时间
  changeCreateTime(form.value.createTime)

  if (props.pageType !== 'add') {
    if (window.sessionStorage.getItem('standardGetInfoForm')) {
      fetchInfo(false) // 获取详情信息
    }
    else {
      fetchInfo(true) // 获取详情信息
    }
  }
  else {
    form.value.labCode = user.bizLabCode // 实验室
    form.value.labCodeName = labNameDict.value[form.value.labCode!] // 实验室名称
    form.value.groupCode = user.groupNo // 部门代码
    changeGroupCode(form.value.groupCode!)
  }
})

defineExpose({ saveForm, submitForm })
</script>

<template>
  <detail-block title="">
    <el-form
      ref="ruleFormRef"
      :model="form"
      :label-width="130"
      label-position="right"
      :rules="rules"
    >
      <el-row v-if="props.approvalStatusName !== '全部' && props.approvalStatusName !== '草稿箱'" :gutter="24" class="marg">
        <el-col :span="6">
          <el-form-item label="审批类型:">
            <el-select
              v-model="form.approvalType"
              filterable
              :placeholder="pageType === 'detail' ? ' ' : '请选择审批类型'"
              disabled
              class="full-width-input"
            >
              <el-option v-for="item of approvalTypeList" :key="item.value" :label="item.name" :value="item.value" />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="创建人:">
            <el-input v-model="form.createUserName" disabled />
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="创建时间:">
            <el-date-picker
              v-model="form.createTime"
              type="date"
              format="YYYY-MM-DD"
              value-format="YYYY-MM-DD"
              :disabled="pageType === 'detail'"
              class="full-width-input"
              @change="changeCreateTime"
            />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="24" class="marg">
        <el-col :span="6">
          <el-form-item label="建标申请:" prop="buildStandardName">
            <el-input
              v-model.trim="form.buildStandardName"
              :placeholder="pageType === 'detail' ? ' ' : '请选择建标申请'"
              disabled
              class="full-width-input"
              clearable
            >
              <template v-if="pageType !== 'detail'" #append>
                <el-button
                  size="small"
                  @click="selectBuildStandard"
                >
                  选择
                </el-button>
              </template>
            </el-input>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="计量标准证书号:" prop="standardCertNo">
            <el-input
              v-model="form.standardCertNo"
              :disabled="pageType === 'detail'"
              :placeholder="pageType === 'detail' ? '' : '请输入计量标准证书号'"
            />
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="标准装置名称:" prop="standardAlias">
            <el-input
              v-model="form.standardAlias"
              :disabled="pageType === 'detail'"
              :placeholder="pageType === 'detail' ? '' : '请输入标准装置名称'"
            />
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="标准装置别名:" prop="standardName">
            <el-select
              v-model="form.standardName"
              filterable
              :placeholder="pageType === 'detail' ? ' ' : '请选择标准装置别名'"
              :disabled="pageType === 'detail'"
              class="full-width-input"
            >
              <el-option v-for="item of standardList" :key="item.value" :label="item.name" :value="item.name" />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="实验室" prop="labCode">
            <el-select
              v-model.trim="form.labCode"
              placeholder="请选择实验室"
              filterable
              :disabled="pageType === 'detail'"
              class="full-width-input"
              @change="changeLabName"
            >
              <el-option v-for="item in labNameList" :key="item.id" :label="item.name" :value="item.value" />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="部门" prop="groupCode">
            <el-select
              v-model.trim="form.groupCode"
              placeholder="请选择部门"
              filterable
              :disabled="pageType === 'detail'"
              class="full-width-input"
              @change="changeGroupCode"
            >
              <el-option v-for="item in useDeptList" :key="item.id" :label="item.name" :value="item.value" />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="负责人:" prop="directorId">
            <el-input
              v-model.trim="form.directorName"
              :placeholder="pageType === 'detail' ? ' ' : '请选择负责人'"
              disabled
              class="full-width-input"
              clearable
            >
              <template v-if="pageType !== 'detail'" #append>
                <el-button
                  size="small"
                  @click="handleClickSelectStaff"
                >
                  选择
                </el-button>
              </template>
            </el-input>
          </el-form-item>
        </el-col>

        <el-col :span="6">
          <el-form-item label="专业类别:" prop="majorType">
            <el-select
              v-model="form.majorType"
              filterable
              :placeholder="pageType === 'detail' ? ' ' : '请选择专业类别'"
              :disabled="pageType === 'detail'"
              class="full-width-input"
              @change="changeMajorType"
            >
              <el-option v-for="item of bizMajorTypeList" :key="item.value" :label="item.name" :value="item.value" />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="最近复查日期:">
            <el-date-picker
              v-model="form.lastReviewDate"
              type="date"
              format="YYYY-MM-DD"
              value-format="YYYY-MM-DD"
              :placeholder="pageType === 'detail' ? ' ' : '最近复查日期'"
              :disabled="pageType === 'detail'"
              class="full-width-input"
              @change="changeLastReviewDate"
            />
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="下次复查日期:" prop="nextReviewDate">
            <el-date-picker
              v-model="form.nextReviewDate"
              type="date"
              format="YYYY-MM-DD"
              value-format="YYYY-MM-DD"
              :placeholder="pageType === 'detail' ? ' ' : '系统自动生成'"
              class="full-width-input"
              :disabled="pageType === 'detail'"
            />
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="管理状态:" prop="manageStatus">
            <el-select
              v-model.trim="form.manageStatus"
              clearable
              :placeholder="pageType === 'detail' ? '' : '请选择使用状态'"
              size="default"
              :disabled="pageType === 'detail'"
              class="full-width-input"
            >
              <el-option
                v-for="item in manageStatusList"
                :key="item.id"
                :label="item.name"
                :value="item.value"
              />
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="24" class="marg">
        <el-col :span="12">
          <el-form-item label="标准装置图片:" label-width="150px">
            <show-photo v-if="form.standardImageFile" :minio-file-name="form.standardImageFile" />
            <span v-else-if="pageType === 'detail'">无</span>
            <input v-show="pageType === ''" ref="fileRefStandardImageFile" type="file" @change="onStandardImageFileChange">
            <el-button v-if="pageType !== 'detail'" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-left': form.standardImageFile === '' ? '0px' : '20px' }" @click="upload(fileRefStandardImageFile)">
              {{ form.standardImageFile === '' ? '上传' : '更换附件' }}
            </el-button>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="24" class="marg">
        <el-col :span="12">
          <el-form-item label="建标报告(word版本):" label-width="150px">
            <show-photo v-if="form.buildStandardReportFile" :minio-file-name="form.buildStandardReportFile" />
            <span v-else-if="pageType === 'detail'">无</span>
            <input v-show="pageType === ''" ref="fileRefBuildStandardReport" type="file" @change="onBuildStandardReportFileChange">
            <el-button v-if="pageType !== 'detail'" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-left': form.buildStandardReportFile === '' ? '0px' : '20px' }" @click="upload(fileRefBuildStandardReport)">
              {{ form.buildStandardReportFile === '' ? '上传' : '更换附件' }}
            </el-button>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="建标报告(pdf版本):" prop="buildStandardReportPdfFile" label-width="150px">
            <show-photo v-if="form.buildStandardReportPdfFile" :minio-file-name="form.buildStandardReportPdfFile" />
            <span v-else-if="pageType === 'detail'">无</span>
            <input v-show="pageType === ''" ref="fileRefBuildStandardReportPdfFile" type="file" @change="onBuildStandardReportPdfFile">
            <el-button v-if="pageType !== 'detail'" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-left': form.buildStandardReportPdfFile === '' ? '0px' : '20px' }" @click="upload(fileRefBuildStandardReportPdfFile)">
              {{ form.buildStandardReportPdfFile === '' ? '上传' : '更换附件' }}
            </el-button>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="24" class="marg">
        <el-col :span="12">
          <el-form-item label="考核表(word版本):" label-width="150px">
            <show-photo v-if="form.examTableFile" :minio-file-name="form.examTableFile" />
            <span v-else-if="pageType === 'detail'">无</span>
            <input v-show="pageType === ''" ref="fileRefExamTableFile" type="file" @change="onExamTableFileChange">
            <el-button v-if="pageType !== 'detail'" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-left': form.examTableFile === '' ? '0px' : '20px' }" @click="upload(fileRefExamTableFile)">
              {{ form.examTableFile === '' ? '上传' : '更换附件' }}
            </el-button>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="考核表(pdf版本):" prop="examTablePdfFile" label-width="150px">
            <show-photo v-if="form.examTablePdfFile" :minio-file-name="form.examTablePdfFile" />
            <span v-else-if="pageType === 'detail'">无</span>
            <input v-show="pageType === ''" ref="fileRefExamTablePdfFile" type="file" @change="onExamTablePdfFileChange">
            <el-button v-if="pageType !== 'detail'" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-left': form.examTablePdfFile === '' ? '0px' : '20px' }" @click="upload(fileRefExamTablePdfFile)">
              {{ form.examTablePdfFile === '' ? '上传' : '更换附件' }}
            </el-button>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
  </detail-block>

  <detail-block title="依据的技术文件">
    <template v-if="pageType !== 'detail'" #btns>
      <el-button type="primary" @click="multiFilesAdd">
        批量添加
      </el-button>
      <el-button type="primary" @click="addFilesRow">
        增加行
      </el-button>
      <el-button type="info" @click="delFilesRow">
        删除行
      </el-button>
    </template>
    <el-table
      :data="technologyRelationList"
      border
      style="width: 100%;"
      @selection-change="handleSelectionChangeFiles"
    >
      <el-table-column
        v-if="pageType !== 'detail'"
        type="selection"
        width="38"
      />
      <el-table-column align="center" label="序号" width="80" type="index" />
      <el-table-column
        v-for="item in techFilesColumns"
        :key="item.value"
        :prop="item.value"
        :label="item.text"
        :width="item.width"
        align="center"
      >
        <template #header>
          <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span>
        </template>
        <template #default="scope">
          <el-input
            v-if="item.text === '文件编号' && pageType !== 'detail'"
            v-model="scope.row[item.value]"
            :placeholder="`${item.text}`"
            class="input"
            disabled
          >
            <template #append>
              <el-button
                v-if="pageType !== 'detail'"
                size="small"
                @click="handleClickFiles(scope.$index)"
              >
                选择
              </el-button>
            </template>
          </el-input>

          <show-photo v-if="item.value === 'fileArr'" :minio-file-name="scope.row.fileAttachment" width="100%" />
        </template>
      </el-table-column>
    </el-table>
  </detail-block>

  <detail-block title="环境条件">
    <el-table
      :data="environmentalConditionsList"
      border
      style="width: 100%;"
    >
      <el-table-column
        v-if="pageType !== 'detail'"
        type="selection"
        width="38"
      />
      <el-table-column align="center" label="序号" width="80" type="index" />
      <el-table-column
        v-for="item in environmentalConditionsColumns"
        :key="item.value"
        :prop="item.value"
        :label="item.text"
        align="center"
      >
        <template #header>
          <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span>
        </template>
        <template #default="scope">
          <el-input
            v-if="scope.row.editable && item.value !== 'temperature' && item.value !== 'humidity'"
            v-model="scope.row[item.value]"
            :placeholder="`${item.text}`"
            class="input"
          />
          <!-- <el-input-number v-else-if="scope.row.editable" v-model="scope.row[item.value]" :step="0.1" /> -->
          <span v-if="!scope.row.editable">{{ scope.row[item.value] }}</span>
        </template>
      </el-table-column>
    </el-table>
  </detail-block>

  <detail-block title="技术指标">
    <template v-if="pageType !== 'detail'" #btns>
      <el-button type="primary" @click="addTechnicalIndexRow">
        增加行
      </el-button>
      <el-button type="info" @click="delTechnicalIndexRow">
        删除行
      </el-button>
    </template>
    <el-table
      :data="technologyIndexRelationList"
      border
      style="width: 100%;"
      @selection-change="handleSelectionTechIndex"
    >
      <el-table-column v-if="pageType !== 'detail'" type="selection" width="38" />
      <el-table-column align="center" label="序号" width="80" type="index" />
      <el-table-column
        v-for="item in technicalIndexColumns"
        :key="item.value"
        :prop="item.value"
        :label="item.text"
        align="center"
      >
        <template #header>
          <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span>
        </template>
        <template #default="scope">
          <el-input
            v-if="scope.row.editable && item.value !== 'uncertainty'"
            v-model="scope.row[item.value]"
            :placeholder="`${item.text}`"
            class="input"
          />
          <el-input
            v-if="scope.row.editable && item.value === 'uncertainty'"
            v-model="scope.row[item.value]"
            :placeholder="`${item.text}`"
            type="textarea"
            autosize
          />
          <span v-if="!scope.row.editable">{{ scope.row[item.value] }}</span>
        </template>
      </el-table-column>
    </el-table>
  </detail-block>
  <!-- 选择所依据的技术文件 -->
  <select-tech-files ref="techFileRef" @confirm="confirmSelectTechFile" />
  <!-- 选择建标申请 -->
  <select-build-standard-dialog ref="selectBuildStandardRef" @confirm="confirmSelectBuildStandard" />
  <!-- 选择计量人员(负责人) -->
  <select-staff-person ref="selectStaffPersonRef" @confirm="confirmSelectStaff" />
</template>