From 8d68683f9367c125ec1d4af72587505dec33b560 Mon Sep 17 00:00:00 2001 From: Harry-xzy <822365880@qq.com> Date: Wed, 3 Sep 2025 16:09:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=94=E7=89=B9=E6=8A=A5=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salaryacct/dto/LtNdhzReportDTO.java | 27 + .../mapper/datacollection/EmployMapper.java | 2 + .../mapper/datacollection/EmployMapper.xml | 15 +- .../salary/mapper/hrm/HrmSnapshotMapper.java | 3 + .../salary/mapper/hrm/HrmSnapshotMapper.xml | 22 + .../service/SalaryAcctResultService.java | 31 + .../salary/service/SalaryEmployeeService.java | 2 + .../impl/EmployeeDeclareExcelServiceImpl.java | 38 +- .../impl/SalaryAcctResultServiceImpl.java | 1022 ++++++++++++++++- .../impl/SalaryEmployeeServiceImpl.java | 5 + .../salary/web/SalaryAcctController.java | 73 ++ .../wrapper/SalaryAcctResultWrapper.java | 32 + 12 files changed, 1258 insertions(+), 14 deletions(-) create mode 100644 src/com/engine/salary/entity/salaryacct/dto/LtNdhzReportDTO.java diff --git a/src/com/engine/salary/entity/salaryacct/dto/LtNdhzReportDTO.java b/src/com/engine/salary/entity/salaryacct/dto/LtNdhzReportDTO.java new file mode 100644 index 000000000..c671c1fca --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/dto/LtNdhzReportDTO.java @@ -0,0 +1,27 @@ +package com.engine.salary.entity.salaryacct.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author Harryxzy + * @ClassName LtNdhzReportDTO + * @date 2025/09/02 21:09 + * @description + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LtNdhzReportDTO { + + private Long departmentId; + + private Integer year; + + private BigDecimal value; +} diff --git a/src/com/engine/salary/mapper/datacollection/EmployMapper.java b/src/com/engine/salary/mapper/datacollection/EmployMapper.java index d3fa69cf5..d782efc23 100644 --- a/src/com/engine/salary/mapper/datacollection/EmployMapper.java +++ b/src/com/engine/salary/mapper/datacollection/EmployMapper.java @@ -190,4 +190,6 @@ public interface EmployMapper { List listByKeyword(@Param("keyword") String keyword); List listByWorkCodes(@Param("workCodes") List workCodes); + + List listDepartmentIdBySubcompanyIds(@Param("subcompanyIds")List subcompanyIds); } \ 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 2c553acc5..4e8a96170 100644 --- a/src/com/engine/salary/mapper/datacollection/EmployMapper.xml +++ b/src/com/engine/salary/mapper/datacollection/EmployMapper.xml @@ -317,7 +317,8 @@ e.subcompanyid1 as subcompanyid, e.departmentid as departmentId, d.DEPARTMENTNAME as departmentName, - e.jobtitle as jobtitleId + e.jobtitle as jobtitleId, + e.enddate as dismissdate from hrmresource e left join hrmdepartment d on e.departmentid = d.id where e.status not in (7) @@ -360,6 +361,7 @@ #{departmentId} + order by d.showorder + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.java b/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.java index 81082b003..2c5de43f1 100644 --- a/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.java +++ b/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.java @@ -18,6 +18,9 @@ public interface HrmSnapshotMapper { List snapshot(@Param("employeeId")Long employeeId, @Param("snapshotTime")Date snapshotTime); + List getSnapshotTime(@Param("startTime")Date startTime, @Param("emdTime")Date emdTime); + Integer countByStatusAndSnapshotTime(@Param("statusList")List statusList, @Param("snapshotTime")Date snapshotTime); + /** * 条件查询 * diff --git a/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.xml b/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.xml index 4cdd38266..a1f3d9bdd 100644 --- a/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.xml +++ b/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.xml @@ -1205,5 +1205,27 @@ left join hrmjobtitles j on e.jobtitle = j.id left join hrmjobcall job on e.jobcall=job.id + + + + \ No newline at end of file diff --git a/src/com/engine/salary/service/SalaryAcctResultService.java b/src/com/engine/salary/service/SalaryAcctResultService.java index abcc0fe7c..27e0034db 100644 --- a/src/com/engine/salary/service/SalaryAcctResultService.java +++ b/src/com/engine/salary/service/SalaryAcctResultService.java @@ -292,4 +292,35 @@ public interface SalaryAcctResultService { * @return */ String ltGenRymxgzsf(String salaryMonth); + + /** + * 联特人事口径 - 生成旗下人力成本分析 + * @param salaryMonth + */ + String ltGenQxrlcbfx(String salaryMonth); + + /** + * 联特人事口径 - 生成部门为单位人力成本分析 + * @param salaryMonth + */ + String ltGenBmwdwrlcbfx(String salaryMonth); + + /** + * 联特人事口径 - 生成费用类型人力成本分析 + * @param salaryMonth + */ + String ltGenFylxlcbfx(String salaryMonth); + + /** + * 联特人事口径 - 年度汇总 + * @return + */ + Map ltNdhzReport(); + + /** + * 联特人事口径 - 看板 + * @param salaryMonth + * @return + */ + String ltGenKb(String salaryMonth); } diff --git a/src/com/engine/salary/service/SalaryEmployeeService.java b/src/com/engine/salary/service/SalaryEmployeeService.java index abe64e820..ecfe0002e 100644 --- a/src/com/engine/salary/service/SalaryEmployeeService.java +++ b/src/com/engine/salary/service/SalaryEmployeeService.java @@ -212,4 +212,6 @@ public interface SalaryEmployeeService { List snapshot(List employeeIds, Date snapshotTime); List listByWorkCodes(List workcodes); + + List listDepartmentIdBySubcompanyIds(List subcompanyIds); } diff --git a/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java b/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java index d8a01f687..ae2bb9444 100644 --- a/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java @@ -377,11 +377,11 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee } } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "离职日期"))) { if (StringUtils.isEmpty(dataValue)) { - if (Objects.equals(employeeDeclareExcel.getEmploymentStatus(), EmploymentStatusEnum.ABNORMAL.getValue().toString())) { - isError = true; - Map errorMessageMap = Maps.newHashMap(); - errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "人员状态为非正常时,离职日期必填")); - errorData.add(errorMessageMap); + if (Objects.equals(employeeDeclareExcel.getEmploymentStatus(), EmploymentStatusEnum.ABNORMAL.getValue())) { + // isError = true; + // Map errorMessageMap = Maps.newHashMap(); + // errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "人员状态为非正常时,离职日期必填")); + // errorData.add(errorMessageMap); } } else { if (StringUtils.isNotBlank(dataValue) && dataValue.length() >= 10) { @@ -497,9 +497,11 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee if (!isError) { if (StringUtils.equals(checkType, "jobNum")) { EmployeeDeclarePO employeeDeclare = employeeDeclareMap.get(employeeDeclareExcel.getJobNum()); + DataCollectionEmployee extEmployee = extEmployeeMap.get(employeeDeclareExcel.getJobNum()); + DataCollectionEmployee simpleEmployee = simpleEmployeeMap.get(employeeDeclareExcel.getJobNum()); if (employeeDeclare == null) { - DataCollectionEmployee extEmployee = extEmployeeMap.get(employeeDeclareExcel.getJobNum()); - DataCollectionEmployee simpleEmployee = simpleEmployeeMap.get(employeeDeclareExcel.getJobNum()); + // DataCollectionEmployee extEmployee = extEmployeeMap.get(employeeDeclareExcel.getJobNum()); + // DataCollectionEmployee simpleEmployee = simpleEmployeeMap.get(employeeDeclareExcel.getJobNum()); if (extEmployee == null && simpleEmployee == null) { isError = true; Map errorMessageMap = Maps.newHashMap(); @@ -516,6 +518,11 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee BeanUtils.copyProperties(employeeDeclarePO, newEmployeeDeclare, getNullPropertyNames(employeeDeclarePO)); newEmployeeDeclare.setNewEmployeeInfo(StringUtils.equals(employeeDeclare.toCompareString(), newEmployeeDeclare.toCompareString()) ? 0 : 1); newEmployeeDeclare.setUpdateTime(now); + if (Objects.equals(newEmployeeDeclare.getEmploymentStatus(), EmploymentStatusEnum.ABNORMAL.getValue()) && newEmployeeDeclare.getDismissDate() == null) { + if (simpleEmployee != null) { + newEmployeeDeclare.setDismissDate(SalaryDateUtil.dateStrToLocalDate(simpleEmployee.getDismissdate())); + } + } needUpdateEmployeeDeclares.add(newEmployeeDeclare); if (Objects.equals(newEmployeeDeclare.getNewEmployeeInfo(), 1)) { newEmployeeDeclare.setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue()); @@ -524,9 +531,11 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee } } else { EmployeeDeclarePO employeeDeclare = employeeDeclareMap.get(employeeDeclareExcel.getCardNum()); + DataCollectionEmployee extEmployee = extEmployeeMap.get(employeeDeclareExcel.getCardNum()); + DataCollectionEmployee simpleEmployee = simpleEmployeeMap.get(employeeDeclareExcel.getCardNum()); if (employeeDeclare == null) { - DataCollectionEmployee extEmployee = extEmployeeMap.get(employeeDeclareExcel.getCardNum()); - DataCollectionEmployee simpleEmployee = simpleEmployeeMap.get(employeeDeclareExcel.getCardNum()); + // DataCollectionEmployee extEmployee = extEmployeeMap.get(employeeDeclareExcel.getCardNum()); + // DataCollectionEmployee simpleEmployee = simpleEmployeeMap.get(employeeDeclareExcel.getCardNum()); if (extEmployee == null && simpleEmployee == null) { isError = true; Map errorMessageMap = Maps.newHashMap(); @@ -547,6 +556,11 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee newEmployeeDeclare.setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue()); newEmployeeDeclare.setDeclareErrorMsg(""); } + if (Objects.equals(newEmployeeDeclare.getEmploymentStatus(), EmploymentStatusEnum.ABNORMAL.getValue()) && newEmployeeDeclare.getDismissDate() == null) { + if (simpleEmployee != null) { + newEmployeeDeclare.setDismissDate(SalaryDateUtil.dateStrToLocalDate(simpleEmployee.getDismissdate())); + } + } needUpdateEmployeeDeclares.add(newEmployeeDeclare); } } @@ -636,10 +650,16 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee if (extEmployee != null) { employeeDeclare.setEmployeeId(extEmployee.getEmployeeId()); employeeDeclare.setEmployeeType(EmployeeTypeEnum.EXT_EMPLOYEE.getValue()); + if (employeeDeclare.getDismissDate() == null) { + employeeDeclare.setDismissDate(SalaryDateUtil.dateStrToLocalDate(extEmployee.getDismissdate())); + } } if (simpleEmployee != null) { employeeDeclare.setEmployeeId(simpleEmployee.getEmployeeId()); employeeDeclare.setEmployeeType(EmployeeTypeEnum.ORGANIZATION.getValue()); + if (Objects.equals(employeeDeclare.getEmploymentStatus(), EmploymentStatusEnum.ABNORMAL.getValue()) && employeeDeclare.getDismissDate() == null) { + employeeDeclare.setDismissDate(SalaryDateUtil.dateStrToLocalDate(simpleEmployee.getDismissdate())); + } } return employeeDeclare; } diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index ed0916fd7..6771224f2 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -19,10 +19,7 @@ import com.engine.salary.entity.hrm.SubCompanyInfo; import com.engine.salary.entity.progress.ProgressDTO; import com.engine.salary.entity.report.po.SalaryAcctResultReportPO; import com.engine.salary.entity.salaryacct.bo.*; -import com.engine.salary.entity.salaryacct.dto.ConsolidatedTaxDetailDTO; -import com.engine.salary.entity.salaryacct.dto.LtSalaryReportConfigDTO; -import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultDetailDTO; -import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO; +import com.engine.salary.entity.salaryacct.dto.*; import com.engine.salary.entity.salaryacct.param.*; import com.engine.salary.entity.salaryacct.po.*; import com.engine.salary.entity.salaryarchive.po.SalaryArchiveItemPO; @@ -45,6 +42,7 @@ import com.engine.salary.enums.salaryformula.SalaryFormulaReferenceEnum; import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; import com.engine.salary.enums.salarysob.IncomeCategoryEnum; import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.mapper.hrm.HrmSnapshotMapper; import com.engine.salary.mapper.salaryacct.SalaryAcctResultMapper; import com.engine.salary.report.service.SalaryStatisticsReportService; import com.engine.salary.report.service.impl.SalaryStatisticsReportServiceImpl; @@ -59,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.page.Column; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.engine.salary.util.valid.ValidUtil; @@ -94,6 +93,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingDeque; import java.util.regex.Matcher; import java.util.stream.Collectors; +import java.util.stream.IntStream; import static com.engine.salary.constant.SalaryFormulaFieldConstant.SALARY_PATTERN; import static com.engine.salary.sys.constant.SalarySysConstant.SALARY_ACCT_SYNC_TYPE; @@ -248,6 +248,10 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe return ServiceUtil.getService(SalaryArchiveItemServiceImpl.class, user); } + private HrmSnapshotMapper getHrmSnapshotMapper() { + return MapperProxyFactory.getProxy(HrmSnapshotMapper.class); + } + @Override public List listBySalaryAcctRecordIds(Collection salaryAcctRecordIds) { if (CollectionUtils.isEmpty(salaryAcctRecordIds)) { @@ -2665,4 +2669,1014 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe } return "success"; } + + /** + * 联特人事口径 - 生成旗下人力成本分析 + * @param yearStr + */ + @Override + public String ltGenQxrlcbfx(String yearStr) { + if (!NumberUtils.isCreatable(yearStr)) { + throw new SalaryRunTimeException("参数错误错误"); + } + Integer year = Integer.valueOf(yearStr); + // 获取需要生成哪个分部下的数据 + BaseBean baseBean = new BaseBean(); + List subcompanyIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_subcompany_ids").split(",")) + .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + for (Long subcompanyId : subcompanyIds) { + // 获取对应的预算数据 + BigDecimal[] fdSum = {new BigDecimal("0")}; + List> ltYsList = getLtYsList(year, Collections.singletonList(subcompanyId), fdSum); + // 获取对应的还原预算数据 + List> ltHyysList = getLtBmhyysList(year, Collections.singletonList(subcompanyId)); + + // 获取旗下人力成本分析对应薪酬数据 + List> ltSalaryList = new ArrayList<>(); + // 循环yearMonth当年1月到12月 + List yearMonths = IntStream.rangeClosed(1, 12) + .mapToObj(month -> YearMonth.of(year, month)) + .collect(Collectors.toList()); + for (YearMonth date : yearMonths) { + // 获取薪资核算数据 + List salaryDataList = getSalaryData4Qxrlcbfx(date, Collections.singletonList(subcompanyId)); + ltSalaryList.add(salaryDataList); + } + // 获取建模模块id + String modeId = baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_mode_id"); + // 获取建模中是否已有数据 + String sql = "select id from uf_jtqxrlcbfx where fb =? and ysnf =?"; + RecordSet rs = new RecordSet(); + rs.executeQuery(sql, Arrays.asList(subcompanyId, year)); + List insertFields = Arrays.asList("yrlcbys1", "yhyys1", "ysjys1", "yycrs1", "ysjrs1", "yrlcbys2", "yhyys2", "ysjys2", "yycrs2", "ysjrs2", + "yrlcbys3", "yhyys3", "ysjys3", "yycrs3", "ysjrs3", "yrlcbys4", "yhyys4", "ysjys4", "yycrs4", "ysjrs4", "yrlcbys5", "yhyys5", "ysjys5", "yycrs5", "ysjrs5", "yrlcbys6", "yhyys6", "ysjys6", "yycrs6", "ysjrs6", + "yrlcbys7", "yhyys7", "ysjys7", "yycrs7", "ysjrs7", "yrlcbys8", "yhyys8", "ysjys8", "yycrs8", "ysjrs8", "yrlcbys9", "yhyys9", "ysjys9", "yycrs9", "ysjrs9", "yrlcbys10", "yhyys10", "ysjys10", "yycrs10", "ysjrs10", + "yrlcbys11", "yhyys11", "ysjys11", "yycrs11", "ysjrs11", "yrlcbys12", "yhyys12", "ysjys12", "yycrs12", "ysjrs12"); + if (rs.next()) { + String id = rs.getString("id"); + // 更新 + StringBuilder updateSqlSb = new StringBuilder("update uf_jtqxrlcbfx set "); + for (int i =0; i < 12; i++) { + int finalI = i; + String ysSum = ltYsList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + if (i >= 3) { + ysSum = new BigDecimal(ysSum).add(fdSum[0]).toString(); + } + String hySum = ltHyysList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + List salaryResultList = ltSalaryList.get(finalI); + String salaryResultSum = salaryResultList.stream().filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + updateSqlSb.append(insertFields.get(i*5)).append("=").append(ysSum).append(",") + .append(insertFields.get(i*5+1)).append("=").append(hySum).append(",") + .append(insertFields.get(i*5+2)).append("=").append(salaryResultSum).append(",") + .append(insertFields.get(i*5+3)).append("=").append(ltYsList.size()).append(",") + .append(insertFields.get(i*5+4)).append("=").append(salaryResultList.size()).append(","); + } + updateSqlSb.deleteCharAt(updateSqlSb.lastIndexOf(",")); + updateSqlSb.append(" where id =").append(id); + rs.execute(updateSqlSb.toString()); + if (modeId != null && NumberUtils.isCreatable(modeId)) { + ModeRightInfo ModeRightInfo = new ModeRightInfo(); + ModeRightInfo.setNewRight(true); + ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), Integer.valueOf(id)); + } + } else { + String currDate = String.format("'%s'", TimeUtil.getCurrentDateString()); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = String.format("'%s'", sdf.format(new Date())); + + // 新增 + StringBuilder insertSqlSb = new StringBuilder("insert into uf_jtqxrlcbfx (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,fb,ysnf,"+StringUtils.join(insertFields, ",")+")VALUES(") + .append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",").append(subcompanyId).append(",").append(year).append(","); + for (int i =0; i < 12; i++) { + int finalI = i; + String ysSum = ltYsList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"), BigDecimal::add).toString(); + if (i >= 3) { + ysSum = new BigDecimal(ysSum).add(fdSum[0]).toString(); + } + String hySum = ltHyysList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + List salaryResultList = ltSalaryList.get(finalI); + String salaryResultSum = salaryResultList.stream().filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + insertSqlSb.append(ysSum).append(",").append(hySum).append(",").append(salaryResultSum).append(",").append(ltYsList.size()).append(",").append(salaryResultList.size()).append(","); + } + insertSqlSb.append(")"); + insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(",")); + rs.execute(insertSqlSb.toString()); + + // 权限重构 + // 获取最大值 作为权限重构的起始id + rs.execute("select max(id) from uf_jtqxrlcbfx"); + int maxId = 0; + if (rs.next()) { + maxId = rs.getInt(1); + } + if (modeId != null && NumberUtils.isCreatable(modeId)) { + ModeRightInfo ModeRightInfo = new ModeRightInfo(); + ModeRightInfo.setNewRight(true); + ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId); + } + } + } + + return ""; + } + + /** + * 获取旗下人力成本分析对应薪酬数据 + */ + private List getSalaryData4Qxrlcbfx(YearMonth yearMonth, List subcompanyIds) { + BaseBean baseBean = new BaseBean(); + List salarySobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sob_ids").split(",")) + .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + // 获取核算记录 + LocalDateRange dateRange = LocalDateRange.builder().fromDate(SalaryDateUtil.toDate(yearMonth, 1)).endDate(SalaryDateUtil.toDate(yearMonth, 1)).build(); + List salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, dateRange); + List salaryAcctRecordIds = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); + // 获取薪资核算人员 + List salaryAcctEmployeeList = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) { + salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds); + } + salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList()); + List salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); + // 获取薪资核算结果 + List needSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sum_salary_item_ids").split(",")) + .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + List acctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, needSumSalaryItemIds); + Map> acctResultMap = SalaryEntityUtil.group2Map(acctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId); + + + // 查询员工薪资档案 + List employeeIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList()); + List salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build()); + Map archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId()); + List salaryArchiveIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList()); + // 查询档案中对应的绩效值 + Long jdItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_jdjxgzbz_item_id")); + Long bndItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_bndjxgzbz_item_id")); + Long nzjItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_nzjbz_item_id")); + List archiveItemIds = Arrays.asList(jdItemId, bndItemId, nzjItemId); + Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(SalaryDateUtil.toDate(yearMonth, 1)); + List salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, archiveItemIds, lastDayOfMonth); + Map> archiveItemGroupByArchiveId = SalaryEntityUtil.group2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId()); + + // 如果是12月还要获取年终奖账套数据 + Map> nzAcctResultMap = new HashMap<>(); + if (yearMonth.getMonthValue() == 12) { + List nzjSobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_nz_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + // 获取今年6月-明年6月之前的年终奖账套只获取一个 + // 获取核算记录 + LocalDateRange yearDateRange = LocalDateRange.builder().fromDate(SalaryDateUtil.toDate(yearMonth.minusMonths(6), 1)).endDate(SalaryDateUtil.toDate(yearMonth.plusMonths(6), 1)).build(); + List nzSalaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(nzjSobIds, yearDateRange); + List nzSalaryAcctRecordIds = nzSalaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(nzSalaryAcctRecordIds)) { + Long nzSalaryAcctRecordId = nzSalaryAcctRecordIds.get(0); + // 获取薪资核算人员 + List nzSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(Collections.singletonList(nzSalaryAcctRecordId)); + nzSalaryAcctEmployeeList = nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList()); + List nzSalaryAcctEmpIds = nzSalaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); + // 获取薪资核算结果 + List nzNeedSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_nz_sum_salary_item_ids").split(",")) + .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + List nzScctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(nzSalaryAcctEmpIds, nzNeedSumSalaryItemIds); + + salaryAcctEmployeeList.addAll(nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> !salaryAcctEmpIds.contains(salaryAcctEmp.getId())).collect(Collectors.toList())); + nzAcctResultMap = SalaryEntityUtil.group2Map(nzScctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId); + } + + + } + List resultList = new ArrayList<>(); + for (SalaryAcctEmployeePO salaryAcctEmp : salaryAcctEmployeeList) { + BigDecimal sumVal = new BigDecimal("0"); + List acctResult = acctResultMap.get(salaryAcctEmp.getId()); + if (CollectionUtils.isNotEmpty(acctResult)) { + sumVal = sumVal.add(acctResult.stream().map(SalaryAcctResultPO::getResultValue) + .filter(NumberUtils::isCreatable) + .map(BigDecimal::new) + .reduce(new BigDecimal("0"), BigDecimal::add)); + } + + List nzAcctResult = nzAcctResultMap.get(salaryAcctEmp.getId()); + if (CollectionUtils.isNotEmpty(nzAcctResult)) { + sumVal = sumVal.add(nzAcctResult.stream().map(SalaryAcctResultPO::getResultValue) + .filter(NumberUtils::isCreatable) + .map(BigDecimal::new) + .reduce(new BigDecimal("0"), BigDecimal::add)); + } + Long archiveId = archiveIdMap.get(salaryAcctEmp.getTaxAgentId() + "_" + salaryAcctEmp.getEmployeeId()); + List salaryArchiveItemPOList = archiveItemGroupByArchiveId.get(archiveId); + if (CollectionUtils.isNotEmpty(salaryArchiveItemPOList)) { + Map archiveValueMap = SalaryEntityUtil.convert2Map(salaryArchiveItemPOList, SalaryArchiveItemPO::getSalaryItemId, SalaryArchiveItemPO::getItemValue); + if (yearMonth.getMonthValue() >=1 && yearMonth.getMonthValue() <= 6) { + // 季度基础/3 + 半年度基数/6 + sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP) + .add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId)).divide(new BigDecimal("6"), 2, RoundingMode.HALF_UP))); + } else if (yearMonth.getMonthValue() <= 9) { + // 季度基础/3 + sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP)); + } else if (yearMonth.getMonthValue() <= 11) { + + } else { + // 季度基础/3 + 半年度基数/6 + + sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP) + .add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId)).divide(new BigDecimal("6"), 2, RoundingMode.HALF_UP))); + } + } + resultList.add(sumVal.toPlainString()); + } + return resultList; + } + private Map> getSalaryData4QxrlcbfxGroupByDept(YearMonth yearMonth, List subcompanyIds) { + BaseBean baseBean = new BaseBean(); + List salarySobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sob_ids").split(",")) + .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + // 获取核算记录 + LocalDateRange dateRange = LocalDateRange.builder().fromDate(SalaryDateUtil.toDate(yearMonth, 1)).endDate(SalaryDateUtil.toDate(yearMonth, 1)).build(); + List salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, dateRange); + List salaryAcctRecordIds = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); + // 获取薪资核算人员 + List salaryAcctEmployeeList = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) { + salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds); + } + salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList()); + List salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); + // 获取薪资核算结果 + List needSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sum_salary_item_ids").split(",")) + .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + List acctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, needSumSalaryItemIds); + Map> acctResultMap = SalaryEntityUtil.group2Map(acctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId); + + + // 查询员工薪资档案 + List employeeIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList()); + List salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build()); + Map archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId()); + List salaryArchiveIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList()); + // 查询档案中对应的绩效值 + Long jdItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_jdjxgzbz_item_id")); + Long bndItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_bndjxgzbz_item_id")); + Long nzjItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_nzjbz_item_id")); + List archiveItemIds = Arrays.asList(jdItemId, bndItemId, nzjItemId); + Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(SalaryDateUtil.toDate(yearMonth, 1)); + List salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, archiveItemIds, lastDayOfMonth); + Map> archiveItemGroupByArchiveId = SalaryEntityUtil.group2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId()); + + // 如果是12月还要获取年终奖账套数据 + Map> nzAcctResultMap = new HashMap<>(); + if (yearMonth.getMonthValue() == 12) { + List nzjSobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_nz_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + // 获取今年6月-明年6月之前的年终奖账套只获取一个 + // 获取核算记录 + LocalDateRange yearDateRange = LocalDateRange.builder().fromDate(SalaryDateUtil.toDate(yearMonth.minusMonths(6), 1)).endDate(SalaryDateUtil.toDate(yearMonth.plusMonths(6), 1)).build(); + List nzSalaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(nzjSobIds, yearDateRange); + List nzSalaryAcctRecordIds = nzSalaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(nzSalaryAcctRecordIds)) { + Long nzSalaryAcctRecordId = nzSalaryAcctRecordIds.get(0); + // 获取薪资核算人员 + List nzSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(Collections.singletonList(nzSalaryAcctRecordId)); + nzSalaryAcctEmployeeList = nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList()); + List nzSalaryAcctEmpIds = nzSalaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); + // 获取薪资核算结果 + List nzNeedSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_nz_sum_salary_item_ids").split(",")) + .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + List nzScctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(nzSalaryAcctEmpIds, nzNeedSumSalaryItemIds); + + salaryAcctEmployeeList.addAll(nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> !salaryAcctEmpIds.contains(salaryAcctEmp.getId())).collect(Collectors.toList())); + nzAcctResultMap = SalaryEntityUtil.group2Map(nzScctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId); + } + + + } + // List resultList = new ArrayList<>(); + Map> resultMap = new HashMap<>(); + for (SalaryAcctEmployeePO salaryAcctEmp : salaryAcctEmployeeList) { + BigDecimal sumVal = new BigDecimal("0"); + List acctResult = acctResultMap.get(salaryAcctEmp.getId()); + if (CollectionUtils.isNotEmpty(acctResult)) { + sumVal = sumVal.add(acctResult.stream().map(SalaryAcctResultPO::getResultValue) + .filter(NumberUtils::isCreatable) + .map(BigDecimal::new) + .reduce(new BigDecimal("0"), BigDecimal::add)); + } + + List nzAcctResult = nzAcctResultMap.get(salaryAcctEmp.getId()); + if (CollectionUtils.isNotEmpty(nzAcctResult)) { + sumVal = sumVal.add(nzAcctResult.stream().map(SalaryAcctResultPO::getResultValue) + .filter(NumberUtils::isCreatable) + .map(BigDecimal::new) + .reduce(new BigDecimal("0"), BigDecimal::add)); + } + Long archiveId = archiveIdMap.get(salaryAcctEmp.getTaxAgentId() + "_" + salaryAcctEmp.getEmployeeId()); + List salaryArchiveItemPOList = archiveItemGroupByArchiveId.get(archiveId); + if (CollectionUtils.isNotEmpty(salaryArchiveItemPOList)) { + Map archiveValueMap = SalaryEntityUtil.convert2Map(salaryArchiveItemPOList, SalaryArchiveItemPO::getSalaryItemId, SalaryArchiveItemPO::getItemValue); + if (yearMonth.getMonthValue() >=1 && yearMonth.getMonthValue() <= 6) { + // 季度基础/3 + 半年度基数/6 + sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP) + .add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId)).divide(new BigDecimal("6"), 2, RoundingMode.HALF_UP))); + } else if (yearMonth.getMonthValue() <= 9) { + // 季度基础/3 + sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP)); + } else if (yearMonth.getMonthValue() <= 11) { + + } else { + // 季度基础/3 + 半年度基数/6 + + sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP) + .add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId)).divide(new BigDecimal("6"), 2, RoundingMode.HALF_UP))); + } + } + List resultList = resultMap.computeIfAbsent(salaryAcctEmp.getDepartmentId(), k -> new ArrayList<>()); + resultList.add(sumVal.toPlainString()); + } + return resultMap; + } + private Map> getSalaryData4QxrlcbfxGroupByFylx(YearMonth yearMonth, List subcompanyIds, Map fylxMap) { + BaseBean baseBean = new BaseBean(); + List salarySobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sob_ids").split(",")) + .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + // 获取核算记录 + LocalDateRange dateRange = LocalDateRange.builder().fromDate(SalaryDateUtil.toDate(yearMonth, 1)).endDate(SalaryDateUtil.toDate(yearMonth, 1)).build(); + List salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, dateRange); + List salaryAcctRecordIds = salaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); + // 获取薪资核算人员 + List salaryAcctEmployeeList = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(salaryAcctRecordIds)) { + salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds); + } + salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList()); + List salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); + // 获取薪资核算结果 + List needSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_sum_salary_item_ids").split(",")) + .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + List acctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, needSumSalaryItemIds); + Map> acctResultMap = SalaryEntityUtil.group2Map(acctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId); + + // 获取直接人员名单 + List zjEmpCodes = new ArrayList<>(); + List zjEmpIds = new ArrayList<>(); + 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='"+SalaryDateUtil.getFormatYearMonth(yearMonth)+"'"); + while (extRs.next()){ + zjEmpCodes.add(extRs.getString("user_code")); + } + if (CollectionUtils.isNotEmpty(zjEmpCodes)) { + zjEmpIds = getSalaryEmployeeService(user).listByWorkCodes(zjEmpCodes).stream().map(DataCollectionEmployee::getEmployeeId).collect(Collectors.toList()); + } + + // 查询员工薪资档案 + List employeeIdList = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList()); + List salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build()); + Map archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId()); + List salaryArchiveIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList()); + // 查询档案中对应的绩效值 + Long jdItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_jdjxgzbz_item_id")); + Long bndItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_bndjxgzbz_item_id")); + Long nzjItemId = SalaryEntityUtil.string2LongDefault0(baseBean.getPropValue("ltSalaryReport", "rymxgzjtb_nzjbz_item_id")); + List archiveItemIds = Arrays.asList(jdItemId, bndItemId, nzjItemId); + Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(SalaryDateUtil.toDate(yearMonth, 1)); + List salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, archiveItemIds, lastDayOfMonth); + Map> archiveItemGroupByArchiveId = SalaryEntityUtil.group2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId()); + + + // 如果是12月还要获取年终奖账套数据 + Map> nzAcctResultMap = new HashMap<>(); + if (yearMonth.getMonthValue() == 12) { + List nzjSobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "rymxgzsfb_nz_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + // 获取今年6月-明年6月之前的年终奖账套只获取一个 + // 获取核算记录 + LocalDateRange yearDateRange = LocalDateRange.builder().fromDate(SalaryDateUtil.toDate(yearMonth.minusMonths(6), 1)).endDate(SalaryDateUtil.toDate(yearMonth.plusMonths(6), 1)).build(); + List nzSalaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(nzjSobIds, yearDateRange); + List nzSalaryAcctRecordIds = nzSalaryAcctRecordList.stream().filter(salaryAcctRecordPO -> salaryAcctRecordPO.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(nzSalaryAcctRecordIds)) { + Long nzSalaryAcctRecordId = nzSalaryAcctRecordIds.get(0); + // 获取薪资核算人员 + List nzSalaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(Collections.singletonList(nzSalaryAcctRecordId)); + nzSalaryAcctEmployeeList = nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> subcompanyIds.contains(salaryAcctEmp.getSubcompanyId())).collect(Collectors.toList()); + List nzSalaryAcctEmpIds = nzSalaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList()); + // 获取薪资核算结果 + List nzNeedSumSalaryItemIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_nz_sum_salary_item_ids").split(",")) + .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + List nzScctResultPOList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(nzSalaryAcctEmpIds, nzNeedSumSalaryItemIds); + + salaryAcctEmployeeList.addAll(nzSalaryAcctEmployeeList.stream().filter(salaryAcctEmp -> !salaryAcctEmpIds.contains(salaryAcctEmp.getId())).collect(Collectors.toList())); + nzAcctResultMap = SalaryEntityUtil.group2Map(nzScctResultPOList, SalaryAcctResultPO::getSalaryAcctEmpId); + } + + + } + // List resultList = new ArrayList<>(); + Map> resultMap = new HashMap<>(); + for (SalaryAcctEmployeePO salaryAcctEmp : salaryAcctEmployeeList) { + BigDecimal sumVal = new BigDecimal("0"); + List acctResult = acctResultMap.get(salaryAcctEmp.getId()); + if (CollectionUtils.isNotEmpty(acctResult)) { + sumVal = sumVal.add(acctResult.stream().map(SalaryAcctResultPO::getResultValue) + .filter(NumberUtils::isCreatable) + .map(BigDecimal::new) + .reduce(new BigDecimal("0"), BigDecimal::add)); + } + + List nzAcctResult = nzAcctResultMap.get(salaryAcctEmp.getId()); + if (CollectionUtils.isNotEmpty(nzAcctResult)) { + sumVal = sumVal.add(nzAcctResult.stream().map(SalaryAcctResultPO::getResultValue) + .filter(NumberUtils::isCreatable) + .map(BigDecimal::new) + .reduce(new BigDecimal("0"), BigDecimal::add)); + } + Long archiveId = archiveIdMap.get(salaryAcctEmp.getTaxAgentId() + "_" + salaryAcctEmp.getEmployeeId()); + List salaryArchiveItemPOList = archiveItemGroupByArchiveId.get(archiveId); + if (CollectionUtils.isNotEmpty(salaryArchiveItemPOList)) { + Map archiveValueMap = SalaryEntityUtil.convert2Map(salaryArchiveItemPOList, SalaryArchiveItemPO::getSalaryItemId, SalaryArchiveItemPO::getItemValue); + if (yearMonth.getMonthValue() >=1 && yearMonth.getMonthValue() <= 6) { + // 季度基础/3 + 半年度基数/6 + sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP) + .add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId)).divide(new BigDecimal("6"), 2, RoundingMode.HALF_UP))); + } else if (yearMonth.getMonthValue() <= 9) { + // 季度基础/3 + sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP)); + } else if (yearMonth.getMonthValue() <= 11) { + + } else { + // 季度基础/3 + 半年度基数/6 + + sumVal = sumVal.add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(jdItemId)).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP) + .add(SalaryEntityUtil.string2BigDecimalDefault0(archiveValueMap.get(bndItemId)).divide(new BigDecimal("6"), 2, RoundingMode.HALF_UP))); + } + } + // 根据费用类型-部门-员工类型汇总 + String yglx = zjEmpIds.contains(salaryAcctEmp.getEmployeeId()) ? "0" : "1"; + String fylx = Utils.null2String(fylxMap.get(salaryAcctEmp.getDepartmentId())); + List resultList = resultMap.computeIfAbsent(fylx + "_split" + salaryAcctEmp.getDepartmentId() + "_split" + yglx, k -> new ArrayList<>()); + resultList.add(sumVal.toPlainString()); + } + return resultMap; + } + + /** + * 联特人事口径 - 生成旗下人力成本分析 获取部门还原预算数据 + */ + private List> getLtBmhyysList(int year, List subcompanyIds) { + RecordSet rs = new RecordSet(); + BaseBean baseBean = new BaseBean(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(subcompanyIds)) { + return resultList; + } + // 获取分部下有哪些部门 + List departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds); + List ysMonthFields = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_bmhyys_fields").split(",")).collect(Collectors.toList()); + String sql ="select "+StringUtils.join(ysMonthFields,",")+" from uf_bmhyys where nf=? and bm in (?)"; + rs.executeQuery(sql, Arrays.asList(year,StringUtils.join(departmentIds, ","))); + while (rs.next()) { + List singleList = new ArrayList<>(); + for (String field : ysMonthFields) { + singleList.add(rs.getString(field)); + } + resultList.add(singleList); + } + return resultList; + } + private Map>> getLtBmhyysListGroupByDept(int year, List subcompanyIds) { + RecordSet rs = new RecordSet(); + BaseBean baseBean = new BaseBean(); + Map>> resultMap = new HashMap<>(); + if (CollectionUtils.isEmpty(subcompanyIds)) { + return resultMap; + } + // 获取分部下有哪些部门 + List departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds); + List ysMonthFields = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_bmhyys_fields").split(",")).collect(Collectors.toList()); + String sql ="select bm,"+StringUtils.join(ysMonthFields,",")+" from uf_bmhyys where nf=? and bm in (?)"; + rs.executeQuery(sql, Arrays.asList(year,StringUtils.join(departmentIds, ","))); + while (rs.next()) { + List singleList = new ArrayList<>(); + List> singleMonthList = resultMap.computeIfAbsent(Long.valueOf(rs.getInt("bm")), k -> new ArrayList<>()); + for (String field : ysMonthFields) { + singleList.add(rs.getString(field)); + } + singleMonthList.add(singleList); + } + return resultMap; + } + private Map>> getLtBmhyysListGroupByFylx(int year, List subcompanyIds) { + RecordSet rs = new RecordSet(); + BaseBean baseBean = new BaseBean(); + Map>> resultMap = new HashMap<>(); + if (CollectionUtils.isEmpty(subcompanyIds)) { + return resultMap; + } + // 获取分部下有哪些部门 + List departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds); + List ysMonthFields = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_bmhyys_fields").split(",")).collect(Collectors.toList()); + String sql ="select u.fylx,a.bm,a.yglx,"+StringUtils.join(ysMonthFields,",")+" from uf_bmhyys a left join uf_bmfylx u on a.bm=u.bm where a.nf=? and a.bm in (?)"; + rs.executeQuery(sql, Arrays.asList(year,StringUtils.join(departmentIds, ","))); + // 根据费用类型-部门-员工类型汇总 + while (rs.next()) { + List singleList = new ArrayList<>(); + List> singleGroupList = resultMap.computeIfAbsent(rs.getString("fylx") + "_split" + rs.getInt("bm") + "_split" + rs.getString("yglx"), k -> new ArrayList<>()); + for (String field : ysMonthFields) { + singleList.add(rs.getString(field)); + } + singleGroupList.add(singleList); + } + return resultMap; + } + + /** + * 联特人事口径 - 生成旗下人力成本分析 获取预算数据 + */ + private List> getLtYsList(int year, List subcompanyIds, BigDecimal[] fdbSum ) { + RecordSet rs = new RecordSet(); + BaseBean baseBean = new BaseBean(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(subcompanyIds)) { + return resultList; + } + List ysMonthFields = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_ys_fields").split(",")).collect(Collectors.toList()); + String filedKeyStr = baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_ys_fields").replace(",", ",b."); + String sql ="SELECT b."+ filedKeyStr +" FROM uf_xcys a left join uf_xcys_dt1 b on a.id=b.mainid where a.ysnf =? and b.szfb in(?)"; + rs.executeQuery(sql, Arrays.asList(year, StringUtils.join(subcompanyIds, ","))); + while (rs.next()) { + List singleList = new ArrayList<>(); + for (String field : ysMonthFields) { + singleList.add(rs.getString(field)); + } + resultList.add(singleList); + } + + // 获取分部下有哪些部门 + List departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds); + rs.executeQuery("select fdxcb from uf_xcys where ysnf=? and ysbm in(?)", Arrays.asList(year, StringUtils.join(departmentIds, ","))); + BigDecimal fdb = new BigDecimal("0"); + while (rs.next()) { + String fdxcb = rs.getString("fdxcb"); + if (NumberUtils.isCreatable(fdxcb)) { + fdb = fdb.add(new BigDecimal(fdxcb)); + } + } + fdbSum[0] = fdb.divide(new BigDecimal("8"), 2, RoundingMode.HALF_UP); + + return resultList; + } + private Map>> getLtYsListGroupByDept(int year, List subcompanyIds, BigDecimal[] fdbSum ) { + RecordSet rs = new RecordSet(); + BaseBean baseBean = new BaseBean(); + Map>> resultMap = new HashMap<>(); + if (CollectionUtils.isEmpty(subcompanyIds)) { + return resultMap; + } + List ysMonthFields = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_ys_fields").split(",")).collect(Collectors.toList()); + String filedKeyStr = baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_ys_fields").replace(",", ",b."); + String sql ="SELECT b.bm,b."+ filedKeyStr +" FROM uf_xcys a left join uf_xcys_dt1 b on a.id=b.mainid where a.ysnf =? and b.szfb in(?)"; + rs.executeQuery(sql, Arrays.asList(year, StringUtils.join(subcompanyIds, ","))); + while (rs.next()) { + List singleList = new ArrayList<>(); + List> singleMonthList = resultMap.computeIfAbsent(Long.valueOf(rs.getInt("bm")), k -> new ArrayList<>()); + for (String field : ysMonthFields) { + singleList.add(rs.getString(field)); + } + singleMonthList.add(singleList); + } + + // 获取分部下有哪些部门 + List departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds); + rs.executeQuery("select fdxcb from uf_xcys where ysnf=? and ysbm in(?)", Arrays.asList(year, StringUtils.join(departmentIds, ","))); + BigDecimal fdb = new BigDecimal("0"); + while (rs.next()) { + String fdxcb = rs.getString("fdxcb"); + if (NumberUtils.isCreatable(fdxcb)) { + fdb = fdb.add(new BigDecimal(fdxcb)); + } + } + fdbSum[0] = fdb.divide(new BigDecimal("8"), 2, RoundingMode.HALF_UP); + + return resultMap; + } + private Map>> getLtYsListGroupByFylx(int year, List subcompanyIds, BigDecimal[] fdbSum ) { + RecordSet rs = new RecordSet(); + BaseBean baseBean = new BaseBean(); + Map>> resultMap = new HashMap<>(); + if (CollectionUtils.isEmpty(subcompanyIds)) { + return resultMap; + } + List ysMonthFields = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_ys_fields").split(",")).collect(Collectors.toList()); + String filedKeyStr = baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_ys_fields").replace(",", ",b."); + String sql ="SELECT b.fylx,b.ygzx,b.bm,b."+ filedKeyStr +" FROM uf_xcys a left join uf_xcys_dt1 b on a.id=b.mainid where a.ysnf =? and b.szfb in(?)"; + rs.executeQuery(sql, Arrays.asList(year, StringUtils.join(subcompanyIds, ","))); + // 根据费用类型-部门-员工类型汇总 + while (rs.next()) { + List singleList = new ArrayList<>(); + List> singleGroupList = resultMap.computeIfAbsent(rs.getString("fylx") + "_split" + Long.valueOf(rs.getInt("bm") )+ "_split" + rs.getString("ygzx"), k -> new ArrayList<>()); + for (String field : ysMonthFields) { + singleList.add(rs.getString(field)); + } + singleGroupList.add(singleList); + } + + // 获取分部下有哪些部门 + List departmentIds = getSalaryEmployeeService(user).listDepartmentIdBySubcompanyIds(subcompanyIds); + rs.executeQuery("select fdxcb from uf_xcys where ysnf=? and ysbm in(?)", Arrays.asList(year, StringUtils.join(departmentIds, ","))); + BigDecimal fdb = new BigDecimal("0"); + while (rs.next()) { + String fdxcb = rs.getString("fdxcb"); + if (NumberUtils.isCreatable(fdxcb)) { + fdb = fdb.add(new BigDecimal(fdxcb)); + } + } + fdbSum[0] = fdb.divide(new BigDecimal("8"), 2, RoundingMode.HALF_UP); + + return resultMap; + } + + /** + * 联特人事口径 - 生成部门为单位人力成本分析 + * @param yearStr + * @return + */ + @Override + public String ltGenBmwdwrlcbfx(String yearStr) { + if (!NumberUtils.isCreatable(yearStr)) { + throw new SalaryRunTimeException("参数错误错误"); + } + Integer year = Integer.valueOf(yearStr); + // 获取需要生成哪个分部下的数据 + BaseBean baseBean = new BaseBean(); + List subcompanyIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_subcompany_ids").split(",")) + .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + for (Long subcompanyId : subcompanyIds) { + // 获取对应的预算数据 + BigDecimal[] fdSum = {new BigDecimal("0")}; + Map>> ltYsMap = getLtYsListGroupByDept(year, Collections.singletonList(subcompanyId), fdSum); + // 获取对应的还原预算数据 + Map>> ltHyysMap = getLtBmhyysListGroupByDept(year, Collections.singletonList(subcompanyId)); + + // 获取旗下人力成本分析对应薪酬数据 + List>> ltSalaryList = new ArrayList<>(); + // 循环yearMonth当年1月到12月 + List yearMonths = IntStream.rangeClosed(1, 12) + .mapToObj(month -> YearMonth.of(year, month)) + .collect(Collectors.toList()); + for (YearMonth date : yearMonths) { + // 获取薪资核算数据 + Map> salaryDataMap = getSalaryData4QxrlcbfxGroupByDept(date, Collections.singletonList(subcompanyId)); + ltSalaryList.add(salaryDataMap); + } + + // 一共有多少部门 + List departmentIds = new ArrayList<>(); + departmentIds.addAll(ltYsMap.keySet()); + departmentIds.addAll(ltHyysMap.keySet()); + departmentIds.addAll(ltSalaryList.stream().map(m -> m.keySet()).flatMap(Collection::stream).collect(Collectors.toList())); + departmentIds = departmentIds.stream().distinct().collect(Collectors.toList()); + // 获取建模模块id + String modeId = baseBean.getPropValue("ltSalaryReport", "bmwdwrlcbfx_mode_id"); + // 获取建模中是否已有数据 + String sql = "select id,bm from uf_bmrlcbfx where ysnf=? and bm in ("+StringUtils.join(departmentIds, ",")+")"; + RecordSet rs = new RecordSet(); + rs.executeQuery(sql, Arrays.asList(year)); + Map existDataMap = new HashMap<>(); + while (rs.next()) { + existDataMap.put(Long.valueOf(rs.getInt("bm")), rs.getInt("id")); + } + List insertFields = Arrays.asList("yrlcbys1", "yhyys1", "ysjys1", "yycrs1", "ysjrs1", "yrlcbys2", "yhyys2", "ysjys2", "yycrs2", "ysjrs2", + "yrlcbys3", "yhyys3", "ysjys3", "yycrs3", "ysjrs3", "yrlcbys4", "yhyys4", "ysjys4", "yycrs4", "ysjrs4", "yrlcbys5", "yhyys5", "ysjys5", "yycrs5", "ysjrs5", "yrlcbys6", "yhyys6", "ysjys6", "yycrs6", "ysjrs6", + "yrlcbys7", "yhyys7", "ysjys7", "yycrs7", "ysjrs7", "yrlcbys8", "yhyys8", "ysjys8", "yycrs8", "ysjrs8", "yrlcbys9", "yhyys9", "ysjys9", "yycrs9", "ysjrs9", "yrlcbys10", "yhyys10", "ysjys10", "yycrs10", "ysjrs10", + "yrlcbys11", "yhyys11", "ysjys11", "yycrs11", "ysjrs11", "yrlcbys12", "yhyys12", "ysjys12", "yycrs12", "ysjrs12"); + + String currDate = String.format("'%s'", TimeUtil.getCurrentDateString()); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = String.format("'%s'", sdf.format(new Date())); + for (Long departmentId : departmentIds) { + Integer mianId = existDataMap.get(departmentId); + if (mianId != null) { + // 更新 + StringBuilder updateSqlSb = new StringBuilder("update uf_bmrlcbfx set "); + for (int i =0; i < 12; i++) { + int finalI = i; + List> ltYsList = ltYsMap.get(departmentId) == null ? Collections.emptyList() : ltYsMap.get(departmentId); + String ysSum = ltYsList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + if (i >= 3) { + ysSum = new BigDecimal(ysSum).add(fdSum[0]).toString(); + } + List> ltHyysList = ltHyysMap.get(departmentId) == null ? Collections.emptyList() : ltHyysMap.get(departmentId); + String hySum = ltHyysList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + + Map> salaryResultListMap = ltSalaryList.get(finalI); + List salaryResultList = salaryResultListMap.get(departmentId) == null ? Collections.emptyList() : salaryResultListMap.get(departmentId); + String salaryResultSum = salaryResultList.stream().filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + updateSqlSb.append(insertFields.get(i*5)).append("=").append(ysSum).append(",") + .append(insertFields.get(i*5+1)).append("=").append(hySum).append(",") + .append(insertFields.get(i*5+2)).append("=").append(salaryResultSum).append(",") + .append(insertFields.get(i*5+3)).append("=").append(ltYsList.size()).append(",") + .append(insertFields.get(i*5+4)).append("=").append(salaryResultList.size()).append(","); + } + updateSqlSb.deleteCharAt(updateSqlSb.lastIndexOf(",")); + updateSqlSb.append(" where id =").append(mianId); + rs.execute(updateSqlSb.toString()); + if (modeId != null && NumberUtils.isCreatable(modeId)) { + ModeRightInfo ModeRightInfo = new ModeRightInfo(); + ModeRightInfo.setNewRight(true); + ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), Integer.valueOf(mianId)); + } + } else{ + // 插入 + StringBuilder insertSqlSb = new StringBuilder("insert into uf_bmrlcbfx (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,bm,ysnf,"+StringUtils.join(insertFields, ",")+")VALUES(") + .append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",").append(departmentId).append(",").append(year).append(","); + for (int i =0; i < 12; i++) { + int finalI = i; + List> ltYsList = ltYsMap.get(departmentId) == null ? Collections.emptyList() : ltYsMap.get(departmentId); + String ysSum = ltYsList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + if (i >= 3) { + ysSum = new BigDecimal(ysSum).add(fdSum[0]).toString(); + } + List> ltHyysList = ltHyysMap.get(departmentId) == null ? Collections.emptyList() : ltHyysMap.get(departmentId); + String hySum = ltHyysList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + Map> salaryResultListMap = ltSalaryList.get(finalI); + List salaryResultList = salaryResultListMap.get(departmentId) == null ? Collections.emptyList() : salaryResultListMap.get(departmentId); + String salaryResultSum = salaryResultList.stream().filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + + insertSqlSb.append(ysSum).append(",").append(hySum).append(",").append(salaryResultSum).append(",").append(ltYsList.size()).append(",").append(salaryResultList.size()).append(","); + } + insertSqlSb.append(")"); + insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(",")); + rs.execute(insertSqlSb.toString()); + // 权限重构 + // 获取最大值 作为权限重构的起始id + rs.execute("select max(id) from uf_bmrlcbfx"); + int maxId = 0; + if (rs.next()) { + maxId = rs.getInt(1); + } + if (modeId != null && NumberUtils.isCreatable(modeId)) { + ModeRightInfo ModeRightInfo = new ModeRightInfo(); + ModeRightInfo.setNewRight(true); + ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId); + } + + } + } + } + + return ""; + } + + /** + * 联特人事口径 - 生成费用类型人力成本分析 + * @param yearStr + * @return + */ + @Override + public String ltGenFylxlcbfx(String yearStr) { + if (!NumberUtils.isCreatable(yearStr)) { + throw new SalaryRunTimeException("参数错误错误"); + } + Integer year = Integer.valueOf(yearStr); + // 获取需要生成哪个分部下的数据 + BaseBean baseBean = new BaseBean(); + List subcompanyIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "qxrlcbfx_subcompany_ids").split(",")) + .filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + for (Long subcompanyId : subcompanyIds) { + // 获取对应的预算数据 + BigDecimal[] fdSum = {new BigDecimal("0")}; + Map>> ltYsMap = getLtYsListGroupByFylx(year, Collections.singletonList(subcompanyId), fdSum); + // 获取对应的还原预算数据 + Map>> ltHyysMap = getLtBmhyysListGroupByFylx(year, Collections.singletonList(subcompanyId)); + + // 获取旗下人力成本分析对应薪酬数据 + List>> ltSalaryList = new ArrayList<>(); + // 循环yearMonth当年1月到12月 + List yearMonths = IntStream.rangeClosed(1, 12) + .mapToObj(month -> YearMonth.of(year, month)) + .collect(Collectors.toList()); + // 获取部门和费用类型的关系 + Map fylxMap = new HashMap<>(); + RecordSet rs = new RecordSet(); + rs.execute("select bm,fylx from uf_bmfylx"); + while (rs.next()) { + fylxMap.put(Long.valueOf(rs.getInt("bm")), rs.getString("fylx")); + } + + for (YearMonth date : yearMonths) { + // 获取薪资核算数据 + Map> salaryDataMap = getSalaryData4QxrlcbfxGroupByFylx(date, Collections.singletonList(subcompanyId), fylxMap); + ltSalaryList.add(salaryDataMap); + } + + // 一共有哪些key + List keyList = new ArrayList<>(); + keyList.addAll(ltYsMap.keySet()); + keyList.addAll(ltHyysMap.keySet()); + keyList.addAll(ltSalaryList.stream().map(m -> m.keySet()).flatMap(Collection::stream).collect(Collectors.toList())); + keyList = keyList.stream().distinct().collect(Collectors.toList()); + // 获取建模模块id + String modeId = baseBean.getPropValue("ltSalaryReport", "fylxrlcbfx_mode_id"); + // 获取建模中是否已有数据 + String sql = "select yglx,fylx,id,bm from uf_fylxrlcbfx where ysnf=?"; + rs.executeQuery(sql, Arrays.asList(year)); + Map existDataMap = new HashMap<>(); + while (rs.next()) { + existDataMap.put(rs.getString("fylx") + "_split" + rs.getString("bm")+ "_split" + rs.getString("yglx"), rs.getInt("id")); + } + List insertFields = Arrays.asList("yrlcbys1", "yhyys1", "ysjys1", "yycrs1", "ysjrs1", "yrlcbys2", "yhyys2", "ysjys2", "yycrs2", "ysjrs2", + "yrlcbys3", "yhyys3", "ysjys3", "yycrs3", "ysjrs3", "yrlcbys4", "yhyys4", "ysjys4", "yycrs4", "ysjrs4", "yrlcbys5", "yhyys5", "ysjys5", "yycrs5", "ysjrs5", "yrlcbys6", "yhyys6", "ysjys6", "yycrs6", "ysjrs6", + "yrlcbys7", "yhyys7", "ysjys7", "yycrs7", "ysjrs7", "yrlcbys8", "yhyys8", "ysjys8", "yycrs8", "ysjrs8", "yrlcbys9", "yhyys9", "ysjys9", "yycrs9", "ysjrs9", "yrlcbys10", "yhyys10", "ysjys10", "yycrs10", "ysjrs10", + "yrlcbys11", "yhyys11", "ysjys11", "yycrs11", "ysjrs11", "yrlcbys12", "yhyys12", "ysjys12", "yycrs12", "ysjrs12"); + + String currDate = String.format("'%s'", TimeUtil.getCurrentDateString()); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = String.format("'%s'", sdf.format(new Date())); + for (String key : keyList) { + Integer mianId = existDataMap.get(key); + String[] split = key.split("_split"); + String fylx = split != null && split.length > 0 ? split[0] : ""; + Long departmentId = split != null && split.length > 1 ? SalaryEntityUtil.string2LongDefault0(split[1]) : 0L; + int yglx = split != null && split.length > 2 ? SalaryEntityUtil.string2LongDefault0(split[2]).intValue() : -1; + if (mianId != null) { + // 更新 + StringBuilder updateSqlSb = new StringBuilder("update uf_fylxrlcbfx set "); + for (int i =0; i < 12; i++) { + int finalI = i; + List> ltYsList = ltYsMap.get(key) == null ? Collections.emptyList() : ltYsMap.get(key); + String ysSum = ltYsList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + if (i >= 3) { + ysSum = new BigDecimal(ysSum).add(fdSum[0]).toString(); + } + List> ltHyysList = ltHyysMap.get(key) == null ? Collections.emptyList() : ltHyysMap.get(key); + String hySum = ltHyysList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + + Map> salaryResultListMap = ltSalaryList.get(finalI); + List salaryResultList = salaryResultListMap.get(key) == null ? Collections.emptyList() : salaryResultListMap.get(key); + String salaryResultSum = salaryResultList.stream().filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + updateSqlSb.append(insertFields.get(i*5)).append("=").append(ysSum).append(",") + .append(insertFields.get(i*5+1)).append("=").append(hySum).append(",") + .append(insertFields.get(i*5+2)).append("=").append(salaryResultSum).append(",") + .append(insertFields.get(i*5+3)).append("=").append(ltYsList.size()).append(",") + .append(insertFields.get(i*5+4)).append("=").append(salaryResultList.size()).append(","); + } + updateSqlSb.deleteCharAt(updateSqlSb.lastIndexOf(",")); + updateSqlSb.append(" where id =").append(mianId); + rs.execute(updateSqlSb.toString()); + if (modeId != null && NumberUtils.isCreatable(modeId)) { + ModeRightInfo ModeRightInfo = new ModeRightInfo(); + ModeRightInfo.setNewRight(true); + ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), Integer.valueOf(mianId)); + } + } else{ + // 插入 + StringBuilder insertSqlSb = new StringBuilder("insert into uf_fylxrlcbfx (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,fylx,yglx,bm,ysnf,"+StringUtils.join(insertFields, ",")+")VALUES(") + .append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(fylx).append("',").append(yglx).append(",").append(departmentId).append(",").append(year).append(","); + for (int i =0; i < 12; i++) { + int finalI = i; + List> ltYsList = ltYsMap.get(key) == null ? Collections.emptyList() : ltYsMap.get(key); + String ysSum = ltYsList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + if (i >= 3) { + ysSum = new BigDecimal(ysSum).add(fdSum[0]).toString(); + } + List> ltHyysList = ltHyysMap.get(key) == null ? Collections.emptyList() : ltHyysMap.get(key); + String hySum = ltHyysList.stream().map(list -> list.get(finalI)).filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + Map> salaryResultListMap = ltSalaryList.get(finalI); + List salaryResultList = salaryResultListMap.get(key) == null ? Collections.emptyList() : salaryResultListMap.get(key); + String salaryResultSum = salaryResultList.stream().filter(NumberUtils::isCreatable).map(BigDecimal::new).reduce(new BigDecimal("0"),BigDecimal::add).toString(); + + insertSqlSb.append(ysSum).append(",").append(hySum).append(",").append(salaryResultSum).append(",").append(ltYsList.size()).append(",").append(salaryResultList.size()).append(","); + } + insertSqlSb.append(")"); + insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(",")); + rs.execute(insertSqlSb.toString()); + // 权限重构 + // 获取最大值 作为权限重构的起始id + rs.execute("select max(id) from uf_fylxrlcbfx"); + int maxId = 0; + if (rs.next()) { + maxId = rs.getInt(1); + } + if (modeId != null && NumberUtils.isCreatable(modeId)) { + ModeRightInfo ModeRightInfo = new ModeRightInfo(); + ModeRightInfo.setNewRight(true); + ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId); + } + + } + } + } + + return ""; + } + + @Override + public Map ltNdhzReport() { + // 获取部门为单位的人力成本分析数据 + RecordSet rs = new RecordSet(); + rs.execute("select bm,ysnf,ysjys1,ysjys2,ysjys3,ysjys4,ysjys5,ysjys6,ysjys7,ysjys8,ysjys9,ysjys10,ysjys11,ysjys12 from uf_bmrlcbfx "); + List ltNdhzReportDTOS = new ArrayList<>(); + while (rs.next()) { + BigDecimal sumVal = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys1")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys2"))) + .add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys3"))).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys4"))) + .add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys5"))).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys6"))) + .add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys7"))).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys8"))) + .add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys9"))).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys10"))) + .add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys11"))).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ysjys12"))); + ltNdhzReportDTOS.add(LtNdhzReportDTO.builder().departmentId(Long.valueOf(rs.getInt("bm"))).year(rs.getInt("ysnf")).value(sumVal).build()); + } + + List yearList = ltNdhzReportDTOS.stream().map(dto -> dto.getYear()).filter(y -> y != null).distinct().sorted().collect(Collectors.toList()); + Map> group2Map = SalaryEntityUtil.group2Map(ltNdhzReportDTOS, LtNdhzReportDTO::getDepartmentId); + // 获取部门信息 + List departmentIds = ltNdhzReportDTOS.stream().map(dto -> dto.getDepartmentId()).distinct().sorted().collect(Collectors.toList()); + List deptInfoList = getSalaryEmployeeService(user).getDeptInfoList(departmentIds); + List> resultList = new ArrayList<>(); + Map sumValueMap = new HashMap<>(); + for (DeptInfo deptInfo: deptInfoList) { + List list = group2Map.get(deptInfo.getId()); + if (CollectionUtils.isNotEmpty(list)) { + Map singleDeptMap = new HashMap<>(); + for (Integer year : yearList) { + BigDecimal sumVal = list.stream().filter(dto -> dto.getYear().equals(year)) + .map(LtNdhzReportDTO::getValue) + .filter(val -> val != null) + .reduce(new BigDecimal("0"), BigDecimal::add); + singleDeptMap.put(year.toString(), sumVal.toPlainString()); + + BigDecimal yearSumVal = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(sumValueMap.get(year.toString()))); + sumValueMap.put(year.toString(), yearSumVal.add(sumVal)); + } + singleDeptMap.put("departmentName", deptInfo.getName()); + resultList.add(singleDeptMap); + } + } + + List columns = new ArrayList<>(); + columns.add(new Column("项目","departmentName","departmentName")); + for (Integer year : yearList) { + columns.add(new Column(year+"年",year.toString(),year.toString())); + } + Map resultMap = new HashMap<>(); + sumValueMap.put("departmentName", "总年度"); + resultList.add(0, sumValueMap); + resultMap.put("data", resultList); + resultMap.put("columns", columns); + return resultMap; + } + + /** + * 联特人事口径 - 看板 + * @param year + * @return + */ + @Override + public String ltGenKb(String year) { + if (!NumberUtils.isCreatable(year)){ + throw new SalaryRunTimeException("参数错误"); + } + BaseBean baseBean = new BaseBean(); + // 获取公司销售额数据 + RecordSet rs = new RecordSet(); + rs.execute("select gsxse from uf_gsxsedr where nf = " + year.substring(0, 4)); + BigDecimal gsxse = new BigDecimal("0"); + while (rs.next()) { + gsxse = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsxse")); + } + // 获取对应年份快照数据 + Date startDate = SalaryDateUtil.dateStrToLocalDate(year + "-12-01"); + Date endDate = SalaryDateUtil.dateStrToLocalDate(year + "-12-31"); + List snapshotTime = getHrmSnapshotMapper().getSnapshotTime(startDate, endDate); + BigDecimal empNums = new BigDecimal("0"); + if (CollectionUtils.isNotEmpty(snapshotTime)) { + Date date = snapshotTime.get(0); + // 需要统计哪些人事状态的 + List empStatusList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "kb_emp_status") + .split(",")).filter(NumberUtils::isCreatable) + .map(Integer::valueOf).collect(Collectors.toList()); + empNums = SalaryEntityUtil.string2BigDecimalDefault0(Utils.null2String(getHrmSnapshotMapper().countByStatusAndSnapshotTime(empStatusList, date))); + } + // 删除对应年份看板数据 + rs.execute("delete from uf_kb where nf =" + year); + // 获取建模模块id + String modeId = baseBean.getPropValue("ltSalaryReport", "kb_mode_id"); + // 插入数据 + String currDate = String.format("'%s'", TimeUtil.getCurrentDateString()); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = String.format("'%s'", sdf.format(new Date())); + + StringBuilder insertSql = new StringBuilder("insert into uf_kb (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,nf,rjcz,xse,zndrts) values (") + .append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'") + .append(year).append(",").append(gsxse.divide(empNums, 2, RoundingMode.HALF_UP).toPlainString()) + .append(",").append(gsxse).append(",").append(empNums.toString()).append(")"); + rs.execute(insertSql.toString()); + // 权限重构 + // 获取最大值 作为权限重构的起始id + rs.execute("select max(id) from uf_kb"); + int maxId = 0; + if (rs.next()) { + maxId = rs.getInt(1); + } + if (modeId != null && NumberUtils.isCreatable(modeId)) { + ModeRightInfo ModeRightInfo = new ModeRightInfo(); + ModeRightInfo.setNewRight(true); + ModeRightInfo.editModeDataShare(1, Integer.valueOf(modeId), maxId); + } + + return ""; + } } \ No newline at end of file diff --git a/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java b/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java index eb4adc1a0..783283d34 100644 --- a/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java @@ -714,4 +714,9 @@ public class SalaryEmployeeServiceImpl extends Service implements SalaryEmployee }); return SalaryI18nUtil.i18nList(empList); } + + @Override + public List listDepartmentIdBySubcompanyIds(List subcompanyIds) { + return getEmployMapper().listDepartmentIdBySubcompanyIds(subcompanyIds); + } } diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index e7359dd79..4675c6e54 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -1076,5 +1076,78 @@ public class SalaryAcctController { User user = HrmUserVarify.getUser(request, response); return new ResponseResult(user).run(getSalaryAcctResultWrapper(user)::ltGenRymxgzsf, salaryMonth); } + + /** + * 联特人事口径 - 生成旗下人力成本分析 + * @param request + * @param response + * @param salaryMonth + * @return + */ + @GET + @Path("/ltSalaryReport/genQxrlcbfx") + @Produces(MediaType.APPLICATION_JSON) + public String ltGenQxrlcbfx(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryMonth") String salaryMonth) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctResultWrapper(user)::ltGenQxrlcbfx, salaryMonth); + } + + /** + * 联特人事口径 - 生成部门为单位的人力成本分析 + * @param request + * @param response + * @param salaryMonth + * @return + */ + @GET + @Path("/ltSalaryReport/genBmwddrlcbfx") + @Produces(MediaType.APPLICATION_JSON) + public String ltGenBmwdwrlcbfx(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryMonth") String salaryMonth) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctResultWrapper(user)::ltGenBmwdwrlcbfx, salaryMonth); + } + + /** + * 联特人事口径 - 生成费用类型人力成本分析 + * @param request + * @param response + * @param salaryMonth + * @return + */ + @GET + @Path("/ltSalaryReport/genFylxlcbfx") + @Produces(MediaType.APPLICATION_JSON) + public String ltGenFylxlcbfx(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryMonth") String salaryMonth) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctResultWrapper(user)::ltGenFylxlcbfx, salaryMonth); + } + + /** + * 联特人事口径 - 年度汇总报表 + * @param request + * @param response + * @return + */ + @GET + @Path("/ltSalaryReport/ndhzReport") + @Produces(MediaType.APPLICATION_JSON) + public String ltNdhzReport(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::ltNdhzReport); + } + + /** + * 联特人事口径 - 看板 + * @param request + * @param response + * @return + */ + @GET + @Path("/ltSalaryReport/genKb") + @Produces(MediaType.APPLICATION_JSON) + public String ltGenKb(@Context HttpServletRequest request, @Context HttpServletResponse response,@QueryParam(value = "salaryMonth") String salaryMonth) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::ltGenKb, salaryMonth); + } /**********************************联特 报表end*********************************/ } diff --git a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java index c20331d84..79f2d84fe 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java @@ -418,4 +418,36 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult public String ltGenRymxgzsf(String salaryMonth) { return getSalaryAcctResultService(user).ltGenRymxgzsf(salaryMonth); } + + /** + * 联特人事口径 - 生成旗下人力成本分析 + * @param salaryMonth + */ + public String ltGenQxrlcbfx(String salaryMonth) { + return getSalaryAcctResultService(user).ltGenQxrlcbfx(salaryMonth); + } + + /** + * 联特人事口径 - 生成部门为单位人力成本分析 + * @param salaryMonth + */ + public String ltGenBmwdwrlcbfx(String salaryMonth) { + return getSalaryAcctResultService(user).ltGenBmwdwrlcbfx(salaryMonth); + } + + public String ltGenFylxlcbfx(String salaryMonth) { + return getSalaryAcctResultService(user).ltGenFylxlcbfx(salaryMonth); + } + + public Map ltNdhzReport() { + return getSalaryAcctResultService(user).ltNdhzReport(); + } + + /** + * 联特人事口径 - 看板 + * @param salaryMonth + */ + public String ltGenKb(String salaryMonth) { + return getSalaryAcctResultService(user).ltGenKb(salaryMonth); + } }