Newer
Older
xc-business-system / src / views / business / manager / sendReceive / components / basic.vue
<!-- 设备收发管理详情 -- 基本信息(这是受检设备系统的设备详情) -->
<script name="SendReceiveDetailBasic" lang="ts" setup>
import type { Ref } from 'vue'
import dayjs from 'dayjs'
import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus'
import type { IBasicForm } from '../sendReceive-interface'
import templateTable from './components/templateTable.vue'
import type { IAccessory, Itech } from '@/views/equipement/info/book/book-interface'
import { getDictByCode } from '@/api/system/dict'
import countries from '@/components/AddressSelect/country-code.json'
import type { deptType, dictType } from '@/global'
import { getDeptTreeList } from '@/api/system/dept'
import { getUserList } from '@/api/system/user'
import showPhoto from '@/components/showPhoto/index.vue'
import { toTreeList } from '@/utils/structure'
import useUserStore from '@/store/modules/user'
import { getDetailBaseInfo } from '@/api/business/manager/sendReceive'
const props = defineProps({
  equipmentId: { // 设备id
    type: String,
  },
})
const emits = defineEmits(['givePrintForm'])
const user = useUserStore() // 用户信息
const countryList = ref(countries) // 国家列表
const testTask = ref<string[]>([])
const form: Ref<IBasicForm> = ref({ // 基本信息表单
  equipmentNo: '', // 统一编号
  equipmentName: '', // 设备名称
  usageStatus: '', // 使用状态
  level: '', // 重要等级
  productCountry: '', // 生产国家
  manufactureNo: '', // 出厂编号
  manufacturer: '', // 生产厂家
  productDate: '', // 生产日期
  unitPrice: '', // 单价(万元)
  purchaseDate: '', // 购进日期
  model: '', // 规格型号
  category: '', // 设备分类
  qualityCondition: '', // 质量状况
  deptId: '', // 使用部门id
  deptName: '', // 使用部门
  checkCycle: '', // 检定周期(月)
  companyId: '', // 所在单位id
  companyName: '', // 所在单位
  remark: '', // 备注
  instructionsFile: '', // 说明书(minio存储文件名)(多个用,拼接)
  checkDate: '', // 检定日期
  checkOrganization: '', // 检定机构
  certificateValid: '', // 证书有效期
  meterIdentify: '', // 计量标识
  usePosition: '', // 使用岗位
  directorName: '', // 负责人
  directorId: '', // 负责人Id
  rfid: '', // RFID标签绑定
  useSign: '', // 在用信息(字典code)
  groupInfos: [], // 部门信息
  installLocation: '', // 安装位置(多个用,拼接)
  installLocationExt: '', // 安装位置(自定义编写)
  testTask: '', // 参试任务
  remarkExt: '', // 备注(扩展)
})
// ------------------------------------技术指标-------------------------------------------
const technicalTargetList = ref<Itech[]>([]) // 技术指标列表
const technicalIndexColumns = [ // 技术指标表头
  { text: '测量范围', value: 'measureRange', required: true },
  { text: '不确定度或允许误差极限或准确度等级', value: 'uncertainty', required: true },
  { text: '依据的技术文件', value: 'basedDocuments', required: true },
]
// -------------------------------------主附件信息----------------------------------------
const attachmentList = ref<IAccessory[]>([]) // 主附件信息
const accessoryColumns = [ // 主附件信息
  { text: '名称', value: 'name', required: true },
  { text: '信息', value: 'information', required: true },
  { text: '位置', value: 'position', required: true },
]
// ------------------------------------------字典----------------------------------------------
const meterIdentifyDict = ref<dictType[]>([]) // 计量标识
const usageStatusList = ref<dictType[]>([]) // 使用状态
const levelList = ref<dictType[]>([]) // 重要等级
const typeList = ref<dictType[]>([]) // 设备类型
const standardTypeList = ref<dictType[]>([]) // 标准类型
const userList = ref<{ [key: string]: string }[]>([]) // 用户列表
const categoryList = ref<dictType[]>([]) // 设备分类
const useInfoList = ref<dictType[]>([]) // 在用信息
const useDeptList = ref<deptType[]>([]) // 所属部门列表
/**
 * 获取字典
 */
function getDict() {
  // 获取部门列表
  getDeptTreeList().then((res) => {
    // 转成树结构
    useDeptList.value = toTreeList(res.data, '0', true)
  })
  // 计量标识
  getDictByCode('eqptMeterIdentify').then((response) => {
    meterIdentifyDict.value = response.data
  })
  // 使用状态
  getDictByCode('eqptDeviceUseStatus').then((response) => {
    usageStatusList.value = response.data
  })
  // 重要等级
  getDictByCode('eqptDeviceLevel').then((response) => {
    levelList.value = response.data
  })
  // 设备类型
  // getDictByCode('equipmentType').then((response) => {
  //   typeList.value = response.data
  // })
  typeList.value = [
    {
      id: '1',
      value: '1',
      name: '受检设备',
    },
    {
      id: '2',
      value: '2',
      name: '特种设备',
    },
  ]
  // 标准类型
  getDictByCode('bizStandardType').then((response) => {
    standardTypeList.value = response.data
  })
  // 获取用户列表
  getUserList({ offset: 1, limit: 999999 }).then((res: any) => {
    userList.value = res.data.rows
  })
  // 设备分类
  getDictByCode('eqptDeviceType').then((response) => {
    categoryList.value = response.data
  })
  getDictByCode('eqptDeviceInUse').then((res) => {
    useInfoList.value = res.data
  })
}

// -------------------------------------------获取详情信息----------------------------------------
/**
 * 获取详情
 * @param isCopy 是否备份,判断基本信息是否变化
 */
const loading = ref(false)
function fetchInfo() {
  // const loading = ElLoading.service({
  //   lock: true,
  //   text: '加载中请稍后',
  //   background: 'rgba(255, 255, 255, 0.8)',
  // })
  loading.value = true
  if (!props.equipmentId) {
    loading.value = false
    return
  }
  getDetailBaseInfo({ equipmentId: props.equipmentId! }).then((res) => {
    emits('givePrintForm', {
      manufactureNo: res.data.manufactureNo, // 出厂编号
      measureValidDate: res.data.certificateValid, // 检定有效期、证书有效期
      directorName: res.data.directorName, // 负责人
      directorId: res.data.directorId, // 负责Id
      equipmentId: res.data.id, // 负责Id
    })
    form.value = res.data
    attachmentList.value = res.data.attachmentList // 主附件信息
    technicalTargetList.value = res.data.technicalTargetList // 技术指标
    if (form.value.testTask) { // 参试任务
      if (form.value.testTask.includes(',')) {
        testTask.value = form.value.testTask.split(',')
      }
      else {
        testTask.value = [form.value.testTask]
      }
    }
    else {
      testTask.value = ['']
    }
    // loading.close()
    loading.value = false
  }).catch(() => {
    // loading.close()
    loading.value = false
  })
}
// -------------------------------------------------------------------------------------------
watch(() => testTask.value, (newVal) => { // 参试任务监听
  if (newVal && Array.isArray(newVal) && newVal.length) {
    form.value.testTask = testTask.value.join(',')
  }
}, { deep: true })
onMounted(async () => {
  await getDict() // 获取字典
  fetchInfo()
})
defineExpose({ fetchInfo, loading })
</script>

<template>
  <div v-loading="loading">
    <detail-block title="">
      <el-form
        ref="ruleFormRef"
        :model="form"
        :label-width="120"
        label-position="right"
      >
        <el-row :gutter="24" class="marg">
          <el-col :span="6">
            <el-form-item label="统一编号:" prop="equipmentNo">
              <el-input v-model="form.equipmentNo" disabled placeholder=" " />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="设备名称:" prop="equipmentName">
              <el-input
                v-model.trim="form.equipmentName"
                placeholder=" "
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="规格型号" prop="model">
              <el-input
                v-model.trim="form.model"
                placeholder=" "
                disabled
                class="full-width-input"
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="辅助字段" prop="helpInstruction">
              <el-input
                v-model.trim="form.helpInstruction"
                placeholder=" "
                disabled
                class="full-width-input"
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="出厂编号:" prop="manufactureNo">
              <el-input
                v-model.trim="form.manufactureNo"
                placeholder=" "
                class="detail-input"
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="生产国家:" prop="productCountry">
              <el-select
                v-model="form.productCountry"
                filterable
                placeholder=" "
                disabled
                class="full-width-input"
              >
                <el-option v-for="country of countryList" :key="country.code" :label="country.CNName" :value="country.code" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="生产厂家:" prop="manufacturer">
              <el-input
                v-model.trim="form.manufacturer"
                placeholder=" "
                class="detail-input"
                disabled
              />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="生产日期:" prop="productDate">
              <el-date-picker
                v-model="form.productDate"
                type="date"
                format="YYYY-MM-DD"
                value-format="YYYY-MM-DD"
                placeholder=" "
                disabled
                class="full-width-input"
              />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="购进日期:" prop="purchaseDate">
              <el-date-picker
                v-model="form.purchaseDate"
                type="date"
                format="YYYY-MM-DD"
                value-format="YYYY-MM-DD"
                placeholder=" "
                disabled
                class="full-width-input"
              />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="设备单价(万元)" prop="unitPrice">
              <el-input v-model.trim="form.unitPrice" disabled />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="使用状态:" prop="usageStatus">
              <el-select
                v-model.trim="form.usageStatus"
                clearable
                placeholder=" "
                size="default"
                disabled
                class="full-width-input"
              >
                <el-option
                  v-for="item in usageStatusList"
                  :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="qualityCondition">
              <el-input
                v-model.trim="form.qualityCondition"
                placeholder=" "
                disabled
                class="full-width-input"
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="所在单位:">
              <dept-select v-model="form.companyId" :data="useDeptList" disabled placeholder="使用部门" style="width: 100%;" />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="使用部门" prop="deptId">
              <dept-select v-model="form.deptId" :data="useDeptList" disabled placeholder="使用部门" style="width: 100%;" />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="设备分类:" prop="category">
              <el-select
                v-model.trim="form.category"
                clearable
                size="default"
                disabled
                class="full-width-input"
              >
                <el-option
                  v-for="item in categoryList"
                  :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="checkCycle">
              <el-input v-model.trim="form.checkCycle" disabled />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="重要等级:" prop="level">
              <el-select
                v-model.trim="form.level"
                clearable
                placeholder=" "
                size="default"
                disabled
                class="full-width-input"
              >
                <el-option
                  v-for="item in levelList"
                  :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="备注:">
              <el-input
                v-model="form.remark"
                type="textarea"
                autosize
                disabled
                class="detail-input"
              />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row v-show="form.instructionsFile" :gutter="24" class="marg">
          <el-col :span="24">
            <el-form-item label="说明书:">
              <show-photo :minio-file-name="form.instructionsFile" width="100%" height="125px" />
            <!-- <div v-for="(item, index) in form.instructionsFile" :key="index" style="display: flex;" />
            <span v-if="!form.instructionsFile">无</span>
            <input v-show="false" ref="fileRef" type="file" name="upload" multiple> -->
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </detail-block>
    <!-- 检定(校准)机构表单 -->
    <detail-block title="">
      <el-form
        ref="sourceFormRef"
        :model="form"
        :label-width="130"
        label-position="right"
        style="display: flex;flex-wrap: nowrap;"
      >
        <el-form-item label="检定(校准)机构:" prop="checkOrganization" style="flex: 1;">
          <el-input
            v-model="form.checkOrganization"
            disabled
          />
        </el-form-item>
        <el-form-item label="检定(校准)日期:" prop="checkDate" style="flex: 1;">
          <el-date-picker
            v-model="form.checkDate"
            type="date"
            format="YYYY-MM-DD"
            value-format="YYYY-MM-DD"
            disabled
            class="full-width-input"
          />
        </el-form-item>
        <el-form-item label="证书有效期:" prop="certificateValid" style="flex: 1;">
          <el-date-picker
            v-model="form.certificateValid"
            type="date"
            format="YYYY-MM-DD"
            value-format="YYYY-MM-DD"
            disabled
            class="full-width-input"
          />
        </el-form-item>
        <el-form-item label="计量标识:" prop="meterIdentify" style="flex: 1;">
          <el-select
            v-model="form.meterIdentify"
            placeholder=" "
            disabled
            class="full-width-input"
          >
            <el-option v-for="item of meterIdentifyDict" :key="item.value" :label="item.name" :value="item.value" />
          </el-select>
        </el-form-item>
      </el-form>
    </detail-block>

    <!-- 部门信息 -->
    <detail-block title="">
      <el-form
        ref="sourceFormRef"
        :model="form"
        :label-width="120"
        label-position="right"
      >
        <el-row :gutter="24" class="marg">
          <el-col :span="6">
            <el-form-item label="使用岗位" prop="usePosition">
              <el-input v-model.trim="form.usePosition" disabled />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="负责人" prop="directorName">
              <el-input v-model.trim="form.directorName" disabled />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="RFID标签绑定" prop="rfid">
              <el-input v-model.trim="form.rfid" disabled />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="在用信息" prop="useSign">
              <!-- <el-input v-model.trim="form.useSign" /> -->
              <el-select v-model="form.useSign" placeholder="选择在用信息" style="width: 100%;" disabled>
                <el-option v-for="item in useInfoList" :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="6">
            <el-form-item label="检定去向" prop="checkDestination">
              <el-select v-model="form.checkDestination" placeholder="检定去向" style="width: 100%;" disabled>
                <el-option label="计量室" value="1" />
                <el-option label="外送" value="2" />
              </el-select>
            </el-form-item>
          </el-col>
          <!-- <el-col :span="6">
            <el-form-item label="安装位置" prop="installLocationId">
              <el-select v-model="form.installLocationId" filterable placeholder="安装位置" clearable style="width: 100%;">
                <el-option v-for="item in installLocationList" :key="item.id" :label="item.installLocation" :value="item.id" />
              </el-select>
            </el-form-item>
          </el-col> -->
          <!-- <el-col :span="6">
            <el-form-item label="安装位置" prop="installLocation">
              <el-input v-model.trim="form.installLocation" disabled />
            </el-form-item>
          </el-col> -->
          <el-col :span="12">
            <el-form-item label="详细位置">
              <el-input v-model.trim="form.installLocationExt" disabled />
            </el-form-item>
          </el-col>
        </el-row>
        <!-- <el-row :gutter="24" class="marg">
          <el-col :span="18">
            <el-form-item label="参试任务" prop="fileNo">
              <el-table :data="form.taskInfos" border stripe>
                <el-table-column label="任务名称" prop="taskName" align="center" />
                <el-table-column label="开始时间" prop="startTime" align="center" />
                <el-table-column label="结束时间" prop="taskName" align="center" />
                <el-table-column label="备注" prop="remark" align="center" />
              </el-table>
            </el-form-item>
          </el-col>
        </el-row> -->
        <el-row :gutter="24" class="marg">
          <el-col :span="12">
            <el-form-item label="备注" prop="remarkExt">
              <el-input v-model.trim="form.remarkExt" disabled />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </detail-block>

    <!-- 技术指标 -->
    <detail-block title="技术指标">
      <el-table
        ref="techRef"
        :data="technicalTargetList"
        border
        style="width: 100%;"
      >
        <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"
        />
      </el-table>
    </detail-block>

    <!-- 主附件信息 -->
    <detail-block title="主附件信息">
      <el-table
        ref="accessoryRef"
        :data="attachmentList"
        border
        style="width: 100%;"
      >
        <el-table-column align="center" label="序号" width="80" type="index" />
        <el-table-column
          v-for="item in accessoryColumns"
          :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">
            <span v-if="!scope.row.editable">{{ scope.row[item.value] }}</span>
            <el-input v-else v-model="scope.row[item.value]" :autofocus="true" :placeholder="`${item.text}`" class="input" />
          </template>
        </el-table-column>
      </el-table>
    </detail-block>
  </div>
</template>

<style lang="scss" scoped>
.link {
  text-decoration: underline;
  color: #3d7eff;
  cursor: pointer;
}

.file-area {
  display: flex;
  align-items: center;
  font-size: 14px;
  color: #60627f;
  margin-bottom: 10px;
  margin-left: 40px;
  white-space: nowrap;

  .tech-file {
    display: flex;
    align-items: center;
    margin-left: 20px;

    .file-text {
      margin-right: 10px;
    }
  }
}
</style>