Newer
Older
xc-business-system / src / views / resource / customer / reviewNotice / detail.vue
<!-- 授权代理委托书详情 -->
<script name="ReviewNoticeDetail" lang="ts" setup>
import { ElMessage, ElMessageBox, dayjs } from 'element-plus'
import type{ ICustomerNoticeInfo } from './customer-notice'
import useUserStore from '@/store/modules/user'
import { exportFile, saveReviewNotice, updateReviewNotice } from '@/api/resource/reviewNotice'
import type { IDictType } from '@/commonInterface/resource-interface'
import { getDictByCode } from '@/api/system/dict'
import FilterSysUser from '@/views/resource/common/filterSysUser.vue'
import FilterCustomer from '@/views/resource/common/filterCustomer.vue'

// 从路由中传过来的参数
const type = ref<string>('')
const id = ref<string>('')

const userInfo = useUserStore()
const route = useRoute()
const router = useRouter()
const title = ref('')

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

const noticeFormRef = ref()
const noticeRef = ref()
const refFilterSysUser = ref()
const refFilterCustomer = ref()

const noticeInfo = ref<ICustomerNoticeInfo>({
  id: '',
  customerId: '',
  customerName: '',
  deptId: '',
  labCode: '',
  labCodeName: '',
  noticeUserId: '',
  noticeUserName: '',
  noticeNo: '',
  noticeName: '检测结果复查通知单',
  submitDate: '',
  deviceName: '',
  deviceModel: '',
  deviceNo: '',
  returnDate: '',
  noticeDate: '',
  createUserId: '',
  createUserName: '',
  createTime: '',
})

const noticeFormRules = ref({
  labCode: [{ required: true, message: '实验室代码不能为空,请选择', trigger: ['change', 'blur'] }],
}) // 表单验证规则

const noticeRules = ref({
  deptId: [{ required: true, message: '委托单位不能为空,请选择', trigger: ['change', 'blur'] }],
  submitDate: [{ required: true, message: '送检日期不能为空,请选择', trigger: 'blur' }],
  deviceName: [{ required: true, message: '设备名称不能为空', trigger: 'blur' }],
  deviceNo: [{ required: true, message: '设备编号不能为空', trigger: 'blur' }],
  deviceModel: [{ required: true, message: '设备型号不能为空', trigger: 'blur' }],
  returnDate: [{ required: true, message: '寄回日期不能为空', trigger: 'blur' }],
  noticeDate: [{ required: true, message: '通知日期不能为空,请选择', trigger: 'blur' }],
}) // 表单验证规则

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

// 逻辑

// 保存至草稿箱
const saveNoticeInfo = () => {
  noticeInfo.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') // 创建时间改为提交时间
  saveReviewNotice(noticeInfo.value).then((res) => {
    if (res.code === 200) {
      // 提示保存成功
      ElMessage.success('保存成功')
      // 设置返回的委托方id和委托方编号
      noticeInfo.value.noticeNo = res.data.noticeNo
      noticeInfo.value.id = res.data.id
      id.value = res.data.id

      type.value = 'detail'
    }
    else {
      // 提示失败信息
      ElMessage.error(`保存失败:${res.message}`)
    }
  })
}

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

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

  let formValid

  // 先对表单一进行校验
  await noticeFormRef.value.validate((valid: boolean) => {
    if (valid === false) {
      formValid = false
    }
    else {
      formValid = true
    }
  })

  if (formValid === false) { return }

  // 表单一通过校验后 对表单二进行校验
  await noticeRef.value.validate((valid: boolean, fields: any) => {
    if (valid === true) {
      ElMessageBox.confirm(
        '确认保存吗?',
        '提示',
        {
          confirmButtonText: '确认',
          cancelButtonText: '取消',
          type: 'warning',
        },
      ).then(() => {
        if (type.value === 'create') {
          saveNoticeInfo()
        }
        else if (type.value === 'update') {
          updateNoticeInfo()
        }
      })
    }
  })
}

// 打印Word
const printToWord = () => {
  // exportFile({ id: noticeInfo.value.id, pdf: false })
}

// 打印PDF
const printToPDF = () => {

}

// 打印通知
const printNotice = () => {

}

// 点击 发送 按钮
const sendToCustomer = () => {
  refFilterSysUser.value.showOrHideFilterDialog(true)
}

const sysUserSelectedHandler = (row: any) => {
  refFilterSysUser.value.showOrHideFilterDialog(false)

  if (row.id !== '') {
    noticeInfo.value.noticeUserId = row.id
    noticeInfo.value.noticeUserName = row.name

    updateReviewNotice(noticeInfo.value).then((res) => {
      if (res.code === 200) {
        // 提示保存成功
        ElMessage.success(`发送到 ${noticeInfo.value.customerName} 的 ${noticeInfo.value.noticeUserName} 成功`)
      }
      else {
        // 提示失败信息
        ElMessage.error(`通知单发送至受检单位失败:${res.message}`)
      }
    })
  }
  else {
    ElMessage.error('发送至人员不能为空,请重新选择')
  }
}

const showCustomerFilter = () => {
  refFilterCustomer.value.showOrHideFilterDialog(true)
}

const customerSelectedHandler = (row: any) => {
  refFilterCustomer.value.showOrHideFilterDialog(false)

  if (row.id !== '') {
    noticeInfo.value.customerId = row.id
    noticeInfo.value.deptId = row.deptId
    noticeInfo.value.customerName = row.customerName
  }
  else {
    ElMessage.error('委托单位不能为空,请重新选择')
  }
}

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

// 关闭
const resetForm = () => {
  sessionStorage.removeItem('reviewNoticeInfo') // 返回列表时 将缓存中的数据删除
  router.go(-1)
}

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

  switch (params.type) {
    case 'create' :
      title.value = '检测结果复查通知单(新增)'

      sessionStorage.removeItem('reviewNoticeInfo')

      noticeInfo.value.createUserId = userInfo.id
      noticeInfo.value.createUserName = userInfo.name
      noticeInfo.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')
      noticeInfo.value.noticeDate = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')

      // 新建时组别代码和实验室代码可以编辑
      keyFieldsDisable.value = false
      break
    case 'update':
      title.value = '检测结果复查通知单(编辑)'

      noticeInfo.value = JSON.parse(sessionStorage.getItem('reviewNoticeInfo')!)
      break
    case 'detail':
      title.value = '检测结果复查通知单(详情)'
      id.value = params.id

      noticeInfo.value = JSON.parse(sessionStorage.getItem('reviewNoticeInfo')!)
      keyFieldsDisable.value = true
      break
    default:
      title.value = ''
      keyFieldsDisable.value = true
      break
  }
}

const initDict = () => {
  getLabCodeDict()
}

// 监听 显示中文
watch(() => noticeInfo.value.labCode, (newVal) => {
  labCodeDict.value = JSON.parse(sessionStorage.getItem('bizLabCode')!)

  if (labCodeDict.value.length > 0) {
    const targetList = labCodeDict.value.filter(item => item.value === newVal)
    if (targetList.length > 0) {
      noticeInfo.value.labCodeName = targetList[0].name
    }
    else {
      noticeInfo.value.labCodeName = ''
    }
  }
})

onMounted(() => {
  initDict()
  initDialog(route.query)
})
</script>

<template>
  <app-container>
    <el-form ref="noticeFormRef" :model="noticeInfo" :rules="noticeFormRules" label-position="right" label-width="110px" border stripe>
      <detail-page :title="`${title}`">
        <template #btns>
          <template v-if="type === 'detail'">
            <el-button type="primary" @click="sendToCustomer">
              发送给受检单位
            </el-button>
            <el-button type="primary" @click="printToWord">
              导出Word
            </el-button>
            <el-button type="primary" @click="printToPDF">
              导出PDF
            </el-button>
            <el-button type="primary" @click="printNotice">
              打印
            </el-button>
          </template>

          <el-button v-else 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="noticeInfo.labCode" placeholder="请选择实验室代码" tabindex="1" :disabled="keyFieldsDisable" style="width: 100%;">
                <el-option v-for="dict in labCodeDict" :key="dict.id" :label="dict.name" :value="dict.value" />
              </el-select>
              <el-input v-model="noticeInfo.labCodeName" type="hidden" />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="通知单编号">
              <el-input v-model="noticeInfo.noticeNo" placeholder="通知单编号,保存后自动生成" :disabled="true" />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="创建人">
              <el-input v-model="noticeInfo.noticeName" type="hidden" />
              <el-input v-model="noticeInfo.createUserId" type="hidden" />
              <el-input v-model="noticeInfo.createUserName" :disabled="true" />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="创建时间">
              <el-input v-model="noticeInfo.createTime" :disabled="true" />
            </el-form-item>
          </el-col>
        </el-row>
      </detail-page>
    </el-form>

    <el-form ref="noticeRef" :model="noticeInfo" :rules="noticeRules" style="display: flex; white-space: nowrap; flex-wrap: wrap;">
      <el-input v-model="noticeInfo.labCode" type="hidden" />
      <el-input v-model="noticeInfo.labCodeName" type="hidden" />
      <el-input v-model="noticeInfo.noticeNo" type="hidden" />
      <el-input v-model="noticeInfo.noticeName" type="hidden" />
      <el-input v-model="noticeInfo.createUserId" type="hidden" />
      <el-input v-model="noticeInfo.createUserName" type="hidden" />
      <el-input v-model="noticeInfo.createTime" type="hidden" />
      <detail-block style="margin-top: 20px; width: 100%; font-size: 1.5rem;" title="">
        <el-row :gutter="24">
          <el-col :span="24">
            <div class="notice-title">
              检测结果复查通知单
            </div>
          </el-col>
        </el-row>

        <el-row :gutter="24" style="padding: 0 6rem;">
          <el-form-item label="" prop="deptId">
            <el-input v-model="noticeInfo.customerId" type="hidden" />
            <el-input v-model="noticeInfo.deptId" type="hidden" />
            <el-input v-model="noticeInfo.customerName" placeholder="请选择委托单位" size="large" :disabled="true" style="width: 300px;">
              <template #append>
                <el-button size="small" :disabled="type === 'detail'" @click="showCustomerFilter">
                  选择
                </el-button>
              </template>
            </el-input>
          </el-form-item>
        </el-row>

        <el-row :gutter="24" style="margin-top: 30px; padding: 0 8rem;">
          <span class="notice-text">由于我站工作失误,贵单位于</span>

          <el-form-item label="" prop="submitDate">
            <el-date-picker
              v-model="noticeInfo.submitDate" type="date"
              format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss"
              placeholder="请选择送检时间" :clearable="true" :disabled="type === 'detail'"
              size="large"
              style="width: 300px; margin: 0 10px;"
            />
          </el-form-item>

          <span class="notice-text">送来的</span>

          <el-form-item label="" prop="deviceName">
            <el-input
              v-model="noticeInfo.deviceName" placeholder="设备名称"
              :clearable="true" :disabled="type === 'detail'"
              size="large" style="width: 300px; margin: 0 10px;"
            />
          </el-form-item>
        </el-row>

        <el-row :gutter="24" style="margin-top: 20px;padding: 0 6rem;">
          <el-form-item label="" prop="deviceModel">
            <el-input
              v-model="noticeInfo.deviceModel" placeholder="设备型号"
              :clearable="true" :disabled="type === 'detail'"
              size="large" style="width: 300px;"
            />
          </el-form-item>

          <el-form-item label="" prop="deviceNo">
            <el-input
              v-model="noticeInfo.deviceNo" placeholder="设备编号"
              :clearable="true" :disabled="type === 'detail'"
              size="large" style="width: 300px; margin: 0 10px;"
            />
          </el-form-item>

          <span class="notice-text">测量结果可能有误,需重新进行测试、校准或检定。</span>
        </el-row>

        <el-row :gutter="24" style="margin-top: 20px;padding: 0 6rem;">
          <span class="notice-text">请贵单位于</span>

          <el-form-item label="" prop="returnDate">
            <el-date-picker
              v-model="noticeInfo.returnDate" type="date"
              format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss"
              placeholder="请选择寄回时间" :clearable="true" :disabled="type === 'detail'"
              style="width: 300px; margin: 0 10px;" size="large"
            />
          </el-form-item>

          <span class="notice-text">前将此设备以及证书或报告一同送(寄)回本站,谢谢合作。</span>
        </el-row>

        <el-row :gutter="24" style="margin-top: 50px;">
          <el-col :span="6" :offset="10">
            <span class="notice-text"> 特此通知 </span>
          </el-col>
        </el-row>

        <el-row :gutter="24" style="margin-top: 50px;">
          <el-col :span="6" :offset="12">
            <span class="notice-text">中国西昌卫星发射中心计量测试站</span>

            <el-form-item label="" prop="noticeDate">
              <el-date-picker
                v-model="noticeInfo.noticeDate" type="date"
                format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss"
                placeholder="请选择通知日期" :clearable="true" :disabled="type === 'detail'"
                style="width: 300px; margin-top: 20px;" size="large"
              />
            </el-form-item>
          </el-col>
        </el-row>
      </detail-block>
    </el-form>

    <filter-sys-user ref="refFilterSysUser" @record-selected="sysUserSelectedHandler" />

    <filter-customer ref="refFilterCustomer" @record-selected="customerSelectedHandler" />
  </app-container>
</template>

<style scoped>
.notice-title {
  text-align: center;
  font-weight: bold;
  font-size: 2rem;
  font-family: SimSun, STSong;
  margin-bottom: 50px;
}

.notice-text {
  font-family: SimSun, STSong;
  line-height: 40px;
}
</style>