Files
td_official/src/views/template/index.vue

449 lines
19 KiB
Vue
Raw Normal View History

2025-07-02 21:21:02 +08:00
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="模板类型" prop="projectType">
2025-07-04 19:57:23 +08:00
<el-select v-model="queryParams.projectType" placeholder="请选择模板类型" clearable filterable @change="selectType">
<el-option v-for="item in projectTypeOptions" :key="item.name" :label="item.name" :value="item.name"> </el-option>
2025-07-02 21:21:02 +08:00
</el-select>
</el-form-item>
2025-07-04 19:57:23 +08:00
<!-- <el-form-item>
2025-07-02 21:21:02 +08:00
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
2025-07-04 19:57:23 +08:00
</el-form-item> -->
2025-07-02 21:21:02 +08:00
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" :disabled="addSingle" @click="handleAdd" v-hasPermi="['quality:qualityInspection:add']"
>新增</el-button
>
</el-col>
2025-07-04 19:57:23 +08:00
<!-- <el-col :span="1.5">
2025-07-02 21:21:02 +08:00
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['quality:qualityInspection:edit']"
>修改</el-button
>
2025-07-04 19:57:23 +08:00
</el-col> -->
2025-07-02 21:21:02 +08:00
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete()"
v-hasPermi="['quality:qualityInspection:remove']"
>删除</el-button
>
</el-col>
<!-- <el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['quality:qualityInspection:export']">导出</el-button>
</el-col> -->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<!-- card body -->
2025-07-04 19:57:23 +08:00
<Contactform
v-if="queryParams.projectType == '联系单'"
@selection-change="handleSelectionChange"
:data="tableData"
@delete="handleDelete"
></Contactform>
2025-07-02 21:21:02 +08:00
<EngineeringChangeApplicationForm
2025-07-04 19:57:23 +08:00
v-if="queryParams.projectType == '工程变更申请单'"
2025-07-02 21:21:02 +08:00
@selection-change="handleSelectionChange"
2025-07-04 19:57:23 +08:00
:data="tableData"
@delete="handleDelete"
2025-07-02 21:21:02 +08:00
></EngineeringChangeApplicationForm>
2025-07-04 19:57:23 +08:00
<Notice v-if="queryParams.projectType == '2'" @selection-change="handleSelectionChange" :data="tableData"></Notice>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
2025-07-02 21:21:02 +08:00
</el-card>
<el-dialog title="新增模板" v-model="dialogVisible" width="800">
<el-form :model="form" :rules="rules" ref="formRef" label-width="110px">
2025-07-03 20:52:22 +08:00
<div class="flex">
2025-07-04 19:57:23 +08:00
<!-- <img :src="thumbnailUrl" alt="" style="width: 150px;" /> -->
<div><image-preview :src="thumbnailUrl" width="150px"></image-preview></div>
<div v-if="queryParams.projectType == '联系单'">
2025-07-03 20:52:22 +08:00
<el-form-item label="工程名称" prop="projectName">
<el-input v-model="form.projectName" placeholder="请输入工程名称" />
</el-form-item>
<el-form-item label="编号" prop="serialNumber">
<el-input v-model="form.serialNumber" placeholder="请输入编号" />
</el-form-item>
<el-form-item label="致" prop="to">
<el-input v-model="form.to" placeholder="致:" />
</el-form-item>
<el-form-item label="主题" prop="subject">
<el-input v-model="form.subject" placeholder="请输入主题" />
</el-form-item>
<el-form-item label="内容" prop="content">
<el-input v-model="form.content" type="textarea" :rows="6" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="附件" prop="attachments">
<file-upload v-model="form.attachments" :limit="1" :file-type="['pdf', 'png', 'jpg', 'jpeg', 'gif', 'bmp']"></file-upload>
</el-form-item>
<el-divider class="mb-10! mt-10!">施工项目部</el-divider>
<el-form-item label="项目负责人" prop="contractorLeader">
<el-input v-model="form.contractorLeader" placeholder="请输入负责人姓名" />
</el-form-item>
<el-form-item label="日期" prop="contractorDate">
<el-date-picker v-model="form.contractorDate" type="date" placeholder="选择日期" style="width: 100%" />
</el-form-item>
<el-divider class="mb-10! mt-10!">项目监理机构</el-divider>
2025-07-02 21:21:02 +08:00
2025-07-03 20:52:22 +08:00
<el-form-item label="总监理工程师" prop="supervisorLeader">
<el-input v-model="form.supervisorLeader" placeholder="请输入总监理工程师姓名" />
</el-form-item>
<el-form-item label="日期" prop="supervisorDate">
<el-date-picker v-model="form.supervisorDate" type="date" placeholder="选择日期" style="width: 100%" />
</el-form-item>
<el-divider class="mb-10! mt-10!">建设单位</el-divider>
<el-form-item label="业主代表" prop="ownerRep">
<el-input v-model="form.ownerRep" placeholder="请输入业主代表" />
</el-form-item>
<el-form-item label="日期" prop="ownerDate">
<el-date-picker v-model="form.ownerDate" type="date" placeholder="选择日期" style="width: 100%" />
</el-form-item>
</div>
2025-07-04 19:57:23 +08:00
<div v-if="queryParams.projectType === '工程变更申请单'">
2025-07-03 20:52:22 +08:00
<el-form-item label="工程名称">
<el-input v-model="form.projectName" />
</el-form-item>
2025-07-02 21:21:02 +08:00
2025-07-03 20:52:22 +08:00
<el-form-item label="提出单位">
<el-input v-model="form.unitName" />
</el-form-item>
2025-07-02 21:21:02 +08:00
2025-07-03 20:52:22 +08:00
<el-form-item label="专业">
<el-input v-model="form.profession" />
</el-form-item>
2025-07-02 21:21:02 +08:00
2025-07-03 20:52:22 +08:00
<el-form-item label="提出日期">
<el-date-picker v-model="form.applyDate" type="date" placeholder="选择日期" style="width: 100%" />
</el-form-item>
2025-07-02 21:21:02 +08:00
2025-07-03 20:52:22 +08:00
<el-form-item label="卷册名称">
<el-input v-model="form.bookName" />
</el-form-item>
2025-07-02 21:21:02 +08:00
2025-07-03 20:52:22 +08:00
<el-form-item label="卷册号">
<el-input v-model="form.bookNo" />
</el-form-item>
2025-07-02 21:21:02 +08:00
2025-07-03 20:52:22 +08:00
<el-form-item label="附图">
<image-upload v-model="form.hasAttachment"></image-upload>
</el-form-item>
2025-07-02 21:21:02 +08:00
2025-07-03 20:52:22 +08:00
<el-form-item label="变更原因">
<el-checkbox-group v-model="form.changeReasons">
<el-checkbox label="设计漏项" class="w45%" />
<el-checkbox label="设计改进" />
<el-checkbox label="设计差错" class="w45%" />
<el-checkbox label="接口差错" />
<el-checkbox label="业主要求" class="w45%" />
<el-checkbox label="施工承包商要求" />
<el-checkbox label="外部资料不符" class="w45%" />
<el-checkbox label="材料代用或其他" />
</el-checkbox-group>
</el-form-item>
2025-07-02 21:21:02 +08:00
2025-07-03 20:52:22 +08:00
<el-form-item label="变更内容">
<el-input v-model="form.changeContent" />
</el-form-item>
2025-07-02 21:21:02 +08:00
2025-07-03 20:52:22 +08:00
<el-form-item label="变更费用估算">
<el-input v-model="form.costEstimate" />
</el-form-item>
<el-divider class="mb-10! mt-10!">施工承包单位</el-divider>
2025-07-04 19:57:23 +08:00
<el-form-item label="项目经理" prop="asupervisorLeader">
<el-input v-model="form.asupervisorLeader" placeholder="请输入项目经理姓名" />
2025-07-03 20:52:22 +08:00
</el-form-item>
2025-07-04 19:57:23 +08:00
<el-form-item label="日期" prop="asupervisorDate">
<el-date-picker v-model="form.asupervisorDate" type="date" placeholder="选择日期" style="width: 100%" />
2025-07-03 20:52:22 +08:00
</el-form-item>
<el-divider class="mb-10! mt-10!">总承包单位</el-divider>
2025-07-04 19:57:23 +08:00
<el-form-item label="项目技术负责人" prop="bsupervisorLeader">
<el-input v-model="form.bsupervisorLeader" placeholder="请输入项目技术负责人姓名" />
2025-07-03 20:52:22 +08:00
</el-form-item>
2025-07-04 19:57:23 +08:00
<el-form-item label="日期" prop="bsupervisorDate">
<el-date-picker v-model="form.bsupervisorDate" type="date" placeholder="选择日期" style="width: 100%" />
2025-07-03 20:52:22 +08:00
</el-form-item>
<el-divider class="mb-10! mt-10!">设计单位</el-divider>
2025-07-04 19:57:23 +08:00
<el-form-item label="设计代表" prop="csupervisorLeader">
<el-input v-model="form.csupervisorLeader" placeholder="请输入设计代表姓名" />
2025-07-03 20:52:22 +08:00
</el-form-item>
2025-07-04 19:57:23 +08:00
<el-form-item label="日期" prop="csupervisorDate">
<el-date-picker v-model="form.csupervisorDate" type="date" placeholder="选择日期" style="width: 100%" />
2025-07-03 20:52:22 +08:00
</el-form-item>
<el-divider class="mb-10! mt-10!">项目监理单位</el-divider>
2025-07-04 19:57:23 +08:00
<el-form-item label="监理工程师" prop="dsupervisorLeader">
<el-input v-model="form.dsupervisorLeader" placeholder="请输入监理工程师姓名" />
2025-07-03 20:52:22 +08:00
</el-form-item>
2025-07-04 19:57:23 +08:00
<el-form-item label="总监理工程师" prop="dasupervisorLeader">
<el-input v-model="form.dasupervisorLeader" placeholder="请输入总监理工程师姓名" />
2025-07-03 20:52:22 +08:00
</el-form-item>
2025-07-04 19:57:23 +08:00
<el-form-item label="日期" prop="dsupervisorDate">
<el-date-picker v-model="form.dsupervisorDate" type="date" placeholder="选择日期" style="width: 100%" />
2025-07-03 20:52:22 +08:00
</el-form-item>
<el-divider class="mb-10! mt-10!">建设单位</el-divider>
2025-07-04 19:57:23 +08:00
<el-form-item label="负责人" prop="esupervisorLeader">
<el-input v-model="form.esupervisorLeader" placeholder="请输入负责人姓名" />
2025-07-03 20:52:22 +08:00
</el-form-item>
2025-07-04 19:57:23 +08:00
<el-form-item label="日期" prop="esupervisorDate">
<el-date-picker v-model="form.esupervisorDate" type="date" placeholder="选择日期" style="width: 100%" />
2025-07-03 20:52:22 +08:00
</el-form-item>
</div>
<div v-if="queryParams.projectType === '2'">
<el-form-item label="检查类型" prop="checkType">
<el-select v-model="form.checkType" placeholder="请选择检查类型">
<el-option v-for="dict in safety_inspection_check_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="违章类型" prop="violationType">
<el-select v-model="form.violationType" placeholder="请选择违章类型">
<el-option v-for="dict in safety_inspection_violation_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="巡检结果" prop="inspectionResult">
<el-input v-model="form.inspectionResult" placeholder="请输入巡检结果" />
</el-form-item>
<el-form-item label="整改班组" prop="teamId">
<el-select v-model="form.teamId" placeholder="请选择整改班组">
<el-option v-for="item in teamOpt" :key="item.value" :label="item.label" :value="item.value" @click="changeForeman(item.value)" />
</el-select>
</el-form-item>
<el-form-item label="整改人" prop="correctorId">
<el-select v-model="form.correctorId" placeholder="请选择整改人" :disabled="!form.teamId">
<el-option v-for="item in foremanOpt" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="问题隐患" prop="hiddenDanger">
<el-input v-model="form.hiddenDanger" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="整改措施" prop="measure">
<el-input v-model="form.measure" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="要求整改期限" prop="checkTime">
<el-date-picker clearable v-model="form.rectificationDeadline" type="date" value-format="YYYY-MM-DD" placeholder="选择要求整改期限" />
</el-form-item>
<el-form-item label="检查附件" prop="checkFile">
<file-upload v-model="form.checkFile" :file-size="20" :file-type="['doc', 'docx', 'pdf', 'png', 'jpg', 'jpeg']" />
</el-form-item>
<el-form-item label="整改附件" prop="rectificationFile">
<file-upload v-model="form.rectificationFile" :file-size="20" :file-type="['doc', 'docx', 'pdf', 'png', 'jpg', 'jpeg']" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</div>
2025-07-02 21:21:02 +08:00
</div>
</el-form>
<template #footer>
<span>
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import { useUserStoreHook } from '@/store/modules/user';
import type { FormInstance, FormRules } from 'element-plus';
import Contactform from './components/contactform.vue';
import EngineeringChangeApplicationForm from './components/engineeringChangeApplicationForm.vue';
2025-07-03 20:52:22 +08:00
import Notice from './components/notice.vue';
2025-07-04 19:57:23 +08:00
import { listContactTypeformtemplate } from '@/api/cory/contactformtemplate';
import { addContactnotice, delContactnotice, listContactnotice } from '@/api/cory/contactnotice';
2025-07-02 21:21:02 +08:00
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
// 获取用户 store
const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目
const currentProject = computed(() => userStore.selectedProject);
2025-07-03 20:52:22 +08:00
const { safety_inspection_violation_type, safety_inspection_check_type } = toRefs<any>(
proxy?.useDict('safety_inspection_violation_type', 'safety_inspection_check_type')
);
const teamOpt = ref([]);
const foremanOpt = ref([]);
2025-07-04 19:57:23 +08:00
const thumbnailUrl = ref('');
const tableData = ref([]);
const total = ref(0);
2025-07-02 21:21:02 +08:00
const formRef = ref<FormInstance>();
const dialogVisible = ref<boolean>(false);
const showSearch = ref(true);
const multiple = ref<boolean>(true);
const addSingle = ref<boolean>(false);
const single = ref<boolean>(true);
const ids = ref<Array<string | number>>([]);
2025-07-04 19:57:23 +08:00
const projectTypeOptions = ref<any>([
2025-07-02 21:21:02 +08:00
{
value: '0',
label: '联系单'
},
{
value: '1',
label: '工程变更申请单'
},
{
value: '2',
label: '通知单'
},
{
value: '3',
2025-07-03 20:52:22 +08:00
label: '回复单'
2025-07-02 21:21:02 +08:00
},
{
value: '4',
label: '签证单'
}
2025-07-04 19:57:23 +08:00
]);
2025-07-02 21:21:02 +08:00
const initFormData = {
projectType: '',
projectName: '',
serialNumber: '',
to: '',
subject: '',
content: '',
attachments: '',
contractorLeader: '',
contractorDate: '',
supervisorLeader: '',
supervisorDate: '',
ownerRep: '',
ownerDate: '',
unitName: '',
profession: '',
applyDate: '',
bookName: '',
bookNo: '',
hasAttachment: '',
changeReasons: [],
changeContent: '',
costEstimate: ''
};
const data = reactive<PageData<any, any>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
projectId: currentProject.value?.id,
inspectionType: undefined,
inspectionStatus: undefined,
teamId: undefined,
2025-07-04 19:57:23 +08:00
type: undefined,
2025-07-02 21:21:02 +08:00
params: {},
2025-07-04 19:57:23 +08:00
projectType: undefined
2025-07-02 21:21:02 +08:00
},
rules: {
projectName: [{ required: true, message: '请输入工程名称', trigger: 'blur' }],
projectType: [{ required: true, message: '请选择模板类型', trigger: 'blur' }],
serialNumber: [{ required: true, message: '请输入编号', trigger: 'blur' }],
to: [{ required: true, message: '请输入接收方', trigger: 'blur' }],
subject: [{ required: true, message: '请输入主题', trigger: 'blur' }],
content: [{ required: true, message: '请输入内容', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
const submitForm = () => {
2025-07-04 19:57:23 +08:00
formRef.value?.validate(async (valid) => {
2025-07-02 21:21:02 +08:00
if (valid) {
2025-07-04 19:57:23 +08:00
let data = {
type: queryParams.value.type,
projectId: currentProject.value?.id,
detail: JSON.stringify(form.value)
};
2025-07-02 21:21:02 +08:00
console.log('提交表单:', form);
2025-07-04 19:57:23 +08:00
const res = await addContactnotice(data);
if (res.code == 200) {
proxy.$modal.msgSuccess('添加成功');
dialogVisible.value = false;
formRef.value.resetFields();
getList();
}
2025-07-02 21:21:02 +08:00
}
});
};
const handleAdd = () => {
dialogVisible.value = true;
};
2025-07-03 20:52:22 +08:00
const changeForeman = (value: string | number) => {
// const team = teamList.value.filter((team) => team.id === value)[0];
// foremanOpt.value = team.foremanList?.map((foreman: foremanQuery) => ({
// label: foreman.foremanName,
// value: foreman.foremanId
// }));
// form.value.correctorId = '';
};
2025-07-02 21:21:02 +08:00
const handleQuery = () => {};
const resetQuery = () => {};
2025-07-04 19:57:23 +08:00
const getList = async () => {
console.log(queryParams.value.projectType);
if (!queryParams.value.projectType) {
const res = await listContactTypeformtemplate(queryParams.value);
projectTypeOptions.value = res.data;
queryParams.value.projectType = res.data[0].name;
thumbnailUrl.value = res.data[0].thumbnail;
queryParams.value.type = res.data[0].id as string;
}
const res = await listContactnotice(queryParams.value);
res.rows = res.rows.map((item) => {
return {
...item,
...JSON.parse(item.detail)
};
});
tableData.value = res.rows;
total.value = res.total || 0;
};
const handleDelete = async (id?: string) => {
const _ids = id || ids.value;
await proxy?.$modal.confirm('是否确认删除识别记录编号为"' + _ids + '"的数据项?').finally();
const res = await delContactnotice(_ids);
if (res.code == 200) {
proxy.$modal.msgSuccess('删除成功');
getList();
}
};
2025-07-02 21:21:02 +08:00
const handleUpdate = () => {};
/** 多选框选中数据 */
const handleSelectionChange = (selection: any) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
2025-07-04 19:57:23 +08:00
const selectType = (value: string) => {
queryParams.value.projectType = value;
thumbnailUrl.value = projectTypeOptions.value.filter((item) => item.name == value)[0].thumbnail;
queryParams.value.type = projectTypeOptions.value.filter((item) => item.name == value)[0].id;
getList();
};
2025-07-02 21:21:02 +08:00
const resetForm = () => {
formRef.value?.resetFields();
};
2025-07-04 19:57:23 +08:00
onMounted(() => {
getList();
});
2025-07-02 21:21:02 +08:00
</script>