2023-07-31 17:04:53 +08:00

801 lines
19 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="overview"> -->
<el-dialog class="overview" v-if="visible1" :show-close="false" v-model="visible1" width="90%" @close="visible1 = false">
<template #title>
<div class="title-detail">
<img src="@/assets/images/tableIcon/look.png" alt="" />
<span>查看详情</span>
<el-icon>
<close @click="visible1 = false" />
</el-icon>
</div>
</template>
<div class="detail-table">
<div class="button-title">
<el-button class="btnStyle" @click="openAdd">新增</el-button>
<el-button class="btnStyle" @click="submitCount">提交</el-button>
</div>
<div class="table">
<el-table
:data="recordData"
class="el-table"
:span-method="arraySpanMethod"
:row-style="{ height: '40px' }"
:header-cell-style="{ height: '40px' }"
:cell-style="{ height: '40px' }"
>
<el-table-column type="index" label="序号" width="80"> </el-table-column>
<el-table-column prop="reportContent" label="汇报内容" align="left"> </el-table-column>
<el-table-column prop="totalAmount" label="总工程造价(元)">
<template #default="scope">
<el-input
disabled
v-if="scope.row.symbolSum && countData"
v-model.number="countData[scope.row.key]"
placeholder="请输入"
></el-input>
</template>
</el-table-column>
<el-table-column prop="completeAmount" label="本期完成工程造价(元)" width="220"> </el-table-column>
<el-table-column prop="lastEndAmount" label="至上期末完成工程造价(元)" width="260"> </el-table-column>
<el-table-column prop="nowEndAmount" label="至本期末完成工程造价(元)" width="260"> </el-table-column>
<!-- <el-table-column prop="scheduleRatio" label="本期完成形象进度(%)" width="200"> </el-table-column>
<el-table-column prop="completeScheduleRatio" label="至本期末完成形象进度(%)" width="220"> </el-table-column> -->
<el-table-column align="left" label="操作">
<template #default="scope">
<el-button type="primary" v-if="scope.row.id" link @click="handleEditItem(scope.row)">
<img src="@/assets/images/tableIcon/updateIcon.png" alt="" class="configureIcon" />
<span>查看</span>
</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>
</div>
<div class="operation-btn" v-if="basicData?.state != 4">
<!-- <el-button type="info" style="margin-right: 98px">驳回,请尽快整改</el-button>
<el-button type="primary">整改完成,全部合格</el-button> -->
<!-- <el-button class="btnStyle" type="primary" @click="allSubmit">全部整改完成,提交审核</el-button> -->
</div>
</div>
</el-dialog>
<el-dialog v-model="auditVisible" width="80%">
<div class="sub-table">
<div class="button-optoion">
<el-button class="btnStyle" @click="openAdd2">新增</el-button>
</div>
<el-table
:data="recordItemData"
class="el-table"
height="100%"
:row-style="{ height: '40px' }"
:header-cell-style="{ textAlign: 'center', height: '40px' }"
:cell-style="{ textAlign: 'center', height: '40px' }"
row-key="id"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
>
<el-table-column type="index" label="序号" width="80"> </el-table-column>
<el-table-column prop="name" label="项目名称" />
<el-table-column prop="unit" label="单位" />
<el-table-column label="合同">
<el-table-column prop="contractQuantity" label="工程量"> </el-table-column>
<el-table-column prop="contractUnitPrice" label="单价(元)"> </el-table-column>
<el-table-column prop="contractAmount" label="金额(元)"> </el-table-column>
</el-table-column>
<el-table-column label="至上期末完成">
<el-table-column prop="lastQuantity" label="工程量"> </el-table-column>
<el-table-column prop="lastAmount" label="金额(元)"> </el-table-column>
</el-table-column>
<el-table-column label="本期完成">
<el-table-column prop="nowQuantity" label="工程量"> </el-table-column>
<el-table-column prop="nowAmount" label="金额(元)"> </el-table-column>
</el-table-column>
<el-table-column label="截至本期末累计完成">
<el-table-column prop="endQuantity" label="工程量"> </el-table-column>
<el-table-column prop="endAmount" label="金额(元)"> </el-table-column>
</el-table-column>
<el-table-column prop="remark" label="备注"> </el-table-column>
<el-table-column align="left" label="操作">
<template #default="scope">
<el-button v-if="scope.row.parentId == 0" type="primary" link :icon="CirclePlus" @click="openAdd2(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>
</div>
</el-dialog>
<DialogForm
title="新增"
:formConfig="formConfig"
:formData="formData"
v-model:visible="addVisible"
append-to-body
width="40%"
@confirm="saveItem"
>
</DialogForm>
<DialogForm
title="新增"
:formConfig="formConfig2"
:formData="formData2"
v-model:visible="addVisible2"
append-to-body
width="40%"
@confirm="saveItem2"
>
</DialogForm>
<!-- </div> -->
</template>
<script lang="ts" setup>
import { onMounted, ref, watch, reactive } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import type { FormInstance, UploadProps } from "element-plus";
import { relativeInfo, timeLineData, submitReform, submitAll } from "@/api/modules/project";
import { payGovermentSubItemList, payGovermentSubItemCount, payGovermentSubItemDetail } from "@/api/modules/huizhou";
import { CirclePlus } from "@element-plus/icons-vue";
import DialogForm from "@/components/DialogForm/index.vue";
const addVisible = ref(false);
const addVisible2 = ref(false);
// 弹窗中的配置
const formConfig = {
formItemConfig: [
{
label: "汇报内容",
prop: "reportContent",
type: "input"
},
{
label: "总工程造价(元)",
prop: "totalAmount",
type: "input"
},
{
label: "本期完成工程造价(元)",
prop: "completeAmount",
type: "input"
},
{
label: "至上期末完成工程造价(元)",
prop: "lastEndAmount",
type: "input"
},
{
label: "至本期末完成工程造价(元)",
prop: "nowEndAmount",
type: "input"
}
// {
// label: "本期完成形象进度(%)",
// prop: "scheduleRatio",
// type: "input"
// },
// {
// label: "至本期末完成形象进度(%)",
// prop: "completeScheduleRatio",
// type: "input"
// }
],
rules: {
reportContent: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
totalAmount: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
completeAmount: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
lastEndAmount: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
nowEndAmount: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
scheduleRatio: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
completeScheduleRatio: [
{
required: true,
message: "请选择",
trigger: "change"
}
]
}
};
const formConfig2 = {
formItemConfig: [
{
label: "项目名称",
prop: "name",
type: "input"
},
{
label: "单位",
prop: "unit",
type: "input"
},
{
label: "合同工程量",
prop: "contractQuantity",
type: "input"
},
{
label: "合同单价(元)",
prop: "contractUnitPrice",
type: "input"
},
{
label: "合同金额(元)",
prop: "contractAmount",
type: "input"
},
{
label: "至上期末完成工程量",
prop: "lastQuantity",
type: "input"
},
{
label: "至上期末完成金额(元)",
prop: "lastAmount",
type: "input"
},
{
label: "本期完成工程量",
prop: "nowQuantity",
type: "input"
},
{
label: "本期完成金额(元)",
prop: "nowAmount",
type: "input"
},
{
label: "截至本期末完成工程量",
prop: "endQuantity",
type: "input"
},
{
label: "截至本期末完成金额(元)",
prop: "endAmount",
type: "input"
},
{
label: "备注",
prop: "remark",
type: "input"
}
],
rules: {
name: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
unit: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
contractQuantity: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
contractUnitPrice: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
contractAmount: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
lastQuantity: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
lastAmount: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
nowQuantity: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
nowAmount: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
endQuantity: [
{
required: true,
message: "请输入",
trigger: "blur"
}
],
endAmount: [
{
required: true,
message: "请输入",
trigger: "blur"
}
]
}
};
const formData = ref({
reportContent: "",
totalAmount: "",
completeAmount: "",
lastEndAmount: "",
nowEndAmount: "",
scheduleRatio: "",
completeScheduleRatio: ""
});
const formData2 = ref({
projectName: "",
unit: "",
contractQuantity: "",
contractUnitPrice: "",
contractAmount: "",
lastQuantity: "",
lastAmount: "",
nowQuantity: "",
nowAmount: "",
endQuantity: "",
endAmount: "",
remark: ""
});
const baseUrl = import.meta.env.VITE_API_URL;
const props = defineProps({
detailsDialog: Boolean,
relativeId: String
});
const emits = defineEmits(["update:detailsDialog", "confirm"]);
const visible1 = ref(false);
const transformDialog = ref(false); // 整改记录对话框
const recordData = ref([]); // 整改记录表格数据
const recordItemData = ref([]); // 整改记录表格数据
const recordRowData = ref(); // 整改记录表格行数据
const basicData = ref(); // 基础信息
const symbolArr = ref([]); // 子项数据
const countData = ref([]); // 统计数据
const applyTimeArr = ref([]); // 申报时段列表
const rowDetailId = ref("");
const detailsData = ref({});
const openAdd = () => {
formData.value = reactive({
reportContent: "",
totalAmount: "",
completeAmount: "",
lastEndAmount: "",
nowEndAmount: "",
scheduleRatio: "",
completeScheduleRatio: ""
});
addVisible.value = true;
};
const openAdd2 = (row: object) => {
if (row) {
detailsData.value = reactive({
...row
});
} else {
detailsData.value = reactive({});
}
formData2.value = reactive({
projectName: "",
unit: "",
contractQuantity: "",
contractUnitPrice: "",
contractAmount: "",
lastQuantity: "",
lastAmount: "",
nowQuantity: "",
nowAmount: "",
endQuantity: "",
endAmount: "",
remark: ""
});
addVisible2.value = true;
};
const submitCount = async () => {
// 数据提交
console.log(countData.value);
console.log(recordData.value);
let isAdd = true;
for (let i in countData.value) {
if (i == "constructionCost" || i == "payment" || i == "advanceCharge" || i == "unPayment" || i == "applyPayment") {
if (countData.value[i] || countData.value[i] != 0) {
isAdd = false;
break;
}
}
}
if (isAdd) {
const res = await payCountAdd(countData.value);
ElMessage.success("新增成功");
getSubItemList();
} else {
const res = await payCountEdit(countData.value);
ElMessage.success("编辑成功");
getSubItemList();
}
};
// 新增,编辑数据
const saveItem = async (form: any) => {
let requestData = {
investmentApplyId: props.relativeId,
...form
};
const res = await paySubItemAdd(requestData);
getSubItemList();
ElMessage.success("新增成功");
addVisible.value = false;
};
const saveItem2 = async (form: any) => {
let requestData = {
...form,
parentId: detailsData.value.id,
itemId: rowDetailId.value
};
const res = await subItemDetailAdd(requestData);
getSubDetailList(rowDetailId.value);
ElMessage.success("新增成功");
addVisible2.value = false;
};
const getSubItemList = async () => {
const res = await payGovermentSubItemList({ investmentApplyId: props.relativeId });
const res2 = await payGovermentSubItemCount({ investmentApplyId: props.relativeId });
console.log(res, "-----子项数据");
console.log(res2, "-----子项统计数据");
symbolArr.value = JSON.parse(JSON.stringify(res.result));
if (res2.result) {
countData.value = JSON.parse(JSON.stringify(res2.result));
} else {
countData.value = reactive({
constructionCost: 0,
payment: 0,
advanceCharge: 0,
unPayment: 0,
applyPayment: 0,
scheduleRatio: 0,
completeScheduleRatio: 0
});
}
if (!res.result || res.result.length == 0) {
recordData.value = [];
return;
}
let sumRowData = {
// 自定义表格合计行
reportContent: "合计:",
totalAmount: 0,
completeAmount: 0,
lastEndAmount: 0,
nowEndAmount: 0,
scheduleRatio: 0,
completeScheduleRatio: 0
};
let responseArr = [];
// 自定义表格统计行
let responseArr2 = [
{
reportContent: "合计:本期完成含税造价",
amount: res2.result ? +res2.result.constructionCost : 0,
key: "constructionCost",
symbolSum: true
},
{
reportContent: "按合同约定进度款按每月实际完成工程造价的80支付1180",
amount: res2.result ? +res2.result.payment : 0,
key: "payment",
symbolSum: true
},
{
reportContent: "预付款依据合同要求当工程款含预付款达到合同价的50时开始对预付款进行一次性抵扣。",
amount: res2.result ? +res2.result.advanceCharge : 0,
key: "advanceCharge",
symbolSum: true
},
{
reportContent: "上期未支付工程款为",
amount: res2.result ? +res2.result.unPayment : 0,
key: "unPayment",
symbolSum: true
},
{
reportContent: "本期实际申请拨付的进度款",
amount: res2.result ? +res2.result.applyPayment : 0,
key: "applyPayment",
symbolSum: true
}
];
if (res.result) {
responseArr = res.result;
responseArr.map(item => {
if (item.totalAmount) {
sumRowData.totalAmount += item.totalAmount;
}
if (item.completeAmount) {
sumRowData.completeAmount += +item.completeAmount;
}
if (item.lastEndAmount) {
sumRowData.lastEndAmount += +item.lastEndAmount;
}
if (item.nowEndAmount) {
sumRowData.nowEndAmount += +item.nowEndAmount;
}
if (item.scheduleRatio) {
sumRowData.scheduleRatio += +item.scheduleRatio;
}
if (item.completeScheduleRatio) {
sumRowData.completeScheduleRatio += +item.completeScheduleRatio;
}
});
responseArr.push(sumRowData);
responseArr2.map(item => {
responseArr.push(item);
});
console.log(responseArr, "--------总计");
recordData.value = responseArr;
}
};
const arraySpanMethod = ({ row, column, rowIndex, columnIndex }) => {
console.log(symbolArr.value.length);
if (rowIndex > symbolArr.value.length) {
if (columnIndex === 1) {
return [1, 5];
} else if (columnIndex > 2) {
return [0, 0];
}
}
};
// 修改数据按钮
const handleEditItem = async (row: any) => {
console.log(row);
rowDetailId.value = row.id;
getSubDetailList(row.id);
auditVisible.value = true;
};
const getSubDetailList = async (id: any) => {
const res = await payGovermentSubItemDetail({ itemId: id });
if (res) {
recordItemData.value = res.result.records;
}
console.log(res, "-------子项详细数据");
};
// 全部整改完成,提交
const allSubmit = async () => {
const res = await submitAll({ id: basicData.value.id });
ElMessage.success("提交成功");
};
const auditVisible = ref(false);
// 监听父组件的visible用来简介控制el-dialog的弹框开关一般是用于开
watch(
() => props.detailsDialog,
(n, o) => {
visible1.value = n;
if (n) {
getSubItemList();
} else {
emits("confirm");
}
}
);
// 监听el-dialog显示状态再通过@update:visible 通知父组件,一般是用于关
watch(visible1, (n, o) => {
emits("update:detailsDialog", n);
});
onMounted(() => {});
</script>
<style lang="scss" scoped>
@mixin fullwidth {
width: -webkit-fill-available;
width: -moz-available;
width: stretch;
}
@mixin flex {
display: flex;
align-items: center;
}
@mixin title {
font-size: 20px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: var(--el-menu-text-color);
border-left: 2px solid #008bff;
padding-left: 5px;
}
.overview {
// background-color: #fff;
:deep(.el-dialog) {
position: relative;
background-color: rgba(9, 64, 95, 0.85);
}
.title-detail {
@include flex;
> img {
width: 16px;
height: 18px;
}
> span {
font-size: 22px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: var(--el-menu-text-color);
margin-left: 5px;
margin-right: auto;
}
:deep(.el-icon) {
cursor: pointer;
color: #a8abb2;
}
}
.detail-table {
height: 411px;
.button-title {
@include flex;
}
.table {
height: 310px;
margin-top: 20px;
:deep(.el-table) {
height: 100%;
}
}
.operation-btn {
display: flex;
align-items: center;
justify-content: center;
margin-top: 20px;
}
}
}
.sub-table {
height: 391px;
.button-optoion {
margin-bottom: 20px;
}
}
.test :deep(.el-input__wrapper) {
box-shadow: 0 0 0 0;
}
.test :deep(.el-input__inner) {
text-align: center;
}
:deep(.el-table__empty-text) {
min-height: 200px;
display: flex;
justify-content: center;
align-items: center;
}
:deep() {
td.el-table__cell {
background-color: transparent !important;
border-bottom: 0 !important;
color: var(--el-menu-text-color);
font-size: 20px !important;
border-right: 2px solid #252526;
}
th.el-table__cell {
background-color: transparent;
border-bottom: 0 !important;
border-right: 2px solid #252526;
}
.el-table__inner-wrapper::before {
height: 0px;
}
.el-table--border::before {
width: 0px;
}
.el-table--border .el-table__inner-wrapper::after {
height: 0px;
}
.el-table--border::after {
width: 0px;
}
.el-table__border-left-patch {
width: 0;
}
.el-input__wrapper,
.el-textarea__inner,
.el-input.is-disabled .el-input__wrapper {
background-color: transparent;
box-shadow: 0 0 0 1px #087ba4 inset;
}
.el-input__inner,
.el-textarea__inner,
.el-range-input {
color: var(--el-menu-text-color);
font-size: 20px;
}
.el-form-item__label {
width: 230px !important;
}
}
</style>