|
|
@@ -31,15 +31,30 @@
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="施工项目负责人" prop="projectManagerName">
|
|
|
- <el-input v-model="formValue.projectManagerName" size="large" placeholder="输入施工项目负责人" style="width: 330px" />
|
|
|
+ <el-input
|
|
|
+ v-model="formValue.projectManagerName"
|
|
|
+ size="large"
|
|
|
+ placeholder="输入施工项目负责人"
|
|
|
+ style="width: 330px"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="施工项目负责人电话1" prop="projectManagerPhone1">
|
|
|
- <el-input v-model="formValue.projectManagerPhone1" size="large" placeholder="输入施工项目负责人电话1" style="width: 330px" />
|
|
|
+ <el-input
|
|
|
+ v-model="formValue.projectManagerPhone1"
|
|
|
+ size="large"
|
|
|
+ placeholder="输入施工项目负责人电话1"
|
|
|
+ style="width: 330px"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="施工项目负责人电话2" prop="projectManagerPhone2">
|
|
|
- <el-input v-model="formValue.projectManagerPhone2" size="large" placeholder="输入施工项目负责人电话2" style="width: 330px" />
|
|
|
+ <el-input
|
|
|
+ v-model="formValue.projectManagerPhone2"
|
|
|
+ size="large"
|
|
|
+ placeholder="输入施工项目负责人电话2"
|
|
|
+ style="width: 330px"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="施工现场安全负责人" prop="siteSafetyManagerName">
|
|
|
@@ -52,11 +67,21 @@
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="施工现场安全负责人电话1" prop="siteSafetyPhone1">
|
|
|
- <el-input v-model="formValue.siteSafetyPhone1" size="large" placeholder="输入施工现场安全负责人电话1" style="width: 330px" />
|
|
|
+ <el-input
|
|
|
+ v-model="formValue.siteSafetyPhone1"
|
|
|
+ size="large"
|
|
|
+ placeholder="输入施工现场安全负责人电话1"
|
|
|
+ style="width: 330px"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="施工现场安全负责人电话2" prop="siteSafetyPhone2">
|
|
|
- <el-input v-model="formValue.siteSafetyPhone2" size="large" placeholder="输入施工现场安全负责人电话2" style="width: 330px" />
|
|
|
+ <el-input
|
|
|
+ v-model="formValue.siteSafetyPhone2"
|
|
|
+ size="large"
|
|
|
+ placeholder="输入施工现场安全负责人电话2"
|
|
|
+ style="width: 330px"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="开始时间" prop="projectStartTime">
|
|
|
@@ -91,6 +116,7 @@
|
|
|
v-for="t in ['水电', '泥瓦', '木工', '焊接', '气割', '登高', '密闭', '特种驾驶', '其他']"
|
|
|
:key="t"
|
|
|
:label="t"
|
|
|
+ :value="t"
|
|
|
/>
|
|
|
</el-checkbox-group>
|
|
|
</el-form-item>
|
|
|
@@ -120,23 +146,29 @@
|
|
|
</el-form-item>
|
|
|
|
|
|
<div style="width: 100%; height: 1px; background: #eee; margin: 20px 0"></div>
|
|
|
- <div style="width: 100%; margin-bottom: 20px; font-weight: bold; padding-left: 10px"
|
|
|
- >附件上传清单(全项必填)</div>
|
|
|
+ <div style="width: 100%; margin-bottom: 20px; font-weight: bold; padding-left: 10px">附件上传清单</div>
|
|
|
|
|
|
<el-form-item
|
|
|
v-for="item in attachmentConfigs"
|
|
|
:key="item.prop"
|
|
|
:label="item.label"
|
|
|
- label-width="240px"
|
|
|
+ label-width="250px"
|
|
|
:prop="item.prop"
|
|
|
class="label"
|
|
|
- style="width: 43.6%;"
|
|
|
+ style="width: 43%"
|
|
|
>
|
|
|
- <UploadFiles
|
|
|
- label="上传文件"
|
|
|
- @upload-success="(fileList) => handleUploadSuccess(item.prop, fileList)"
|
|
|
- :fileList="attachmentLists[item.prop]"
|
|
|
- />
|
|
|
+ <el-row style="width: 100%">
|
|
|
+ <el-col :span="12">
|
|
|
+ <UploadFiles
|
|
|
+ label="上传文件"
|
|
|
+ @upload-success="(fileList) => handleUploadSuccess(item.prop, fileList)"
|
|
|
+ :fileList="attachmentLists[item.prop]"
|
|
|
+ />
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-button type="primary" link @click="templateDownload(item)"> 模版下载 </el-button>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
</el-form-item>
|
|
|
|
|
|
<div style="width: 100%; height: 1px; background: #eee; margin: 20px 0"></div>
|
|
|
@@ -171,6 +203,7 @@
|
|
|
|
|
|
import { constructionSafetySaveConstruction } from '@/api/production-safety/responsibility-implementation';
|
|
|
import { formatAttachmentList } from '@/components/UploadFiles/utils';
|
|
|
+ import { downloadFile } from '@/views/disaster/utils';
|
|
|
|
|
|
const router = useRouter();
|
|
|
const formRef = ref<any>(null);
|
|
|
@@ -178,26 +211,42 @@
|
|
|
const tradeArray = ref<string[]>([]);
|
|
|
const approvalOptions = ref<any[]>([]);
|
|
|
const attachmentConfigs = [
|
|
|
- { label: '施工人员身份信息(复印件,施工单位盖章)', prop: 'personnelIdAttachment' },
|
|
|
-
|
|
|
- { label: '施工方提供施工安全交底(施工方敲章)', prop: 'safetyCommitmentAttachment' },
|
|
|
-
|
|
|
- { label: '施工方提供施工人员安全教育(施工人员签字并敲章)', prop: 'safetyEducationAttachment' },
|
|
|
-
|
|
|
- { label: '安全管理协议(双方签字两份,上飞院部门领导签甲方代表、乙方盖章并签字)', prop: 'safetyAgreementAttachment' },
|
|
|
-
|
|
|
- { label: '施工作业环境承诺(上飞院的项目具体经办人签字)', prop: 'environmentCommitmentAttachment' },
|
|
|
-
|
|
|
- { label: '安全告知单(部门具体经办人签字)', prop: 'safetyNoticeAttachment' },
|
|
|
-
|
|
|
- { label: '消防管理承诺书(部门具体经办人签字)', prop: 'fireManagementAttachment' },
|
|
|
-
|
|
|
- { label: '施工方案(含风险识别、安全措施、应急预案等)', prop: 'constructionPlanAttachment' },
|
|
|
-
|
|
|
- { label: '劳保用品清单', prop: 'ppeListAttachment' },
|
|
|
- { label: '施工机械清单', prop: 'equipmentListAttachment' },
|
|
|
- { label: '若有特种施工人员提供特种作业证(复印件,施工单位盖章)', prop: 'specialWorkerCertAttachment' },
|
|
|
- { label: '若有特种设备提供特种设备的合格证(复印件,施工单位盖章', prop: 'specialEquipmentCertAttachment' },
|
|
|
+ { label: '施工人员身份信息(复印件,施工单位盖章)', prop: 'personnelIdAttachment', required: true },
|
|
|
+
|
|
|
+ { label: '施工方提供施工安全交底(施工方敲章)', prop: 'safetyCommitmentAttachment', required: true },
|
|
|
+
|
|
|
+ { label: '施工方提供施工人员安全教育(施工人员签字并敲章)', prop: 'safetyEducationAttachment', required: true },
|
|
|
+
|
|
|
+ {
|
|
|
+ label: '安全管理协议(双方签字两份,上飞院部门领导签甲方代表、乙方盖章并签字)',
|
|
|
+ prop: 'safetyAgreementAttachment',
|
|
|
+ required: true,
|
|
|
+ },
|
|
|
+
|
|
|
+ {
|
|
|
+ label: '施工作业环境承诺(上飞院的项目具体经办人签字)',
|
|
|
+ prop: 'environmentCommitmentAttachment',
|
|
|
+ required: true,
|
|
|
+ },
|
|
|
+
|
|
|
+ { label: '安全告知单(部门具体经办人签字)', prop: 'safetyNoticeAttachment', required: true },
|
|
|
+
|
|
|
+ { label: '消防管理承诺书(部门具体经办人签字)', prop: 'fireManagementAttachment', required: true },
|
|
|
+
|
|
|
+ { label: '施工方案(含风险识别、安全措施、应急预案等)', prop: 'constructionPlanAttachment', required: true },
|
|
|
+
|
|
|
+ { label: '劳保用品清单', prop: 'ppeListAttachment', required: true },
|
|
|
+ { label: '施工机械清单', prop: 'equipmentListAttachment', required: true },
|
|
|
+ {
|
|
|
+ label: '若有特种施工人员提供特种作业证(复印件,施工单位盖章)',
|
|
|
+ prop: 'specialWorkerCertAttachment',
|
|
|
+ required: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '若有特种设备提供特种设备的合格证(复印件,施工单位盖章',
|
|
|
+ prop: 'specialEquipmentCertAttachment',
|
|
|
+ required: false,
|
|
|
+ },
|
|
|
];
|
|
|
|
|
|
const attachmentLists = reactive<any>(Object.fromEntries(attachmentConfigs.map((a) => [a.prop, []])));
|
|
|
@@ -242,66 +291,67 @@
|
|
|
constructionLocation: [{ required: true, message: '请输入施工地点', trigger: 'blur' }],
|
|
|
workerCount: [{ required: true, message: '请输入人数', trigger: 'blur' }],
|
|
|
projectManagerName: [{ required: true, message: '请输入项目负责人', trigger: 'blur' }],
|
|
|
+ otherDescription: [{ required: true, message: '请输入其他说明', trigger: 'blur' }],
|
|
|
projectManagerPhone1: [
|
|
|
- { required: true, message: '请输入电话', trigger: 'blur' },
|
|
|
- {
|
|
|
- validator: (_rule: any, value: any, callback: any) => {
|
|
|
- if (!value) {
|
|
|
- callback(new Error('请输入电话'));
|
|
|
- } else if (!/^1[3-9]\d{9}$/.test(value)) {
|
|
|
- callback(new Error('请输入有效的11位手机号'));
|
|
|
- } else {
|
|
|
- callback();
|
|
|
- }
|
|
|
- },
|
|
|
- trigger: 'blur'
|
|
|
- }
|
|
|
+ { required: true, message: '请输入电话', trigger: 'blur' },
|
|
|
+ {
|
|
|
+ validator: (_rule: any, value: any, callback: any) => {
|
|
|
+ if (!value) {
|
|
|
+ callback(new Error('请输入电话'));
|
|
|
+ } else if (!/^1[3-9]\d{9}$/.test(value)) {
|
|
|
+ callback(new Error('请输入有效的11位手机号'));
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
],
|
|
|
projectManagerPhone2: [
|
|
|
- { required: true, message: '请输入电话', trigger: 'blur' },
|
|
|
- {
|
|
|
- validator: (_rule: any, value: any, callback: any) => {
|
|
|
- if (!value) {
|
|
|
- callback(new Error('请输入电话'));
|
|
|
- } else if (!/^1[3-9]\d{9}$/.test(value)) {
|
|
|
- callback(new Error('请输入有效的11位手机号'));
|
|
|
- } else {
|
|
|
- callback();
|
|
|
- }
|
|
|
- },
|
|
|
- trigger: 'blur'
|
|
|
- }
|
|
|
+ { required: true, message: '请输入电话', trigger: 'blur' },
|
|
|
+ {
|
|
|
+ validator: (_rule: any, value: any, callback: any) => {
|
|
|
+ if (!value) {
|
|
|
+ callback(new Error('请输入电话'));
|
|
|
+ } else if (!/^1[3-9]\d{9}$/.test(value)) {
|
|
|
+ callback(new Error('请输入有效的11位手机号'));
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
],
|
|
|
siteSafetyManagerName: [{ required: true, message: '请输入安全负责人', trigger: 'blur' }],
|
|
|
siteSafetyPhone1: [
|
|
|
- { required: true, message: '请输入电话', trigger: 'blur' },
|
|
|
- {
|
|
|
- validator: (_rule: any, value: any, callback: any) => {
|
|
|
- if (!value) {
|
|
|
- callback(new Error('请输入电话'));
|
|
|
- } else if (!/^1[3-9]\d{9}$/.test(value)) {
|
|
|
- callback(new Error('请输入有效的11位手机号'));
|
|
|
- } else {
|
|
|
- callback();
|
|
|
- }
|
|
|
- },
|
|
|
- trigger: 'blur'
|
|
|
- }
|
|
|
+ { required: true, message: '请输入电话', trigger: 'blur' },
|
|
|
+ {
|
|
|
+ validator: (_rule: any, value: any, callback: any) => {
|
|
|
+ if (!value) {
|
|
|
+ callback(new Error('请输入电话'));
|
|
|
+ } else if (!/^1[3-9]\d{9}$/.test(value)) {
|
|
|
+ callback(new Error('请输入有效的11位手机号'));
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
],
|
|
|
siteSafetyPhone2: [
|
|
|
- { required: true, message: '请输入电话', trigger: 'blur' },
|
|
|
- {
|
|
|
- validator: (_rule: any, value: any, callback: any) => {
|
|
|
- if (!value) {
|
|
|
- callback(new Error('请输入电话'));
|
|
|
- } else if (!/^1[3-9]\d{9}$/.test(value)) {
|
|
|
- callback(new Error('请输入有效的11位手机号'));
|
|
|
- } else {
|
|
|
- callback();
|
|
|
- }
|
|
|
- },
|
|
|
- trigger: 'blur'
|
|
|
- }
|
|
|
+ { required: true, message: '请输入电话', trigger: 'blur' },
|
|
|
+ {
|
|
|
+ validator: (_rule: any, value: any, callback: any) => {
|
|
|
+ if (!value) {
|
|
|
+ callback(new Error('请输入电话'));
|
|
|
+ } else if (!/^1[3-9]\d{9}$/.test(value)) {
|
|
|
+ callback(new Error('请输入有效的11位手机号'));
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
],
|
|
|
projectStartTime: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
|
|
|
projectEndTime: [
|
|
|
@@ -321,10 +371,72 @@
|
|
|
constructionContent: [{ required: true, message: '请输入简述', trigger: 'blur' }],
|
|
|
templateId: [{ required: true, message: '请选择审批流程', trigger: 'change' }],
|
|
|
...Object.fromEntries(
|
|
|
- attachmentConfigs.map((a) => [a.prop, [{ required: true, message: `请上传${a.label}`, trigger: 'change' }]]),
|
|
|
+ attachmentConfigs.map((a) => [
|
|
|
+ a.prop,
|
|
|
+ [{ required: a.required, message: `请上传${a.label}`, trigger: 'change' }],
|
|
|
+ ]),
|
|
|
),
|
|
|
});
|
|
|
|
|
|
+ // 下载模版
|
|
|
+ const templateDownload = (item) => {
|
|
|
+ const baseUrl = './skyeye-file-upload/sfysecurity/TEMPLATE/';
|
|
|
+
|
|
|
+ switch (item.prop) {
|
|
|
+ case 'personnelIdAttachment':
|
|
|
+ downloadFile('./skyeye-file-upload/sfysecurity/TEMPLATE/施工证申请表.doc', item.label);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'safetyCommitmentAttachment':
|
|
|
+ downloadFile('./skyeye-file-upload/sfysecurity/TEMPLATE/施工证申请表.doc', item.label);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'safetyEducationAttachment':
|
|
|
+ downloadFile('./skyeye-file-upload/sfysecurity/TEMPLATE/施工证申请表.doc', item.label);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'safetyAgreementAttachment':
|
|
|
+ downloadFile('./skyeye-file-upload/sfysecurity/TEMPLATE/施工证申请表.doc', item.label);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'environmentCommitmentAttachment':
|
|
|
+ downloadFile('./skyeye-file-upload/sfysecurity/TEMPLATE/施工证申请表.doc', item.label);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'safetyNoticeAttachment':
|
|
|
+ downloadFile('./skyeye-file-upload/sfysecurity/TEMPLATE/施工证申请表.doc', item.label);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'fireManagementAttachment':
|
|
|
+ downloadFile('./skyeye-file-upload/sfysecurity/TEMPLATE/施工证申请表.doc', item.label);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'constructionPlanAttachment':
|
|
|
+ downloadFile('./skyeye-file-upload/sfysecurity/TEMPLATE/施工证申请表.doc', item.label);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'ppeListAttachment':
|
|
|
+ downloadFile('./skyeye-file-upload/sfysecurity/TEMPLATE/施工证申请表.doc', item.label);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'equipmentListAttachment':
|
|
|
+ downloadFile('./skyeye-file-upload/sfysecurity/TEMPLATE/施工证申请表.doc', item.label);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'specialWorkerCertAttachment':
|
|
|
+ downloadFile('./skyeye-file-upload/sfysecurity/TEMPLATE/施工证申请表.doc', item.label);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'specialEquipmentCertAttachment':
|
|
|
+ downloadFile('./skyeye-file-upload/sfysecurity/TEMPLATE/施工证申请表.doc', item.label);
|
|
|
+ break;
|
|
|
+
|
|
|
+ // 无匹配时提示
|
|
|
+ default:
|
|
|
+ ElMessage.warning('该附件暂无模板可下载');
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
/**
|
|
|
* 统一保存逻辑
|
|
|
* @param status 0-保存草稿(通常不强校验附件),1-提交申请(强制校验)
|
|
|
@@ -371,9 +483,9 @@
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- .label{
|
|
|
- :deep(.el-form-item__label){
|
|
|
- line-height: 26px;
|
|
|
+ .label {
|
|
|
+ :deep(.el-form-item__label) {
|
|
|
+ line-height: 26px;
|
|
|
}
|
|
|
}
|
|
|
</style>
|