From 9a1b7be6808238711dc1fa91dbc416906dfb174f Mon Sep 17 00:00:00 2001 From: Harryxzy <822365880@qq.com> Date: Tue, 16 Sep 2025 10:47:15 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A2=86=E6=82=A6=E6=8A=A5=E8=A1=A81=EF=BC=9A?= =?UTF-8?q?=E8=96=AA=E9=85=AC=E6=A1=A3=E6=A1=88=E8=81=8C=E7=BA=A7=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=8A=A5=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/EmployBiz.java | 9 + .../salary/entity/hrm/SubCompanyInfo.java | 2 + .../salaryacct/dto/LyDazjtjReportDTO.java | 65 ++ .../salaryarchive/po/SalaryArchivePO.java | 7 + .../mapper/datacollection/EmployMapper.java | 2 + .../mapper/datacollection/EmployMapper.xml | 9 + .../salary/service/LySalaryReportService.java | 8 + .../salary/service/SalaryEmployeeService.java | 2 + .../impl/LySalaryReportServiceImpl.java | 553 ++++++++++++++++++ .../impl/SalaryEmployeeServiceImpl.java | 5 + .../engine/salary/web/LySalaryController.java | 101 ++++ .../salary/wrapper/LySalaryWrapper.java | 16 + 12 files changed, 779 insertions(+) create mode 100644 src/com/engine/salary/entity/salaryacct/dto/LyDazjtjReportDTO.java diff --git a/src/com/engine/salary/biz/EmployBiz.java b/src/com/engine/salary/biz/EmployBiz.java index 6de561546..7c7a456cb 100644 --- a/src/com/engine/salary/biz/EmployBiz.java +++ b/src/com/engine/salary/biz/EmployBiz.java @@ -244,4 +244,13 @@ public class EmployBiz extends BaseBean { } } + public List listAllSubCompanyInfoList() { + SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); + try { + EmployMapper mapper = sqlSession.getMapper(EmployMapper.class); + return mapper.listAllSubCompanyInfoList(); + } finally { + sqlSession.close(); + } + } } diff --git a/src/com/engine/salary/entity/hrm/SubCompanyInfo.java b/src/com/engine/salary/entity/hrm/SubCompanyInfo.java index e9e2637d3..a643172e8 100644 --- a/src/com/engine/salary/entity/hrm/SubCompanyInfo.java +++ b/src/com/engine/salary/entity/hrm/SubCompanyInfo.java @@ -27,4 +27,6 @@ public class SubCompanyInfo { */ @I18n private String name; + + private Integer showorder; } diff --git a/src/com/engine/salary/entity/salaryacct/dto/LyDazjtjReportDTO.java b/src/com/engine/salary/entity/salaryacct/dto/LyDazjtjReportDTO.java new file mode 100644 index 000000000..5348bd96c --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/dto/LyDazjtjReportDTO.java @@ -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; +} diff --git a/src/com/engine/salary/entity/salaryarchive/po/SalaryArchivePO.java b/src/com/engine/salary/entity/salaryarchive/po/SalaryArchivePO.java index 25ad7601a..2c6f39639 100644 --- a/src/com/engine/salary/entity/salaryarchive/po/SalaryArchivePO.java +++ b/src/com/engine/salary/entity/salaryarchive/po/SalaryArchivePO.java @@ -128,6 +128,13 @@ public class SalaryArchivePO { @ElogTransform(name = "个税扣缴义务人id") private Long taxAgentId; + private Integer lyzj; + + private String lypq; + + private String lyxm; + + private String lyzwjs; //---------条件------- diff --git a/src/com/engine/salary/mapper/datacollection/EmployMapper.java b/src/com/engine/salary/mapper/datacollection/EmployMapper.java index dfcce4018..7fffe8433 100644 --- a/src/com/engine/salary/mapper/datacollection/EmployMapper.java +++ b/src/com/engine/salary/mapper/datacollection/EmployMapper.java @@ -188,4 +188,6 @@ public interface EmployMapper { List listAllFzhsInfo(); List listFzhsInfoByDeptIds(@Param("departmentIds")List departmentIds); + + List listAllSubCompanyInfoList(); } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/datacollection/EmployMapper.xml b/src/com/engine/salary/mapper/datacollection/EmployMapper.xml index ee30fc544..f95e563df 100644 --- a/src/com/engine/salary/mapper/datacollection/EmployMapper.xml +++ b/src/com/engine/salary/mapper/datacollection/EmployMapper.xml @@ -475,6 +475,14 @@ where d.subcompanyname = #{name} + + + \ No newline at end of file diff --git a/src/com/engine/salary/service/LySalaryReportService.java b/src/com/engine/salary/service/LySalaryReportService.java index 43c612e9b..bff227dd5 100644 --- a/src/com/engine/salary/service/LySalaryReportService.java +++ b/src/com/engine/salary/service/LySalaryReportService.java @@ -154,4 +154,12 @@ public interface LySalaryReportService { void deleteByIds(List needDeleteIds); Map getHszb(String ffgsqc); + + Map listLyXcdazjtjReport(); + + XSSFWorkbook exportXcdazjtjReport(); + + Map listLyXcdazwjstjReport(); + + XSSFWorkbook exportXcdazwjstjReport(); } diff --git a/src/com/engine/salary/service/SalaryEmployeeService.java b/src/com/engine/salary/service/SalaryEmployeeService.java index 21803c6af..260393f9c 100644 --- a/src/com/engine/salary/service/SalaryEmployeeService.java +++ b/src/com/engine/salary/service/SalaryEmployeeService.java @@ -114,6 +114,8 @@ public interface SalaryEmployeeService { List getSubCompanyInfoList(List subDepartmentIds); + List listAllSubCompanyInfoList(); + SubCompanyInfo getSubCompanyInfoById(Long subDepartmentId); List getVirtualSubCompanyInfoList(List virtualSubDepartmentIds); diff --git a/src/com/engine/salary/service/impl/LySalaryReportServiceImpl.java b/src/com/engine/salary/service/impl/LySalaryReportServiceImpl.java index c2237b774..588a7b29e 100644 --- a/src/com/engine/salary/service/impl/LySalaryReportServiceImpl.java +++ b/src/com/engine/salary/service/impl/LySalaryReportServiceImpl.java @@ -1,5 +1,7 @@ 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.engine.common.util.ServiceUtil; 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.entity.datacollection.DataCollectionEmployee; 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.param.LySalaryReportQueryParam; 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.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.po.SalaryAcctEmployeePO; import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; 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.salarysob.po.SalarySobEmpFieldPO; 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.ly.LyPushStatusEnum; 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.exception.SalaryRunTimeException; import com.engine.salary.mapper.ly.LySalaryReportMapper; @@ -51,6 +58,7 @@ import weaver.hrm.User; import weaver.wechat.util.Utils; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -107,6 +115,11 @@ public class LySalaryReportServiceImpl extends Service implements LySalaryReport 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 listLyXcdazjtjReport() { + // 查询所有发薪的薪资档案 + List 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 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 employeeIds = salaryArchivePOList.stream().map(salaryArchivePO -> salaryArchivePO.getEmployeeId()).distinct().collect(Collectors.toList()); + List> partition = Lists.partition(employeeIds, 800); + Map empZjMap = new HashMap<>(); + Map 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 employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(employeeIds), DataCollectionEmployee::getEmployeeId); + // 获取所有分部信息 + Map 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 salaryItemIds = Arrays.asList(ndyssyzeItemId, ydbzgzItemId, ydjxzeItemId, gdffblItemId, lbjtItemId, nzjxsItemId); + List> archivePartition = Lists.partition(salaryArchivePOList, 500); + // 查询员工当前生效的薪资档案数据 + List archiveItemPOS = new ArrayList<>(); + archivePartition.forEach(part -> { + List archiveIds = part.stream().map(SalaryArchivePO::getId).collect(Collectors.toList()); + archiveItemPOS.addAll(getSalaryArchiveService(user).getCurrentEffectiveItemList(archiveIds, salaryItemIds)); + }); + Map> archiveItemPOSGroupByAchiveId = SalaryEntityUtil.group2Map(archiveItemPOS, SalaryArchiveItemPO::getSalaryArchiveId); + + // 薪资档案根据职级分组 + List reportDTOS = new ArrayList(); + Map> archivePOGroupByZj = SalaryEntityUtil.group2Map(salaryArchivePOList, po -> po.getLyzj() + "_split" + po.getLypq() + "_split" + po.getLyxm()); + BigDecimal[] allNdsrzeSumVal = new BigDecimal[]{new BigDecimal("0")}; + for (Map.Entry> entry : archivePOGroupByZj.entrySet()) { + Map 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 singleGroupArchiveIds = entry.getValue().stream().map(SalaryArchivePO::getId).collect(Collectors.toList()); + singleGroupArchiveIds.stream().forEach(archiveId -> { + List salaryArchiveItemPOList = archiveItemPOSGroupByAchiveId.get(archiveId); + if (CollectionUtils.isNotEmpty(salaryArchiveItemPOList)) { + Map 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() { + @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 chartsMap = new LinkedHashMap<>(); + Map> groupByzj = SalaryEntityUtil.group2Map(reportDTOS, LyDazjtjReportDTO::getZj); + LinkedHashMap> sortedGroupByzj = groupByzj.entrySet().stream() + .sorted(new Comparator>>() { + @Override + public int compare(Map.Entry> o1, Map.Entry> 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> 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 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 map = new HashMap<>(); + // if (param.isExport()) { + // // 合计或导出需要合计行 + // Map 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 resultMap = listLyXcdazjtjReport(); + List dataList = (List) resultMap.get("data"); + List columns = (List) resultMap.get("columns"); + // Map sum = (Map) resultMap.get("sum"); + // dataList.add(sum); + + List headerList = new ArrayList<>(columns.stream().map(WeaTableColumn::getText).collect(Collectors.toList())); + List> rows = new ArrayList<>(); + rows.add(headerList); + + for (LyDazjtjReportDTO dto : dataList) { + List row = Lists.newArrayList(); + Map 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 listLyXcdazwjstjReport() { + // 查询所有发薪的薪资档案 + List 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 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 employeeIds = salaryArchivePOList.stream().map(salaryArchivePO -> salaryArchivePO.getEmployeeId()).distinct().collect(Collectors.toList()); + List> partition = Lists.partition(employeeIds, 800); + Map empZjMap = new HashMap<>(); + Map 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 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 employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(employeeIds), DataCollectionEmployee::getEmployeeId); + // 获取所有分部信息 + Map subCompanyInfoMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listAllSubCompanyInfoList(), SubCompanyInfo::getId); + // 获取所有职务角色数据 + rs.execute("select id,mc from uf_zwjs"); + Map 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 salaryItemIds = Arrays.asList(ndyssyzeItemId, ydbzgzItemId, ydjxzeItemId, gdffblItemId, lbjtItemId, nzjxsItemId); + List> archivePartition = Lists.partition(salaryArchivePOList, 500); + // 查询员工当前生效的薪资档案数据 + List archiveItemPOS = new ArrayList<>(); + archivePartition.forEach(part -> { + List archiveIds = part.stream().map(SalaryArchivePO::getId).collect(Collectors.toList()); + archiveItemPOS.addAll(getSalaryArchiveService(user).getCurrentEffectiveItemList(archiveIds, salaryItemIds)); + }); + Map> archiveItemPOSGroupByAchiveId = SalaryEntityUtil.group2Map(archiveItemPOS, SalaryArchiveItemPO::getSalaryArchiveId); + + // 薪资档案根据职务角色分组 + List reportDTOS = new ArrayList(); + Map> archivePOGroupByZj = SalaryEntityUtil.group2Map(salaryArchivePOList, po -> po.getLyzwjs() + "_split" + po.getLypq() + "_split" + po.getLyxm()); + BigDecimal[] allNdsrzeSumVal = new BigDecimal[]{new BigDecimal("0")}; + for (Map.Entry> entry : archivePOGroupByZj.entrySet()) { + Map 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 singleGroupArchive = entry.getValue().stream().collect(Collectors.toList()); + singleGroupArchive.stream().forEach(archive -> { + Long archiveId = archive.getId(); + List salaryArchiveItemPOList = archiveItemPOSGroupByAchiveId.get(archiveId); + if (CollectionUtils.isNotEmpty(salaryArchiveItemPOList)) { + Map 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() { + @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 chartsMap = new LinkedHashMap<>(); + Map> groupByzwjsId = SalaryEntityUtil.group2Map(reportDTOS, LyDazjtjReportDTO::getZwjsId); + LinkedHashMap> 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> 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 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 map = new HashMap<>(); + // if (param.isExport()) { + // // 合计或导出需要合计行 + // Map 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 resultMap = listLyXcdazwjstjReport(); + List dataList = (List) resultMap.get("data"); + List columns = (List) resultMap.get("columns"); + // Map sum = (Map) resultMap.get("sum"); + // dataList.add(sum); + + List headerList = new ArrayList<>(columns.stream().map(WeaTableColumn::getText).collect(Collectors.toList())); + List> rows = new ArrayList<>(); + rows.add(headerList); + + for (LyDazjtjReportDTO dto : dataList) { + List row = Lists.newArrayList(); + Map 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); + } } diff --git a/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java b/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java index fbe4724b3..f16f70900 100644 --- a/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java @@ -371,6 +371,11 @@ public class SalaryEmployeeServiceImpl extends Service implements SalaryEmployee return SalaryI18nUtil.i18nList(employBiz.getSubCompanyInfoList(subDepartmentIds)); } + @Override + public List listAllSubCompanyInfoList() { + return SalaryI18nUtil.i18nList(employBiz.listAllSubCompanyInfoList()); + } + @Override public SubCompanyInfo getSubCompanyInfoById(Long subDepartmentId) { return SalaryI18nUtil.i18n(employBiz.getSubCompanyInfoById(subDepartmentId)); diff --git a/src/com/engine/salary/web/LySalaryController.java b/src/com/engine/salary/web/LySalaryController.java index 90c77574a..a02408602 100644 --- a/src/com/engine/salary/web/LySalaryController.java +++ b/src/com/engine/salary/web/LySalaryController.java @@ -821,4 +821,105 @@ public class LySalaryController { } //---------------------------------------------------------领悦对比汇总表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>(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>(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----------------------------------------- } diff --git a/src/com/engine/salary/wrapper/LySalaryWrapper.java b/src/com/engine/salary/wrapper/LySalaryWrapper.java index 354385b2e..4f6b899d1 100644 --- a/src/com/engine/salary/wrapper/LySalaryWrapper.java +++ b/src/com/engine/salary/wrapper/LySalaryWrapper.java @@ -347,4 +347,20 @@ public class LySalaryWrapper extends Service { public Map getHszb(LyPZGenParam param) { return getLySalaryReportService(user).getHszb(param.getFfgsqc()); } + + public Map listLyXcdazjtjReport(LySalaryReportQueryParam param) { + return getLySalaryReportService(user).listLyXcdazjtjReport(); + } + + public XSSFWorkbook exportXcdazjtjReport(LySalaryReportQueryParam param) { + return getLySalaryReportService(user).exportXcdazjtjReport(); + } + + public Map listLyXcdazwjstjReport(LySalaryReportQueryParam param) { + return getLySalaryReportService(user).listLyXcdazwjstjReport(); + } + + public XSSFWorkbook exportXcdazwjstjReport(LySalaryReportQueryParam param) { + return getLySalaryReportService(user).exportXcdazwjstjReport(); + } }