2023-09-13 11:47:55 +08:00

818 lines
22 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<el-dialog width="80%" v-model="visible" :show-close="false">
<template #title>
<div class="title-detail">
<!-- <img src="@/assets/images/tableIcon/look.png" alt="" /> -->
<span>{{ newTitle }}</span>
<el-icon>
<close @click="closeMain" />
</el-icon>
</div>
</template>
<div>
<el-tabs v-model="activeName" type="card" class="demo-tabs">
<el-tab-pane label="工程概况" name="first">
<h4 class="littleTitle">基本信息</h4>
<div class="overview">
<el-form ref="formRef" :model="formData" label-width="180px" :rules="rules" class="basic-form" size="default">
<!-- <el-form ref="formDataRef" :model="formData" label-width="150px" class="basic-form"> -->
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="设备类型:" prop="type">
<el-select
v-model="formData.type"
:disabled="newTitle == '查看设备'"
placeholder="请选择"
style="width: 100%"
>
<el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否外地设备:" prop="nonlocal">
<el-radio-group placeholder="请选择" v-model="formData.nonlocal">
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="编号性质:" prop="theNature">
<el-select
v-model="formData.theNature"
:disabled="newTitle == '查看设备'"
placeholder="请选择"
style="width: 100%"
>
<el-option v-for="item in propertyList" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否全新设备:" prop="newEquipment">
<el-radio-group placeholder="请选择" v-model="formData.newEquipment">
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="规格型号:" prop="model">
<el-input v-model="formData.model" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="许可证发证机关:" prop="licensingAuthority">
<el-input v-model="formData.licensingAuthority" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="出厂(合格证):" prop="certificateApproval">
<el-input v-model="formData.certificateApproval" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工作幅度(m):" prop="workingRange">
<el-input v-model="formData.workingRange" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="最大额定起重量(kg):" prop="maximumWeight">
<el-input v-model="formData.maximumWeight" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="独立起升高度(m):" prop="hoistingHeight">
<el-input v-model="formData.hoistingHeight" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="购置日期:" prop="purchaseDate">
<el-date-picker
:disabled="newTitle == '查看设备'"
style="width: 100%"
v-model="formData.purchaseDate"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
placeholder="请选择时间"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="编号有效期:" prop="timeLimit">
<el-date-picker
:disabled="newTitle == '查看设备'"
style="width: 100%"
v-model="formData.timeLimit"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
placeholder="请选择时间"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="设备原值:" prop="theInitial">
<el-input v-model.number="formData.theInitial" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备改造次数:" prop="equipmentNumber">
<el-input v-model.number="formData.equipmentNumber" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="发票编码:" prop="serialNumber">
<el-input v-model="formData.serialNumber" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="购买合同编码:" prop="contractNo">
<el-input v-model="formData.contractNo" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="生产厂家:" prop="manufacturer">
<el-input v-model="formData.manufacturer" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出厂日期:" prop="manufactureDate">
<el-date-picker
:disabled="newTitle == '查看设备'"
style="width: 100%"
v-model="formData.manufactureDate"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
placeholder="请选择时间"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="制造许可证编号:" prop="manufacturingLicense">
<el-input v-model="formData.manufacturingLicense" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否为原购产品:" prop="theShipper">
<el-radio-group placeholder="请选择" v-model="formData.theShipper">
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120">
<el-col :span="12">
<el-form-item label="设备用途:" prop="equipmentUseType">
<el-select
v-model="formData.equipmentUseType"
:disabled="newTitle == '查看设备'"
placeholder="请选择"
style="width: 100%"
>
<el-option v-for="item in useList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="黑匣子信息:" prop="blackBox">
<el-input v-model="formData.blackBox" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120" v-if="formData.type == 1">
<el-col :span="12">
<el-form-item label="前臂永久性标识:" prop="towerPermanentForearm">
<el-input v-model="formData.towerPermanentForearm" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="后臂永久性标识:" prop="towerPermanentHindArm">
<el-input v-model="formData.towerPermanentHindArm" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120" v-if="formData.type == 1">
<el-col :span="12">
<el-form-item label="塔帽永久性标识:" prop="towerPermanentCap">
<el-input v-model="formData.towerPermanentCap" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="上转台永久性标识:" prop="towerPermanentSuperior">
<el-input v-model="formData.towerPermanentSuperior" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="120" v-if="formData.type == 1">
<el-col :span="12">
<el-form-item label="下转台永久性标识:" prop="towerPermanentDown">
<el-input v-model="formData.towerPermanentDown" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="标准节点永久性标识:" prop="towerPermanentStandard">
<el-input v-model="formData.towerPermanentStandard" placeholder="请输入" :disabled="newTitle == '查看设备'" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</el-tab-pane>
<el-tab-pane label="附件信息" name="second">
<h4 class="littleTitle">附件信息</h4>
<div style="width: 90%; margin: 0 auto">
<el-table
:data="documentData"
class="el-table"
:header-cell-style="{ backgroundColor: '#f5f7fa', textAlign: 'center' }"
:cell-style="{ textAlign: 'center' }"
>
<el-table-column type="index" label="序号" width="200" />
<el-table-column prop="dictValue" label="附件名称" />
<el-table-column label="操作" width="200">
<template #default="{ row, $index }">
<el-button type="primary" @click="onUpload(row, $index)" link>上传附件</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-tab-pane>
</el-tabs>
</div>
<template #footer>
<el-button class="cancelButtonStyle" @click="visible = false">取消</el-button>
<el-button type="primary" @click="submitForm(formRef)">保存</el-button>
</template>
</el-dialog>
<el-dialog v-model="dialogVisible" title="查看附件" width="30%" show-close>
<el-table
:data="documentData"
border
class="el-table"
:header-cell-style="{ backgroundColor: '#f5f7fa', textAlign: 'center' }"
:cell-style="{ textAlign: 'center' }"
>
<el-table-column prop="fileName" label="文件名称" />
<el-table-column label="操作" width="200">
<template #default="{ row }">
<el-button type="primary" link size="small" @click="onDowmload(row)">下载</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="dialogVisible = false"> 关闭 </el-button>
</span>
</template>
</el-dialog>
<!-- 附件上传 -->
<FilesUploadPlus v-model="showFilesUpload" @update:files="handlechange" :files="current.files" :reset="true" />
</template>
<script lang="ts" setup name="addHoistMachinery">
import { ref, watch, onMounted } from "vue";
import { getDicList, exportApp } from "@/api/modules/jxjview";
import { ElMessage, ElMessageBox } from "element-plus";
import { useDownload } from "@/hooks/useDownload";
import type { FormInstance } from "element-plus";
import { hoistEquipAdd } from "@/api/modules/enterpriseApi";
import FilesUploadPlus from "@/components/FilesUploadPlus/FilesUpload.vue";
const props = defineProps({
addDialog: Boolean,
newTitle: String
});
const emits = defineEmits(["update:addDialog", "confirm"]);
const documentData = ref<any>([]);
const documentDataIndex = ref(0);
const current = ref({
files: []
});
const showFilesUpload = ref(false);
const useList = ref([
{ label: "自用", value: 1 },
{ label: "租赁", value: 2 }
]);
const typeList = ref([]);
const propertyList = ref([
{ label: "长期", value: 1 },
{ label: "临时", value: 2 }
]);
const dialogVisible = ref(false);
const annexFiles = ref([]);
const formRef = ref();
const visible = ref(false);
const activeName = ref("first");
const rules = ref({
type: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
nonlocal: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
theNature: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
newEquipment: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
model: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
licensingAuthority: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
certificateApproval: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
workingRange: [
{
required: true,
message: "请输入",
trigger: "blur"
},
{
pattern: /^\d+(\.\d{0,2})?$/,
message: "请输入整数或小数点后两位小数",
trigger: "blur"
}
],
maximumWeight: [
{
required: true,
message: "请输入",
trigger: "blur"
},
{
pattern: /^\d+(\.\d{0,2})?$/,
message: "请输入整数或小数点后两位小数",
trigger: "blur"
}
],
hoistingHeight: [
{
required: true,
message: "请输入",
trigger: "blur"
},
{
pattern: /^\d+(\.\d{0,2})?$/,
message: "请输入整数或小数点后两位小数",
trigger: "blur"
}
],
purchaseDate: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
timeLimit: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
theInitial: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
equipmentNumber: [
{
required: true,
message: "请输入",
trigger: "blur"
},
{
pattern: /^[0-9]+$/,
message: "请输入整数",
trigger: "blur"
}
],
serialNumber: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
contractNo: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
manufacturer: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
manufactureDate: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
manufacturingLicense: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
theShipper: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
equipmentUseType: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
blackBox: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
towerPermanentForearm: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
towerPermanentHindArm: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
towerPermanentCap: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
towerPermanentSuperior: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
towerPermanentDown: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
towerPermanentStandard: [
{
required: true,
message: "请输入",
trigger: "blur"
}
]
});
const formData = ref({
type: null,
nonlocal: 0,
theNature: null,
newEquipment: 0,
model: "",
licensingAuthority: "",
certificateApproval: "",
workingRange: "",
maximumWeight: "",
hoistingHeight: "",
purchaseDate: null,
timeLimit: null,
theInitial: "",
equipmentNumber: "",
serialNumber: "",
contractNo: "",
manufacturer: "",
manufactureDate: null,
manufacturingLicense: "",
theShipper: 0,
equipmentUseType: null,
blackBox: "",
towerPermanentForearm: "",
towerPermanentHindArm: "",
towerPermanentCap: "",
towerPermanentSuperior: "",
towerPermanentDown: "",
towerPermanentStandard: ""
});
const handlechange = e => {
console.log(e);
current.value.files = e.map(item => {
item.label = current.value.dictLabel;
return item;
});
documentData.value[documentDataIndex.value].fileList = current.value.files;
};
// 上传附件按钮
const onUpload = async (row: any, index: any) => {
console.log(row);
showFilesUpload.value = true;
documentDataIndex.value = index;
if (row.fileList.length > 0) {
let arr: any = [];
row.fileList.map(item => {
if (item.response) {
arr.push({
response: { ...item.response, url: item.response.url },
name: item.response.originalFilename,
url: item.response.url,
size: +item.response.size,
type: item.response.contentType
});
} else {
arr.push({
response: { ...item, url: item.fileUrl },
name: item.fileName,
url: item.fileUrl,
size: +item.fileSize,
type: item.contentType
});
}
delete item.response;
});
current.value.files = arr;
console.log(current.value.files);
} else {
current.value.files = [];
}
};
const getTypeDicMainList = async () => {
// 获取起重机械设备类型字典
const { result } = await getDicList({ dictType: "hoist_equip_type" });
if (result.length > 0) {
let arr: any = [];
result.map(item => {
arr.push({
label: item.dictValue,
value: item.dictLabel
});
});
typeList.value.length = 0;
typeList.value.push(...arr);
}
};
const onDowmload = row => {
ElMessageBox.confirm("确认下载数据?", "温馨提示", { type: "warning" }).then(() =>
useDownload(exportApp, `${row.fileName}`, { fileUrl: row.fileUrl })
);
};
// 附件信息的查看点击
const onAppendix = row => {
dialogVisible.value = true;
// current.value = form.value.annexFiles.filter(item => item.label == row.dictLabel);
};
// 提交整改情况
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return;
await formEl.validate(async (valid, fields) => {
if (valid) {
console.log(formData.value);
console.log(documentData.value);
let requestData = {
...formData.value,
annexFiles: [] as any
};
documentData.value.map(item => {
if (item.fileList && item.fileList.length > 0) {
item.fileList.map(item2 => {
requestData.annexFiles.push({
createTime: item2.response.createTime,
extendName: item2.response.ext,
fileId: item2.response.id,
fileName: item2.response.originalFilename,
fileSize: item2.response.size,
fileUrl: item2.response.url,
contentType: item2.response.contentType,
label: item.dictLabel
});
});
}
});
if (formData.value.id) {
const res = await hoistEquipAdd({ ...formData.value });
ElMessage.success("编辑成功");
} else {
const res = await hoistEquipAdd(requestData);
ElMessage.success("新增成功");
}
emits("confirm");
visible.value = false;
} else {
ElMessage({
showClose: true,
message: "请完善表单信息!",
type: "error"
});
}
});
};
// 关闭两个对话框
const closeMain = () => {
visible.value = false;
};
const getAnnexDicMainList = async () => {
// 起重机械设备附件字典
const res = await getDicList({ dictType: "equip_attachment_name" });
documentData.value = res.result.map(item => ({ ...item, fileList: [] }));
};
// 监听父组件的visible用来简介控制el-dialog的弹框开关一般是用于开
watch(
() => props.addDialog,
(n, o) => {
visible.value = n;
if (n) {
formRef.value?.resetFields();
formData.value = {
type: null,
nonlocal: 0,
theNature: null,
newEquipment: 0,
model: "",
licensingAuthority: "",
certificateApproval: "",
workingRange: "",
maximumWeight: "",
hoistingHeight: "",
purchaseDate: null,
timeLimit: null,
theInitial: "",
equipmentNumber: "",
serialNumber: "",
contractNo: "",
manufacturer: "",
manufactureDate: null,
manufacturingLicense: "",
theShipper: 0,
equipmentUseType: null,
blackBox: "",
towerPermanentForearm: "",
towerPermanentHindArm: "",
towerPermanentCap: "",
towerPermanentSuperior: "",
towerPermanentDown: "",
towerPermanentStandard: ""
};
activeName.value = "first";
getAnnexDicMainList();
}
}
);
// 监听el-dialog显示状态再通过@update:visible 通知父组件,一般是用于关
watch(visible, (n, o) => {
emits("update:addDialog", n);
});
onMounted(async () => {
await getTypeDicMainList();
await getAnnexDicMainList();
});
</script>
<style scoped lang="scss">
@mixin flex {
display: flex;
align-items: center;
}
.title-detail {
@include flex;
border-left: 4px solid #008bff;
padding-left: 6px;
// > img {
// width: 16px;
// height: 18px;
// }
> span {
font-size: 18px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #333333;
margin-left: 5px;
margin-right: auto;
}
:deep(.el-icon) {
cursor: pointer;
color: #a8abb2;
}
}
.littleTitle {
margin-top: 23px;
margin-bottom: 35px;
border-left: 3px solid #008bff;
padding-left: 6px;
}
:deep(.el-tabs--card > .el-tabs__header) {
border-bottom: none;
}
:deep(.el-tabs--card > .el-tabs__header .el-tabs__nav) {
// width: 600px;
border: none;
}
:deep(.el-tabs__nav-scroll) {
display: flex;
justify-content: center;
.el-tabs__item {
width: 220px;
text-align: center;
// background: #fff;
color: #333;
border: 1px solid #aeaeae;
// border-radius: 8px;
}
.el-tabs__item.is-active {
background-color: #008bff;
border: 1px solid #008bff;
color: #fff;
}
}
:deep(#tab-first) {
border-radius: 4px 0 0 4px;
border-left: 1px solid #aeaeae;
}
:deep(#tab-second) {
border-radius: 0 4px 4px 0;
}
</style>