领悦报表1:薪酬档案职级统计报表
This commit is contained in:
parent
4dcb8f2275
commit
9a1b7be680
|
|
@ -244,4 +244,13 @@ public class EmployBiz extends BaseBean {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<SubCompanyInfo> listAllSubCompanyInfoList() {
|
||||||
|
SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession();
|
||||||
|
try {
|
||||||
|
EmployMapper mapper = sqlSession.getMapper(EmployMapper.class);
|
||||||
|
return mapper.listAllSubCompanyInfoList();
|
||||||
|
} finally {
|
||||||
|
sqlSession.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,4 +27,6 @@ public class SubCompanyInfo {
|
||||||
*/
|
*/
|
||||||
@I18n
|
@I18n
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
|
private Integer showorder;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
package com.engine.salary.entity.salaryacct.dto;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Harryxzy
|
||||||
|
* @ClassName LyDazjtjReportDTO
|
||||||
|
* @date 2025/09/15 9:12
|
||||||
|
* @description 薪酬档案职级统计报表
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class LyDazjtjReportDTO {
|
||||||
|
|
||||||
|
private String lypq;
|
||||||
|
private Integer lypqShowOrder;
|
||||||
|
private String lyxm;
|
||||||
|
private Integer lyxmShowOrder;
|
||||||
|
|
||||||
|
|
||||||
|
// 职级
|
||||||
|
private String zj;
|
||||||
|
|
||||||
|
// 职务角色
|
||||||
|
private Long zwjsId;
|
||||||
|
private String zwjs;
|
||||||
|
|
||||||
|
// 在职人数
|
||||||
|
private Integer zzrs;
|
||||||
|
|
||||||
|
// 年度收入总额
|
||||||
|
private String ndsrze;
|
||||||
|
|
||||||
|
// 年度收入总额占比
|
||||||
|
private String ndsrzezb;
|
||||||
|
|
||||||
|
// 月度标准工资总额
|
||||||
|
private String ydbzgzze;
|
||||||
|
|
||||||
|
// 月度绩效总额
|
||||||
|
private String ydjxze;
|
||||||
|
|
||||||
|
// 1季度绩效总额
|
||||||
|
private String yjdjxze;
|
||||||
|
|
||||||
|
// 2季度绩效总额
|
||||||
|
private String ejdjxze;
|
||||||
|
|
||||||
|
// 3季度绩效总额
|
||||||
|
private String sjdjxze;
|
||||||
|
|
||||||
|
// 4季度绩效总额
|
||||||
|
private String sijdjxze;
|
||||||
|
|
||||||
|
// 年终奖总额
|
||||||
|
private String nzjze;
|
||||||
|
|
||||||
|
// 季度绩效总额
|
||||||
|
private String jdjxze;
|
||||||
|
}
|
||||||
|
|
@ -128,6 +128,13 @@ public class SalaryArchivePO {
|
||||||
@ElogTransform(name = "个税扣缴义务人id")
|
@ElogTransform(name = "个税扣缴义务人id")
|
||||||
private Long taxAgentId;
|
private Long taxAgentId;
|
||||||
|
|
||||||
|
private Integer lyzj;
|
||||||
|
|
||||||
|
private String lypq;
|
||||||
|
|
||||||
|
private String lyxm;
|
||||||
|
|
||||||
|
private String lyzwjs;
|
||||||
|
|
||||||
|
|
||||||
//---------条件-------
|
//---------条件-------
|
||||||
|
|
|
||||||
|
|
@ -188,4 +188,6 @@ public interface EmployMapper {
|
||||||
List<LyFzhsInfo> listAllFzhsInfo();
|
List<LyFzhsInfo> listAllFzhsInfo();
|
||||||
|
|
||||||
List<LyFzhsInfo> listFzhsInfoByDeptIds(@Param("departmentIds")List<Long> departmentIds);
|
List<LyFzhsInfo> listFzhsInfoByDeptIds(@Param("departmentIds")List<Long> departmentIds);
|
||||||
|
|
||||||
|
List<SubCompanyInfo> listAllSubCompanyInfoList();
|
||||||
}
|
}
|
||||||
|
|
@ -475,6 +475,14 @@
|
||||||
where d.subcompanyname = #{name}
|
where d.subcompanyname = #{name}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="listAllSubCompanyInfoList" resultType="com.engine.salary.entity.hrm.SubCompanyInfo">
|
||||||
|
select d.subcompanyname as name,
|
||||||
|
d.id as id,
|
||||||
|
d.showorder as showorder
|
||||||
|
from hrmsubcompany d
|
||||||
|
|
||||||
|
</select>
|
||||||
|
|
||||||
<select id="getDeptInfoById" resultType="com.engine.salary.entity.hrm.DeptInfo">
|
<select id="getDeptInfoById" resultType="com.engine.salary.entity.hrm.DeptInfo">
|
||||||
select d.departmentname as name,
|
select d.departmentname as name,
|
||||||
d.id as id,
|
d.id as id,
|
||||||
|
|
@ -690,4 +698,5 @@
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|
@ -154,4 +154,12 @@ public interface LySalaryReportService {
|
||||||
void deleteByIds(List<Long> needDeleteIds);
|
void deleteByIds(List<Long> needDeleteIds);
|
||||||
|
|
||||||
Map<String, String> getHszb(String ffgsqc);
|
Map<String, String> getHszb(String ffgsqc);
|
||||||
|
|
||||||
|
Map<String, Object> listLyXcdazjtjReport();
|
||||||
|
|
||||||
|
XSSFWorkbook exportXcdazjtjReport();
|
||||||
|
|
||||||
|
Map<String, Object> listLyXcdazwjstjReport();
|
||||||
|
|
||||||
|
XSSFWorkbook exportXcdazwjstjReport();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -114,6 +114,8 @@ public interface SalaryEmployeeService {
|
||||||
|
|
||||||
List<SubCompanyInfo> getSubCompanyInfoList(List<Long> subDepartmentIds);
|
List<SubCompanyInfo> getSubCompanyInfoList(List<Long> subDepartmentIds);
|
||||||
|
|
||||||
|
List<SubCompanyInfo> listAllSubCompanyInfoList();
|
||||||
|
|
||||||
SubCompanyInfo getSubCompanyInfoById(Long subDepartmentId);
|
SubCompanyInfo getSubCompanyInfoById(Long subDepartmentId);
|
||||||
|
|
||||||
List<SubCompanyInfo> getVirtualSubCompanyInfoList(List<Long> virtualSubDepartmentIds);
|
List<SubCompanyInfo> getVirtualSubCompanyInfoList(List<Long> virtualSubDepartmentIds);
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
package com.engine.salary.service.impl;
|
package com.engine.salary.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import com.api.formmode.page.util.Util;
|
||||||
import com.cloudstore.eccom.pc.table.WeaTableColumn;
|
import com.cloudstore.eccom.pc.table.WeaTableColumn;
|
||||||
import com.engine.common.util.ServiceUtil;
|
import com.engine.common.util.ServiceUtil;
|
||||||
import com.engine.core.impl.Service;
|
import com.engine.core.impl.Service;
|
||||||
|
|
@ -7,6 +9,7 @@ import com.engine.salary.common.LocalDateRange;
|
||||||
import com.engine.salary.component.WeaTableColumnGroup;
|
import com.engine.salary.component.WeaTableColumnGroup;
|
||||||
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
|
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
|
||||||
import com.engine.salary.entity.hrm.DeptInfo;
|
import com.engine.salary.entity.hrm.DeptInfo;
|
||||||
|
import com.engine.salary.entity.hrm.SubCompanyInfo;
|
||||||
import com.engine.salary.entity.ly.dto.LyFzhsInfo;
|
import com.engine.salary.entity.ly.dto.LyFzhsInfo;
|
||||||
import com.engine.salary.entity.ly.param.LySalaryReportQueryParam;
|
import com.engine.salary.entity.ly.param.LySalaryReportQueryParam;
|
||||||
import com.engine.salary.entity.ly.po.LySalaryReportPO;
|
import com.engine.salary.entity.ly.po.LySalaryReportPO;
|
||||||
|
|
@ -14,9 +17,12 @@ import com.engine.salary.entity.ly.po.UfGjjInfo;
|
||||||
import com.engine.salary.entity.ly.po.UfSbInfo;
|
import com.engine.salary.entity.ly.po.UfSbInfo;
|
||||||
import com.engine.salary.entity.salaryacct.bo.SalaryAcctFormulaBO;
|
import com.engine.salary.entity.salaryacct.bo.SalaryAcctFormulaBO;
|
||||||
import com.engine.salary.entity.salaryacct.bo.SalaryAcctResultBO;
|
import com.engine.salary.entity.salaryacct.bo.SalaryAcctResultBO;
|
||||||
|
import com.engine.salary.entity.salaryacct.dto.LyDazjtjReportDTO;
|
||||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
|
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
|
||||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
|
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
|
||||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
|
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
|
||||||
|
import com.engine.salary.entity.salaryarchive.po.SalaryArchiveItemPO;
|
||||||
|
import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO;
|
||||||
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
|
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
|
||||||
import com.engine.salary.entity.salarysob.po.SalarySobEmpFieldPO;
|
import com.engine.salary.entity.salarysob.po.SalarySobEmpFieldPO;
|
||||||
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
|
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
|
||||||
|
|
@ -25,6 +31,7 @@ import com.engine.salary.entity.taxagent.po.TaxAgentPO;
|
||||||
import com.engine.salary.enums.UserStatusEnum;
|
import com.engine.salary.enums.UserStatusEnum;
|
||||||
import com.engine.salary.enums.ly.LyPushStatusEnum;
|
import com.engine.salary.enums.ly.LyPushStatusEnum;
|
||||||
import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum;
|
import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum;
|
||||||
|
import com.engine.salary.enums.salaryarchive.SalaryArchiveStatusEnum;
|
||||||
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
|
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
|
||||||
import com.engine.salary.exception.SalaryRunTimeException;
|
import com.engine.salary.exception.SalaryRunTimeException;
|
||||||
import com.engine.salary.mapper.ly.LySalaryReportMapper;
|
import com.engine.salary.mapper.ly.LySalaryReportMapper;
|
||||||
|
|
@ -51,6 +58,7 @@ import weaver.hrm.User;
|
||||||
import weaver.wechat.util.Utils;
|
import weaver.wechat.util.Utils;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
@ -107,6 +115,11 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
||||||
return MapperProxyFactory.getProxy(UfSbgjjMapper.class);
|
return MapperProxyFactory.getProxy(UfSbgjjMapper.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private SalaryArchiveService getSalaryArchiveService(User user) {
|
||||||
|
return ServiceUtil.getService(SalaryArchiveServiceImpl.class, user);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询所有记录
|
* 查询所有记录
|
||||||
*
|
*
|
||||||
|
|
@ -2738,4 +2751,544 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> listLyXcdazjtjReport() {
|
||||||
|
// 查询所有发薪的薪资档案
|
||||||
|
List<SalaryArchivePO> salaryArchivePOList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().runStatusList(Arrays.asList(SalaryArchiveStatusEnum.FIXED.getValue(), SalaryArchiveStatusEnum.SUSPEND.getValue())).build());
|
||||||
|
BaseBean baseBean = new BaseBean();
|
||||||
|
String gwzjField = baseBean.getPropValue("lySalaryReport", "gwzj_field_id");
|
||||||
|
String pqField = baseBean.getPropValue("lySalaryReport", "pq_field_id");
|
||||||
|
RecordSet rs = new RecordSet();
|
||||||
|
// 查询职等职级信息
|
||||||
|
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 = salaryArchivePOList.stream().map(salaryArchivePO -> salaryArchivePO.getEmployeeId()).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);
|
||||||
|
|
||||||
|
// 所有档案赋值职级
|
||||||
|
salaryArchivePOList.stream().forEach(salaryArchivePO -> {
|
||||||
|
int zj = empZjMap.get(salaryArchivePO.getEmployeeId()) == null ? -1 : empZjMap.get(salaryArchivePO.getEmployeeId());
|
||||||
|
salaryArchivePO.setLyzj(zj);
|
||||||
|
salaryArchivePO.setLypq(Utils.null2String(empPqMap.get(salaryArchivePO.getEmployeeId())));
|
||||||
|
salaryArchivePO.setLyxm(Utils.null2String(employeeMap.get(salaryArchivePO.getEmployeeId()) == null ? "" : employeeMap.get(salaryArchivePO.getEmployeeId()).getSubcompanyid()));
|
||||||
|
});
|
||||||
|
// 获取薪资档案字段id值
|
||||||
|
Long ndyssyzeItemId = SalaryEntityUtil.string2Long(baseBean.getPropValue("lySalaryReport", "xzdazjtj_ndyssrze_field_id"));
|
||||||
|
Long ydbzgzItemId = SalaryEntityUtil.string2Long(baseBean.getPropValue("lySalaryReport", "xzdazjtj_ydbzgz_field_id"));
|
||||||
|
Long ydjxzeItemId = SalaryEntityUtil.string2Long(baseBean.getPropValue("lySalaryReport", "xzdazjtj_ydjx_field_id"));
|
||||||
|
Long gdffblItemId = SalaryEntityUtil.string2Long(baseBean.getPropValue("lySalaryReport", "xzdazjtj_gdffbl_field_id"));
|
||||||
|
Long lbjtItemId = SalaryEntityUtil.string2Long(baseBean.getPropValue("lySalaryReport", "xzdazjtj_lbjt_field_id"));
|
||||||
|
Long nzjxsItemId = SalaryEntityUtil.string2Long(baseBean.getPropValue("lySalaryReport", "xzdazjtj_nzjxs_field_id"));
|
||||||
|
List<Long> salaryItemIds = Arrays.asList(ndyssyzeItemId, ydbzgzItemId, ydjxzeItemId, gdffblItemId, lbjtItemId, nzjxsItemId);
|
||||||
|
List<List<SalaryArchivePO>> archivePartition = Lists.partition(salaryArchivePOList, 500);
|
||||||
|
// 查询员工当前生效的薪资档案数据
|
||||||
|
List<SalaryArchiveItemPO> archiveItemPOS = new ArrayList<>();
|
||||||
|
archivePartition.forEach(part -> {
|
||||||
|
List<Long> archiveIds = part.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
|
||||||
|
archiveItemPOS.addAll(getSalaryArchiveService(user).getCurrentEffectiveItemList(archiveIds, salaryItemIds));
|
||||||
|
});
|
||||||
|
Map<Long, List<SalaryArchiveItemPO>> archiveItemPOSGroupByAchiveId = SalaryEntityUtil.group2Map(archiveItemPOS, SalaryArchiveItemPO::getSalaryArchiveId);
|
||||||
|
|
||||||
|
// 薪资档案根据职级分组
|
||||||
|
List<LyDazjtjReportDTO> reportDTOS = new ArrayList<LyDazjtjReportDTO>();
|
||||||
|
Map<String, List<SalaryArchivePO>> archivePOGroupByZj = SalaryEntityUtil.group2Map(salaryArchivePOList, po -> po.getLyzj() + "_split" + po.getLypq() + "_split" + po.getLyxm());
|
||||||
|
BigDecimal[] allNdsrzeSumVal = new BigDecimal[]{new BigDecimal("0")};
|
||||||
|
for (Map.Entry<String, List<SalaryArchivePO>> entry : archivePOGroupByZj.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] : "";
|
||||||
|
List<Long> singleGroupArchiveIds = entry.getValue().stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
|
||||||
|
singleGroupArchiveIds.stream().forEach(archiveId -> {
|
||||||
|
List<SalaryArchiveItemPO> salaryArchiveItemPOList = archiveItemPOSGroupByAchiveId.get(archiveId);
|
||||||
|
if (CollectionUtils.isNotEmpty(salaryArchiveItemPOList)) {
|
||||||
|
Map<Long, String> archiveValueMap = SalaryEntityUtil.convert2Map(salaryArchiveItemPOList, SalaryArchiveItemPO::getSalaryItemId, SalaryArchiveItemPO::getItemValue);
|
||||||
|
BigDecimal ndsrzezbSumVal = zjSumValueMap.computeIfAbsent("ndsrze", k -> new BigDecimal("0"));
|
||||||
|
BigDecimal ndsrzezbVal = SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(ndyssyzeItemId));
|
||||||
|
zjSumValueMap.put("ndsrze", ndsrzezbSumVal.add(ndsrzezbVal));
|
||||||
|
allNdsrzeSumVal[0] = allNdsrzeSumVal[0].add(ndsrzezbVal);
|
||||||
|
|
||||||
|
BigDecimal ydbzgzSumVal = zjSumValueMap.computeIfAbsent("ydbzgz", k -> new BigDecimal("0"));
|
||||||
|
BigDecimal ydbzgzVal = SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(ydbzgzItemId));
|
||||||
|
zjSumValueMap.put("ydbzgz", ydbzgzSumVal.add(ydbzgzVal));
|
||||||
|
|
||||||
|
BigDecimal ydjxzeSumVal = zjSumValueMap.computeIfAbsent("ydjx", k -> new BigDecimal("0"));
|
||||||
|
BigDecimal ydjxzeVal = SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(ydjxzeItemId));
|
||||||
|
zjSumValueMap.put("ydjx", ydjxzeSumVal.add(ydjxzeVal));
|
||||||
|
|
||||||
|
BigDecimal yjdjxVal = new BigDecimal("0");
|
||||||
|
BigDecimal sjdjxVal = new BigDecimal("0");
|
||||||
|
if (!zj.equals(new Long("0")) && !zj.equals(new Long("1")) && !zj.equals(new Long("2"))) {
|
||||||
|
// 年度预算收入总额*(1-固定比例)*20%
|
||||||
|
BigDecimal gdblVal = SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(gdffblItemId));
|
||||||
|
yjdjxVal = (new BigDecimal("1").subtract(gdblVal)).multiply(new BigDecimal("0.2")).multiply(ndsrzezbVal);
|
||||||
|
BigDecimal yjdjxValSum = zjSumValueMap.computeIfAbsent("yjdjx", k -> new BigDecimal("0"));
|
||||||
|
zjSumValueMap.put("yjdjx", yjdjxValSum.add(yjdjxVal));
|
||||||
|
|
||||||
|
BigDecimal ejdjxValSum = zjSumValueMap.computeIfAbsent("ejdjx", k -> new BigDecimal("0"));
|
||||||
|
zjSumValueMap.put("ejdjx", ejdjxValSum.add(yjdjxVal));
|
||||||
|
|
||||||
|
// 年度预算收入总额*(1-固定比例)*30%
|
||||||
|
sjdjxVal = (new BigDecimal("1").subtract(gdblVal)).multiply(new BigDecimal("0.3")).multiply(ndsrzezbVal);
|
||||||
|
BigDecimal sjdjxValSum = zjSumValueMap.computeIfAbsent("sjdjx", k -> new BigDecimal("0"));
|
||||||
|
zjSumValueMap.put("sjdjx", sjdjxValSum.add(sjdjxVal));
|
||||||
|
|
||||||
|
BigDecimal sijdjxValSum = zjSumValueMap.computeIfAbsent("sijdjx", k -> new BigDecimal("0"));
|
||||||
|
zjSumValueMap.put("sijdjx", sijdjxValSum.add(sjdjxVal));
|
||||||
|
}
|
||||||
|
|
||||||
|
//(月度标准工资+月度绩效+领班津贴)*年终奖系数
|
||||||
|
BigDecimal nzjzeVal = (ydbzgzVal.add(ydjxzeVal).add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(lbjtItemId))))
|
||||||
|
.multiply(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(nzjxsItemId)));
|
||||||
|
BigDecimal nzjzeValSum = zjSumValueMap.computeIfAbsent("nzjze", k -> new BigDecimal("0"));
|
||||||
|
zjSumValueMap.put("nzjze", nzjzeValSum.add(nzjzeVal));
|
||||||
|
|
||||||
|
BigDecimal jdjxzeVal = yjdjxVal.add(yjdjxVal).add(sjdjxVal).add(sjdjxVal);
|
||||||
|
BigDecimal jdjxzeValSum = zjSumValueMap.computeIfAbsent("jdjxze", k -> new BigDecimal("0"));
|
||||||
|
zjSumValueMap.put("jdjxze", jdjxzeValSum.add(jdjxzeVal));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// 封装
|
||||||
|
SubCompanyInfo lypqInfo = subCompanyInfoMap.get(SalaryEntityUtil.string2Long(lypq));
|
||||||
|
SubCompanyInfo lyxmInfo = subCompanyInfoMap.get(SalaryEntityUtil.string2Long(lyxm));
|
||||||
|
reportDTOS.add(LyDazjtjReportDTO.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())
|
||||||
|
.zzrs(entry.getValue().size())
|
||||||
|
.ndsrze(Util.null2String(zjSumValueMap.get("ndsrze")))
|
||||||
|
.ydbzgzze(Util.null2String(zjSumValueMap.get("ydbzgz")))
|
||||||
|
.ydjxze(Util.null2String(zjSumValueMap.get("ydjx")))
|
||||||
|
.yjdjxze(Util.null2String(zjSumValueMap.get("yjdjx")))
|
||||||
|
.ejdjxze(Util.null2String(zjSumValueMap.get("ejdjx")))
|
||||||
|
.sjdjxze(Util.null2String(zjSumValueMap.get("sjdjx")))
|
||||||
|
.sijdjxze(Util.null2String(zjSumValueMap.get("sijdjx")))
|
||||||
|
.nzjze(Util.null2String(zjSumValueMap.get("nzjze")))
|
||||||
|
.jdjxze(Util.null2String(zjSumValueMap.get("jdjxze")))
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
// 计算年度收入总额占比
|
||||||
|
reportDTOS.stream().forEach(dto -> {
|
||||||
|
if (NumberUtils.isCreatable(dto.getNdsrze())) {
|
||||||
|
BigDecimal ndsrze = SalaryEntityUtil.string2BigDecimalDefault0(dto.getNdsrze());
|
||||||
|
dto.setNdsrzezb(ndsrze.divide(allNdsrzeSumVal[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<LyDazjtjReportDTO>() {
|
||||||
|
@Override
|
||||||
|
public int compare(LyDazjtjReportDTO o1, LyDazjtjReportDTO 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> chartsMap = new LinkedHashMap<>();
|
||||||
|
Map<String, List<LyDazjtjReportDTO>> groupByzj = SalaryEntityUtil.group2Map(reportDTOS, LyDazjtjReportDTO::getZj);
|
||||||
|
LinkedHashMap<String, List<LyDazjtjReportDTO>> sortedGroupByzj = groupByzj.entrySet().stream()
|
||||||
|
.sorted(new Comparator<Map.Entry<String, List<LyDazjtjReportDTO>>>() {
|
||||||
|
@Override
|
||||||
|
public int compare(Map.Entry<String, List<LyDazjtjReportDTO>> o1, Map.Entry<String, List<LyDazjtjReportDTO>> 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<LyDazjtjReportDTO>> entry : sortedGroupByzj.entrySet()) {
|
||||||
|
String zj = entry.getKey();
|
||||||
|
BigDecimal sumVal = entry.getValue().stream().map(LyDazjtjReportDTO::getNdsrze).filter(NumberUtils::isCreatable).map(BigDecimal::new)
|
||||||
|
.reduce(new BigDecimal("0"), BigDecimal::add);
|
||||||
|
String zb = sumVal.divide(allNdsrzeSumVal[0], 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).toPlainString();
|
||||||
|
chartsMap.put(zj, zb);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 构建表头
|
||||||
|
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", "在职人数", "zzrs"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "年度收入总额", "ndsrze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "年度收入总额占比", "ndsrzezb"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "月度标准工资总额", "ydbzgzze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "月度绩效总额", "ydjxze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "1季度绩效总额", "yjdjxze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "2季度绩效总额", "ejdjxze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "3季度绩效总额", "sjdjxze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "4季度绩效总额", "sijdjxze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "年终奖总额", "nzjze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "季度绩效总额", "jdjxze"));
|
||||||
|
|
||||||
|
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("chartsData", chartsMap);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public XSSFWorkbook exportXcdazjtjReport() {
|
||||||
|
Map<String, Object> resultMap = listLyXcdazjtjReport();
|
||||||
|
List<LyDazjtjReportDTO> dataList = (List<LyDazjtjReportDTO>) 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 (LyDazjtjReportDTO 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> listLyXcdazwjstjReport() {
|
||||||
|
// 查询所有发薪的薪资档案
|
||||||
|
List<SalaryArchivePO> salaryArchivePOList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().runStatusList(Arrays.asList(SalaryArchiveStatusEnum.FIXED.getValue(), SalaryArchiveStatusEnum.SUSPEND.getValue())).build());
|
||||||
|
BaseBean baseBean = new BaseBean();
|
||||||
|
String gwzjField = baseBean.getPropValue("lySalaryReport", "gwzj_field_id");
|
||||||
|
String pqField = baseBean.getPropValue("lySalaryReport", "pq_field_id");
|
||||||
|
String zwjsField = baseBean.getPropValue("lySalaryReport", "zwjs_field_id");
|
||||||
|
RecordSet rs = new RecordSet();
|
||||||
|
// 查询职等职级信息
|
||||||
|
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 = salaryArchivePOList.stream().map(salaryArchivePO -> salaryArchivePO.getEmployeeId()).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"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 所有档案赋值职级
|
||||||
|
salaryArchivePOList.stream().forEach(salaryArchivePO -> {
|
||||||
|
int zj = empZjMap.get(salaryArchivePO.getEmployeeId()) == null ? -1 : empZjMap.get(salaryArchivePO.getEmployeeId());
|
||||||
|
salaryArchivePO.setLyzj(zj);
|
||||||
|
String zwjs = empZwjsMap.get(salaryArchivePO.getEmployeeId()) == null ? "" : empZwjsMap.get(salaryArchivePO.getEmployeeId());
|
||||||
|
salaryArchivePO.setLyzwjs(zwjs);
|
||||||
|
salaryArchivePO.setLypq(Utils.null2String(empPqMap.get(salaryArchivePO.getEmployeeId())));
|
||||||
|
salaryArchivePO.setLyxm(Utils.null2String(employeeMap.get(salaryArchivePO.getEmployeeId()) == null ? "" : employeeMap.get(salaryArchivePO.getEmployeeId()).getSubcompanyid()));
|
||||||
|
});
|
||||||
|
// 获取薪资档案字段id值
|
||||||
|
Long ndyssyzeItemId = SalaryEntityUtil.string2Long(baseBean.getPropValue("lySalaryReport", "xzdazjtj_ndyssrze_field_id"));
|
||||||
|
Long ydbzgzItemId = SalaryEntityUtil.string2Long(baseBean.getPropValue("lySalaryReport", "xzdazjtj_ydbzgz_field_id"));
|
||||||
|
Long ydjxzeItemId = SalaryEntityUtil.string2Long(baseBean.getPropValue("lySalaryReport", "xzdazjtj_ydjx_field_id"));
|
||||||
|
Long gdffblItemId = SalaryEntityUtil.string2Long(baseBean.getPropValue("lySalaryReport", "xzdazjtj_gdffbl_field_id"));
|
||||||
|
Long lbjtItemId = SalaryEntityUtil.string2Long(baseBean.getPropValue("lySalaryReport", "xzdazjtj_lbjt_field_id"));
|
||||||
|
Long nzjxsItemId = SalaryEntityUtil.string2Long(baseBean.getPropValue("lySalaryReport", "xzdazjtj_nzjxs_field_id"));
|
||||||
|
List<Long> salaryItemIds = Arrays.asList(ndyssyzeItemId, ydbzgzItemId, ydjxzeItemId, gdffblItemId, lbjtItemId, nzjxsItemId);
|
||||||
|
List<List<SalaryArchivePO>> archivePartition = Lists.partition(salaryArchivePOList, 500);
|
||||||
|
// 查询员工当前生效的薪资档案数据
|
||||||
|
List<SalaryArchiveItemPO> archiveItemPOS = new ArrayList<>();
|
||||||
|
archivePartition.forEach(part -> {
|
||||||
|
List<Long> archiveIds = part.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
|
||||||
|
archiveItemPOS.addAll(getSalaryArchiveService(user).getCurrentEffectiveItemList(archiveIds, salaryItemIds));
|
||||||
|
});
|
||||||
|
Map<Long, List<SalaryArchiveItemPO>> archiveItemPOSGroupByAchiveId = SalaryEntityUtil.group2Map(archiveItemPOS, SalaryArchiveItemPO::getSalaryArchiveId);
|
||||||
|
|
||||||
|
// 薪资档案根据职务角色分组
|
||||||
|
List<LyDazjtjReportDTO> reportDTOS = new ArrayList<LyDazjtjReportDTO>();
|
||||||
|
Map<String, List<SalaryArchivePO>> archivePOGroupByZj = SalaryEntityUtil.group2Map(salaryArchivePOList, po -> po.getLyzwjs() + "_split" + po.getLypq() + "_split" + po.getLyxm());
|
||||||
|
BigDecimal[] allNdsrzeSumVal = new BigDecimal[]{new BigDecimal("0")};
|
||||||
|
for (Map.Entry<String, List<SalaryArchivePO>> entry : archivePOGroupByZj.entrySet()) {
|
||||||
|
Map<String, BigDecimal> zjSumValueMap = new HashMap<>();
|
||||||
|
String[] split = entry.getKey().split("_split");
|
||||||
|
String zwjs = split != null && split.length > 0 ? split[0] : "-1";
|
||||||
|
String lypq = split != null && split.length > 1 ? split[1] : "";
|
||||||
|
String lyxm = split != null && split.length > 2 ? split[2] : "";
|
||||||
|
List<SalaryArchivePO> singleGroupArchive = entry.getValue().stream().collect(Collectors.toList());
|
||||||
|
singleGroupArchive.stream().forEach(archive -> {
|
||||||
|
Long archiveId = archive.getId();
|
||||||
|
List<SalaryArchiveItemPO> salaryArchiveItemPOList = archiveItemPOSGroupByAchiveId.get(archiveId);
|
||||||
|
if (CollectionUtils.isNotEmpty(salaryArchiveItemPOList)) {
|
||||||
|
Map<Long, String> archiveValueMap = SalaryEntityUtil.convert2Map(salaryArchiveItemPOList, SalaryArchiveItemPO::getSalaryItemId, SalaryArchiveItemPO::getItemValue);
|
||||||
|
BigDecimal ndsrzezbSumVal = zjSumValueMap.computeIfAbsent("ndsrze", k -> new BigDecimal("0"));
|
||||||
|
BigDecimal ndsrzezbVal = SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(ndyssyzeItemId));
|
||||||
|
zjSumValueMap.put("ndsrze", ndsrzezbSumVal.add(ndsrzezbVal));
|
||||||
|
allNdsrzeSumVal[0] = allNdsrzeSumVal[0].add(ndsrzezbVal);
|
||||||
|
|
||||||
|
BigDecimal ydbzgzSumVal = zjSumValueMap.computeIfAbsent("ydbzgz", k -> new BigDecimal("0"));
|
||||||
|
BigDecimal ydbzgzVal = SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(ydbzgzItemId));
|
||||||
|
zjSumValueMap.put("ydbzgz", ydbzgzSumVal.add(ydbzgzVal));
|
||||||
|
|
||||||
|
BigDecimal ydjxzeSumVal = zjSumValueMap.computeIfAbsent("ydjx", k -> new BigDecimal("0"));
|
||||||
|
BigDecimal ydjxzeVal = SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(ydjxzeItemId));
|
||||||
|
zjSumValueMap.put("ydjx", ydjxzeSumVal.add(ydjxzeVal));
|
||||||
|
|
||||||
|
BigDecimal yjdjxVal = new BigDecimal("0");
|
||||||
|
BigDecimal sjdjxVal = new BigDecimal("0");
|
||||||
|
if (!archive.getLyzj().equals(new Integer("0")) && !archive.getLyzj().equals(new Integer("1")) && !archive.getLyzj().equals(new Integer("2"))) {
|
||||||
|
// 年度预算收入总额*(1-固定比例)*20%
|
||||||
|
BigDecimal gdblVal = SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(gdffblItemId));
|
||||||
|
yjdjxVal = (new BigDecimal("1").subtract(gdblVal)).multiply(new BigDecimal("0.2")).multiply(ndsrzezbVal);
|
||||||
|
BigDecimal yjdjxValSum = zjSumValueMap.computeIfAbsent("yjdjx", k -> new BigDecimal("0"));
|
||||||
|
zjSumValueMap.put("yjdjx", yjdjxValSum.add(yjdjxVal));
|
||||||
|
|
||||||
|
BigDecimal ejdjxValSum = zjSumValueMap.computeIfAbsent("ejdjx", k -> new BigDecimal("0"));
|
||||||
|
zjSumValueMap.put("ejdjx", ejdjxValSum.add(yjdjxVal));
|
||||||
|
|
||||||
|
// 年度预算收入总额*(1-固定比例)*30%
|
||||||
|
sjdjxVal = (new BigDecimal("1").subtract(gdblVal)).multiply(new BigDecimal("0.3")).multiply(ndsrzezbVal);
|
||||||
|
BigDecimal sjdjxValSum = zjSumValueMap.computeIfAbsent("sjdjx", k -> new BigDecimal("0"));
|
||||||
|
zjSumValueMap.put("sjdjx", sjdjxValSum.add(sjdjxVal));
|
||||||
|
|
||||||
|
BigDecimal sijdjxValSum = zjSumValueMap.computeIfAbsent("sijdjx", k -> new BigDecimal("0"));
|
||||||
|
zjSumValueMap.put("sijdjx", sijdjxValSum.add(sjdjxVal));
|
||||||
|
}
|
||||||
|
|
||||||
|
//(月度标准工资+月度绩效+领班津贴)*年终奖系数
|
||||||
|
BigDecimal nzjzeVal = (ydbzgzVal.add(ydjxzeVal).add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(lbjtItemId))))
|
||||||
|
.multiply(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(nzjxsItemId)));
|
||||||
|
BigDecimal nzjzeValSum = zjSumValueMap.computeIfAbsent("nzjze", k -> new BigDecimal("0"));
|
||||||
|
zjSumValueMap.put("nzjze", nzjzeValSum.add(nzjzeVal));
|
||||||
|
|
||||||
|
BigDecimal jdjxzeVal = yjdjxVal.add(yjdjxVal).add(sjdjxVal).add(sjdjxVal);
|
||||||
|
BigDecimal jdjxzeValSum = zjSumValueMap.computeIfAbsent("jdjxze", k -> new BigDecimal("0"));
|
||||||
|
zjSumValueMap.put("jdjxze", jdjxzeValSum.add(jdjxzeVal));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// 封装
|
||||||
|
SubCompanyInfo lypqInfo = subCompanyInfoMap.get(SalaryEntityUtil.string2Long(lypq));
|
||||||
|
SubCompanyInfo lyxmInfo = subCompanyInfoMap.get(SalaryEntityUtil.string2Long(lyxm));
|
||||||
|
reportDTOS.add(LyDazjtjReportDTO.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)
|
||||||
|
.zzrs(entry.getValue().size())
|
||||||
|
.ndsrze(Util.null2String(zjSumValueMap.get("ndsrze")))
|
||||||
|
.ydbzgzze(Util.null2String(zjSumValueMap.get("ydbzgz")))
|
||||||
|
.ydjxze(Util.null2String(zjSumValueMap.get("ydjx")))
|
||||||
|
.yjdjxze(Util.null2String(zjSumValueMap.get("yjdjx")))
|
||||||
|
.ejdjxze(Util.null2String(zjSumValueMap.get("ejdjx")))
|
||||||
|
.sjdjxze(Util.null2String(zjSumValueMap.get("sjdjx")))
|
||||||
|
.sijdjxze(Util.null2String(zjSumValueMap.get("sijdjx")))
|
||||||
|
.nzjze(Util.null2String(zjSumValueMap.get("nzjze")))
|
||||||
|
.jdjxze(Util.null2String(zjSumValueMap.get("jdjxze")))
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
// 计算年度收入总额占比
|
||||||
|
reportDTOS.stream().forEach(dto -> {
|
||||||
|
if (NumberUtils.isCreatable(dto.getNdsrze())) {
|
||||||
|
BigDecimal ndsrze = SalaryEntityUtil.string2BigDecimalDefault0(dto.getNdsrze());
|
||||||
|
dto.setNdsrzezb(ndsrze.divide(allNdsrzeSumVal[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<LyDazjtjReportDTO>() {
|
||||||
|
@Override
|
||||||
|
public int compare(LyDazjtjReportDTO o1, LyDazjtjReportDTO o2) {
|
||||||
|
Long o1zwjs = o1.getZwjsId() != null ? o1.getZwjsId() : -1;
|
||||||
|
Long o2zwjs = o2.getZwjsId() != null ? o2.getZwjsId() : -1;
|
||||||
|
if (o1zwjs.equals(o2zwjs)) {
|
||||||
|
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 o1zwjs.compareTo(o2zwjs);
|
||||||
|
}
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
|
// 计算饼状图(根据职级汇总)
|
||||||
|
LinkedHashMap<String, String> chartsMap = new LinkedHashMap<>();
|
||||||
|
Map<Long, List<LyDazjtjReportDTO>> groupByzwjsId = SalaryEntityUtil.group2Map(reportDTOS, LyDazjtjReportDTO::getZwjsId);
|
||||||
|
LinkedHashMap<Long, List<LyDazjtjReportDTO>> sortedGroupByzj = groupByzwjsId.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<LyDazjtjReportDTO>> entry : sortedGroupByzj.entrySet()) {
|
||||||
|
Long zwjsId = entry.getKey();
|
||||||
|
BigDecimal sumVal = entry.getValue().stream().map(LyDazjtjReportDTO::getNdsrze).filter(NumberUtils::isCreatable).map(BigDecimal::new)
|
||||||
|
.reduce(new BigDecimal("0"), BigDecimal::add);
|
||||||
|
String zb = sumVal.divide(allNdsrzeSumVal[0], 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).toPlainString();
|
||||||
|
chartsMap.put(zwjsMap.getOrDefault(Utils.null2String(zwjsId), ""), zb);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构建表头
|
||||||
|
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", "在职人数(发薪员工)", "zzrs"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "年度收入总额", "ndsrze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "年度收入总额占比", "ndsrzezb"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "月度标准工资总额", "ydbzgzze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "月度绩效总额", "ydjxze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "1季度绩效总额", "yjdjxze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "2季度绩效总额", "ejdjxze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "3季度绩效总额", "sjdjxze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "4季度绩效总额", "sijdjxze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "年终奖总额", "nzjze"));
|
||||||
|
columns.add(new WeaTableColumn("150px", "季度绩效总额", "jdjxze"));
|
||||||
|
|
||||||
|
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("chartsData", chartsMap);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public XSSFWorkbook exportXcdazwjstjReport() {
|
||||||
|
Map<String, Object> resultMap = listLyXcdazwjstjReport();
|
||||||
|
List<LyDazjtjReportDTO> dataList = (List<LyDazjtjReportDTO>) 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 (LyDazjtjReportDTO 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -371,6 +371,11 @@ public class SalaryEmployeeServiceImpl extends Service implements SalaryEmployee
|
||||||
return SalaryI18nUtil.i18nList(employBiz.getSubCompanyInfoList(subDepartmentIds));
|
return SalaryI18nUtil.i18nList(employBiz.getSubCompanyInfoList(subDepartmentIds));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SubCompanyInfo> listAllSubCompanyInfoList() {
|
||||||
|
return SalaryI18nUtil.i18nList(employBiz.listAllSubCompanyInfoList());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SubCompanyInfo getSubCompanyInfoById(Long subDepartmentId) {
|
public SubCompanyInfo getSubCompanyInfoById(Long subDepartmentId) {
|
||||||
return SalaryI18nUtil.i18n(employBiz.getSubCompanyInfoById(subDepartmentId));
|
return SalaryI18nUtil.i18n(employBiz.getSubCompanyInfoById(subDepartmentId));
|
||||||
|
|
|
||||||
|
|
@ -821,4 +821,105 @@ public class LySalaryController {
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------领悦对比汇总表end-------------------------------------------
|
//---------------------------------------------------------领悦对比汇总表end-------------------------------------------
|
||||||
|
//---------------------------------------------------------领悦薪资档案报表start---------------------------------------
|
||||||
|
/**
|
||||||
|
* 查询领悦薪酬档案职级统计报表
|
||||||
|
*
|
||||||
|
* @param request
|
||||||
|
* @param response
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/xcdazjtjReport/list")
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
public String listLyXcdazjtjReport(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody LySalaryReportQueryParam param) {
|
||||||
|
User user = HrmUserVarify.getUser(request, response);
|
||||||
|
return new ResponseResult<LySalaryReportQueryParam, Map<String, Object>>(user).run(getLySalaryWrapper(user)::listLyXcdazjtjReport, param);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出领悦薪酬档案职级统计报表
|
||||||
|
*
|
||||||
|
* @param request
|
||||||
|
* @param response
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/xcdazjtjReport/export")
|
||||||
|
@Produces(MediaType.APPLICATION_OCTET_STREAM)
|
||||||
|
public Response exportXcdazjtjReport(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody LySalaryReportQueryParam param) {
|
||||||
|
try {
|
||||||
|
User user = HrmUserVarify.getUser(request, response);
|
||||||
|
XSSFWorkbook workbook = getLySalaryWrapper(user).exportXcdazjtjReport(param);
|
||||||
|
String time = LocalDate.now().toString();
|
||||||
|
String fileName = "薪酬档案职级统计报表" + "-" + time;
|
||||||
|
try {
|
||||||
|
fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
StreamingOutput output = outputStream -> {
|
||||||
|
workbook.write(outputStream);
|
||||||
|
outputStream.flush();
|
||||||
|
};
|
||||||
|
response.setContentType("application/octet-stream");
|
||||||
|
return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build();
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("薪酬档案职级统计报表导出异常", e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询领悦薪酬档案职务角色统计报表
|
||||||
|
*
|
||||||
|
* @param request
|
||||||
|
* @param response
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/xcdazwjstjReport/list")
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
public String listLyXcdazwjstjReport(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody LySalaryReportQueryParam param) {
|
||||||
|
User user = HrmUserVarify.getUser(request, response);
|
||||||
|
return new ResponseResult<LySalaryReportQueryParam, Map<String, Object>>(user).run(getLySalaryWrapper(user)::listLyXcdazwjstjReport, param);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出领悦薪酬档案职务角色统计报表
|
||||||
|
*
|
||||||
|
* @param request
|
||||||
|
* @param response
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/xcdazwjstjReport/export")
|
||||||
|
@Produces(MediaType.APPLICATION_OCTET_STREAM)
|
||||||
|
public Response exportXcdazwjstjReport(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody LySalaryReportQueryParam param) {
|
||||||
|
try {
|
||||||
|
User user = HrmUserVarify.getUser(request, response);
|
||||||
|
XSSFWorkbook workbook = getLySalaryWrapper(user).exportXcdazwjstjReport(param);
|
||||||
|
String time = LocalDate.now().toString();
|
||||||
|
String fileName = "薪酬档案职务角色统计报表" + "-" + time;
|
||||||
|
try {
|
||||||
|
fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
StreamingOutput output = outputStream -> {
|
||||||
|
workbook.write(outputStream);
|
||||||
|
outputStream.flush();
|
||||||
|
};
|
||||||
|
response.setContentType("application/octet-stream");
|
||||||
|
return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build();
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("薪酬档案职务角色统计报表导出异常", e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------领悦薪资档案报表end-----------------------------------------
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -347,4 +347,20 @@ public class LySalaryWrapper extends Service {
|
||||||
public Map<String, String> getHszb(LyPZGenParam param) {
|
public Map<String, String> getHszb(LyPZGenParam param) {
|
||||||
return getLySalaryReportService(user).getHszb(param.getFfgsqc());
|
return getLySalaryReportService(user).getHszb(param.getFfgsqc());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, Object> listLyXcdazjtjReport(LySalaryReportQueryParam param) {
|
||||||
|
return getLySalaryReportService(user).listLyXcdazjtjReport();
|
||||||
|
}
|
||||||
|
|
||||||
|
public XSSFWorkbook exportXcdazjtjReport(LySalaryReportQueryParam param) {
|
||||||
|
return getLySalaryReportService(user).exportXcdazjtjReport();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Object> listLyXcdazwjstjReport(LySalaryReportQueryParam param) {
|
||||||
|
return getLySalaryReportService(user).listLyXcdazwjstjReport();
|
||||||
|
}
|
||||||
|
|
||||||
|
public XSSFWorkbook exportXcdazwjstjReport(LySalaryReportQueryParam param) {
|
||||||
|
return getLySalaryReportService(user).exportXcdazwjstjReport();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue