工资单预览

This commit is contained in:
钱涛 2024-06-13 17:46:37 +08:00
parent db391f01c4
commit 64e34d6d08
7 changed files with 257 additions and 1 deletions

View File

@ -0,0 +1,32 @@
package com.engine.salary.entity.salaryBill.param;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 工资单预览参数
* <p>Copyright: Copyright (c) 2024</p>
* <p>Company: 泛微软件</p>
*
* @author qiantao
* @version 1.0
**/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SalaryPreviewParam {
/**
* 工资单id
*/
private Long salaryInfoId;
/**
* 员工id
*/
private Long recipient;
}

View File

@ -1,7 +1,10 @@
package com.engine.salary.service; package com.engine.salary.service;
import com.engine.salary.entity.salaryBill.dto.SalaryBillSendDTO;
import com.engine.salary.entity.salaryBill.param.SalaryExportPdfParam; import com.engine.salary.entity.salaryBill.param.SalaryExportPdfParam;
import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam;
import com.engine.salary.entity.salaryBill.po.SalarySendPO;
import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -52,6 +55,15 @@ public interface SalaryBillService {
String genPdfBeforeExport(SalaryExportPdfParam salaryExportPdfParam); String genPdfBeforeExport(SalaryExportPdfParam salaryExportPdfParam);
/**
* 构建发放参数
* @param salarySend
* @param taxAgentName
* @param salaryTemplate
* @return
*/
SalaryBillSendDTO buildSendParams(SalarySendPO salarySend, String taxAgentName, SalaryTemplatePO salaryTemplate);
/** /**
* 工资单撤回 * 工资单撤回
* *

View File

@ -218,4 +218,11 @@ public interface SalarySendService {
List<SalarySendPO> getByIds(List<Long> salarySendId); List<SalarySendPO> getByIds(List<Long> salarySendId);
List<SalarySendPO> listSome(SalarySendPO param); List<SalarySendPO> listSome(SalarySendPO param);
/**
* 工资单预览
* @param param
* @return
*/
Map<String, Object> preview(SalaryPreviewParam param);
} }

View File

@ -337,7 +337,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService
* @param salaryTemplate * @param salaryTemplate
* @return * @return
*/ */
private SalaryBillSendDTO buildSendParams(SalarySendPO salarySend, String taxAgentName, SalaryTemplatePO salaryTemplate) { public SalaryBillSendDTO buildSendParams(SalarySendPO salarySend, String taxAgentName, SalaryTemplatePO salaryTemplate) {
// 发送通道 // 发送通道
Set<MessageChannelEnum> sendChannels = SalaryBillBO.buildSendChannels(salaryTemplate); Set<MessageChannelEnum> sendChannels = SalaryBillBO.buildSendChannels(salaryTemplate);
if (CollectionUtils.isEmpty(sendChannels)) { if (CollectionUtils.isEmpty(sendChannels)) {

View File

@ -1834,4 +1834,190 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
public List<SalarySendPO> listSome(SalarySendPO param) { public List<SalarySendPO> listSome(SalarySendPO param) {
return getSalarySendMapper().listSome(param); return getSalarySendMapper().listSome(param);
} }
@Override
public Map<String, Object> preview(SalaryPreviewParam param) {
Long salaryInfoId = param.getSalaryInfoId();
Long recipient = param.getRecipient();
if (salaryInfoId == null) {
throw new SalaryRunTimeException("工资单记录不存在!");
}
SalarySendInfoPO po = new SalarySendInfoPO();
po.setDeleteType(0);
po.setId(salaryInfoId);
List<SalarySendInfoPO> salarySendInfos = salarySendInfoMapper.listSome(po);
if (CollectionUtils.isEmpty(salarySendInfos)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100511, "工资单信息不存在"));
}
SalarySendInfoPO salarySendInfo = salarySendInfos.get(0);
// 获取默认模板信息
SalarySendPO salarySendPO = getSalarySendMapper().getById(salarySendInfo.getSalarySendId());
if (salarySendPO == null) {
throw new SalaryRunTimeException("工资单不存在");
}
SalarySendPO sendPo = new SalarySendPO();
sendPo.setDeleteType(0);
sendPo.setId(salarySendInfo.getSalarySendId());
List<SalarySendPO> salarySends = mapper.listSome(sendPo);
if (CollectionUtils.isEmpty(salarySends)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在"));
}
SalarySendPO salarySend = salarySends.get(0);
Date salaryMonth = salarySend.getSalaryMonth();
// 获取模板
SalarySobPO salarySob = getSalarySobService(user).getById(salarySend.getSalarySobId());
TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(salarySendInfo.getTaxAgentId());
List<SalaryTemplatePO> salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Arrays.asList(salarySend.getSalarySobId(), salarySob.getId()));
if (CollectionUtils.isEmpty(salaryTemplates)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100518, "没有默认模板,无法发送"));
}
SalaryBillSendDTO salaryBillSendDTO = getSalaryBillService(user).buildSendParams(sendPo, taxAgentPO.getName(), salaryTemplates.get(0));
SalaryTemplatePO salaryTemplate = salaryBillSendDTO.getSalaryTemplate();
if (salaryTemplate==null) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100513, "没有默认模板,无法查看"));
}
// 判断是否是补发
boolean isReplenish = NumberUtils.INTEGER_ONE.equals(salarySendInfo.getSalaryAcctType());
SalaryAcctResultPO acctPo = new SalaryAcctResultPO();
acctPo.setDeleteType(0);
acctPo.setSalaryAcctRecordId(salarySendInfo.getSalaryAcctRecordId());
acctPo.setEmployeeId(recipient);
List<SalaryAcctResultPO> salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(acctPo);
encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class);
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salarySendInfo.getSalaryAcctRecordId());
if (salaryAcctRecordPO == null) {
throw new SalaryRunTimeException("薪资核算记录不存在!");
}
List<Map<String, Object>> salaryAcctResultS = null;
if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), NumberUtils.INTEGER_ONE) && !isReplenish) {
// 该记录回算过,并且获取的不是回算后的工资单
salaryAcctResultS = salaryAcctResultPOS.stream().map(m -> {
Map<String, Object> map = new LinkedHashMap<>();
map.put("salaryItemId", m.getSalaryItemId());
map.put("resultValue", m.getOriginResultValue());
return map;
}).collect(Collectors.toList());
} else {
salaryAcctResultS = salaryAcctResultPOS.stream().map(m -> {
Map<String, Object> map = new LinkedHashMap<>();
map.put("salaryItemId", m.getSalaryItemId());
map.put("resultValue", m.getResultValue());
return map;
}).collect(Collectors.toList());
}
Map<String, Object> map = new LinkedHashMap<>();
map.put("tenantName", "");
map.put("sendTime", SalaryDateUtil.getFormatLocalDateTime(salarySendInfo.getSendTime()));
List<SalaryTemplateSalaryItemSetListDTO> listDTOS = JSONArray.parseArray(isReplenish ? salaryTemplate.getReplenishSalaryItemSetting() : salaryTemplate.getSalaryItemSetting(), SalaryTemplateSalaryItemSetListDTO.class);
Optional<SalaryTemplateSalaryItemSetListDTO> optionalEmployeeInformation = listDTOS.stream().filter(e -> SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID.equals(e.getGroupId())).findFirst();
SalaryTemplateSalaryItemSetListDTO employeeInformation = optionalEmployeeInformation.orElse(null);
List<SalaryTemplateSalaryItemSetListDTO> itemSetListDTOS = listDTOS.stream().filter(e -> !SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID.equals(e.getGroupId())).collect(Collectors.toList());
List<Map<String, Object>> finalSalaryAcctResultS = salaryAcctResultS;
itemSetListDTOS.stream().forEach(item -> {
item.getItems()
.forEach(e -> {
if (CollectionUtils.isEmpty(finalSalaryAcctResultS)) {
e.setSalaryItemValue("");
} else {
Object o = finalSalaryAcctResultS.stream()
.filter(f -> f.get("salaryItemId") != null && String.valueOf(f.get("salaryItemId")).equals(e.getSalaryItemId())).findFirst()
.orElse(new HashMap<>())
.get("resultValue");
e.setSalaryItemValue(o == null ? "" : (String) o);
}
});
});
/**
* 过滤空
*/
if (Objects.equals(1, salaryTemplate.getSalaryItemNullStatus())) {
for (SalaryTemplateSalaryItemSetListDTO itemSetListDTO : itemSetListDTOS) {
List<SalaryTemplateSalaryItemListDTO> items = itemSetListDTO.getItems();
List<SalaryTemplateSalaryItemListDTO> collect = items.stream().filter(item -> StringUtils.isNotBlank(item.getSalaryItemValue())).collect(Collectors.toList());
itemSetListDTO.setItems(collect);
}
}
/**
* 过滤0
*/
if (Objects.equals(1, salaryTemplate.getSalaryItemZeroStatus())) {
for (SalaryTemplateSalaryItemSetListDTO itemSetListDTO : itemSetListDTOS) {
List<SalaryTemplateSalaryItemListDTO> items = itemSetListDTO.getItems();
List<SalaryTemplateSalaryItemListDTO> collect = items.stream()
.filter(item -> SalaryEntityUtil.string2BigDecimal(item.getSalaryItemValue()) == null
|| BigDecimal.ZERO.compareTo(SalaryEntityUtil.string2BigDecimal(item.getSalaryItemValue())) != 0)
.collect(Collectors.toList());
itemSetListDTO.setItems(collect);
}
}
DataCollectionEmployee simpleEmployee = getSalaryEmployeeService(user).getEmployeeById(salarySendInfo.getEmployeeId());
buildEmployeeInfo(employeeInformation, simpleEmployee, taxAgentPO.getName(), SalaryAcctResultBO.buildEmployeeFieldName());
map.put("employeeInformation", employeeInformation);
map.put("salaryGroups", itemSetListDTOS);
salaryTemplate.setTheme(getBillTitle(salaryTemplate.getTheme(), salaryMonth, recipient));
// 工资单水印文本型动态变量 == 处理
handleSalaryWatermark(salaryTemplate, salarySendInfo, recipient);
map.put("salaryTemplate", salaryTemplate);
map.put("salaryAcctResult", salaryAcctResultS);
// 工资单确认按钮
if (NumberUtils.compare(salaryTemplate.getAckFeedbackStatus(), 1) == 0) {
// 开启了工资单确认
Integer ackStatus = salarySendInfo.getBillConfirmStatus();
if (ackStatus == null || ackStatus != BillConfimStatusEnum.CONFIRMED.getValue()) {
map.put("showAck", "1");
} else {
map.put("showAck", "0");
}
map.put("sendEmployeeId", salarySendInfo.getSendEmployeeId());
} else {
map.put("showAck", "0");
}
// 工资单反馈
if (NumberUtils.compare(salaryTemplate.getFeedbackStatus(), 1) == 0) {
// 开启了工资单反馈按钮
Integer confirmStatus = salarySendInfo.getBillConfirmStatus();
map.put("showFeedback", "1");
// 除非确认状态为已确认否则可以一直反馈
if (NumberUtils.compare(salaryTemplate.getAckFeedbackStatus(), 1) == 0 && confirmStatus != null && confirmStatus == BillConfimStatusEnum.CONFIRMED.getValue()) {
map.put("showFeedback", "0");
}
map.put("sendEmployeeId", salarySendInfo.getSendEmployeeId());
} else {
map.put("showFeedback", "0");
}
// 记录查看日志
String targetName = taxAgentPO.getName() + "-" + SalaryDateUtil.getFormatYearMonth(salarySendInfo.getSalaryMonth());
LoggerContext<SalaryItemPO> loggerContext = new LoggerContext<>();
loggerContext.setUser(user);
loggerContext.setTargetId(String.valueOf(salarySendInfo.getId()));
loggerContext.setTargetName(targetName);
loggerContext.setOperateType(OperateTypeEnum.READ.getValue());
loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(0, "预览工资单") + ": " + targetName + " " + salaryInfoId);
loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(0, "预览工资单") + ": " + targetName);
SalaryElogConfig.mySalaryBillLoggerTemplate.write(loggerContext);
return map;
}
} }

View File

@ -323,6 +323,20 @@ public class SalaryBillController {
return new ResponseResult<Long, SalarySendBaseInfoDTO>(user).run(getSalarySendWrapper(user)::getBaseInfo, id); return new ResponseResult<Long, SalarySendBaseInfoDTO>(user).run(getSalarySendWrapper(user)::getBaseInfo, id);
} }
/**
* 预览工资单
*
* @param param
* @return
*/
@POST
@Path("/preview")
@Produces(MediaType.APPLICATION_JSON)
public String preview(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryPreviewParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<SalaryPreviewParam, Map<String, Object>>(user).run(getSalarySendWrapper(user)::preview, param);
}
/** /**
* 工资单发放信息列表的高级搜索 * 工资单发放信息列表的高级搜索
* *
@ -563,6 +577,7 @@ public class SalaryBillController {
/** /**
* 下载pdf前先进行校验 生成 * 下载pdf前先进行校验 生成
*
* @param request * @param request
* @param response * @param response
* @return * @return

View File

@ -219,6 +219,10 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy
return getSalarySendService(user).getBaseInfo(id); return getSalarySendService(user).getBaseInfo(id);
} }
public Map<String, Object> preview(SalaryPreviewParam param) {
return getSalarySendService(user).preview(param);
}
/** /**
* 工资单发放信息列表的高级搜索 * 工资单发放信息列表的高级搜索
* *