You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

345 lines
11 KiB

<template>
<div>
<xy-dialog ref="dialog" :is-show.sync="isShow" type="normal" title="出差报销审批" @on-ok="confirm">
<xy-table ref="awayTable" row-key="id" default-expand-all
:tree-props="{children: 'children', hasChildren: 'hasChildren'}" :table-item="table" @select-all="toggleAll"
@select="handleSelectionChange" :list="chuchaibaoxiaoDetailList">
<template v-slot:oa_ht_away_links>
<el-table-column prop="oa_ht_away_links" align="center" label="状态" width="100">
<template #default="scope">
<div v-if="scope.row.hasOwnProperty('oa_ht_away_links')">
<el-tag v-if="scope.row.oa_ht_away_links" type="success" size="small">
已完成
</el-tag>
<el-tag v-else type="warning" size="small">
待审批
</el-tag>
</div>
</template>
</el-table-column>
</template>
<template #btns> </template>
</xy-table>
</xy-dialog>
</div>
</template>
<script>
import {
getBudget
} from "@/api/budget/budget";
import {
addFundLog
} from "@/api/paymentRegistration/fundLog";
import {
save,
getAwayDetails,
updateAwayDetails,
planSave
} from "@/api/away";
export default {
data() {
return {
isShow: false,
checkdKeys: false,
table: [{
type: 'selection',
width: 54,
reserveSelection: true,
fixed: "left",
selectable: row => row.canSelect
},
{
prop: 'name',
label: '人员',
width: 120,
align: 'left'
},
{
prop: 'zijinlaiyuan',
label: '资金来源',
minWidth: 240,
align: 'left'
},
{
prop: 'flow.title',
label: '流程名称',
minWidth: 240,
align: 'left'
},
{
prop: 'amt',
label: '报销金额',
width: 120,
align: 'center'
},
{
prop: 'oa_ht_away_links',
label: '状态',
width: 180,
align: 'center'
},
{
prop: 'remark',
label: '备注',
align: 'left'
}, {
label: "创建日期",
width: 160,
prop: "created_at",
formatter: (cell, data, value) => {
return this.$moment(value).format("YYYY-MM-DD HH:mm");
},
},
],
records: [],
plans: [],
chuchaibaoxiaoDetailList: [],
away_ids: []
};
},
computed: {
},
methods: {
show() {
this.isShow = true;
},
hidden() {
this.chuchaibaoxiaoDetailList = [];
this.away_ids = [];
this.$refs['awayTable'].clearSelection();
this.isShow = false;
},
setRecords(ids) {
console.log("ids", ids);
this.getAway(ids);
},
async getAway(ids) {
this.away_ids = ids;
let res = await getAwayDetails({
away_ids: ids
});
console.log("res.chuchaibaoxiaoDetailList", res.chuchaibaoxiaoDetailList)
let arr = this.transformData(res.chuchaibaoxiaoDetailList)
console.log("arr", arr);
this.chuchaibaoxiaoDetailList = arr;
this.$refs.awayTable.clearSelection()
},
transformData(originalData) {
const result = [];
for (const xingming_details in originalData) {
const person = {
id: Math.random(),
name: xingming_details,
children: [],
parent: null, // 添加父级字段
isSelect: false ,// 添加选中状态字段
canSelect:true,
};
const innerData = originalData[xingming_details];
let count=0
innerData.map(item => {
item.isSelect = false
item.canSelect = item.oa_ht_away_links?false:true
if(item.oa_ht_away_links){
count++
}
})
// 如果所有的都已完成了,则父级选择框不可选
if(count==innerData.length){
person.canSelect = false
}
person.children.push(...innerData)
// const source = {
// id: Math.random(),
// name: '',
// children: innerData.map((item) => ({
// ...item,
// name: item.xingming_detail,
// parent: source, // 指向当前父级
// isSelect: false // 添加选中状态字段
// })),
// parent: person, // 指向当前父级
// isSelect: false // 添加选中状态字段
// };
// person.children.push(source);
result.push(person);
}
return result;
},
toggleAll() {
this.checkdKeys = !this.checkdKeys
this.splite(this.chuchaibaoxiaoDetailList, this.checkdKeys)
},
splite(data, flag) {
data.forEach((row) => {
if(row.canSelect){
this.$refs.awayTable.toggleRowSelection(row, flag)
}
if (row.children) {
this.splite(row.children, flag)
}
})
},
handleSelectionChange(selection, row) {
const allData = this.chuchaibaoxiaoDetailList;
// 取消选择的逻辑
row.isSelect = !row.isSelect
console.log("selection", selection, row)
this.deselectChildren(row, row.isSelect); // 递归取消选择所有子级
// if(!row.isSelect){
// this.deselectChildren(row,row.isSelect); // 递归取消选择所有子级
// // this.updateParentSelection(row, true); // 更新父级状态
// }else{
// // 选择的逻辑
// selection.forEach((item) => {
// if (!this.isSelected(item)) {
// this.selectChildren(item); // 递归选中所有子级
// // this.updateParentSelection(item, true); // 更新父级状态
// }
// });
// }
},
selectChildren(parent) {
if (parent.children) {
parent.children.forEach((child) => {
if(child.canSelect){
this.$refs.awayTable.toggleRowSelection(child, true); // 选中当前子级
// child.isSelect = true; // 更新子级的 isSelect 状态
this.$set(child, 'isSelect', true)
}
this.selectChildren(child); // 递归选中子级的子级
});
}
},
deselectChildren(parent, isSelect) {
console.log("isSelect", isSelect, parent)
if (parent.children) {
parent.children.forEach((child, index) => {
if(child.canSelect){
this.$refs.awayTable.toggleRowSelection(child, isSelect); // 取消选择当前子级
this.$set(child, 'isSelect', isSelect)
}
this.deselectChildren(child, isSelect); // 递归取消选择子级的子级
});
} else {
if(parent.canSelect){
this.$refs.awayTable.toggleRowSelection(parent, isSelect);
this.$set(parent, 'isSelect', isSelect)
}
console.log("parent", parent)
}
},
// updateParentSelection(item, isSelected) {
// if (item.parent) {
// const allSelected = item.parent.children.every((child) => child.isSelect === true);
// const anySelected = item.parent.children.some((child) => child.isSelect === true);
// item.parent.isSelect = allSelected ? true : anySelected ? '' : false; // 全选、半选、不选
// this.$refs.awayTable.toggleRowSelection(item.parent, allSelected);
// this.updateParentSelection(item.parent, allSelected); // 递归更新父级
// }
// },
isSelected(item) {
return item.isSelect === true;
},
async getBudgets() {
let res = await getBudget({
is_tree: 1
});
this.plans = res.list;
},
async confirm() {
console.log("this.$refs['awayTable'].getSelection()", this.$refs['awayTable'].getSelection());
let flowsList = this.$refs['awayTable'].getSelection();
// return
let flow_id = [];
let chuchai_pay_id = [];
let chuchai_pay_details = [];
let person_arr = []
let plan_moneys = []
let away_ids_arr = []
let money = 0
flowsList.map(f => {
if (f.flow && !f.oa_ht_away_links) {
person_arr.push(f)
}
});
if (person_arr.length < 1) {
this.$message.warning('请选择待审批的出差报销')
return
}
console.log("person_arr",person_arr)
person_arr.map(item => {
flow_id.push(item.flow.id);
chuchai_pay_id.push(item.belongs_id);
chuchai_pay_details.push(item.id);
away_ids_arr.push(item.flow.out_away_id)
plan_moneys.push({
plan_id:item.plan_id,
money:item.amt,
away_id:item.flow.out_away_id
})
money += parseFloat(item.amt)
})
// away/save
const away_plan_links = [];
const planMap = {};
person_arr.forEach(item => {
const {
id,
plan_id,
amt,
} = item;
if (!planMap[plan_id]) {
planMap[plan_id] = {
plan_id,
use_money: 0,
chuchai_pay_details: []
};
away_plan_links.push(planMap[plan_id]);
}
planMap[plan_id].use_money += parseFloat(amt);
planMap[plan_id].chuchai_pay_details.push(id);
});
console.log("away_plan_links", plan_moneys,away_plan_links)
// return
const res = await updateAwayDetails({
away_ids: away_ids_arr,
flow_id: flow_id,
chuchai_pay_id: chuchai_pay_id,
chuchai_pay_details: chuchai_pay_details,
money: money,
plan_money:plan_moneys
}, true);
console.log("res", res)
await Promise.allSettled(away_plan_links.map((i, index) => {
console.log(i)
planSave({
plan_id: i.plan_id,
use_money: i.use_money,
chuchai_pay_details: i.chuchai_pay_details
})
}))
this.$message.success('操作成功');
this.$emit('refresh');
this.hidden();
}
},
created() {
// this.getBudgets()
}
};
</script>
<style scoped lang="scss">
</style>