diff --git a/src/com/engine/salary/entity/salaryacct/dto/LtRymxgzDTO.java b/src/com/engine/salary/entity/salaryacct/dto/LtRymxgzDTO.java index 7961c6a4f..7e921c7a4 100644 --- a/src/com/engine/salary/entity/salaryacct/dto/LtRymxgzDTO.java +++ b/src/com/engine/salary/entity/salaryacct/dto/LtRymxgzDTO.java @@ -23,6 +23,9 @@ public class LtRymxgzDTO { // 项目号 private String xmh; + // 期间 + private String qj; + // 姓名 private Long xm; diff --git a/src/com/engine/salary/entity/salaryacct/param/LtReportParam.java b/src/com/engine/salary/entity/salaryacct/param/LtReportParam.java new file mode 100644 index 000000000..4f8200c60 --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/param/LtReportParam.java @@ -0,0 +1,26 @@ +package com.engine.salary.entity.salaryacct.param; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Harryxzy + * @ClassName LtReportParam + * @date 2025/09/22 9:58 + * @description + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LtReportParam { + private String salaryMonth; + + private String year; + + private Boolean export; + + private Long khjl; +} diff --git a/src/com/engine/salary/entity/salaryacct/po/LtWhjjbmPO.java b/src/com/engine/salary/entity/salaryacct/po/LtWhjjbmPO.java new file mode 100644 index 000000000..8f862de0f --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/po/LtWhjjbmPO.java @@ -0,0 +1,39 @@ +package com.engine.salary.entity.salaryacct.po; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author Harryxzy + * @ClassName LyWhjjbmPO + * @date 2025/09/19 14:55 + * @description 联特武汉间接部门 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LtWhjjbmPO { + + // 姓名 + private Long xm; + + // 成本中心 + private String cbzx; + + // 间接部门 + private String jjbm; + + // 占比 + private BigDecimal zb; + + // 工资 + private BigDecimal gz; + + // 工资额度 + private BigDecimal gzed; +} diff --git a/src/com/engine/salary/entity/salaryacct/po/LtXsCrmPO.java b/src/com/engine/salary/entity/salaryacct/po/LtXsCrmPO.java new file mode 100644 index 000000000..7c00f17a4 --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/po/LtXsCrmPO.java @@ -0,0 +1,34 @@ +package com.engine.salary.entity.salaryacct.po; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author Harryxzy + * @ClassName LtXsCrmPO + * @date 2025/09/22 14:55 + * @description 联特销售crm数据 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LtXsCrmPO { + + // 客户 + private String kh; + + // 客户经理 + private Long khjl; + + // 年月 + private String salaryMonth; + private Integer month; + + // 收入金额 + private BigDecimal srje; +} diff --git a/src/com/engine/salary/service/SalaryAcctResultService.java b/src/com/engine/salary/service/SalaryAcctResultService.java index d4b8d9ac3..cb25d822e 100644 --- a/src/com/engine/salary/service/SalaryAcctResultService.java +++ b/src/com/engine/salary/service/SalaryAcctResultService.java @@ -9,6 +9,7 @@ import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; import com.engine.salary.enums.common.SalaryLogOperateTypeEnum; import com.engine.salary.util.page.PageInfo; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.util.Collection; import java.util.Date; @@ -386,4 +387,30 @@ public interface SalaryAcctResultService { * @return */ String ltGenGwpjgzcxb(String salaryMonth); + + /** + * 联特 表8 - 工资分摊表 + * @param salaryMonth + * @return + */ + Map ltGenGzftb(String salaryMonth); + + XSSFWorkbook exportLtGzftb(LtReportParam param); + + /** + * 联特 表10 - 销售薪资分摊明细表 + * @param param + * @return + */ + Map ltKhjlgzftList(LtReportParam param); + + Map ltKhjlgzftSum(String year); + + XSSFWorkbook exportKhjlgzftList(String year); + + Map ltXsxzftList(LtReportParam param); + + Map ltXsxzftSum(LtReportParam param); + + XSSFWorkbook exportXsxzftList(LtReportParam param); } diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index b56eccb8e..0ff51b8ad 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -57,6 +57,7 @@ import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.MapperProxyFactory; +import com.engine.salary.util.excel.ExcelUtil; import com.engine.salary.util.page.Column; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; @@ -71,6 +72,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.jetbrains.annotations.NotNull; import org.springframework.beans.BeanUtils; import org.springframework.jdbc.datasource.DataSourceTransactionManager; @@ -1619,6 +1621,15 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe // Map employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(empIds), DataCollectionEmployee::getEmployeeId); // 查询快照表中人员信息 Map employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(empIds, SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId); + // 获取直接人工分摊表中成本中心数据 + Map ltCbzxMap = new HashMap<>(); + String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id"); + RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId); + extRs.execute(" select user_code,sap_cost_center_name,sap_cost_center_name_desc from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'"); + while (extRs.next()) { + ltCbzxMap.put(extRs.getString("user_code"), extRs.getString("sap_cost_center_name_desc")); + } + // 删除建模数据 RecordSet rs = new RecordSet(); rs.execute("delete from uf_bmsbmxb where xzszy = '" + salaryMonth+ "'"); @@ -1640,7 +1651,8 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employee.getDepartmentId()).append(",") .append(employee.getJobtitleId()).append(",'") .append(salaryMonth).append("','") - .append(Utils.null2String(employee.getLtCbzx())).append("'"); + .append(StringUtils.isBlank(ltCbzxMap.get(employee.getWorkcode())) ? Utils.null2String(employee.getLtCbzx()) : ltCbzxMap.get(employee.getWorkcode())) + .append("'"); for (LtSalaryReportConfigDTO dto : configs) { String val = Utils.null2String(firstData.get(Utils.null2String(dto.getItem()) + "_variableItem" )); @@ -1672,7 +1684,8 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employeePo.getDepartmentId()).append(",") .append(employeePo.getJobtitleId()).append(",'") .append(salaryMonth).append("','") - .append(Utils.null2String(employeePo.getLtCbzx())).append("'"); + .append(StringUtils.isBlank(ltCbzxMap.get(employee.getWorkcode())) ? Utils.null2String(employee.getLtCbzx()) : ltCbzxMap.get(employee.getWorkcode())) + .append("'"); for (LtSalaryReportConfigDTO dto : configs) { String val = Utils.null2String(data.getOrDefault(Utils.null2String(dto.getItem()) + "_variableItem", "")); sb.append(",").append(NumberUtils.isCreatable(val) ? val : 0); @@ -1728,6 +1741,14 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe // Map employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(empIds), DataCollectionEmployee::getEmployeeId); // 查询快照表中人员信息 Map employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(empIds, SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId); + // 获取直接人工分摊表中成本中心数据 + Map ltCbzxMap = new HashMap<>(); + String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id"); + RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId); + extRs.execute(" select user_code,sap_cost_center_name,sap_cost_center_name_desc from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'"); + while (extRs.next()) { + ltCbzxMap.put(extRs.getString("user_code"), extRs.getString("sap_cost_center_name_desc")); + } // 删除建模数据 RecordSet rs = new RecordSet(); rs.execute("delete from uf_bmgjjmxb where xzszy = '" + salaryMonth+ "'"); @@ -1749,7 +1770,8 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employee.getDepartmentId()).append(",") .append(employee.getJobtitleId()).append(",'") .append(salaryMonth).append("','") - .append(Utils.null2String(employee.getLtCbzx())).append("'"); + .append(StringUtils.isBlank(ltCbzxMap.get(employee.getWorkcode())) ? Utils.null2String(employee.getLtCbzx()) : ltCbzxMap.get(employee.getWorkcode())) + .append("'"); for (LtSalaryReportConfigDTO dto : configs) { String val = Utils.null2String(firstData.getOrDefault(Utils.null2String(dto.getItem()) + "_variableItem", "")); @@ -1781,7 +1803,8 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employeePo.getDepartmentId()).append(",") .append(employeePo.getJobtitleId()).append(",'") .append(salaryMonth).append("','") - .append(Utils.null2String(employeePo.getLtCbzx())).append("'"); + .append(StringUtils.isBlank(ltCbzxMap.get(employee.getWorkcode())) ? Utils.null2String(employee.getLtCbzx()) : ltCbzxMap.get(employee.getWorkcode())) + .append("'"); for (LtSalaryReportConfigDTO dto : configs) { String val = Utils.null2String(data.getOrDefault(Utils.null2String(dto.getItem()) + "_variableItem", "")); sb.append(",").append(NumberUtils.isCreatable(val) ? val : 0); @@ -1821,12 +1844,14 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe List> variableMapList = getVariableArchiveService(user).listBySalaryMonthAndItems(yearMonth, variableItemIds); log.info("部门工资奖金明细表计提size{} ",variableMapList == null ? 0 :variableMapList.size()); // 获取直接人工工资分摊表的人 + Map ltCbzxMap = new HashMap<>(); String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id"); RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId); - extRs.execute(" select month, user_code from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'"); + extRs.execute(" select month, user_code,sap_cost_center_name_desc from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'"); List needExcludeWorkCodeList = new ArrayList<>(); while (extRs.next()) { needExcludeWorkCodeList.add(extRs.getString("user_code")); + ltCbzxMap.put(extRs.getString("user_code"), extRs.getString("sap_cost_center_name_desc")); } if (CollectionUtils.isNotEmpty(needExcludeWorkCodeList)) { // 获取需要去除的人员id @@ -1920,7 +1945,8 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employee.getDepartmentId()).append(",") .append(employee.getJobtitleId()).append(",'") .append(salaryMonth).append("','") - .append(Utils.null2String(employee.getLtCbzx())).append("',") + .append(StringUtils.isBlank(ltCbzxMap.get(employee.getWorkcode())) ? Utils.null2String(employee.getLtCbzx()) : ltCbzxMap.get(employee.getWorkcode())) + .append("',") .append(jxgz); for (LtSalaryReportConfigDTO dto : reportConfigs) { @@ -1966,7 +1992,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employee.getDepartmentId()).append(",") .append(employee.getJobtitleId()).append(",'") .append(salaryMonth).append("','") - .append(Utils.null2String(employee.getLtCbzx())).append("',") + // .append(Utils.null2String(employee.getLtCbzx())) + .append(StringUtils.isBlank(ltCbzxMap.get(employee.getWorkcode())) ? Utils.null2String(employee.getLtCbzx()) : ltCbzxMap.get(employee.getWorkcode())) + .append("',") .append(jxgz); for (LtSalaryReportConfigDTO dto : reportConfigs) { BigDecimal val = new BigDecimal("0"); @@ -2012,13 +2040,16 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe List> variableMapList = getVariableArchiveService(user).listBySalaryMonthAndItems(yearMonth, variableItemIds); log.info("部门工资奖金明细表实发size{} ",variableMapList == null ? 0 : variableMapList.size()); // 获取直接人工工资分摊表的人 + Map ltCbzxMap = new HashMap<>(); String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id"); RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId); - extRs.execute(" select month, user_code from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'"); + extRs.execute(" select month, user_code,sap_cost_center_name_desc from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'"); List needExcludeWorkCodeList = new ArrayList<>(); while (extRs.next()) { needExcludeWorkCodeList.add(extRs.getString("user_code")); + ltCbzxMap.put(extRs.getString("user_code"), extRs.getString("sap_cost_center_name_desc")); } + if (CollectionUtils.isNotEmpty(needExcludeWorkCodeList)) { // 获取需要去除的人员id List excludeEmpIds = getSalaryEmployeeService(user).listByWorkCodes(needExcludeWorkCodeList).stream().map(emp -> Utils.null2String(emp.getEmployeeId())).collect(Collectors.toList()); @@ -2111,7 +2142,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employee.getDepartmentId()).append(",") .append(employee.getJobtitleId()).append(",'") .append(salaryMonth).append("','") - .append(Utils.null2String(employee.getLtCbzx())).append("',") + .append(StringUtils.isBlank(ltCbzxMap.get(employee.getWorkcode())) ? Utils.null2String(employee.getLtCbzx()) : ltCbzxMap.get(employee.getWorkcode())) + // .append(Utils.null2String(employee.getLtCbzx())) + .append("',") .append(jxgz); for (LtSalaryReportConfigDTO dto : reportConfigs) { @@ -2156,7 +2189,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employee.getDepartmentId()).append(",") .append(employee.getJobtitleId()).append(",'") .append(salaryMonth).append("','") - .append(Utils.null2String(employee.getLtCbzx())).append("',") + .append(StringUtils.isBlank(ltCbzxMap.get(employee.getWorkcode())) ? Utils.null2String(employee.getLtCbzx()) : ltCbzxMap.get(employee.getWorkcode())) + // .append(Utils.null2String(employee.getLtCbzx())) + .append("',") .append(jxgz); for (LtSalaryReportConfigDTO dto : reportConfigs) { BigDecimal val = new BigDecimal("0"); @@ -2238,7 +2273,14 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe // 查询快照表中人员信息 Map employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(employeeIdList, SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId); - + // 获取直接人工分摊表中成本中心数据 + Map ltCbzxMap = new HashMap<>(); + String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id"); + RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId); + extRs.execute(" select user_code,sap_cost_center_name,sap_cost_center_name_desc from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'"); + while (extRs.next()) { + ltCbzxMap.put(extRs.getString("user_code"), extRs.getString("sap_cost_center_name_desc")); + } // 入库 // 删除建模数据 @@ -2301,7 +2343,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employee.getJobtitleId()).append(",") .append(employee.getLtRylb()).append(",'") .append(salaryMonth).append("','") - .append(Utils.null2String(employee.getLtCbzx())).append("',") + // .append(Utils.null2String(employee.getLtCbzx())) + .append(StringUtils.isBlank(ltCbzxMap.get(employee.getWorkcode())) ? Utils.null2String(employee.getLtCbzx()) : ltCbzxMap.get(employee.getWorkcode())) + .append("',") .append(jx).append(",").append(jdjx).append(",").append(bndjx).append(",").append(nzj); for (LtSalaryReportConfigDTO dto : reportConfigs) { @@ -2387,7 +2431,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employee.getJobtitleId()).append(",") .append(employee.getLtRylb()).append(",'") .append(salaryMonth).append("','") - .append(Utils.null2String(employee.getLtCbzx())).append("',") + .append(StringUtils.isBlank(ltCbzxMap.get(employee.getWorkcode())) ? Utils.null2String(employee.getLtCbzx()) : ltCbzxMap.get(employee.getWorkcode())) + // .append(Utils.null2String(employee.getLtCbzx())) + .append("',") .append(jx).append(",").append(jdjx).append(",").append(bndjx).append(",").append(nzj); for (LtSalaryReportConfigDTO dto : reportConfigs) { @@ -2541,6 +2587,14 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe // 查询快照表中人员信息 Map employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(totalEmpIds.stream().collect(Collectors.toList()), SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId); + // 获取直接人工分摊表中成本中心数据 + Map ltCbzxMap = new HashMap<>(); + String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id"); + RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId); + extRs.execute(" select user_code,sap_cost_center_name,sap_cost_center_name_desc from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'"); + while (extRs.next()) { + ltCbzxMap.put(extRs.getString("user_code"), extRs.getString("sap_cost_center_name_desc")); + } // 入库 // 删除建模数据 @@ -2577,7 +2631,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employee.getJobtitleId()).append(",") .append(employee.getLtRylb()).append(",'") .append(salaryMonth).append("','") - .append(Utils.null2String(employee.getLtCbzx())).append("',") + // .append(Utils.null2String(employee.getLtCbzx())) + .append(StringUtils.isBlank(ltCbzxMap.get(employee.getWorkcode())) ? Utils.null2String(employee.getLtCbzx()) : ltCbzxMap.get(employee.getWorkcode())) + .append("',") .append(0).append(",").append(jdjx).append(",").append(bndjx).append(",").append(nzj); for (LtSalaryReportConfigDTO dto : reportConfigs) { @@ -2638,7 +2694,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employee.getJobtitleId()).append(",") .append(employee.getLtRylb()).append(",'") .append(salaryMonth).append("','") - .append(Utils.null2String(employee.getLtCbzx())).append("',") + .append(StringUtils.isBlank(ltCbzxMap.get(employee.getWorkcode())) ? Utils.null2String(employee.getLtCbzx()) : ltCbzxMap.get(employee.getWorkcode())) + // .append(Utils.null2String(employee.getLtCbzx())) + .append("',") .append(0).append(",").append(jdjx).append(",").append(bndjx).append(",").append(nzj); for (LtSalaryReportConfigDTO dto : reportConfigs) { @@ -4386,28 +4444,28 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe RecordSet rs = new RecordSet(); // 获取直接人工工资分摊表的人 ArrayList ltZjrggzftList = new ArrayList<>(); - // String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id"); - // RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId); - // extRs.execute(" select month, user_code,sap_cost_center_name,sap_cost_center_name_desc,attendance_duration,sum_attendance_duration,proportion from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'"); - // while (extRs.next()) { - // LtZjrggzftDTO dto = new LtZjrggzftDTO(); - // dto.setNy(extRs.getString("month")); - // dto.setGh(extRs.getString("user_code")); - // dto.setCbzxbm(extRs.getString("sap_cost_center_name")); - // dto.setCbzx(extRs.getString("sap_cost_center_name_desc")); - // dto.setZb(SalaryEntityUtil.string2BigDecimalDefault0(extRs.getString("proportion"))); - // ltZjrggzftList.add(dto); - // } - rs.execute(" select month, user_code,sap_cost_center_name,sap_cost_center_name_desc,attendance_duration,sum_attendance_duration,proportion from uf_testygcqgsftb where month='"+salaryMonth+"'"); - while (rs.next()) { + String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id"); + RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId); + extRs.execute(" select month, user_code,sap_cost_center_name,sap_cost_center_name_desc,attendance_duration,sum_attendance_duration,proportion from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'"); + while (extRs.next()) { LtZjrggzftDTO dto = new LtZjrggzftDTO(); - dto.setNy(rs.getString("month")); - dto.setGh(rs.getString("user_code")); - dto.setCbzxbm(rs.getString("sap_cost_center_name")); - dto.setCbzx(rs.getString("sap_cost_center_name_desc")); - dto.setZb(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("proportion"))); + dto.setNy(extRs.getString("month")); + dto.setGh(extRs.getString("user_code")); + dto.setCbzxbm(extRs.getString("sap_cost_center_name")); + dto.setCbzx(extRs.getString("sap_cost_center_name_desc")); + dto.setZb(SalaryEntityUtil.string2BigDecimalDefault0(extRs.getString("proportion"))); ltZjrggzftList.add(dto); } + // rs.execute(" select month, user_code,sap_cost_center_name,sap_cost_center_name_desc,attendance_duration,sum_attendance_duration,proportion from uf_testygcqgsftb where month='"+salaryMonth+"'"); + // while (rs.next()) { + // LtZjrggzftDTO dto = new LtZjrggzftDTO(); + // dto.setNy(rs.getString("month")); + // dto.setGh(rs.getString("user_code")); + // dto.setCbzxbm(rs.getString("sap_cost_center_name")); + // dto.setCbzx(rs.getString("sap_cost_center_name_desc")); + // dto.setZb(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("proportion"))); + // ltZjrggzftList.add(dto); + // } Map> LtZjrggzfGroupByGh = SalaryEntityUtil.group2Map(ltZjrggzftList, LtZjrggzftDTO::getGh); @@ -4575,28 +4633,28 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe RecordSet rs = new RecordSet(); // 获取直接人工工资分摊表的人 ArrayList ltZjrggzftList = new ArrayList<>(); - // String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id"); - // RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId); - // extRs.execute(" select month, user_code,sap_cost_center_name,sap_cost_center_name_desc,attendance_duration,sum_attendance_duration,proportion from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'"); - // while (extRs.next()) { - // LtZjrggzftDTO dto = new LtZjrggzftDTO(); - // dto.setNy(extRs.getString("month")); - // dto.setGh(extRs.getString("user_code")); - // dto.setCbzxbm(extRs.getString("sap_cost_center_name")); - // dto.setCbzx(extRs.getString("sap_cost_center_name_desc")); - // dto.setZb(SalaryEntityUtil.string2BigDecimalDefault0(extRs.getString("proportion"))); - // ltZjrggzftList.add(dto); - // } - rs.execute(" select month, user_code,sap_cost_center_name,sap_cost_center_name_desc,attendance_duration,sum_attendance_duration,proportion from uf_testygcqgsftb where month='"+salaryMonth+"'"); - while (rs.next()) { + String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id"); + RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId); + extRs.execute(" select month, user_code,sap_cost_center_name,sap_cost_center_name_desc,attendance_duration,sum_attendance_duration,proportion from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'"); + while (extRs.next()) { LtZjrggzftDTO dto = new LtZjrggzftDTO(); - dto.setNy(rs.getString("month")); - dto.setGh(rs.getString("user_code")); - dto.setCbzxbm(rs.getString("sap_cost_center_name")); - dto.setCbzx(rs.getString("sap_cost_center_name_desc")); - dto.setZb(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("proportion"))); + dto.setNy(extRs.getString("month")); + dto.setGh(extRs.getString("user_code")); + dto.setCbzxbm(extRs.getString("sap_cost_center_name")); + dto.setCbzx(extRs.getString("sap_cost_center_name_desc")); + dto.setZb(SalaryEntityUtil.string2BigDecimalDefault0(extRs.getString("proportion"))); ltZjrggzftList.add(dto); } + // rs.execute(" select month, user_code,sap_cost_center_name,sap_cost_center_name_desc,attendance_duration,sum_attendance_duration,proportion from uf_testygcqgsftb where month='"+salaryMonth+"'"); + // while (rs.next()) { + // LtZjrggzftDTO dto = new LtZjrggzftDTO(); + // dto.setNy(rs.getString("month")); + // dto.setGh(rs.getString("user_code")); + // dto.setCbzxbm(rs.getString("sap_cost_center_name")); + // dto.setCbzx(rs.getString("sap_cost_center_name_desc")); + // dto.setZb(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("proportion"))); + // ltZjrggzftList.add(dto); + // } Map> LtZjrggzfGroupByGh = SalaryEntityUtil.group2Map(ltZjrggzftList, LtZjrggzftDTO::getGh); @@ -4762,7 +4820,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe BaseBean baseBean = new BaseBean(); RecordSet rs = new RecordSet(); // 获取全年人员明细工资实发表 - rs.execute("select gh,szbm,szgw,yfgz,ydjx,jdjx,nzj,qjlxj from uf_rymxgzsf where qj >= '" + year + "-01' and qj <= '"+year+"'-12"); + rs.execute("select gh,szbm,szgw,yfgz,ydjx,jdjx,nzj,qjlxj,bndjx from uf_rymxgzsf where qj >= '" + year + "-01' and qj <= '"+year+"-12'"); List ltRymxgzDTOList = new ArrayList<>(); while (rs.next()) { ltRymxgzDTOList.add(LtRymxgzDTO.builder() @@ -4772,6 +4830,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .gz(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yfgz"))) .jx(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ydjx"))) .jdjx(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("jdjx"))) + .bndjx(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("bndjx"))) .qtjlxj(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("qjlxj"))) .nzj(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("nzj"))) .build()); @@ -4781,7 +4840,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); String currTime = String.format("'%s'", sdf.format(new Date())); // 获取建模模块id - String modeId = baseBean.getPropValue("ltSalaryReport", "zjrggzftbsf_mode_id"); + String modeId = baseBean.getPropValue("ltSalaryReport", "gwpjgzcx_mode_id"); // 入库前先删除 rs.execute("delete from uf_gwpjgzcxb where nf ='" + year +"'"); @@ -4804,6 +4863,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe } // 计算平均月薪 BigDecimal empAveMonthSalary = empYearSumVal.divide(new BigDecimal(String.valueOf(ghDtoList.size())), 2, RoundingMode.HALF_UP); + sumEmpAveMonthSalary = sumEmpAveMonthSalary.add(empAveMonthSalary); empNums++; } BigDecimal aveValue = sumEmpAveMonthSalary.divide(new BigDecimal(String.valueOf(empNums)), 2, RoundingMode.HALF_UP); @@ -4830,4 +4890,618 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe } return null; } + + /** + * 联特 表8 - 工资分摊表 + * @param salaryMonth + * @return + */ + @Override + public Map ltGenGzftb(String salaryMonth) { + if (!SalaryDateUtil.checkYearMonth(salaryMonth)) { + throw new SalaryRunTimeException("年月错误"); + } + + BaseBean baseBean = new BaseBean(); + RecordSet rs = new RecordSet(); + // 获取武汉间接部门表数据 + ArrayList ltWhjjbmPOS = new ArrayList<>(); + rs.executeQuery("select xm,cbzx,jjbm,zb from uf_whjj where xzssy = ?", salaryMonth); + while (rs.next()) { + ltWhjjbmPOS.add(LtWhjjbmPO.builder() + .xm(SalaryEntityUtil.string2LongDefault0(rs.getString("xm"))) + .cbzx(rs.getString("cbzx")) + .jjbm(rs.getString("jjbm")) + .zb(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("zb"))).build()); + } + // 计算武汉间接部门对应的工资及工资额度 + calWhjjbmGz(salaryMonth, ltWhjjbmPOS); + // 获取公共的是哪些成本中心 + List ggcbzxList = new ArrayList<>(); + try { + String ggcbzxStr = new String(rs.getPropValue("ltSalaryReport", "gzftb_ggcbzx").getBytes("ISO-8859-1"), "utf-8"); + ggcbzxList = Arrays.stream(ggcbzxStr.split(",")).collect(Collectors.toList()); + } catch (UnsupportedEncodingException e) { + } + // 过滤成本中心和和公共数据 + List cbzxWhjjbmList = new ArrayList<>(); + List ggWhjjbmList = new ArrayList<>(); + List finalGgcbzxList = ggcbzxList; + ltWhjjbmPOS.stream().forEach(po -> { + if (finalGgcbzxList.contains(po.getCbzx())) { + ggWhjjbmList.add(po); + } else { + cbzxWhjjbmList.add(po); + } + }); + + // 获取所有的间接部门 + List allJjbmList = cbzxWhjjbmList.stream().map(LtWhjjbmPO::getJjbm).distinct().sorted(String::compareTo).collect(Collectors.toList()); + // 成本中心数据根据成本中心分组展示 + Map> cbzxWhjjbmMapGroupByCbzx = SalaryEntityUtil.group2Map(cbzxWhjjbmList, LtWhjjbmPO::getCbzx); + // 所有成本中心的工资总额 + BigDecimal allCbzxGzzeVal = new BigDecimal("0"); + List> dtoList = new ArrayList<>(); + for (Map.Entry> entry : cbzxWhjjbmMapGroupByCbzx.entrySet()) { + Map singleCbzxValueMap = new HashMap<>(); + List singleCbzxWhjjbmList = entry.getValue(); + BigDecimal singleAllJjbmVal = new BigDecimal("0"); + for (String jjbm : allJjbmList) { + BigDecimal sumVal = singleCbzxWhjjbmList.stream().filter(po -> po.getJjbm().equals(jjbm)) + .map(LtWhjjbmPO::getGzed) + .filter(gzed -> gzed != null) + .reduce(new BigDecimal("0"), BigDecimal::add); + singleCbzxValueMap.put(jjbm, sumVal.toPlainString()); + singleAllJjbmVal= singleAllJjbmVal.add(sumVal); + } + singleCbzxValueMap.put("hj", singleAllJjbmVal.toPlainString()); + singleCbzxValueMap.put("cbzx", entry.getKey()); + allCbzxGzzeVal = allCbzxGzzeVal.add(singleAllJjbmVal); + dtoList.add(singleCbzxValueMap); + } + + // 计算比例 + BigDecimal totalBl = new BigDecimal("0"); + for (Map singleCbzxValueMap : dtoList) { + BigDecimal singleHjVal = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(singleCbzxValueMap.get("hj"))); + BigDecimal blVal = singleHjVal.divide(allCbzxGzzeVal, 4, RoundingMode.HALF_UP); + totalBl = totalBl.add(blVal); + singleCbzxValueMap.put("bl", blVal.toString()); + } + + if (totalBl.compareTo(new BigDecimal("1")) != 0) { + // 计算比例差异 + BigDecimal cyValue = new BigDecimal("1").subtract(totalBl); + for (Map singleCbzxValueMap : dtoList) { + BigDecimal blVal = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(singleCbzxValueMap.get("bl"))); + if (blVal.compareTo(new BigDecimal("0")) != 0) { + blVal = blVal.add(cyValue); + singleCbzxValueMap.put("bl", blVal.toString()); + break; + } + } + } + + // 所有公共分摊的合计值 + BigDecimal ggftSumVal = ggWhjjbmList.stream().map(LtWhjjbmPO::getGzed).filter(gzed -> gzed != null).reduce(new BigDecimal("0"), BigDecimal::add); + // 计算每一个成本中心对应的公共分摊值 + for (Map singleCbzxValueMap : dtoList) { + BigDecimal blVal = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(singleCbzxValueMap.get("bl"))); + singleCbzxValueMap.put("ggft", ggftSumVal.multiply(blVal)); + } + + // 合计值 + Map sumMap = new HashMap<>(); + for (Map singleCbzxValueMap : dtoList) { + BigDecimal ggft = sumMap.computeIfAbsent("ggft", k -> new BigDecimal("0")); + BigDecimal ggftSum = ggft.add(SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(singleCbzxValueMap.get("ggft")))); + sumMap.put("ggft", ggftSum); + BigDecimal hj = sumMap.computeIfAbsent("hj", k -> new BigDecimal("0")); + BigDecimal hjSum = hj.add(SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(singleCbzxValueMap.get("hj")))); + sumMap.put("hj", hjSum); + for (String jjbm : allJjbmList) { + BigDecimal jjbmVal = sumMap.computeIfAbsent(jjbm, k -> new BigDecimal("0")); + BigDecimal jjbmSum = jjbmVal.add(SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(singleCbzxValueMap.get(jjbm)))); + sumMap.put(jjbm, jjbmSum); + } + } + Map sumValueMap = new HashMap<>(); + sumValueMap.put("cbzx", "合计"); + sumValueMap.put("ggft", sumMap.get("ggft") == null ? "0" : sumMap.get("ggft").toPlainString()); + sumValueMap.put("hj", sumMap.get("hj") == null ? "0" : sumMap.get("hj").toPlainString()); + for (String jjbm : allJjbmList) { + sumValueMap.put(jjbm, sumMap.get(jjbm) == null ? 0 : sumMap.get(jjbm).toPlainString()); + } + dtoList.add(sumValueMap); + + List columns = new ArrayList<>(); + columns.add(new Column("成本中心","cbzx","cbzx")); + columns.add(new Column("公共分摊","ggft","ggft")); + for (String jjbm : allJjbmList) { + columns.add(new Column(jjbm,jjbm,jjbm)); + } + columns.add(new Column("合计","hj","hj")); + + Map resultMap = new HashMap<>(); + resultMap.put("data", dtoList); + resultMap.put("columns", columns); + + return resultMap; + } + + // 计算武汉间接部门对应的工资及工资额度 + private void calWhjjbmGz(String salaryMonth, List ltWhjjbmPOS) { + if (CollectionUtils.isEmpty(ltWhjjbmPOS)) { + return; + } + // 获取对应的实发数据 + List employeeIds = ltWhjjbmPOS.stream().map(LtWhjjbmPO::getXm).collect(Collectors.toList()); + // 获取对应期间人员明细工资实发表 + RecordSet rs = new RecordSet(); + BaseBean baseBean = new BaseBean(); + String sfFieldsStr = baseBean.getPropValue("ltSalaryReport", "gzftb_sum_sf_fields"); + List sfFieldList = Arrays.stream(sfFieldsStr.split(",")).filter(field -> StringUtils.isNotBlank(field)).collect(Collectors.toList()); + List ltRymxgzDTOList = new ArrayList<>(); + List> empIdPartition = Lists.partition(employeeIds, 800); + empIdPartition.forEach(part -> { + rs.execute("select xm,"+sfFieldsStr+" from uf_rymxgzsf where qj = '"+salaryMonth+"' and xm in (" + StringUtils.join(part, ",") + ")"); + while (rs.next()) { + BigDecimal sfValue = new BigDecimal("0"); + for (String field : sfFieldList) { + sfValue = sfValue.add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString(field))); + } + ltRymxgzDTOList.add(LtRymxgzDTO.builder() + .xm(SalaryEntityUtil.string2LongDefault0(rs.getString("xm"))) + .gz(sfValue) + .build()); + } + }); + Map ltRymxgzDTOMap = SalaryEntityUtil.convert2Map(ltRymxgzDTOList, LtRymxgzDTO::getXm); + + for (LtWhjjbmPO po : ltWhjjbmPOS) { + LtRymxgzDTO ltRymxgzDTO = ltRymxgzDTOMap.get(po.getXm()); + if (ltRymxgzDTO != null) { + po.setGz(ltRymxgzDTO.getGz()); + if (po.getZb() != null) { + po.setGzed(ltRymxgzDTO.getGz().multiply(po.getZb()).setScale(2, RoundingMode.HALF_UP)); + } + } else { + po.setGz(new BigDecimal("0")); + po.setGzed(new BigDecimal("0")); + } + } + } + + @Override + public XSSFWorkbook exportLtGzftb(LtReportParam param) { + Map map = ltGenGzftb(param.getSalaryMonth()); + List columns = (List)map.get("columns"); + List> dataList = (List>)map.get("data"); + + + List> rowList = new ArrayList<>(); + rowList.add(columns.stream().map(Column::getTitle).collect(Collectors.toList())); + for (Map valueMap : dataList) { + List singleList = new ArrayList<>(); + for (Column col : columns) { + Object o = valueMap.get(col.getKey()); + singleList.add(o); + } + rowList.add(singleList); + } + return ExcelUtil.genWorkbookV2(rowList, "工资分摊表"); + } + + /** + * 联特 表10 - 销售薪资分摊明细表 + * @param param + * @return + */ + @Override + public Map ltKhjlgzftList(LtReportParam param) { + String year = param.getYear(); + if (!NumberUtils.isCreatable(year)) { + throw new SalaryRunTimeException("参数错误"); + } + RecordSet rs = new RecordSet(); + // 获取销售crm表数据 + List ltXsCrmPOS = new ArrayList<>(); + rs.executeQuery("select kh,ny,khjl,srje from uf_xscrm where ny >= ? and ny <=?", Arrays.asList(year+"-01", year+"-12")); + while (rs.next()) { + YearMonth yearMonth = SalaryDateUtil.String2YearMonth(rs.getString("ny")); + ltXsCrmPOS.add(LtXsCrmPO.builder() + .kh(Utils.null2String(rs.getString("kh"))) + .salaryMonth(rs.getString("ny")) + .month(yearMonth == null ? 0 : yearMonth.getMonthValue()) + .khjl(SalaryEntityUtil.string2LongDefault0(rs.getString("khjl"))) + .srje(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("srje"))).build()); + } + // crm 数据根据客户经理、月份分组 + Map> crmGroupByKhjlAndMonth = SalaryEntityUtil.group2Map(ltXsCrmPOS, po -> po.getKhjl() + "_split" + po.getSalaryMonth()); + LinkedHashMap> sortedCrmGroupByKhjlAndMonth = crmGroupByKhjlAndMonth.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, + LinkedHashMap::new)); + + // 获取客户经理的实发表工资数据 + List khjlIds = ltXsCrmPOS.stream().map(LtXsCrmPO::getKhjl).distinct().collect(Collectors.toList()); + Map empIdMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(khjlIds), DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername); + BaseBean baseBean = new BaseBean(); + String sfFieldsStr = baseBean.getPropValue("ltSalaryReport", "xsxzftmx_sum_sf_fields"); + List sfFieldList = Arrays.stream(sfFieldsStr.split(",")).filter(field -> StringUtils.isNotBlank(field)).collect(Collectors.toList()); + List ltRymxgzDTOList = new ArrayList<>(); + List> empIdPartition = Lists.partition(khjlIds, 800); + empIdPartition.forEach(part -> { + rs.execute("select xm,qj,"+sfFieldsStr+" from uf_rymxgzsf where qj >= '"+year+"-01' and qj <= '"+year+"-12' and xm in (" + StringUtils.join(part, ",") + ")"); + while (rs.next()) { + BigDecimal sfValue = new BigDecimal("0"); + for (String field : sfFieldList) { + sfValue = sfValue.add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString(field))); + } + ltRymxgzDTOList.add(LtRymxgzDTO.builder() + .xm(SalaryEntityUtil.string2LongDefault0(rs.getString("xm"))) + .qj(Utils.null2String(rs.getString("qj"))) + .gz(sfValue) + .build()); + } + }); + Map ltRymxgzDTOMap = SalaryEntityUtil.convert2Map(ltRymxgzDTOList, dto -> dto.getXm()+"_split"+dto.getQj()); + // 获取所有的客户 + List khList = ltXsCrmPOS.stream().map(LtXsCrmPO::getKh).distinct().sorted(String::compareTo).collect(Collectors.toList()); + List> dataList = new ArrayList<>(); + for (Map.Entry> entry : sortedCrmGroupByKhjlAndMonth.entrySet()) { + String[] split = entry.getKey().split("_split"); + String khjl = split != null && split.length > 0 ? split[0] : ""; + String salaryMonth = split != null && split.length > 1 ? split[1] : ""; + Map singleRowMap = new HashMap<>(); + for (String kh : khList) { + BigDecimal khSrjeVal = entry.getValue().stream().filter(po -> Utils.null2String(po.getKh()).equals(kh)) + .map(LtXsCrmPO::getSrje).filter(je -> je != null) + .reduce(new BigDecimal("0"), BigDecimal::add); + singleRowMap.put(kh, khSrjeVal.toPlainString()); + } + LtRymxgzDTO ltRymxgzDTO = ltRymxgzDTOMap.get(entry.getKey()); + singleRowMap.put("gz", ltRymxgzDTO == null ? "0" : ltRymxgzDTO.getGz()); + singleRowMap.put("khjl", empIdMap.get(SalaryEntityUtil.string2Long(khjl))); + singleRowMap.put("ny", salaryMonth); + dataList.add(singleRowMap); + } + + List columns = new ArrayList<>(); + columns.add(new Column("客户经理","khjl","khjl")); + columns.add(new Column("年月","ny","ny")); + for (String kh : khList) { + columns.add(new Column(kh,kh,kh)); + } + columns.add(new Column("工资","gz","gz")); + + Map resultMap = new HashMap<>(); + resultMap.put("data", dataList); + resultMap.put("columns", columns); + + if (param.getExport() != null && param.getExport()) { + Map sumMap = new HashMap<>(); + sumMap.put("khjl", "合计"); + Map> crmGroupByKh = SalaryEntityUtil.group2Map(ltXsCrmPOS, po -> po.getKh()); + for (String kh : khList) { + List khCrmList = crmGroupByKh.get(kh); + if (CollectionUtils.isNotEmpty(khCrmList)) { + BigDecimal sumVal = khCrmList.stream().map(LtXsCrmPO::getSrje).filter(je -> je != null).reduce(new BigDecimal("0"), BigDecimal::add); + sumMap.put(kh, sumVal.toPlainString()); + } + } + BigDecimal gzSumVal = dataList.stream().map(map -> SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(map.get("gz")))).reduce(new BigDecimal("0"), BigDecimal::add); + sumMap.put("gz", gzSumVal.toPlainString()); + resultMap.put("sumRow", sumMap); + } + return resultMap; + } + + @Override + public Map ltKhjlgzftSum(String year) { + if (!NumberUtils.isCreatable(year)) { + throw new SalaryRunTimeException("参数错误"); + } + RecordSet rs = new RecordSet(); + // 获取销售crm表数据 + List ltXsCrmPOS = new ArrayList<>(); + rs.executeQuery("select kh,ny,khjl,srje from uf_xscrm where ny >= ? and ny <=?", Arrays.asList(year+"-01", year+"-12")); + while (rs.next()) { + YearMonth yearMonth = SalaryDateUtil.String2YearMonth(rs.getString("ny")); + ltXsCrmPOS.add(LtXsCrmPO.builder() + .kh(Utils.null2String(rs.getString("kh"))) + .salaryMonth(rs.getString("ny")) + .month(yearMonth == null ? 0 : yearMonth.getMonthValue()) + .khjl(SalaryEntityUtil.string2LongDefault0(rs.getString("khjl"))) + .srje(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("srje"))).build()); + } + // crm 数据根据客户分组 + Map> crmGroupByKhjlAndMonth = SalaryEntityUtil.group2Map(ltXsCrmPOS, po -> po.getKh()); + + // 获取客户经理的实发表工资数据 + List khjlIds = ltXsCrmPOS.stream().map(LtXsCrmPO::getKhjl).distinct().collect(Collectors.toList()); + Map empIdMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(khjlIds), DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername); + BaseBean baseBean = new BaseBean(); + String sfFieldsStr = baseBean.getPropValue("ltSalaryReport", "xsxzftmx_sum_sf_fields"); + List sfFieldList = Arrays.stream(sfFieldsStr.split(",")).filter(field -> StringUtils.isNotBlank(field)).collect(Collectors.toList()); + List ltRymxgzDTOList = new ArrayList<>(); + List> empIdPartition = Lists.partition(khjlIds, 800); + final BigDecimal[] totalSfVal = {new BigDecimal("0")}; + empIdPartition.forEach(part -> { + rs.execute("select xm,qj,"+sfFieldsStr+" from uf_rymxgzsf where qj >= '"+year+"-01' and qj <= '"+year+"-12' and xm in (" + StringUtils.join(part, ",") + ")"); + while (rs.next()) { + for (String field : sfFieldList) { + totalSfVal[0] = totalSfVal[0].add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString(field))); + } + } + }); + Map sumMap = new HashMap<>(); + sumMap.put("khjl", "合计"); + sumMap.put("gz", totalSfVal[0].toPlainString()); + // 获取所有的客户 + List khList = ltXsCrmPOS.stream().map(LtXsCrmPO::getKh).distinct().sorted(String::compareTo).collect(Collectors.toList()); + for (String kh : khList) { + List ltXsCrmPOList = crmGroupByKhjlAndMonth.get(kh); + if (CollectionUtils.isNotEmpty(ltXsCrmPOList)) { + BigDecimal khSumVal = ltXsCrmPOList.stream().map(LtXsCrmPO::getSrje).filter(je -> je != null).reduce(new BigDecimal("0"), BigDecimal::add); + sumMap.put(kh, khSumVal.toPlainString()); + } + } + Map resultMap = new HashMap<>(); + resultMap.put("sumRow", sumMap); + return resultMap; + } + + @Override + public XSSFWorkbook exportKhjlgzftList(String year) { + LtReportParam build = LtReportParam.builder().year(year).build(); + build.setExport(true); + Map map = ltKhjlgzftList(build); + List columns = (List)map.get("columns"); + List> dataList = (List>)map.get("data"); + Map sumRow = (Map)map.get("sumRow"); + dataList.add(sumRow); + + List> rowList = new ArrayList<>(); + rowList.add(columns.stream().map(Column::getTitle).collect(Collectors.toList())); + for (Map valueMap : dataList) { + List singleList = new ArrayList<>(); + for (Column col : columns) { + Object o = valueMap.get(col.getKey()); + singleList.add(o); + } + rowList.add(singleList); + } + return ExcelUtil.genWorkbookV2(rowList, "客户经理工资分摊表"); + } + + @Override + public Map ltXsxzftList(LtReportParam param) { + String year = param.getYear(); + if (!NumberUtils.isCreatable(year)) { + throw new SalaryRunTimeException("参数错误"); + } + + if (param.getKhjl() == null) { + throw new SalaryRunTimeException("客户经理不能为空"); + } + RecordSet rs = new RecordSet(); + // 获取销售crm表数据 + List ltXsCrmPOS = new ArrayList<>(); + rs.executeQuery("select kh,ny,khjl,srje from uf_xscrm where ny >= ? and ny <=? and khjl=?", Arrays.asList(year+"-01", year+"-12", param.getKhjl())); + while (rs.next()) { + YearMonth yearMonth = SalaryDateUtil.String2YearMonth(rs.getString("ny")); + ltXsCrmPOS.add(LtXsCrmPO.builder() + .kh(Utils.null2String(rs.getString("kh"))) + .salaryMonth(rs.getString("ny")) + .month(yearMonth == null ? 0 : yearMonth.getMonthValue()) + .khjl(SalaryEntityUtil.string2LongDefault0(rs.getString("khjl"))) + .srje(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("srje"))).build()); + } + // 获取所有的月份数据 + List allSalaryMonthList = ltXsCrmPOS.stream().map(LtXsCrmPO::getSalaryMonth).distinct().sorted(String::compareTo).collect(Collectors.toList()); + + // crm 数据根据月份分组 + Map> crmGroupBySalaryMonth = SalaryEntityUtil.group2Map(ltXsCrmPOS, po -> po.getSalaryMonth()); + // 获取每个月份所有客户的合计值 + Map sumValGroupByMonth = new HashMap<>(); + for (Map.Entry> entry : crmGroupBySalaryMonth.entrySet()) { + BigDecimal sumValByMonth = entry.getValue().stream().map(LtXsCrmPO::getSrje).filter(je -> je != null && je.compareTo(new BigDecimal("0")) > 0).reduce(new BigDecimal("0"), BigDecimal::add); + sumValGroupByMonth.put(entry.getKey(), sumValByMonth.toPlainString()); + } + + // crm 数据根据客户分组 + Map> crmGroupByKh = SalaryEntityUtil.group2Map(ltXsCrmPOS, po -> po.getKh()); + LinkedHashMap> sortedCrmGroupByKh = crmGroupByKh.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, + LinkedHashMap::new)); + + // 获取客户经理的实发表工资数据 + BaseBean baseBean = new BaseBean(); + String sfFieldsStr = baseBean.getPropValue("ltSalaryReport", "xsxzftmx_sum_sf_fields"); + List sfFieldList = Arrays.stream(sfFieldsStr.split(",")).filter(field -> StringUtils.isNotBlank(field)).collect(Collectors.toList()); + List ltRymxgzDTOList = new ArrayList<>(); + rs.execute("select xm,qj,"+sfFieldsStr+" from uf_rymxgzsf where qj >= '"+year+"-01' and qj <= '"+year+"-12' and xm =" + param.getKhjl()); + while (rs.next()) { + BigDecimal sfValue = new BigDecimal("0"); + for (String field : sfFieldList) { + sfValue = sfValue.add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString(field))); + } + ltRymxgzDTOList.add(LtRymxgzDTO.builder() + .xm(SalaryEntityUtil.string2LongDefault0(rs.getString("xm"))) + .qj(Utils.null2String(rs.getString("qj"))) + .gz(sfValue) + .build()); + } + Map> ltRymxgzDTOMap = SalaryEntityUtil.group2Map(ltRymxgzDTOList, dto -> dto.getQj()); + // 获取所有的客户 + List> dataList = new ArrayList<>(); + for (Map.Entry> entry : sortedCrmGroupByKh.entrySet()) { + Map singleRowMap = new HashMap<>(); + for (String salaryMonth : allSalaryMonthList) { + // 获取该月份所有客户的合计值 + BigDecimal sumValByMonth = SalaryEntityUtil.string2BigDecimalDefault0(sumValGroupByMonth.get(salaryMonth)); + // 该月该客户金额值 + BigDecimal srjeVal = entry.getValue().stream().filter(po -> Utils.null2String(po.getSalaryMonth()).equals(salaryMonth)) + .map(LtXsCrmPO::getSrje).filter(je -> je != null) + .reduce(new BigDecimal("0"), BigDecimal::add); + // 获取该客户经理该月工资 + BigDecimal gz = new BigDecimal("0"); + List ltRymxgzDTOS = ltRymxgzDTOMap.get(salaryMonth); + if (CollectionUtils.isNotEmpty(ltRymxgzDTOS)) { + gz = ltRymxgzDTOS.stream().map(LtRymxgzDTO::getGz).filter(g -> g != null).reduce(new BigDecimal("0"), BigDecimal::add); + } + String ftgz = "0"; + if (srjeVal != null && srjeVal.compareTo(new BigDecimal("0")) > 0 && sumValByMonth != null && sumValByMonth.compareTo(new BigDecimal("0")) > 0 ) { + ftgz = gz.multiply(srjeVal).divide(sumValByMonth,2, RoundingMode.HALF_UP).toPlainString(); + } + singleRowMap.put(salaryMonth, ftgz); + } + singleRowMap.put("kh", entry.getKey()); + dataList.add(singleRowMap); + } + + List columns = new ArrayList<>(); + columns.add(new Column("客户","kh","kh")); + for (String salaryMonth : allSalaryMonthList) { + columns.add(new Column(salaryMonth + "分摊工资",salaryMonth,salaryMonth)); + } + Map resultMap = new HashMap<>(); + resultMap.put("data", dataList); + resultMap.put("columns", columns); + + if (param.getExport() != null && param.getExport()) { + Map sumMap = new HashMap<>(); + sumMap.put("kh", "合计"); + for (String salaryMonth : allSalaryMonthList) { + BigDecimal sumVal = dataList.stream().map(map -> SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(map.get(salaryMonth)))).reduce(new BigDecimal("0"), BigDecimal::add); + sumMap.put(salaryMonth, sumVal); + } + resultMap.put("sumRow", sumMap); + } + return resultMap; + } + + @Override + public Map ltXsxzftSum(LtReportParam param) { + String year = param.getYear(); + if (!NumberUtils.isCreatable(year)) { + throw new SalaryRunTimeException("参数错误"); + } + + if (param.getKhjl() == null) { + throw new SalaryRunTimeException("客户经理不能为空"); + } + RecordSet rs = new RecordSet(); + // 获取销售crm表数据 + List ltXsCrmPOS = new ArrayList<>(); + rs.executeQuery("select kh,ny,khjl,srje from uf_xscrm where ny >= ? and ny <=? and khjl=?", Arrays.asList(year+"-01", year+"-12", param.getKhjl())); + while (rs.next()) { + YearMonth yearMonth = SalaryDateUtil.String2YearMonth(rs.getString("ny")); + ltXsCrmPOS.add(LtXsCrmPO.builder() + .kh(Utils.null2String(rs.getString("kh"))) + .salaryMonth(rs.getString("ny")) + .month(yearMonth == null ? 0 : yearMonth.getMonthValue()) + .khjl(SalaryEntityUtil.string2LongDefault0(rs.getString("khjl"))) + .srje(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("srje"))).build()); + } + // 获取所有的月份数据 + List allSalaryMonthList = ltXsCrmPOS.stream().map(LtXsCrmPO::getSalaryMonth).distinct().sorted(String::compareTo).collect(Collectors.toList()); + + // crm 数据根据月份分组 + Map> crmGroupBySalaryMonth = SalaryEntityUtil.group2Map(ltXsCrmPOS, po -> po.getSalaryMonth()); + // 获取每个月份所有客户的合计值 + Map sumValGroupByMonth = new HashMap<>(); + for (Map.Entry> entry : crmGroupBySalaryMonth.entrySet()) { + BigDecimal sumValByMonth = entry.getValue().stream().map(LtXsCrmPO::getSrje).filter(je -> je != null && je.compareTo(new BigDecimal("0")) > 0).reduce(new BigDecimal("0"), BigDecimal::add); + sumValGroupByMonth.put(entry.getKey(), sumValByMonth.toPlainString()); + } + + // crm 数据根据客户分组 + Map> crmGroupByKh = SalaryEntityUtil.group2Map(ltXsCrmPOS, po -> po.getKh()); + LinkedHashMap> sortedCrmGroupByKh = crmGroupByKh.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, + LinkedHashMap::new)); + + // 获取客户经理的实发表工资数据 + BaseBean baseBean = new BaseBean(); + String sfFieldsStr = baseBean.getPropValue("ltSalaryReport", "xsxzftmx_sum_sf_fields"); + List sfFieldList = Arrays.stream(sfFieldsStr.split(",")).filter(field -> StringUtils.isNotBlank(field)).collect(Collectors.toList()); + List ltRymxgzDTOList = new ArrayList<>(); + rs.execute("select xm,qj,"+sfFieldsStr+" from uf_rymxgzsf where qj >= '"+year+"-01' and qj <= '"+year+"-12' and xm =" + param.getKhjl()); + while (rs.next()) { + BigDecimal sfValue = new BigDecimal("0"); + for (String field : sfFieldList) { + sfValue = sfValue.add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString(field))); + } + ltRymxgzDTOList.add(LtRymxgzDTO.builder() + .xm(SalaryEntityUtil.string2LongDefault0(rs.getString("xm"))) + .qj(Utils.null2String(rs.getString("qj"))) + .gz(sfValue) + .build()); + } + Map> ltRymxgzDTOMap = SalaryEntityUtil.group2Map(ltRymxgzDTOList, dto -> dto.getQj()); + // 获取所有的客户 + List> dataList = new ArrayList<>(); + for (Map.Entry> entry : sortedCrmGroupByKh.entrySet()) { + Map singleRowMap = new HashMap<>(); + for (String salaryMonth : allSalaryMonthList) { + // 获取该月份所有客户的合计值 + BigDecimal sumValByMonth = SalaryEntityUtil.string2BigDecimalDefault0(sumValGroupByMonth.get(salaryMonth)); + // 该月该客户金额值 + BigDecimal srjeVal = entry.getValue().stream().filter(po -> Utils.null2String(po.getSalaryMonth()).equals(salaryMonth)) + .map(LtXsCrmPO::getSrje).filter(je -> je != null) + .reduce(new BigDecimal("0"), BigDecimal::add); + // 获取该客户经理该月工资 + BigDecimal gz = new BigDecimal("0"); + List ltRymxgzDTOS = ltRymxgzDTOMap.get(salaryMonth); + if (CollectionUtils.isNotEmpty(ltRymxgzDTOS)) { + gz = ltRymxgzDTOS.stream().map(LtRymxgzDTO::getGz).filter(g -> g != null).reduce(new BigDecimal("0"), BigDecimal::add); + } + + String ftgz = "0"; + if (srjeVal != null && srjeVal.compareTo(new BigDecimal("0")) > 0 && sumValByMonth != null && sumValByMonth.compareTo(new BigDecimal("0")) > 0 ) { + ftgz = gz.multiply(srjeVal).divide(sumValByMonth,2, RoundingMode.HALF_UP).toPlainString(); + } + singleRowMap.put(salaryMonth, ftgz); + } + singleRowMap.put("kh", entry.getKey()); + dataList.add(singleRowMap); + } + + + Map sumMap = new HashMap<>(); + sumMap.put("kh", "合计"); + for (String salaryMonth : allSalaryMonthList) { + BigDecimal sumVal = dataList.stream().map(map -> SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(map.get(salaryMonth)))).reduce(new BigDecimal("0"), BigDecimal::add); + sumMap.put(salaryMonth, sumVal); + } + Map resultMap = new HashMap<>(); + resultMap.put("sumRow", sumMap); + return resultMap; + } + + @Override + public XSSFWorkbook exportXsxzftList(LtReportParam param) { + param.setExport(true); + Map map = ltXsxzftList(param); + List columns = (List)map.get("columns"); + List> dataList = (List>)map.get("data"); + Map sumRow = (Map)map.get("sumRow"); + dataList.add(sumRow); + + List> rowList = new ArrayList<>(); + rowList.add(columns.stream().map(Column::getTitle).collect(Collectors.toList())); + for (Map valueMap : dataList) { + List singleList = new ArrayList<>(); + for (Column col : columns) { + Object o = valueMap.get(col.getKey()); + singleList.add(o); + } + rowList.add(singleList); + } + return ExcelUtil.genWorkbookV2(rowList, "销售薪资分摊明细表"); + } } \ No newline at end of file diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index d07568507..887b65a60 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -1277,5 +1277,156 @@ public class SalaryAcctController { return new ResponseResult(user).run(getSalaryAcctResultWrapper(user)::ltGenGwpjgzcxb, salaryMonth); } + /** + * 联特 表8 - 工资分摊表 + * @param request + * @param response + * @return + */ + @POST + @Path("/ltSalaryReport/genGzftb") + @Produces(MediaType.APPLICATION_JSON) + public String ltGenGzftb(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody LtReportParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::ltGenGzftb, param.getSalaryMonth()); + } + + @POST + @Path("/ltSalaryReport/exportGzftb") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response ltExportGzftb(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody LtReportParam param) { + try { + User user = HrmUserVarify.getUser(request, response); + XSSFWorkbook workbook = getSalaryAcctResultWrapper(user).exportLtGzftb(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; + } + } + + + /** + * 联特 表10 - 销售薪资分摊明细表 + * @param request + * @param response + * @return + */ + @POST + @Path("/ltSalaryReport/khjlgzftList") + @Produces(MediaType.APPLICATION_JSON) + public String ltKhjlgzftList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody LtReportParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::ltKhjlgzftList, param); + } + + /** + * 联特 表10 - 销售薪资分摊明细表 + * @param request + * @param response + * @return + */ + @POST + @Path("/ltSalaryReport/khjlgzftSum") + @Produces(MediaType.APPLICATION_JSON) + public String ltKhjlgzftSum(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody LtReportParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::ltKhjlgzftSum, param.getYear()); + } + + @POST + @Path("/ltSalaryReport/exportKhjlgzftList") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response exportKhjlgzftList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody LtReportParam param) { + try { + User user = HrmUserVarify.getUser(request, response); + XSSFWorkbook workbook = getSalaryAcctResultWrapper(user).exportKhjlgzftList(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; + } + } + + + /** + * 联特 表10 - 销售薪资分摊明细表 + * @param request + * @param response + * @return + */ + @POST + @Path("/ltSalaryReport/xsxzftList") + @Produces(MediaType.APPLICATION_JSON) + public String ltXsxzftList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody LtReportParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::ltXsxzftList, param); + } + + /** + * 联特 表10 - 销售薪资分摊明细表 + * @param request + * @param response + * @return + */ + @POST + @Path("/ltSalaryReport/xsxzftSum") + @Produces(MediaType.APPLICATION_JSON) + public String ltXsxzftSum(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody LtReportParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::ltXsxzftSum, param); + } + + @POST + @Path("/ltSalaryReport/exportXsxzftList") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response exportXsxzftList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody LtReportParam param) { + try { + User user = HrmUserVarify.getUser(request, response); + XSSFWorkbook workbook = getSalaryAcctResultWrapper(user).exportXsxzftList(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/SalaryAcctResultWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java index ed2b3f0ee..d0bb71a60 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java @@ -24,6 +24,7 @@ import com.engine.salary.wrapper.proxy.SalaryAcctResultWrapperProxy; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.hrm.User; import java.math.BigDecimal; @@ -531,4 +532,41 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult public String ltGenGwpjgzcxb(String salaryMonth) { return getSalaryAcctResultService(user).ltGenGwpjgzcxb(salaryMonth); } + + /** + * 联特 表8 - 工资分摊表 + * @param salaryMonth + * @return + */ + public Map ltGenGzftb(String salaryMonth) { + return getSalaryAcctResultService(user).ltGenGzftb(salaryMonth); + } + + public XSSFWorkbook exportLtGzftb(LtReportParam param) { + return getSalaryAcctResultService(user).exportLtGzftb(param); + } + + public Map ltKhjlgzftList(LtReportParam param) { + return getSalaryAcctResultService(user).ltKhjlgzftList(param); + } + + public Map ltKhjlgzftSum(String year) { + return getSalaryAcctResultService(user).ltKhjlgzftSum(year); + } + + public XSSFWorkbook exportKhjlgzftList(LtReportParam param) { + return getSalaryAcctResultService(user).exportKhjlgzftList(param.getYear()); + } + + public Map ltXsxzftList(LtReportParam param) { + return getSalaryAcctResultService(user).ltXsxzftList(param); + } + + public Map ltXsxzftSum(LtReportParam param) { + return getSalaryAcctResultService(user).ltXsxzftSum(param); + } + + public XSSFWorkbook exportXsxzftList(LtReportParam param) { + return getSalaryAcctResultService(user).exportXsxzftList(param); + } }