工资单预览
This commit is contained in:
parent
db391f01c4
commit
64e34d6d08
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
@ -1,7 +1,10 @@
|
|||
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.SalarySendGrantParam;
|
||||
import com.engine.salary.entity.salaryBill.po.SalarySendPO;
|
||||
import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
|
@ -52,6 +55,15 @@ public interface SalaryBillService {
|
|||
|
||||
String genPdfBeforeExport(SalaryExportPdfParam salaryExportPdfParam);
|
||||
|
||||
/**
|
||||
* 构建发放参数
|
||||
* @param salarySend
|
||||
* @param taxAgentName
|
||||
* @param salaryTemplate
|
||||
* @return
|
||||
*/
|
||||
SalaryBillSendDTO buildSendParams(SalarySendPO salarySend, String taxAgentName, SalaryTemplatePO salaryTemplate);
|
||||
|
||||
/**
|
||||
* 工资单撤回
|
||||
*
|
||||
|
|
|
|||
|
|
@ -218,4 +218,11 @@ public interface SalarySendService {
|
|||
List<SalarySendPO> getByIds(List<Long> salarySendId);
|
||||
|
||||
List<SalarySendPO> listSome(SalarySendPO param);
|
||||
|
||||
/**
|
||||
* 工资单预览
|
||||
* @param param
|
||||
* @return
|
||||
*/
|
||||
Map<String, Object> preview(SalaryPreviewParam param);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -337,7 +337,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService
|
|||
* @param salaryTemplate
|
||||
* @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);
|
||||
if (CollectionUtils.isEmpty(sendChannels)) {
|
||||
|
|
|
|||
|
|
@ -1834,4 +1834,190 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
|
|||
public List<SalarySendPO> listSome(SalarySendPO 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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -323,6 +323,20 @@ public class SalaryBillController {
|
|||
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前先进行校验 生成
|
||||
*
|
||||
* @param request
|
||||
* @param response
|
||||
* @return
|
||||
|
|
|
|||
|
|
@ -219,6 +219,10 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy
|
|||
return getSalarySendService(user).getBaseInfo(id);
|
||||
}
|
||||
|
||||
public Map<String, Object> preview(SalaryPreviewParam param) {
|
||||
return getSalarySendService(user).preview(param);
|
||||
}
|
||||
|
||||
/**
|
||||
* 工资单发放信息列表的高级搜索
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue