检查工单

This commit is contained in:
Teo
2025-04-17 18:07:26 +08:00
parent 6a60ecc5e9
commit 85ee9fba77
11 changed files with 161 additions and 91 deletions

View File

@ -1,4 +1,6 @@
export interface QualityInspectionVO {
verificationType: string;
measure: string;
/**
* 巡检类型
*/

View File

@ -28,6 +28,6 @@ export function delOss(ossId: string | number | Array<string | number>) {
}
// 下载OSS对象存储
export function downLoadOss(ossId: string | number | Array<string | number>) {
return download('/safety/questionUserAnswer/exportFile', { idList: ossId }, '安全考试.zip');
export function downLoadOss(ossId: { id?: string | number; idList?: string | number | Array<string | number> }, url: string, fileName: string) {
return download(url, ossId, fileName);
}

View File

@ -19,36 +19,39 @@
:data="data"
>
<slot>
<!-- 上传按钮 -->
<el-button v-if="!isConstruction && !isImportInfo" type="primary">选取文件</el-button>
<el-button v-if="isImportInfo" type="warning" plain icon="Edit">导入员工资料 </el-button>
<!-- 上传提示 -->
<div v-if="showTip" class="el-upload__tip">
请上传
<template v-if="fileSize">
大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
</template>
<template v-if="fileType">
格式为 <b style="color: #f56c6c">{{ fileType.join('/') }}</b>
</template>
的文件
<div>
<!-- 上传按钮 -->
<el-button v-if="!isConstruction && !isImportInfo" type="primary">选取文件</el-button>
<el-button v-if="isImportInfo" type="warning" plain icon="Edit">导入员工资料 </el-button>
<!-- 上传提示 -->
<div v-if="showTip" class="el-upload__tip" @click.stop>
请上传
<template v-if="fileSize">
大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
</template>
<template v-if="fileType">
格式为 <b style="color: #f56c6c">{{ fileType.join('/') }}</b>
</template>
的文件
</div>
<!-- 文件列表 -->
<transition-group
v-if="!isConstruction && !isImportInfo"
class="upload-file-list el-upload-list el-upload-list--text"
name="el-fade-in-linear"
tag="ul"
@click.stop
>
<li v-for="(file, index) in fileList" :key="file.uid" class="el-upload-list__item ele-upload-list__item-content">
<el-link :href="`${file.url}`" :underline="false" target="_blank">
<span class="el-icon-document"> {{ getFileName(file.name) }} </span>
</el-link>
<div class="ele-upload-list__item-content-action">
<el-button type="danger" link @click="handleDelete(index)">删除</el-button>
</div>
</li>
</transition-group>
</div>
<!-- 文件列表 -->
<transition-group
v-if="!isConstruction && !isImportInfo"
class="upload-file-list el-upload-list el-upload-list--text"
name="el-fade-in-linear"
tag="ul"
>
<li v-for="(file, index) in fileList" :key="file.uid" class="el-upload-list__item ele-upload-list__item-content">
<el-link :href="`${file.url}`" :underline="false" target="_blank">
<span class="el-icon-document"> {{ getFileName(file.name) }} </span>
</el-link>
<div class="ele-upload-list__item-content-action">
<el-button type="danger" link @click="handleDelete(index)">删除</el-button>
</div>
</li>
</transition-group>
</slot>
<el-icon v-if="isConstruction"><Plus /></el-icon>
@ -214,6 +217,8 @@ const handleUploadSuccess = (res: any, file: UploadFile) => {
// 删除文件
const handleDelete = async (index: string | number, type?: string) => {
console.log('🚀 ~ handleDelete ~ index:', index);
await proxy?.$modal.confirm('是否确认删除此文件?').finally();
if (type === 'ossId') {
delOss(index);

View File

@ -113,7 +113,7 @@
<!-- </el-card> -->
<div class="dialog-footer">
<div class="btn-item">
<div class="btn-item" @click="handleExport">
<img src="../../../../assets/icons/svg/derived.png" />
<span>导出</span>
</div>
@ -130,7 +130,7 @@ import { QualityConstructionLogVO, QualityConstructionLogQuery, QualityConstruct
import { dayjs } from 'element-plus';
import { useUserStoreHook } from '@/store/modules/user';
import { s } from 'node_modules/vite/dist/node/types.d-aGj9QkWt';
import { listByIds } from '@/api/system/oss';
import { downLoadOss, listByIds } from '@/api/system/oss';
const safetyInspectionDetail = ref<QualityConstructionLogVO>();
const checkFileList = ref<any[]>();
// 获取用户 store
@ -159,6 +159,9 @@ const get = async () => {
// }
}
};
const handleExport = async () => {
await downLoadOss({ id: safetyInspectionDetail.value.id }, '/quality/qualityConstructionLog/export/word', '施工日志.zip');
};
onMounted(() => {
get();

View File

@ -47,8 +47,30 @@
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center" type="index" width="70" />
<el-table-column label="生产情况" align="center" prop="productionStatus" />
<el-table-column label="技术质量安全工作" align="center" prop="technologyQuality" />
<el-table-column label="生产情况" align="center" prop="productionStatus" width="410">
<template #default="scope">
<el-tooltip placement="top" effect="dark">
<template #content>
<div class="w-670px">{{ scope.row.productionStatus }}</div>
</template>
<el-text truncated>
{{ scope.row.productionStatus }}
</el-text>
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="技术质量安全工作" align="center" prop="technologyQuality" width="410">
<template #default="scope">
<el-tooltip placement="top" effect="dark">
<template #content>
<div class="w-670px">{{ scope.row.technologyQuality }}</div>
</template>
<el-text truncated>
{{ scope.row.technologyQuality }}
</el-text>
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="发生日期" align="center" prop="happenDate" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.happenDate, '{y}-{m}-{d}') }}</span>
@ -58,18 +80,10 @@
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="详情" placement="top">
<el-button link type="primary" icon="View" @click="handleUpdate(scope.row)"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button
link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['quality:qualityConstructionLog:remove']"
></el-button>
</el-tooltip>
<el-button link type="primary" icon="View" @click="handleUpdate(scope.row)">详情</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['quality:qualityConstructionLog:remove']">
删除
</el-button>
</template>
</el-table-column>
</el-table>
@ -93,9 +107,13 @@ import {
} from '@/api/quality/qualityConstructionLog';
import { QualityConstructionLogVO, QualityConstructionLogQuery, QualityConstructionLogForm } from '@/api/quality/qualityConstructionLog/types';
import QualityConstructionDetail from './cpmponent/qualityConstructionDetail.vue';
import { useUserStoreHook } from '@/store/modules/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
// 获取用户 store
const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目
const currentProject = computed(() => userStore.selectedProject);
const qualityConstructionLogList = ref<QualityConstructionLogVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
@ -115,7 +133,7 @@ const dialog = reactive<DialogOption>({
const initFormData: QualityConstructionLogForm = {
id: undefined,
projectId: undefined,
projectId: currentProject.value.id,
happenDate: undefined,
productionStatus: undefined,
technologyQuality: undefined,
@ -127,7 +145,7 @@ const data = reactive<PageData<QualityConstructionLogForm, QualityConstructionLo
queryParams: {
pageNum: 1,
pageSize: 10,
projectId: undefined,
projectId: currentProject.value.id,
happenDate: undefined,
params: {}
},
@ -231,6 +249,20 @@ const handleExport = () => {
);
};
//监听项目id刷新数据
const listeningProject = watch(
() => currentProject.value.id,
(nid, oid) => {
queryParams.value.projectId = nid;
form.value.projectId = nid;
getList();
}
);
onUnmounted(() => {
listeningProject();
});
onMounted(() => {
getList();
});

View File

@ -5,7 +5,7 @@
<div class="resultIcon"><img :src="'../../../../../src/assets/icons/svg/' + inspectionType + '.png'" alt="" /></div>
<h2 style="text-align: center; margin-top: 5px; font-weight: bold">整改通知单</h2>
<el-row>
<el-col :span="12" style="text-align: left">填报人{{ safetyInspectionDetail?.creatorName }}</el-col>
<el-col :span="12" style="text-align: left">填报人{{ safetyInspectionDetail?.createBy }}</el-col>
<el-col :span="12" style="text-align: right">填报时间{{ safetyInspectionDetail?.createTime }}</el-col>
</el-row>
<el-descriptions :column="2" border style="margin-top: 8px" label-width="160px" size="large">
@ -19,17 +19,19 @@
{{ safetyInspectionDetail?.correctorName }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="整改日期" class-name="zebra">
{{ dayjs(safetyInspectionDetail?.rectificationTime).format('YYYY 年 MM 月 DD 日') }}
{{ safetyInspectionDetail?.rectificationTime }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="巡检类型" label-class-name="white">
<dict-tag :options="quality_inspection_check_type" :value="safetyInspectionDetail?.inspectionType" />
</el-descriptions-item>
<el-descriptions-item label-align="center" label="填报人" label-class-name="white"
>{{ safetyInspectionDetail?.creatorName }}
>{{ safetyInspectionDetail?.createBy }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="填报日期" class-name="zebra"
>{{ safetyInspectionDetail?.createTime }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="填报日期" class-name="zebra">{{ safetyInspectionDetail?.checkTime }} </el-descriptions-item>
<el-descriptions-item label-align="center" label="要求回复期限" class-name="zebra"
>{{ safetyInspectionDetail?.replyPeriodDate }}
>{{ parseTime(safetyInspectionDetail?.replyPeriodDate, '{y}-{m}-{d}') }}
</el-descriptions-item>
</el-descriptions>
<el-descriptions border direction="vertical" size="large">
@ -64,7 +66,7 @@
</el-descriptions>
<el-descriptions :column="2" border label-width="160px" size="large">
<el-descriptions-item label-align="center" label="整改措施及完成情况" :span="2" label-class-name="white">
{{ safetyInspectionDetail?.measure }}
{{ safetyInspectionDetail?.verificationResult }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="整改附件" :span="2" label-class-name="white">
<el-space wrap>
@ -73,7 +75,7 @@
<image-preview :src="item.url" width="200px" />
</span>
<span v-else>
<el-link :href="`${item.url}`" :underline="false" target="_blank">
<el-link :href="`${item.url}`" :underline="false" type="primary" target="_blank">
<span> {{ item.originalName }} </span>
</el-link>
</span>
@ -94,7 +96,7 @@
<!-- </el-card> -->
<div class="dialog-footer">
<div class="btn-item">
<div class="btn-item" @click="handleExport">
<img src="../../../../assets/icons/svg/derived.png" />
<span>导出</span>
</div>
@ -108,7 +110,7 @@
<script lang="ts" setup>
import { getQualityInspection } from '@/api/quality/qualityInspection';
import { QualityInspectionVO } from '@/api/quality/qualityInspection/types';
import { listByIds } from '@/api/system/oss';
import { downLoadOss, listByIds } from '@/api/system/oss';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
import { dayjs } from 'element-plus';
const { quality_inspection_check_type, quality_inspection_status_type } = toRefs<any>(
@ -127,8 +129,8 @@ const rectificationFileList = ref<any[]>();
const inspectionType = computed(() => {
let imgName = 'successLogo';
if (safetyInspectionDetail.value?.inspectionStatus == '2') imgName = 'rectification';
if (safetyInspectionDetail.value?.inspectionStatus == '1') imgName = 'successVerification';
if (safetyInspectionDetail.value?.inspectionStatus == '2') imgName = 'danggerVerification';
if (safetyInspectionDetail.value?.verificationType == '1') imgName = 'successVerification';
if (safetyInspectionDetail.value?.verificationType == '2') imgName = 'danggerVerification';
return imgName;
});
@ -149,8 +151,12 @@ const get = async () => {
}
};
const handleExport = async () => {
await downLoadOss({ id: safetyInspectionDetail.value.id }, '/quality/qualityInspection/export/word', '整改通知单.zip');
};
onMounted(() => {
// get();
get();
});
watch(

View File

@ -55,28 +55,41 @@
<el-table v-loading="loading" :data="qualityInspectionList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键id" align="center" prop="id" v-if="false" />
<el-table-column label="填报人" align="center" prop="createBy" />
<el-table-column label="填报时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {hh}:{mm}:{ss}') }}</span>
</template>
</el-table-column>
<el-table-column label="巡检标题" align="center" prop="inspectionHeadline" />
<el-table-column label="巡检类型" align="center" prop="inspectionType">
<template #default="scope">
<dict-tag :options="quality_inspection_check_type" :value="scope.row.inspectionType" />
</template>
</el-table-column>
<el-table-column label="巡检标题" align="center" prop="inspectionHeadline" />
<el-table-column label="巡检结果" align="center" prop="inspectionResult" />
<el-table-column label="工单状态" align="center" prop="inspectionStatus">
<el-table-column label="巡检结果" align="center" prop="inspectionResult">
<template #default="scope">
<el-tooltip placement="top" effect="dark">
<template #content>
<div class="max-w-670px">{{ scope.row.inspectionResult }}</div>
</template>
<el-text truncated>
{{ scope.row.inspectionResult }}
</el-text>
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="整改人" align="center" prop="correctorName" />
<!-- <el-table-column label="工单状态" align="center" prop="inspectionStatus">
<template #default="scope">
<dict-tag :options="quality_inspection_status_type" :value="scope.row.inspectionStatus" />
</template>
</el-table-column>
</el-table-column> -->
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="创建者" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="验证" placement="top">
<!-- <el-tooltip content="验证" placement="top">
<el-button
link
type="primary"
@ -84,19 +97,13 @@
@click="handleUpdate(scope.row)"
v-hasPermi="['quality:qualityInspection:edit']"
></el-button>
</el-tooltip>
<el-tooltip content="详情" placement="top">
<el-button link type="primary" icon="View" @click="handleDetail(scope.row)" v-hasPermi="['quality:qualityInspection:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button
link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['quality:qualityInspection:remove']"
></el-button>
</el-tooltip>
</el-tooltip> -->
<el-button link type="primary" icon="View" @click="handleDetail(scope.row)" v-hasPermi="['quality:qualityInspection:edit']">
详情
</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['quality:qualityInspection:remove']">
删除
</el-button>
</template>
</el-table-column>
</el-table>
@ -191,7 +198,7 @@ const qualityInspectionFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
details: true,
details: false,
title: ''
});

View File

@ -211,7 +211,7 @@ const handleSelectionChange = (selection: QuestionUserAnswerVO[]) => {
/** 批量下载按钮操作 */
const handleDownload = async () => {
const _ids = ids.value;
await downLoadOss(_ids);
await downLoadOss({ idList: _ids }, '/safety/questionUserAnswer/exportFile', '安全考试.zip');
};
/** 下载单个按钮操作 */
const downloadOssOne = async (row?: QuestionUserAnswerVO) => {

View File

@ -99,7 +99,7 @@
<!-- </el-card> -->
<div class="dialog-footer">
<div class="btn-item">
<div class="btn-item" @click="handleExport">
<img src="../../../../assets/icons/svg/derived.png" />
<span>导出</span>
</div>
@ -114,7 +114,7 @@
import { useUserStoreHook } from '@/store/modules/user';
import { SafetyInspectionVO } from '@/api/safety/safetyInspection/types';
import { getSafetyInspection } from '@/api/safety/safetyInspection';
import { listByIds } from '@/api/system/oss';
import { downLoadOss, listByIds } from '@/api/system/oss';
import { OssVO } from '@/api/system/oss/types';
import dayjs from 'dayjs';
@ -163,6 +163,10 @@ const get = async () => {
loading.value = false;
};
const handleExport = async () => {
await downLoadOss({ id: safetyInspectionDetail.value.id }, '/safety/safetyInspection/export/word', '安全生产监督检查通知书.zip');
};
onMounted(() => {
console.log('🚀 ~ onMounted ~ props.safetyInspectionId:', props.safetyInspectionId);
get();

View File

@ -70,7 +70,18 @@
<dict-tag :options="safety_inspection_violation_type" :value="scope.row.violationType" />
</template>
</el-table-column>
<el-table-column label="巡检结果" align="center" prop="inspectionResult" />
<el-table-column label="巡检结果" align="center" prop="inspectionResult">
<template #default="scope">
<el-tooltip placement="top" effect="dark">
<template #content>
<div class="max-w-670px">{{ scope.row.inspectionResult }}</div>
</template>
<el-text truncated>
{{ scope.row.inspectionResult }}
</el-text>
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="整改人" align="center" prop="correctorName" />
<el-table-column label="复查状态" align="center" prop="reviewType">
<template #default="scope">

View File

@ -90,7 +90,7 @@
<el-date-picker clearable v-model="form.scopeEnd" type="date" value-format="YYYY-MM-DD" placeholder="请选择周期范围结束" />
</el-form-item>
<el-form-item label="文件位置" prop="path">
<file-upload v-model="form.path" :file-size="20" :limit="1" :file-type="['doc', 'docx']" />
<div><file-upload v-model="form.path" :file-size="20" :limit="1" :file-type="['doc', 'docx']" /></div>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />