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.
 
 
 
 
 

1122 lines
53 KiB

// 清收年度统计
<template>
<div>
<!-- 清收工作完成统计 -->
<div v-if="liquidate === '1'">
<div class="mgt20 left-border fz-16"><p class="c-black mgl10">清收工作年度情况统计</p></div>
<div class="mgt20 pdb20">
<div class="mgtb20">
<div class="flex-center">
<el-button type="primary" v-if="$router.currentRoute.meta.btn.includes('生成年度统计表')" round @click="createList('new')">生成年度统计表</el-button>
</div>
</div>
<div class="shadow radius10 pdt20">
<el-table v-loading='loading' :data="data" stripe header-align="center" class="mat20">
<el-table-column type="index" width="200" label="序号" align="center"></el-table-column>
<el-table-column label="年度" align="center">
<template slot-scope="scope">
{{scope.row}}
</template>
</el-table-column>
<el-table-column label="操作" width="300" align="center">
<template slot-scope="scope">
<el-button type="text" v-if="$router.currentRoute.meta.btn.includes('人员选择')" @click="createList(scope.row)">人员选择</el-button>
<el-button type="text" v-if="$router.currentRoute.meta.btn.includes('统计查看')" @click="[(liquidate = '2'), edit(scope.row, 'watch')]">查看</el-button>
<el-button type="text" v-if="$router.currentRoute.meta.btn.includes('统计编辑')" @click="edit(scope.row)">管理</el-button>
<el-button type="text" v-if="$router.currentRoute.meta.btn.includes('统计删除')" @click="del(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
<!-- 查看详细数据 -->
<div v-if="liquidate === '2'">
<div class="mgt20 left-border fz-16"><p class="c-black mgl10">条件筛选</p></div>
<div class="mgt20 pdb20">
<div class="flex-between mgtb20">
<div class="flex-center">
<p class="fz-16 mgr10 font-blue mgl20 nowrap">清收组</p>
<el-select v-model="searchStr.groupId" placeholder="请选择" clearable @change="search">
<el-option v-for="item in liquidateSelectArr" :key="item.id" :label="item.groupName" :value="item.id"></el-option>
</el-select>
<p class="fz-16 mgr10 font-blue mgl20 nowrap">完成比例</p>
<el-select v-model="searchStr.proportionSymbol" placeholder="请选择" clearable @change="search">
<el-option v-for="item in proportion" :key="item.id" :label="item.label" :value="item.id"></el-option>
</el-select>
<el-input
placeholder="请输入数值"
class="wd20 mglr10"
style="min-width: 200px"
:disabled="!searchStr.proportionSymbol"
v-model="searchStr.proportion"
clearable
></el-input>
<p>%</p>
<p class="fz-16 mgr10 font-blue mgl20 nowrap">已清收总额</p>
<el-select @change="allAoumntSymbolChange" v-model="searchStr.allAoumntSymbol" placeholder="请选择" clearable>
<el-option v-for="item in proportion" :key="item.id" :label="item.label" :value="item.id"></el-option>
</el-select>
<el-input :disabled="!searchStr.allAoumntSymbol" class="wd20 mglr10" placeholder="请输入金额(元)" style="min-width: 200px" v-model="searchStr.allAoumnt" clearable></el-input>
</div>
<div class="flex-center">
<el-button v-preventReClick type="primary" size="small" round @click="clearOption">清空选项</el-button>
<el-button v-preventReClick type="primary" size="small" round @click="annualStatisticsList">搜索</el-button>
</div>
</div>
<div class="shadow radius10 pdt20">
<div class="flex-between mab20 mgl10">
<div class="flex-center">
<p class="hr_tag"></p>
<span class="hr_text">{{liquidateSearch.year}}年度清收工作完成情况统计表</span>
</div>
</div>
<div class="flex-between">
<div class="flex-center">
<el-button class="mgl20" v-if="$router.currentRoute.meta.btn.includes('统计导出列表')" v-preventReClick type="primary" size="small" round @click="statisticsSelection">导出列表</el-button>
<el-radio-group v-model="radio" class="mgl30" @change="radioChange">
<el-radio-button class="ht40" label="依据公司排名"></el-radio-button>
<el-radio-button class="ht40" label="依据小组排名"></el-radio-button>
</el-radio-group>
</div>
<div class="df">
<el-input
style="min-width: 250px"
class="ht40 mgl10 mgr10"
@keyup.enter.native="annualStatisticsList('search')"
v-model="searchStr.queryCondition"
placeholder="工号/清收负责人"
clearable
><i slot="suffix" class="el-input__icon el-icon-search" @click="annualStatisticsList"></i></el-input>
</div>
</div>
<!--
前端查询
:data="data.filter(data => !search || data.businessCode.toLowerCase().includes(search.toLowerCase()))"
-->
<div class="dataList" ref="table" @scroll="handleScroll">
<el-table
:data="statisticsData"
stripe
header-align="center"
v-loading="statisticsLoading"
class="mat20 "
:row-key="getRowKeys"
:key="1"
>
<el-table-column type="selection" width="55" align="center" :reserve-selection="true"></el-table-column>
<el-table-column prop="companyRanks" label="公司排名" align="center" width="70px"></el-table-column>
<el-table-column prop="TeamRanks" label="小组排名" align="center" width="70px"></el-table-column>
<el-table-column prop="groupName" label="清收组" align="center" width="150px"></el-table-column>
<el-table-column prop="personLiable" label="清收负责人" align="center" width="150px"></el-table-column>
<el-table-column prop="jobNumber" label="工号" align="center"></el-table-column>
<el-table-column prop="enterprise" label="清收企业" align="center" width="150px">
<template slot-scope="scope">
<div class="multi-box" v-for="(item, index) in scope.row.enterprise" :key="index">
{{ item.enterprise }}
</div>
</template>
</el-table-column>
<el-table-column prop="cash" label="清收现金(元)" align="center" width="150px">
<template slot-scope="scope">
<div class="multi-box" v-for="(item, index) in scope.row.cash" :key="index">
{{ item.cash }}
</div>
</template>
</el-table-column>
<el-table-column prop="asset" label="清收资产(元)" align="center" width="150px">
<template slot-scope="scope">
<div class="multi-box" v-for="(item, index) in scope.row.assets" :key="index">
{{ item.assets }}
</div>
</template>
</el-table-column>
<el-table-column prop="collectionTime" label="回款时间" align="center" width="200px">
<template slot-scope="scope">
<div class="backTime static multi-box" v-for="(item, index) in scope.row.collectionTime" :key="index">
<el-date-picker
v-if="item.collectionTime"
style="width:180px"
v-model="item.collectionTime"
type="date"
value-format="yyyy-MM-dd"
:disabled="!scope.row.edit"
>
</el-date-picker>
<div v-else>-</div>
</div>
</template>
</el-table-column>
<el-table-column prop="totalAmount" label="已清收总额(元)" align="center" width="150px">
<template slot-scope="scope" >
<div class="multi-box" >
{{ scope.row.totalAmount }}
</div>
</template>
</el-table-column>
<el-table-column prop="ratio" label="完成比例" align="center" width="150px">
<template slot-scope="scope">
<div class="ratio" v-show="scope.row.edit">
<div class="top">{{scope.row.totalAmount}}</div>
<el-input :disabled="!scope.row.edit" placeholder="输入年度金额指标" v-model="scope.row.proportion"></el-input>
</div>
<div v-if="!scope.row.edit">
{{scope.row.percent==="未填写年度指标"?"未填写年度指标":scope.row.percent+"%"}}
</div>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" width="200px">
<template slot-scope="scope">
<div class="backTime static multi-box" v-for="(item, index) in scope.row.description" :key="index">
<el-tooltip v-if="item.description&&item.description!='-'&&scope.row.description!=' '" class="item" effect="dark" :content="item.description" placement="top">
<el-input :disabled="!scope.row.edit" v-model="item.description"></el-input>
</el-tooltip>
<div v-else>
-
</div>
</div>
</template>
</el-table-column>
<!-- 判断是否为查看或者编辑 -->
<el-table-column v-if="!liquidWatch" label="操作" width="300" align="center">
<template slot-scope="scope">
<el-button type="text" @click="yearEdit(scope.row)">{{scope.row.editStr}}</el-button>
<el-button type="text" v-show="scope.row.edit" @click="[scope.row.edit = false,annualStatisticsList()]">取消</el-button>
<!-- <el-button type="text" @click="history(scope.row)">查看</el-button> -->
</template>
</el-table-column>
</el-table>
</div>
<el-button class="more-btn" v-show="moreBtn" type="primary" @click="clickMore" round>{{moreText}}</el-button>
</div>
</div>
</div>
<!-- 弹框--生成年度统计表 -->
<el-dialog title="请选择" v-loading="treeLoading" width="40%" :visible.sync="showRank" center>
<div class="ranking">
<div class="top">
<div class="left-border fz-16"><p class="c-black mgl10">年份</p></div>
<el-date-picker
:disabled="changeStaffDisabled"
class="mgt10 mgl80 year"
v-model="chooisYear"
value-format="yyyy"
:picker-options="pickerOptions"
type="year"
placeholder="选择年"
>
</el-date-picker>
</div>
<div class="tree">
<div class="left-border fz-16 mgt20"><p class="c-black mgl10">参与本年度清收排名的人员</p></div>
<div class="mgl80 mgt20 mgr80" style="border: 1px solid #e6e6e6; border-radius: 15px; overflow: auto; padding: 15px">
<!-- <el-checkbox @change="allCheck" v-model="checked" class="mgl20" style="margin-left:23px">全选</el-checkbox> -->
<el-tree
:data="tree"
show-checkbox
default-expand-all
node-key="id"
ref="tree"
@check-change="checkBox"
:default-checked-keys="treeIds"
highlight-current
:props="defaultProps"
>
</el-tree>
</div>
</div>
<div class="flex-center fj-center mgt20">
<el-button type="primary" v-preventReClick round class="mgr20" @click="treeSure">确定</el-button>
<el-button round class="mgl20" @click="[chooisYear='',showRank=false]">取消</el-button>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import { json } from 'mathjs';
import {collectionGroupList ,generateAnnualStatistics,annualList,annualStatisticsList,editAnnualStatistics,personnelSelection ,annualStatisticsDeleted,annualStatisticsListExport,liquidateList } from '../../../utils/api'
import core from '../../../utils/core'
export default {
name: '',
props: {},
components:{
},
data() {
return {
showRank: false, // 弹框
treeLoading:false,// 树弹框加载
loading:false,// 列表加载
statisticsLoading:false,// 统计列表加载
defaultProps: {
children: 'personnel',
label: "name"
},
data: [],
tree: [],
treeIds:[],
treeStatus:'',
chooisYear: '',
pageNo: 0,
totals: 0,
liquidateSelectArr: [{ label: '不限', id: '' }],
proportion: [
// 选择完成比例符号
{ label: '不限', id: '' },
{ label: '>', id: '>' },
{ label: '<', id: '<' },
{ label: '>=', id: '>=' },
{ label: '<=', id: '<=' },
{ label: '=', id: '=' }
],
searchStr: {
// 筛选条件
year:'',
groupId: '', // 清收组
proportion: '', // 比例
percent: '', // 比例整数百分比
proportionSymbol: '', // 选择比例符号
},
radio: '依据公司排名',
liquidateSelect: '0', // 选择筛选框
originalData:[],// 记录原本data
statisticsData: [// 统计表的数据
],
keyword: '', // 搜索绑定变量占位
pickerOptions: {
disabledDate(time) {
// 限制时间
let date = new Date();
let year = date.getFullYear();
return time.getFullYear() > year;
}
},
moreBtn:false,
moreText:'向下滚动查看更多',
recordArr:[],// 记录用数组,加载更多
changeStaffYear:'',
changeStaffDisabled:false,
checked:false,
};
},
watch: {
showRank(val){
if(val){
this.getTree()
}else{
this.tree = []
this.treeIds = []
}
},
liquidate(val){
if(val==2){
// console.log('判断为2')
this.liquidateList()
this.annualStatisticsList()
}else{
this.annualList()
}
}
},
computed: {
liquidate:{
get(){
return this.$store.state.loan.liquidate
},set(){}
},
liquidWatch:{
get(){
return this.$store.state.loan.liquidWatch
},set(){}
},
liquidateSearch:{
get(){
this.searchStr = this.$store.state.loan.liquidateSearch
return this.$store.state.loan.liquidateSearch
},set(){}
},
percent(){
// console.log(this.statisticsData,'statisticsData')
// console.log(this.statisticsData.totalAmount,this.statisticsData.proportion,'计算百分比的值')
return (+this.statisticsData.totalAmount/+this.statisticsData.proportion).toFixed(2)
}
},
created() {
this.searchStr = this.$store.state.loan.liquidateSearch
this.annualList()
// console.log(this.liquidate,this.searchStr,'li')
if(this.liquidate=='2'){
this.annualStatisticsList()
}
},
mounted() {
},
methods: {
liquidateList(){// 清收组
liquidateList().then(res=>{
this.liquidateSelectArr = res.data.groupList
// console.log(this.liquidateSelectArr,'arr')
})
},
handleScroll:core.debounce(function(){
let box = this.$refs.table
if(box.scrollTop+box.clientHeight+180>box.scrollHeight){
this.moreBtn = true
}else{
this.moreBtn = false
}
if(box.scrollTop+box.clientHeight+50>=box.scrollHeight){
}
},10),
async clickMore(){// 进行加载更多操作
this.statisticsLoading = true
await setTimeout(() => {
this.statisticsLoading = false
}, 500+Math.floor(Math.random(500)));
this.statisticsData.push(...this.recordArr.slice(0,10))
this.recordArr.splice(0,10)
let box = this.$refs.table
let st = box.scrollTop
if(this.recordArr.length===0){
this.moreText = "没有更多数据了!"
}else{
this.moreText = "点击加载更多数据"
box.scrollTop = st
}
},
annualList(){
this.loading = true
annualList().then(res=>{
this.loading = false
if(!res.data.list[0]) this.data = []
this.data = res.data.list
}).catch(()=>{
this.loading = false
})
},
/* TODO 按照有多组进行区分,再按组分人,后端传来按组区分的数组,进行切割区分。
*
*/
annualStatisticsList(){
if(this.searchStr.proportionSymbol&&!this.searchStr.proportion) return this.$message('请输入完成比例整数!')
if(this.searchStr.allAoumntSymbol&&!this.searchStr.allAoumnt) return this.$message('请输入已清收总额!')
this.searchStr = this.$store.state.loan.liquidateSearch
let param = {
year:this.searchStr.year,
groupId:this.searchStr.groupId,
// proportionSymbol:this.searchStr.proportionSymbol,
// proportion:this.searchStr.proportion,
queryCondition:this.searchStr.queryCondition,
}
this.statisticsLoading = true
annualStatisticsList(param).then(res=>{
// console.clear()
// console.log('开始处理数据')
this.statisticsLoading = false
let arr = new Map() // 最后处理得到的map对象
let data = res.data.list
let groupArr= new Map()// 得到的组排序对象,仅取出多组和多组排名即可。
let overArr = []// 最终处理出来的组排序的数组
function compare(key){
return function(value1,value2){
let val1=value1[key];
let val2=value2[key];
return val2-val1;
}
}
// console.log(res.data.groupList.collect,'res.data.groupList.collect')
// 按组分人进行处理,取得人的组排序值,以及对应的多组的值,取得这两个数据即可
let collect = JSON.parse(JSON.stringify(res.data.groupList.collect))
if(res.data.groupList.collect){
// console.log('开始处理组的数据')
for (let key in res.data.groupList.collect) {// 循环分组
// 每次取出一个组进行处理,并且在该次处理中,把人员组和名次取出来
let group = res.data.groupList.collect[key]
// console.log(group,'每个组的数据',key,'key')
let aloneMap = new Map() // 每个组独立的map对象处理
let aloneArr = []// 取出所有的已处理数据
group.forEach(e=>{// 进行相同数据处理叠加,需要注意组和排名的处理
// 进行各项数据叠加,然后根据叠加的totalAmount字段进行排序,且,组之间需要进行一次额外排序
if(aloneMap.has(e.jobNumber)){// 如果处理过,进行叠加处理
let obj = aloneMap.get(e.jobNumber)
obj.enterprise.push({enterprise:e.enterprise,id:e.id})
obj.totalAmount += ((+e.cash||0)+(+e.assets))
obj.cash.push({cash:e.cash,id:e.id})
obj.assets.push({assets:e.assets,id:e.id})
obj.collectionTime.push({collectionTime:e.collectionTime,id:e.id})
obj.description.push({description:e.description,id:e.id})
aloneMap.set(e.jobNumber,obj)
// console.log(e.groupName,'多次处理的组数据')
}else{
e.groupName = [e.groupName]// 区别于公司人员处理,把组提取出来
// console.log(e.groupName,'e.groupName')
e.enterprise = [{enterprise:e.enterprise||'-',id:e.id}]
e.totalAmount = (+e.cash||0)+(+e.assets)
e.cash = [{cash:e.cash||'-',id:e.id}]
e.assets = [{assets:e.assets||'-',id:e.id}]
e.collectionTime = [{collectionTime:e.collectionTime,id:e.id}]
e.description = [{description:e.description||'-',id:e.id}]
// console.log(e.totalAmount,`首次加入的${e.personLiable}`)
aloneMap.set(e.jobNumber,e)// 根据工号进行标识储存
}
})
// console.log(aloneMap,'首次处理的alone')
// 处理完的map进行解构,并排序,以此取得每个组的排序对象数组
for(let [key,value] of aloneMap){
aloneArr.push(value)
}
// console.log('取得aloneArr的map对象',aloneArr)
aloneArr.sort(compare('totalAmount'))// 进行金额排序
aloneArr.forEach((e,i)=>{// 由此取得每个人在组内的排序
e.TeamRanks = [i+1]
})
groupArr.set(key,aloneArr)// 再把该数组存入组id标识的map对象中
}
}
let dispose = []
// 处理完map对象后,需要再根据人进行合并,先取出所有的组对应数组
for(let [key,value] of groupArr){
// 存在map中的是一个个组为标识的数组,先把数组解构出来,然后再需要进行一个一个对象的工号对比,若相同,则进行合并
dispose.push(...value)
}
// console.log(dispose,'取出所有的dispose值')
if(dispose.length>0){
// 建立一个新的map进行合并操作,以工号为标识
let disposeMap = new Map()
dispose.forEach(e=>{// 循环,合并相同的数据,仅需取得对应的排序和复数组
if(disposeMap.has(e.jobNumber)){// 如果处理过,进行叠加处理
let obj = disposeMap.get(e.jobNumber)
// console.log(e.groupName,e.TeamRanks,'e的组和排名')
// console.log(obj.groupName,obj.TeamRanks,'obj的组和排名')
// console.log(obj.groupName.includes(e.groupName),'obj是否包含e的判断')
if(!obj.groupName.includes(e.groupName)){// 进行初步判重
obj.groupName.push(...e.groupName)// 把多组处理出来,无需判重
obj.TeamRanks.push(...e.TeamRanks)// 再把组排名取出来
}
// console.log(obj,'处理完的obj')
// 无需处理其他类型数据
disposeMap.set(e.jobNumber,obj)// 进行覆盖
}else{
// e.groupName = [...e.groupName]// 区别于公司人员处理,把组提取出来
// e.TeamRanks =
disposeMap.set(e.jobNumber,e)// 根据工号进行标识储存
}
})
// 最后取得一个已处理完毕的数组
// console.log(disposeMap,'处理完毕的map对象')
for(let [key,value] of disposeMap){
overArr.push(value)// 取得对应数组,只需要赋值到公司排名那里即可
}
}
// console.log('取得overArr',overArr)
// 然后再把组和排名拿到公司排名那里进行拼接
data.forEach(e=>{// 数据处理为一条--需要额外取得多组和分组排名,按组排序将无法正常展示
if(arr.has(e.jobNumber)){
let obj = arr.get(e.jobNumber)
obj.enterprise.push({enterprise:e.enterprise,id:e.id})
obj.totalAmount += ((+e.cash||0)+(+e.assets))
obj.cash.push({cash:e.cash,id:e.id})
obj.assets.push({assets:e.assets,id:e.id})
obj.collectionTime.push({collectionTime:e.collectionTime,id:e.id})
obj.description.push({description:e.description,id:e.id})
arr.set(e.jobNumber,obj)
// console.log(e.totalAmount,`再次处理加入的${e.personLiable}`)
}else{
e.enterprise = [{enterprise:e.enterprise||'-',id:e.id}]
e.totalAmount = (+e.cash||0)+(+e.assets)
e.cash = [{cash:e.cash||'-',id:e.id}]
e.assets = [{assets:e.assets||'-',id:e.id}]
e.collectionTime = [{collectionTime:e.collectionTime,id:e.id}]
e.description = [{description:e.description||'-',id:e.id}]
// console.log(e.totalAmount,`首次加入的${e.personLiable}`)
arr.set(e.jobNumber,e)
}
})
// 取得初次处理的数据
this.originalData = []
for(let [key,value] of arr){
// 处理百分比展示文字
if(value.totalAmount&&value.proportion){
value.percent = ((value.totalAmount/value.proportion)*100).toFixed(2)
}else{
value.percent = '未填写年度指标'
}
// 把组和排名进行赋值,取得组排名和多组的值
overArr.forEach(e=>{
if(e.jobNumber==value.jobNumber){
value.groupName = e.groupName.join(",") // 多组处理的拼接
value.TeamRanks = e.TeamRanks.join(",") // 多组排名的拼接
}
})
this.originalData.push(value)
}
// console.log(this.originalData,'初始处理的数据')
// 初始数据执行两次排名,分别取得组排名和公司排名
// this.radioChange('依据小组排名')
this.radioChange('依据公司排名')
// 根据单选按钮,进行实际排序展示
if(this.radio==='依据小组排名'){
// console.log('依据小组排名',collect,'chunazhi')
this.radioChange('依据小组排名',collect)
}
// console.log(this.searchStr.proportionSymbol,'this.searchStr.allAoumntSymbol')
switch (this.searchStr.proportionSymbol) {
case '':
break;
case ">":
if(this.searchStr.proportion){
this.statisticsData = this.statisticsData.filter(e=>{
if(e.percent!=='未填写年度指标')
return +e.percent > this.searchStr.proportion
})
}
break;
case "<":
if(this.searchStr.proportion){
this.statisticsData = this.statisticsData.filter(e=>{
if(e.percent!=='未填写年度指标')
return +e.percent < this.searchStr.proportion
})
}
break;
case ">=":
if(this.searchStr.proportion){
this.statisticsData = this.statisticsData.filter(e=>{
if(e.percent!=='未填写年度指标')
return +e.percent >= this.searchStr.proportion
})
}
break;
case "<=":
if(this.searchStr.proportion){
this.statisticsData = this.statisticsData.filter(e=>{
if(e.percent!=='未填写年度指标')
return +e.percent <= this.searchStr.proportion
})
}
break;
case "=":
if(this.searchStr.proportion){
this.statisticsData = this.statisticsData.filter(e=>{
if(e.percent!=='未填写年度指标')
return +e.percent == this.searchStr.proportion
})
}
break;
default:
break;
}
// 查完成比例查询
switch (this.searchStr.allAoumntSymbol) {
case '':
break;
case ">":
this.statisticsData = this.statisticsData.filter(e=>{
return e.totalAmount > this.searchStr.allAoumnt||0
})
break;
case "<":
this.statisticsData = this.statisticsData.filter(e=>{
return e.totalAmount < this.searchStr.allAoumnt||0
})
break;
case ">=":
this.statisticsData = this.statisticsData.filter(e=>{
return e.totalAmount >= this.searchStr.allAoumnt||0
})
break;
case "<=":
this.statisticsData = this.statisticsData.filter(e=>{
return e.totalAmount <= this.searchStr.allAoumnt||0
})
break;
case "=":
this.statisticsData = this.statisticsData.filter(e=>{
return e.totalAmount == this.searchStr.allAoumnt||0
})
break;
default:
break;
}
/* 分页改为无限滚动,暂时保留 */
// // 长度大于10,开启滚动记录数组,切割当前数组
// if (this.statisticsData.length>10) {
// this.recordArr = JSON.parse(JSON.stringify(this.statisticsData))
// this.recordArr.splice(0,10)
// this.statisticsData.splice(10,this.statisticsData.length-1)// 首次切割
// }
}).catch(err=>{
this.statisticsLoading = false
})
},
getTree(){// 取得统计树数据
this.treeLoading = true
collectionGroupList().then(res=>{
this.treeLoading = false
let data = res.data.list
data.forEach((e,index)=>{
if(e.id.includes('group')&&e.personnel.length===0){
e.disabled = true
}
})
let allTree = [{
id:'全选group',
name:'全选',
personnel:[...data]
}]
this.tree = allTree
// console.log("取得树数据")
}).catch(err=>{
this.treeLoading = false
})
},
// 勾选
checkBox(data, checked, indeterminate){
// console.log(checked,'dianjiindeterminate')
this.treeIds = this.$refs.tree.getCheckedKeys()
// console.log(this.treeIds,'ids')
// if(checked){
// const fn = function(arr,ids,id){
// arr.forEach(el=>{
// if(el.id.includes(',')){
// if(el.id.split(',').pop()==id&&!ids.includes(el.id)){
// ids.push(el.id)
// }
// }
// if(el.personnel&&el.personnel.length>0){
// fn(el.personnel,ids,id)
// }
// })
// }
// this.treeIds.forEach(e=>{
// if(e.includes(",")){
// let id = e.split(",").pop()// 取出勾选的那个值
// fn(this.tree,this.treeIds,id)
// }
// })
// }else{
// let tid = this.treeIds
// this.treeIds.forEach(e=>{
// if(e.includes(',')){
// let id = e.split(",").pop()
// this.treeIds.forEach(el=>{
// if(el.includes(id)){
// tid.splice(tid.indexOf(el),1)
// }
// })
// }
// })
// console.log(this.treeIds,'ids')
// }
},
async createList(val) {// 唤起清收组弹窗
// console.log(val,'val')
this.showRank = true;
if(val==='new'){// 新增人员
this.treeIds = []
this.changeStaffDisabled = false
}else{
await this.personnelSelection(val)
this.changeStaffDisabled = true
this.chooisYear = val
}
this.treeStatus = val
},
treeSure(){// 确定
if (this.treeStatus === 'new') {
// 新建生成统计表
if(!this.chooisYear)return this.$message.error('请先选择年份!')
// let arr = []
// this.treeIds.forEach((e,index)=>{
// if(e.includes(',')){
// arr.push(e.split(",").pop())
// }
// })
if(this.treeIds.length===0) return this.$message.warning('请先选择人员后再生成列表!')
console.log(this.treeIds,'treeIds')
this.treeIds.forEach((e)=>{
if(e=="全选group"){
this.treeIds.splice(this.treeIds.indexOf(e),1)
return
}
})
generateAnnualStatistics({personLiableIds:this.treeIds,year:this.chooisYear,flag:1}).then(res=>{
this.showRank = false
this.$message.success('操作成功!')
this.annualList()
}).catch(err=>{
})
}else{// 编辑
// let arr = []]
this.treeIds.forEach((e)=>{
if(e=="全选group"){
this.treeIds.splice(this.treeIds.indexOf(e),1)
return
}
})
console.log(this.ids,'ids的值',this.treeIds)
this.ids.forEach(e=>{// 避免重复生成
if(this.treeIds.includes(e+"")){
this.treeIds.splice(this.treeIds.indexOf(e+""),1)
}
})
this.treeIds.forEach((e)=>{
if(e=="全选group"){
this.treeIds.splice(this.treeIds.indexOf(e,1))
return
}
})
generateAnnualStatistics({personLiableIds:this.treeIds,year:this.chooisYear}).then(res=>{
this.showRank = false
this.$message.success('操作成功!')
this.annualList()
}).catch(err=>{
})
}
},
currentChange(val) {
// 列表变更
},
radioChange(val,groups) {// 排名
function compare(key){
return function(value1,value2){
let val1=value1[key];
let val2=value2[key];
return val2-val1;
}
}
if(val==='依据小组排名'){
console.log(this.liquidWatch,'liquidWatch,小组')
let groupMap = new Map()// 进行组的总金额排名对象
let sortGroups = []// 排序组的顺序
// console.log('开始执行依据小组排名',groups,'groups')
if(!groups){// 执行列表接口逻辑,从列表走
this.annualStatisticsList()
}
if(groups){// 传来的后端处理的组排名
for (let key in groups) {
let group = JSON.parse(JSON.stringify(groups[key]))// 取得每个数组的数据
if(group.length===0) return
// 只需要把数组进行排序,再把组内进行排序进行展示即可,无需进行人员合并
// 进行组的金额叠加
let sum = group.reduce((pre,item)=>{
return pre + (item.cash||0) + (item.assets||0)
},0)
console.log(sum,'叠加的组数据')
let obj = {
sum:sum,
id:group[0].groupId
}
console.log(group,'组group的数据')
groupMap.set(group[0].groupId,obj)// 存累加的组的数据,和组的id做为标识
console.log(groupMap,'排序的组')
}
let sortGroup = []// 组排名的数组
for (let [key,value] of groupMap) {
sortGroup.push(value)
}
console.log(sortGroup,'取得排序过的数组数据')
sortGroup.sort(compare('sum'))// 把组进行排名
// 以上的组排名根据多次检测,已无问题
// 然后根据排名的组,进行一次排序分离,push进数组中
sortGroup.forEach(e=>{
sortGroups.push(groups[e.id])// 组排序人员塞进新数组
})
console.log(sortGroups,'处理好的排序组')
let lastData = []// 最后处理出来的数组
// 再把组内进行人员合并,且进行排序
sortGroups.forEach(e=>{
let manMap = new Map()
e.forEach(e=>{
if(manMap.has(e.jobNumber)){// 合并相同的人员数据
let obj = manMap.get(e.jobNumber)
obj.enterprise.push({enterprise:e.enterprise,id:e.id})
obj.totalAmount += ((+e.cash||0)+(+e.assets))
obj.cash.push({cash:e.cash,id:e.id})
obj.assets.push({assets:e.assets,id:e.id})
obj.collectionTime.push({collectionTime:e.collectionTime,id:e.id})
obj.description.push({description:e.description,id:e.id})
manMap.set(e.jobNumber,obj)
}else{// 处理首次的人员
e.enterprise = [{enterprise:e.enterprise||'-',id:e.id}]
e.totalAmount = (+e.cash||0)+(+e.assets)
e.cash = [{cash:e.cash||'-',id:e.id}]
e.assets = [{assets:e.assets||'-',id:e.id}]
e.collectionTime = [{collectionTime:e.collectionTime,id:e.id}]
e.description = [{description:e.description||'-',id:e.id}]
// console.log(e.totalAmount,`首次加入的${e.personLiable}`)
manMap.set(e.jobNumber,e)
}
// 处理完毕,取出处理好的组的数组,解构,取得初步处理完的数据
})
let handelArr = []
for(let [key,val] of manMap){
handelArr.push(val)
}
handelArr.sort(compare('totalAmount'))
console.log(handelArr,'handlarr')
// 排序完,进行一次赋值操作,把公司排名和组排名搞上去
handelArr.forEach((e,i)=>{
e.TeamRanks = i+1
this.originalData.some(el=>{
if(e.jobNumber===el.jobNumber){
e.companyRanks = el.companyRanks
// e.groupName =
}
})
if(e.totalAmount&&e.proportion){
e.percent = ((e.totalAmount/e.proportion)*100).toFixed(2)
}else{
e.percent = '未填写年度指标'
}
})
// 最后处理完成的值
lastData.push(...handelArr)
// for(let [key,val] of manMap){
// lastData.push(val)
// }
})
lastData.forEach((e,i)=>{
e.companyRanks = i+1
e.editStr = '编辑'
e.edit = false
})
// console.log(lastData,'处理完的最后的组排名,分人')/
this.statisticsData = JSON.parse(JSON.stringify(lastData))
console.log(this.statisticsData,'是否有操作的值')
}
}else if(val==='依据公司排名'){
// this.annualStatisticsList()
// 取得原始的数组,且进行公司排名
this.originalData.sort(compare('totalAmount'))
this.originalData.forEach((e,i)=>{
e.companyRanks = i+1
e.editStr = '编辑'
e.edit = false
})
this.statisticsData = JSON.parse(JSON.stringify(this.originalData))
}
},
clearOption() {
// 清空筛选条件
this.$store.commit('liquidateSearch',{year:this.liquidateSearch.year})
this.annualStatisticsList()
},
search() {
// 暂时占位
},
getRowKeys(row) {
// 列表的Key
return row.Id;
},
statisticsSelection() {
// console.log('发',this.searchStr.year)
// console.log(this.searchStr.year+`年度清收工作完成进度表`)
let num
this.radio == "依据公司排名"?num=1:num=0
core.exportFile(annualStatisticsListExport(this.searchStr.year)+`&flag=${num}`,this.searchStr.year+"年度清收工作完成进度表")
},
edit(row, val) {
// 编辑
this.liquidate ='2';
this.$store.commit('liquidateSearch',{
year:row
})
this.$store.commit('liquidate','2')
// 判断进入查看
this.$store.commit('liquidWatch',val)
// console.log(val,this.liquidWatch,'liquidWatch')
// this.annualStatisticsList()
},
yearEdit(row, val){// 编辑功能
if(row.edit != false){
row.edit = false
row.editStr = '编辑'
// 调接口,存数据,重新请求列表
let param = []
row.enterprise.forEach((e,index)=>{
let obj = {
collectionTime:row.collectionTime[index].collectionTime,
id:e.id,
description:row.description[index].description,
proportion:row.proportion
}
param.push(obj)
})
editAnnualStatistics({collectionStatistics:param}).then(res=>{
this.$message.success('编辑成功!')
setTimeout(() => {
this.annualStatisticsList()
}, 1000);
})
}else{
row.editStr = '保存'
row.edit = true
}
},
personnelSelection(val){// 人员选择
return personnelSelection({year:val}).then(res=>{
this.treeIds = res.data.list
// const disabled = function(arr,ids){
// arr.forEach(e=>{
// if(ids.includes(e.id)){
// e.disabled = true
// }
// })
// }
// disabled(this.tree,this.treeIds)
console.log(this.treeIds,'ids的值')
this.tree[0].personnel.forEach(e=>{
if(this.treeIds.includes(+e.id)){
e.disabled = true
}
})
this.$forceUpdate();
// console.log('treeIds',this.treeIds)
this.ids = res.data.list
})
},
del(row){
this.$confirm('确定要删除该年度统计数据吗?').then(()=>{
annualStatisticsDeleted(row).then(res=>{
this.annualList()
})
})
},
// allCheck(val){
// console.log(this.tree,'tree')
// if(this.tree.length==0) return
// let that = this
// function recursion(arr){
// if(arr&&arr.length>0){
// arr.forEach(e=>{
// that.treeIds.push(e.id)
// if(e.personnel&&e.personnel.length>0){
// recursion(e.personnel)
// }
// })
// }
// }
// if(val){
// recursion(this.tree)
// // this.ids = this.treeIds
// }else{
// this.treeIds = []
// }
// this.$refs.tree.setCheckedKeys([this.treeIds]);
// // console.log(this.treeIds,'ids')
// // this.$forceUpdate();
// },
allAoumntSymbolChange(val){
if(!val){
this.searchStr.allAoumnt = ''
}
}
}
};
</script>
<style lang='scss' scoped>
/deep/ .el-radio-button__inner {
padding-top: 9px;
padding-bottom: 9px;
}
.multi-box {
// border: 1px solid #e6e6e6;
min-height: 50px;
text-align: center;
line-height: 50px;
&:nth-child(2n) {
background: #e6e6e6;
border-left: 1px solid #fff;
border-right: 1px solid #fff;
}
}
.backTime{
min-height: 50px;
line-height: 50px;
/deep/ .el-input__inner{
text-align: center;
}
}
.ratio{
.top{
border-bottom: 1px solid;
height: 52px;
line-height: 52px;
margin-bottom: 15px;
}
}
.dataList{
min-height: 550px;
// overflow: auto;
position: relative;
}
/deep/ .el-table::before{
background-color: transparent;
}
.more-btn{
position: absolute;
bottom: 10px;
left: 50%;
transform: translate(-50%,0);
}
/deep/ .el-input.is-disabled .el-input__inner{
text-align: center;
}
/deep/ .el-table--enable-row-transition .el-table__body td{
border: 0.0625rem solid #e6e6e6;
border-top: 0;
}
/deep/ .el-table .cell{
padding-left: 0;
padding-right: 0;
}
/deep/ .el-date-editor.el-input{
width: 100%!important;
background: transparent;
}
/deep/ .top .el-date-editor.el-input{
width: 180px!important;
background: transparent;
}
/deep/ .el-input.is-disabled .el-input__inner{
color:#606266;
background: transparent;
}
</style>