Merge branch 'release/2.14.1.2405.01' into custom/宁波精华

This commit is contained in:
钱涛 2024-05-14 17:05:26 +08:00
commit 325c2eccba
13 changed files with 217 additions and 71 deletions

View File

@ -1,5 +1,5 @@
log=false
defaultCloseNonStandard149=true
AESEncryptScrect=990EB004A1C862721C1513AE90038C9E
version=2.13.1.2404.02
version=2.14.1.2405.01
openFormulaForcedEditing=false

View File

@ -33,6 +33,7 @@ import weaver.common.MessageUtil;
import weaver.conn.RecordSet;
import weaver.email.EmailWorkRunnable;
import weaver.file.ImageFileManager;
import weaver.general.Util;
import weaver.hrm.company.SubCompanyComInfo;
import weaver.hrm.resource.ResourceComInfo;
@ -199,6 +200,7 @@ public class SalaryBillBO {
log.error("资源异常", e);
}
companyName = subCompanyComInfo.getSubCompanyname(resourceComInfo.getSubCompanyID(employeeId + ""));
companyName = Util.formatMultiLang(companyName);
}
}
@ -372,7 +374,7 @@ public class SalaryBillBO {
.replace("{薪资所属月}", SalaryDateUtil.getFormatYearMonth(salaryBillSendParam.getSalaryDate()));
for (SalaryTemplateSalaryItemListDTO item : salaryBillSendParam.getEmployeeInformation().getItems()) {
content = content.replace("{" + item.getName() + "}", item.getSalaryItemValue());
content = content.replace("{" + item.getName() + "}", Util.null2String(item.getSalaryItemValue()));
}
for (SalaryTemplateSalaryItemSetListDTO salaryTemplateSalaryItemSetListDTO : salaryBillSendParam.getSalaryItemSetList()) {

View File

@ -7,11 +7,14 @@ import com.engine.salary.entity.salaryformula.po.FormulaVar;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.enums.salaryformula.SalaryFormulaReferenceEnum;
import com.engine.salary.util.SalaryEntityUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@ -91,10 +94,9 @@ public class ExpressFormulaBO {
* @param formulaVarValueMap 公式变量的值
* @return
*/
public static List<FormulaVar> buildFormulaVar4Accounting(ExpressFormula expressFormula, Map<String, String> formulaVarValueMap) {
List<FormulaVar> formulaVars = Collections.emptyList();
formulaVars = expressFormula.getParameters();
for (FormulaVar formulaVar : formulaVars) {
public static List<FormulaVar> buildFormulaVar4Accounting(ExpressFormula expressFormula, Map<String, String> formulaVarValueMap) throws JsonProcessingException {
List<FormulaVar> formulaVars = new ArrayList<>();
for (FormulaVar formulaVar : expressFormula.getParameters()) {
// 公式变量的值
String formulaVarValue = formulaVarValueMap.getOrDefault(formulaVar.getFieldId(), StringUtils.EMPTY);
// 如果公式的返回值类型为number公式中的变量的值如果为空公式运行的时候会报错所以需要替换成0
@ -103,7 +105,11 @@ public class ExpressFormulaBO {
} else if (StringUtils.isEmpty(formulaVarValue) && "string".equals(formulaVar.getFieldType())) {
formulaVarValue = "";
}
formulaVar.setContent(formulaVarValue);
ObjectMapper objectMapper = new ObjectMapper();
FormulaVar copyVar = objectMapper.readValue(objectMapper.writeValueAsString(formulaVar), FormulaVar.class);
copyVar.setContent(formulaVarValue);
formulaVars.add(copyVar);
}
return formulaVars;
}

View File

@ -5,7 +5,6 @@ import com.engine.salary.entity.salaryformula.dto.SalaryFormulaEmployeeDTO;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobBackItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
import com.engine.salary.enums.SalaryRoundingModeEnum;
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
import com.engine.salary.util.JsonUtil;
import com.engine.salary.util.SalaryEntityUtil;
@ -14,8 +13,10 @@ import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* 薪资核算公式变量
@ -32,8 +33,8 @@ public class SalaryAcctFormulaBO {
*
* @param value
* @param salaryItem
* @param salarySobBackItems 薪资账套回算项目List
* @param salarySobBackItemMap 薪资账套回算项目Map
* @param salarySobBackItems 薪资账套回算项目List
* @param salarySobBackItemMap 薪资账套回算项目Map
* @param salaryItemIdKeySalarySobItemPOMap 薪资账套下薪资项目Map
* @return
*/
@ -55,33 +56,13 @@ public class SalaryAcctFormulaBO {
.orElse(salaryItem.getRoundingMode());
Integer salaryItemPattern = Optional.ofNullable(salaryItemIdKeySalarySobItemPOMap.get(salaryItem.getId())).map(SalarySobItemPO::getPattern)
.orElse(salaryItem.getPattern());
if(CollectionUtils.isNotEmpty(salarySobBackItems) && salarySobBackItemMap.containsKey(salaryItem.getId())){
if (CollectionUtils.isNotEmpty(salarySobBackItems) && salarySobBackItemMap.containsKey(salaryItem.getId())) {
// 薪资项目是回算项目
salaryItemRoundingMode = salarySobBackItemMap.get(salaryItem.getId()).getRoundingMode();
salaryItemPattern = salarySobBackItemMap.get(salaryItem.getId()).getPattern();
}
BigDecimal bigDecimalValue = SalaryEntityUtil.empty2Zero(value);
RoundingMode roundingMode = RoundingMode.HALF_UP;
if (Objects.equals(salaryItemRoundingMode, SalaryRoundingModeEnum.ROUND_UP.getValue())) {
roundingMode = RoundingMode.UP;
}
if (Objects.equals(salaryItemRoundingMode, SalaryRoundingModeEnum.ROUND_DOWN.getValue())) {
roundingMode = RoundingMode.DOWN;
}
//见分取角只取保留小数后一位向上舍入
if (Objects.equals(salaryItemRoundingMode, SalaryRoundingModeEnum.CEILING.getValue())) {
bigDecimalValue = bigDecimalValue.setScale(salaryItemPattern + 1, RoundingMode.FLOOR);
roundingMode = RoundingMode.UP;
}
//向上取偶
if (Objects.equals(salaryItemRoundingMode, SalaryRoundingModeEnum.UP_EVEN.getValue())) {
bigDecimalValue = bigDecimalValue.setScale(0, RoundingMode.UP);
int number = bigDecimalValue.intValue();
if (number % 2 != 0) {
bigDecimalValue = bigDecimalValue.add(BigDecimal.valueOf(1));
}
}
return bigDecimalValue.setScale(salaryItemPattern, roundingMode).toPlainString();
return SalaryEntityUtil.carryRule(salaryItemPattern, salaryItemRoundingMode, bigDecimalValue).toString();
}
/**

View File

@ -307,7 +307,7 @@ public class SalaryAcctManager extends Service {
ProgressDTO initProgress = new ProgressDTO().setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")).setTitleLabelId(97515L).setTotalQuantity(salaryAcctEmployeePOS.size() * 2 + 1).setCalculatedQuantity(0).setProgress(BigDecimal.ZERO).setStatus(true).setMessage(StringUtils.EMPTY);
getSalaryAcctProgressService(user).initProgress("SUPPLEMENT_ACCT_PROGRESS_" + salaryAcctRecordId, initProgress);
// 12对薪资核算人员进行拆分
List<List<SalaryAcctEmployeePO>> partition = Lists.partition(salaryAcctEmployeePOS, 5000);
List<List<SalaryAcctEmployeePO>> partition = Lists.partition(salaryAcctEmployeePOS, 100);
// 12.1监控子线程的任务执行
CountDownLatch childMonitor = new CountDownLatch(partition.size());
// 12.2记录子线程的执行结果
@ -345,7 +345,7 @@ public class SalaryAcctManager extends Service {
getSalaryAcctCalculateService(user).calculate(salaryAcctCalculateBO, simpleEmployee, finalSalarySobBackItems);
}
};
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.HRM, "salaryAcctCalculateV2", localRunnable);
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.HRM, "salaryAcctCalculate", localRunnable);
}
// 13等待所有子线程执行完毕
childMonitor.await();

View File

@ -23,6 +23,10 @@ public interface SalaryBillService {
*/
Map<String, Object> grant(SalarySendGrantParam queryParam);
Map<String, Object> reGenPdf(SalarySendGrantParam queryParam);
/**
* 获取内容
* @param sendId
@ -46,6 +50,8 @@ public interface SalaryBillService {
String exportPdf(SalaryExportPdfParam param);
String genPdfBeforeExport(SalaryExportPdfParam salaryExportPdfParam);
/**
* 工资单撤回
*

View File

@ -461,7 +461,7 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
if (fixedNum == 0) {
fixedNum = 3;
}
for (int i = 0; i < fixedNum; i++) {
for (int i = 0; i < fixedNum && i < columnList.size(); i++) {
columnList.get(i).setFixed("left");
}
}

View File

@ -797,7 +797,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
ProgressDTO initProgress = new ProgressDTO().setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")).setTitleLabelId(97515L).setTotalQuantity(salaryAcctEmployeePOS.size() * 2 + 1).setCalculatedQuantity(0).setProgress(BigDecimal.ZERO).setStatus(true).setMessage(StringUtils.EMPTY);
getSalaryAcctProgressService(user).initProgress(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId(), initProgress);
// 12对薪资核算人员进行拆分
List<List<SalaryAcctEmployeePO>> partition = Lists.partition(salaryAcctEmployeePOS, 5000);
List<List<SalaryAcctEmployeePO>> partition = Lists.partition(salaryAcctEmployeePOS, 100);
// 12.1监控子线程的任务执行
CountDownLatch childMonitor = new CountDownLatch(partition.size());
// 12.2记录子线程的执行结果
@ -808,7 +808,26 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
TaxDeclarationFunctionEnum taxDeclarationFunction = getSalarySysConfService(user).getTaxDeclaration();
// 12.5多线程运算运算结果存放在临时表中
for (List<SalaryAcctEmployeePO> acctEmployeePOS : partition) {
SalaryAcctCalculateBO salaryAcctCalculateBO = new SalaryAcctCalculateBO().setSalaryAcctRecordPO(salaryAcctRecordPO).setSalarySobPO(salarySobPO).setSalarySobCycleDTO(salarySobCycleDTO).setOtherSalaryAcctRecordPOS(otherSalaryAcctRecordPOS).setSalaryAcctLockResultPOS(MapUtils.emptyIfNull(acctResults)).setLockSalaryItemIds(lockSalaryItemIds).setSalarySobItemPOS(salarySobItemPOS).setSalaryItemIdWithPriorityList(salarySobItemsWithPriority).setExpressFormulas(expressFormulas).setSalaryItemPOS(salaryItemPOS).setSalarySobAdjustRulePOS(salarySobAdjustRulePOS).setWelfareColumns(MapUtils.emptyIfNull(welfareColumns)).setAttendQuoteFieldListDTOS(attendQuoteFieldListDTOS).setSalaryAcctEmployeePOS(acctEmployeePOS).setIssuedFieldIds(issuedFieldIds).setChildMonitor(childMonitor).setResults(calculateResults).setCalculateKey(calculateKey).setTaxDeclarationFunction(taxDeclarationFunction);
SalaryAcctCalculateBO salaryAcctCalculateBO = new SalaryAcctCalculateBO()
.setSalaryAcctRecordPO(salaryAcctRecordPO)
.setSalarySobPO(salarySobPO)
.setSalarySobCycleDTO(salarySobCycleDTO)
.setOtherSalaryAcctRecordPOS(otherSalaryAcctRecordPOS)
.setSalaryAcctLockResultPOS(MapUtils.emptyIfNull(acctResults))
.setLockSalaryItemIds(lockSalaryItemIds)
.setSalarySobItemPOS(salarySobItemPOS)
.setSalaryItemIdWithPriorityList(salarySobItemsWithPriority)
.setExpressFormulas(expressFormulas)
.setSalaryItemPOS(salaryItemPOS)
.setSalarySobAdjustRulePOS(salarySobAdjustRulePOS)
.setWelfareColumns(MapUtils.emptyIfNull(welfareColumns))
.setAttendQuoteFieldListDTOS(attendQuoteFieldListDTOS)
.setSalaryAcctEmployeePOS(acctEmployeePOS)
.setIssuedFieldIds(issuedFieldIds)
.setChildMonitor(childMonitor)
.setResults(calculateResults)
.setCalculateKey(calculateKey)
.setTaxDeclarationFunction(taxDeclarationFunction);
List<SalarySobBackItemPO> finalSalarySobBackItems = salarySobBackItems;
LocalRunnable localRunnable = new LocalRunnable() {
@Override
@ -816,7 +835,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
getSalaryAcctCalculateService(user).calculate(salaryAcctCalculateBO, simpleEmployee, finalSalarySobBackItems);
}
};
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.HRM, "salaryAcctCalculateV2", localRunnable);
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.HRM, "salaryAcctCalculate", localRunnable);
}
// 13等待所有子线程执行完毕
childMonitor.await();

View File

@ -1,5 +1,6 @@
package com.engine.salary.service.impl;
import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.api.formmode.mybatis.util.SqlProxyHandle;
@ -37,6 +38,7 @@ import com.engine.salary.util.JsonUtil;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.pdf.HtmlToPdf;
import com.google.common.collect.Lists;
import com.weaver.util.threadPool.ThreadPoolUtil;
import com.weaver.util.threadPool.constant.ModulePoolEnum;
@ -200,6 +202,44 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService
return new HashMap<>();
}
/**
* 对于已经发送的工资单重新生成pdf
* @param param
* @return
*/
@Override
public Map<String, Object> reGenPdf(SalarySendGrantParam param) {
// 1.检查和获取工资单发放
SalarySendPO salarySend = checkAndGetSalarySend(param.getSalarySendId());
// 获取默认模板
SalarySobPO salarySob = getSalarySobService(user).getById(salarySend.getSalarySobId());
List<SalaryTemplatePO> salaryTemplates = salarySob == null ? Lists.newArrayList() : getSalaryTemplateService(user).getDefaultTemplates(Arrays.asList(salarySend.getSalarySobId(), salarySob.getId()));
SalaryTemplatePO salaryTemplate = salaryTemplates.get(0);
List<Long> ids = param.getIds();
if (param.getSalarySendRangeIds() != null) {
//如果传了范围id则使用范围id发放
ids = getSalarySendRangeService(user)
.getSendInfoIdsBySendId(salarySend.getId(), param.getSalarySendRangeIds(), SalarySendGrantTypeEnum.GRANT);
if (ids.isEmpty()) {// 由于查出来是空的会导致全部发放在此进行拦截
throw new SalaryRunTimeException("工资发放范围内没有匹配员工");
}
}
try {
TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(salarySob.getTaxAgentId());
// 1.构建发送参数
SalaryBillSendDTO salaryBillSendParam = buildSendParams(salarySend, taxAgentPO.getName(), salaryTemplate);
// 2.获取可发送的列表此步最耗时需要解密核算数据
List<Integer> sendStatusList = Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue(), SalarySendStatusEnum.ALREADYSEND.getValue());
List<Map<String, Object>> enableSendList = getEnableSendList(salarySend, ids, salaryBillSendParam, sendStatusList);
//生成pdf
genPdf(salaryBillSendParam, enableSendList, true);
getProgressService(user).finish(SalaryCacheKey.SALARY_GRANT_PROGRESS + "_" + salarySend.getId(), true);
} catch (Exception e) {
log.info("发送出错:{}", e.getMessage(), e);
}
return new HashMap<>();
}
/**
* 处理发送
@ -221,13 +261,14 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService
SalaryBillSendDTO salaryBillSendParam = buildSendParams(salarySend, taxAgentPO.getName(), salaryTemplate);
// 2.获取可发送的列表此步最耗时需要解密核算数据
List<Map<String, Object>> enableSendList = getEnableSendList(salarySend, ids, salaryBillSendParam);
List<Integer> sendStatusList = Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue());
List<Map<String, Object>> enableSendList = getEnableSendList(salarySend, ids, salaryBillSendParam, sendStatusList);
// 3.发送消息先修改数据再发消息避免出错后无法撤回
List<Long> successIds = sendMessage(enableSendList, salaryBillSendParam);
//生成pdf
genPdf(salaryBillSendParam, enableSendList);
genPdf(salaryBillSendParam, enableSendList, false);
// 4.发放
grantSendInfo(successIds, salarySend, salaryTemplate, salaryBillSendParam);
@ -250,35 +291,44 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService
}
}
private void genPdf(SalaryBillSendDTO salaryBillSendParam, List<Map<String, Object>> enableSendList) {
private void genPdf(SalaryBillSendDTO salaryBillSendParam, List<Map<String, Object>> enableSendList, boolean isSync) {
if (GEN_PDF) {
LocalRunnable localRunnable = new LocalRunnable() {
@Override
public void execute() {
// 获取人员完整信息
Map<String, DataCollectionEmployee> allEmployeeMap = getEmployeeWholeInfo(enableSendList);
//生成工资单pdf
enableSendList.forEach(e -> {
// 构建人员信息
SalaryBillBO.buildEmployeeInfo(salaryBillSendParam, allEmployeeMap.get(e.get("employeeId").toString()));
SalaryBillBO.genPdf(e, salaryBillSendParam);
});
if (isSync) {
genPdf(salaryBillSendParam, enableSendList);
} else {
LocalRunnable localRunnable = new LocalRunnable() {
@Override
public void execute() {
genPdf(salaryBillSendParam, enableSendList);
}
};
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "salaryBillGenPdf", localRunnable);
}
//合并工资单pdf
//1先获取所有工资单
Long id = salaryBillSendParam.getSalarySend().getId();
List<SalarySendInfoPO> salarySendInfos = getSalarySendInfoMapper().listSome(SalarySendInfoPO.builder().salarySendId(id).sendStatus(1).build());
//2工资单pdf转为路径
String yyyyMM = SalaryDateUtil.getFormatYearMonth(salaryBillSendParam.getSalaryDate());
List<String> filesToMerge = salarySendInfos.stream().map(po -> HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id + File.separator + po.getId() + ".pdf").collect(Collectors.toList());
String pdfPath = HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id + File.separator + id + ".pdf";
SalaryBillBO.mergePdf(pdfPath, filesToMerge);
}
};
ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "salaryBillGenPdf", localRunnable);
}
}
private void genPdf(SalaryBillSendDTO salaryBillSendParam, List<Map<String, Object>> enableSendList) {
// 获取人员完整信息
Map<String, DataCollectionEmployee> allEmployeeMap = getEmployeeWholeInfo(enableSendList);
//生成工资单pdf
enableSendList.forEach(e -> {
// 构建人员信息
SalaryBillBO.buildEmployeeInfo(salaryBillSendParam, allEmployeeMap.get(e.get("employeeId").toString()));
SalaryBillBO.genPdf(e, salaryBillSendParam);
});
//合并工资单pdf
//1先获取所有工资单
Long id = salaryBillSendParam.getSalarySend().getId();
List<SalarySendInfoPO> salarySendInfos = getSalarySendInfoMapper().listSome(SalarySendInfoPO.builder().salarySendId(id).sendStatus(1).build());
//2工资单pdf转为路径
String yyyyMM = SalaryDateUtil.getFormatYearMonth(salaryBillSendParam.getSalaryDate());
List<String> filesToMerge = salarySendInfos.stream().map(po -> HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id + File.separator + po.getId() + ".pdf").collect(Collectors.toList());
String pdfPath = HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id + File.separator + id + ".pdf";
SalaryBillBO.mergePdf(pdfPath, filesToMerge);
}
/**
* 构建发送参数
*
@ -394,12 +444,12 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService
* @param ids
* @return
*/
private List<Map<String, Object>> getEnableSendList(SalarySendPO salarySend, List<Long> ids, SalaryBillSendDTO salaryBillSendParam) {
private List<Map<String, Object>> getEnableSendList(SalarySendPO salarySend, List<Long> ids, SalaryBillSendDTO salaryBillSendParam, List<Integer> sendStatus) {
SalarySendInfoQueryParam queryParam = new SalarySendInfoQueryParam();
queryParam.setSalarySendId(salarySend.getId());
// 空就是所有
queryParam.setIds(ids);
queryParam.setSendStatuss(Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue()));
queryParam.setSendStatuss(sendStatus);
// 2.获取基本数据
List<SalarySendInfoListDTO> list = Lists.newArrayList();
if (CollectionUtils.isEmpty(ids)) {
@ -500,6 +550,57 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService
return path;
}
@Override
public String genPdfBeforeExport(SalaryExportPdfParam param) {
// 先判断对应路径下是否存在pdf
SalarySendPO salarySend = checkAndGetSalarySend(param.getSalarySendId());
String yearMonth = SalaryDateUtil.getFormatYearMonth(salarySend.getSalaryMonth());
String pdfPath = HrmSalaryPayrollConf.GEN_PATH + File.separator + yearMonth + File.separator + salarySend.getId() + File.separator + "%s" + ".pdf";
Long id = param.getId();
if (id == null) {
pdfPath = String.format(pdfPath, param.getSalarySendId());
} else {
pdfPath = String.format(pdfPath, id);
}
File file = new File(pdfPath);
if (file.exists()) {
return "success";
}
// 判断对应路径下是否存在html
String htmlPath = HrmSalaryPayrollConf.GEN_PATH + File.separator + yearMonth + File.separator + salarySend.getId() + File.separator + "%s" + ".html";
if (id == null) {
htmlPath = String.format(htmlPath, param.getSalarySendId());
} else {
htmlPath = String.format(htmlPath, id);
}
file = new File(htmlPath);
if (file.exists()) {
// 将html转成pdf
FileUtil.del(pdfPath);
HtmlToPdf.convert(HrmSalaryPayrollConf.TO_PDF_TOOL_PATH, htmlPath, pdfPath);
mergePdf(param, yearMonth);
return "success";
}
// 先生成html再生成pdf
SalarySendGrantParam grantParam = SalarySendGrantParam.builder().salarySendId(param.getSalarySendId()).ids(Collections.singletonList(param.getId())).build();
reGenPdf(grantParam);
return "success";
}
private void mergePdf(SalaryExportPdfParam param, String yearMonth) {
//合并工资单pdf
//1先获取所有工资单
Long salarySendId = param.getSalarySendId();
List<SalarySendInfoPO> salarySendInfos = getSalarySendInfoMapper().listSome(SalarySendInfoPO.builder().salarySendId(salarySendId).sendStatus(1).build());
//2工资单pdf转为路径
List<String> filesToMerge = salarySendInfos.stream().map(po -> HrmSalaryPayrollConf.GEN_PATH + yearMonth + File.separator + salarySendId + File.separator + po.getId() + ".pdf").collect(Collectors.toList());
String pdfPath = HrmSalaryPayrollConf.GEN_PATH + yearMonth + File.separator + salarySendId + File.separator + salarySendId + ".pdf";
SalaryBillBO.mergePdf(pdfPath, filesToMerge);
}
public List<Map<String, Object>> getSendInfoList(Long sendId, List<Long> ids) {
SalarySendPO salarySend = getSalarySendMapper().getById(sendId);

View File

@ -426,8 +426,11 @@ public class SalaryItemServiceImpl extends Service implements SalaryItemService
Set<Long> salarySobIds = SalaryEntityUtil.properties(salarySobItemList, SalarySobItemPO::getSalarySobId);
List<SalarySobPO> salarySobs = getSalarySobService(user).listByIds(salarySobIds);
// 获取能够管理的义务人
Set<Long> taxAgentIds = SalaryEntityUtil.properties(getTaxAgentService(user).listAllTaxAgentsAsAdmin(Long.valueOf(user.getUID())), TaxAgentPO::getId);
salarySobs = salarySobs.stream().filter(sob -> taxAgentIds.contains(sob.getTaxAgentId())).collect(Collectors.toList());
Boolean isChief = getTaxAgentService(user).isChief(Long.valueOf(user.getUID()));
if (!isChief) {
Set<Long> taxAgentIds = SalaryEntityUtil.properties(getTaxAgentService(user).listAllTaxAgentsAsAdmin(Long.valueOf(user.getUID())), TaxAgentPO::getId);
salarySobs = salarySobs.stream().filter(sob -> taxAgentIds.contains(sob.getTaxAgentId())).collect(Collectors.toList());
}
return salarySobs.stream().map(m -> {
Map<String, Object> map = new HashMap<>();
map.put("id", String.valueOf(m.getId()));

View File

@ -560,6 +560,30 @@ public class SalaryBillController {
//
// }
/**
* 下载pdf前先进行校验 生成
* @param request
* @param response
* @return
*/
@GET
@Path("/genPdfBeforeExport")
@Produces(MediaType.APPLICATION_JSON)
public String genPdfBeforeExport(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
SalaryExportPdfParam salaryExportPdfParam = new SalaryExportPdfParam();
String id = request.getParameter("id");
if (StringUtils.isNotBlank(id)) {
salaryExportPdfParam.setId(Long.valueOf(id));
}
String salarySendId = request.getParameter("salarySendId");
if (StringUtils.isNotBlank(salarySendId)) {
salaryExportPdfParam.setSalarySendId(Long.valueOf(salarySendId));
}
return new ResponseResult<SalaryExportPdfParam, String>(user).run(getSalarySendWrapper(user)::genPdfBeforeExport, salaryExportPdfParam);
}
@GET
@Path("/exportPdf")
public Response downloadPdfFile(@Context HttpServletRequest request, @Context HttpServletResponse response) {

View File

@ -69,7 +69,7 @@ public class SalaryComparisonResultWrapper extends Service {
if (fixedNum == 0) {
fixedNum = 3;
}
for (int i = 0; i < fixedNum; i++) {
for (int i = 0; i < fixedNum && i < weaTableColumns.size(); i++) {
weaTableColumns.get(i).setFixed("left");
}
}

View File

@ -742,4 +742,8 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy
public Map<String, String> getToken(Long uid) {
return SalaryTokenUtil.GetToken( uid);
}
public String genPdfBeforeExport(SalaryExportPdfParam salaryExportPdfParam) {
return getSalaryBillService(user).genPdfBeforeExport(salaryExportPdfParam);
}
}