<!-- 委托方情况报告详情 -->
<script name="SituationReportDetail" lang="ts" setup>
import { ElLoading, ElMessage, ElMessageBox, dayjs } from 'element-plus'
import type { ICustomerQuestionnaireInfo, IListQuery } from '../questionnaire/customer-questionnaire'
import type { ICustomerSatisfaction, ISituationReportInfo } from './customer-report'
import type { TableColumn } from '@/components/NormalTable/table_interface'
import type { IDictType } from '@/commonInterface/resource-interface'
import useUserStore from '@/store/modules/user'
import { detailSituationReport, getStream, saveSituationReport, updateSituationReport } from '@/api/resource/situationReport'
import { getDictByCode } from '@/api/system/dict'
import { getQuestionnaireList } from '@/api/resource/questionnaire'
import FilterQuestionnaire from '@/views/resource/common/filterQuestionnaire.vue'
import { exportFile } from '@/utils/exportUtils'
import { printPdf } from '@/utils/printUtils'
// 从路由中传过来的参数
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 reportFormRef = ref()
const refQuestionnaireFilter = ref()
const reportInfo = ref<ISituationReportInfo>({
id: '',
customerName: '',
labCode: '',
labCodeName: '',
reportNo: '',
reportName: '委托方情况报告',
customerAdvice: '',
customerAdviceHandle: '',
conclusion: '',
createUserId: '',
createUserName: '',
createTime: '',
customerList: [],
})
const quesQuery = ref<IListQuery>({
customerName: '', // 填写单位
writerName: '',
writeTimeStart: '',
writeTimeEnd: '',
sendTimeStart: '',
sendTimeEnd: '',
offset: 1,
limit: 2000,
})
const reportFormRules = ref({
labCode: [{ required: true, message: '实验室代码不能为空,请选择', trigger: ['change', 'blur'] }],
customerName: [{ required: true, message: '委托方不能为空', trigger: 'blur' }],
customerAdvice: [{ required: true, message: '委托方反馈意见不能为空,请选择', trigger: 'blur' }],
customerAdviceHandle: [{ required: true, message: '对委托方意见的处理不能为空', trigger: 'blur' }],
conclusion: [{ required: true, message: '结论不能为空', trigger: 'blur' }],
}) // 表单验证规则
// 字典值
const labCodeDict = ref<IDictType[]>([])
const customerListXc = ref<ICustomerSatisfaction[]>([])
const customerListHk = ref<ICustomerSatisfaction[]>([])
const satisfactionColumns = ref<TableColumn[]>([
{ text: '委托方名称', value: 'customerName', align: 'center' },
{ text: '时间', value: 'proposeTime', align: 'center', width: '240' },
{ text: '评分', value: 'score', align: 'center', width: '240' },
])
const customerSelectedXc = ref<ICustomerSatisfaction[]>([])
const customerSelectedHk = ref<ICustomerSatisfaction[]>([])
const xcMultiSelect = (e: any) => {
customerSelectedXc.value = e
}
const hkMultiSelect = (e: any) => {
customerSelectedHk.value = e
}
const addEditableRow = () => {
refQuestionnaireFilter.value.showOrHideFilterDialog(true)
}
const delSatisfaction = () => {
if (customerSelectedXc.value.length === 0 && customerSelectedHk.value.length === 0) {
ElMessage.warning('请至少选择一行')
return
}
// 前端界面删除
customerListXc.value = customerListXc.value.filter(item => customerSelectedXc.value.includes(item) === false)
customerListHk.value = customerListHk.value.filter(item => customerSelectedHk.value.includes(item) === false)
}
// 根据委托方名称查询满意度调查表
// 暂时不用
const searchQuestionnaire = () => {
if (reportInfo.value.customerName !== '') {
reportInfo.value.customerName = reportInfo.value.customerName.replace(',', ',')
const customerList = reportInfo.value.customerName.split(',')
customerList.forEach((customer: string) => {
quesQuery.value.customerName = customer
getQuestionnaireList(quesQuery.value).then((res) => {
if (res.code === 200) {
customerListXc.value = []
customerListHk.value = []
res.data.rows.forEach((item: ICustomerQuestionnaireInfo) => {
if (item.writeStatus === '已提交') {
if (item.labCode === 'X') {
customerListXc.value.push({
id: item.id,
labCode: item.labCode,
customerName: item.customerName,
proposeTime: item.writeTime,
})
}
else if (item.labCode === 'H') {
customerListHk.value.push({
id: item.id,
labCode: item.labCode,
customerName: item.customerName,
proposeTime: item.writeTime,
})
}
}
})
}
})
})
}
}
// 保存至草稿箱
const saveReportInfo = () => {
reportInfo.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') // 创建时间改为提交时间
saveSituationReport(reportInfo.value).then((res) => {
if (res.code === 200) {
// 提示保存成功
ElMessage.success('保存成功')
// 设置返回的委托方id和委托方编号
reportInfo.value.reportNo = res.data.reportNo
reportInfo.value.id = res.data.id
id.value = res.data.id
type.value = 'detail'
keyFieldsDisable.value = true
}
else {
// 提示失败信息
ElMessage.error(`保存失败:${res.message}`)
}
})
}
// 编辑
const updateReportInfo = () => {
updateSituationReport(reportInfo.value).then((res) => {
if (res.code === 200) {
// 提示保存成功
ElMessage.success('保存成功')
}
else {
// 提示失败信息
ElMessage.error(`保存失败:${res.message}`)
}
})
}
// 新建时保存后的处理 获取返回的id
const saveButtonHandler = async () => {
if (!reportFormRef) { return }
reportInfo.value.customerList = []
customerListXc.value.forEach((item) => {
reportInfo.value.customerList.push(item)
})
customerListHk.value.forEach((item) => {
reportInfo.value.customerList.push(item)
})
await reportFormRef.value.validate((valid: boolean, fields: any) => {
if (valid === true) {
ElMessageBox.confirm(
'确认保存吗?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
},
).then(() => {
if (type.value === 'create') {
saveReportInfo()
}
else if (type.value === 'update') {
updateReportInfo()
}
})
}
})
}
const questionnaireSelectedHandler = (rows: ICustomerQuestionnaireInfo[]) => {
refQuestionnaireFilter.value.showOrHideFilterDialog(false)
rows.forEach((row) => {
if (row.labCode === 'X') {
const existList = customerListXc.value.filter(xc => xc.id === row.id)
if (existList.length === 0) {
customerListXc.value.push(row)
}
}
else if (row.labCode === 'H') {
const existList = customerListHk.value.filter(hk => hk.id === row.id)
if (existList.length === 0) {
customerListHk.value.push(row)
}
}
})
}
const disSatisfByLabCode = () => {
detailSituationReport({ id: reportInfo.value.id }).then((res) => {
if (res.code === 200) {
customerListXc.value = res.data.xCustomerList
customerListHk.value = res.data.hCustomerList
}
})
}
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('situationReportInfo') // 返回列表时 将缓存中的数据删除
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('situationReportInfo')
reportInfo.value.createUserId = userInfo.id
reportInfo.value.createUserName = userInfo.name
reportInfo.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')
// 新建时组别代码和实验室代码可以编辑
keyFieldsDisable.value = false
break
case 'update':
title.value = '委托方情况报告(编辑)'
reportInfo.value = JSON.parse(sessionStorage.getItem('situationReportInfo')!)
disSatisfByLabCode()
break
case 'detail':
title.value = '委托方情况报告(详情)'
id.value = params.id
reportInfo.value = JSON.parse(sessionStorage.getItem('situationReportInfo')!)
disSatisfByLabCode()
keyFieldsDisable.value = true
break
default:
title.value = ''
keyFieldsDisable.value = true
break
}
}
const initDict = () => {
getLabCodeDict()
}
// 监听 显示中文
watch(() => reportInfo.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) {
reportInfo.value.labCodeName = targetList[0].name
}
else {
reportInfo.value.labCodeName = ''
}
}
})
// --------------------------------导出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)
}
})
}
onMounted(() => {
initDict()
initDialog(route.query)
})
</script>
<template>
<app-container>
<el-form ref="reportFormRef" :model="reportInfo" :rules="reportFormRules" label-position="right" label-width="125px" 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>
</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="reportInfo.labCode" placeholder="请选择实验室代码" :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="reportInfo.labCodeName" type="hidden" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="报告单编号">
<el-input v-model="reportInfo.reportNo" placeholder="报告单编号,保存后自动生成" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="拟制人">
<el-input v-model="reportInfo.createUserId" type="hidden" />
<el-input v-model="reportInfo.createUserName" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="拟制时间">
<el-input v-model="reportInfo.createTime" :disabled="true" />
</el-form-item>
</el-col>
</el-row>
</detail-page>
<detail-block title="">
<el-row :gutter="24">
<el-col :span="24">
<el-form-item label="委托方名称" prop="customerName">
<el-input v-model="reportInfo.customerName" placeholder="委托方名称,多个委托方用,隔开" :clearable="true" :disabled="type === 'detail'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="24">
<el-form-item label="委托方反馈意见" prop="customerAdvice">
<el-input v-model="reportInfo.customerAdvice" placeholder="请输入委托方反馈的意见" :clearable="true" :disabled="type === 'detail'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="24">
<el-form-item label="对意见的处理" prop="customerAdviceHandle">
<el-input v-model="reportInfo.customerAdviceHandle" placeholder="请输入对委托方意见的处理" :clearable="true" :disabled="type === 'detail'" />
</el-form-item>
</el-col>
</el-row>
</detail-block>
<table-container title="一、西昌实验室情况">
<template v-if="type !== 'detail'" #btns-right>
<el-button type="primary" @click="addEditableRow()">
增加行
</el-button>
<el-button type="info" @click="delSatisfaction()">
删除行
</el-button>
</template>
<el-table :data="customerListXc" border style="width: 100%;" @selection-change="xcMultiSelect">
<el-table-column v-if="type !== 'detail'" type="selection" align="center" width="38" />
<el-table-column align="center" label="序号" width="80" type="index" />
<el-table-column
v-for="item in satisfactionColumns"
:key="item.value"
:prop="item.value"
:label="item.text"
:width="item.width"
align="center"
>
<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>
</table-container>
<table-container title="二、海口实验室情况">
<el-table :data="customerListHk" border style="width: 100%;" @selection-change="hkMultiSelect">
<el-table-column v-if="type !== 'detail'" type="selection" align="center" width="38" />
<el-table-column align="center" label="序号" width="80" type="index" />
<el-table-column
v-for="item in satisfactionColumns"
:key="item.value"
:prop="item.value"
:label="item.text"
:width="item.width"
align="center"
>
<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>
</table-container>
<detail-block title="">
<el-row :gutter="24">
<el-col :span="24">
<el-form-item label="结论" prop="conclusion">
<el-input v-model="reportInfo.conclusion" :clearable="true" :disabled="type === 'detail'" />
</el-form-item>
</el-col>
</el-row>
</detail-block>
</el-form>
<filter-questionnaire ref="refQuestionnaireFilter" @record-selected="questionnaireSelectedHandler" />
</app-container>
</template>