| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844 |
- <template>
- <ContentWrap title="设备清单">
- <!-- 锅炉设备展示 -->
- <template v-if="equipMainType === 200">
- <el-table
- ref="orderItemsTableRef"
- :data="taskOrderDetail.orderItems"
- border
- stripe
- empty-text="暂无设备信息"
- @selection-change="handleEquipSelectionChange"
- >
- <el-table-column type="selection" width="60" fixed="left" />
- <el-table-column label="操作" fixed="left" align="center" width="100">
- <template #default="scope">
- <div class="operation-buttons">
- <el-button
- v-if="scope.row.taskStatus === PressureCheckerMyTaskStatus.REPORT_END"
- link
- type="primary"
- size="small"
- :disabled="isTaskCancelled"
- @click="handlePreviewReport(scope.row)"
- >查看报告</el-button>
- </div>
- </template>
- </el-table-column>
- <el-table-column label="区域" align="center" min-width="120">
- <template #default="scope">
- <div>{{ scope.row.equipDistrictName || '-' }}</div>
- <div class="text-gray-400 text-sm">{{ scope.row.equipStreetName || '' }}</div>
- </template>
- </el-table-column>
- <el-table-column label="设备注册代码" align="center" min-width="190">
- <template #default="scope">
- <el-button link type="success" @click="handleEquipCodeFn(scope.row.equipId)">
- {{ scope.row.equipCode || '-' }}
- </el-button>
- <div class="mt-2px mb-2px">
- <el-tag v-if="scope.row.productNo" type="success">
- {{ scope.row.productNo }}
- </el-tag>
- </div>
- <el-tag v-if="scope.row.editType === 'reject'" type="danger" size="small" class="ml-1"
- >拒绝约检</el-tag>
- <el-tag v-if="scope.row.editType === 'add'" type="success" size="small" class="ml-1"
- >新增设备</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="是否租借" align="center" prop="isRent" min-width="80">
- <template #default="scope">
- {{ scope.row.isRent ? '是' : '否' }}
- </template>
- </el-table-column>
- <el-table-column label="使用证编号" align="center" prop="useRegisterNo" min-width="120" />
- <el-table-column label="出厂编号" align="center" prop="factoryNo" min-width="120" />
- <el-table-column label="约检联系人" align="center" prop="contact" min-width="120" />
- <el-table-column label="约检联系人电话" align="center" prop="contactPhone" min-width="140" />
- <el-table-column label="蒸发量" align="center" prop="maxContinueEvapor" min-width="80" />
- <el-table-column label="型号" align="center" prop="boilerModel" min-width="120" />
- <el-table-column prop="taskStatus" label="主报告状态" width="100" align="center">
- <template #default="scope">
- <el-tag :type="getTypeColor(scope.row.taskStatus)">
- {{ PressureTaskOrderTaskStatusMap[scope.row.taskStatus] || '-' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="检验结论" align="center" prop="mainConclusion" min-width="120px">
- <template #default="scope">
- <div v-if="scope.row.mainConclusion">
- <el-tag
- v-if="['符合要求', '基本符合要求'].includes(scope.row.mainConclusion)"
- type="success"
- >{{ scope.row.mainConclusion }}</el-tag>
- <el-tag v-else type="danger">{{ scope.row.mainConclusion }}</el-tag>
- </div>
- <div v-else>-</div>
- </template>
- </el-table-column>
- </el-table>
- </template>
- <!-- 管道设备展示 -->
- <template v-else-if="equipMainType === 300">
- <el-table
- ref="orderItemsTableRef"
- :data="taskOrderDetail.orderItems"
- border
- stripe
- empty-text="暂无设备信息"
- row-key="id"
- @selection-change="handleEquipSelectionChange"
- >
- <el-table-column type="selection" width="60" fixed="left" />
- <el-table-column label="操作" fixed="left" align="center" width="100">
- <template #default="scope">
- <div class="operation-buttons">
- <el-button
- v-if="scope.row.taskStatus === PressureCheckerMyTaskStatus.REPORT_END"
- link
- type="primary"
- size="small"
- :disabled="isTaskCancelled"
- @click="handlePreviewReport(scope.row)"
- >查看报告</el-button>
- </div>
- </template>
- </el-table-column>
- <el-table-column type="expand" width="1">
- <template #default="scope">
- <div class="ml-15px mr-15px">
- <el-table :data="scope.row.detailDOS || []" border>
- <el-table-column label="注册代码" prop="pipeRegCode" min-width="120" show-overflow-tooltip />
- <el-table-column label="管道名称" prop="pipeName" min-width="120" show-overflow-tooltip />
- <el-table-column label="管道编号" prop="pipeNo" min-width="120" show-overflow-tooltip />
- <el-table-column label="管道级别" prop="pipeLevel" min-width="120" show-overflow-tooltip />
- <el-table-column label="管道品种" prop="pipeType" min-width="120" show-overflow-tooltip />
- <el-table-column label="长度" prop="pipeLength" min-width="100" show-overflow-tooltip />
- <el-table-column label="管道材质" prop="pipeMaterial" min-width="120" show-overflow-tooltip />
- <el-table-column label="材料标准" prop="materialStandard" min-width="120" show-overflow-tooltip />
- </el-table>
- </div>
- </template>
- </el-table-column>
- <el-table-column label="工程号" align="center" prop="projectNo" min-width="120" />
- <el-table-column label="使用证编号" align="center" prop="useNo" min-width="120" show-overflow-tooltip />
- <el-table-column label="工程名称" align="center" prop="projectName" min-width="120" show-overflow-tooltip />
- <el-table-column label="区域/街道" align="center" min-width="120" show-overflow-tooltip>
- <template #default="scope">
- <span class="text-xs">{{ scope.row.equipStreetName ?? scope.row.equipDistrictName }}</span>
- </template>
- </el-table-column>
- <el-table-column label="约检联系人" align="center" prop="contact" min-width="120" show-overflow-tooltip />
- <el-table-column label="约检联系人电话" align="center" prop="contactPhone" min-width="140" />
- <el-table-column prop="taskStatus" label="主报告状态" width="100" align="center">
- <template #default="scope">
- <el-tag :type="getTypeColor(scope.row.taskStatus)">
- {{ PressureTaskOrderTaskStatusMap[scope.row.taskStatus] || '-' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="检验结论" align="center" prop="mainConclusion" min-width="120px">
- <template #default="scope">
- <div v-if="scope.row.mainConclusion">
- <el-tag
- v-if="['符合要求', '基本符合要求'].includes(scope.row.mainConclusion)"
- type="success"
- >{{ scope.row.mainConclusion }}</el-tag>
- <el-tag v-else type="danger">{{ scope.row.mainConclusion }}</el-tag>
- </div>
- <div v-else>-</div>
- </template>
- </el-table-column>
- </el-table>
- </template>
- <!-- 默认展示 -->
- <template v-else>
- <el-table
- ref="orderItemsTableRef"
- :data="taskOrderDetail.orderItems"
- border
- stripe
- empty-text="暂无设备信息"
- @selection-change="handleEquipSelectionChange"
- >
- <el-table-column type="selection" width="60" fixed="left" />
- <el-table-column label="操作" fixed="left" align="center" width="100">
- <template #default="scope">
- <div class="operation-buttons">
- <el-button
- v-if="scope.row.taskStatus === PressureCheckerMyTaskStatus.REPORT_END"
- link
- type="primary"
- size="small"
- :disabled="isTaskCancelled"
- @click="handlePreviewReport(scope.row)"
- >查看报告</el-button>
- </div>
- </template>
- </el-table-column>
- <el-table-column prop="equipName" label="设备名称" width="100" align="center" />
- <el-table-column prop="fee" label="收费金额" width="100" align="center" />
- <el-table-column prop="equipCode" label="设备注册代码" width="195" align="center">
- <template #default="scope">
- <el-button link type="success" @click="handleEquipCodeFn(scope.row.equipId)">{{
- scope.row.equipCode
- }}</el-button>
- <div class="mt-2px mb-2px">
- <el-tag v-if="scope.row.productNo" type="success">
- {{ scope.row.productNo }}
- </el-tag>
- </div>
- <el-tag v-if="scope.row.editType === 'reject'" type="danger" size="small" class="ml-1"
- >拒绝约检</el-tag>
- <el-tag v-if="scope.row.editType === 'add'" type="success" size="small" class="ml-1"
- >新增设备</el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="reportRespVOList" label="记录编号" width="100" align="center">
- <template #default="{ row }">
- {{ Array.isArray(row.reportRespVOList) ? row.reportRespVOList[0]?.reportNo || '-' : '-' }}
- </template>
- </el-table-column>
- <el-table-column prop="checkType" label="检验性质" width="100" align="center">
- <template #default>
- {{ PressureCheckTypeMap[taskOrderDetail.checkType] || '-' }}
- </template>
- </el-table-column>
- <el-table-column
- prop="reportRespVOList"
- label="检验项目"
- min-width="550"
- header-align="center"
- >
- <template #default="{ row }">
- <span v-for="item in getRowReportVOList(row)" :key="item?.templateId">
- <el-button
- :disabled="
- taskOrder?.taskStatus === PressureTaskOrderTaskStatus['REPORT_END'] ||
- canAddReportItem(row.taskStatus) ||
- taskOrder?.taskStatus === PressureTaskOrderTaskStatus['AUDITING_CANCEL']
- "
- link
- type="primary"
- class="!whitespace-normal !m-[0px]"
- >{{ item?.reportName }}</el-button>
- <el-button
- :disabled="
- taskOrder?.taskStatus === PressureTaskOrderTaskStatus['REPORT_END'] ||
- taskOrder?.taskStatus === PressureTaskOrderTaskStatus['AUDITING_CANCEL']
- "
- link
- type="primary"
- class="!m-[0px]"
- >({{ getCheckItemFeeType(item) }})</el-button>
- </span>
- </template>
- </el-table-column>
- <el-table-column prop="reportRespVOList" label="操作指导书名称" width="180" align="center">
- <template #default="{ row }">
- <template
- v-if="
- filterReportType(row.reportRespVOList, PressureReportType['WORKINSTRUCTION']).length
- "
- >
- <template
- v-if="
- filterReportType(row.reportRespVOList, PressureReportType['WORKINSTRUCTION'])
- .length <= 2
- "
- >
- <el-button
- class="!whitespace-normal !m-[0px] w-full"
- link
- v-for="(item, index) in filterReportType(
- row.reportRespVOList,
- PressureReportType['WORKINSTRUCTION']
- )"
- :type="item?.taskStatus != 800 ? 'danger' : 'success'"
- :key="index"
- @click="handlePreviewDownload(item)"
- >{{ item?.reportName ? `${item?.reportName}` : '-' }}</el-button>
- </template>
- <!-- 弹窗 -->
- <el-popover v-else placement="top-start" :width="200" trigger="hover">
- <el-button
- class="!whitespace-normal !m-[0px] w-full"
- link
- v-for="(item, index) in filterReportType(
- row.reportRespVOList,
- PressureReportType['WORKINSTRUCTION']
- )"
- :type="item?.taskStatus != 800 ? 'danger' : 'success'"
- :key="index"
- @click="handlePreviewDownload(item)"
- >{{ item?.reportName ? `${item?.reportName}` : '-' }}</el-button>
- <template #reference>
- <div>
- <el-button
- class="!whitespace-normal !m-[0px] w-full"
- link
- v-for="(item, index) in filterReportType(
- row.reportRespVOList,
- PressureReportType['WORKINSTRUCTION']
- ).slice(0, 2)"
- :type="item?.taskStatus != 800 ? 'danger' : 'success'"
- :key="index"
- @click="handlePreviewDownload(item)"
- >{{ item?.reportName ? `${item?.reportName}` : '-' }}</el-button>
- </div>
- </template>
- </el-popover>
- </template>
- <span v-else>-</span>
- </template>
- </el-table-column>
- <el-table-column prop="reportRespVOList" label="检验方案" min-width="180" align="center">
- <template #default="{ row }">
- <template
- v-if="
- filterReportType(
- row.reportRespVOList,
- PressureReportType['INSPECTIONPLAN'],
- row.majorIssuesList
- ).length
- "
- >
- <template
- v-if="
- filterReportType(
- row.reportRespVOList,
- PressureReportType['INSPECTIONPLAN'],
- row.majorIssuesList
- ).length <= 2
- "
- >
- <el-button
- class="!whitespace-normal !m-[0px] w-full"
- link
- v-for="(item, index) in filterReportType(
- row.reportRespVOList,
- PressureReportType['INSPECTIONPLAN'],
- row.majorIssuesList
- )"
- :type="item?.taskStatus != 800 ? 'danger' : 'success'"
- :key="index"
- @click="handlePreviewDownload(item)"
- >{{
- item?.reportName ? `${item?.reportName}(${item.currentIndex})` : '-'
- }}</el-button>
- </template>
- <!-- 弹窗 -->
- <el-popover v-else placement="top-start" :width="200" trigger="hover">
- <el-button
- class="!whitespace-normal !m-[0px] w-full"
- link
- v-for="(item, index) in filterReportType(
- row.reportRespVOList,
- PressureReportType['INSPECTIONPLAN'],
- row.majorIssuesList
- )"
- :type="item?.taskStatus != 800 ? 'danger' : 'success'"
- :key="index"
- @click="handlePreviewDownload(item)"
- >{{
- item?.reportName ? `${item?.reportName}(${item.currentIndex})` : '-'
- }}</el-button>
- <template #reference>
- <div>
- <el-button
- class="!whitespace-normal !m-[0px] w-full"
- link
- v-for="(item, index) in filterReportType(
- row.reportRespVOList,
- PressureReportType['INSPECTIONPLAN'],
- row.majorIssuesList
- ).slice(0, 2)"
- :type="item?.taskStatus != 800 ? 'danger' : 'success'"
- :key="index"
- @click="handlePreviewDownload(item)"
- >{{
- item?.reportName ? `${item?.reportName}(${item.currentIndex})` : '-'
- }}</el-button>
- </div>
- </template>
- </el-popover>
- </template>
- <span v-else>-</span>
- </template>
- </el-table-column>
- <el-table-column prop="taskStatus" label="主报告状态" width="100" align="center">
- <template #default="scope">
- <el-tag :type="getTypeColor(scope.row.taskStatus)">
- {{ PressureTaskOrderTaskStatusMap[scope.row.taskStatus] || '-' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="检验结论" align="center" prop="mainConclusion" min-width="120px">
- <template #default="scope">
- <div v-if="scope.row.mainConclusion">
- <el-tag
- v-if="['符合要求', '基本符合要求'].includes(scope.row.mainConclusion)"
- type="success"
- >{{ scope.row.mainConclusion }}</el-tag>
- <el-tag v-else type="danger">{{ scope.row.mainConclusion }}</el-tag>
- </div>
- <div v-else>-</div>
- </template>
- </el-table-column>
- <el-table-column prop="equipDistrictName" align="center" label="区域" width="100">
- <template #default="scope">
- <div>{{ scope.row.equipDistrictName }}</div>
- <div class="text-gray-400 text-sm">{{ scope.row.equipStreetName }}</div>
- </template>
- </el-table-column>
- <el-table-column prop="useRegisterNo" label="使用证编号" width="135" align="center" />
- <el-table-column prop="equipVolume" label="容积" width="60" align="center" />
- <el-table-column label="下次年度检查" width="110" align="center">
- <template #default="scope">
- {{ !scope.row.nextYearCheckDate ? '-' : formatArrayDate(scope.row.nextYearCheckDate) }}
- </template>
- </el-table-column>
- <el-table-column label="下次定期检验" width="110" align="center">
- <template #default="scope">
- {{ formatArrayDate(scope.row.nextCheckDate) }}
- </template>
- </el-table-column>
- <el-table-column label="超年限检验" width="110" align="center">
- <template #default="scope">
- {{
- scope.row.nextExpiredCheckDate ? formatArrayDate(scope.row.nextExpiredCheckDate) : '-'
- }}
- </template>
- </el-table-column>
- <el-table-column label="超年限时间" width="110" align="center">
- <template #default="scope">
- {{ scope.row.overdueDate ? formatArrayDate(scope.row.overdueDate) : '-' }}
- </template>
- </el-table-column>
- <el-table-column
- label="约检联系人"
- prop="contact"
- width="110"
- align="center"
- show-overflow-tooltip
- />
- <el-table-column label="约检联系人电话" prop="contactPhone" width="135" align="center" />
- <el-table-column label="主检人" width="110" align="center">
- <template #default="scope">
- <div>{{ scope.row.mainCheckerUser?.nickname || '-' }}</div>
- <div class="text-gray-400 text-sm">{{ scope.row.mainCheckerUser?.employeeNo || '' }}</div>
- </template>
- </el-table-column>
- </el-table>
- </template>
- </ContentWrap>
- <!-- 打印记录 -->
- <Dialog
- v-model="nprintRecordDialogVisible"
- :dialogAttrs="{
- zIndex: 10006
- }"
- :title="'打印项目'"
- >
- <SmartTable
- ref="nprintRecordTableRef"
- v-model:columns="nprintRecordColumns"
- :isPagination="false"
- :maxHeight="600"
- :data="nprintRecordTableList"
- :buttons="[]"
- :showSettingTools="false"
- :showSearch="false"
- :showRefresh="false"
- :tableProps="{
- onRowClick: handleRowClick
- }"
- />
- <template #footer>
- <el-button :loading="nprintRecordLoading" type="primary" @click="handlePrintFn"
- >打 印</el-button>
- <el-button :loading="nprintRecordLoading" type="primary" @click="handlePrintFnDownload"
- >下 载</el-button>
- <el-button :loading="nprintRecordLoading" @click="nprintRecordDialogVisible = false"
- >取 消</el-button>
- </template>
- </Dialog>
- </template>
- <script setup lang="tsx">
- import {
- PressureCheckTypeMap,
- PressureTaskOrderTaskStatus,
- PressureTaskOrderTaskStatusMap,
- PressureCheckerMyTaskStatusMap,
- PressureCheckerMyTaskStatus,
- PressureReportType
- } from '@/utils/constants'
- import SmartTable from '@/components/SmartTable/SmartTable'
- import { SmartTableColumn } from '@/types/table'
- import { is } from '@/utils/is'
- import { formatArrayDate } from '@/utils/formatTime'
- import { TableInstance } from 'element-plus'
- import { TaskOrderApi } from '@/api/pressure/taskorder'
- import { BoilerTaskOrderApi } from '@/api/pressure2/boilertaskorder'
- import { PipeTaskOrderApi } from '@/api/pressure2/pipetaskorder'
- import { buildFileUrl } from '@/utils'
- import { getJCP } from '@/utils/jcp/jcp-vue'
- const props = defineProps({
- taskOrder: {
- type: Object as () => Record<string, any>,
- required: true
- },
- taskOrderDetail: {
- type: Object as () => Record<string, any>,
- required: true
- },
- supportingDocsAuditDataList: {
- type: Array as () => Record<string, any>[],
- required: true
- }
- })
- // 设备类型 200-锅炉 300-管道
- const equipMainType = computed(() => {
- return props.taskOrderDetail?.equipMainType || null
- })
- // 根据 equipMainType 获取对应的 API
- const getCurrentApi = () => {
- if (equipMainType.value === 200) {
- return BoilerTaskOrderApi
- } else if (equipMainType.value === 300) {
- return PipeTaskOrderApi
- }
- return TaskOrderApi // 默认
- }
- const InformationModificationVisible = ref(false) // 弹窗的是否展示
- const formLoading = ref(false)
- const formData = ref({
- safeManager: '', //安全管理员姓名
- safeManagerPhone: '', //安全管理员电话
- safeManagerIdNumber: '', //安全管理员证号
- operatorIdNumber: '' //操作人证号
- })
- const formRules = reactive({})
- const formRef = ref() // 表单 Ref
- const nprintRecordLoading = ref(false)
- const nprintRecordTableRef = ref()
- const nprintRecordDialogVisible = ref(false)
- const nprintRecordTableList = ref<any[]>([])
- const nprintRecordColumns = ref<SmartTableColumn[]>([
- {
- type: 'selection',
- width: '50px'
- },
- {
- label: '检验项目',
- prop: 'reportName'
- },
- {
- label: '状态',
- prop: 'taskStatus',
- render: (row) => {
- return row.taskStatus ? (
- <div>
- <el-tag key={row.id} type={getTypeColor2(row.taskStatus)}>
- {PressureCheckerMyTaskStatusMap[row.taskStatus]}
- </el-tag>
- </div>
- ) : (
- '-'
- )
- }
- }
- ])
- const emit = defineEmits([
- 'refresh-detail',
- 'handle-add-checker-items',
- 'handle-mainquestion-add-report',
- 'handle-add-inspectionplan-report',
- 'handle-batch-edit-fn',
- 'handle-abort-task',
- 'handle-equip-selection-change',
- 'handle-equip-code-fn',
- 'handle-input-calc-field',
- 'handle-preview-download',
- 'handle-add-report',
- 'handle-view-mainquestion-report',
- 'handle-set-main-checker',
- 'handle-preview-report',
- 'handle-add-finite-space-report'
- ])
- const rowData = ref<any>({})
- const selectedEquips = ref<Array<Record<string, any>>>([])
- const handlePrintFnDownload = async () => {
- const selectRows = nprintRecordTableRef.value.getTableRef().getSelectionRows()
- if (selectRows.length == 0) {
- return ElMessage.error('请选择打印项目')
- } else {
- const params = selectRows.map((item) => item.id)
- const currentApi = getCurrentApi()
- const result = await currentApi.downloadReport({ ids: params })
- const downloadUrl = window.URL.createObjectURL(result)
- const a = document.createElement('a')
- a.href = downloadUrl
- const fileName = `${rowData.value.equipCode}` + '项目'
- a.download = fileName
- document.body.appendChild(a)
- a.click()
- // 下载文件
- window.URL.revokeObjectURL(downloadUrl)
- document.body.removeChild(a)
- }
- }
- const handleRowClick = (row) => {
- nprintRecordTableRef.value?.getTableRef()?.toggleRowSelection(row)
- }
- const handlePrintFn = async () => {
- const selectRows = nprintRecordTableRef.value.getTableRef().getSelectionRows()
- if (selectRows.length == 0) {
- return ElMessage.error('请选择打印项目')
- }
- const ids = selectRows.map((item) => item.id)
- const queryString = ids.map((id) => `ids=${id}`).join('&')
- nprintRecordLoading.value = true
- try {
- const currentApi = getCurrentApi()
- const result = await currentApi.getBatchUploadPdfApi(queryString)
- if (!result || result.length === 0) {
- nprintRecordLoading.value = false
- return ElMessage.error('未获取到打印文件')
- }
- const jcp = getJCP()
- // 检测JCP是否可用
- if (!jcp) {
- nprintRecordLoading.value = false
- return ElMessage.error('打印组件未初始化,请安装打印插件')
- }
- let completedCount = 0
- let failedCount = 0
- // 循环打印每个PDF
- for (let i = 0; i < result.length; i++) {
- const url = buildFileUrl(result[i])
- const encodedUrl = url
- .split('/')
- .map((part) => {
- return /[\u4e00-\u9fa5]/.test(part) ? encodeURIComponent(part) : part
- })
- .join('/')
- // 为每个打印任务添加超时处理
- await new Promise((resolve) => {
- let isResolved = false
- // 设置10秒超时
- const timeout = setTimeout(() => {
- if (!isResolved) {
- isResolved = true
- failedCount++
- console.error(`第 ${i + 1} 个文件打印超时(可能用户取消了打印)`)
- resolve(false)
- }
- }, 5000) // 5秒超时,可根据实际情况调整
- jcp.printPDF(encodedUrl, {
- settings: {
- paperName: 'A4',
- orientation: 'portrait',
- marginTop: 0,
- marginBottom: 0,
- marginLeft: 0,
- marginRight: 0,
- shrink: false
- },
- printer: '',
- preview: false,
- fileType: 'pdf',
- done: function () {
- if (!isResolved) {
- isResolved = true
- clearTimeout(timeout)
- completedCount++
- console.log(`第 ${i + 1} 个文件打印完成`)
- resolve(true)
- }
- },
- fail: function (error) {
- if (!isResolved) {
- isResolved = true
- clearTimeout(timeout)
- failedCount++
- console.error(`第 ${i + 1} 个文件打印失败:`, error)
- resolve(false)
- }
- }
- })
- })
- }
- // 显示最终结果
- if (failedCount === 0) {
- ElMessage.success(`全部打印完成,共 ${completedCount} 个文件`)
- } else if (completedCount === 0) {
- ElMessage.error(`打印失败,共 ${failedCount} 个文件未能打印`)
- } else {
- ElMessage.warning(`打印完成 ${completedCount} 个,失败 ${failedCount} 个`)
- }
- } catch (error) {
- console.error('打印过程出错:', error)
- ElMessage.error('打印过程出错: ' + (error.message || '未知错误'))
- } finally {
- // 确保无论如何都会关闭loading
- nprintRecordLoading.value = false
- }
- }
- // 作废报告项
- const submitForm = async () => {
- if (!formRef) return
- const valid = await formRef.value.validate()
- if (!valid) return
- // 提交请求
- formLoading.value = true
- try {
- const selectRows = getSelectionRows()
- const data = {
- ...formData.value,
- ids: selectRows.map((item) => item.equipId)
- }
- const logId = await TaskOrderApi.updateEquipJobInfoApi(data)
- if (logId) {
- ElMessage.success('修改成功')
- }
- InformationModificationVisible.value = false
- } finally {
- formLoading.value = false
- }
- }
- const orderItemsTableRef = ref<TableInstance>()
- const handleEquipSelectionChange = (selection) => {
- // 实现设备选择逻辑
- selectedEquips.value = selection
- emit('handle-equip-selection-change', selection)
- }
- const isTaskCancelled = computed(() => {
- return props.taskOrderDetail?.taskStatus === PressureTaskOrderTaskStatus.CANCELLED
- })
- const handlePreviewReport = (row: any) => {
- emit('handle-preview-report', row)
- }
- const handleEquipCodeFn = (id?: string) => {
- emit('handle-equip-code-fn', id)
- }
- const getRowReportVOList = (row) => {
- return (row.reportRespVOList || []).filter(
- (item) =>
- ![PressureReportType['WORKINSTRUCTION'], PressureReportType['INSPECTIONPLAN']].includes(
- item.reportType
- )
- )
- }
- const canAddReportItem = (taskStatus) => {
- const { REPORT_AUDIT, REPORT_APPROVE, REPORT_END } = PressureCheckerMyTaskStatus
- return [REPORT_AUDIT, REPORT_APPROVE, REPORT_END].includes(taskStatus)
- }
- const getCheckItemFeeType = computed(() => {
- return ({ isAutoAmount, fee }) => {
- if (is(fee, 'Number')) return fee
- else if (is(fee, 'Null') && isAutoAmount === '1') return '录入计算'
- else return '0'
- }
- })
- const filterReportType = (list: any[], reportType: number, majorIssuesList?: any[]) => {
- const reportList = list.filter((item) => item.reportType === reportType)
- const majorIssuesListValue = majorIssuesList?.map((item) => item) || []
- const newList = [...reportList, ...majorIssuesListValue]
- const sortedList = newList.sort((a, b) => {
- const timeA = a.createTime || 0
- const timeB = b.createTime || 0
- return timeB - timeA // 倒序排列
- })
- const total = sortedList.length
- return sortedList.map((item, index) => {
- return {
- ...item,
- currentIndex: total - index // 倒序编号:第一个显示的是最大数字
- }
- })
- }
- const handlePreviewDownload = (row) => {
- emit('handle-preview-download', row)
- }
- const getTypeColor = (status: string | number) => {
- const statusMap = {
- [PressureTaskOrderTaskStatus.WAIT_CONFIRM]: 'primary',
- [PressureTaskOrderTaskStatus.CANCELLED]: 'info',
- [PressureTaskOrderTaskStatus.AUDITING_EDIT]: 'warning',
- [PressureTaskOrderTaskStatus.AUDITING_CANCEL]: 'warning',
- [PressureTaskOrderTaskStatus.AUDITING_TIME]: 'warning',
- [PressureTaskOrderTaskStatus.CONFIRMED]: 'success',
- [PressureTaskOrderTaskStatus.RECORD_INPUT]: 'warning',
- [PressureTaskOrderTaskStatus.RECORD_CHECK]: 'warning',
- [PressureTaskOrderTaskStatus.REPORT_INPUT]: 'warning',
- [PressureTaskOrderTaskStatus.REPORT_AUDIT]: 'warning',
- [PressureTaskOrderTaskStatus.REPORT_APPROVE]: 'warning',
- [PressureTaskOrderTaskStatus.REPORT_END]: 'primary'
- }
- return statusMap[status] || 'info'
- }
- const getTypeColor2 = (status: string | number) => {
- const statusMap = {
- [PressureTaskOrderTaskStatus.WAIT_CONFIRM]: 'primary',
- [PressureTaskOrderTaskStatus.CANCELLED]: 'info',
- [PressureTaskOrderTaskStatus.AUDITING_EDIT]: 'warning',
- [PressureTaskOrderTaskStatus.AUDITING_CANCEL]: 'warning',
- [PressureTaskOrderTaskStatus.AUDITING_TIME]: 'warning',
- [PressureTaskOrderTaskStatus.CONFIRMED]: 'success',
- [PressureTaskOrderTaskStatus.RECORD_INPUT]: 'warning',
- [PressureTaskOrderTaskStatus.RECORD_CHECK]: 'warning',
- [PressureTaskOrderTaskStatus.REPORT_INPUT]: 'warning',
- [PressureTaskOrderTaskStatus.REPORT_AUDIT]: 'warning',
- [PressureTaskOrderTaskStatus.REPORT_APPROVE]: 'warning',
- [PressureTaskOrderTaskStatus.REPORT_END]: 'success'
- }
- return statusMap[status] || 'info'
- }
- const getSelectionRows = () => {
- return orderItemsTableRef.value?.getSelectionRows() || []
- }
- defineExpose({
- getSelectionRows
- })
- </script>
|