550 lines
16 KiB
Vue
Raw Normal View History

2023-06-19 15:32:07 +08:00
<template>
<div class="table-box">
2023-07-01 21:49:51 +08:00
<div class="search-select">
<el-card shadow="never" class="topCard">
<span style="margin: 0 10px 2px 20px">工程名称</span>
<el-input style="width: 200px" v-model="searchForm.name" clearable placeholder="请输入" />
<span style="margin: 0 10px 2px 10px">状态</span>
<el-select style="width: 200px" v-model="searchForm.state" clearable placeholder="请选择">
<el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<span style="margin: 0 10px 2px 20px">提交时间</span>
<el-date-picker
v-model="searchForm.timeRange"
style="width: 300px"
type="daterange"
range-separator="至"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</el-date-picker>
<el-button type="primary" style="margin-left: 20px" @click="getDataList()">查询</el-button>
<el-button type="primary" style="margin-left: 20px" @click="handleAddItem()">新增</el-button>
2023-07-09 21:47:26 +08:00
<el-upload
accept=".mpp"
:headers="headers"
:action="`${baseUrl}` + '/project/projectSubItem/importMpp'"
:on-success="uploadFileSuccess"
multiple
:limit="1"
style="margin-left: 20px"
:show-file-list="false"
>
<el-button type="primary">导入</el-button>
</el-upload>
2023-07-01 21:49:51 +08:00
</el-card>
</div>
<div class="statistics-table">
<el-table
:data="tableData"
style="width: 100%; flex: 1"
row-key="id"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
>
2023-07-02 13:36:27 +08:00
<el-table-column align="left" prop="name" label="分部分项工程名称"></el-table-column>
2023-07-01 21:49:51 +08:00
<el-table-column align="center" prop="planStartTime" label="计划开始日期"></el-table-column>
<el-table-column align="center" prop="planEndTime" label="截止完成日期"></el-table-column>
<el-table-column align="center" prop="realEndTime" label="实际完成日期"></el-table-column>
<el-table-column align="center" prop="commander" label="负责人"></el-table-column>
<el-table-column align="center" prop="completeRatio" label="完成比率(%)"></el-table-column>
<el-table-column align="center" label="状态">
<template #default="scope">
<span>{{
scope.row.state == 1
? "未开始"
: scope.row.state == 2
2023-07-27 13:38:45 +08:00
? "推进中"
2023-07-01 21:49:51 +08:00
: scope.row.state == 3
2023-07-27 13:38:45 +08:00
? "按期完成"
2023-07-01 21:49:51 +08:00
: scope.row.state == 4
2023-07-27 13:38:45 +08:00
? "临期"
2023-07-24 10:00:48 +08:00
: scope.row.state == 5
2023-07-27 13:38:45 +08:00
? "超期"
2023-07-24 10:00:48 +08:00
: scope.row.state == 6
2023-07-27 13:38:45 +08:00
? "逾期完成"
: scope.row.state == 7
? "暂停"
2023-07-24 10:00:48 +08:00
: ""
2023-07-01 21:49:51 +08:00
}}</span>
</template>
</el-table-column>
<el-table-column align="center" width="300" label="操作">
<template #default="scope">
<el-button v-if="scope.row.parentId == 0" type="primary" link :icon="CirclePlus" @click="handleAddSubItem(scope.row)"
>子分项</el-button
>
<el-button type="primary" link @click="handleEditItem(scope.row)">
<img src="@/assets/images/tableIcon/updateIcon.png" alt="" class="configureIcon" />
<span>编辑</span>
</el-button>
<el-button type="primary" link :icon="Delete" @click="handleDeleteItem(scope.row)">删除</el-button>
</template>
</el-table-column>
<template #empty>
<div class="table-empty">
<slot name="empty">
<img src="@/assets/images/notData.png" alt="notData" />
<div>暂无数据</div>
</slot>
</div>
</template>
</el-table>
<Pagination :pageable="pageable" :handleSizeChange="handleSizeChange" :handleCurrentChange="handleCurrentChange" />
</div>
2023-06-19 15:32:07 +08:00
<changeTheme />
<!-- 新增子分部分项 -->
2023-07-01 21:49:51 +08:00
<el-dialog class="imgDialog" :title="newTitle" width="40%" v-model="childrenVisible" show-close>
2023-06-19 15:32:07 +08:00
<el-form class="diaForm" :rules="rules" :model="childrenFormData" ref="ruleFormRef" label-width="160px">
2023-07-02 11:50:09 +08:00
<el-form-item v-if="newTitle == '新增子项'" label="父分部分项名称:">
2023-07-01 21:49:51 +08:00
<el-input disabled :value="parentObj.name" placeholder="请输入" />
</el-form-item>
<el-form-item label="分部分项名称:" prop="name">
2023-06-19 15:32:07 +08:00
<el-input v-model="childrenFormData.name" placeholder="请输入" />
</el-form-item>
2023-07-01 21:49:51 +08:00
<el-form-item label="施工位置:" prop="buildAddress">
<el-input v-model="childrenFormData.buildAddress" placeholder="请输入" />
</el-form-item>
<el-form-item label="单位:" prop="unit">
<el-input v-model="childrenFormData.unit" placeholder="请输入" />
</el-form-item>
<el-form-item label="工作量:" prop="workload">
<el-input v-model="childrenFormData.workload" placeholder="请输入" />
</el-form-item>
<el-form-item label="完成比率:" prop="completeRatio">
<el-input v-model="childrenFormData.completeRatio" placeholder="请输入" />
</el-form-item>
<el-form-item label="任务描述:" prop="taskDesc">
<el-input v-model="childrenFormData.taskDesc" type="textarea" :rows="3" placeholder="请输入" />
</el-form-item>
<el-form-item label="状态:" prop="state">
<el-select style="width: 100%" v-model="childrenFormData.state" clearable placeholder="请选择">
<el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="预计开始日期:" prop="planStartTime">
2023-06-19 15:32:07 +08:00
<el-date-picker
style="width: 100%"
2023-07-01 21:49:51 +08:00
v-model="childrenFormData.planStartTime"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
2023-06-19 15:32:07 +08:00
type="datetime"
placeholder="请选择时间"
/>
</el-form-item>
2023-07-01 21:49:51 +08:00
<el-form-item label="预计完成日期:" prop="planEndTime">
<el-date-picker
style="width: 100%"
v-model="childrenFormData.planEndTime"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="datetime"
placeholder="请选择时间"
/>
</el-form-item>
2023-07-18 17:50:14 +08:00
<el-form-item label="实际完成日期:" prop="realEndTime">
<el-date-picker
style="width: 100%"
v-model="childrenFormData.realEndTime"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="datetime"
placeholder="请选择时间"
/>
</el-form-item>
2023-07-01 21:49:51 +08:00
<el-form-item label="重要程度:" prop="importance">
<el-input v-model="childrenFormData.importance" placeholder="请输入" />
2023-06-19 15:32:07 +08:00
</el-form-item>
2023-07-01 21:49:51 +08:00
<el-form-item label="负责人:" prop="commander">
<el-input v-model="childrenFormData.commander" placeholder="请输入" />
</el-form-item>
2023-07-05 20:59:40 +08:00
<el-form-item label="逾期问题描述:" prop="overdueIssueDesc">
<el-input v-model="childrenFormData.overdueIssueDesc" placeholder="请输入" />
</el-form-item>
<el-form-item label="整改期限:" prop="deadline">
<el-date-picker
style="width: 100%"
v-model="childrenFormData.deadline"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
type="datetime"
placeholder="请选择时间"
/>
</el-form-item>
<el-form-item label="逾期文件说明:" prop="overdueIssueFile">
<el-upload
ref="upload1"
:headers="headers"
:file-list="fileList1"
class="upload-demo"
:action="`${baseUrl}` + '/xmgl/file/upload'"
:on-remove="onRemove1"
multiple
:limit="1"
:on-success="uploadSuccess1"
style="width: 100%"
>
<el-button class="uploadBtn" type="primary">点击上传</el-button>
</el-upload>
</el-form-item>
2023-07-01 21:49:51 +08:00
<el-form-item label="附件:" prop="annexFile">
2023-06-19 15:32:07 +08:00
<el-upload
ref="upload"
:headers="headers"
:file-list="fileList"
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>
<template #footer>
<div>
2023-07-18 17:50:14 +08:00
<el-button class="hzCancelStyle" @click="childrenVisible = false">取消</el-button>
2023-07-27 16:05:49 +08:00
<el-button class="hzStyle" type="primary" @click="childrenConfirm(ruleFormRef, childrenFormData)"> 保存 </el-button>
2023-06-19 15:32:07 +08:00
</div>
</template>
</el-dialog>
</div>
</template>
<script setup lang="tsx" name="ProjectSupervisionRecord">
2023-07-01 21:49:51 +08:00
import { ref, reactive, nextTick, onMounted } from "vue";
import { Delete, CirclePlus } from "@element-plus/icons-vue";
2023-06-19 15:32:07 +08:00
import { ElMessage, ElMessageBox, UploadProps } from "element-plus";
import { useRouter } from "vue-router";
import { ColumnProps } from "@/components/ProTable/interface";
import changeTheme from "@/components/changeTheme/index.vue";
2023-07-01 21:49:51 +08:00
import { addBigItem, updateBigItem, bigItemList, deleteBigItem } from "@/api/modules/huizhou";
2023-06-19 15:32:07 +08:00
import { GlobalStore } from "@/stores";
import type { FormRules, FormInstance, UploadInstance } from "element-plus";
2023-07-01 21:49:51 +08:00
import Pagination from "@/components/ProTable/components/Pagination.vue";
import { jxj_User } from "@/api/types";
import { useHandleData } from "@/hooks/useHandleData";
const parentObj = ref({
name: ""
});
const statusList = ref([
{ label: "未开始", value: 1 },
2023-07-27 13:38:45 +08:00
{ label: "推进中", value: 2 },
{ label: "按期完成", value: 3 },
{ label: "临期", value: 4 },
{ label: "超期", value: 5 },
{ label: "逾期完成", value: 6 },
{ label: "暂停", value: 7 }
2023-07-01 21:49:51 +08:00
]);
const pageable = ref({
pageNo: 1,
pageSize: 12,
total: 0
});
const tableData = ref([]);
const searchForm = ref({
name: "",
state: null,
realEndTime_begin: "",
realEndTime_end: "",
timeRange: []
});
2023-06-19 15:32:07 +08:00
const globalStore = GlobalStore();
const baseUrl = import.meta.env.VITE_API_URL;
2023-07-05 20:59:40 +08:00
const fileList1 = ref([]);
2023-06-19 15:32:07 +08:00
const fileList = ref([]);
const headers = ref({ Authorization: "Bearer " + globalStore.token });
const ruleFormRef = ref<FormInstance>();
2023-07-01 21:49:51 +08:00
const newTitle = ref("新增");
2023-06-19 15:32:07 +08:00
const rules = reactive<FormRules>({
name: {
required: true,
message: "请输入",
trigger: "blur"
}
});
const childrenVisible = ref(false);
const router = useRouter();
const childrenFormData = ref({
2023-07-01 21:49:51 +08:00
name: "",
buildAddress: "",
workload: "",
unit: "",
taskDesc: "",
planStartTime: "",
planEndTime: "",
2023-07-18 17:50:14 +08:00
realEndTime: "",
2023-07-01 21:49:51 +08:00
importance: "",
commander: "",
2023-07-05 20:59:40 +08:00
overdueIssueDesc: "",
deadline: "",
overdueIssueFile: "",
2023-07-01 21:49:51 +08:00
annexFile: "",
completeRatio: "",
state: null
2023-06-19 15:32:07 +08:00
});
// 获取 ProTable 元素,调用其获取刷新数据方法(还能获取到当前查询参数,方便导出携带参数)
const proTable = ref();
const getId = ref<number | undefined>(undefined);
2023-07-01 21:49:51 +08:00
// 删除用户信息
const handleDeleteItem = async (params: jxj_User.ResUserList) => {
await useHandleData(deleteBigItem, { id: params.id }, `删除【${params.name}`);
getDataList();
};
const handleSizeChange = (val: any) => {
pageable.value.pageNo = 1;
pageable.value.pageSize = val;
getDataList();
};
const handleCurrentChange = (val: any) => {
pageable.value.pageNo = val;
getDataList();
};
const getDataList = async () => {
console.log(searchForm.value);
let requestData = {
...searchForm.value,
realEndTime_begin: searchForm.value.timeRange[0],
realEndTime_end: searchForm.value.timeRange[1],
pageNo: pageable.value.pageNo,
pageSize: pageable.value.pageSize
};
delete requestData.timeRange;
const res = await bigItemList(requestData);
if (res) {
tableData.value = res.result.records;
pageable.value = reactive({
pageNo: +res.result.current,
pageSize: +res.result.size,
total: +res.result.total
});
}
console.log(res);
};
2023-06-19 15:32:07 +08:00
const childrenConfirm = async (formEl: FormInstance | undefined, form: any) => {
// 标记表单校验
if (!formEl) return;
await formEl.validate(async (valid, fields) => {
if (valid) {
2023-07-01 21:49:51 +08:00
if (form.id) {
if (newTitle.value == "编辑子项") {
2023-07-02 11:50:09 +08:00
form.parentId = parentObj.value.parentId;
2023-07-01 21:49:51 +08:00
}
const res = await updateBigItem(form);
ElMessage.success("编辑成功");
childrenVisible.value = false;
} else {
if (newTitle.value == "新增子项") {
form.parentId = parentObj.value.id;
}
const res = await addBigItem(form);
ElMessage.success("保存成功");
childrenVisible.value = false;
}
getDataList();
2023-06-19 15:32:07 +08:00
} else {
console.log("error submit!", fields);
ElMessage({
showClose: true,
message: "请完善表单信息!",
type: "error"
});
}
});
};
2023-07-09 21:47:26 +08:00
// 导入文件
const uploadFileSuccess = (response: any) => {
console.log(response);
if (response.result) {
getDataList();
}
};
2023-07-05 20:59:40 +08:00
const uploadSuccess1 = (response: any) => {
ElMessage.success("上传成功");
childrenFormData.value.overdueIssueFile = response.result.url;
fileList1.value = [{ name: response.result.originalFilename, url: response.result.downloadPath }];
};
2023-06-19 15:32:07 +08:00
const uploadSuccess = (response: any) => {
ElMessage.success("上传成功");
2023-07-01 21:49:51 +08:00
childrenFormData.value.annexFile = response.result.url;
fileList.value = [{ name: response.result.originalFilename, url: response.result.downloadPath }];
2023-06-19 15:32:07 +08:00
};
2023-07-05 20:59:40 +08:00
const onRemove1: UploadProps["onRemove"] = (file, uploadFiles) => {
childrenFormData.value.overdueIssueFile = "";
fileList1.value = reactive([]);
};
2023-06-19 15:32:07 +08:00
const onRemove: UploadProps["onRemove"] = (file, uploadFiles) => {
2023-07-01 21:49:51 +08:00
childrenFormData.value.annexFile = "";
2023-06-19 15:32:07 +08:00
fileList.value = reactive([]);
};
2023-07-01 21:49:51 +08:00
const handleAddSubItem = (row: any) => {
parentObj.value = row;
childrenFormData.value = reactive({
name: "",
buildAddress: "",
workload: "",
unit: "",
taskDesc: "",
planStartTime: "",
planEndTime: "",
importance: "",
commander: "",
2023-07-05 20:59:40 +08:00
overdueIssueDesc: "",
deadline: "",
overdueIssueFile: "",
2023-07-01 21:49:51 +08:00
annexFile: "",
completeRatio: "",
state: null
});
2023-07-02 11:50:09 +08:00
console.log(parentObj.value);
2023-07-01 21:49:51 +08:00
newTitle.value = "新增子项";
fileList.value = reactive([]);
2023-07-05 20:59:40 +08:00
fileList1.value = reactive([]);
2023-07-01 21:49:51 +08:00
childrenVisible.value = true;
2023-06-19 15:32:07 +08:00
};
2023-07-09 21:47:26 +08:00
const importData = () => {};
2023-07-01 21:49:51 +08:00
const handleAddItem = () => {
childrenFormData.value = reactive({
name: "",
buildAddress: "",
workload: "",
unit: "",
taskDesc: "",
planStartTime: "",
planEndTime: "",
importance: "",
commander: "",
2023-07-05 20:59:40 +08:00
overdueIssueDesc: "",
deadline: "",
overdueIssueFile: "",
2023-07-01 21:49:51 +08:00
annexFile: "",
completeRatio: "",
state: null
});
newTitle.value = "新增";
fileList.value = reactive([]);
2023-07-05 20:59:40 +08:00
fileList1.value = reactive([]);
2023-07-01 21:49:51 +08:00
childrenVisible.value = true;
2023-06-19 15:32:07 +08:00
};
// 修改数据按钮
const handleEditItem = async (row: any) => {
2023-07-01 21:49:51 +08:00
console.log(row);
parentObj.value = row;
if (row.parentId != 0) {
newTitle.value = "编辑子项";
} else {
newTitle.value = "编辑";
}
childrenFormData.value = { ...row };
fileList.value = [{ name: "文件", url: row.annexFile }];
2023-07-05 20:59:40 +08:00
fileList1.value = [{ name: "文件", url: row.overdueIssueFile }];
2023-07-01 21:49:51 +08:00
childrenVisible.value = true;
2023-06-19 15:32:07 +08:00
};
2023-07-01 21:49:51 +08:00
onMounted(() => {
getDataList();
});
2023-06-19 15:32:07 +08:00
</script>
<style scoped lang="scss">
.table-box {
2023-07-01 11:18:42 +08:00
height: 100%;
2023-06-19 15:32:07 +08:00
position: relative;
2023-07-01 21:49:51 +08:00
.search-select {
box-shadow: none;
:deep() {
.el-card {
border-radius: 8px;
width: 100%;
background-color: var(--el-menu-bg-color);
}
}
.topCard {
display: flex;
align-items: center;
:deep(.el-card__body) {
display: flex;
align-items: center;
}
span {
color: var(--el-menu-text-color);
}
}
}
.statistics-table {
height: calc(100% - 100px);
background-color: var(--el-menu-bg-color);
box-shadow: none;
margin-top: 20px;
padding-bottom: 20px;
border-radius: 8px;
padding: 20px;
display: flex;
flex-direction: column;
position: relative;
}
2023-06-19 15:32:07 +08:00
.imgDialog {
.uploadBtn {
color: white;
2023-07-14 17:54:21 +08:00
font-size: 20px;
2023-06-19 15:32:07 +08:00
border: 1px solid #087ba4;
background: #087ba4;
}
}
}
2023-07-01 21:49:51 +08:00
:deep(.el-input-number) {
width: 100%;
.el-input-number__increase {
background-color: #09405f;
color: #3f6ab0;
2023-07-14 17:54:21 +08:00
font-size: 20px;
2023-07-01 21:49:51 +08:00
border: 0 !important;
border-bottom: 1px solid #087ba4 !important;
border-left: 1px solid #087ba4 !important;
}
.el-input-number__decrease {
background-color: #09405f;
color: #3f6ab0;
2023-07-14 17:54:21 +08:00
font-size: 20px;
2023-07-01 21:49:51 +08:00
border: 0 !important;
border-top: 1px solid #087ba4 !important;
border-left: 1px solid #087ba4 !important;
}
.el-icon {
2023-07-14 17:54:21 +08:00
font-size: 24px;
2023-07-01 21:49:51 +08:00
}
}
:deep() {
.el-form-item__label {
color: var(--el-menu-text-color);
}
.el-input__wrapper,
.el-textarea__inner,
.el-input.is-disabled .el-input__wrapper {
background-color: transparent;
box-shadow: 0 0 0 1px var(--el-color-primary) inset;
}
.el-input__inner,
.el-textarea__inner,
.el-range-input {
color: var(--el-menu-text-color);
2023-07-14 17:54:21 +08:00
font-size: 20px;
2023-07-01 21:49:51 +08:00
}
.el-range-separator {
color: var(--el-menu-text-color);
}
.el-pager li.is-active {
background-color: var(--el-color-primary);
color: var(--el-color-white);
}
.el-table__expand-icon > .el-icon {
2023-07-14 17:54:21 +08:00
font-size: 18px;
2023-07-01 21:49:51 +08:00
color: var(--el-menu-text-color);
}
}
2023-06-19 15:32:07 +08:00
</style>