联特 报表(4张)

This commit is contained in:
Harryxzy 2025-08-06 18:09:19 +08:00
parent 3a1d2defbe
commit fd0808bb0c
22 changed files with 971 additions and 2 deletions

View File

@ -0,0 +1 @@
alter table hrsa_hrm_snapshot add column lt_cbzx varchar(255);

View File

@ -125,6 +125,8 @@ public class DataCollectionEmployee {
@SalaryFormulaVar(defaultLabel = "账号类型编码", labelId = 98622, dataType = "string")
private Integer accountType;
private String ltCbzx;
//是否是系统管理员
private Boolean isAdmin;

View File

@ -74,5 +74,6 @@ public class VariableArchiveItemPO {
//主键id集合
private Collection<Long> ids;
private Collection<Long> variableArchiveIds;
private Collection<Long> variableItemIds;
}

View File

@ -427,6 +427,11 @@ public class HrmSnapshotPO {
@ElogTransform(name = "工作年限")
private BigDecimal workyear;
/**
* 联特 成本中心
*/
private String ltCbzx;
//主键id集合
private Collection<Long> ids;

View File

@ -0,0 +1,26 @@
package com.engine.salary.entity.salaryacct.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName LtSalaryReportConfigDTO
* @author Harryxzy
* @date 2025/7/30 17:45
* @description
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LtSalaryReportConfigDTO {
// variable_id
private Long item;
// 数据库字段名
private String field;
}

View File

@ -188,4 +188,6 @@ public interface EmployMapper {
* @return
*/
List<DataCollectionEmployee> listByKeyword(@Param("keyword") String keyword);
List<DataCollectionEmployee> listByWorkCodes(@Param("workCodes") List<String> workCodes);
}

View File

@ -721,4 +721,22 @@
from hrmjobcall job
where job.id = #{jobCallId}
</select>
<select id="listByWorkCodes" resultType="com.engine.salary.entity.datacollection.DataCollectionEmployee">
select e.id as employeeId,
e.lastname as username,
e.status as status,
e.certificatenum as idNo,
e.workcode as workcode,
e.companystartdate as companystartdate,
e.mobile as mobile,
e.enddate as dismissdate
from hrmresource e
where e.status not in (7)
<if test="workCodes != null and workCodes.size()>0">
AND e.workcode IN
<foreach collection="workCodes" open="(" item="workCode" separator="," close=")">
#{workCode}
</foreach>
</if>
</select>
</mapper>

View File

@ -92,6 +92,12 @@
#{varArchId}
</foreach>
</if>
<if test="param.variableItemIds != null and param.variableItemIds.size()>0">
AND variable_item_id IN
<foreach collection="param.variableItemIds" open="(" item="variableItemId" separator="," close=")">
#{variableItemId}
</foreach>
</if>
ORDER BY id DESC
</select>

View File

@ -70,6 +70,7 @@
<result column="WORKROOM" property="workroom"/>
<result column="workstartdate" property="workstartdate"/>
<result column="workyear" property="workyear"/>
<result column="lt_cbzx" property="ltCbzx"/>
</resultMap>
<!-- 表字段 -->
@ -144,6 +145,7 @@
, t.WORKROOM
, t.workstartdate
, t.workyear
, t.lt_cbzx
</sql>
<!-- 查询全部 -->
@ -600,6 +602,9 @@
<if test="workyear != null">
workyear,
</if>
<if test="ltCbzx != null">
lt_cbzx,
</if>
</trim>
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
<if test="accountid1 != null">
@ -806,6 +811,9 @@
<if test="workyear != null">
#{workyear},
</if>
<if test="ltCbzx != null">
#{ltCbzx},
</if>
</trim>
</insert>

View File

@ -253,4 +253,29 @@ public interface SalaryAcctResultService {
Map<String, String> newResultValueMap,
SalaryLogOperateTypeEnum operateType);
/**
* 联特 - 生成部门社保明细表
* @param salaryMonth
* @return
*/
String ltGenBmsbmxb(String salaryMonth);
/**
* 联特 - 生成部门公积金明细表
* @param salaryMonth
* @return
*/
String ltGenBmgjjmxb(String salaryMonth);
/**
* 联特 - 生成部门工资&奖金明细表-计提
* @param salaryMonth
*/
String ltGenBmgzjjmxJt(String salaryMonth);
/**
* 联特 - 生成部门工资&奖金明细表-实发
* @param salaryMonth
*/
String ltGenBmgzjjmxSf(String salaryMonth);
}

View File

@ -13,6 +13,7 @@ import com.engine.salary.util.page.PageInfo;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -121,6 +122,8 @@ public interface SalaryArchiveItemService {
*/
List<SalaryArchiveItemPO> getCurrentEffectiveItemList(Collection<Long> salaryArchivesIds, Collection<Long> salaryItemIds);
List<SalaryArchiveItemPO> getEffectiveItemListBySalaryMonth(Collection<Long> salaryArchivesIds, Collection<Long> salaryItemIds, Date SalaryMonth);
/**
* 获取薪资档案对应的当前生效的薪资项目忽略值

View File

@ -210,4 +210,6 @@ public interface SalaryEmployeeService {
JobCallInfo getJobCallInfoById(Long jobCallId);
List<DataCollectionEmployee> snapshot(List<Long> employeeIds, Date snapshotTime);
List<DataCollectionEmployee> listByWorkCodes(List<String> workcodes);
}

View File

@ -33,4 +33,6 @@ public interface VariableArchiveItemService {
void deleteByIds(List<Long> variableArchiveItemIds);
void deleteByArchiveIds(List<Long> variableArchiveIds);
List<VariableArchiveItemPO> listByVariableArchiveIdsAndItemIds(List<Long> variableArchiveIds, List<Long> variableItemIds);
}

View File

@ -71,5 +71,7 @@ public interface VariableArchiveService {
List<Map<String, Object>> listBySalaryMonthAndEmployeeIds(YearMonth salaryMonth, List<Long> employeeIds, List<Long> taxAgentIds);
List<Map<String, Object>> listBySalaryMonthAndItems(YearMonth salaryMonth, List<Long> variableItemIds);
void updateData(VariableArchiveSaveParam updateParam);
}

View File

@ -20,10 +20,13 @@ 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.param.*;
import com.engine.salary.entity.salaryacct.po.*;
import com.engine.salary.entity.salaryarchive.po.SalaryArchiveItemPO;
import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO;
import com.engine.salary.entity.salaryformula.ExpressFormula;
import com.engine.salary.entity.salaryformula.po.FormulaVar;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
@ -51,6 +54,7 @@ import com.engine.salary.sys.entity.po.SalarySysConfPO;
import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum;
import com.engine.salary.sys.service.SalarySysConfService;
import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl;
import com.engine.salary.util.JsonUtil;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
@ -72,10 +76,18 @@ import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeanUtils;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.util.StopWatch;
import weaver.conn.RecordSet;
import weaver.conn.RecordSetDataSource;
import weaver.formmode.setup.ModeRightInfo;
import weaver.general.BaseBean;
import weaver.general.TimeUtil;
import weaver.hrm.User;
import weaver.wechat.util.Utils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.YearMonth;
import java.util.*;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.CountDownLatch;
@ -83,9 +95,8 @@ import java.util.concurrent.LinkedBlockingDeque;
import java.util.regex.Matcher;
import java.util.stream.Collectors;
import static com.engine.salary.sys.constant.SalarySysConstant.SALARY_ACCT_SYNC_TYPE;
import static com.engine.salary.constant.SalaryFormulaFieldConstant.SALARY_PATTERN;
import static com.engine.salary.sys.constant.SalarySysConstant.SALARY_ACCT_SYNC_TYPE;
/**
* 薪资核算结果
@ -220,6 +231,23 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
return ServiceUtil.getService(SalarySobTaxRuleServiceImpl.class, user);
}
private VariableArchiveService getVariableArchiveService(User user) {
return ServiceUtil.getService(VariableArchiveServiceImpl.class, user);
}
private VariableArchiveItemService getVariableArchiveItemService(User user) {
return ServiceUtil.getService(VariableArchiveItemServiceImpl.class, user);
}
private SalaryArchiveService getSalaryArchiveService(User user) {
return ServiceUtil.getService(SalaryArchiveServiceImpl.class, user);
}
private SalaryArchiveItemService getSalaryArchiveItemService(User user) {
return ServiceUtil.getService(SalaryArchiveItemServiceImpl.class, user);
}
@Override
public List<SalaryAcctResultPO> listBySalaryAcctRecordIds(Collection<Long> salaryAcctRecordIds) {
if (CollectionUtils.isEmpty(salaryAcctRecordIds)) {
@ -1547,4 +1575,608 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
context.setNewValues(newResultValueMap);
SalaryElogConfig.salaryAcctRecordLoggerTemplate.write(context);
}
/**
* 联特 - 生成部门社保明细表
* @param salaryMonth
* @return
*/
@Override
public String ltGenBmsbmxb(String salaryMonth) {
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
throw new SalaryRunTimeException("年月错误");
}
YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth);
// 查询需要生成哪些浮动薪资项目
BaseBean baseBean = new BaseBean();
String configStr = baseBean.getPropValue("ltSalaryReport", "bmsbmxb_ys_config");
List<LtSalaryReportConfigDTO> configs = JsonUtil.parseList(configStr, LtSalaryReportConfigDTO.class);
List<Long> variableItemIds = configs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
// 获取浮动档案
List<Map<String, Object>> variableMapList = getVariableArchiveService(user).listBySalaryMonthAndItems(yearMonth, variableItemIds);
// 过滤数据不能所有值为0或空
List<String> keyList = configs.stream().map(dto -> dto.getItem() + "_variableItem").collect(Collectors.toList());
variableMapList = variableMapList.stream().filter(map -> {
for (String key : keyList) {
String val = Utils.null2String(map.get(key));
if (StringUtils.isNotBlank(val) && NumberUtils.isCreatable(val) && new BigDecimal(val).compareTo(BigDecimal.ZERO) != 0 ) {
return true;
}
}
return false;
}).collect(Collectors.toList());
if (CollectionUtils.isEmpty(variableMapList)) {
return null;
}
log.info("部门社保明细表size{} ",variableMapList.size());
// 获取人员信息
List<Long> empIds = variableMapList.stream().map(map -> Utils.null2String(map.get("employeeId"))).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
// Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(empIds), DataCollectionEmployee::getEmployeeId);
// 查询快照表中人员信息
Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(empIds, SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId);
// 删除建模数据
RecordSet rs = new RecordSet();
rs.execute("delete from uf_bmsbmxb where xzszy = '" + salaryMonth+ "'");
// 插入建模
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", "bmsbmxb_mode_id");
// 先插入一条数据
Map<String, Object> firstData = variableMapList.get(0);
StringBuilder firstSb = new StringBuilder();
String fieldStr = configs.stream().map(LtSalaryReportConfigDTO::getField).collect(Collectors.joining(","));
DataCollectionEmployee employee = employeeMap.getOrDefault(firstData.get("employeeId"), DataCollectionEmployee.builder().build());
firstSb.append("insert into uf_bmsbmxb(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,"+fieldStr+") values (");
firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
.append(employee.getWorkcode()).append("',")
.append(employee.getEmployeeId()).append(",")
.append(employee.getDepartmentId()).append(",")
.append(employee.getJobtitleId()).append(",'")
.append(salaryMonth).append("','")
.append(Utils.null2String(employee.getLtCbzx())).append("'");
for (LtSalaryReportConfigDTO dto : configs) {
String val = Utils.null2String(firstData.get(Utils.null2String(dto.getItem()) + "_variableItem" ));
firstSb.append(",").append(NumberUtils.isCreatable(val) ? val : 0);
}
firstSb.append(")");
rs.execute(firstSb.toString());
variableMapList.remove(0);
// 获取最大值 作为权限重构的起始id
rs.execute("select max(id) from uf_bmsbmxb");
int minId = 0;
if (rs.next()) {
minId = rs.getInt(1);
}
int maxId = minId + variableMapList.size();
List<List<Map<String, Object>>> partition = Lists.partition(variableMapList, 500);
partition.forEach(part -> {
StringBuilder sb = new StringBuilder();
sb.append("insert into uf_bmsbmxb(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,"+fieldStr+") values ");
for (Map<String, Object> data : part) {
DataCollectionEmployee employeePo = employeeMap.getOrDefault(data.get("employeeId"), DataCollectionEmployee.builder().build());
sb.append("(")
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
.append(employeePo.getWorkcode()).append("',")
.append(employeePo.getEmployeeId()).append(",")
.append(employeePo.getDepartmentId()).append(",")
.append(employeePo.getJobtitleId()).append(",'")
.append(salaryMonth).append("','")
.append(Utils.null2String(employeePo.getLtCbzx())).append("'");
for (LtSalaryReportConfigDTO dto : configs) {
String val = Utils.null2String(data.getOrDefault(Utils.null2String(dto.getItem()) + "_variableItem", ""));
sb.append(",").append(NumberUtils.isCreatable(val) ? val : 0);
}
sb.append("),");
}
rs.execute(sb.substring(0,sb.length()-1).toString());
});
// 权限重构
log.info("部门社保明细表min{} max{} ",minId,maxId);
if (modeId != null && NumberUtils.isCreatable(modeId)) {
Integer modeIdValue = Integer.valueOf(modeId);
for (int i = minId; i <= maxId; i++) {
ModeRightInfo ModeRightInfo = new ModeRightInfo();
ModeRightInfo.setNewRight(true);
ModeRightInfo.editModeDataShare(1, modeIdValue, i);
}
}
return "success";
}
@Override
public String ltGenBmgjjmxb(String salaryMonth) {
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
throw new SalaryRunTimeException("年月错误");
}
YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth);
// 查询需要生成哪些浮动薪资项目
BaseBean baseBean = new BaseBean();
String configStr = baseBean.getPropValue("ltSalaryReport", "bmgjjmxb_ys_config");
List<LtSalaryReportConfigDTO> configs = JsonUtil.parseList(configStr, LtSalaryReportConfigDTO.class);
List<Long> variableItemIds = configs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
// 获取浮动档案
List<Map<String, Object>> variableMapList = getVariableArchiveService(user).listBySalaryMonthAndItems(yearMonth, variableItemIds);
// 过滤数据不能所有值为0或空
List<String> keyList = configs.stream().map(dto -> dto.getItem() + "_variableItem").collect(Collectors.toList());
variableMapList = variableMapList.stream().filter(map -> {
for (String key : keyList) {
String val = Utils.null2String(map.get(key));
if (StringUtils.isNotBlank(val) && NumberUtils.isCreatable(val) && new BigDecimal(val).compareTo(BigDecimal.ZERO) != 0 ) {
return true;
}
}
return false;
}).collect(Collectors.toList());
if (CollectionUtils.isEmpty(variableMapList)) {
return null;
}
log.info("部门公积金明细size{} ",variableMapList.size());
// 获取人员信息
List<Long> empIds = variableMapList.stream().map(map -> Utils.null2String(map.get("employeeId"))).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
// Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(empIds), DataCollectionEmployee::getEmployeeId);
// 查询快照表中人员信息
Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(empIds, SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId);
// 删除建模数据
RecordSet rs = new RecordSet();
rs.execute("delete from uf_bmgjjmxb where xzszy = '" + salaryMonth+ "'");
// 插入建模
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", "bmgjjmxb_mode_id");
// 先插入一条数据
Map<String, Object> firstData = variableMapList.get(0);
StringBuilder firstSb = new StringBuilder();
String fieldStr = configs.stream().map(LtSalaryReportConfigDTO::getField).collect(Collectors.joining(","));
DataCollectionEmployee employee = employeeMap.getOrDefault(firstData.get("employeeId"), DataCollectionEmployee.builder().build());
firstSb.append("insert into uf_bmgjjmxb(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,"+fieldStr+") values (");
firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
.append(employee.getWorkcode()).append("',")
.append(employee.getEmployeeId()).append(",")
.append(employee.getDepartmentId()).append(",")
.append(employee.getJobtitleId()).append(",'")
.append(salaryMonth).append("','")
.append(Utils.null2String(employee.getLtCbzx())).append("'");
for (LtSalaryReportConfigDTO dto : configs) {
String val = Utils.null2String(firstData.getOrDefault(Utils.null2String(dto.getItem()) + "_variableItem", ""));
firstSb.append(",").append(NumberUtils.isCreatable(val) ? val : 0);
}
firstSb.append(")");
rs.execute(firstSb.toString());
variableMapList.remove(0);
// 获取最大值 作为权限重构的起始id
rs.execute("select max(id) from uf_bmgjjmxb");
int minId = 0;
if (rs.next()) {
minId = rs.getInt(1);
}
int maxId = minId + variableMapList.size();
List<List<Map<String, Object>>> partition = Lists.partition(variableMapList, 500);
partition.forEach(part -> {
StringBuilder sb = new StringBuilder();
sb.append("insert into uf_bmgjjmxb(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,"+fieldStr+") values ");
for (Map<String, Object> data : part) {
DataCollectionEmployee employeePo = employeeMap.getOrDefault(data.get("employeeId"), DataCollectionEmployee.builder().build());
sb.append("(")
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
.append(employeePo.getWorkcode()).append("',")
.append(employeePo.getEmployeeId()).append(",")
.append(employeePo.getDepartmentId()).append(",")
.append(employeePo.getJobtitleId()).append(",'")
.append(salaryMonth).append("','")
.append(Utils.null2String(employeePo.getLtCbzx())).append("'");
for (LtSalaryReportConfigDTO dto : configs) {
String val = Utils.null2String(data.getOrDefault(Utils.null2String(dto.getItem()) + "_variableItem", ""));
sb.append(",").append(NumberUtils.isCreatable(val) ? val : 0);
}
sb.append("),");
}
rs.execute(sb.substring(0,sb.length()-1).toString());
});
// 权限重构
log.info("部门公积金明细min{} max{} ",minId,maxId);
if (modeId != null && NumberUtils.isCreatable(modeId)) {
Integer modeIdValue = Integer.valueOf(modeId);
for (int i = minId; i <= maxId; i++) {
ModeRightInfo ModeRightInfo = new ModeRightInfo();
ModeRightInfo.setNewRight(true);
ModeRightInfo.editModeDataShare(1, modeIdValue, i);
}
}
return "success";
}
@Override
public String ltGenBmgzjjmxJt(String salaryMonth) {
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
throw new SalaryRunTimeException("年月错误");
}
YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth);
// 查询需要生成哪些浮动薪资项目
BaseBean baseBean = new BaseBean();
String configStr = baseBean.getPropValue("ltSalaryReport", "bmsbmxb_ys_config");
List<LtSalaryReportConfigDTO> configs = JsonUtil.parseList(configStr, LtSalaryReportConfigDTO.class);
String gjjConfigStr = baseBean.getPropValue("ltSalaryReport", "bmgjjmxb_ys_config");
configs.addAll(JsonUtil.parseList(gjjConfigStr, LtSalaryReportConfigDTO.class));
List<Long> variableItemIds = configs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
// 获取浮动档案
List<Map<String, Object>> variableMapList = getVariableArchiveService(user).listBySalaryMonthAndItems(yearMonth, variableItemIds);
log.info("部门工资奖金明细表计提size{} ",variableMapList == null ? 0 :variableMapList.size());
// 获取直接人工工资分摊表的人
String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id");
RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId);
extRs.execute(" select month, user_code from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'");
List<String> needExcludeWorkCodeList = new ArrayList<>();
while (extRs.next()) {
needExcludeWorkCodeList.add(extRs.getString("user_code"));
}
if (CollectionUtils.isNotEmpty(needExcludeWorkCodeList)) {
// 获取需要去除的人员id
List<String> excludeEmpIds = getSalaryEmployeeService(user).listByWorkCodes(needExcludeWorkCodeList).stream().map(emp -> Utils.null2String(emp.getEmployeeId())).collect(Collectors.toList());
variableMapList = variableMapList.stream().filter(map -> !excludeEmpIds.contains(Utils.null2String(map.get("employeeId")))).collect(Collectors.toList());
}
log.info("部门工资奖金明细表计提size afterexclude{} ", variableMapList == null ? 0 : variableMapList.size());
// 过滤数据不能所有值为0或空
List<String> keyList = configs.stream().map(dto -> dto.getItem() + "_variableItem").collect(Collectors.toList());
variableMapList = variableMapList.stream().filter(map -> {
for (String key : keyList) {
String val = Utils.null2String(map.get(key));
if (StringUtils.isNotBlank(val) && NumberUtils.isCreatable(val) && new BigDecimal(val).compareTo(BigDecimal.ZERO) != 0) {
return true;
}
}
return false;
}).collect(Collectors.toList());
if (CollectionUtils.isEmpty(variableMapList)) {
return null;
}
log.info("部门工资奖金明细表实发size afterexclude2{} ",variableMapList.size());
List<Long> employeeIdList = variableMapList.stream().map(m -> Utils.null2String(m.get("employeeId")))
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
// 查询生成的报表映射关系
String reportConfigStr = baseBean.getPropValue("ltSalaryReport", "bmgzjjmxbjt_ys_config");
List<LtSalaryReportConfigDTO> reportConfigs = JsonUtil.parseList(reportConfigStr, LtSalaryReportConfigDTO.class);
List<Long> salaryItemIds = reportConfigs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
List<SalaryItemPO> salaryItemList = getSalaryItemService(user).listByIds(salaryItemIds);
// 查询薪资核算结果包含未归档
Date salaryMonthDate = SalaryDateUtil.localDateToDate(yearMonth.atDay(1));
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build());
// 账套范围
List<Long> sobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "bmgzjjmxbjt_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
salaryAcctRecordList = salaryAcctRecordList.stream().filter(sobId -> sobIds.contains(sobId)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(salaryAcctRecordList)) {
return "success";
}
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
List<SalaryAcctEmployeePO> salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIdsAndEmployeeIds(salaryAcctRecordIds, employeeIdList);
List<DataCollectionEmployee> employeeList = getSalaryEmployeeService(user).listByIds(employeeIdList);
// 查询薪资核算结果
List<Long> salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
List<SalaryAcctResultPO> acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds);
List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).listAll();
List<Map<String, Object>> acctResultMap = SalaryAcctResultBO.buildTableData(salaryItemList, Collections.emptyList(), employeeList, salaryAcctEmployeeList,
acctResultList, taxAgentPOS, Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), false);
Map<String, Map<String, Object>> acctResultMapByEmpId = SalaryEntityUtil.convert2Map(acctResultMap, m -> Utils.null2String(m.get("employeeId")));
// 查询员工薪资档案
List<SalaryArchivePO> salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build());
Map<String, Long> archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId());
List<Long> salaryArchiveIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
// 查询档案中对应的绩效工资
Long jdjxItemId = NumberUtils.isCreatable(baseBean.getPropValue("ltSalaryReport", "jdjx_item_id")) ? Long.valueOf(baseBean.getPropValue("ltSalaryReport", "jdjx_item_id")) : 0L;
Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(salaryMonthDate);
List<SalaryArchiveItemPO> salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, Collections.singletonList(jdjxItemId), lastDayOfMonth);
Map<Long, SalaryArchiveItemPO> archiveItemByArchiveId = SalaryEntityUtil.convert2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId());
// 查询快照表中人员信息
Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(employeeIdList, SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId);
// 入库
// 删除建模数据
RecordSet rs = new RecordSet();
rs.execute("delete from uf_bmjjjt where xzszy = '" + salaryMonth+ "'");
// 插入建模
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", "bmgzjjmxbjt_mode_id");
// 先插入一条数据
Map<String, Object> firstData = variableMapList.get(0);
StringBuilder firstSb = new StringBuilder();
String fieldStr = reportConfigs.stream().map(LtSalaryReportConfigDTO::getField).collect(Collectors.joining(","));
DataCollectionEmployee employee = employeeMap.getOrDefault(firstData.get("employeeId"), DataCollectionEmployee.builder().build());
// 获取员工档案绩效工资
Long archiveId = archiveIdMap.get(Utils.null2String(firstData.get("taxAgentId")) + "_" + employee.getEmployeeId());
SalaryArchiveItemPO salaryArchiveItemPO = archiveItemByArchiveId.get(archiveId == null ? 0L : archiveId);
String jxgz = (salaryArchiveItemPO == null || !NumberUtils.isCreatable(salaryArchiveItemPO.getItemValue())) ? "0" : new BigDecimal(salaryArchiveItemPO.getItemValue()).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP).toString();
// 获取薪资核算结果
Map<String, Object> singleAcctResultMap = acctResultMapByEmpId.get(Utils.null2String(employee.getEmployeeId()));
firstSb.append("insert into uf_bmjjjt(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,jdjxgzbz3,"+fieldStr+") values (");
firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
.append(employee.getWorkcode()).append("',")
.append(employee.getEmployeeId()).append(",")
.append(employee.getDepartmentId()).append(",")
.append(employee.getJobtitleId()).append(",'")
.append(salaryMonth).append("','")
.append(Utils.null2String(employee.getLtCbzx())).append("',")
.append(jxgz);
for (LtSalaryReportConfigDTO dto : reportConfigs) {
BigDecimal val = new BigDecimal("0");
if (singleAcctResultMap != null) {
String valStr = Utils.null2String(singleAcctResultMap.getOrDefault(Utils.null2String(dto.getItem()), "0"));
if (NumberUtils.isCreatable(valStr)) {
val = new BigDecimal(valStr);
}
}
firstSb.append(",").append(val.toPlainString());
}
firstSb.append(")");
rs.execute(firstSb.toString());
variableMapList.remove(0);
// 获取最大值 作为权限重构的起始id
rs.execute("select max(id) from uf_bmjjjt");
int minId = 0;
if (rs.next()) {
minId = rs.getInt(1);
}
int maxId = minId + variableMapList.size();
List<List<Map<String, Object>>> partition = Lists.partition(variableMapList, 500);
for (List<Map<String, Object>> part : partition) {
StringBuilder sb = new StringBuilder();
sb.append("insert into uf_bmjjjt(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,jdjxgzbz3,"+fieldStr+") values ");
for (Map<String, Object> data : part) {
employee = employeeMap.getOrDefault(data.get("employeeId"), DataCollectionEmployee.builder().build());
// 获取员工档案绩效工资
// 获取员工档案绩效工资
archiveId = archiveIdMap.get(Utils.null2String(data.get("taxAgentId")) + "_" + employee.getEmployeeId());
salaryArchiveItemPO = archiveItemByArchiveId.get(archiveId == null ? 0L : archiveId);
jxgz = (salaryArchiveItemPO == null || !NumberUtils.isCreatable(salaryArchiveItemPO.getItemValue())) ? "0" : new BigDecimal(salaryArchiveItemPO.getItemValue()).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP).toString();
// 获取薪资核算结果
singleAcctResultMap = acctResultMapByEmpId.get(Utils.null2String(employee.getEmployeeId()));
sb.append("(")
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
.append(employee.getWorkcode()).append("',")
.append(employee.getEmployeeId()).append(",")
.append(employee.getDepartmentId()).append(",")
.append(employee.getJobtitleId()).append(",'")
.append(salaryMonth).append("','")
.append(Utils.null2String(employee.getLtCbzx())).append("',")
.append(jxgz);
for (LtSalaryReportConfigDTO dto : reportConfigs) {
BigDecimal val = new BigDecimal("0");
if (singleAcctResultMap != null) {
String valStr = Utils.null2String(singleAcctResultMap.getOrDefault(Utils.null2String(dto.getItem()), "0"));
if (NumberUtils.isCreatable(valStr)) {
val = new BigDecimal(valStr);
}
}
sb.append(",").append(val.toPlainString());
}
sb.append("),");
}
rs.execute(sb.substring(0,sb.length()-1).toString());
}
// 权限重构
log.info("部门工资奖金明细表计提min{} max{} ",minId,maxId);
if (modeId != null && NumberUtils.isCreatable(modeId)) {
Integer modeIdValue = Integer.valueOf(modeId);
for (int i = minId; i <= maxId; i++) {
ModeRightInfo ModeRightInfo = new ModeRightInfo();
ModeRightInfo.setNewRight(true);
ModeRightInfo.editModeDataShare(1, modeIdValue, i);
}
}
return "success";
}
@Override
public String ltGenBmgzjjmxSf(String salaryMonth) {
if (!SalaryDateUtil.checkYearMonth(salaryMonth)) {
throw new SalaryRunTimeException("年月错误");
}
YearMonth yearMonth = SalaryDateUtil.String2YearMonth(salaryMonth);
// 查询需要生成哪些浮动薪资项目
BaseBean baseBean = new BaseBean();
String configStr = baseBean.getPropValue("ltSalaryReport", "bmsbmxb_ys_config");
List<LtSalaryReportConfigDTO> configs = JsonUtil.parseList(configStr, LtSalaryReportConfigDTO.class);
String gjjConfigStr = baseBean.getPropValue("ltSalaryReport", "bmgjjmxb_ys_config");
configs.addAll(JsonUtil.parseList(gjjConfigStr, LtSalaryReportConfigDTO.class));
List<Long> variableItemIds = configs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
// 获取浮动档案
List<Map<String, Object>> variableMapList = getVariableArchiveService(user).listBySalaryMonthAndItems(yearMonth, variableItemIds);
log.info("部门工资奖金明细表实发size{} ",variableMapList == null ? 0 : variableMapList.size());
// 获取直接人工工资分摊表的人
String dataSourceId = baseBean.getPropValue("ltSalaryReport", "zjrycqgsft_data_source_id");
RecordSetDataSource extRs = new RecordSetDataSource(dataSourceId);
extRs.execute(" select month, user_code from dws_oa.work_hour_apportion_report where month='"+salaryMonth+"'");
List<String> needExcludeWorkCodeList = new ArrayList<>();
while (extRs.next()) {
needExcludeWorkCodeList.add(extRs.getString("user_code"));
}
if (CollectionUtils.isNotEmpty(needExcludeWorkCodeList)) {
// 获取需要去除的人员id
List<String> excludeEmpIds = getSalaryEmployeeService(user).listByWorkCodes(needExcludeWorkCodeList).stream().map(emp -> Utils.null2String(emp.getEmployeeId())).collect(Collectors.toList());
variableMapList = variableMapList.stream().filter(map -> !excludeEmpIds.contains(Utils.null2String(map.get("employeeId")))).collect(Collectors.toList());
}
log.info("部门工资奖金明细表实发size afterexclude{} ",variableMapList == null ? 0 : variableMapList.size());
// 过滤数据不能所有值为0或空
List<String> keyList = configs.stream().map(dto -> dto.getItem() + "_variableItem").collect(Collectors.toList());
variableMapList = variableMapList.stream().filter(map -> {
for (String key : keyList) {
String val = Utils.null2String(map.get(key));
if (StringUtils.isNotBlank(val) && NumberUtils.isCreatable(val) && new BigDecimal(val).compareTo(BigDecimal.ZERO) != 0) {
return true;
}
}
return false;
}).collect(Collectors.toList());
if (CollectionUtils.isEmpty(variableMapList)) {
return null;
}
log.info("部门工资奖金明细表实发size afterexclude2{} ",variableMapList.size());
List<Long> employeeIdList = variableMapList.stream().map(m -> Utils.null2String(m.get("employeeId")))
.filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
// 查询生成的报表映射关系
String reportConfigStr = baseBean.getPropValue("ltSalaryReport", "bmgzjjmxbsf_ys_config");
List<LtSalaryReportConfigDTO> reportConfigs = JsonUtil.parseList(reportConfigStr, LtSalaryReportConfigDTO.class);
List<Long> salaryItemIds = reportConfigs.stream().map(LtSalaryReportConfigDTO::getItem).collect(Collectors.toList());
List<SalaryItemPO> salaryItemList = getSalaryItemService(user).listByIds(salaryItemIds);
// 查询薪资核算结果包含未归档
Date salaryMonthDate = SalaryDateUtil.localDateToDate(yearMonth.atDay(1));
List<SalaryAcctRecordPO> salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalaryMonth(LocalDateRange.builder().fromDate(salaryMonthDate).endDate(salaryMonthDate).build());
// 账套范围
List<Long> sobIds = Arrays.stream(baseBean.getPropValue("ltSalaryReport", "bmgzjjmxbsf_sob_ids").split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
salaryAcctRecordList = salaryAcctRecordList.stream().filter(sobId -> sobIds.contains(sobId)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(salaryAcctRecordList)) {
return "success";
}
List<Long> salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList());
List<SalaryAcctEmployeePO> salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIdsAndEmployeeIds(salaryAcctRecordIds, employeeIdList);
List<DataCollectionEmployee> employeeList = getSalaryEmployeeService(user).listByIds(employeeIdList);
// 查询薪资核算结果
List<Long> salaryAcctEmpIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
List<SalaryAcctResultPO> acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds);
List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).listAll();
List<Map<String, Object>> acctResultMap = SalaryAcctResultBO.buildTableData(salaryItemList, Collections.emptyList(), employeeList, salaryAcctEmployeeList,
acctResultList, taxAgentPOS, Collections.emptySet(), Collections.emptyMap(), Collections.emptyMap(), false);
Map<String, Map<String, Object>> acctResultMapByEmpId = SalaryEntityUtil.convert2Map(acctResultMap, m -> Utils.null2String(m.get("employeeId")));
// 查询员工薪资档案
List<SalaryArchivePO> salaryArchiveList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(employeeIdList).build());
Map<String, Long> archiveIdMap = SalaryEntityUtil.convert2Map(salaryArchiveList, archive -> archive.getTaxAgentId() + "_" + archive.getEmployeeId(), archive -> archive.getId());
List<Long> salaryArchiveIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
// 查询档案中对应的绩效工资
Long jdjxItemId = NumberUtils.isCreatable(baseBean.getPropValue("ltSalaryReport", "jdjx_item_id")) ? Long.valueOf(baseBean.getPropValue("ltSalaryReport", "jdjx_item_id")) : 0L;
Date lastDayOfMonth = SalaryDateUtil.getLastDayOfMonth(salaryMonthDate);
List<SalaryArchiveItemPO> salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getEffectiveItemListBySalaryMonth(salaryArchiveIds, Collections.singletonList(jdjxItemId), lastDayOfMonth);
Map<Long, SalaryArchiveItemPO> archiveItemByArchiveId = SalaryEntityUtil.convert2Map(salaryArchiveItemCurrentList, archive -> archive.getSalaryArchiveId());
// 查询快照表中人员信息
Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).snapshot(employeeIdList, SalaryDateUtil.localDateToDate(yearMonth.atDay(1))), DataCollectionEmployee::getEmployeeId);
// 入库
// 删除建模数据
RecordSet rs = new RecordSet();
rs.execute("delete from uf_bmjjjt where xzszy = '" + salaryMonth+ "'");
// 插入建模
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", "bmgzjjmxbsf_mode_id");
// 先插入一条数据
Map<String, Object> firstData = variableMapList.get(0);
StringBuilder firstSb = new StringBuilder();
String fieldStr = reportConfigs.stream().map(LtSalaryReportConfigDTO::getField).collect(Collectors.joining(","));
DataCollectionEmployee employee = employeeMap.getOrDefault(firstData.get("employeeId"), DataCollectionEmployee.builder().build());
// 获取员工档案绩效工资
Long archiveId = archiveIdMap.get(Utils.null2String(firstData.get("taxAgentId")) + "_" + employee.getEmployeeId());
SalaryArchiveItemPO salaryArchiveItemPO = archiveItemByArchiveId.get(archiveId == null ? 0L : archiveId);
String jxgz = (salaryArchiveItemPO == null || !NumberUtils.isCreatable(salaryArchiveItemPO.getItemValue())) ? "0" : new BigDecimal(salaryArchiveItemPO.getItemValue()).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP).toString();
// 获取薪资核算结果
Map<String, Object> singleAcctResultMap = acctResultMapByEmpId.get(Utils.null2String(employee.getEmployeeId()));
firstSb.append("insert into uf_bmjjsf(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,jdjxgzbz3,"+fieldStr+") values (");
firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
.append(employee.getWorkcode()).append("',")
.append(employee.getEmployeeId()).append(",")
.append(employee.getDepartmentId()).append(",")
.append(employee.getJobtitleId()).append(",'")
.append(salaryMonth).append("','")
.append(Utils.null2String(employee.getLtCbzx())).append("',")
.append(jxgz);
for (LtSalaryReportConfigDTO dto : reportConfigs) {
BigDecimal val = new BigDecimal("0");
if (singleAcctResultMap != null) {
String valStr = Utils.null2String(singleAcctResultMap.getOrDefault(Utils.null2String(dto.getItem()), "0"));
if (NumberUtils.isCreatable(valStr)) {
val = new BigDecimal(valStr);
}
}
firstSb.append(",").append(val.toPlainString());
}
firstSb.append(")");
rs.execute(firstSb.toString());
variableMapList.remove(0);
// 获取最大值 作为权限重构的起始id
rs.execute("select max(id) from uf_bmjjsf");
int minId = 0;
if (rs.next()) {
minId = rs.getInt(1);
}
int maxId = minId + variableMapList.size();
List<List<Map<String, Object>>> partition = Lists.partition(variableMapList, 500);
for (List<Map<String, Object>> part : partition) {
StringBuilder sb = new StringBuilder();
sb.append("insert into uf_bmjjsf(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,gh,xm,bm,gw,xzszy,cbzx,jdjxgzbz3,"+fieldStr+") values ");
for (Map<String, Object> data : part) {
employee = employeeMap.getOrDefault(data.get("employeeId"), DataCollectionEmployee.builder().build());
// 获取员工档案绩效工资
archiveId = archiveIdMap.get(Utils.null2String(data.get("taxAgentId")) + "_" + employee.getEmployeeId());
salaryArchiveItemPO = archiveItemByArchiveId.get(archiveId == null ? 0L : archiveId);
jxgz = (salaryArchiveItemPO == null || !NumberUtils.isCreatable(salaryArchiveItemPO.getItemValue())) ? "0" : new BigDecimal(salaryArchiveItemPO.getItemValue()).divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP).toString();
// 获取薪资核算结果
singleAcctResultMap = acctResultMapByEmpId.get(Utils.null2String(employee.getEmployeeId()));
sb.append("(")
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
.append(employee.getWorkcode()).append("',")
.append(employee.getEmployeeId()).append(",")
.append(employee.getDepartmentId()).append(",")
.append(employee.getJobtitleId()).append(",'")
.append(salaryMonth).append("','")
.append(Utils.null2String(employee.getLtCbzx())).append("',")
.append(jxgz);
for (LtSalaryReportConfigDTO dto : reportConfigs) {
BigDecimal val = new BigDecimal("0");
if (singleAcctResultMap != null) {
String valStr = Utils.null2String(singleAcctResultMap.getOrDefault(Utils.null2String(dto.getItem()), "0"));
if (NumberUtils.isCreatable(valStr)) {
val = new BigDecimal(valStr);
}
}
sb.append(",").append(val.toPlainString());
}
sb.append("),");
}
rs.execute(sb.substring(0,sb.length()-1).toString());
}
// 权限重构
log.info("部门工资奖金明细表实发min{} max{} ",minId,maxId);
if (modeId != null && NumberUtils.isCreatable(modeId)) {
Integer modeIdValue = Integer.valueOf(modeId);
for (int i = minId; i <= maxId; i++) {
ModeRightInfo ModeRightInfo = new ModeRightInfo();
ModeRightInfo.setNewRight(true);
ModeRightInfo.editModeDataShare(1, modeIdValue, i);
}
}
return "success";
}
}

View File

@ -178,6 +178,27 @@ public class SalaryArchiveItemServiceImpl extends Service implements SalaryArchi
.collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getSalaryArchiveId() + "-" + f.getSalaryItemId()))), ArrayList::new));
}
@Override
public List<SalaryArchiveItemPO> getEffectiveItemListBySalaryMonth(Collection<Long> salaryArchivesIds, Collection<Long> salaryItemIds, Date SalaryMonth) {
// 没有薪资项目时给个不存在的否则加载所有不合理
salaryItemIds = CollectionUtils.isEmpty(salaryItemIds) ? Collections.singletonList(0L) : salaryItemIds;
// 薪资档案id
List<Long> salaryArchiveIds = CollectionUtils.isEmpty(salaryArchivesIds) ? Collections.singletonList(0L) : (List<Long>) salaryArchivesIds;
List<SalaryArchiveItemPO> salaryArchiveItems = Lists.newArrayList();
List<List<Long>> partition = Lists.partition(Lists.newArrayList(salaryArchiveIds), 999);
Collection<Long> finalSalaryItemIds = salaryItemIds;
partition.forEach(part -> salaryArchiveItems.addAll(
salaryArchiveItemMapper.getEffectiveSalaryItems(SalaryArchiveItemQueryParam.builder()
.salaryArchivesIds(part)
.salaryItemIds(finalSalaryItemIds)
.effectiveTime(SalaryMonth).build()))
);
return salaryArchiveItems.stream()
.collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getSalaryArchiveId() + "-" + f.getSalaryItemId()))), ArrayList::new));
}
/**
* 获取当前已生效列表
*

View File

@ -697,10 +697,21 @@ public class SalaryEmployeeServiceImpl extends Service implements SalaryEmployee
.idNo(hrmSnapshotPO.getCertificatenum())
.accountTypeName(AccountTypeEnum.getDefaultLabelByValue(hrmSnapshotPO.getAccounttype()))
.accountType(hrmSnapshotPO.getAccounttype())
.ltCbzx(hrmSnapshotPO.getLtCbzx())
.build())
.orElse(currentEmployeeMap.get(employeeId));
}).collect(Collectors.toList());
return SalaryI18nUtil.i18nList(employees);
}
@Override
public List<DataCollectionEmployee> listByWorkCodes(List<String> workCodes) {
List<DataCollectionEmployee> empList = new ArrayList<>();
List<List<String>> partition = Lists.partition(workCodes, 500);
partition.forEach(part -> {
empList.addAll(getEmployMapper().listByWorkCodes(part));
});
return SalaryI18nUtil.i18nList(empList);
}
}

View File

@ -9,6 +9,7 @@ import com.engine.salary.util.db.MapperProxyFactory;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@ -84,4 +85,18 @@ public class VariableArchiveItemServiceImpl extends Service implements VariableA
partition.forEach(part -> getVariableArchiveItemMapper().deleteByIds(part));
}
@Override
public List<VariableArchiveItemPO> listByVariableArchiveIdsAndItemIds(List<Long> variableArchiveIds, List<Long> variableItemIds) {
if (CollectionUtils.isEmpty(variableArchiveIds) || CollectionUtils.isEmpty(variableItemIds)) {
return Collections.emptyList();
}
List<List<Long>> partition = Lists.partition(variableArchiveIds, 200);
List<VariableArchiveItemPO> resultList = new ArrayList<>();
partition.forEach(part -> {
resultList.addAll(getVariableArchiveItemMapper().listSome(VariableArchiveItemPO.builder().variableArchiveIds(part).variableItemIds(variableItemIds).build()));
});
return encryptUtil.decryptList(resultList, VariableArchiveItemPO.class);
}
}

View File

@ -186,6 +186,50 @@ public class VariableArchiveServiceImpl extends Service implements VariableArchi
return listMaps;
}
public List<Map<String, Object>> buildVariableArchiveData(List<VariableArchiveListDTO> variableArchives ,List<Long> variableItemIds) {
List<Long> variableArchiveIds = variableArchives.stream().map(VariableArchiveListDTO::getId).collect(Collectors.toList());
// 获取浮动薪资档案所对应的浮动薪资项目数据
List<VariableArchiveItemPO> variableArchiveItemList = getVariableArchiveItemService(user).listByVariableArchiveIdsAndItemIds(variableArchiveIds,variableItemIds);
Map<Long, List<VariableArchiveItemPO>> variableArchiveItemMap = SalaryEntityUtil.group2Map(variableArchiveItemList, VariableArchiveItemPO::getVariableArchiveId);
List<Map<String, Object>> variableArchiveItemData = variableArchives.stream().map(m -> {
Map<String, Object> map = Maps.newHashMap();
map.put("variableArchiveId", m.getId());
List<VariableArchiveItemPO> variableArchiveItemValuelList = variableArchiveItemMap.getOrDefault(m.getId(), Collections.emptyList());
variableArchiveItemValuelList.forEach(i -> {
map.put(i.getVariableItemId() + SalaryItemConstant.VARIABLE_ITEM_DYNAMIC_SUFFIX, i.getItemValue());
});
return map;
}).collect(Collectors.toList());
// 组装数据
List<Map<String, Object>> listMaps = new ArrayList<>();
variableArchives.forEach(e -> {
Map<String, Object> map = new LinkedHashMap<>();
map.put("id", e.getId());
map.put("taxAgentName", e.getTaxAgentName());
map.put("taxAgentId", e.getTaxAgentId());
map.put("username", e.getUsername());
map.put("salaryMonth", SalaryDateUtil.getFormatYearMonth(e.getSalaryMonth()));
map.put("employeeId", e.getEmployeeId());
map.put("subcompanyName", e.getSubcompanyName());
map.put("departmentName", e.getDepartmentName());
map.put("mobile", e.getMobile());
map.put("workcode", e.getWorkcode());
map.put("idNo", e.getIdNo());
map.put("companystartdate", e.getCompanystartdate());
map.put("dismissdate", e.getDismissdate());
map.put("opts", e.getOpts());
// 浮动薪资项目动态
Optional<Map<String, Object>> optionalItem = variableArchiveItemData.stream().filter(f -> f.get("variableArchiveId").toString().equals(e.getId().toString())).findFirst();
optionalItem.ifPresent(map::putAll);
listMaps.add(map);
});
return listMaps;
}
/**
* 创建浮动薪酬档案
*
@ -594,6 +638,23 @@ public class VariableArchiveServiceImpl extends Service implements VariableArchi
return buildVariableArchiveData(variableArchiveListDTO);
}
@Override
public List<Map<String, Object>> listBySalaryMonthAndItems(YearMonth salaryMonth, List<Long> variableItemIds) {
VariableArchiveQueryParam queryParam = VariableArchiveQueryParam.builder()
.salaryMonth(SalaryDateUtil.getFormatYearMonth(salaryMonth))
.build();
ValidUtil.doValidator(queryParam);
// 浮动薪酬档案列表
if (Objects.nonNull(queryParam.getSalaryMonth())) {
queryParam.setSalaryMonthDate(SalaryDateUtil.dateStrToLocalYearMonth(queryParam.getSalaryMonth()));
}
//排序配置
OrderRuleVO orderRule = getSalarySysConfService(user).orderRule();
queryParam.setOrderRule(orderRule);
List<VariableArchiveListDTO> list = listDTO(queryParam);
return buildVariableArchiveData(list, variableItemIds);
}
@Override
public void updateData(VariableArchiveSaveParam updateParam) {
if (updateParam.getId() == null) {

View File

@ -7,11 +7,15 @@ import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.db.IdGenerator;
import com.engine.salary.util.db.MapperProxyFactory;
import lombok.extern.slf4j.Slf4j;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.hrm.User;
import weaver.interfaces.schedule.BaseCronJob;
import weaver.wechat.util.Utils;
import java.time.LocalDate;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@Slf4j
@ -32,6 +36,18 @@ public class HrmSnapshotJob extends BaseCronJob {
try {
List<HrmSnapshotPO> hrmSnapshotPOS = getHrmSnapshotMapper().currentEmpData();
// 获取联特成本中心数据
BaseBean baseBean = new BaseBean();
String cbzxField = baseBean.getPropValue("ltSalaryReport", "cbzx_field_name");
RecordSet rs = new RecordSet();
rs.execute("select id,"+cbzxField+" from cus_fielddata where scopeid=3 and "+cbzxField+" != '' ");
HashMap<Long, String> ltCbzxMap = new HashMap<>();
while (rs.next()) {
ltCbzxMap.put(Long.valueOf(rs.getInt("id")), rs.getString(cbzxField));
}
hrmSnapshotPOS.stream().forEach(po -> {
po.setLtCbzx(Utils.null2String(ltCbzxMap.get(po.getEmployeeId())));
});
Date snapshotTime = StrUtil.isNotBlank(appointSnapshotTime) && SalaryDateUtil.checkDay(appointSnapshotTime) ? SalaryDateUtil.dateStrToLocalDate(appointSnapshotTime) : SalaryDateUtil.localDateToDate(LocalDate.now());

View File

@ -985,4 +985,81 @@ public class SalaryAcctController {
}
/**********************************线下对比 end*********************************/
/**********************************联特 报表start*********************************/
/**
* 联特 - 生成部门社保明细表
* @param request
* @param response
* @param salaryMonth
* @return
*/
@GET
@Path("/ltSalaryReport/genBmsbmxb")
@Produces(MediaType.APPLICATION_JSON)
public String ltGenBmsbmxb(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryMonth") String salaryMonth) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<String, String>(user).run(getSalaryAcctResultWrapper(user)::ltGenBmsbmxb, salaryMonth);
}
/**
* 联特 - 生成部门公积金明细表
* @param request
* @param response
* @param salaryMonth
* @return
*/
@GET
@Path("/ltSalaryReport/genBmgjjmxb")
@Produces(MediaType.APPLICATION_JSON)
public String ltGenBmgjjmxb(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryMonth") String salaryMonth) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<String, String>(user).run(getSalaryAcctResultWrapper(user)::ltGenBmgjjmxb, salaryMonth);
}
/**
* 联特 - 生成部门工资&奖金明细表-计提
* @param request
* @param response
* @param salaryMonth
* @return
*/
@GET
@Path("/ltSalaryReport/genBmgzjjmxJt")
@Produces(MediaType.APPLICATION_JSON)
public String ltGenBmgzjjmxJt(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryMonth") String salaryMonth) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<String, String>(user).run(getSalaryAcctResultWrapper(user)::ltGenBmgzjjmxJt, salaryMonth);
}
/**
* 联特 - 生成部门工资&奖金明细表-实发
* @param request
* @param response
* @param salaryMonth
* @return
*/
@GET
@Path("/ltSalaryReport/genBmgzjjmxSf")
@Produces(MediaType.APPLICATION_JSON)
public String ltGenBmgzjjmxSf(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryMonth") String salaryMonth) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<String, String>(user).run(getSalaryAcctResultWrapper(user)::ltGenBmgzjjmxSf, salaryMonth);
}
// /**
// * 联特表5 - 生成人员明细工资计提表
// * @param request
// * @param response
// * @param salaryMonth
// * @return
// */
// @GET
// @Path("/ltSalaryReport/genRymxgzjt")
// @Produces(MediaType.APPLICATION_JSON)
// public String ltGenRymxgzjt(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryMonth") String salaryMonth) {
// User user = HrmUserVarify.getUser(request, response);
// return new ResponseResult<String, String>(user).run(getSalaryAcctResultWrapper(user)::ltGenRymxgzjt, salaryMonth);
// }
/**********************************联特 报表end*********************************/
}

View File

@ -371,4 +371,37 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult
public void calcTaxFeedback(SalaryCalcTaxParam salaryCalcTaxParam) {
getSalaryCalcTaxService(user).calcTaxFeedback(salaryCalcTaxParam);
}
/**
* 联特 - 生成部门社保明细表
* @param salaryMonth
* @return
*/
public String ltGenBmsbmxb(String salaryMonth) {
return getSalaryAcctResultService(user).ltGenBmsbmxb(salaryMonth);
}
/**
* 联特 - 生成部门公积金明细表
* @param salaryMonth
*/
public String ltGenBmgjjmxb(String salaryMonth) {
return getSalaryAcctResultService(user).ltGenBmgjjmxb(salaryMonth);
}
/**
* 联特 - 生成部门工资&奖金明细表-计提
* @param salaryMonth
*/
public String ltGenBmgzjjmxJt(String salaryMonth) {
return getSalaryAcctResultService(user).ltGenBmgzjjmxJt(salaryMonth);
}
/**
* 联特 - 生成部门工资&奖金明细表-实发
* @param salaryMonth
*/
public String ltGenBmgzjjmxSf(String salaryMonth) {
return getSalaryAcctResultService(user).ltGenBmgzjjmxSf(salaryMonth);
}
}