diff --git a/src/com/engine/salary/entity/datacollection/DataCollectionEmployee.java b/src/com/engine/salary/entity/datacollection/DataCollectionEmployee.java index 4843aca13..09c48b8eb 100644 --- a/src/com/engine/salary/entity/datacollection/DataCollectionEmployee.java +++ b/src/com/engine/salary/entity/datacollection/DataCollectionEmployee.java @@ -126,6 +126,7 @@ public class DataCollectionEmployee { private Integer accountType; private String ltCbzx; + private String ltRylb; //是否是系统管理员 private Boolean isAdmin; diff --git a/src/com/engine/salary/entity/hrm/po/HrmSnapshotPO.java b/src/com/engine/salary/entity/hrm/po/HrmSnapshotPO.java index 9fdffc5aa..e1e8123dc 100644 --- a/src/com/engine/salary/entity/hrm/po/HrmSnapshotPO.java +++ b/src/com/engine/salary/entity/hrm/po/HrmSnapshotPO.java @@ -436,6 +436,8 @@ public class HrmSnapshotPO { private String ltGwpc; private String ltXcbzsc; + private String ltRylb; + //主键id集合 private Collection ids; diff --git a/src/com/engine/salary/entity/salaryacct/dto/LtRymxgzDTO.java b/src/com/engine/salary/entity/salaryacct/dto/LtRymxgzDTO.java new file mode 100644 index 000000000..4f37a92df --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/dto/LtRymxgzDTO.java @@ -0,0 +1,42 @@ +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 LtRymxgzDTO + * @date 2025/09/04 18:03 + * @description 联特 人员明细工资 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LtRymxgzDTO { + + private String key; + // 项目号 + private String xmh; + + // 姓名 + private Long xm; + + // 工资 + private BigDecimal gz; + + // 绩效 + private BigDecimal jx; + + // 季度绩效 + private BigDecimal jdjx; + + // 年终奖 + private BigDecimal nzj; + + +} diff --git a/src/com/engine/salary/entity/salaryacct/po/LtYfgsPO.java b/src/com/engine/salary/entity/salaryacct/po/LtYfgsPO.java new file mode 100644 index 000000000..945257bd0 --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/po/LtYfgsPO.java @@ -0,0 +1,37 @@ +package com.engine.salary.entity.salaryacct.po; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Harryxzy + * @ClassName LtYfgsPO + * @date 2025/09/04 10:04 + * @description 研发工时 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LtYfgsPO { + + // 姓名 + private Long xm; + + // 项目号 + private String xmh; + + // 成本中心 + private String cbzx; + + // 项目所属事业部 + private String xmszsyb; + + // 所属分部 + private Long szfb; + + // 所属部门 + private Long szbm; +} diff --git a/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.java b/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.java index 2c5de43f1..99791536e 100644 --- a/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.java +++ b/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.java @@ -18,7 +18,7 @@ public interface HrmSnapshotMapper { List snapshot(@Param("employeeId")Long employeeId, @Param("snapshotTime")Date snapshotTime); - List getSnapshotTime(@Param("startTime")Date startTime, @Param("emdTime")Date emdTime); + List getSnapshotTime(@Param("startTime")Date startTime, @Param("endTime")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 da40b56b6..f2fef4c94 100644 --- a/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.xml +++ b/src/com/engine/salary/mapper/hrm/HrmSnapshotMapper.xml @@ -71,6 +71,10 @@ + + + + @@ -146,6 +150,11 @@ , t.workstartdate , t.workyear , t.lt_cbzx + , t.lt_cbzxcode + , t.lt_gwpc + , t.lt_xcbzsc + , t.lt_rylb + @@ -614,6 +623,9 @@ lt_xcbzsc, + + lt_rylb, + @@ -832,6 +844,9 @@ #{ltXcbzsc}, + + #{ltRylb}, + @@ -1237,7 +1252,7 @@ count(1) FROM hrsa_hrm_snapshot t WHERE snapshot_time = #{snapshotTime} - + AND status IN #{status} diff --git a/src/com/engine/salary/service/SalaryAcctResultService.java b/src/com/engine/salary/service/SalaryAcctResultService.java index 27e0034db..87d28350e 100644 --- a/src/com/engine/salary/service/SalaryAcctResultService.java +++ b/src/com/engine/salary/service/SalaryAcctResultService.java @@ -323,4 +323,46 @@ public interface SalaryAcctResultService { * @return */ String ltGenKb(String salaryMonth); + + /** + * 联特表5 - 研发项目工资分摊表-当月计提 + * @param salaryMonth + * @return + */ + String ltGenYfxmgzftbdyjt(String salaryMonth); + + /** + * 联特表5 - 研发项目工资分摊表-当月实发 + * @param salaryMonth + * @return + */ + String ltGenYfxmgzftbdysf(String salaryMonth); + + /** + * 联特表5 - 研发项目工资分摊表 + * @param salaryMonth + * @return + */ + String ltGenYfxmgzftb(String salaryMonth); + + /** + * 联特表5 - 部门项目工资分摊表-计提 + * @param salaryMonth + * @return + */ + String ltGenBmyfxmgzftbjt(String salaryMonth); + + /** + * 联特表5 - 部门项目工资分摊表-实发 + * @param salaryMonth + * @return + */ + String ltGenBmyfxmgzftbsf(String salaryMonth); + + /** + * 联特表5 - 部门项目工资分摊表 + * @param salaryMonth + * @return + */ + String ltGenBmxmgzftb(String salaryMonth); } diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index 6771224f2..a375ea06f 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -2291,12 +2291,14 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe } // 获取薪资核算结果 Map singleAcctResultMap = acctResultMapByAcctEmpId.get(Utils.null2String(salaryAcctEmp.getId())); - firstSb.append("insert into uf_mxgzbjt(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,szfb,szbm,qj,cbzx,ydjx,jdjx,bndjx,nzj,"+fieldStr+") values ("); + firstSb.append("insert into uf_mxgzbjt(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,szfb,szbm,szgw,rylx,qj,cbzx,ydjx,jdjx,bndjx,nzj,"+fieldStr+") values ("); firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'") .append(employee.getWorkcode()).append("',") .append(employee.getEmployeeId()).append(",") .append(employee.getSubcompanyid()).append(",") - .append(employee.getDepartmentId()).append(",'") + .append(employee.getDepartmentId()).append(",") + .append(employee.getJobtitleId()).append(",") + .append(employee.getLtRylb()).append(",'") .append(salaryMonth).append("','") .append(Utils.null2String(employee.getLtCbzx())).append("',") .append(jx).append(",").append(jdjx).append(",").append(bndjx).append(",").append(nzj); @@ -2336,7 +2338,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe List> partition = Lists.partition(salaryAcctEmployeeList, 500); for (List part : partition) { StringBuilder sb = new StringBuilder(); - sb.append("insert into uf_mxgzbjt(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,szfb,szbm,qj,cbzx,ydjx,jdjx,bndjx,nzj,"+fieldStr+") values "); + sb.append("insert into uf_mxgzbjt(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,szfb,szbm,szgw,rylx,qj,cbzx,ydjx,jdjx,bndjx,nzj,"+fieldStr+") values "); for (SalaryAcctEmployeePO salaryAcctEmployeePO : part) { employee = employeeMap.getOrDefault(salaryAcctEmployeePO.getEmployeeId(), DataCollectionEmployee.builder().build()); singleAcctResultMap = acctResultMapByAcctEmpId.get(Utils.null2String(salaryAcctEmployeePO.getId())); @@ -2380,7 +2382,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employee.getWorkcode()).append("',") .append(employee.getEmployeeId()).append(",") .append(employee.getSubcompanyid()).append(",") - .append(employee.getDepartmentId()).append(",'") + .append(employee.getDepartmentId()).append(",") + .append(employee.getJobtitleId()).append(",") + .append(employee.getLtRylb()).append(",'") .append(salaryMonth).append("','") .append(Utils.null2String(employee.getLtCbzx())).append("',") .append(jx).append(",").append(jdjx).append(",").append(bndjx).append(",").append(nzj); @@ -2563,12 +2567,14 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe String bndjx = NumberUtils.isCreatable(Utils.null2String(singleBndAcctResultMap.get(bndItemId.toString()))) ? Utils.null2String(singleBndAcctResultMap.get(bndItemId.toString())) : "0"; Map singleNzjAcctResultMap = nzjAcctResultMapByKey.getOrDefault(key, new HashMap<>()); String nzj = NumberUtils.isCreatable(Utils.null2String(singleNzjAcctResultMap.get(nzjItemId.toString()))) ? Utils.null2String(singleNzjAcctResultMap.get(nzjItemId.toString())) : "0"; - firstSb.append("insert into uf_rymxgzsf(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,szfb,szbm,qj,cbzx,ydjx,jdjx,bndjx,nzj,"+fieldStr+") values ("); + firstSb.append("insert into uf_rymxgzsf(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,szfb,szbm,szgw,rylx,qj,cbzx,ydjx,jdjx,bndjx,nzj,"+fieldStr+") values ("); firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'") .append(employee.getWorkcode()).append("',") .append(employee.getEmployeeId()).append(",") .append(employee.getSubcompanyid()).append(",") - .append(employee.getDepartmentId()).append(",'") + .append(employee.getDepartmentId()).append(",") + .append(employee.getJobtitleId()).append(",") + .append(employee.getLtRylb()).append(",'") .append(salaryMonth).append("','") .append(Utils.null2String(employee.getLtCbzx())).append("',") .append(0).append(",").append(jdjx).append(",").append(bndjx).append(",").append(nzj); @@ -2608,7 +2614,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe List> partition = Lists.partition(keyList, 500); for (List part : partition) { StringBuilder sb = new StringBuilder(); - sb.append("insert into uf_rymxgzsf(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,szfb,szbm,qj,cbzx,ydjx,jdjx,bndjx,nzj,"+fieldStr+") values "); + sb.append("insert into uf_rymxgzsf(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,szfb,szbm,szgw,rylx,qj,cbzx,ydjx,jdjx,bndjx,nzj,"+fieldStr+") values "); for (String keyStr : part) { split = keyStr.split("_split"); empId = split != null && split.length > 1 ? SalaryEntityUtil.string2LongDefault0(split[1]) : 0L; @@ -2627,7 +2633,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .append(employee.getWorkcode()).append("',") .append(employee.getEmployeeId()).append(",") .append(employee.getSubcompanyid()).append(",") - .append(employee.getDepartmentId()).append(",'") + .append(employee.getDepartmentId()).append(",") + .append(employee.getJobtitleId()).append(",") + .append(employee.getLtRylb()).append(",'") .append(salaryMonth).append("','") .append(Utils.null2String(employee.getLtCbzx())).append("',") .append(0).append(",").append(jdjx).append(",").append(bndjx).append(",").append(nzj); @@ -3660,7 +3668,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe 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(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()); @@ -3679,4 +3687,691 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe return ""; } + + /** + * 联特表5 - 研发项目工资分摊表-当月计提 + * @param salaryMonth + * @return + */ + @Override + public String ltGenYfxmgzftbdyjt(String salaryMonth) { + if (!SalaryDateUtil.checkYearMonth(salaryMonth)) { + throw new SalaryRunTimeException("年月错误"); + } + Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth); + BaseBean baseBean = new BaseBean(); + RecordSet rs = new RecordSet(); + // 获取研发工时表对应数据 + List yfgsList = getLtYfgsList(salaryMonthDate); + Map xmhMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, LtYfgsPO::getXmh); + // 获取需要统计赋值哪些字段(人员明细工资计提表 和 研发项目工资分摊表-当月计提 这些字段的数据库字段名需保持一致) + List fieldList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "yfxmgzftbdyjt_sum_fields").split(",")).filter(key -> StringUtils.isNotBlank(key)).collect(Collectors.toList()); + List selectFieldList = new ArrayList<>(); + selectFieldList.addAll(fieldList); + selectFieldList.add("yldw"); + selectFieldList.add("yldwbj"); + selectFieldList.add("gsdw"); + selectFieldList.add("gsdwbj"); + selectFieldList.add("sydw"); + selectFieldList.add("sydwbj"); + selectFieldList.add("yldw1"); + selectFieldList.add("yldwbj1"); + selectFieldList.add("gjjdw"); + selectFieldList.add("gjjdwbj"); + // 获取对应期间人员明细工资计提表 + rs.execute("select xm,"+ StringUtils.join(selectFieldList,",")+" from uf_mxgzbjt where qj ='" + SalaryDateUtil.getFormatYearMonth(salaryMonthDate) +"'"); + HashMap>> listGroupByXmh = new HashMap<>(); + while (rs.next()) { + Long xm = SalaryEntityUtil.string2LongDefault0(rs.getString("xm")); + String xmh = SalaryEntityUtil.null2String(xmhMap.get(xm)); + List> xmhList = listGroupByXmh.computeIfAbsent(xmh, k -> new ArrayList<>()); + Map singleEmpValueMap = new HashMap<>(); + for (String field : fieldList) { + singleEmpValueMap.put(field, Utils.null2String(rs.getString(field))); + } + // 5个写死的逻辑 + BigDecimal yldw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj"))); + singleEmpValueMap.put("ylbxdw", yldw.toPlainString()); + BigDecimal gsdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdwbj"))); + singleEmpValueMap.put("gsbxdw", gsdw.toPlainString()); + BigDecimal sydw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydwbj"))); + singleEmpValueMap.put("sybxdw", sydw.toPlainString()); + BigDecimal yldw1 = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw1")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj1"))); + singleEmpValueMap.put("ylbxdw1", yldw1.toPlainString()); + BigDecimal gjjdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdwbj"))); + singleEmpValueMap.put("zfgjjdw", gjjdw.toPlainString()); + xmhList.add(singleEmpValueMap); + } + + String currDate = String.format("'%s'", TimeUtil.getCurrentDateString()); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = String.format("'%s'", sdf.format(new Date())); + // 获取建模模块id + String modeId = baseBean.getPropValue("ltSalaryReport", "yfxmgzftbdyjt_mode_id"); + // 入库前先删除 + rs.execute("delete from uf_yfxmgzftbjt where qj ='" + salaryMonth +"'"); + fieldList.add("ylbxdw"); + fieldList.add("gsbxdw"); + fieldList.add("sybxdw"); + fieldList.add("ylbxdw1"); + fieldList.add("zfgjjdw"); + for (Map.Entry>> entry : listGroupByXmh.entrySet()) { + List> valueList = entry.getValue(); + Map sumValueMap = new HashMap<>(); + for(String fieldKey : fieldList) { + BigDecimal sumVal = valueList.stream().map(valueMap -> valueMap.get(fieldKey)) + .filter(NumberUtils::isCreatable) + .map(BigDecimal::new) + .reduce(new BigDecimal("0"), BigDecimal::add); + sumValueMap.put(fieldKey, sumVal.toPlainString()); + } + + // 入库 + StringBuilder insertSqlSb = new StringBuilder("insert into uf_yfxmgzftbjt (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,qj,xmh,"+StringUtils.join(fieldList, ",")+")VALUES(") + .append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(salaryMonth).append("','").append(entry.getKey()).append("',"); + for (String fieldKey : fieldList) { + insertSqlSb.append(SalaryEntityUtil.string2BigDecimalDefault0(sumValueMap.get(fieldKey)).toPlainString()).append(","); + } + insertSqlSb.append(")"); + insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(",")); + rs.execute(insertSqlSb.toString()); + // 权限重构 + // 获取最大值 作为权限重构的起始id + rs.execute("select max(id) from uf_yfxmgzftbjt"); + 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 salaryMonthDate + * @return + */ + private List getLtYfgsList(Date salaryMonthDate) { + if (salaryMonthDate == null) { + return Collections.emptyList(); + } + RecordSet rs = new RecordSet(); + rs.execute("select xm,xmh,xmszsyb,szfb,szbm,cbzx from uf_yfgs where qj='"+SalaryDateUtil.getFormatYearMonth(salaryMonthDate)+"'"); + List resultList = new ArrayList<>(); + while (rs.next()) { + LtYfgsPO po = new LtYfgsPO(); + po.setXm(SalaryEntityUtil.string2LongDefault0(rs.getString("xm"))); + po.setXmh(Utils.null2String(rs.getString("xmh"))); + po.setXmszsyb(Utils.null2String(rs.getString("xmszsyb"))); + po.setSzfb(SalaryEntityUtil.string2LongDefault0(rs.getString("szfb"))); + po.setSzbm(SalaryEntityUtil.string2LongDefault0(rs.getString("szbm"))); + po.setCbzx(Utils.null2String(rs.getString("cbzx"))); + resultList.add(po); + } + return resultList; + } + + /** + * 联特表5 - 研发项目工资分摊表-当月实发 + * @param salaryMonth + * @return + */ + @Override + public String ltGenYfxmgzftbdysf(String salaryMonth) { + if (!SalaryDateUtil.checkYearMonth(salaryMonth)) { + throw new SalaryRunTimeException("年月错误"); + } + Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth); + BaseBean baseBean = new BaseBean(); + RecordSet rs = new RecordSet(); + // 获取研发工时表对应数据 + List yfgsList = getLtYfgsList(salaryMonthDate); + Map xmhMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, LtYfgsPO::getXmh); + // 获取需要统计赋值哪些字段(人员明细工资实发表 和 研发项目工资分摊表-当月实发 这些字段的数据库字段名需保持一致) + List fieldList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "yfxmgzftbdysf_sum_fields").split(",")).filter(key -> StringUtils.isNotBlank(key)).collect(Collectors.toList()); + List selectFieldList = new ArrayList<>(); + selectFieldList.addAll(fieldList); + selectFieldList.add("yldw"); + selectFieldList.add("yldwbj"); + selectFieldList.add("gsdw"); + selectFieldList.add("gsdwbj"); + selectFieldList.add("sydw"); + selectFieldList.add("sydwbj"); + selectFieldList.add("yldw1"); + selectFieldList.add("yldwbj1"); + selectFieldList.add("gjjdw"); + selectFieldList.add("gjjdwbj"); + // 获取对应期间人员明细工资实发表 + rs.execute("select xm,"+ StringUtils.join(selectFieldList,",")+" from uf_rymxgzsf where qj ='" + SalaryDateUtil.getFormatYearMonth(salaryMonthDate) +"'"); + HashMap>> listGroupByXmh = new HashMap<>(); + while (rs.next()) { + Long xm = SalaryEntityUtil.string2LongDefault0(rs.getString("xm")); + String xmh = SalaryEntityUtil.null2String(xmhMap.get(xm)); + List> xmhList = listGroupByXmh.computeIfAbsent(xmh, k -> new ArrayList<>()); + Map singleEmpValueMap = new HashMap<>(); + for (String field : fieldList) { + singleEmpValueMap.put(field, Utils.null2String(rs.getString(field))); + } + // 5个写死的逻辑 + BigDecimal yldw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj"))); + singleEmpValueMap.put("ylbxdw", yldw.toPlainString()); + BigDecimal gsdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdwbj"))); + singleEmpValueMap.put("gsbxdw", gsdw.toPlainString()); + BigDecimal sydw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydwbj"))); + singleEmpValueMap.put("sybxdw", sydw.toPlainString()); + BigDecimal yldw1 = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw1")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj1"))); + singleEmpValueMap.put("ylbxdw1", yldw1.toPlainString()); + BigDecimal gjjdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdwbj"))); + singleEmpValueMap.put("zfgjjdw", gjjdw.toPlainString()); + xmhList.add(singleEmpValueMap); + } + + String currDate = String.format("'%s'", TimeUtil.getCurrentDateString()); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = String.format("'%s'", sdf.format(new Date())); + // 获取建模模块id + String modeId = baseBean.getPropValue("ltSalaryReport", "yfxmgzftbdysf_mode_id"); + // 入库前先删除 + rs.execute("delete from uf_yfxmgzftbsf where qj ='" + salaryMonth +"'"); + fieldList.add("ylbxdw"); + fieldList.add("gsbxdw"); + fieldList.add("sybxdw"); + fieldList.add("ylbxdw1"); + fieldList.add("zfgjjdw"); + for (Map.Entry>> entry : listGroupByXmh.entrySet()) { + List> valueList = entry.getValue(); + Map sumValueMap = new HashMap<>(); + for(String fieldKey : fieldList) { + BigDecimal sumVal = valueList.stream().map(valueMap -> valueMap.get(fieldKey)) + .filter(NumberUtils::isCreatable) + .map(BigDecimal::new) + .reduce(new BigDecimal("0"), BigDecimal::add); + sumValueMap.put(fieldKey, sumVal.toPlainString()); + } + + // 入库 + StringBuilder insertSqlSb = new StringBuilder("insert into uf_yfxmgzftbsf (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,qj,xmh,"+StringUtils.join(fieldList, ",")+")VALUES(") + .append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(salaryMonth).append("','").append(entry.getKey()).append("',"); + for (String fieldKey : fieldList) { + insertSqlSb.append(SalaryEntityUtil.string2BigDecimalDefault0(sumValueMap.get(fieldKey)).toPlainString()).append(","); + } + insertSqlSb.append(")"); + insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(",")); + rs.execute(insertSqlSb.toString()); + // 权限重构 + // 获取最大值 作为权限重构的起始id + rs.execute("select max(id) from uf_yfxmgzftbsf"); + 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 ""; + } + + /** + * 联特表5 - 研发项目工资分摊表 + * @param salaryMonth + * @return + */ + @Override + public String ltGenYfxmgzftb(String salaryMonth) { + if (!SalaryDateUtil.checkYearMonth(salaryMonth)) { + throw new SalaryRunTimeException("年月错误"); + } + Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth); + BaseBean baseBean = new BaseBean(); + RecordSet rs = new RecordSet(); + // 获取研发工时表对应数据 + List yfgsList = getLtYfgsList(salaryMonthDate); + Map xmhMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, LtYfgsPO::getXmh); + + // 获取对应的上月、当月对应的计提、实发 的人员明细工资表数据 + Date lastMonthDate = SalaryDateUtil.localDateToDate(SalaryDateUtil.dateToLocalDate(salaryMonthDate).minusMonths(1)); + // 本月计提数据 + List thisMonthJtInfo = listLtRymxgzInfo(salaryMonthDate, true, xmhMap); + Map> thisMonthJtInfoMap = SalaryEntityUtil.group2Map(thisMonthJtInfo, LtRymxgzDTO::getXmh); + // 上月计提数据 + List lastMonthJtInfo = listLtRymxgzInfo(lastMonthDate, true, xmhMap); + Map> lastMonthJtInfoMap = SalaryEntityUtil.group2Map(lastMonthJtInfo, LtRymxgzDTO::getXmh); + // 本月实发数据 + List thisMonthSfInfo = listLtRymxgzInfo(salaryMonthDate, false, xmhMap); + Map> thisMonthSfInfoMap = SalaryEntityUtil.group2Map(thisMonthSfInfo, LtRymxgzDTO::getXmh); + // 上月实发数据 + List lastMonthSfInfo = listLtRymxgzInfo(lastMonthDate, false, xmhMap); + Map> lastMonthSfInfoMap = SalaryEntityUtil.group2Map(lastMonthSfInfo, LtRymxgzDTO::getXmh); + + // 获取所有的项目号 + Set xmhList = new HashSet<>(); + xmhList.addAll(thisMonthJtInfoMap.keySet()); + xmhList.addAll(lastMonthJtInfoMap.keySet()); + xmhList.addAll(thisMonthSfInfoMap.keySet()); + xmhList.addAll(lastMonthSfInfoMap.keySet()); + + String currDate = String.format("'%s'", TimeUtil.getCurrentDateString()); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = String.format("'%s'", sdf.format(new Date())); + // 获取建模模块id + String modeId = baseBean.getPropValue("ltSalaryReport", "yfxmgzftb_mode_id"); + // 入库前先删除 + rs.execute("delete from uf_yfxmgzftb where qj ='" + salaryMonth +"'"); + YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth); + int monthValue = yearMonth.getMonthValue(); + for (String xmh : xmhList) { + BigDecimal gz = new BigDecimal("0"); + List thisMonthJtList = CollectionUtils.isEmpty(thisMonthJtInfoMap.get(xmh)) ? new ArrayList<>() : thisMonthJtInfoMap.get(xmh) ; + List lastMonthJtList = CollectionUtils.isEmpty(lastMonthJtInfoMap.get(xmh)) ? new ArrayList<>() : lastMonthJtInfoMap.get(xmh) ; + List thisMonthSfList = CollectionUtils.isEmpty(thisMonthSfInfoMap.get(xmh)) ? new ArrayList<>() : thisMonthSfInfoMap.get(xmh) ; + List lastMonthSfList = CollectionUtils.isEmpty(lastMonthSfInfoMap.get(xmh)) ? new ArrayList<>() : lastMonthSfInfoMap.get(xmh) ; + if (monthValue == 2 || monthValue == 3 || monthValue == 5 || monthValue == 6 || monthValue == 8 || monthValue == 9 || monthValue == 11) { + gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getJx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + } else if (monthValue == 4 || monthValue == 7 || monthValue == 10) { + gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getJdjx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(thisMonthSfList.stream().map(LtRymxgzDTO::getJdjx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getJx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + } else if (monthValue == 12) { + gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.subtract(thisMonthSfList.stream().map(LtRymxgzDTO::getNzj).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + } else { + gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getNzj).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(thisMonthSfList.stream().map(LtRymxgzDTO::getNzj).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getJx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + } + // 入库 + StringBuilder insertSqlSb = new StringBuilder("insert into uf_yfxmgzftb (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,qj,xmh,yfgz)VALUES(") + .append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(salaryMonth).append("','").append(xmh).append("',").append(gz.toPlainString()).append(")"); + rs.execute(insertSqlSb.toString()); + // 权限重构 + // 获取最大值 作为权限重构的起始id + rs.execute("select max(id) from uf_yfxmgzftb"); + 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 salaryMonthDate 期间 + * @param isJt 是否是计提 + * @return + */ + private List listLtRymxgzInfo(Date salaryMonthDate, boolean isJt, Map xmhMap) { + if (salaryMonthDate == null) { + return Collections.emptyList(); + } + String yearMonthStr = SalaryDateUtil.getFormatYearMonth(salaryMonthDate); + List resultList = new ArrayList<>(); + RecordSet rs = new RecordSet(); + if (isJt) { + // 计提表取数 + rs.execute("select xm,yfgz,ydjx,jdjx,nzj from uf_mxgzbjt where qj = '" + yearMonthStr + "'"); + while (rs.next()) { + resultList.add(LtRymxgzDTO.builder() + .key(Utils.null2String(xmhMap.get(SalaryEntityUtil.string2LongDefault0(rs.getString("xm"))))) + .xmh(Utils.null2String(xmhMap.get(SalaryEntityUtil.string2LongDefault0(rs.getString("xm"))))) + .xm(SalaryEntityUtil.string2LongDefault0(rs.getString("xm"))) + .gz(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yfgz"))) + .jx(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ydjx"))) + .jdjx(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("jdjx"))) + .nzj(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("nzj"))) + .build()); + } + } else { + // 实发表取数 + rs.execute("select xm,yfgz,ydjx,jdjx,nzj from uf_rymxgzsf where qj = '" + yearMonthStr + "'"); + while (rs.next()) { + resultList.add(LtRymxgzDTO.builder() + .key(Utils.null2String(xmhMap.get(SalaryEntityUtil.string2LongDefault0(rs.getString("xm"))))) + .xmh(Utils.null2String(xmhMap.get(SalaryEntityUtil.string2LongDefault0(rs.getString("xm"))))) + .xm(SalaryEntityUtil.string2LongDefault0(rs.getString("xm"))) + .gz(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yfgz"))) + .jx(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("ydjx"))) + .jdjx(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("jdjx"))) + .nzj(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("nzj"))) + .build()); + } + } + return resultList; + } + + /** + * 联特表5 - 部门项目工资分摊表-计提 + * @param salaryMonth + * @return + */ + @Override + public String ltGenBmyfxmgzftbjt(String salaryMonth) { + if (!SalaryDateUtil.checkYearMonth(salaryMonth)) { + throw new SalaryRunTimeException("年月错误"); + } + Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth); + BaseBean baseBean = new BaseBean(); + RecordSet rs = new RecordSet(); + // 获取研发工时表对应数据 + List yfgsList = getLtYfgsList(salaryMonthDate); + Map groupMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, po -> po.getCbzx() + "_split" + po.getXmh() + "_split" + po.getXmszsyb()); + // 获取需要统计赋值哪些字(人员明细工资计提表 和 部门项目工资分摊表-计提 这些字段的数据库字段名需保持一致) + List fieldList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "bmxmgzftbjt_sum_fields").split(",")).filter(key -> StringUtils.isNotBlank(key)).collect(Collectors.toList()); + List selectFieldList = new ArrayList<>(); + selectFieldList.addAll(fieldList); + selectFieldList.add("yldw"); + selectFieldList.add("yldwbj"); + selectFieldList.add("gsdw"); + selectFieldList.add("gsdwbj"); + selectFieldList.add("sydw"); + selectFieldList.add("sydwbj"); + selectFieldList.add("yldw1"); + selectFieldList.add("yldwbj1"); + selectFieldList.add("gjjdw"); + selectFieldList.add("gjjdwbj"); + // 获取对应期间人员明细工资计提表 + rs.execute("select xm,"+ StringUtils.join(selectFieldList,",")+" from uf_mxgzbjt where qj ='" + SalaryDateUtil.getFormatYearMonth(salaryMonthDate) +"'"); + HashMap>> listGroupByXmh = new HashMap<>(); + while (rs.next()) { + Long xm = SalaryEntityUtil.string2LongDefault0(rs.getString("xm")); + String groupKey = SalaryEntityUtil.null2String(groupMap.get(xm)); + List> groupKeyList = listGroupByXmh.computeIfAbsent(groupKey, k -> new ArrayList<>()); + Map singleEmpValueMap = new HashMap<>(); + for (String field : fieldList) { + singleEmpValueMap.put(field, Utils.null2String(rs.getString(field))); + } + // 5个写死的逻辑 + BigDecimal yldw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj"))); + singleEmpValueMap.put("ylbxdw", yldw.toPlainString()); + BigDecimal gsdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdwbj"))); + singleEmpValueMap.put("gsbxdw", gsdw.toPlainString()); + BigDecimal sydw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydwbj"))); + singleEmpValueMap.put("sybxdw", sydw.toPlainString()); + BigDecimal yldw1 = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw1")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj1"))); + singleEmpValueMap.put("ylbxdw1", yldw1.toPlainString()); + BigDecimal gjjdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdwbj"))); + singleEmpValueMap.put("zfgjjdw", gjjdw.toPlainString()); + groupKeyList.add(singleEmpValueMap); + } + + String currDate = String.format("'%s'", TimeUtil.getCurrentDateString()); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = String.format("'%s'", sdf.format(new Date())); + // 获取建模模块id + String modeId = baseBean.getPropValue("ltSalaryReport", "bmxmgzftbjt_mode_id"); + // 入库前先删除 + rs.execute("delete from uf_bmxmgzftbjt where qj ='" + salaryMonth +"'"); + fieldList.add("ylbxdw"); + fieldList.add("gsbxdw"); + fieldList.add("sybxdw"); + fieldList.add("ylbxdw1"); + fieldList.add("zfgjjdw"); + for (Map.Entry>> entry : listGroupByXmh.entrySet()) { + List> valueList = entry.getValue(); + Map sumValueMap = new HashMap<>(); + for(String fieldKey : fieldList) { + BigDecimal sumVal = valueList.stream().map(valueMap -> valueMap.get(fieldKey)) + .filter(NumberUtils::isCreatable) + .map(BigDecimal::new) + .reduce(new BigDecimal("0"), BigDecimal::add); + sumValueMap.put(fieldKey, sumVal.toPlainString()); + } + + String[] split = entry.getKey().split("_split"); + String cbzx = split != null && split.length > 0 ? split[0] : ""; + String xmh = split != null && split.length > 1 ? split[1] : ""; + String xmszsyb = split != null && split.length > 2 ? split[2] : ""; + // 入库 + StringBuilder insertSqlSb = new StringBuilder("insert into uf_bmxmgzftbjt (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,qj,cbzx,xmh,xmszsyb,"+StringUtils.join(fieldList, ",")+")VALUES(") + .append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(salaryMonth).append("','").append(cbzx).append("','").append(xmh).append("','").append(xmszsyb).append("',"); + for (String fieldKey : fieldList) { + insertSqlSb.append(SalaryEntityUtil.string2BigDecimalDefault0(sumValueMap.get(fieldKey)).toPlainString()).append(","); + } + insertSqlSb.append(")"); + insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(",")); + rs.execute(insertSqlSb.toString()); + // 权限重构 + // 获取最大值 作为权限重构的起始id + rs.execute("select max(id) from uf_bmxmgzftbjt"); + 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 ""; + } + + /** + * 联特表5 - 部门项目工资分摊表-实发 + * @param salaryMonth + * @return + */ + @Override + public String ltGenBmyfxmgzftbsf(String salaryMonth) { + if (!SalaryDateUtil.checkYearMonth(salaryMonth)) { + throw new SalaryRunTimeException("年月错误"); + } + Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth); + BaseBean baseBean = new BaseBean(); + RecordSet rs = new RecordSet(); + // 获取研发工时表对应数据 + List yfgsList = getLtYfgsList(salaryMonthDate); + Map groupMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, po -> po.getCbzx() + "_split" + po.getXmh() + "_split" + po.getXmszsyb()); + // 获取需要统计赋值哪些字(人员明细工资实发表 和 部门项目工资分摊表-实发 这些字段的数据库字段名需保持一致) + List fieldList = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "bmxmgzftbsf_sum_fields").split(",")).filter(key -> StringUtils.isNotBlank(key)).collect(Collectors.toList()); + List selectFieldList = new ArrayList<>(); + selectFieldList.addAll(fieldList); + selectFieldList.add("yldw"); + selectFieldList.add("yldwbj"); + selectFieldList.add("gsdw"); + selectFieldList.add("gsdwbj"); + selectFieldList.add("sydw"); + selectFieldList.add("sydwbj"); + selectFieldList.add("yldw1"); + selectFieldList.add("yldwbj1"); + selectFieldList.add("gjjdw"); + selectFieldList.add("gjjdwbj"); + // 获取对应期间人员明细工资实发表 + rs.execute("select xm,"+ StringUtils.join(selectFieldList,",")+" from uf_rymxgzsf where qj ='" + SalaryDateUtil.getFormatYearMonth(salaryMonthDate) +"'"); + HashMap>> listGroupByXmh = new HashMap<>(); + while (rs.next()) { + Long xm = SalaryEntityUtil.string2LongDefault0(rs.getString("xm")); + String groupKey = SalaryEntityUtil.null2String(groupMap.get(xm)); + List> groupKeyList = listGroupByXmh.computeIfAbsent(groupKey, k -> new ArrayList<>()); + Map singleEmpValueMap = new HashMap<>(); + for (String field : fieldList) { + singleEmpValueMap.put(field, Utils.null2String(rs.getString(field))); + } + // 5个写死的逻辑 + BigDecimal yldw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj"))); + singleEmpValueMap.put("ylbxdw", yldw.toPlainString()); + BigDecimal gsdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gsdwbj"))); + singleEmpValueMap.put("gsbxdw", gsdw.toPlainString()); + BigDecimal sydw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("sydwbj"))); + singleEmpValueMap.put("sybxdw", sydw.toPlainString()); + BigDecimal yldw1 = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldw1")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("yldwbj1"))); + singleEmpValueMap.put("ylbxdw1", yldw1.toPlainString()); + BigDecimal gjjdw = SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdw")).add(SalaryEntityUtil.string2BigDecimalDefault0(rs.getString("gjjdwbj"))); + singleEmpValueMap.put("zfgjjdw", gjjdw.toPlainString()); + groupKeyList.add(singleEmpValueMap); + } + + String currDate = String.format("'%s'", TimeUtil.getCurrentDateString()); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = String.format("'%s'", sdf.format(new Date())); + // 获取建模模块id + String modeId = baseBean.getPropValue("ltSalaryReport", "bmxmgzftbsf_mode_id"); + // 入库前先删除 + rs.execute("delete from uf_bmxmgzftbsf where qj ='" + salaryMonth +"'"); + fieldList.add("ylbxdw"); + fieldList.add("gsbxdw"); + fieldList.add("sybxdw"); + fieldList.add("ylbxdw1"); + fieldList.add("zfgjjdw"); + for (Map.Entry>> entry : listGroupByXmh.entrySet()) { + List> valueList = entry.getValue(); + Map sumValueMap = new HashMap<>(); + for(String fieldKey : fieldList) { + BigDecimal sumVal = valueList.stream().map(valueMap -> valueMap.get(fieldKey)) + .filter(NumberUtils::isCreatable) + .map(BigDecimal::new) + .reduce(new BigDecimal("0"), BigDecimal::add); + sumValueMap.put(fieldKey, sumVal.toPlainString()); + } + + String[] split = entry.getKey().split("_split"); + String cbzx = split != null && split.length > 0 ? split[0] : ""; + String xmh = split != null && split.length > 1 ? split[1] : ""; + String xmszsyb = split != null && split.length > 2 ? split[2] : ""; + // 入库 + StringBuilder insertSqlSb = new StringBuilder("insert into uf_bmxmgzftbsf (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,qj,cbzx,xmh,xmszsyb,"+StringUtils.join(fieldList, ",")+")VALUES(") + .append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(salaryMonth).append("','").append(cbzx).append("','").append(xmh).append("','").append(xmszsyb).append("',"); + for (String fieldKey : fieldList) { + insertSqlSb.append(SalaryEntityUtil.string2BigDecimalDefault0(sumValueMap.get(fieldKey)).toPlainString()).append(","); + } + insertSqlSb.append(")"); + insertSqlSb.deleteCharAt(insertSqlSb.lastIndexOf(",")); + rs.execute(insertSqlSb.toString()); + // 权限重构 + // 获取最大值 作为权限重构的起始id + rs.execute("select max(id) from uf_bmxmgzftbsf"); + 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 String ltGenBmxmgzftb(String salaryMonth) { + if (!SalaryDateUtil.checkYearMonth(salaryMonth)) { + throw new SalaryRunTimeException("年月错误"); + } + Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth); + BaseBean baseBean = new BaseBean(); + RecordSet rs = new RecordSet(); + // 获取研发工时表对应数据 + List yfgsList = getLtYfgsList(salaryMonthDate); + Map groupMap = SalaryEntityUtil.convert2Map(yfgsList, LtYfgsPO::getXm, po -> po.getCbzx() + "_split" + po.getXmh() + "_split" + po.getXmszsyb()); + + // 获取对应的上月、当月对应的计提、实发 的人员明细工资表数据 + Date lastMonthDate = SalaryDateUtil.localDateToDate(SalaryDateUtil.dateToLocalDate(salaryMonthDate).minusMonths(1)); + // 本月计提数据 + List thisMonthJtInfo = listLtRymxgzInfo(salaryMonthDate, true, groupMap); + Map> thisMonthJtInfoMap = SalaryEntityUtil.group2Map(thisMonthJtInfo, LtRymxgzDTO::getKey); + // 上月计提数据 + List lastMonthJtInfo = listLtRymxgzInfo(lastMonthDate, true, groupMap); + Map> lastMonthJtInfoMap = SalaryEntityUtil.group2Map(lastMonthJtInfo, LtRymxgzDTO::getKey); + // 本月实发数据 + List thisMonthSfInfo = listLtRymxgzInfo(salaryMonthDate, false, groupMap); + Map> thisMonthSfInfoMap = SalaryEntityUtil.group2Map(thisMonthSfInfo, LtRymxgzDTO::getKey); + // 上月实发数据 + List lastMonthSfInfo = listLtRymxgzInfo(lastMonthDate, false, groupMap); + Map> lastMonthSfInfoMap = SalaryEntityUtil.group2Map(lastMonthSfInfo, LtRymxgzDTO::getKey); + + // 获取所有的项目号 + Set keyList = new HashSet<>(); + keyList.addAll(thisMonthJtInfoMap.keySet()); + keyList.addAll(lastMonthJtInfoMap.keySet()); + keyList.addAll(thisMonthSfInfoMap.keySet()); + keyList.addAll(lastMonthSfInfoMap.keySet()); + + String currDate = String.format("'%s'", TimeUtil.getCurrentDateString()); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = String.format("'%s'", sdf.format(new Date())); + // 获取建模模块id + String modeId = baseBean.getPropValue("ltSalaryReport", "bmxmgzftb_mode_id"); + // 入库前先删除 + rs.execute("delete from uf_bmxmfzftb where qj ='" + salaryMonth +"'"); + YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth); + int monthValue = yearMonth.getMonthValue(); + for (String key : keyList) { + BigDecimal gz = new BigDecimal("0"); + List thisMonthJtList = CollectionUtils.isEmpty(thisMonthJtInfoMap.get(key)) ? new ArrayList<>() : thisMonthJtInfoMap.get(key) ; + List lastMonthJtList = CollectionUtils.isEmpty(lastMonthJtInfoMap.get(key)) ? new ArrayList<>() : lastMonthJtInfoMap.get(key) ; + List thisMonthSfList = CollectionUtils.isEmpty(thisMonthSfInfoMap.get(key)) ? new ArrayList<>() : thisMonthSfInfoMap.get(key) ; + List lastMonthSfList = CollectionUtils.isEmpty(lastMonthSfInfoMap.get(key)) ? new ArrayList<>() : lastMonthSfInfoMap.get(key) ; + if (monthValue == 2 || monthValue == 3 || monthValue == 5 || monthValue == 6 || monthValue == 8 || monthValue == 9 || monthValue == 11) { + gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getJx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + } else if (monthValue == 4 || monthValue == 7 || monthValue == 10) { + gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getJdjx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(thisMonthSfList.stream().map(LtRymxgzDTO::getJdjx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getJx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + } else if (monthValue == 12) { + gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.subtract(thisMonthSfList.stream().map(LtRymxgzDTO::getNzj).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + } else { + gz = gz.add(lastMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(lastMonthSfList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(thisMonthJtList.stream().map(LtRymxgzDTO::getNzj).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.add(thisMonthSfList.stream().map(LtRymxgzDTO::getNzj).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getGz).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + gz = gz.subtract(thisMonthJtList.stream().map(LtRymxgzDTO::getJx).filter(v -> v != null).reduce(new BigDecimal("0"), BigDecimal::add)); + } + String[] split = key.split("_split"); + String cbzx = split != null && split.length > 0 ? split[0] : ""; + String xmh = split != null && split.length > 1 ? split[1] : ""; + String xmszsyb = split != null && split.length > 2 ? split[2] : ""; + // 入库 + StringBuilder insertSqlSb = new StringBuilder("insert into uf_bmxmfzftb (formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,qj,cbzx,xmh,xmszsyb,yfgz)VALUES(") + .append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'").append(salaryMonth).append("','").append(cbzx).append("','").append(xmh).append("','").append(xmszsyb).append("',").append(gz.toPlainString()).append(")"); + rs.execute(insertSqlSb.toString()); + // 权限重构 + // 获取最大值 作为权限重构的起始id + rs.execute("select max(id) from uf_bmxmfzftb"); + 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 783283d34..db09a82e5 100644 --- a/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryEmployeeServiceImpl.java @@ -698,6 +698,7 @@ public class SalaryEmployeeServiceImpl extends Service implements SalaryEmployee .accountTypeName(AccountTypeEnum.getDefaultLabelByValue(hrmSnapshotPO.getAccounttype())) .accountType(hrmSnapshotPO.getAccounttype()) .ltCbzx(hrmSnapshotPO.getLtCbzx()) + .ltRylb(hrmSnapshotPO.getLtRylb()) .build()) .orElse(currentEmployeeMap.get(employeeId)); }).collect(Collectors.toList()); diff --git a/src/com/engine/salary/timer/HrmSnapshotJob.java b/src/com/engine/salary/timer/HrmSnapshotJob.java index 5b4bcc468..1075710c3 100644 --- a/src/com/engine/salary/timer/HrmSnapshotJob.java +++ b/src/com/engine/salary/timer/HrmSnapshotJob.java @@ -40,13 +40,16 @@ public class HrmSnapshotJob extends BaseCronJob { BaseBean baseBean = new BaseBean(); String cbzxField = baseBean.getPropValue("ltSalaryReport", "cbzx_field_name"); String cbzxCodeField = baseBean.getPropValue("ltSalaryReport", "cbzx_code_field_name"); + String rylbField = baseBean.getPropValue("ltSalaryReport", "rylb_field_name"); RecordSet rs = new RecordSet(); - rs.execute("select id,"+cbzxField +","+cbzxCodeField+" from cus_fielddata where scopeid=3 "); + rs.execute("select id,"+cbzxField +","+cbzxCodeField+","+rylbField+" from cus_fielddata where scopeid=3 "); HashMap ltCbzxMap = new HashMap<>(); HashMap ltCbzxCodeMap = new HashMap<>(); + HashMap ltRylbMap = new HashMap<>(); while (rs.next()) { ltCbzxMap.put(Long.valueOf(rs.getInt("id")), rs.getString(cbzxField)); ltCbzxCodeMap.put(Long.valueOf(rs.getInt("id")), rs.getString(cbzxCodeField)); + ltRylbMap.put(Long.valueOf(rs.getInt("id")), rs.getString(rylbField)); } @@ -66,6 +69,7 @@ public class HrmSnapshotJob extends BaseCronJob { po.setLtCbzxcode(Utils.null2String(ltCbzxCodeMap.get(po.getEmployeeId()))); po.setLtGwpc(Utils.null2String(ltGwpcMap.get(po.getEmployeeId()))); po.setLtXcbzsc(Utils.null2String(ltXcbzscMap.get(po.getEmployeeId()))); + po.setLtRylb(Utils.null2String(ltRylbMap.get(po.getEmployeeId()))); }); Date snapshotTime = StrUtil.isNotBlank(appointSnapshotTime) && SalaryDateUtil.checkDay(appointSnapshotTime) ? SalaryDateUtil.dateStrToLocalDate(appointSnapshotTime) : SalaryDateUtil.localDateToDate(LocalDate.now()); diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index 4675c6e54..ddc17e1ec 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -1147,7 +1147,93 @@ public class SalaryAcctController { @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); + return new ResponseResult(user).run(getSalaryAcctResultWrapper(user)::ltGenKb, salaryMonth); } + + /** + * 联特 表5 - 研发项目工资分摊表-当月计提 + * @param request + * @param response + * @return + */ + @GET + @Path("/ltSalaryReport/genYfxmgzftbdyjt") + @Produces(MediaType.APPLICATION_JSON) + public String ltGenYfxmgzftbdyjt(@Context HttpServletRequest request, @Context HttpServletResponse response,@QueryParam(value = "salaryMonth") String salaryMonth) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctResultWrapper(user)::ltGenYfxmgzftbdyjt, salaryMonth); + } + + + /** + * 联特 表5 - 研发项目工资分摊表-当月实发 + * @param request + * @param response + * @return + */ + @GET + @Path("/ltSalaryReport/genYfxmgzftbdysf") + @Produces(MediaType.APPLICATION_JSON) + public String ltGenYfxmgzftbdysf(@Context HttpServletRequest request, @Context HttpServletResponse response,@QueryParam(value = "salaryMonth") String salaryMonth) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctResultWrapper(user)::ltGenYfxmgzftbdysf, salaryMonth); + } + + /** + * 联特 表5 - 研发项目工资分摊表 + * @param request + * @param response + * @return + */ + @GET + @Path("/ltSalaryReport/genYfxmgzftb") + @Produces(MediaType.APPLICATION_JSON) + public String ltGenYfxmgzftb(@Context HttpServletRequest request, @Context HttpServletResponse response,@QueryParam(value = "salaryMonth") String salaryMonth) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctResultWrapper(user)::ltGenYfxmgzftb, salaryMonth); + } + + /** + * 联特表5 - 部门研发项目工资分摊表-计提 + * @param request + * @param response + * @return + */ + @GET + @Path("/ltSalaryReport/genBmyfxmgzftbjt") + @Produces(MediaType.APPLICATION_JSON) + public String ltGenBmyfxmgzftbjt(@Context HttpServletRequest request, @Context HttpServletResponse response,@QueryParam(value = "salaryMonth") String salaryMonth) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctResultWrapper(user)::ltGenBmyfxmgzftbjt, salaryMonth); + } + + /** + * 联特表5 - 部门研发项目工资分摊表-实发 + * @param request + * @param response + * @return + */ + @GET + @Path("/ltSalaryReport/genBmyfxmgzftbsf") + @Produces(MediaType.APPLICATION_JSON) + public String ltGenBmyfxmgzftbsf(@Context HttpServletRequest request, @Context HttpServletResponse response,@QueryParam(value = "salaryMonth") String salaryMonth) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctResultWrapper(user)::ltGenBmyfxmgzftbsf, salaryMonth); + } + + /** + * 联特 表5 - 部门项目工资分摊表 + * @param request + * @param response + * @return + */ + @GET + @Path("/ltSalaryReport/genBmxmgzftb") + @Produces(MediaType.APPLICATION_JSON) + public String ltGenBmxmgzftb(@Context HttpServletRequest request, @Context HttpServletResponse response,@QueryParam(value = "salaryMonth") String salaryMonth) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctResultWrapper(user)::ltGenBmxmgzftb, salaryMonth); + } + /**********************************联特 报表end*********************************/ } diff --git a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java index 79f2d84fe..ab5b97aee 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java @@ -450,4 +450,58 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult public String ltGenKb(String salaryMonth) { return getSalaryAcctResultService(user).ltGenKb(salaryMonth); } + + /** + * 表5 - 研发项目工资分摊表-当月计提 + * @param salaryMonth + * @return + */ + public String ltGenYfxmgzftbdyjt(String salaryMonth) { + return getSalaryAcctResultService(user).ltGenYfxmgzftbdyjt(salaryMonth); + } + + /** + * 表5 - 研发项目工资分摊表-当月实发 + * @param salaryMonth + * @return + */ + public String ltGenYfxmgzftbdysf(String salaryMonth) { + return getSalaryAcctResultService(user).ltGenYfxmgzftbdysf(salaryMonth); + } + + /** + * 表5 - 研发项目工资分摊表 + * @param salaryMonth + * @return + */ + public String ltGenYfxmgzftb(String salaryMonth) { + return getSalaryAcctResultService(user).ltGenYfxmgzftb(salaryMonth); + } + + /** + * 表5 - 部门研发项目工资分摊表-计提 + * @param salaryMonth + * @return + */ + public String ltGenBmyfxmgzftbjt(String salaryMonth) { + return getSalaryAcctResultService(user).ltGenBmyfxmgzftbjt(salaryMonth); + } + + /** + * 表5 - 部门研发项目工资分摊表-实发 + * @param salaryMonth + * @return + */ + public String ltGenBmyfxmgzftbsf(String salaryMonth) { + return getSalaryAcctResultService(user).ltGenBmyfxmgzftbsf(salaryMonth); + } + + /** + * 表5 - 部门项目工资分摊表-实发 + * @param salaryMonth + * @return + */ + public String ltGenBmxmgzftb(String salaryMonth) { + return getSalaryAcctResultService(user).ltGenBmxmgzftb(salaryMonth); + } }