<!-- 授权代理委托书详情 -->
<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>