Compare commits

...

3 Commits

Author SHA1 Message Date
Harryxzy b2354d00c6 联特报表调整 2025-08-14 15:17:19 +08:00
Harryxzy f491daeea0 联特表5 - 生成人员明细工资计提表联特表6 - 生成人员明细工资实发表 2025-08-13 11:41:36 +08:00
Harryxzy fd0808bb0c 联特 报表(4张) 2025-08-06 18:09:19 +08:00
24 changed files with 1516 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

@ -335,6 +335,7 @@ public class SalaryAcctResultBO {
// 个税扣缴义务人
String taxAgentName = taxAgentNameMap.getOrDefault(e.getTaxAgentId(), StringUtils.EMPTY);
map.put("taxAgentName", taxAgentName);
map.put("taxAgentId", e.getTaxAgentId());
// 是否属于"合并计税"的标记
map.put("consolidatedTaxation", StringUtils.isNotEmpty(taxAgentName) && consolidatedTaxSalaryAcctEmpIds.contains(e.getId()));
// 个税扣缴义务人的字段类型

View File

@ -0,0 +1,28 @@
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;
private Integer text;
}

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,43 @@ 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);
/**
* 联特表5 - 生成人员明细工资计提表
* @param salaryMonth
* @return
*/
String ltGenRymxgzjt(String salaryMonth);
/**
* 联特表6 - 生成人员明细工资实发表
* @param salaryMonth
* @return
*/
String ltGenRymxgzsf(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

@ -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

@ -315,6 +315,19 @@ public class SalaryEntityUtil {
return null;
}
/**
* String转Long
*
* @param obj
* @return
*/
public static Long string2LongDefault0(String obj) {
if (NumberUtils.isCreatable(obj)) {
return Long.valueOf(obj);
}
return 0L;
}
/**
* String转Integer
*

View File

@ -985,4 +985,96 @@ 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);
}
/**
* 联特表6 - 生成人员明细工资实发表
* @param request
* @param response
* @param salaryMonth
* @return
*/
@GET
@Path("/ltSalaryReport/genRymxgzsf")
@Produces(MediaType.APPLICATION_JSON)
public String ltGenRymxgzsf(@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)::ltGenRymxgzsf, salaryMonth);
}
/**********************************联特 报表end*********************************/
}

View File

@ -371,4 +371,51 @@ 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);
}
/**
* 联特表5 - 生成人员明细工资计提表
*/
public String ltGenRymxgzjt(String salaryMonth) {
return getSalaryAcctResultService(user).ltGenRymxgzjt(salaryMonth);
}
/**
* 联特表5 - 生成人员明细工资计提表
*/
public String ltGenRymxgzsf(String salaryMonth) {
return getSalaryAcctResultService(user).ltGenRymxgzsf(salaryMonth);
}
}