<!-- 标志打印详情 -->
<script name="BusinessTaskMeasurePrintDetail" lang="ts" setup>
import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
import ThreeInfo from './components/label/threeInfo.vue'
import printThreeInfo from './components/label/printThreeInfo.vue'
import type { IEquipmentList } from './print-interface'
import type { TableColumn } from '@/components/NormalTable/table_interface'
import type { dictType } from '@/global'
import { getDictByCode } from '@/api/system/dict'
import SelectEquipmentDialog from '@/views/business/fieldTest/approve/dialog/selectEquipmentDialog.vue'
import selectEquipmentEqptDialog from '@/views/business/manager/order/dialog/selectEquipment.vue'
import { printHtml } from '@/utils/printUtils'
const textMap: { [key: string]: string } = {
edit: '编辑',
add: '新建',
detail: '详情',
}// 字典
const loading = ref(false) // 表单加载状态
const infoId = ref('') // id
const pageType = ref('') // 页面类型
const printFileName = ref('') // 文件名
const $route = useRoute()
const $router = useRouter()
// ----------------------------------路由参数--------------------------------------------
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 eqptMeterIdentifyList = ref<dictType[]>([]) // 受检设备计量标识
const eqptMeterIdentifyMap = ref({}) as any // 受检设备计量标识
const meterIdentifyList = ref<dictType[]>([]) // 设备台账计量标识
const meterIdentifyMap = ref({}) as any // 设备台账计量标识
const useStatusList = ref<dictType[]>([]) // 设备台账使用状态
const useStatusMap = ref({}) as any // 设备台账使用状态
// 获取字典值
async function getDict() {
// 受检设备计量标识
const response = await getDictByCode('eqptMeterIdentify')
response.data.forEach((item: { value: string; name: string }) => {
eqptMeterIdentifyMap.value[`${item.value}`] = item.name
})
eqptMeterIdentifyList.value = response.data
// 计量标识
const responseMeterIdentify = await getDictByCode('bizMeterIdentify')
responseMeterIdentify.data.forEach((item: { value: string; name: string }) => {
meterIdentifyMap.value[`${item.value}`] = item.name
})
meterIdentifyList.value = responseMeterIdentify.data
// 使用状态
const responseUseStatus = await getDictByCode('bizUsageStatus')
responseUseStatus.data.forEach((item: { value: string; name: string }) => {
useStatusMap.value[`${item.value}`] = item.name
})
useStatusList.value = responseUseStatus.data
}
getDict()
// ---------------------------------------------左侧表格-------------------------------------------
const list = ref<IEquipmentList[]>([]) // 左侧设备表格数据
const checkoutList = ref([]) as any // 选中
// 表头
const columns = ref<TableColumn[]>([
{ text: '统一编号', value: 'deviceNo', align: 'center', width: '160' },
{ text: '设备名称', value: 'deviceName', align: 'center' },
{ text: '标志类型', value: 'identifyTypeName', align: 'center' },
])
// 选中
const handleSelectionChange = (e: any) => {
if (!e[0].identifyTypeName) {
ElMessage.warning('无标志类型, 不可打印')
return false
}
checkoutList.value = e
}
// 点击清空列表
const clearList = () => {
list.value = []
}
// ==================================受检设备=============================
const selectEquipmentEqptRef = ref() // 选择设备组件ref
// 点击添加受检设备
const addEquipmentEqpt = () => {
selectEquipmentEqptRef.value.initDialog(true)
}
// 选好设备
const confirmSelectEquipmentEqpt = (val: any) => {
if (val.length) {
val.forEach((item: any) => {
const index = list.value.findIndex((e: { deviceNo: string }) => e.deviceNo === item.equipmentNo)
if (index === -1) {
list.value.push({
id: item.id,
deviceNo: item.equipmentNo, // 设备编号
deviceName: item.equipmentName, // 设备名称
identifyType: item.meterIdentify, // 标志类型
identifyTypeName: eqptMeterIdentifyMap.value[item.meterIdentify], // 标志类型
addType: 'eqpt', // 添加类型 eqpt受检设备
})
}
})
}
}
// ================================设备台账=======================================
const selectEquipmentDialogRef = ref() // 选择设备组件ref
const selectEquipmentType = ref('useStatus') // 选择设备类型useStatus-使用状态
// 点击添加设备台账
const addEquipment = (type: string) => {
selectEquipmentType.value = type
selectEquipmentDialogRef.value.initDialog()
}
// 选好设备
const confirmSelectEquipment = (val: any) => {
console.log(val)
if (val.length) {
val.forEach((item: any) => {
const index = list.value.findIndex((e: { deviceNo: string }) => e.deviceNo === item.equipmentNo)
if (index === -1) {
list.value.push({
id: item.id,
deviceNo: item.equipmentNo, // 设备编号
deviceName: item.equipmentName, // 设备名称
identifyType: selectEquipmentType.value === 'useStatus' ? item.usageStatus : item.meterIdentify, // 标志类型
identifyTypeName: selectEquipmentType.value === 'useStatus' ? item.usageStatusName : item.meterIdentifyName, // 标志类型名称
addType: selectEquipmentType.value, // 添加类型 eqpt受检设备
})
}
})
}
}
// ===============================设备校准状态======================================
// 点击通过设备校准状态添加
const addMeasureStatus = () => {
ElMessage.info('数据来源质量模块,敬请期待')
}
// -----------------------------------------按钮--------------------------------------------------
// 关闭新增页面的回调
const close = () => {
$router.back()
}
const threeInfoRef = ref()
function printhtml() {
// threeInfoRef.value.print()
// printHtml('html')
// 打印
}
const printObj = ref({
id: 'html', // 需要打印元素的id
popTitle: '', // 打印配置页上方的标题
extraHead: '', // 最上方的头部文字,附加在head标签上的额外标签,使用逗号分割
preview: false, // 是否启动预览模式,默认是false
previewBeforeOpenCallback() { console.log('正在加载预览窗口!') }, // 预览窗口打开之前的callback
previewOpenCallback() { console.log('已经加载完预览窗口,预览打开了!') }, // 预览窗口打开时的callback
beforeOpenCallback() { console.log('开始打印之前!') }, // 开始打印之前的callback
openCallback() { console.log('执行打印了!') }, // 调用打印时的callback
closeCallback() { console.log('关闭了打印工具!') }, // 关闭打印的callback(无法区分确认or取消)
clickMounted() { console.log('点击v-print绑定的按钮了!') },
standard: '',
extarCss: '',
})
// -----------------------------------------钩子--------------------------------------------------
const printMenu = {
测试: {
title: '测试',
backgroundColor: '#970000',
dateTitle: '测试日期',
personTitle: '测试人',
},
封存: {
title: '编号',
backgroundColor: '#7000ff',
dateTitle: '封存日期',
personTitle: '批准人',
},
合格: {
title: '编号',
backgroundColor: '#009000',
dateTitle: '有效期至',
personTitle: '检定员',
},
禁用: {
title: '编号',
backgroundColor: '#ff2a00',
dateTitle: '禁用日期',
personTitle: '批准人',
},
停用: {
title: '编号',
backgroundColor: '#ff7e00',
dateTitle: '停用日期',
personTitle: '检定员',
},
限用: {
title: '编号',
backgroundColor: '#00a8ff',
dateTitle: '有效期至',
personTitle: '检定员',
},
校准: {
title: '编号',
backgroundColor: '#002aff',
dateTitle: '校准日期',
personTitle: '校准人',
},
在用: {
title: '编号',
backgroundColor: '#41b883',
dateTitle: '有效期至',
personTitle: '使用人',
},
} as any
onMounted(() => {
})
</script>
<template>
<app-container>
<detail-page v-loading="loading" :title="`标识打印-${textMap[pageType]}`">
<template #btns>
<el-button v-print="printObj" type="primary">
打印
</el-button>
<el-button type="info" @click="close">
关闭
</el-button>
</template>
</detail-page>
<el-row :gutter="20">
<el-col :span="12">
<detail-block title="" style="padding-bottom: 20px;">
<div style="margin-bottom: 10px;">
<el-button type="primary" icon="Plus" @click="addEquipmentEqpt">
受检设备
</el-button>
<el-button type="primary" icon="Plus" @click="addEquipment('useStatus')">
设备使用状态
</el-button>
<el-button type="primary" icon="Plus" @click="addEquipment('identify')">
设备计量标识
</el-button>
<!-- <el-button type="primary" icon="Plus" @click="addMeasureStatus">
设备校准状态
</el-button> -->
<el-button type="info" @click="clearList">
清空列表
</el-button>
</div>
<!-- <el-table
:data="list"
border
style="width: 100%;"
@selection-change="handleSelectionChange"
>
<el-table-column v-if="pageType !== 'detail'" type="selection" width="38" />
<el-table-column align="center" label="序号" width="80" type="index" />
<el-table-column
v-for="item in columns"
:key="item.value"
:prop="item.value"
:label="item.text"
align="center"
/>
</el-table> -->
<normal-table
:data="list"
:columns="columns"
:is-showmulti-select="false"
:is-multi="false"
:max-height="660"
:pagination="false"
@multi-select="handleSelectionChange"
>
<!-- 序号 -->
<template #preColumns>
<el-table-column label="#" width="55" align="center" fixed>
<template #default="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
</template>
</normal-table>
</detail-block>
</el-col>
<el-col :span="12">
<detail-block title="" style="padding-bottom: 20px;display: flex;justify-content: center;">
<div v-if="checkoutList.length">
<three-info
v-for="(item, index) in checkoutList"
:key="index"
ref="threeInfoRef"
:device-no="item.deviceNo"
:title="item.identifyTypeName"
:date-title="printMenu[item.identifyTypeName].dateTitle"
:person-title="printMenu[item.identifyTypeName].personTitle"
:background-color="printMenu[item.identifyTypeName].backgroundColor"
/>
<!-- <three-info ref="threeInfoRef" style="margin-top: 10px;" /> -->
</div>
<div id="html" style="display: flex;flex-direction: column;position: absolute;top: 0;right: 0;z-index: -999999;">
<print-three-info
v-for="(item, index) in checkoutList"
:key="index"
ref="threeInfoRef"
:device-no="item.deviceNo"
:title="item.identifyTypeName"
:date-title="printMenu[item.identifyTypeName].dateTitle"
:person-title="printMenu[item.identifyTypeName].personTitle"
:background-color="printMenu[item.identifyTypeName].backgroundColor"
year="2024"
month="12"
day="28"
person-name="测试人员姓名"
/>
</div>
</detail-block>
</el-col>
</el-row>
</app-container>
<!-- 选择受检设备组件 -->
<select-equipment-eqpt-dialog ref="selectEquipmentEqptRef" @confirm="confirmSelectEquipmentEqpt" />
<!-- 选择设备台账 -->
<select-equipment-dialog ref="selectEquipmentDialogRef" :is-multi="true" @confirm="confirmSelectEquipment" />
</template>
<style lang="scss" scoped>
// 样式
</style>