Files
guoxue-admin/src/views/tower/contract/components/contract-settle.vue
T
b2894lxlx 14cbb87311 新增历史结算;
新增租单管理
2023-06-13 01:44:18 +08:00

449 lines
14 KiB
Vue

<!-- 用户编辑弹窗 -->
<template>
<ele-modal
:width="'90%'"
:visible="visible"
:confirm-loading="loading"
:maskClosable="false"
:maxable="maxable"
:title="'合同结算设置'"
:body-style="{ paddingBottom: '8px' }"
@update:visible="updateVisible"
@ok="save"
>
<a-form
:label-col="{ md: { span: 6 }, sm: { span: 20 }, xs: { span: 24 } }"
:wrapper-col="{ md: { span: 24 }, sm: { span: 20 }, xs: { span: 24 } }"
>
<a-row :gutter="16">
<a-col :span="12">
<a-form-item label="结算方式">
<a-select placeholder="必选项" style="width: 250px" size="small"
v-model:value="contract.settleMethod">
<a-select-option v-for="(item, index) in ContractSettleMethod" :key="index" :value="index">
{{ item }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12" v-if="[0, 3].indexOf(contract.settleMethod) > -1">
<span>每月</span>
<a-select placeholder="必选项" style="width: 250px" size="small"
v-model:value="contract.extendMonthDate">
<a-select-option v-for="item in dateList" :key="item" :value="item">
{{ item }}
</a-select-option>
</a-select>
<span>号</span>
<span class="ml-05">至下月</span>
<span class="ml-05" v-if="contract.extendMonthDate">{{ contract.extendMonthDate - 1 }}号</span>
</a-col>
</a-row>
<a-tabs v-model:activeKey="activeKey">
<a-tab-pane :key="0" tab="结算规则设置">
<template #default>
<a-button type="primary" @click.native="showSelectEquip = true">添加结算设备</a-button>
<a-table ref="contractEquipmentSettleTableRef"
row-key="contractSettleId" :dataSource="settleEquipmentList" :columns="equipmentColumns">
<template #bodyCell="{ column, record, index }">
<template v-if="column.key === 'rentMonth'">
<a-input v-model:value="record.rentMonth" type="number" />
</template>
<template v-if="column.key === 'rentAmount'">
<a-input v-model:value="record.rentAmount" type="number" />
</template>
<template v-if="column.key === 'rentAmountSum'">
<span>{{ record.rentMonth * record.rentAmount }}</span>
</template>
<template v-if="column.key === 'inOutAmount'">
<a-input v-model:value="record.inOutAmount" type="number" />
</template>
<template v-if="column.key === 'workerAmount'">
<a-input v-model:value="record.workerAmount" type="number" />
</template>
<template v-if="column.key === 'workerAmountSum'">
<span>{{ record.rentMonth * record.workerAmount }}</span>
</template>
<template v-if="column.key === 'otherAmount'">
<a-input v-model:value="record.otherAmount" type="number" />
</template>
<template v-if="column.key === 'remark'">
<a-input v-model:value="record.remark" />
</template>
<template v-if="column.key === 'action'">
<div class="flex justify-center items-center">
<close-circle-outlined style="font-size: 1.5rem; color: pink;cursor: pointer"
@click.native="delEquipment(index)" />
</div>
</template>
</template>
<template #summary>
<a-table-summary-row>
<a-table-summary-cell>合计</a-table-summary-cell>
<a-table-summary-cell />
<a-table-summary-cell />
<a-table-summary-cell />
<a-table-summary-cell />
<a-table-summary-cell />
<a-table-summary-cell />
<a-table-summary-cell>
{{ totals.rentAmountSum }}
</a-table-summary-cell>
<a-table-summary-cell />
<a-table-summary-cell />
<a-table-summary-cell>
{{ totals.workerAmountSum }}
</a-table-summary-cell>
<a-table-summary-cell />
<a-table-summary-cell />
</a-table-summary-row>
</template>
</a-table>
</template>
</a-tab-pane>
<a-tab-pane :key="1" tab="结算周期设置">
<template #default>
<a-button type="primary" @click.native="addRule">新增</a-button>
<a-table ref="contractRuleSettleTableRef"
row-key="contractSettleId" :dataSource="settleRuleList" :columns="ruleColumns">
<template #bodyCell="{ column, record, index }">
<template v-if="column.key === 'startDate'">
<a-date-picker
class="ele-fluid"
placeholder="请选择开始日期"
v-model:value="record.startDate"
valueFormat="YYYY-MM-DD"
/>
</template>
<template v-if="column.key === 'endDate'">
<a-date-picker
class="ele-fluid"
placeholder="请选择结束日期"
v-model:value="record.endDate"
valueFormat="YYYY-MM-DD"
/>
</template>
<template v-if="column.key === 'action'">
<div class="flex justify-center items-center">
<close-circle-outlined style="font-size: 1.5rem; color: pink;cursor: pointer"
@click.native="delRule(index)" />
</div>
</template>
</template>
</a-table>
</template>
</a-tab-pane>
</a-tabs>
</a-form>
</ele-modal>
<SelectData
v-model:visible="showSelectEquip"
:data="null"
title="选择设备"
@done="onSelectEquip"
/>
</template>
<script lang="ts" setup>
import { ref, reactive, watch, computed } from "vue";
import { Form, message } from "ant-design-vue";
import { assignObject, EleProTable } from "ele-admin-pro";
import { useUserStore } from "@/store/modules/user";
import { Contract, ContractSettleMethod } from "@/api/tower/contract/model";
import dayjs from "dayjs";
import {
PlusOutlined,
UnorderedListOutlined,
CloseCircleOutlined
} from "@ant-design/icons-vue";
import { TowerModel } from "@/api/tower/model/model";
import { listTowerModel } from "@/api/tower/model";
import { ContractSettleEquipment } from "@/api/tower/contractSettle/equipment/model";
import { ColumnItem } from "ele-admin-pro/es/ele-pro-table/types";
import SelectData from "@/components/TowerEquipmentModel/components/select-data.vue";
import { ContractSettleRule } from "@/api/tower/contractSettle/rule/model";
import { updateContract } from "@/api/tower/contract";
import { addBatchContractSettleEquipment, listContractSettleEquipment } from "@/api/tower/contractSettle/equipment";
import { addBatchContractSettleRule, listContractSettleRule } from "@/api/tower/contractSettle/rule";
const userStore = useUserStore();
// 当前用户信息
const loginUser = computed(() => userStore.info ?? {});
const now = dayjs().format("YYYY-MM-DD HH:mm:ss");
const dateList = ref<number[]>([]);
const activeKey = ref(0);
// 是否是修改
const isUpdate = ref(false);
const useForm = Form.useForm;
const props = defineProps<{
// 弹窗是否打开
visible: boolean;
// 修改回显的数据
data?: Contract | null;
}>();
const emit = defineEmits<{
(e: "done"): void;
(e: "update:visible", visible: boolean): void;
}>();
// 提交状态
const loading = ref(false);
// 是否显示最大化切换按钮
const maxable = ref(true);
const showSelectEquip = ref<Boolean>(false);
const onSelectEquip = data => {
addEquipment(data);
};
const contract = reactive<Contract>({
contractId: undefined,
settleMethod: undefined,
extendMonthDate: undefined
});
const contractEquipmentSettleTableRef = ref<InstanceType<typeof EleProTable> | null>(null);
const equipmentColumns = ref<ColumnItem[]>([
{
title: "序号",
key: "index",
width: 48,
align: "center",
fixed: "left",
hideInSetting: true,
customRender: ({ index }) => index + (contractEquipmentSettleTableRef.value?.tableIndex ?? 1)
},
{
title: "设备名",
dataIndex: "equipmentName",
key: "equipmentName"
},
{
title: "规格",
dataIndex: "equipmentModel",
key: "equipmentModel"
},
{
title: "进场编号",
dataIndex: "factoryNo",
key: "factoryNo"
},
{
title: "自编号",
dataIndex: "equipmentNo",
key: "equipmentNo"
},
{
title: "计划租期(月)",
dataIndex: "rentMonth",
key: "rentMonth"
},
{
title: "租金(元)",
dataIndex: "rentAmount",
key: "rentAmount"
},
{
title: "租金小计(元)",
dataIndex: "rentAmountSum",
key: "rentAmountSum"
},
{
title: "进退场费(元)",
dataIndex: "inOutAmount",
key: "inOutAmount"
},
{
title: "劳务费用(元)",
dataIndex: "workerAmount",
key: "workerAmount"
},
{
title: "劳务小计(元)",
dataIndex: "workerAmountSum",
key: "workerAmountSum"
},
{
title: "其他费用(元)",
dataIndex: "otherAmount",
key: "otherAmount"
},
{
title: "备注",
dataIndex: "remark",
key: "remark"
},
{
title: "操作",
dataIndex: "action",
key: "action"
}
]);
const settleEquipmentList = ref<ContractSettleEquipment[]>([]);
const getSettleEquipmentList = async () => {
settleEquipmentList.value = await listContractSettleEquipment({ contractId: contract.contractId });
};
const addEquipment = data => {
settleEquipmentList.value = [...settleEquipmentList.value, {
contractSettleId: 0,
contractId: props.data?.contractId,
equipmentName: data.name,
equipmentModel: data.model,
factoryNo: data.factoryNo,
equipmentNo: data.equipmentNo,
rentMonth: 0,
rentAmount: 0,
inOutAmount: 0,
workerAmount: 0,
otherAmount: 0,
remark: "",
userId: loginUser.value.userId
}];
};
const delEquipment = index => {
settleEquipmentList.value.splice(index, 1);
};
const contractRuleSettleTableRef = ref<InstanceType<typeof EleProTable> | null>(null);
const settleRuleList = ref<ContractSettleRule[]>([]);
const getSettleRuleList = async () => {
settleRuleList.value = await listContractSettleRule({ contractId: contract.contractId });
};
const ruleColumns = ref<ColumnItem[]>([
{
title: "序号",
key: "index",
width: 48,
align: "center",
fixed: "left",
hideInSetting: true,
customRender: ({ index }) => index + (contractRuleSettleTableRef.value?.tableIndex ?? 1)
},
{
title: "设备名",
dataIndex: "equipmentName",
key: "equipmentName"
},
{
title: "结算开始日期",
dataIndex: "startDate",
key: "startDate"
},
{
title: "结算结束日期",
dataIndex: "endDate",
key: "endDate"
},
{
title: "操作",
dataIndex: "action",
key: "action"
}
]);
const addRule = () => {
settleRuleList.value.push({
contractId: props.data?.contractId,
startDate: "",
endDate: ""
});
};
const delRule = index => {
settleRuleList.value.splice(index, 1);
};
const totals = computed(() => {
let rentAmountSum = 0;
let workerAmountSum = 0;
settleEquipmentList.value.forEach(({ rentMonth, rentAmount, workerAmount }) => {
rentAmountSum += rentMonth * rentAmount;
workerAmountSum += rentMonth * workerAmount;
});
return { rentAmountSum, workerAmountSum };
});
/* 更新visible */
const updateVisible = (value: boolean) => {
emit("update:visible", value);
};
const equipmentList = ref<TowerModel[]>([]);
const getEquipmentList = async () => {
equipmentList.value = await listTowerModel();
};
/* 保存编辑 */
const save = () => {
if (contract.settleMethod === undefined) {
message.error("请选择结算方式");
return;
}
if (settleEquipmentList.value.length === 0) {
message.error("请至少设置一条结算规则");
return;
}
if (settleRuleList.value.length === 0) {
message.error("请至少设置一条结算周期");
return;
}
for (let i = 0; i < settleRuleList.value.length; i++) {
if (!settleRuleList.value[i].startDate) {
message.error("请选择结算开始日期");
return;
}
if (!settleRuleList.value[i].endDate) {
message.error("请选择结算结束日期");
return;
}
}
loading.value = true;
updateContract(contract);
addBatchContractSettleEquipment(settleEquipmentList.value);
addBatchContractSettleRule(settleRuleList.value);
loading.value = false;
// message.success(res.message);
updateVisible(false);
emit("done");
};
watch(
() => props.visible,
(visible) => {
if (visible) {
for (let i = 2; i < 28; i++) dateList.value.push(i);
getEquipmentList();
if (props.data) {
loading.value = false;
assignObject(contract, props.data);
getSettleEquipmentList();
getSettleRuleList();
isUpdate.value = true;
} else {
isUpdate.value = false;
}
}
}
);
</script>
<style lang="less">
.title {
font-weight: bold;
font-size: 1.1rem;
padding-bottom: 10px;
border-bottom: 1px solid #dcdfe6;
color: #494949;
margin-bottom: 10px;
}
</style>