薪资回算功能,工资单部分

This commit is contained in:
Harryxzy 2022-12-06 15:29:08 +08:00
parent 3ff3fd8e44
commit c0d916c286
20 changed files with 318 additions and 76 deletions

View File

@ -16,4 +16,10 @@ public class SalaryTemplateSalaryItemSetGroupConstant {
* 无分类组id
*/
public static final String NO_TYPE_GROUP_ID = String.valueOf(222222222222222222L);
/**
* 已发补发
*/
public static final String REPLENISH_GROUP_ID = String.valueOf(333333333333333333L);
}

View File

@ -78,6 +78,7 @@ public class SalaryAcctResultReportBO {
.taxAgentId(e.getTaxAgentId())
.salaryItemId(e.getSalaryItemId())
.resultValue(e.getResultValue())
.originResultValue(e.getOriginResultValue())
.creator(e.getCreator())
.createTime(e.getCreateTime())
.updateTime(e.getUpdateTime())

View File

@ -45,6 +45,10 @@ public class SalaryAcctResultReportPO {
* 计算后的值
*/
private String resultValue;
/**
* 回算前的值
*/
private String originResultValue;
/**
* 创建人
*/

View File

@ -8,6 +8,7 @@ import com.engine.salary.entity.salaryBill.param.SalaryTemplateSaveParam;
import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO;
import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO;
import com.engine.salary.util.JsonUtil;
import com.engine.salary.util.SalaryI18nUtil;
import org.apache.commons.collections.CollectionUtils;
import java.util.Date;
@ -59,7 +60,7 @@ public class SalaryTemplateBO {
.build();
}
public static List<SalaryTemplateSalaryItemSetListDTO> convertSalarySobItemAggregateToSalaryItemSet(SalarySobItemAggregateDTO salarySobItemAggregateDTO, Long currentEmployeeId) {
public static List<SalaryTemplateSalaryItemSetListDTO> convertSalarySobItemAggregateToSalaryItemSet(SalarySobItemAggregateDTO salarySobItemAggregateDTO, Long currentEmployeeId, boolean isReplenish) {
List<SalaryTemplateSalaryItemSetListDTO> groups = new LinkedList<>();
if (salarySobItemAggregateDTO!=null) {
// 1.员工信息
@ -125,6 +126,31 @@ public class SalaryTemplateBO {
.items(items)
.build());
}
if (isReplenish) {
// 4.已发补发
if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(salarySobItemAggregateDTO.getBackCalcItems())) {
List<SalaryTemplateSalaryItemListDTO> items = new LinkedList<>();
salarySobItemAggregateDTO.getBackCalcItems().forEach(e -> {
items.add(
SalaryTemplateSalaryItemListDTO.builder()
.id(String.valueOf(e.getSalaryItemId()))
// .salaryItemId(String.valueOf(e.getSalaryItemId()))
.name(e.getName())
.sortedIndex(e.getSortedIndex())
.build()
);
});
groups.add(
SalaryTemplateSalaryItemSetListDTO.builder()
.groupId(SalaryTemplateSalaryItemSetGroupConstant.REPLENISH_GROUP_ID)
.groupName(SalaryI18nUtil.getI18nLabel(139698, "已发补发"))
.sortedIndex(groups.size() + 1)
.items(items)
.build());
}
}
}
return groups;
}

View File

@ -9,8 +9,6 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
/**
@ -113,4 +111,17 @@ public class SalarySendListDTO {
// 最后发送时间
@SalaryTableColumn(text = "最后发送时间", width = "15%", column = "lastSendTime")
private Date lastSendTime;
/**
* 发放状态0未冻结1已冻结
*/
private Integer sendStatus;
/**
* 核算类型0正常1补发
*/
private Integer salaryAcctType;
}

View File

@ -5,6 +5,7 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
/**
@ -22,5 +23,5 @@ public class SalaryTemplateBaseFormDTO {
private Map<String, Object> salaryTemplateBaseSet;
// 补发规则设置下拉列表
private Map<String, String> replenishRuleSetOption;
private List<Map<String, String>> replenishRuleSetOption;
}

View File

@ -31,6 +31,10 @@ public class SalaryTemplateListDTO {
@SalaryTableColumn(text = "工资单模板名称", width = "20%", column = "name")
private String name;
//补发工资单模板名称
@SalaryTableColumn(text = "补发工资单模板名称", width = "20%", column = "replenishName")
private String replenishName;
//所属薪资账套
@SalaryTableColumn(text = "所属薪资账套", width = "20%", column = "salarySob")

View File

@ -149,6 +149,9 @@
<if test="resultValue != null">
result_value,
</if>
<if test="originResultValue != null">
origin_result_value,
</if>
<if test="salaryAcctEmpId != null">
salary_acct_emp_id,
</if>
@ -205,6 +208,9 @@
<if test="resultValue != null">
#{resultValue},
</if>
<if test="originResultValue != null">
#{originResultValue},
</if>
<if test="salaryAcctEmpId != null">
#{salaryAcctEmpId},
</if>

View File

@ -34,6 +34,8 @@
</sql>
<sql id="salarySendColumn">
t1.id,
t1.send_status AS sendStatus,
t1.salary_acct_type AS salaryAcctType,
t2.salary_month AS salaryYearMonth,
t3.name AS salarySob,
t3.id AS salarySobId,
@ -83,7 +85,9 @@
salary_sob_id,
send_num,
send_total,
last_send_time
last_send_time,
send_status,
salary_acct_type
FROM hrsa_salary_send
WHERE delete_type = 0
AND id = #{id}
@ -140,7 +144,7 @@
<update id="batchHandleSalaryAcctTypeHistory">
update hrsa_salary_send
set salary_acct_type = 0
where send_status is NULL
where salary_acct_type is NULL
</update>

View File

@ -18,6 +18,9 @@
<result column="salary_item_null_status" property="salaryItemNullStatus"/>
<result column="salary_item_zero_status" property="salaryItemZeroStatus"/>
<result column="salary_item_setting" property="salaryItemSetting"/>
<result column="replenish_name" property="replenishName"/>
<result column="replenish_rule" property="replenishRule"/>
<result column="replenish_salary_item_setting" property="replenishSalaryItemSetting"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="creator" property="creator"/>
@ -43,6 +46,9 @@
, t.salary_item_null_status
, t.salary_item_zero_status
, t.salary_item_setting
, replenish_name
, replenish_rule
, replenish_item_setting
, t.create_time
, t.update_time
, t.creator
@ -277,6 +283,15 @@
<if test="salaryItemSetting != null and salaryItemSetting != ''">
AND salary_item_setting = #{salaryItemSetting}
</if>
<if test=" replenishName != null and replenishName != ''">
AND replenish_name = #{replenishName}
</if>
<if test="replenishRule != null and replenishRule != ''">
AND replenish_rule = #{replenishRule}
</if>
<if test="replenishSalaryItemSetting != null and replenishSalaryItemSetting != ''">
AND replenish_salary_item_setting = #{replenishSalaryItemSetting}
</if>
<if test="createTime != null and createTime != ''">
AND create_time = #{createTime}
</if>
@ -352,6 +367,15 @@
<if test="salaryItemSetting != null">
salary_item_setting=#{salaryItemSetting},
</if>
<if test="replenishName != null">
replenish_name=#{replenishName},
</if>
<if test="replenishRule != null">
replenish_rule=#{replenishRule},
</if>
<if test="replenishSalaryItemSetting != null">
replenish_salary_item_setting=#{replenishSalaryItemSetting},
</if>
<if test="createTime != null">
create_time=#{createTime},
</if>
@ -489,6 +513,15 @@
<if test="salaryItemSetting != null">
#{salaryItemSetting},
</if>
<if test="replenishName != null">
#{replenishName},
</if>
<if test="replenishRule != null">
#{replenishRule},
</if>
<if test="replenishSalaryItemSetting != null">
#{replenishSalaryItemSetting},
</if>
<if test="createTime != null">
#{createTime},
</if>
@ -561,6 +594,15 @@
<if test="salaryItemSetting != null">
salary_item_setting,
</if>
<if test="replenishName != null">
replenish_name,
</if>
<if test="replenishRule != null">
replenish_rule,
</if>
<if test="replenishSalaryItemSetting != null">
replenish_salary_item_setting,
</if>
<if test="createTime != null">
create_time,
</if>
@ -623,6 +665,15 @@
<if test="salaryItemSetting != null">
#{salaryItemSetting},
</if>
<if test="replenishName != null">
#{replenishName},
</if>
<if test="replenishRule != null">
#{replenishRule},
</if>
<if test="replenishSalaryItemSetting != null">
#{replenishSalaryItemSetting},
</if>
<if test="createTime != null">
#{createTime},
</if>

View File

@ -181,4 +181,13 @@ public interface SalaryAcctResultService {
* @date 2022/11/24 20:26
*/
void reCalc(Long id);
/**
* 根据薪资核算记录的id个税扣缴义务人查询薪资核算结果
*
* @param salaryAcctRecordIds 薪资核算记录的id
* @param salaryItemIds 薪资项目id
* @return
*/
List<SalaryAcctResultPO> listBySalaryAcctRecordIdsAndSalaryItemIds(Collection<Long> salaryAcctRecordIds, Collection<Long> salaryItemIds);
}

View File

@ -107,7 +107,7 @@ public interface SalarySendService {
* @param salaryTemplatePO
* @return
*/
List<SalaryTemplateSalaryItemListDTO> getSalaryItemsSetting(SalaryTemplatePO salaryTemplatePO);
List<SalaryTemplateSalaryItemListDTO> getSalaryItemsSetting(SalaryTemplatePO salaryTemplatePO, boolean isReplenish);
/**
* 构建详情列表

View File

@ -86,7 +86,7 @@ public interface SalaryTemplateService {
* @param salarySobId
* @return
*/
List<SalaryTemplateSalaryItemSetListDTO> getSalaryItemSet(Long salarySobId);
List<SalaryTemplateSalaryItemSetListDTO> getSalaryItemSet(Long salarySobId, boolean isReplenish);
/**
* 获取默认工资单模板

View File

@ -525,12 +525,14 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe
if (CollectionUtils.isEmpty(salaryAcctResultPOS)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99691, "尚未核算,请先核算后再归档"));
}
// 生成工资单
getSalarySendService(user).generateSalaryBill(salaryAcctRecordId);
// 更新薪资核算记录的状态
salaryAcctRecordPO.setStatus(SalaryAcctRecordStatusEnum.ARCHIVED.getValue());
salaryAcctRecordPO.setUpdateTime(new Date());
getSalaryAcctRecordMapper().updateIgnoreNull(salaryAcctRecordPO);
// 生成工资单
getSalarySendService(user).generateSalaryBill(salaryAcctRecordId);
// 记录日志
// String targetName = getLogTargetNameById(salaryAcctRecordId);

View File

@ -341,7 +341,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
boolean isBackCalc = Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), 1);
// 查询薪资核算所用的薪资账套的员工信息字段
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
// 查询薪资核算所用薪资账套的薪资项目 TODO 是否包含回算薪资项目 --不包含
// 查询薪资核算所用薪资账套的薪资项目
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
// 是否是回算
@ -352,7 +352,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
salaryItemIds.addAll(salarySobBackItemPOList.stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList()));
}
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
// 查询薪资核算结果 TODO: ?是否包含薪资回算项目结果? --包含
// 查询薪资核算结果
Set<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId);
List<SalaryAcctResultPO> salaryAcctResultPOS = listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
// 查询人员信息
@ -374,7 +374,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
}
// 查询公式详情
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
// 获取回算公式 TODO: ?是回算项目?
// 获取回算公式
if (isBackCalc) {
formulaIds.addAll(salarySobBackItemPOList.stream().map(SalarySobBackItemPO :: getFormulaId ).collect(Collectors.toList()));
}
@ -853,6 +853,15 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
batchUpdateOriginResultValue(salaryAcctResultPOS);
}
@Override
public List<SalaryAcctResultPO> listBySalaryAcctRecordIdsAndSalaryItemIds(Collection<Long> salaryAcctRecordIds, Collection<Long> salaryItemIds) {
if (CollectionUtils.isEmpty(salaryAcctRecordIds) || CollectionUtils.isEmpty(salaryItemIds) || Objects.equals( ((List)salaryItemIds).get(0), 0 ) ) {
return Collections.emptyList();
}
return SalaryAcctResultPOEncrypt.decryptList(getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).salaryItemIds(salaryItemIds).build()));
}
@Override
public void batchUpdateOriginResultValue(List<SalaryAcctResultPO> salaryAcctResultValues) {
int batchSize = 1000;

View File

@ -24,11 +24,14 @@ import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
import com.engine.salary.entity.salaryformula.dto.SalaryFormulaEmployeeDTO;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO;
import com.engine.salary.entity.salarysob.po.SalarySobPO;
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum;
import com.engine.salary.enums.salaryarchive.SalaryArchiveFieldTypeEnum;
import com.engine.salary.enums.salarybill.SalarySendStatusEnum;
import com.engine.salary.enums.salarybill.SalaryTemplateReplenishRuleEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.salaryacct.SalaryAcctEmployeeMapper;
import com.engine.salary.mapper.salaryacct.SalaryAcctRecordMapper;
@ -120,6 +123,22 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
return ServiceUtil.getService(SalarySysConfServiceImpl.class, user);
}
private SalarySobService getSalarySobService(User user) {
return ServiceUtil.getService(SalarySobServiceImpl.class, user);
}
private SalaryItemService getSalaryItemService(User user) {
return ServiceUtil.getService(SalaryItemServiceImpl.class, user);
}
private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) {
return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user);
}
private SalaryAcctResultService getSalaryAcctResultService(User user) {
return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user);
}
// @RpcReference
// private FileDownloadClient fileDownloadClient;
@ -189,23 +208,69 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
}
SalarySendPO sendPO = new SalarySendPO();
sendPO.setDeleteType(0);
sendPO.setSalaryAccountingId(salaryAccountingId);
List<SalarySendPO> salarySends = mapper.listSome(sendPO);
if (CollectionUtils.isNotEmpty(salarySends)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100499, "工资单已生成过,不可再重复生成"));
List<SalaryAcctEmployeePO> salaryAcctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(Collections.singletonList(salaryAccountingId));
// 根据人员id去重
salaryAcctEmployees = salaryAcctEmployees.stream()
.collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(SalaryAcctEmployeePO::getEmployeeId))), ArrayList::new));
// 1.回算如果是回算todo 要等原始核算发完或者上一个回算记录发完才行目前最多只有一个回算记录
if (acctRecords.get(0).getBackCalcStatus().equals(NumberUtils.INTEGER_ONE)) {
SalarySendPO sendPO = new SalarySendPO();
sendPO.setDeleteType(0);
sendPO.setSalaryAccountingId(salaryAccountingId);
List<SalarySendPO> salarySends = mapper.listSome(sendPO);
if (CollectionUtils.isEmpty(salarySends)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel( 139700, "还没有正常核算,不能进行回算"));
}
// todo 一般只有一个未冻结,同一个原始核算id后面如果有多级回算就会换成不同核算id
SalarySendPO salarySend = salarySends.stream().filter(s -> s.getSendStatus().equals(NumberUtils.INTEGER_ZERO)).findFirst().orElse(null);
// 根据工资单补发模板规则过滤人员,已发补发的合计项目不等于0的进行过滤
SalarySobPO salarySob = getSalarySobService(user).getById(acctRecords.get(0).getSalarySobId());
List<SalaryTemplatePO> salaryTemplates = getSalaryTemplateService(user)
.getDefaultTemplates(Arrays.asList(acctRecords.get(0).getSalarySobId(), salarySob == null ? 0L : salarySob.getId()));
// 如果有默认模板且规则不是全部
if (CollectionUtils.isNotEmpty(salaryTemplates) && StringUtils.isEmpty(salaryTemplates.get(0).getReplenishRule())) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel( 140649, "请维护补发工资单模板信息"));
}
Long backCalcItemId =
CollectionUtils.isNotEmpty(salaryTemplates) && !SalaryTemplateReplenishRuleEnum.ALL.getValue().equals(salaryTemplates.get(0).getReplenishRule()) ? Long
.parseLong(salaryTemplates.get(0).getReplenishRule()) : 0L;
SalaryItemPO salaryItem = getSalaryItemService(user).getById(backCalcItemId);
if (salaryItem != null && salaryItem.getDataType().equals(SalaryArchiveFieldTypeEnum.NUMBER.getValue())) {
// 目前是单个薪资项目
List<SalaryAcctResultPO> salaryAcctResultValues = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singleton(salaryAccountingId), Collections.singleton(backCalcItemId));
Set<Long> salaryAcctEmployeeIds = salaryAcctResultValues.stream()
.filter(salaryAcctResultPO -> SalaryEntityUtil.empty2Zero(salaryAcctResultPO.getResultValue()).compareTo(BigDecimal.ZERO)
!= 0)
.map(SalaryAcctResultPO::getSalaryAcctEmpId)
.collect(Collectors.toSet());
salaryAcctEmployees = salaryAcctEmployees.stream().filter(se -> salaryAcctEmployeeIds.contains(se.getId())).collect(Collectors.toList());
}
// 将未冻结的给冻结掉
if (salarySend != null) {
salarySend.setSendStatus(NumberUtils.INTEGER_ONE);
this.mapper.updateById(salarySend);
}
// 2.正常核算
} else {
SalarySendPO sendPO = new SalarySendPO();
sendPO.setDeleteType(0);
sendPO.setSalaryAccountingId(salaryAccountingId);
List<SalarySendPO> salarySends = mapper.listSome(sendPO);
if (CollectionUtils.isNotEmpty(salarySends)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100499, "工资单已生成过,不可再重复生成"));
}
}
SalaryAcctEmployeePO employeePO = new SalaryAcctEmployeePO();
employeePO.setDeleteType(0);
employeePO.setSalaryAcctRecordId(salaryAccountingId);
List<SalaryAcctEmployeePO> salaryAcctEmployees = getSalaryAcctEmployeeMapper().listSome(employeePO);
Long salarySendId = IdGenerator.generate();
SalaryAcctRecordPO salaryAcctRecord = acctRecords.get(0);
// 工资单模板类型0正常核算1是回算todo 后续可能还有别的算需要改这里
Integer templateType = salaryAcctRecord.getBackCalcStatus();
// 构建工资单发放数据
List<SalarySendInfoPO> salarySendInfos = salaryAcctEmployees.stream().map(m ->
SalarySendInfoPO.builder()
.id(IdGenerator.generate())
@ -216,6 +281,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
.salaryAcctRecordId(m.getSalaryAcctRecordId())
.sendStatus(SalarySendStatusEnum.UNSEND.getValue())
.salaryTemplate("")
.salaryAcctType(templateType)
.creator((long) user.getUID())
.createTime(new Date())
.updateTime(new Date())
@ -229,6 +295,8 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
.salarySobId(salaryAcctRecord.getSalarySobId())
.sendNum(0)
.sendTotal(salarySendInfos.size())
.sendStatus(NumberUtils.INTEGER_ZERO) // 未冻结
.salaryAcctType(templateType)
.lastSendTime(new Date())
.creator((long) user.getUID())
.createTime(new Date())
@ -336,7 +404,14 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
// 获取默认模板
List<SalaryTemplatePO> salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId()));
if (CollectionUtils.isNotEmpty(salaryTemplates)) {
template = salaryTemplates.get(0).getName();
// 是否是回算
SalaryAcctRecordPO salaryAcctRecord = getSalaryAcctRecordService(user).getById(salarySend.getSalaryAccountingId());
boolean isReplenish = salaryAcctRecord != null && Objects.equals(salaryAcctRecord.getBackCalcStatus(), (NumberUtils.INTEGER_ONE));
if(isReplenish){
template = salaryTemplates.get(0).getReplenishName();
}else{
template = salaryTemplates.get(0).getName();
}
}
return SalarySendBaseInfoDTO.builder()
@ -663,19 +738,28 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
* @return
*/
@Override
public List<SalaryTemplateSalaryItemListDTO> getSalaryItemsSetting(SalaryTemplatePO salaryTemplate) {
public List<SalaryTemplateSalaryItemListDTO> getSalaryItemsSetting(SalaryTemplatePO salaryTemplate, boolean isReplenish) {
List<SalaryTemplateSalaryItemListDTO> salaryItems = new ArrayList<>();
if (salaryTemplate == null) {
return salaryItems;
}
if (StringUtils.isNotEmpty(salaryTemplate.getSalaryItemSetting())) {
// 正常模板
if (!isReplenish && StringUtils.isNotEmpty(salaryTemplate.getSalaryItemSetting())) {
List<SalaryTemplateSalaryItemSetListDTO> salaryTemplateShowSetData = JsonUtil.parseList(salaryTemplate.getSalaryItemSetting(),
SalaryTemplateSalaryItemSetListDTO.class);
salaryTemplateShowSetData.stream().filter(f -> !f.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID)).forEach(e -> {
salaryItems.addAll(e.getItems());
});
}
// 补发模板
if (isReplenish && StringUtils.isNotEmpty(salaryTemplate.getReplenishSalaryItemSetting())) {
List<SalaryTemplateSalaryItemSetListDTO> salaryTemplateShowSetData = JsonUtil.parseList(salaryTemplate.getReplenishSalaryItemSetting(),
SalaryTemplateSalaryItemSetListDTO.class);
salaryTemplateShowSetData.stream().filter(f -> !f.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID)).forEach(e -> {
salaryItems.addAll(e.getItems());
});
}
return salaryItems;
}
@ -689,6 +773,10 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
Collection<Long> ids = param.getIds();
SalarySendPO salarySend = mapper.getById(salarySendId);
// 已经冻结不能操作
if (Objects.equals(salarySend.getSendStatus() , NumberUtils.INTEGER_ONE)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "工资单已冻结"));
}
if (salarySend == null) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在"));
}
@ -863,7 +951,9 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
private List<Map<String, Object>> getEnableSendList(SalarySendPO salarySend, Collection<Long> ids, SalaryTemplatePO salaryTemplate) {
// 1.根据模板获取薪资项目设置
List<SalaryTemplateSalaryItemListDTO> salaryItems = getSalaryItemsSetting(salaryTemplate);
SalaryAcctRecordPO salaryAcctRecord = getSalaryAcctRecordService(user).getById(salarySend.getSalaryAccountingId());
boolean isReplenish = salaryAcctRecord != null && Objects.equals(salaryAcctRecord.getBackCalcStatus(), (NumberUtils.INTEGER_ONE));
List<SalaryTemplateSalaryItemListDTO> salaryItems = getSalaryItemsSetting(salaryTemplate,isReplenish);
SalarySendDetailQueryParam queryParam = new SalarySendDetailQueryParam();
queryParam.setSalarySendId(salarySend.getId());
// 空就是所有
@ -1095,8 +1185,10 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
public XSSFWorkbook exportDetailList(SalarySendPO salarySend, SalarySendDetailQueryParam queryParam) {
// 1.根据模板获取薪资项目设置
SalaryAcctRecordPO salaryAcctRecord = getSalaryAcctRecordService(user).getById(salarySend.getSalaryAccountingId());
boolean isReplenish = salaryAcctRecord != null && Objects.equals(salaryAcctRecord.getBackCalcStatus(), (NumberUtils.INTEGER_ONE));
List<SalaryTemplatePO> salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId()));
List<SalaryTemplateSalaryItemListDTO> salaryItems = getSalaryItemsSetting(CollectionUtils.isNotEmpty(salaryTemplates) ? salaryTemplates.get(0) : null);
List<SalaryTemplateSalaryItemListDTO> salaryItems = getSalaryItemsSetting(CollectionUtils.isNotEmpty(salaryTemplates) ? salaryTemplates.get(0) : null , isReplenish);
// 2.获取基本数据
//排序配置

View File

@ -264,9 +264,9 @@ public class SalaryTemplateServiceImpl extends Service implements SalaryTemplate
}
@Override
public List<SalaryTemplateSalaryItemSetListDTO> getSalaryItemSet(Long salarySobId) {
public List<SalaryTemplateSalaryItemSetListDTO> getSalaryItemSet(Long salarySobId, boolean isReplenish) {
SalarySobItemAggregateDTO salarySobItemAggregate = getSalarySobItemService(user).getAggregateBySalarySobId(salarySobId);
return SalaryTemplateBO.convertSalarySobItemAggregateToSalaryItemSet(salarySobItemAggregate, new Long(user.getUID()));
return SalaryTemplateBO.convertSalarySobItemAggregateToSalaryItemSet(salarySobItemAggregate, new Long(user.getUID()), isReplenish);
}
@Override

View File

@ -14,7 +14,6 @@ import io.swagger.v3.oas.annotations.parameters.RequestBody;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.RequestParam;
import weaver.hrm.HrmUserVarify;
import weaver.hrm.User;
@ -209,9 +208,9 @@ public class SalaryBillController {
@GET
@Path("/template/getReplenishRuleSetOptions")
@Produces(MediaType.APPLICATION_JSON)
public String getReplenishRuleSetOptions(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestParam Long salarySobId) {
public String getReplenishRuleSetOptions(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam("salarySobId") Long salarySobId) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<Long,String>(user).run(getSalaryTemplateWrapper(user)::getReplenishRuleSetOptions, salarySobId);
return new ResponseResult<Long,List<Map<String, String>>>(user).run(getSalaryTemplateWrapper(user)::getReplenishRuleSetOptions, salarySobId);
}

View File

@ -17,20 +17,15 @@ import com.engine.salary.entity.salaryBill.dto.*;
import com.engine.salary.entity.salaryBill.param.*;
import com.engine.salary.entity.salaryBill.po.SalarySendPO;
import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
import com.engine.salary.entity.salarysob.po.SalarySobPO;
import com.engine.salary.entity.taxagent.dto.TaxAgentListDTO;
import com.engine.salary.enums.UserStatusEnum;
import com.engine.salary.enums.salarybill.SalarySendStatusEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.salarybill.SalarySendMapper;
import com.engine.salary.service.SalarySendService;
import com.engine.salary.service.SalarySobService;
import com.engine.salary.service.SalaryTemplateService;
import com.engine.salary.service.TaxAgentService;
import com.engine.salary.service.impl.SalarySendServiceImpl;
import com.engine.salary.service.impl.SalarySobServiceImpl;
import com.engine.salary.service.impl.SalaryTemplateServiceImpl;
import com.engine.salary.service.impl.TaxAgentServiceImpl;
import com.engine.salary.service.*;
import com.engine.salary.service.impl.*;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
@ -71,6 +66,11 @@ public class SalarySendWrapper extends Service {
return ServiceUtil.getService(SalarySobServiceImpl.class, user);
}
private SalaryAcctRecordService getSalaryAcctRecordService(User user) {
return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user);
}
/**
* 工资单发放列表
*
@ -119,6 +119,7 @@ public class SalarySendWrapper extends Service {
// 工资单模板
Optional<SalaryTemplatePO> optional = salaryTemplates.stream().filter(s -> s.getSalarySobId().equals(e.getSalarySobId())).findFirst();
if (optional.isPresent()) {
// todo 目前就一个回算那么没有冻结且是回算就展示补发名称
e.setTemplate(optional.get().getName());
e.setTemplateId(optional.get().getId());
}
@ -164,6 +165,7 @@ public class SalarySendWrapper extends Service {
idColumn.setDisplay(WeaBoolAttr.FALSE);
list.add(new WeaTableColumn("10%", "薪资所属月", "salaryYearMonth"));
list.add(new WeaTableColumn("35%", "薪资账套", "salarySob"));
list.add(new WeaTableColumn("25%", "次数", "acctTimes"));
list.add(new WeaTableColumn("25%", "工资单模板", "template"));
list.add(new WeaTableColumn("15%", "已发放", "sendSituation"));
list.add(new WeaTableColumn("15%", "最后发送时间", "lastSendTime"));
@ -478,9 +480,17 @@ public class SalarySendWrapper extends Service {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100510, "工资发放不存在"));
}
SalaryAcctRecordPO salaryAcctRecord = getSalaryAcctRecordService(user).getById(salarySend.getSalaryAccountingId());
boolean isReplenish = salaryAcctRecord != null && Objects.equals(salaryAcctRecord.getBackCalcStatus(), (NumberUtils.INTEGER_ONE));
// 1.根据模板获取薪资项目设置
List<SalaryTemplatePO> salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId()));
List<SalaryTemplateSalaryItemListDTO> salaryItems = getSalarySendService(user).getSalaryItemsSetting(CollectionUtils.isNotEmpty(salaryTemplates) ? salaryTemplates.get(0) : null);
SalarySobPO salarySob = getSalarySobService(user).getById(salarySend.getSalarySobId());
List<SalaryTemplatePO> salaryTemplates = getSalaryTemplateService(user)
.getDefaultTemplates(Arrays.asList(salarySend.getSalarySobId(), salarySob == null ? 0L : salarySob.getId()));
List<SalaryTemplateSalaryItemListDTO> salaryItems = getSalarySendService(user)
.getSalaryItemsSetting(CollectionUtils.isNotEmpty(salaryTemplates) ? salaryTemplates.get(0) : null, isReplenish);
// 2.获取基本数据
PageInfo<SalarySendDetailListDTO> pageInfo = getSalarySendService(user).salarySendInfoDetailListPage(queryParam);

View File

@ -70,6 +70,7 @@ public class SalaryTemplateWrapper extends Service {
String fields = " t.id" +
" , t.name" +
" , t.replenish_name as replenishName" +
" , s.name as salarySob" +
" , t.use_type as useType" +
" , t.description";
@ -137,7 +138,7 @@ public class SalaryTemplateWrapper extends Service {
SalaryTemplateBaseSetDTO salaryTemplateBaseSetDTO = new SalaryTemplateBaseSetDTO();
Map<String, String> replenishRuleSetOptionList = Collections.emptyMap();
List<Map<String, String>> replenishRuleSetOptionList = Collections.emptyList();
if (id != null) {
SalaryTemplatePO po = getSalaryTemplateService(user).getById(id);
if (po == null) {
@ -248,7 +249,11 @@ public class SalaryTemplateWrapper extends Service {
* @return
*/
public List<SalaryTemplateSalaryItemSetListDTO> getSalaryItemSet(Long salarySobId) {
return getSalaryTemplateService(user).getSalaryItemSet(salarySobId);
return getSalaryTemplateService(user).getSalaryItemSet(salarySobId, false);
}
public List<SalaryTemplateSalaryItemSetListDTO> getReplenishSalaryItemSet(Long salarySobId) {
return getSalaryTemplateService(user).getSalaryItemSet(salarySobId, true);
}
/**
@ -317,13 +322,13 @@ public class SalaryTemplateWrapper extends Service {
* @param salarySobId
* @return
*/
public Map<String, String> getReplenishRuleSetOptions(Long salarySobId) {
public List<Map<String, String>> getReplenishRuleSetOptions(Long salarySobId) {
if (salarySobId == null) {
return Collections.emptyMap();
return Collections.emptyList();
}
SalarySobPO salarySob = getSalarySobService(user).getById(salarySobId);
if (salarySob == null) {
return Collections.emptyMap();
return Collections.emptyList();
}
// 查询薪资账套的回算薪资项目
List<SalarySobBackItemPO> salarySobBackItems = getSalarySobBackItemService(user).listBySalarySobId(salarySobId);
@ -341,10 +346,11 @@ public class SalaryTemplateWrapper extends Service {
return map;
}).collect(Collectors.toList());
if(result!= null && result.size()>0){
return result.get(0);
}
return Collections.emptyMap();
return result;
// if(result!= null && result.size()>0){
// return result.get(0);
// }
// return Collections.emptyMap();
}
/**
@ -354,29 +360,30 @@ public class SalaryTemplateWrapper extends Service {
* @return
*/
public SalaryTemplateReplenishFormDTO getReplenishForm(ReplenishFormQueryParam replenishFormQueryParam) {
// Long id = replenishFormQueryParam.getId();
// // 补发薪资项目设置
// List<SalaryTemplateSalaryItemSetListDTO> replenishSalaryItemSetting;
// if (id != null) {
// SalaryTemplatePO po = salaryTemplateService.getById(id);
// if (po == null) {
// throw new SalaryRunTimeException(String.format(SalaryI18nUtil.getI18nLabel(100533, "工资单模板不存在")+"[id:%s]", id));
// }
// org.springframework.beans.BeanUtils.copyProperties(po, salaryTemplateReplenishSetDTO);
// if (StringUtils.isNotEmpty(po.getReplenishSalaryItemSetting())) {
// replenishSalaryItemSetting = JsonUtil.parseList(po.getReplenishSalaryItemSetting(), SalaryTemplateSalaryItemSetListDTO.class);
// } else {
// replenishSalaryItemSetting = this.getSalaryItemSet(salarySobId, true);
// }
// } else {
// replenishSalaryItemSetting = this.getSalaryItemSet(salarySobId, true);
// }
//
// return SalaryTemplateReplenishFormDTO.builder()
// .id(id)
// .replenishSalaryTemplateSalaryItemSet(replenishSalaryItemSetting)
// .build();
return null;
Long id = replenishFormQueryParam.getId();
SalaryTemplateReplenishFormDTO salaryTemplateReplenishSetDTO = new SalaryTemplateReplenishFormDTO();
// 补发薪资项目设置
List<SalaryTemplateSalaryItemSetListDTO> replenishSalaryItemSetting;
if (id != null) {
SalaryTemplatePO po = getSalaryTemplateService(user).getById(id);
if (po == null) {
throw new SalaryRunTimeException(String.format(SalaryI18nUtil.getI18nLabel(100533, "工资单模板不存在")+"[id:%s]", id));
}
BeanUtils.copyProperties(po, salaryTemplateReplenishSetDTO);
if (StringUtils.isNotEmpty(po.getReplenishSalaryItemSetting())) {
replenishSalaryItemSetting = JsonUtil.fromJson(po.getReplenishSalaryItemSetting(), List.class);
} else {
replenishSalaryItemSetting = getReplenishSalaryItemSet(replenishFormQueryParam.getSalarySobId());
}
} else {
replenishSalaryItemSetting = getReplenishSalaryItemSet(replenishFormQueryParam.getSalarySobId());
}
return SalaryTemplateReplenishFormDTO.builder()
.id(id)
.replenishSalaryTemplateSalaryItemSet(replenishSalaryItemSetting)
.build();
}
}