2023-08-30 14:14:15 +08:00

453 lines
14 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>
<div class="table-box">
<ProTable
ref="proTable"
title="验收计划"
:columns="columns"
:requestApi="getTableList"
:dataCallback="dataCallback"
:tool-button="false"
:pagination="true"
background
:isShowSearch="false"
:onReset="true"
>
<template #formButton="scope">
<el-button class="addButtonStyle" @click="handleEditItem(1)">新增</el-button>
</template>
<template #operation="{ row }">
<el-button type="primary" link @click="downloadTemp(row)">
<img src="@/assets/images/tableIcon/下载附件.png" alt="" class="configureIcon" />
<span>资料下载</span>
</el-button>
<el-button type="primary" link @click="handleEditItem(2, row)">
<img src="@/assets/images/tableIcon/updateIcon.png" alt="" class="configureIcon" />
<span>编辑</span>
</el-button>
<el-button type="danger" link :icon="Delete" @click="handleDeleteItem(row)">删除</el-button>
</template>
<template #examineState="{ row }">
{{ row.examineState === 1 ? "待审核" : row.examineState === 2 ? "审核驳回" : "审核通过" }}
</template>
<template #state="{ row }">
<span>{{ row.state == 1 ? "已验收" : "未验收" }}</span>
</template>
</ProTable>
</div>
<!-- 新增验收计划 -->
<el-dialog class="imgDialog" :title="newTitle" width="40%" v-model="planVisible" show-close>
<el-form class="diaForm" :model="planFormData" :rules="rules" ref="ruleFormRef" label-width="160px">
<el-form-item label="验收阶段:" prop="stage">
<el-input v-model="planFormData.stage" placeholder="请输入" />
</el-form-item>
<el-form-item label="类型:" prop="type">
<el-select style="width: 100%" v-model="planFormData.type" clearable placeholder="请选择">
<el-option v-for="item in typeList" :key="item.dictLabel" :label="item.dictValue" :value="item.dictLabel" />
</el-select>
</el-form-item>
<el-form-item label="单体工程:" prop="singleId">
<el-select style="width: 100%" v-model="planFormData.singleId" clearable placeholder="请选择">
<el-option v-for="item in singleEngineerList" :key="item.singleId" :label="item.name" :value="item.singleId" />
</el-select>
</el-form-item>
<el-form-item label="计划验收日期:" prop="planCheckDate">
<el-date-picker
style="width: 100%"
v-model="planFormData.planCheckDate"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
placeholder="请选择时间"
/>
</el-form-item>
<el-form-item label="起始标识:" prop="startFlag">
<el-input v-model="planFormData.startFlag" placeholder="请输入" />
</el-form-item>
<el-form-item label="截止标识:" prop="endFlag">
<el-input v-model="planFormData.endFlag" placeholder="请输入" />
</el-form-item>
<el-form-item label="验收负责人:" prop="headPerson">
<el-input v-model="planFormData.headPerson" placeholder="请输入" />
</el-form-item>
<el-form-item label="负责人电话:" prop="headPersonPhone">
<el-input v-model="planFormData.headPersonPhone" placeholder="请输入" />
</el-form-item>
<el-form-item label="状态:" prop="state">
<el-radio-group v-model="planFormData.state">
<el-radio label="1" size="large">已验收</el-radio>
<el-radio label="0" size="large">未验收</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="实际验收完成日期:" prop="completeDate" v-if="planFormData.state == 1">
<el-date-picker
style="width: 100%"
v-model="planFormData.completeDate"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="date"
placeholder="请选择时间"
/>
</el-form-item>
<el-form-item label="验收资料:" prop="fileUrl">
<el-upload
ref="upload"
:headers="headers"
:file-list="fileList1"
class="upload-demo"
:action="`${baseUrl}` + '/xmgl/file/upload'"
:on-remove="onRemove"
multiple
:limit="1"
:on-success="uploadSuccess"
style="width: 100%"
>
<el-button class="uploadBtn" type="primary">点击上传</el-button>
</el-upload>
</el-form-item>
<el-form-item label="备注:" prop="remark">
<el-input v-model="planFormData.remark" placeholder="请输入" />
</el-form-item>
</el-form>
<template #footer>
<el-button class="cancelButtonStyle" @click="planVisible = false">取消</el-button>
<el-button type="primary" @click="confirm(ruleFormRef)">保存</el-button>
</template>
</el-dialog>
<engineeringEngDrawer v-model="engVisable" :active="activeValue" ref="engDrawer" :engList="engList" @select="tabsSelect">
<template #default="{ data }">
<span style="margin-left: 10px" @click="onUpdate(data)">{{
activeValue == "eng" ? data.engineeringName : data.projectName
}}</span>
</template>
</engineeringEngDrawer>
<allEngineering @click="engVisable = true" />
</template>
<script setup lang="tsx" name="acceptancePlan">
import { ref, reactive, nextTick, onMounted } from "vue";
import { ElMessage, ElMessageBox, UploadProps } from "element-plus";
import type { FormInstance } from "element-plus";
import { ColumnProps } from "@/components/ProTable/interface";
import { Delete } from "@element-plus/icons-vue";
import { jxj_User } from "@/api/types";
import { GlobalStore } from "@/stores";
import { useHandleData } from "@/hooks/useHandleData";
import ProTable from "@/components/ProTable/index.vue";
import {
acceptancePlanPage,
acceptancePlanAdd,
acceptancePlanEdit,
acceptancePlanDelete,
getEngineeringName
} from "@/api/modules/project";
import { getRelevanceList, singleEngineer } from "@/api/modules/common";
import engineeringEngDrawer from "@/components/engineeringEngDrawer/index.vue";
import allEngineering from "@/components/allEngineering/index.vue";
import { getDicList } from "@/api/modules/jxjview";
const typeList = ref([]);
const rules = ref({
stage: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
type: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
singleId: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
planCheckDate: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
startFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
endFlag: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
headPerson: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
headPersonPhone: [
{
required: true,
message: "请输入",
trigger: "blur"
},
{
pattern: /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/,
message: "请输入合法手机号",
trigger: "blur"
}
],
state: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
completeDate: [
{
required: true,
message: "请选择",
trigger: "change"
}
]
});
const singleEngineerList = ref([]);
const ruleFormRef = ref();
const baseUrl = import.meta.env.VITE_API_URL;
const fileList1 = ref([]);
const globalStore = GlobalStore();
const headers = ref({ Authorization: "Bearer " + globalStore.token });
const planFormData = ref({
stage: "",
type: "",
singleId: "",
planCheckDate: null,
startFlag: "",
endFlag: "",
headPerson: "",
headPersonPhone: "",
state: "1",
completeDate: null,
fileUrl: "",
remark: ""
});
const planVisible = ref(false);
const newTitle = ref("新增验收计划");
const visible = ref(false);
const isOpen = ref(false);
const activeValue = ref("eng");
const engList = ref([]);
const engVisable = ref(false);
const searchSn = ref("");
const title = ref("");
// 获取 ProTable 元素,调用其获取刷新数据方法(还能获取到当前查询参数,方便导出携带参数)
const proTable = ref();
const engDrawer = ref();
// 表格配置项
const columns: ColumnProps[] = [
{ type: "index", label: "序号", width: 80 },
// 多级 prop
{ prop: "stage", label: "验收阶段", search: { el: "input" } },
{ prop: "typeName", label: "类型" },
{ prop: "singleProject", label: "单体工程" },
{ prop: "planCheckDate", label: "计划验收日期", width: 150 },
{ prop: "startFlag", label: "起始标识" },
{ prop: "endFlag", label: "截止标识" },
{ prop: "headPerson", label: "验收负责人" },
{ prop: "headPersonPhone", label: "负责人电话" },
{ prop: "state", label: "状态" },
{ prop: "completeDate", label: "实际验收完成日期", width: 150 },
{ prop: "remark", label: "备注" },
{ prop: "operation", width: 240, label: "操作", fixed: "right" }
];
const getDicMainList = async () => {
// 获取学历字典
const { result } = await getDicList({ dictType: "check_accept_type" });
typeList.value.length = 0;
typeList.value.push(...result);
};
// 确定按钮触发
const confirm = async (formEl: FormInstance | undefined) => {
if (!formEl) return;
await formEl.validate(async (valid, fields) => {
if (valid) {
planFormData.value.engineeringSn = searchSn.value;
planFormData.value.fileUrl = planFormData.value.fileUrl ? JSON.stringify(planFormData.value.fileUrl) : "";
if (planFormData.value.state == "0") {
planFormData.value.completeDate = null;
}
if (planFormData.value.id) {
const res = await acceptancePlanEdit({ ...planFormData.value });
ElMessage.success("编辑成功");
} else {
const res = await acceptancePlanAdd({ ...planFormData.value });
ElMessage.success("新增成功");
}
proTable.value.getTableList();
planVisible.value = false;
} else {
ElMessage({
showClose: true,
message: "请完善表单信息!",
type: "error"
});
}
});
};
const onRemove: UploadProps["onRemove"] = (file, uploadFiles) => {
planFormData.value.fileUrl = "";
fileList1.value = reactive([]);
};
const uploadSuccess = (response: any) => {
// ElMessage.success("上传成功");
planFormData.value.fileUrl = { name: response.result.originalFilename, url: response.result.url };
fileList1.value = [{ name: response.result.originalFilename, url: response.result.downloadPath }];
};
// 下载
const downloadTemp = (row: any) => {
if (row.fileUrl) {
window.open(baseUrl + "/xmgl/file/preview?fileUrl=" + JSON.parse(row.fileUrl).url);
} else {
ElMessage.error("暂无可下载文件");
}
};
// dataCallback 是对于返回的表格数据做处理,如果你后台返回的数据不是 list && total && pageNum && pageSize 这些字段,那么你可以在这里进行处理成这些字段
// 或者直接去 hooks/useTable.ts 文件中把字段改为你后端对应的就行
const dataCallback = (data: any) => {
// console.log(data);
return {
list: data.records,
total: Number(data.total),
pageNo: Number(data.current),
pageSize: Number(data.size)
};
};
// 如果你想在请求之前对当前请求参数做一些操作可以自定义如下函数params 为当前所有的请求参数(包括分页),最后返回请求列表接口
// 默认不做操作就直接在 ProTable 组件上绑定 :requestApi="getUserList"
const getTableList = (params: any) => {
let newParams = JSON.parse(JSON.stringify(params));
if (searchSn.value) {
if (activeValue.value == "eng") {
newParams.engineeringSn = searchSn.value;
} else if (activeValue.value == "project") {
newParams.projectSn = searchSn.value;
}
} else {
return { result: { current: "1", pages: "1", records: [], size: "10", total: "0" } };
}
return acceptancePlanPage(newParams);
};
// 修改数据按钮
const handleEditItem = async (index: number, row: any) => {
if (index === 1) {
newTitle.value = "新增验收计划";
planFormData.value = reactive({
stage: "",
type: "",
singleId: "",
planCheckDate: null,
startFlag: "",
endFlag: "",
headPerson: "",
headPersonPhone: "",
state: "1",
completeDate: null,
fileUrl: "",
remark: ""
});
fileList1.value = [];
} else {
newTitle.value = "编辑验收计划";
planFormData.value = reactive({ ...row });
if (row.fileUrl) {
planFormData.value.fileUrl = JSON.parse(row.fileUrl);
}
fileList1.value = row.fileUrl ? [{ ...JSON.parse(row.fileUrl) }] : [];
}
planVisible.value = true;
setTimeout(function () {
ruleFormRef.value.clearValidate();
}, 50);
};
// 删除用户信息
const handleDeleteItem = async (params: jxj_User.ResUserList) => {
await useHandleData(acceptancePlanDelete, { id: params.id }, `删除【${params.stage}`);
proTable.value.getTableList();
};
const getSingleEngineerData = async () => {
const res = await singleEngineer({ engineeringSn: searchSn.value });
singleEngineerList.value = res.result;
console.log(res);
};
// 抽屉tab选择时
const tabsSelect = val => {
activeValue.value = val;
if (val == "eng") {
getengineering();
} else if (val == "project") {
getProject();
}
};
// 获取项目信息
const getProject = async () => {
const res = await getEngineeringName();
engList.value = [res.result];
if (res.result) {
searchSn.value = res.result.projectSn;
}
getSingleEngineerData();
proTable.value.getTableList();
console.log(res);
};
// 获取工程信息
const getengineering = async () => {
// let newParams = JSON.parse(JSON.stringify(params));
const res = await getRelevanceList();
engList.value = res.result;
if (res.result && res.result.length > 0) {
searchSn.value = res.result[0].engineeringSn;
}
getSingleEngineerData();
proTable.value.getTableList();
console.log(res);
};
// 点击抽屉的工程名称更新页面
const onUpdate = async row => {
if (activeValue.value == "eng") {
searchSn.value = row.engineeringSn;
} else if (activeValue.value == "project") {
searchSn.value = row.projectSn;
}
getSingleEngineerData();
proTable.value.getTableList();
ElMessage.success("页面已更新");
};
onMounted(async () => {
getengineering();
getDicMainList();
});
</script>
<style lang="scss" scoped>
@import "./index.scss";
</style>