Newer
Older
xc-business-system / src / views / resource / environment / require / detail.vue
<!-- 工作间环境条件要求 详情 -->
<script name="EnvironmentRequireDetail" lang="ts" setup>
import { ElLoading, ElMessage, ElMessageBox, dayjs } from 'element-plus'
import type { IConditionRequire, IWorkRoomRequireInfo } from './require-confition-interface'
import ConditionDialog from './dialog/conditionDialog.vue'
import SelectLabRoomsDialog from './dialog/selectLabRoomsDialog.vue'
// import FilterStandard from '@/views/resource/common/filterStandard.vue'
// import FilterStandard from '@/views/business/taskMeasure/measureData/dialog/selectStandardDialog.vue'
import FilterStandard from '@/views/equipement/standardStateMaintenance/dialog/selectStandardDialog.vue'
import { getLocationList } from '@/api/business/taskMeasure/measureData'
import type { IDictType } from '@/commonInterface/resource-interface'
import { batchCheck } from '@/api/equipment/standard/book'
import { detailEnvRequire, getStream, saveEnvRequire, updateEnvRequire } from '@/api/resource/environment'
import useUserStore from '@/store/modules/user'
import { getDictByCode } from '@/api/system/dict'
import { exportFile } from '@/utils/exportUtils'
import { printPdf } from '@/utils/printUtils'
import type { deptType } from '@/global'
import { useCheckList } from '@/commonMethods/useCheckList'
// 变量
// 从路由中传过来的参数
const type = ref<string>('')
const id = ref<string>('')

// 关键字段是否可以编辑
const keyFieldsDisable = ref<boolean>(true)

const userInfo = useUserStore()
const route = useRoute()
const router = useRouter()
const title = ref('')
const rules = ref({
  standardEquipmentName: [{ required: true, message: '标准名称不能为空', trigger: ['change', 'blur'] }],
  labCode: [{ required: true, message: '实验室不能为空', trigger: ['change', 'blur'] }],
  groupCode: [{ required: true, message: '部门不能为空', trigger: ['change', 'blur'] }],
  workRoom: [{ required: true, message: '工作间名称不能为空', trigger: ['change', 'blur'] }],
}) // 表单验证规则
// 子组件
const conditionsRef = ref()
const conditionDialogRef = ref()
const standardFilterRef = ref()

const detailRequire = ref<IWorkRoomRequireInfo>({
  id: '',
  formNo: '',
  formName: '工作间环境条件要求一览表',
  workRoom: '',
  standardEquipmentId: '',
  standardEquipmentName: '',
  createUserId: '',
  createUserName: '',
  createTime: '',
  remark: '',
  groupCode: '', //		部门
  groupCodeName: '', //		部门
  labCode: '', //		实验室
  labCodeName: '', //		实验室
  conditionList: [],
})

const condList: any = ref([])
const condColumns = [
  { text: '开展量传参数', value: 'params', align: 'center', required: true },
  { text: '环境条件要求', value: 'environmentRequire', align: 'center', required: true },
  { text: '环境条件依据', value: 'environmentAccord', align: 'center', required: true },
  { text: '备注', value: 'remark', align: 'center' },
] // 表头

// 字典值
const environmentAccordDict = ref<IDictType[]>([])

const recordSelected = ref<IConditionRequire[]>([])

// 逻辑
// 关闭
const resetForm = () => {
  router.go(-1)
}

const jointEnvAccordName = (condition: IConditionRequire) => {
  let filename = ''
  if (condition.environmentAccord === '1' && condition.fileId !== '') {
    filename = `:${condition.fileName}`
  }

  const targetDict = environmentAccordDict.value.filter(dict => dict.value === condition.environmentAccord)
  if (targetDict.length > 0) {
    condition.environmentAccordName = targetDict[0].name

    return condition.environmentAccordName + filename
  }
  else {
    return ''
  }
}

// 新增(from:越哥,环境条件依据:选择技术规范、仪器说明书需求---暂时隐藏)
const addEditableRow = () => {
  conditionDialogRef.value.showRecordDialog(true)
}

// 新增(from-dtt, 环境条件依据是标准装置带出来的,不允许修改)
const add = () => {
  if (!useCheckList(condList.value, condColumns, '要求一览表')) {
    return false
  }
  condList.value.push({
    id: '',
    params: '',
    environmentRequire: '',
    environmentAccordName: '',
    remark: '',
  })
}

const delRecords = () => {
  if (recordSelected.value.length === 0) {
    ElMessage.warning('请至少选择一行')
    return
  }

  condList.value = condList.value.filter((item: any) => recordSelected.value.includes(item) === false)
}

const recordMultiSelect = (e: any) => {
  recordSelected.value = e
}

const updateCondition = (row: IConditionRequire, index: number) => {
  conditionDialogRef.value.showRecordDialog(true)
  conditionDialogRef.value.initRecordData(row, index)
}

// 新建
const saveRequire = () => {
  detailRequire.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') // 创建时间改为提交时间
  saveEnvRequire(detailRequire.value).then((res) => {
    if (res.code === 200) {
      // 提示保存成功
      ElMessage.success('保存成功')
      // 设置返回的id和编号
      detailRequire.value.formNo = res.data.formNo
      detailRequire.value.id = res.data.id
      id.value = res.data.id

      type.value = 'detail'
    }
    else {
      // 提示失败信息
      ElMessage.error(`保存失败:${res.message}`)
    }
  })
}
// 编辑
const updateRequire = () => {
  updateEnvRequire(detailRequire.value).then((res) => {
    if (res.code === 200) {
      // 提示保存成功
      ElMessage.success('保存成功')
      type.value = 'detail'
    }
    else {
      // 提示失败信息
      ElMessage.error(`保存失败:${res.message}`)
    }
  })
}

// 编辑按钮点击事件处理函数
const editClickedHandler = () => {
  type.value = 'update'
  keyFieldsDisable.value = false
  title.value = '工作间环境条件要求一览表(编辑)'
}

// 新建时保存后的处理 获取返回的id
const saveButtonHandler = async () => {
  if (!conditionsRef) { return }

  if (condList.value.length === 0) {
    ElMessage.warning('要求一览表不能为空')
    return
  }
  if (!useCheckList(condList.value, condColumns, '要求一览表')) {
    return false
  }

  await conditionsRef.value.validate((valid: boolean) => {
    if (valid === true) {
      detailRequire.value.conditionList = condList.value.map((item: any) => {
        return {
          ...item,
          standardEquipmentName: detailRequire.value.standardEquipmentName, // 标准装置名称
          workRoom: detailRequire.value.workRoom, // 工作间
          labCode: detailRequire.value.labCode, // 实验室代码
          labCodeName: detailRequire.value.labCodeName, // 实验室名称
        }
      })

      ElMessageBox.confirm(
        '确认保存吗?',
        '提示',
        {
          confirmButtonText: '确认',
          cancelButtonText: '取消',
          type: 'warning',
        },
      ).then(() => {
        if (type.value === 'create') {
          saveRequire()
        }
        else if (type.value === 'update') {
          updateRequire()
        }
      })
    }
  })
}

// 根据id查询详情
const detailById = async (id: string) => {
  await detailEnvRequire({ id }).then((res) => {
    if (res.code === 200) {
      detailRequire.value = res.data
      condList.value = detailRequire.value.conditionList!.map((cond) => {
        return {
          ...cond,
          environmentAccordName: jointEnvAccordName(cond),
        }
      })
    }
  })
}

// ------------------------------------选择标准装置--------------------------------------------
// 显示弹窗 筛选标准装置
const showStandardEquipmentFilter = () => {
  standardFilterRef.value.initDialog(true)
}

// 选中标准装置返回
const standardSelected = (standardList: any) => {
  if (standardList && standardList.length) {
    const params = standardList.map((item: { id: string }) => item.id)
    detailRequire.value.standardEquipmentId = params.join(',')
    detailRequire.value.standardEquipmentName = standardList.map((item: { standardName: string }) => item.standardName).join(',')
    batchCheck({ ids: params }).then((res) => {
      condList.value = res.data.map((item: { environmentAccord: string }) => {
        return {
          ...item,
          environmentAccordName: item.environmentAccord,
        }
      })
    })
  }
  // detailRequire.value.standardEquipmentId = row.id
  // detailRequire.value.standardEquipmentName = row.standardName

  // standardFilterRef.value.showOrHideFilterDialog(false)
}
// -----------------------------------------------------------------------------------------------

// 新增量传参数返回
const appendToConditionList = (row: IConditionRequire) => {
  if (row.index === undefined || row.index < 0) {
    condList.value.push({
      id: '',
      requireId: id.value,
      params: row.params,
      environmentRequire: row.environmentRequire,
      environmentAccord: row.environmentAccord,
      environmentAccordName: jointEnvAccordName(row),
      fileId: row.fileId,
      fileName: row.fileName,
      remark: row.remark,
      createTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss'),
    })
  }
  else {
    condList.value[row.index] = {
      id: row.id,
      requireId: id.value,
      params: row.params,
      environmentRequire: row.environmentRequire,
      environmentAccord: row.environmentAccord,
      environmentAccordName: jointEnvAccordName(row),
      fileId: row.fileId,
      fileName: row.fileName,
      remark: row.remark,
      createTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss'),
    }
  }
}

const getEnvironmentAccord = async () => {
  // 先从缓存中获取
  if (sessionStorage.getItem('bizEnvironmentAccord') === null || sessionStorage.getItem('bizEnvironmentAccord') === undefined) {
    // 缓存中没有则调用接口查询
    await getDictByCode('bizEnvironmentAccord').then((res) => {
      if (res.code === 200) {
        environmentAccordDict.value = res.data
        sessionStorage.setItem('bizEnvironmentAccord', JSON.stringify(res.data))
      }
    })
  }
  else {
    environmentAccordDict.value = JSON.parse(sessionStorage.getItem('bizEnvironmentAccord')!)
  }
}

const getStorageLocationDict = async () => {
  // 存放地点 先从缓存中获取
  if (sessionStorage.getItem('bizStorageLocation') === null || sessionStorage.getItem('bizStorageLocation') === undefined) {
    // 缓存中没有则调用接口查询
    await getDictByCode('bizStorageLocation').then((res) => {
      if (res.code === 200) {
        sessionStorage.setItem('bizStorageLocation', JSON.stringify(res.data))
      }
    })
  }
}

const initDict = async () => {
  getEnvironmentAccord()
  getStorageLocationDict()
}

const initDialog = (params: any) => {
  // 从路由中获取参数
  type.value = params.type
  id.value = params.id !== undefined ? params.id : ''

  switch (params.type) {
    case 'create' :
      title.value = '工作间环境条件要求一览表(新增)'

      detailRequire.value.createUserId = userInfo.id
      detailRequire.value.createUserName = userInfo.name
      detailRequire.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')
      detailRequire.value.groupCode = userInfo.groupNo //		部门
      detailRequire.value.groupCodeName = userInfo.groupName //		部门
      detailRequire.value.labCode = userInfo.bizLabCode //		实验室
      detailRequire.value.labCodeName = userInfo.labCodeName //		实验室
      keyFieldsDisable.value = false

      break
    case 'update':
      title.value = '工作间环境条件要求一览表(编辑)'

      detailById(id.value)

      // 判断显示哪些流程操作按钮
      keyFieldsDisable.value = false

      break
    case 'detail':
      title.value = '工作间环境条件要求一览表(详情)'
      id.value = params.id

      detailById(id.value)

      // 查看详情时所有的操作按钮都隐藏
      keyFieldsDisable.value = true

      break
    default:
      title.value = ''
      break
  }
}

// --------------------------------导出word、pdf、打印----------------------------------------------------
const stream = ref()
const streamNormal = ref(true) // 流是否正常
// 获取流
const fetchStream = async (isPdf = true) => {
  const loading = ElLoading.service({
    lock: true,
    text: '加载中...',
    background: 'rgba(255, 255, 255, 0.6)',
  })
  const res = await getStream({ id: id.value, pdf: isPdf })
  stream.value = res.data
  loading.close()
}

// 打印Word
const printToWord = () => {
  fetchStream(false).then(() => {
    if (streamNormal.value) {
      exportFile(stream.value, '工作间环境条件要求一览表.doc')
    }
  })
}

// 导出PDF
const printToPDF = () => {
  fetchStream().then(() => {
    if (streamNormal.value) {
      exportFile(new Blob([stream.value]), '工作间环境条件要求一览表.pdf')
    }
  })
}

// 打印
const printClickedHandler = () => {
  fetchStream().then(() => {
    if (streamNormal.value) {
      const blobUrl = URL.createObjectURL(stream.value)
      printPdf(blobUrl)
    }
  })
}

// --------------------------------------字典-----------------------------------------------
const groupCodeList = ref<deptType[]>([]) // 部门
const labCodeList = ref<deptType[]>([]) // 实验室
// 查询字典
const getDictFun = () => {
  // 实验室
  getDictByCode('bizLabCode').then((response) => {
    labCodeList.value = response.data
  })

  // 部门
  getDictByCode('bizGroupCode').then((response) => {
    groupCodeList.value = response.data
  })
}
getDictFun()
// ------------------------------------------选择工作间--------------------------------------------------------
const workRoomList = ref([]) // 工作间列表
const selectLabRoomsRef = ref()
// 点击选择工作间
const selectLabRooms = () => {
  selectLabRoomsRef.value.initDialog()
}

// 确定选择工作间
const confirmSelectLabRooms = (val: any) => {
  if (val && val.length) {
    detailRequire.value.workRoom = val[0].locationName
  }
}

// 请求工作间
const fetchLocationList = () => {
  let lab = ''
  if (detailRequire.value.labCode === 'X') {
    lab = '西昌实验室'
  }
  else if (detailRequire.value.labCode === 'H') {
    lab = '海口实验室'
  }
  const params = {
    locationName: '', // 地点名称
    locationNo: '', // 地点编号
    labName: lab, // 所属实验室
    limit: 999999,
    offset: 1,
  }
  getLocationList(params).then((response) => {
    workRoomList.value = response.data.rows.map((item: { locationName: string }) => {
      return {
        value: item.locationName,
      }
    })
  })
}

// 匹配辅助字段输入建议
const querySearchWorkRoom = (queryString: string, cb: any) => {
  const results = queryString ? workRoomList.value.filter((item: any) => item.value.includes(queryString)) : workRoomList.value
  // 调用 callback 返回建议列表的数据
  cb(results)
}
// -------------------------------------------------------------------------------------------------------
// 修改实验室
const changeLab = (val: string) => {
  if (val === 'X' || val === 'H') { // 选择西昌或者海口的时候清除工作间、选择全站时不必清除
    detailRequire.value.workRoom = '' // 清空工作间
  }
  fetchLocationList() // 获取工作间数据
}
onMounted(() => {
  initDict()
  initDialog(route.query)
  fetchLocationList() // 获取工作间数据
})
</script>

<template>
  <app-container>
    <el-form ref="conditionsRef" :model="detailRequire" :rules="rules" label-position="right" label-width="110px" border stripe>
      <detail-page :title="`${title}`">
        <template #btns>
          <template v-if="type === 'detail'">
            <el-button type="primary" @click="printToWord">
              导出Word
            </el-button>
            <el-button type="primary" @click="printToPDF">
              导出PDF
            </el-button>
            <el-button type="primary" @click="printClickedHandler">
              打印
            </el-button>

            <el-button type="primary" @click="editClickedHandler()">
              编辑
            </el-button>
          </template>
          <el-button v-if="type !== 'detail'" type="primary" @click="saveButtonHandler">
            保存
          </el-button>

          <el-button type="info" @click="resetForm()">
            关闭
          </el-button>
        </template>

        <el-row :gutter="24">
          <el-col :span="6">
            <el-form-item label="实验室" prop="labCode">
              <el-select v-model="detailRequire.labCode" placeholder="请选择实验室" :disabled="type === 'detail'" style="width: 100%;" @change="changeLab">
                <el-option v-for="dict in labCodeList" :key="dict.id" :label="dict.name" :value="dict.value" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="部门" prop="groupCode">
              <el-select v-model="detailRequire.groupCode" placeholder="请选择部门" :disabled="type === 'detail'" style="width: 100%;">
                <el-option v-for="dict in groupCodeList" :key="dict.id" :label="dict.name" :value="dict.value" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="创建人">
              <el-input v-model="detailRequire.createUserName" :disabled="true" />
              <el-input v-model="detailRequire.createUserId" type="hidden" />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="创建时间">
              <el-input v-model="detailRequire.createTime" :disabled="true" />
            </el-form-item>
          </el-col>
          <!-- <el-col :span="6">
            <el-form-item label="文件编号">
              <el-input v-model="detailRequire.formNo" placeholder="系统自动生成" :disabled="true" />
            </el-form-item>
          </el-col> -->

          <el-col :span="6">
            <el-form-item label="文件名称">
              <el-input v-model="detailRequire.formName" :disabled="true" />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="工作间名称" prop="workRoom">
              <!-- <el-input v-model="detailRequire.workRoom" :disabled="true" placeholder="请选择工作间">
                <template v-if="type !== 'detail'" #append>
                  <el-button size="small" @click="selectLabRooms">
                    选择
                  </el-button>
                </template>
              </el-input> -->
              <el-autocomplete
                v-model="detailRequire.workRoom"
                :fetch-suggestions="querySearchWorkRoom"
                placeholder="工作间名称"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="标准名称" prop="standardEquipmentName">
              <el-input v-model="detailRequire.standardEquipmentName" placeholder="请选择标准装置" :disabled="true">
                <template v-if="type !== 'detail'" #append>
                  <el-button size="small" @click="showStandardEquipmentFilter">
                    选择
                  </el-button>
                </template>
              </el-input>
            </el-form-item>
          </el-col>
        </el-row>
      </detail-page>

      <table-container title="要求一览表">
        <template v-if="type !== 'detail'" #btns-right>
          <el-button type="primary" @click="add">
            增加行
          </el-button>
          <el-button type="info" @click="delRecords">
            删除行
          </el-button>
        </template>

        <!-- 表格区域 -->
        <el-table :data="condList" border style="width: 100%;" @selection-change="recordMultiSelect">
          <el-table-column v-if="type !== 'detail'" type="selection" align="center" width="38" />
          <el-table-column align="center" label="序号" width="55" type="index" />
          <el-table-column
            v-for="item in condColumns"
            :key="item.value"
            :prop="item.value"
            :label="item.text"
            :width="item.width"
            align="center"
          >
            <template #header>
              <span v-show="item.required && type !== 'detail'" style="color: red;">*</span><span>{{ item.text }}</span>
            </template>
            <template #default="scope">
              <el-input
                v-if="type !== 'detail'"
                v-model="scope.row[item.value]"
                :placeholder="pageType === 'detail' ? ' ' : `${item.text}`"
                type="textarea"
                autosize
              />
              <span v-else> {{ scope.row[item.value] }}</span>
            </template>
          </el-table-column>
          <!-- <el-table-column v-if="type !== 'detail'" label="操作" align="center" width="75">
            <template #default="scope">
              <el-button size="small" type="primary" link @click="updateCondition(scope.row, scope.$index)">
                编辑
              </el-button>
            </template>
          </el-table-column> -->
        </el-table>
      </table-container>
    </el-form>

    <!-- 选择标准装置组件 -->
    <filter-standard ref="standardFilterRef" :is-multi="true" @confirm="standardSelected" />
    <condition-dialog ref="conditionDialogRef" @record-saved="appendToConditionList" />
    <!-- 选择工作间 -->
    <select-lab-rooms-dialog ref="selectLabRoomsRef" @confirm="confirmSelectLabRooms" />
  </app-container>
</template>