@ -18,6 +18,8 @@ import com.engine.salary.entity.ly.po.UfSbInfo;
import com.engine.salary.entity.salaryacct.bo.SalaryAcctFormulaBO ;
import com.engine.salary.entity.salaryacct.bo.SalaryAcctResultBO ;
import com.engine.salary.entity.salaryacct.dto.LyDazjtjReportDTO ;
import com.engine.salary.entity.salaryacct.dto.LyTxdaDTO ;
import com.engine.salary.entity.salaryacct.po.LyTxdaPO ;
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO ;
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO ;
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO ;
@ -57,6 +59,7 @@ import weaver.general.TimeUtil;
import weaver.hrm.User ;
import weaver.wechat.util.Utils ;
import java.io.UnsupportedEncodingException ;
import java.math.BigDecimal ;
import java.math.RoundingMode ;
import java.text.SimpleDateFormat ;
@ -3291,4 +3294,488 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
/ / 获取excel
return ExcelUtilPlus . genWorkbookV2 ( rows , " 薪酬档案职级统计报表 " , false ) ;
}
@Override
public Map < String , Object > listLyTxdazjtjReport ( LySalaryReportQueryParam param ) {
Date startDate = SalaryDateUtil . dateStrToLocalDate ( param . getStartDate ( ) ) ;
Date endDate = SalaryDateUtil . dateStrToLocalDate ( param . getEndDate ( ) ) ;
if ( startDate = = null | | endDate = = null ) {
throw new SalaryRunTimeException ( " 开始或结束日期不存在或格式错误, 正确格式yyyy-MM-dd " ) ;
}
BaseBean baseBean = new BaseBean ( ) ;
RecordSet rs = new RecordSet ( ) ;
/ / 查询所有发薪的调薪档案
String excludeTxyy = baseBean . getPropValue ( " lySalaryReport " , " txdatj_exclued_txyy " ) ;
try {
excludeTxyy = new String ( excludeTxyy . getBytes ( " ISO-8859-1 " ) , " utf-8 " ) ;
} catch ( UnsupportedEncodingException e ) {
}
List < String > excluedeTxyy = Arrays . stream ( excludeTxyy . split ( " , " ) ) . collect ( Collectors . toList ( ) ) ;
String sql = " select yg,ndyqsrze,txrq,dxyy from uf_txda where txrq >=? and txrq<=? " ;
rs . executeQuery ( sql , Arrays . asList ( startDate , endDate ) ) ;
List < LyTxdaPO > lyTxdaList = new ArrayList < > ( ) ;
while ( rs . next ( ) ) {
Date txrqDate = SalaryDateUtil . dateStrToLocalDate ( rs . getString ( " txrq " ) ) ;
if ( txrqDate ! = null ) {
lyTxdaList . add ( LyTxdaPO . builder ( )
. yg ( NumberUtils . isCreatable ( rs . getString ( " yg " ) ) ? Long . valueOf ( rs . getString ( " yg " ) ) : - 1L )
. ndyqsrze ( SalaryEntityUtil . string2BigDecimalDefault0 ( rs . getString ( " ndyqsrze " ) ) )
. txrq ( txrqDate )
. dxyy ( rs . getString ( " dxyy " ) )
. build ( ) ) ;
}
}
String gwzjField = baseBean . getPropValue ( " lySalaryReport " , " gwzj_field_id " ) ;
String pqField = baseBean . getPropValue ( " lySalaryReport " , " pq_field_id " ) ;
/ / 查询职等职级信息
rs . execute ( " select id,gwzj from uf_zdzj_new " ) ;
Map < String , Integer > zdzjInfoMap = new HashMap < > ( ) ;
while ( rs . next ( ) ) {
String [ ] split = StringUtils . split ( rs . getString ( " gwzj " ) , " - " ) ;
if ( split ! = null & & split . length > 0 ) {
String gwzj = split [ 0 ] ;
zdzjInfoMap . put ( rs . getString ( " id " ) , SalaryEntityUtil . string2Integer ( gwzj ) ) ;
}
}
/ / 查询员工对应的职级 、 片区信息
List < Long > employeeIds = lyTxdaList . stream ( ) . map ( txdaPO - > txdaPO . getYg ( ) ) . distinct ( ) . collect ( Collectors . toList ( ) ) ;
List < List < Long > > partition = Lists . partition ( employeeIds , 800 ) ;
Map < Long , Integer > empZjMap = new HashMap < > ( ) ;
Map < Long , String > empPqMap = new HashMap < > ( ) ;
partition . forEach ( part - > {
rs . execute ( " select id, " + gwzjField + " , " + pqField + " from cus_fielddata where scope='HrmCustomFieldByInfoType' and scopeid=-1 and id in ( " + StringUtils . join ( part , " , " ) + " ) " ) ;
while ( rs . next ( ) ) {
String gwzj = Utils . null2String ( rs . getString ( gwzjField ) ) ;
if ( StringUtils . isNotBlank ( gwzj ) ) {
if ( gwzj . contains ( " _ " ) ) {
String [ ] split = gwzj . split ( " _ " ) ;
gwzj = split ! = null & & split . length > 0 ? split [ split . length - 1 ] : " " ;
}
empZjMap . put ( Long . valueOf ( rs . getInt ( " id " ) ) , zdzjInfoMap . get ( gwzj ) ) ;
}
empPqMap . put ( Long . valueOf ( rs . getInt ( " id " ) ) , Utils . null2String ( rs . getString ( pqField ) ) ) ;
}
} ) ;
/ / 获取人员分部信息
Map < Long , DataCollectionEmployee > employeeMap = SalaryEntityUtil . convert2Map ( getSalaryEmployeeService ( user ) . listByIds ( employeeIds ) , DataCollectionEmployee : : getEmployeeId ) ;
/ / 获取所有分部信息
Map < Long , SubCompanyInfo > subCompanyInfoMap = SalaryEntityUtil . convert2Map ( getSalaryEmployeeService ( user ) . listAllSubCompanyInfoList ( ) , SubCompanyInfo : : getId ) ;
/ / 所有档案赋值职级
lyTxdaList . stream ( ) . forEach ( txdaPO - > {
int zj = empZjMap . get ( txdaPO . getYg ( ) ) = = null ? - 1 : empZjMap . get ( txdaPO . getYg ( ) ) ;
txdaPO . setLyzj ( zj ) ;
txdaPO . setLypq ( Utils . null2String ( empPqMap . get ( txdaPO . getYg ( ) ) ) ) ;
txdaPO . setLyxm ( Utils . null2String ( employeeMap . get ( txdaPO . getYg ( ) ) = = null ? " " : employeeMap . get ( txdaPO . getYg ( ) ) . getSubcompanyid ( ) ) ) ;
} ) ;
/ / 调薪档案根据职级分组
List < LyTxdaDTO > reportDTOS = new ArrayList < LyTxdaDTO > ( ) ;
Map < String , List < LyTxdaPO > > archiveGroupByZj = SalaryEntityUtil . group2Map ( lyTxdaList , po - > po . getLyzj ( ) + " _split " + po . getLypq ( ) + " _split " + po . getLyxm ( ) ) ;
BigDecimal [ ] allNdtxzeSumVal = new BigDecimal [ ] { new BigDecimal ( " 0 " ) } ;
int zrc = 0 ;
for ( Map . Entry < String , List < LyTxdaPO > > entry : archiveGroupByZj . entrySet ( ) ) {
Map < String , BigDecimal > zjSumValueMap = new HashMap < > ( ) ;
String [ ] split = entry . getKey ( ) . split ( " _split " ) ;
Long zj = split ! = null & & split . length > 0 & & NumberUtils . isCreatable ( split [ 0 ] ) ? Long . valueOf ( split [ 0 ] ) : - 1 ;
String lypq = split ! = null & & split . length > 1 ? split [ 1 ] : " " ;
String lyxm = split ! = null & & split . length > 2 ? split [ 2 ] : " " ;
Map < Long , List < LyTxdaPO > > groupByYg = SalaryEntityUtil . group2Map ( entry . getValue ( ) , LyTxdaPO : : getYg ) ;
BigDecimal zjTxze = new BigDecimal ( " 0 " ) ;
for ( Map . Entry < Long , List < LyTxdaPO > > ygEntry : groupByYg . entrySet ( ) ) {
/ / 计算每个人的调薪总额
List < LyTxdaPO > sortedTxDTO = ygEntry . getValue ( ) . stream ( ) . sorted ( ( o1 , o2 ) - > o2 . getTxrq ( ) . compareTo ( o1 . getTxrq ( ) ) ) . collect ( Collectors . toList ( ) ) ;
BigDecimal ndyqsrze = sortedTxDTO . get ( 0 ) . getNdyqsrze ( ) = = null ? new BigDecimal ( " 0 " ) : sortedTxDTO . get ( 0 ) . getNdyqsrze ( ) ;
BigDecimal ndyqsrzeLast = sortedTxDTO . get ( sortedTxDTO . size ( ) - 1 ) . getNdyqsrze ( ) = = null ? new BigDecimal ( " 0 " ) : sortedTxDTO . get ( sortedTxDTO . size ( ) - 1 ) . getNdyqsrze ( ) ;
BigDecimal txValue = ndyqsrze . subtract ( ndyqsrzeLast ) ;
zjTxze = zjTxze . add ( txValue ) ;
allNdtxzeSumVal [ 0 ] = allNdtxzeSumVal [ 0 ] . add ( txValue ) ;
}
/ / 封装
SubCompanyInfo lypqInfo = subCompanyInfoMap . get ( SalaryEntityUtil . string2Long ( lypq ) ) ;
SubCompanyInfo lyxmInfo = subCompanyInfoMap . get ( SalaryEntityUtil . string2Long ( lyxm ) ) ;
Long txCount = entry . getValue ( ) . stream ( ) . filter ( PO - > ! excluedeTxyy . contains ( PO . getDxyy ( ) ) ) . count ( ) ;
reportDTOS . add ( LyTxdaDTO . builder ( )
. lypq ( lypqInfo = = null ? " " : Utils . null2String ( lypqInfo . getName ( ) ) )
. lypqShowOrder ( lypqInfo = = null | | lypqInfo . getShoworder ( ) = = null ? - 1 : lypqInfo . getShoworder ( ) )
. lyxm ( lyxmInfo = = null ? " " : Utils . null2String ( lyxmInfo . getName ( ) ) )
. lyxmShowOrder ( lyxmInfo = = null | | lyxmInfo . getShoworder ( ) = = null ? - 1 : lyxmInfo . getShoworder ( ) )
. zj ( zj = = null ? " -1 " : zj . toString ( ) )
. txrc ( txCount . intValue ( ) )
. ndtxze ( zjTxze . toPlainString ( ) )
. build ( ) ) ;
zrc = zrc + txCount . intValue ( ) ;
}
/ / 计算占周期内调薪总人数比例
BigDecimal txZrc = BigDecimal . valueOf ( zrc ) ;
reportDTOS . stream ( ) . forEach ( dto - > {
if ( dto . getTxrc ( ) ! = null ) {
BigDecimal txrc = BigDecimal . valueOf ( dto . getTxrc ( ) ) ;
dto . setZzqntxzrsbl ( txrc . divide ( txZrc , 4 , RoundingMode . HALF_UP ) . multiply ( new BigDecimal ( " 100 " ) ) . setScale ( 2 , RoundingMode . HALF_UP ) . toPlainString ( ) ) ;
}
if ( NumberUtils . isCreatable ( dto . getNdtxze ( ) ) ) {
BigDecimal ndtxze = new BigDecimal ( dto . getNdtxze ( ) ) ;
dto . setZzqntxzebl ( ndtxze . divide ( allNdtxzeSumVal [ 0 ] , 4 , RoundingMode . HALF_UP ) . multiply ( new BigDecimal ( " 100 " ) ) . setScale ( 2 , RoundingMode . HALF_UP ) . toPlainString ( ) ) ;
}
} ) ;
/ / reportDTOS根据lypq和lyxm和zj排序
reportDTOS = reportDTOS . stream ( ) . sorted ( new Comparator < LyTxdaDTO > ( ) {
@Override
public int compare ( LyTxdaDTO o1 , LyTxdaDTO o2 ) {
Integer o1zj = NumberUtils . isCreatable ( o1 . getZj ( ) ) ? Integer . valueOf ( o1 . getZj ( ) ) : - 1 ;
Integer o2zj = NumberUtils . isCreatable ( o2 . getZj ( ) ) ? Integer . valueOf ( o2 . getZj ( ) ) : - 1 ;
if ( o1zj . equals ( o2zj ) ) {
Integer o1pq = o1 . getLypqShowOrder ( ) = = null ? - 1 : o1 . getLypqShowOrder ( ) ;
Integer o2pq = o2 . getLypqShowOrder ( ) = = null ? - 1 : o2 . getLypqShowOrder ( ) ;
if ( o1pq . equals ( o2pq ) ) {
Integer o1xm = o1 . getLyxmShowOrder ( ) = = null ? - 1 : o1 . getLyxmShowOrder ( ) ;
Integer o2xm = o2 . getLyxmShowOrder ( ) = = null ? - 1 : o2 . getLyxmShowOrder ( ) ;
return o1xm . compareTo ( o2xm ) ;
} else {
return o1pq . compareTo ( o2pq ) ;
}
}
return o1zj . compareTo ( o2zj ) ;
}
} ) . collect ( Collectors . toList ( ) ) ;
/ / 计算饼状图 ( 根据职级汇总 )
LinkedHashMap < String , String > chartsMapA = new LinkedHashMap < > ( ) ;
LinkedHashMap < String , String > chartsMapB = new LinkedHashMap < > ( ) ;
Map < String , List < LyTxdaDTO > > groupByzj = SalaryEntityUtil . group2Map ( reportDTOS , LyTxdaDTO : : getZj ) ;
LinkedHashMap < String , List < LyTxdaDTO > > sortedGroupByzj = groupByzj . entrySet ( ) . stream ( )
. sorted ( new Comparator < Map . Entry < String , List < LyTxdaDTO > > > ( ) {
@Override
public int compare ( Map . Entry < String , List < LyTxdaDTO > > o1 , Map . Entry < String , List < LyTxdaDTO > > o2 ) {
Long key1 = NumberUtils . isCreatable ( o1 . getKey ( ) ) ? Long . valueOf ( o1 . getKey ( ) ) : - 1L ;
Long key2 = NumberUtils . isCreatable ( o2 . getKey ( ) ) ? Long . valueOf ( o2 . getKey ( ) ) : - 1L ;
return key1 . compareTo ( key2 ) ;
}
} )
. collect ( Collectors . toMap ( Map . Entry : : getKey , Map . Entry : : getValue , ( oldValue , newValue ) - > oldValue ,
LinkedHashMap : : new ) ) ;
for ( Map . Entry < String , List < LyTxdaDTO > > entry : sortedGroupByzj . entrySet ( ) ) {
String zj = entry . getKey ( ) ;
BigDecimal sumVal = entry . getValue ( ) . stream ( ) . map ( LyTxdaDTO : : getNdtxze ) . filter ( NumberUtils : : isCreatable ) . map ( BigDecimal : : new )
. reduce ( new BigDecimal ( " 0 " ) , BigDecimal : : add ) ;
String zb = sumVal . divide ( allNdtxzeSumVal [ 0 ] , 4 , RoundingMode . HALF_UP ) . multiply ( new BigDecimal ( " 100 " ) ) . setScale ( 2 , RoundingMode . HALF_UP ) . toPlainString ( ) ;
chartsMapB . put ( zj , zb ) ;
BigDecimal txrcSumVal = entry . getValue ( ) . stream ( ) . map ( LyTxdaDTO : : getTxrc ) . filter ( rc - > rc ! = null ) . map ( BigDecimal : : new )
. reduce ( new BigDecimal ( " 0 " ) , BigDecimal : : add ) ;
String txrc = txrcSumVal . divide ( txZrc , 4 , RoundingMode . HALF_UP ) . multiply ( new BigDecimal ( " 100 " ) ) . setScale ( 2 , RoundingMode . HALF_UP ) . toPlainString ( ) ;
chartsMapA . put ( zj , txrc ) ;
}
/ / 构建表头
List < WeaTableColumn > columns = new ArrayList < > ( ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 片区 " , " lypq " ) ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 项目 " , " lyxm " ) ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 职级 " , " zj " ) ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 调薪人次 " , " txrc " ) ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 占周期内调薪总人数比例 " , " zzqntxzrsbl " ) ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 年度调薪总额 " , " ndtxze " ) ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 占周期内调薪总额比例 " , " zzqntxzebl " ) ) ;
Map < String , Object > map = new HashMap < > ( ) ;
/ / if ( param . isExport ( ) ) {
/ / / / 合计或导出需要合计行
/ / Map < String , Object > sumResultMap = new HashMap < > ( ) ;
/ / sumResultMap . put ( gsmcItemId . toString ( ) , " 合计 " ) ;
/ / for ( SalaryItemPO salaryItem : salaryItemList ) {
/ / if ( salaryItem . getDataType ( ) . equals ( SalaryDataTypeEnum . NUMBER . getValue ( ) ) ) {
/ / BigDecimal sumValue = acctResultMap . stream ( )
/ / . map ( m - > m . get ( salaryItem . getId ( ) . toString ( ) ) )
/ / . filter ( value - > value ! = null & & NumberUtils . isCreatable ( value . toString ( ) ) )
/ / . map ( e - > SalaryEntityUtil . empty2Zero ( e . toString ( ) ) )
/ / . reduce ( BigDecimal . ZERO , BigDecimal : : add ) ;
/ / sumResultMap . put ( salaryItem . getId ( ) . toString ( ) , sumValue ) ;
/ / }
/ / }
/ / map . put ( " sumRow " , sumResultMap ) ;
/ / }
map . put ( " columns " , columns ) ;
map . put ( " data " , reportDTOS ) ;
map . put ( " chartsDataA " , chartsMapA ) ;
map . put ( " chartsDataB " , chartsMapB ) ;
return map ;
}
@Override
public XSSFWorkbook exportTxdazjtjReport ( LySalaryReportQueryParam parm ) {
Map < String , Object > resultMap = listLyTxdazjtjReport ( parm ) ;
List < LyTxdaDTO > dataList = ( List < LyTxdaDTO > ) resultMap . get ( " data " ) ;
List < WeaTableColumn > columns = ( List < WeaTableColumn > ) resultMap . get ( " columns " ) ;
/ / Map < String , Object > sum = ( Map < String , Object > ) resultMap . get ( " sum " ) ;
/ / dataList . add ( sum ) ;
List < Object > headerList = new ArrayList < > ( columns . stream ( ) . map ( WeaTableColumn : : getText ) . collect ( Collectors . toList ( ) ) ) ;
List < List < Object > > rows = new ArrayList < > ( ) ;
rows . add ( headerList ) ;
for ( LyTxdaDTO dto : dataList ) {
List < Object > row = Lists . newArrayList ( ) ;
Map < String , Object > valueMap = BeanUtil . beanToMap ( dto ) ;
for ( WeaTableColumn column : columns ) {
row . add ( Utils . null2String ( valueMap . get ( column . getColumn ( ) ) ) ) ;
}
rows . add ( row ) ;
}
/ / 获取excel
return ExcelUtilPlus . genWorkbookV2 ( rows , " 调薪档案职级统计报表 " , false ) ;
}
@Override
public Map < String , Object > listLyTxdazwjstjReport ( LySalaryReportQueryParam param ) {
Date startDate = SalaryDateUtil . dateStrToLocalDate ( param . getStartDate ( ) ) ;
Date endDate = SalaryDateUtil . dateStrToLocalDate ( param . getEndDate ( ) ) ;
if ( startDate = = null | | endDate = = null ) {
throw new SalaryRunTimeException ( " 开始或结束日期不存在或格式错误, 正确格式yyyy-MM-dd " ) ;
}
BaseBean baseBean = new BaseBean ( ) ;
RecordSet rs = new RecordSet ( ) ;
/ / 查询所有发薪的调薪档案
String excludeTxyy = baseBean . getPropValue ( " lySalaryReport " , " txdatj_exclued_txyy " ) ;
try {
excludeTxyy = new String ( excludeTxyy . getBytes ( " ISO-8859-1 " ) , " utf-8 " ) ;
} catch ( UnsupportedEncodingException e ) {
}
List < String > excluedeTxyy = Arrays . stream ( excludeTxyy . split ( " , " ) ) . collect ( Collectors . toList ( ) ) ;
String sql = " select yg,ndyqsrze,txrq,dxyy from uf_txda where txrq >=? and txrq<=? " ;
rs . executeQuery ( sql , Arrays . asList ( startDate , endDate ) ) ;
List < LyTxdaPO > lyTxdaList = new ArrayList < > ( ) ;
while ( rs . next ( ) ) {
Date txrqDate = SalaryDateUtil . dateStrToLocalDate ( rs . getString ( " txrq " ) ) ;
if ( txrqDate ! = null ) {
lyTxdaList . add ( LyTxdaPO . builder ( )
. yg ( NumberUtils . isCreatable ( rs . getString ( " yg " ) ) ? Long . valueOf ( rs . getString ( " yg " ) ) : - 1L )
. ndyqsrze ( SalaryEntityUtil . string2BigDecimalDefault0 ( rs . getString ( " ndyqsrze " ) ) )
. txrq ( txrqDate )
. dxyy ( rs . getString ( " dxyy " ) )
. build ( ) ) ;
}
}
String gwzjField = baseBean . getPropValue ( " lySalaryReport " , " gwzj_field_id " ) ;
String pqField = baseBean . getPropValue ( " lySalaryReport " , " pq_field_id " ) ;
String zwjsField = baseBean . getPropValue ( " lySalaryReport " , " zwjs_field_id " ) ;
/ / 查询职等职级信息
rs . execute ( " select id,gwzj from uf_zdzj_new " ) ;
Map < String , Integer > zdzjInfoMap = new HashMap < > ( ) ;
while ( rs . next ( ) ) {
String [ ] split = StringUtils . split ( rs . getString ( " gwzj " ) , " - " ) ;
if ( split ! = null & & split . length > 0 ) {
String gwzj = split [ 0 ] ;
zdzjInfoMap . put ( rs . getString ( " id " ) , SalaryEntityUtil . string2Integer ( gwzj ) ) ;
}
}
/ / 查询员工对应的职级 、 片区信息
List < Long > employeeIds = lyTxdaList . stream ( ) . map ( txdaPO - > txdaPO . getYg ( ) ) . distinct ( ) . collect ( Collectors . toList ( ) ) ;
List < List < Long > > partition = Lists . partition ( employeeIds , 800 ) ;
Map < Long , Integer > empZjMap = new HashMap < > ( ) ;
Map < Long , String > empPqMap = new HashMap < > ( ) ;
partition . forEach ( part - > {
rs . execute ( " select id, " + gwzjField + " , " + pqField + " from cus_fielddata where scope='HrmCustomFieldByInfoType' and scopeid=-1 and id in ( " + StringUtils . join ( part , " , " ) + " ) " ) ;
while ( rs . next ( ) ) {
String gwzj = Utils . null2String ( rs . getString ( gwzjField ) ) ;
if ( StringUtils . isNotBlank ( gwzj ) ) {
if ( gwzj . contains ( " _ " ) ) {
String [ ] split = gwzj . split ( " _ " ) ;
gwzj = split ! = null & & split . length > 0 ? split [ split . length - 1 ] : " " ;
}
empZjMap . put ( Long . valueOf ( rs . getInt ( " id " ) ) , zdzjInfoMap . get ( gwzj ) ) ;
}
empPqMap . put ( Long . valueOf ( rs . getInt ( " id " ) ) , Utils . null2String ( rs . getString ( pqField ) ) ) ;
}
} ) ;
/ / 查询员工对应的职务角色信息
Map < Long , String > empZwjsMap = new HashMap < > ( ) ;
partition . forEach ( part - > {
rs . execute ( " select id, " + zwjsField + " from cus_fielddata where scope='HrmCustomFieldByInfoType' and scopeid=3 and id in ( " + StringUtils . join ( part , " , " ) + " ) " ) ;
while ( rs . next ( ) ) {
empZwjsMap . put ( Long . valueOf ( rs . getInt ( " id " ) ) , Utils . null2String ( rs . getString ( zwjsField ) ) ) ;
}
} ) ;
/ / 获取人员分部信息
Map < Long , DataCollectionEmployee > employeeMap = SalaryEntityUtil . convert2Map ( getSalaryEmployeeService ( user ) . listByIds ( employeeIds ) , DataCollectionEmployee : : getEmployeeId ) ;
/ / 获取所有分部信息
Map < Long , SubCompanyInfo > subCompanyInfoMap = SalaryEntityUtil . convert2Map ( getSalaryEmployeeService ( user ) . listAllSubCompanyInfoList ( ) , SubCompanyInfo : : getId ) ;
/ / 获取所有职务角色数据
rs . execute ( " select id,mc from uf_zwjs " ) ;
Map < String , String > zwjsMap = new HashMap < > ( ) ;
while ( rs . next ( ) ) {
zwjsMap . put ( rs . getString ( " id " ) , rs . getString ( " mc " ) ) ;
}
/ / 所有档案赋值职级
lyTxdaList . stream ( ) . forEach ( txdaPO - > {
/ / int zj = empZjMap . get ( txdaPO . getYg ( ) ) = = null ? - 1 : empZjMap . get ( txdaPO . getYg ( ) ) ;
/ / txdaPO . setLyzj ( zj ) ;
txdaPO . setLypq ( Utils . null2String ( empPqMap . get ( txdaPO . getYg ( ) ) ) ) ;
txdaPO . setLyxm ( Utils . null2String ( employeeMap . get ( txdaPO . getYg ( ) ) = = null ? " " : employeeMap . get ( txdaPO . getYg ( ) ) . getSubcompanyid ( ) ) ) ;
String zwjs = empZwjsMap . get ( txdaPO . getYg ( ) ) = = null ? " " : empZwjsMap . get ( txdaPO . getYg ( ) ) ;
txdaPO . setLyzwjs ( zwjs ) ;
} ) ;
/ / 调薪档案根据职级分组
List < LyTxdaDTO > reportDTOS = new ArrayList < LyTxdaDTO > ( ) ;
Map < String , List < LyTxdaPO > > archiveGroupByZwjs = SalaryEntityUtil . group2Map ( lyTxdaList , po - > po . getLyzwjs ( ) + " _split " + po . getLypq ( ) + " _split " + po . getLyxm ( ) ) ;
BigDecimal [ ] allNdtxzeSumVal = new BigDecimal [ ] { new BigDecimal ( " 0 " ) } ;
int zrc = 0 ;
for ( Map . Entry < String , List < LyTxdaPO > > entry : archiveGroupByZwjs . entrySet ( ) ) {
Map < String , BigDecimal > zwjsSumValueMap = new HashMap < > ( ) ;
String [ ] split = entry . getKey ( ) . split ( " _split " ) ;
String zwjs = split ! = null & & split . length > 0 ? split [ 0 ] : " " ;
String lypq = split ! = null & & split . length > 1 ? split [ 1 ] : " " ;
String lyxm = split ! = null & & split . length > 2 ? split [ 2 ] : " " ;
Map < Long , List < LyTxdaPO > > groupByYg = SalaryEntityUtil . group2Map ( entry . getValue ( ) , LyTxdaPO : : getYg ) ;
BigDecimal zwjsTxze = new BigDecimal ( " 0 " ) ;
for ( Map . Entry < Long , List < LyTxdaPO > > ygEntry : groupByYg . entrySet ( ) ) {
/ / 计算每个人的调薪总额
List < LyTxdaPO > sortedTxDTO = ygEntry . getValue ( ) . stream ( ) . sorted ( ( o1 , o2 ) - > o2 . getTxrq ( ) . compareTo ( o1 . getTxrq ( ) ) ) . collect ( Collectors . toList ( ) ) ;
BigDecimal ndyqsrze = sortedTxDTO . get ( 0 ) . getNdyqsrze ( ) = = null ? new BigDecimal ( " 0 " ) : sortedTxDTO . get ( 0 ) . getNdyqsrze ( ) ;
BigDecimal ndyqsrzeLast = sortedTxDTO . get ( sortedTxDTO . size ( ) - 1 ) . getNdyqsrze ( ) = = null ? new BigDecimal ( " 0 " ) : sortedTxDTO . get ( sortedTxDTO . size ( ) - 1 ) . getNdyqsrze ( ) ;
BigDecimal txValue = ndyqsrze . subtract ( ndyqsrzeLast ) ;
zwjsTxze = zwjsTxze . add ( txValue ) ;
allNdtxzeSumVal [ 0 ] = allNdtxzeSumVal [ 0 ] . add ( txValue ) ;
}
/ / 封装
SubCompanyInfo lypqInfo = subCompanyInfoMap . get ( SalaryEntityUtil . string2Long ( lypq ) ) ;
SubCompanyInfo lyxmInfo = subCompanyInfoMap . get ( SalaryEntityUtil . string2Long ( lyxm ) ) ;
Long txCount = entry . getValue ( ) . stream ( ) . filter ( PO - > ! excluedeTxyy . contains ( PO . getDxyy ( ) ) ) . count ( ) ;
reportDTOS . add ( LyTxdaDTO . builder ( )
. lypq ( lypqInfo = = null ? " " : Utils . null2String ( lypqInfo . getName ( ) ) )
. lypqShowOrder ( lypqInfo = = null | | lypqInfo . getShoworder ( ) = = null ? - 1 : lypqInfo . getShoworder ( ) )
. lyxm ( lyxmInfo = = null ? " " : Utils . null2String ( lyxmInfo . getName ( ) ) )
. lyxmShowOrder ( lyxmInfo = = null | | lyxmInfo . getShoworder ( ) = = null ? - 1 : lyxmInfo . getShoworder ( ) )
. zwjs ( zwjsMap . getOrDefault ( zwjs , " " ) )
. zwjsId ( NumberUtils . isCreatable ( zwjs ) ? Long . valueOf ( zwjs ) : - 1 )
. txrc ( txCount . intValue ( ) )
. ndtxze ( zwjsTxze . toPlainString ( ) )
. build ( ) ) ;
zrc = zrc + txCount . intValue ( ) ;
}
/ / 计算占周期内调薪总人数比例
BigDecimal txZrc = BigDecimal . valueOf ( zrc ) ;
reportDTOS . stream ( ) . forEach ( dto - > {
if ( dto . getTxrc ( ) ! = null ) {
BigDecimal txrc = BigDecimal . valueOf ( dto . getTxrc ( ) ) ;
dto . setZzqntxzrsbl ( txrc . divide ( txZrc , 4 , RoundingMode . HALF_UP ) . multiply ( new BigDecimal ( " 100 " ) ) . setScale ( 2 , RoundingMode . HALF_UP ) . toPlainString ( ) ) ;
}
if ( NumberUtils . isCreatable ( dto . getNdtxze ( ) ) ) {
BigDecimal ndtxze = new BigDecimal ( dto . getNdtxze ( ) ) ;
dto . setZzqntxzebl ( ndtxze . divide ( allNdtxzeSumVal [ 0 ] , 4 , RoundingMode . HALF_UP ) . multiply ( new BigDecimal ( " 100 " ) ) . setScale ( 2 , RoundingMode . HALF_UP ) . toPlainString ( ) ) ;
}
} ) ;
/ / reportDTOS排序
reportDTOS = reportDTOS . stream ( ) . sorted ( new Comparator < LyTxdaDTO > ( ) {
@Override
public int compare ( LyTxdaDTO o1 , LyTxdaDTO o2 ) {
Long o1zj = o1 . getZwjsId ( ) ! = null ? o1 . getZwjsId ( ) : - 1L ;
Long o2zj = o2 . getZwjsId ( ) ! = null ? o2 . getZwjsId ( ) : - 1L ;
if ( o1zj . equals ( o2zj ) ) {
Integer o1pq = o1 . getLypqShowOrder ( ) = = null ? - 1 : o1 . getLypqShowOrder ( ) ;
Integer o2pq = o2 . getLypqShowOrder ( ) = = null ? - 1 : o2 . getLypqShowOrder ( ) ;
if ( o1pq . equals ( o2pq ) ) {
Integer o1xm = o1 . getLyxmShowOrder ( ) = = null ? - 1 : o1 . getLyxmShowOrder ( ) ;
Integer o2xm = o2 . getLyxmShowOrder ( ) = = null ? - 1 : o2 . getLyxmShowOrder ( ) ;
return o1xm . compareTo ( o2xm ) ;
} else {
return o1pq . compareTo ( o2pq ) ;
}
}
return o1zj . compareTo ( o2zj ) ;
}
} ) . collect ( Collectors . toList ( ) ) ;
/ / 计算饼状图 ( 根据职级汇总 )
LinkedHashMap < String , String > chartsMapA = new LinkedHashMap < > ( ) ;
LinkedHashMap < String , String > chartsMapB = new LinkedHashMap < > ( ) ;
Map < Long , List < LyTxdaDTO > > groupByzj = SalaryEntityUtil . group2Map ( reportDTOS , LyTxdaDTO : : getZwjsId ) ;
LinkedHashMap < Long , List < LyTxdaDTO > > sortedGroupByzj = groupByzj . entrySet ( ) . stream ( )
. sorted ( Map . Entry . comparingByKey ( ) )
. collect ( Collectors . toMap ( Map . Entry : : getKey , Map . Entry : : getValue , ( oldValue , newValue ) - > oldValue ,
LinkedHashMap : : new ) ) ;
for ( Map . Entry < Long , List < LyTxdaDTO > > entry : sortedGroupByzj . entrySet ( ) ) {
Long zwjsId = entry . getKey ( ) ;
BigDecimal sumVal = entry . getValue ( ) . stream ( ) . map ( LyTxdaDTO : : getNdtxze ) . filter ( NumberUtils : : isCreatable ) . map ( BigDecimal : : new )
. reduce ( new BigDecimal ( " 0 " ) , BigDecimal : : add ) ;
String zb = sumVal . divide ( allNdtxzeSumVal [ 0 ] , 4 , RoundingMode . HALF_UP ) . multiply ( new BigDecimal ( " 100 " ) ) . setScale ( 2 , RoundingMode . HALF_UP ) . toPlainString ( ) ;
chartsMapB . put ( zwjsMap . getOrDefault ( Utils . null2String ( zwjsId ) , " " ) , zb ) ;
BigDecimal txrcSumVal = entry . getValue ( ) . stream ( ) . map ( LyTxdaDTO : : getTxrc ) . filter ( rc - > rc ! = null ) . map ( BigDecimal : : new )
. reduce ( new BigDecimal ( " 0 " ) , BigDecimal : : add ) ;
String txrc = txrcSumVal . divide ( txZrc , 4 , RoundingMode . HALF_UP ) . multiply ( new BigDecimal ( " 100 " ) ) . setScale ( 2 , RoundingMode . HALF_UP ) . toPlainString ( ) ;
chartsMapA . put ( zwjsMap . getOrDefault ( Utils . null2String ( zwjsId ) , " " ) , txrc ) ;
}
/ / 构建表头
List < WeaTableColumn > columns = new ArrayList < > ( ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 片区 " , " lypq " ) ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 项目 " , " lyxm " ) ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 职务角色 " , " zwjs " ) ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 调薪人次 " , " txrc " ) ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 占周期内调薪总人数比例 " , " zzqntxzrsbl " ) ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 年度调薪总额 " , " ndtxze " ) ) ;
columns . add ( new WeaTableColumn ( " 150px " , " 占周期内调薪总额比例 " , " zzqntxzebl " ) ) ;
Map < String , Object > map = new HashMap < > ( ) ;
/ / if ( param . isExport ( ) ) {
/ / / / 合计或导出需要合计行
/ / Map < String , Object > sumResultMap = new HashMap < > ( ) ;
/ / sumResultMap . put ( gsmcItemId . toString ( ) , " 合计 " ) ;
/ / for ( SalaryItemPO salaryItem : salaryItemList ) {
/ / if ( salaryItem . getDataType ( ) . equals ( SalaryDataTypeEnum . NUMBER . getValue ( ) ) ) {
/ / BigDecimal sumValue = acctResultMap . stream ( )
/ / . map ( m - > m . get ( salaryItem . getId ( ) . toString ( ) ) )
/ / . filter ( value - > value ! = null & & NumberUtils . isCreatable ( value . toString ( ) ) )
/ / . map ( e - > SalaryEntityUtil . empty2Zero ( e . toString ( ) ) )
/ / . reduce ( BigDecimal . ZERO , BigDecimal : : add ) ;
/ / sumResultMap . put ( salaryItem . getId ( ) . toString ( ) , sumValue ) ;
/ / }
/ / }
/ / map . put ( " sumRow " , sumResultMap ) ;
/ / }
map . put ( " columns " , columns ) ;
map . put ( " data " , reportDTOS ) ;
map . put ( " chartsDataA " , chartsMapA ) ;
map . put ( " chartsDataB " , chartsMapB ) ;
return map ;
}
@Override
public XSSFWorkbook exportTxdazwjstjReport ( LySalaryReportQueryParam param ) {
Map < String , Object > resultMap = listLyTxdazwjstjReport ( param ) ;
List < LyTxdaDTO > dataList = ( List < LyTxdaDTO > ) resultMap . get ( " data " ) ;
List < WeaTableColumn > columns = ( List < WeaTableColumn > ) resultMap . get ( " columns " ) ;
/ / Map < String , Object > sum = ( Map < String , Object > ) resultMap . get ( " sum " ) ;
/ / dataList . add ( sum ) ;
List < Object > headerList = new ArrayList < > ( columns . stream ( ) . map ( WeaTableColumn : : getText ) . collect ( Collectors . toList ( ) ) ) ;
List < List < Object > > rows = new ArrayList < > ( ) ;
rows . add ( headerList ) ;
for ( LyTxdaDTO dto : dataList ) {
List < Object > row = Lists . newArrayList ( ) ;
Map < String , Object > valueMap = BeanUtil . beanToMap ( dto ) ;
for ( WeaTableColumn column : columns ) {
row . add ( Utils . null2String ( valueMap . get ( column . getColumn ( ) ) ) ) ;
}
rows . add ( row ) ;
}
/ / 获取excel
return ExcelUtilPlus . genWorkbookV2 ( rows , " 调薪档案职务角色统计报表 " , false ) ;
}
}