Newer
Older
smart-metering-front / src / views / business / fieldTest / record / edit.vue
<!-- 现场检测审批详情 -->
<script lang="ts" setup name="FieldTestRecordDetail">
import { ref } from 'vue'
import dayjs from 'dayjs'
import { ElLoading, ElMessage } from 'element-plus'
import selectApproveList from '../components/selectApproveList.vue'
import type { IForm } from './record-interface'
import { getStaffList } from '@/api/measure/person'
import useUserStore from '@/store/modules/user'
import { getDetail } from '@/api/business/fieldTest/apply'
import { getUsersDept } from '@/api/device/standard'
import { getPhotoUrl } from '@/api/system/tool'
import { printPdf } from '@/utils/printUtils'
import type { IOptions } from '@/views/device/standardEquipment/standard_interface'
import { addFieldTestRecordList, getRecordDetail, updateFieldTestRecord } from '@/api/business/fieldTest/record'
const user = useUserStore() // 用户信息
const textMap: { [key: string]: string } = {
  edit: '编辑',
  add: '新建',
  detail: '详情',
}// 字典
const $router = useRouter() // 关闭页面使用
const $route = useRoute() // 路由参数
const pageType = ref('add') // 页面类型: add, edit, detail
const infoId = ref('') // 列表id
const ruleFormRef = ref() // 表单ref
const staffPersonList = ref([]) as any// 记录人列表(用户)
const staffPersonOptions = ref([]) as any// 记录人列表(用户)--模糊搜索数据
const applyPersonLoading = ref(false) // 申请人模糊搜索框loading
const form = ref<IForm>({
  logNo: '', // 记录单编号
  logName: '', // 记录单名称
  recorder: '', // 创建人
  recorderName: '', // 创建人名称
  laboratoryId: '', // 实验室id
  laboratoryName: '', // 实验室名称
  recordTime: '', // 记录时间
  siteExecutiveId: '', // 现场检测id
  siteExecutiveNo: '', // 现场检测编号
  customerName: '', // 委托方名称
  customerAddress: '', // 委托方地址
  phone: '', // 委托方电话
  deliverer: '', // 送检人
  delivererTel: '', // 送样人联系方式
  executiveAddress: '', // 现场工作地点
  outputVoltage: '', // 输出电压
  zeroGroundVoltage: '', // 零地电压
  temperature: '', // 温度
  humidity: '', // 湿度
  remark: '', // 备注
  siteExecutiveEquipmentRelationList: [] as any,
  printFileName: '', // 打印文件名
})
const list = ref([]) // 记录结果表
// 校验规则
const formRules = ref({
  laboratoryId: [{ required: true, message: '实验室必填', trigger: ['blur', 'change'] }],
  siteExecutiveNo: [{ required: true, message: '现场检测编号必填', trigger: ['blur', 'change'] }],
  executiveAddress: [{ required: true, message: '现场工作地点必填', trigger: ['blur', 'change'] }],
  outputVoltage: [{ required: true, message: '供电电压必填', trigger: ['blur', 'change'] },
    { pattern: /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/, message: '供电电压只能为数字', trigger: ['blur', 'change'] }],
  zeroGroundVoltage: [{ required: true, message: '零地电压必填', trigger: ['blur', 'change'] },
    { pattern: /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/, message: '零地电压只能为数字', trigger: ['blur', 'change'] }],
  temperature: [{ required: true, message: '温度必填', trigger: ['blur', 'change'] },
    { pattern: /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/, message: '温度只能为数字', trigger: ['blur', 'change'] }],
  humidity: [{ required: true, message: '相对湿度必填', trigger: ['blur', 'change'] },
    { pattern: /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/, message: '相对湿度只能为数字', trigger: ['blur', 'change'] }],
})
// ----------------------------------路由参数--------------------------------------------
if ($route.params && $route.params.type) {
  pageType.value = $route.params.type as string
  console.log(pageType.value)

  if ($route.params.id) {
    infoId.value = $route.params.id as string
  }
}
// ------------------------------------选择现场检测-------------------------------------------------
const approveListRef = ref()
const choose = () => {
  approveListRef.value.initDialog()
}
// 选择好了现场检测
const confirmSelectApproveList = (val: any) => {
  getDetail({ id: val[0].id }).then((res) => {
    form.value.siteExecutiveNo = res.data.siteExecutiveNo// 现场检测编号
    form.value.siteExecutiveId = res.data.id// 现场检测id
    form.value.customerName = res.data.customerName // 委托方名称
    form.value.customerAddress = res.data.customerAddress // 委托方地址
    form.value.phone = res.data.phone // 委托方电话
    form.value.deliverer = res.data.deliverer // 送检人
    form.value.delivererTel = res.data.delivererTel // 送样人联系方式
    list.value = res.data.equipmentInfoList.map((item: any) => {
      return {
        ...item,
        equipmentId: item.id,
        siteExecutiveId: res.data.id,
        equipmentModel: item.modelNo,
      }
    })
    console.log('pppppp', list.value)
  })
}
// -------------------------------------------------------------------------------------

// ---------------------------------------------记录人-----------------------------------
// 选择器模糊查询
const remoteMethod = (query: string) => {
  if (query) {
    applyPersonLoading.value = true
    setTimeout(() => {
      applyPersonLoading.value = false
      staffPersonOptions.value = staffPersonList.value.filter((item: { name: string }) => {
        return item.name.toLowerCase().includes(query.toLowerCase())
      })
    }, 200)
  }
  else {
    staffPersonOptions.value = staffPersonList.value
  }
}
// 查询条件
const staffListQuery = ref({
  staffNo: '', // 人员编号
  name: '', // 姓名
  deptId: '', // 所在部门
  limit: 20,
  offset: 1,
})
// 获取计量人员列表(增加模糊查询)
const fetchStaffList = () => {
  getStaffList(staffListQuery.value).then((res: any) => {
    staffPersonList.value = res.data.records
    staffPersonOptions.value = res.data.records
  })
}

// 关闭新增页面的回调
const close = () => {
  $router.back()
}

// 获取部门信息参数
const DeptParams = ref({
  createEndTime: '',
  createstartTime: '',
  director: '',
  meterMajor: '',
  organizeName: '',
  organizeNo: '',
  organizeType: '3', // 3科室
  pdeptId: null,
  offset: 1,
  limit: 999999,
})
// 获取部门信息
// 标准所在部门下拉框
const laboratoryMap = ref<IOptions[]>([])
const fetchUsersDept = () => {
  getUsersDept(DeptParams.value).then((res) => {
    laboratoryMap.value = res.data.rows
  })
}

// 获取详情信息
const getInfo = () => {
  const loading = ElLoading.service({
    lock: true,
    background: 'rgba(255, 255, 255, 0.8)',
  })
  getRecordDetail({ id: infoId.value }).then((res) => {
    form.value = res.data
    list.value = res.data.siteExecutiveEquipmentRelationList
    form.value.recorder = user.id// 创建人
    form.value.recorderName = user.name // 创建人名称
    form.value.logName = '现场检测记录单' // 记录单名称
    loading.close()
  })
}

// 检查表格第几行信息未完善
const checkEquipmentList = () => {
  const index = list.value.findIndex((item: any) => !item.beforeWorkCheck || !item.beforeWorkResult || !item.afterWorkCheck || !item.afterWorkResult
  || !item.afterWorkRecorderDate || !item.afterWorkRecorderId || !item.beforeWorkRecorderDate || !item.beforeWorkRecorderId)
  if (index !== -1) {
    return index + 1
  }
  else {
    return 'pass'
  }
}
// 保存
const save = () => {
  // 检查表格是否存在增加行信息没有完善的情况
  const result = checkEquipmentList()
  if (result !== 'pass') {
    ElMessage.warning(`表格第${result}行信息未完善`)
    return
  }
  ruleFormRef.value!.validate((valid: boolean) => {
    if (valid) {
      const loading = ElLoading.service({
        lock: true,
        background: 'rgba(255, 255, 255, 0.8)',
      })
      // 新建
      form.value.siteExecutiveEquipmentRelationList = list.value
      if (pageType.value === 'add') { // 新建
        addFieldTestRecordList(form.value).then((res) => {
          ElMessage.success('保存成功')
          close()
          loading.close()
        }).catch(() => {
          loading.close()
        })
      }
      // 保存
      else if (pageType.value === 'edit') { // 编辑
        updateFieldTestRecord(form.value).then((res) => {
          ElMessage.success('保存成功')
          close()
          loading.close()
        }).catch(() => {
          loading.close()
        })
      }
    }
    else {
      console.log('表单校验不通过')
    }
  })
}
// 打印
const print = () => {
  getPhotoUrl(form.value.printFileName as string).then((res) => {
    printPdf(res.data)
  })
}
onMounted(async () => {
  await fetchUsersDept()
  await fetchStaffList()
  form.value.recorder = user.id// 记录人
  form.value.recorderName = user.name // 记录人名字
  form.value.logName = '现场检测记录单' // 记录单名称
  form.value.recordTime = dayjs().format('YYYY-MM-DD HH-mm:ss')// 申请时间
  if (pageType.value !== 'add') {
    getInfo()
  }
})
</script>

<template>
  <app-container class="fieldtest-record-detail">
    <detail-page :title="`现场检测记录-${textMap[pageType]}`">
      <template #btns>
        <el-button v-if="pageType !== 'detail'" type="primary" @click="save">
          保存
        </el-button>
        <!-- <el-button v-if="pageType === 'detail'" type="primary" @click="print">
          打印
        </el-button> -->
        <el-button type="info" @click="close">
          关闭
        </el-button>
      </template>
      <el-form
        ref="ruleFormRef"
        :model="form"
        label-width="120"
        label-position="right"
        :rules="formRules"
      >
        <el-row :gutter="24">
          <el-col :span="8">
            <el-form-item label="记录单编号:" prop="logNo">
              <el-input v-model="form.logNo" class="full-width-input" disabled placeholder="系统自动生成" />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="记录单名称:" prop="logName">
              <el-input v-model="form.logName" class="full-width-input" disabled placeholder="请输入记录单名称" />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="创建人:" prop="recorderName">
              <el-input
                v-model="form.recorderName"
                class="full-width-input"
                :placeholder="pageType === 'detail' ? '' : '请输入记录人'"
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="创建时间:" prop="recordTime">
              <el-date-picker
                v-model="form.recordTime"
                type="datetime"
                format="YYYY-MM-DD HH:mm:ss"
                value-format="YYYY-MM-DD HH:mm:ss"
                class="full-width-input"
                disabled
              />
            </el-form-item>
          </el-col>
          <!-- <el-col :span="8">
            <el-form-item label="实验室:" prop="laboratoryId">
              <el-select
                v-model.trim="form.laboratoryId"
                clearable
                placeholder="请选择实验室"
                class="full-width-input"
                size="default"
                :disabled="pageType === 'detail'"
              >
                <el-option
                  v-for="item in laboratoryMap"
                  :key="item.deptId"
                  :label="item.organizeName"
                  :value="item.deptId!"
                />
              </el-select>
            </el-form-item>
          </el-col> -->
          <el-col :span="8">
            <el-form-item label="现场检测编号:" prop="siteExecutiveNo">
              <el-input v-model="form.siteExecutiveNo" class="full-width-input" disabled placeholder="请选择">
                <template v-if="pageType !== 'detail'" #append>
                  <el-button size="small" @click="choose">
                    选择
                  </el-button>
                </template>
              </el-input>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="委托方名称:" prop="customerName">
              <el-input
                v-model="form.customerName"
                class="full-width-input"
                :placeholder="pageType === 'detail' ? '' : '请输入委托方名称'"
                :class="{ 'detail-input': pageType === 'detail' }"
                disabled
              />
            </el-form-item>
          </el-col>
          <!-- <el-col :span="8">
            <el-form-item label="委托方电话" prop="phone">
              <el-input
                class="full-width-input"
                v-model="form.phone"
                :placeholder="pageType === 'detail' ? '' : '请输入委托方电话'"
                :class="{ 'detail-input': pageType === 'detail' }"
                disabled
              />
            </el-form-item>
          </el-col> -->
          <el-col :span="8">
            <el-form-item label="联系人" prop="deliverer">
              <el-input
                v-model="form.deliverer"
                class="full-width-input"
                :placeholder="pageType === 'detail' ? '' : '请输入联系人'"
                :class="{ 'detail-input': pageType === 'detail' }"
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="联系方式" prop="delivererTel">
              <el-input
                v-model="form.delivererTel"
                class="full-width-input"
                :placeholder="pageType === 'detail' ? '' : '请输入联系方式'"
                :class="{ 'detail-input': pageType === 'detail' }"
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="16">
            <el-form-item label="委托方地址:" prop="customerAddress">
              <el-input
                v-model="form.customerAddress"
                class="full-width-input"
                type="textarea"
                autosize
                :placeholder="pageType === 'detail' ? '' : '请输入委托方地址'"
                :class="{ 'detail-input': pageType === 'detail' }"
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24">
          <el-col :span="8">
            <el-form-item label="现场工作地点" prop="executiveAddress">
              <el-input
                v-model="form.executiveAddress"
                class="full-width-input"
                placeholder="请输入现场工作地点"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="供电电压(V)" prop="outputVoltage">
              <el-input
                v-model="form.outputVoltage"
                class="full-width-input"
                placeholder="请输入供电电压"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="零地电压(V)" prop="zeroGroundVoltage">
              <el-input
                v-model="form.zeroGroundVoltage"
                class="full-width-input"
                placeholder="请输入零地电压"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="温度(℃)" prop="temperature">
              <el-input
                v-model="form.temperature"
                class="full-width-input"
                placeholder="请输入温度"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="相对湿度(%)" prop="humidity">
              <el-input
                v-model="form.humidity"
                class="full-width-input"
                placeholder="请输入相对湿度"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24">
          <el-col :span="16">
            <el-form-item label="备注:" prop="remark">
              <el-input
                v-model="form.remark"
                class="full-width-input"
                autosize
                type="textarea"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </detail-page>
    <detail-block title="测量设备工作状态">
      <el-table
        :data="list"
        style="width: 100%;"
      >
        <el-table-column align="center" label="序号" width="80" type="index" />
        <el-table-column
          prop="equipmentName"
          label="设备名称"
          align="center"
        />
        <el-table-column
          prop="equipmentNo"
          label="设备编号"
          width="160"
          align="center"
        />
        <el-table-column
          prop="equipmentModel"
          label="型号"
          align="center"
        />
        <el-table-column label="工作开始前" align="center">
          <el-table-column
            prop="beforeWorkCheck"
            label="外观及功能检查"
            align="center"
            min-width="180"
          >
            <template #header>
              <span style="color: red;">*</span><span>外观及功能检查</span>
            </template>
            <template #default="scope">
              <el-input v-model="scope.row.beforeWorkCheck" type="textarea" autosize :disabled="pageType === 'detail'" placeholder="请输入" class="input" />
            </template>
          </el-table-column>
          <el-table-column
            prop="beforeWorkResult"
            label="指标测试结果"
            align="center"
            min-width="180"
          >
            <template #header>
              <span style="color: red;">*</span><span>指标测试结果</span>
            </template>
            <template #default="scope">
              <el-input v-model="scope.row.beforeWorkResult" type="textarea" autosize :disabled="pageType === 'detail'" placeholder="请输入" class="input" />
            </template>
          </el-table-column>
          <el-table-column
            prop="beforeWorkRecorderId"
            label="记录人"
            align="center"
            width="180"
          >
            <template #header>
              <span style="color: red;">*</span><span>记录人</span>
            </template>
            <template #default="scope">
              <el-select
                v-model="scope.row.beforeWorkRecorderId"
                placeholder="请选择记录人"
                class="full-width-input"
                :disabled="pageType === 'detail'"
                filterable
                remote
                remote-show-suffix
                :remote-method="remoteMethod"
                :loading="applyPersonLoading"
              >
                <el-option v-for="item in staffPersonOptions" :key="item.id" :label="item.name" :value="item.id" />
              </el-select>
            </template>
          </el-table-column>
          <el-table-column
            prop="beforeWorkRecorderDate"
            label="记录时间"
            align="center"
            width="180"
          >
            <template #header>
              <span style="color: red;">*</span><span>记录时间</span>
            </template>
            <template #default="scope">
              <el-date-picker
                v-model="scope.row.beforeWorkRecorderDate"
                type="datetime"
                format="YYYY-MM-DD HH:mm"
                value-format="YYYY-MM-DD HH:mm"
                class="full-width-input"
                :disabled="pageType === 'detail'"
              />
            </template>
          </el-table-column>
        </el-table-column>
        <el-table-column label="工作开始后" align="center">
          <el-table-column
            prop="afterWorkCheck"
            label="外观及功能检查"
            align="center"
            min-width="180"
          >
            <template #header>
              <span style="color: red;">*</span><span>外观及功能检查</span>
            </template>
            <template #default="scope">
              <el-input v-model="scope.row.afterWorkCheck" type="textarea" autosize :disabled="pageType === 'detail'" placeholder="请输入" class="input" />
            </template>
          </el-table-column>
          <el-table-column
            prop="afterWorkResult"
            label="指标测试结果"
            align="center"
            min-width="180"
          >
            <template #header>
              <span style="color: red;">*</span><span>指标测试结果</span>
            </template>
            <template #default="scope">
              <el-input v-model="scope.row.afterWorkResult" type="textarea" autosize :disabled="pageType === 'detail'" placeholder="请输入工作开始后外观及功能检查" class="input" />
            </template>
          </el-table-column>
          <el-table-column
            prop="afterWorkRecorderId"
            label="记录人"
            align="center"
            width="180"
          >
            <template #header>
              <span style="color: red;">*</span><span>记录人</span>
            </template>
            <template #default="scope">
              <el-select
                v-model="scope.row.afterWorkRecorderId"
                placeholder="请选择记录人"
                class="full-width-input"
                :disabled="pageType === 'detail'"
                filterable
                remote
                remote-show-suffix
                :remote-method="remoteMethod"
                :loading="applyPersonLoading"
              >
                <el-option v-for="item in staffPersonOptions" :key="item.id" :label="item.name" :value="item.id" />
              </el-select>
            </template>
          </el-table-column>
          <el-table-column
            prop="afterWorkRecorderDate"
            label="记录时间"
            align="center"
            width="180"
          >
            <template #header>
              <span style="color: red;">*</span><span>记录时间</span>
            </template>
            <template #default="scope">
              <el-date-picker
                v-model="scope.row.afterWorkRecorderDate"
                type="datetime"
                format="YYYY-MM-DD HH:mm"
                value-format="YYYY-MM-DD HH:mm"
                class="full-width-input"
                :disabled="pageType === 'detail'"
              />
            </template>
          </el-table-column>
        </el-table-column>
      </el-table>
    </detail-block>
    <!-- 选择现场检测编号 -->
    <select-approve-list ref="approveListRef" @add="confirmSelectApproveList" />
  </app-container>
</template>

<style lang="scss">
.fieldtest-record-detail {
  .el-table thead.is-group th.el-table__cell {
    background: #f2f6ff;
  }
}
</style>