2022-04-12 10:11:53 +08:00
|
|
|
|
package com.engine.salary.service.impl;
|
|
|
|
|
|
|
2023-06-14 15:51:26 +08:00
|
|
|
|
import cn.hutool.core.lang.Validator;
|
2023-07-11 15:29:13 +08:00
|
|
|
|
import com.alibaba.fastjson.JSON;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import com.alibaba.fastjson.JSONArray;
|
2022-04-14 09:08:04 +08:00
|
|
|
|
import com.api.formmode.mybatis.util.SqlProxyHandle;
|
2022-06-06 13:56:47 +08:00
|
|
|
|
import com.cloudstore.dev.api.bean.MessageBean;
|
2023-03-20 17:36:29 +08:00
|
|
|
|
import com.cloudstore.dev.api.bean.MessageType;
|
2022-06-06 13:56:47 +08:00
|
|
|
|
import com.cloudstore.dev.api.util.Util_Message;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import com.engine.common.util.ServiceUtil;
|
|
|
|
|
|
import com.engine.core.impl.Service;
|
|
|
|
|
|
import com.engine.salary.biz.SalarySendBiz;
|
|
|
|
|
|
import com.engine.salary.biz.SalarySendInfoBiz;
|
2023-05-08 09:27:20 +08:00
|
|
|
|
import com.engine.salary.constant.SalaryArchiveConstant;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import com.engine.salary.constant.SalaryItemConstant;
|
|
|
|
|
|
import com.engine.salary.constant.SalaryTemplateSalaryItemSetGroupConstant;
|
2022-12-12 16:42:44 +08:00
|
|
|
|
import com.engine.salary.encrypt.EncryptUtil;
|
2022-04-21 14:46:45 +08:00
|
|
|
|
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
|
2023-06-13 10:02:11 +08:00
|
|
|
|
import com.engine.salary.entity.salaryBill.bo.SalaryBillBO;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import com.engine.salary.entity.salaryBill.dto.*;
|
|
|
|
|
|
import com.engine.salary.entity.salaryBill.param.*;
|
|
|
|
|
|
import com.engine.salary.entity.salaryBill.po.SalarySendInfoPO;
|
|
|
|
|
|
import com.engine.salary.entity.salaryBill.po.SalarySendPO;
|
|
|
|
|
|
import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO;
|
2023-04-28 16:04:52 +08:00
|
|
|
|
import com.engine.salary.entity.salaryacct.bo.SalaryAcctFormulaBO;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import com.engine.salary.entity.salaryacct.bo.SalaryAcctResultBO;
|
2023-03-15 16:00:37 +08:00
|
|
|
|
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultQueryParam;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
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;
|
2022-12-06 15:29:08 +08:00
|
|
|
|
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO;
|
2023-04-28 16:04:52 +08:00
|
|
|
|
import com.engine.salary.entity.salarysob.po.SalarySobBackItemPO;
|
|
|
|
|
|
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import com.engine.salary.entity.salarysob.po.SalarySobPO;
|
2022-05-31 16:41:11 +08:00
|
|
|
|
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum;
|
2022-12-06 15:29:08 +08:00
|
|
|
|
import com.engine.salary.enums.salaryarchive.SalaryArchiveFieldTypeEnum;
|
2023-07-11 15:29:13 +08:00
|
|
|
|
import com.engine.salary.enums.salarybill.BillConfimStatusEnum;
|
|
|
|
|
|
import com.engine.salary.enums.salarybill.BillReadStatusEnum;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import com.engine.salary.enums.salarybill.SalarySendStatusEnum;
|
2022-12-06 15:29:08 +08:00
|
|
|
|
import com.engine.salary.enums.salarybill.SalaryTemplateReplenishRuleEnum;
|
2023-04-28 16:04:52 +08:00
|
|
|
|
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
|
2022-11-29 14:36:37 +08:00
|
|
|
|
import com.engine.salary.enums.salarysend.SalarySendGrantTypeEnum;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import com.engine.salary.exception.SalaryRunTimeException;
|
|
|
|
|
|
import com.engine.salary.mapper.salaryacct.SalaryAcctEmployeeMapper;
|
|
|
|
|
|
import com.engine.salary.mapper.salaryacct.SalaryAcctRecordMapper;
|
|
|
|
|
|
import com.engine.salary.mapper.salaryacct.SalaryAcctResultMapper;
|
2022-05-09 11:18:54 +08:00
|
|
|
|
import com.engine.salary.mapper.salarybill.SalarySendInfoMapper;
|
|
|
|
|
|
import com.engine.salary.mapper.salarybill.SalarySendMapper;
|
2022-04-21 14:46:45 +08:00
|
|
|
|
import com.engine.salary.service.*;
|
2022-09-26 18:51:17 +08:00
|
|
|
|
import com.engine.salary.sys.entity.vo.OrderRuleVO;
|
|
|
|
|
|
import com.engine.salary.sys.service.SalarySysConfService;
|
|
|
|
|
|
import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import com.engine.salary.util.JsonUtil;
|
|
|
|
|
|
import com.engine.salary.util.SalaryDateUtil;
|
2022-09-21 19:08:44 +08:00
|
|
|
|
import com.engine.salary.util.SalaryEntityUtil;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import com.engine.salary.util.SalaryI18nUtil;
|
2022-12-08 15:45:15 +08:00
|
|
|
|
import com.engine.salary.util.db.MapperProxyFactory;
|
2022-04-14 19:32:09 +08:00
|
|
|
|
import com.engine.salary.util.excel.ExcelUtil;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import com.engine.salary.util.page.PageInfo;
|
2022-06-22 19:26:05 +08:00
|
|
|
|
import com.engine.salary.util.page.SalaryPageUtil;
|
2022-07-27 09:27:47 +08:00
|
|
|
|
import com.google.common.collect.Lists;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import dm.jdbc.util.IdGenerator;
|
|
|
|
|
|
import org.apache.commons.beanutils.BeanUtils;
|
|
|
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
2023-07-11 15:29:13 +08:00
|
|
|
|
import org.apache.commons.lang3.ObjectUtils;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
2022-12-02 17:35:14 +08:00
|
|
|
|
import org.apache.commons.lang3.math.NumberUtils;
|
2022-04-14 19:32:09 +08:00
|
|
|
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
|
|
import org.slf4j.LoggerFactory;
|
2023-06-14 15:51:26 +08:00
|
|
|
|
import weaver.common.MessageUtil;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import weaver.hrm.User;
|
2023-03-02 17:11:42 +08:00
|
|
|
|
import weaver.hrm.company.SubCompanyComInfo;
|
|
|
|
|
|
import weaver.hrm.resource.ResourceComInfo;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
|
2023-03-20 17:36:29 +08:00
|
|
|
|
import java.io.IOException;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
|
|
|
|
import java.lang.reflect.Method;
|
2022-09-21 19:08:44 +08:00
|
|
|
|
import java.math.BigDecimal;
|
2022-04-21 14:46:45 +08:00
|
|
|
|
import java.text.SimpleDateFormat;
|
2023-06-14 15:51:26 +08:00
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
|
import java.time.ZoneOffset;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
import java.util.*;
|
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
2023-06-14 15:51:26 +08:00
|
|
|
|
import static com.engine.salary.cache.SalaryCacheKey.SALARY_CACHE_SMS_CODE;
|
|
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @Description: 工资单发放
|
|
|
|
|
|
* @Author: wangxiangzhong
|
|
|
|
|
|
* @Date: 2021-12-11 11:28
|
|
|
|
|
|
*/
|
|
|
|
|
|
public class SalarySendServiceImpl extends Service implements SalarySendService {
|
|
|
|
|
|
|
|
|
|
|
|
private static final Logger log = LoggerFactory.getLogger(SalarySendServiceImpl.class);
|
|
|
|
|
|
|
2022-12-12 16:42:44 +08:00
|
|
|
|
private EncryptUtil encryptUtil = new EncryptUtil();
|
|
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
private SalarySendBiz mapper = new SalarySendBiz();
|
|
|
|
|
|
private SalarySendInfoBiz salarySendInfoMapper = new SalarySendInfoBiz();
|
|
|
|
|
|
|
2022-11-25 10:53:23 +08:00
|
|
|
|
private SalarySendRangeService getSalarySendRangeService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SalarySendRangeServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
|
|
|
|
|
|
private SalaryTemplateService getSalaryTemplateService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SalaryTemplateServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-09 11:18:54 +08:00
|
|
|
|
private SalarySendMapper getSalarySendMapper() {
|
|
|
|
|
|
return SqlProxyHandle.getProxy(SalarySendMapper.class);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
|
|
|
|
|
|
private SalaryAcctRecordService getSalaryAcctRecordService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private SalaryAcctRecordMapper getSalaryAcctRecordMapper() {
|
|
|
|
|
|
return SqlProxyHandle.getProxy(SalaryAcctRecordMapper.class);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private SalaryAcctEmployeeMapper getSalaryAcctEmployeeMapper() {
|
|
|
|
|
|
return SqlProxyHandle.getProxy(SalaryAcctEmployeeMapper.class);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-09-21 19:08:44 +08:00
|
|
|
|
//
|
2022-04-12 10:11:53 +08:00
|
|
|
|
private SalaryAcctResultMapper getSalaryAcctResultMapper() {
|
|
|
|
|
|
return SqlProxyHandle.getProxy(SalaryAcctResultMapper.class);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-31 21:05:59 +08:00
|
|
|
|
private TaxAgentService getTaxAgentService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
|
2022-04-12 10:11:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-21 14:46:45 +08:00
|
|
|
|
private SalaryEmployeeService getSalaryEmployeeService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-09 11:18:54 +08:00
|
|
|
|
private SalarySendInfoMapper getSalarySendInfoMapper() {
|
|
|
|
|
|
return SqlProxyHandle.getProxy(SalarySendInfoMapper.class);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-09-26 18:51:17 +08:00
|
|
|
|
private SalarySysConfService getSalarySysConfService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SalarySysConfServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-06 15:29:08 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-04-28 16:04:52 +08:00
|
|
|
|
private SalarySobItemService getSalarySobItemService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SalarySobItemServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private SalarySobBackItemService getSalarySobBackItemService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SalarySobBackItemServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-05-08 09:27:20 +08:00
|
|
|
|
private SalaryBillService getSalaryBillService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SalaryBillServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-09-26 18:51:17 +08:00
|
|
|
|
|
2023-06-14 15:51:26 +08:00
|
|
|
|
private SalaryCacheService getSalaryCacheService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SalaryCacheServiceImpl.class, user);
|
|
|
|
|
|
}
|
2022-04-12 10:11:53 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public SalarySendPO getById(Long salarySendId) {
|
|
|
|
|
|
return mapper.getById(salarySendId);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<Long> findReAccountingIdsByAcctIds(List<Long> salaryAccountingIds, String tenantKey) {
|
|
|
|
|
|
// 校验salaryAccountingId
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salaryAccountingIds)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100497, "核算id必传"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// List<SalarySendPO> salarySends = new LambdaQueryChainWrapper<>(mapper)
|
|
|
|
|
|
// .eq(SalarySendPO::getDeleteType, 0)
|
|
|
|
|
|
// .eq(SalarySendPO::getSendNum, 0)
|
|
|
|
|
|
// .in(SalarySendPO::getSalaryAccountingId, salaryAccountingIds)
|
|
|
|
|
|
// .list();
|
|
|
|
|
|
|
|
|
|
|
|
Map<String, Object> condition = new HashMap<>();
|
|
|
|
|
|
condition.put("deleteType", 0);
|
|
|
|
|
|
condition.put("sendNum", 0);
|
|
|
|
|
|
condition.put("salaryAccountingIds", salaryAccountingIds);
|
|
|
|
|
|
List<SalarySendPO> salarySends = mapper.listSomeWithCondition(condition);
|
|
|
|
|
|
|
|
|
|
|
|
return salarySends.stream().map(SalarySendPO::getSalaryAccountingId).collect(Collectors.toList());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-21 16:45:03 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public String generateSalaryBill(Long salaryAccountingId) {
|
|
|
|
|
|
// 校验salaryAccountingId
|
|
|
|
|
|
if (salaryAccountingId == null) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100497, "核算id必传"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SalaryAcctRecordPO recordPo = new SalaryAcctRecordPO();
|
|
|
|
|
|
recordPo.setDeleteType(0);
|
|
|
|
|
|
recordPo.setId(salaryAccountingId);
|
|
|
|
|
|
recordPo.setStatus(SalaryAcctRecordStatusEnum.ARCHIVED.getValue());
|
|
|
|
|
|
List<SalaryAcctRecordPO> acctRecords = getSalaryAcctRecordMapper().listSome(recordPo);
|
|
|
|
|
|
// 检查核算的归档记录
|
|
|
|
|
|
if (CollectionUtils.isEmpty(acctRecords)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100498, "核算记录不存在"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-12-06 15:29:08 +08:00
|
|
|
|
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 要等原始核算发完或者上一个回算记录发完才行,目前最多只有一个回算记录
|
2022-12-07 15:27:20 +08:00
|
|
|
|
if (Objects.equals(acctRecords.get(0).getBackCalcStatus(), (NumberUtils.INTEGER_ONE))) {
|
2022-12-06 15:29:08 +08:00
|
|
|
|
SalarySendPO sendPO = new SalarySendPO();
|
|
|
|
|
|
sendPO.setDeleteType(0);
|
|
|
|
|
|
sendPO.setSalaryAccountingId(salaryAccountingId);
|
|
|
|
|
|
List<SalarySendPO> salarySends = mapper.listSome(sendPO);
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salarySends)) {
|
2023-02-13 17:25:13 +08:00
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(139700, "还没有正常核算,不能进行回算"));
|
2022-12-06 15:29:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
// 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())) {
|
2023-02-13 17:25:13 +08:00
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(140649, "请维护补发工资单模板信息"));
|
2022-12-06 15:29:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
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);
|
2022-12-07 18:00:31 +08:00
|
|
|
|
mapper.updateById(salarySend);
|
2022-12-06 15:29:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
// 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, "工资单已生成过,不可再重复生成"));
|
|
|
|
|
|
}
|
2022-04-21 16:45:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Long salarySendId = IdGenerator.generate();
|
|
|
|
|
|
SalaryAcctRecordPO salaryAcctRecord = acctRecords.get(0);
|
2022-12-06 15:29:08 +08:00
|
|
|
|
// 工资单模板类型:0,正常核算,1是回算,todo 后续可能还有别的算,需要改这里
|
|
|
|
|
|
Integer templateType = salaryAcctRecord.getBackCalcStatus();
|
2022-04-21 16:45:03 +08:00
|
|
|
|
|
2022-12-06 15:29:08 +08:00
|
|
|
|
// 构建工资单发放数据
|
2022-04-21 16:45:03 +08:00
|
|
|
|
List<SalarySendInfoPO> salarySendInfos = salaryAcctEmployees.stream().map(m ->
|
2022-09-21 19:08:44 +08:00
|
|
|
|
SalarySendInfoPO.builder()
|
|
|
|
|
|
.id(IdGenerator.generate())
|
|
|
|
|
|
.salarySendId(salarySendId)
|
|
|
|
|
|
.employeeId(m.getEmployeeId())
|
|
|
|
|
|
.salaryMonth(m.getSalaryMonth())
|
|
|
|
|
|
.taxAgentId(m.getTaxAgentId())
|
|
|
|
|
|
.salaryAcctRecordId(m.getSalaryAcctRecordId())
|
|
|
|
|
|
.sendStatus(SalarySendStatusEnum.UNSEND.getValue())
|
|
|
|
|
|
.salaryTemplate("")
|
2022-12-06 15:29:08 +08:00
|
|
|
|
.salaryAcctType(templateType)
|
2022-09-21 19:08:44 +08:00
|
|
|
|
.creator((long) user.getUID())
|
|
|
|
|
|
.createTime(new Date())
|
|
|
|
|
|
.updateTime(new Date())
|
|
|
|
|
|
.build()
|
2022-04-21 16:45:03 +08:00
|
|
|
|
).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
|
|
SalarySendPO salarySend = SalarySendPO.builder()
|
2022-09-21 19:08:44 +08:00
|
|
|
|
.id(salarySendId)
|
|
|
|
|
|
.salaryMonth(salaryAcctRecord.getSalaryMonth())
|
|
|
|
|
|
.salaryAccountingId(salaryAccountingId)
|
|
|
|
|
|
.salarySobId(salaryAcctRecord.getSalarySobId())
|
|
|
|
|
|
.sendNum(0)
|
|
|
|
|
|
.sendTotal(salarySendInfos.size())
|
2022-12-06 15:29:08 +08:00
|
|
|
|
.sendStatus(NumberUtils.INTEGER_ZERO) // 未冻结
|
|
|
|
|
|
.salaryAcctType(templateType)
|
2022-09-21 19:08:44 +08:00
|
|
|
|
.lastSendTime(new Date())
|
|
|
|
|
|
.creator((long) user.getUID())
|
|
|
|
|
|
.createTime(new Date())
|
|
|
|
|
|
.updateTime(new Date())
|
|
|
|
|
|
.build();
|
2022-04-21 16:45:03 +08:00
|
|
|
|
// 插入工资单发放记录
|
|
|
|
|
|
mapper.insert(salarySend);
|
|
|
|
|
|
// 插入工资单人员记录
|
|
|
|
|
|
salarySendInfoMapper.batchInsert(salarySendInfos);
|
|
|
|
|
|
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
2022-04-12 10:11:53 +08:00
|
|
|
|
|
2022-05-09 11:18:54 +08:00
|
|
|
|
@Override
|
2022-12-02 17:35:14 +08:00
|
|
|
|
public void revokeSalaryBill(SalaryAcctRecordPO salaryAcctRecord) {
|
2022-05-09 11:18:54 +08:00
|
|
|
|
// 校验salaryAccountingId
|
2022-12-02 17:35:14 +08:00
|
|
|
|
// if (salaryAcctRecord == null) {
|
|
|
|
|
|
// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100497, "核算id必传"));
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
// SalaryAcctRecordPO po = SalaryAcctRecordPO.builder().id(salaryAccountingId).build();
|
|
|
|
|
|
// List<SalaryAcctRecordPO> acctRecords = getSalaryAcctRecordMapper().listSome(po);
|
2022-05-09 11:18:54 +08:00
|
|
|
|
// 检查核算的归档记录
|
2022-12-02 17:35:14 +08:00
|
|
|
|
if (salaryAcctRecord == null) {
|
2022-05-09 11:18:54 +08:00
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100498, "核算记录不存在"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-02 17:35:14 +08:00
|
|
|
|
SalarySendPO build = SalarySendPO.builder().salaryAccountingId(salaryAcctRecord.getId()).deleteType(0).build();
|
2022-05-09 11:18:54 +08:00
|
|
|
|
List<SalarySendPO> salarySends = getSalarySendMapper().listSome(build);
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salarySends)) {
|
2022-06-22 19:26:05 +08:00
|
|
|
|
return;
|
|
|
|
|
|
// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100505, "工资单不存在"));
|
2022-05-09 11:18:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-02 17:35:14 +08:00
|
|
|
|
SalarySendPO salarySend;
|
2023-02-13 17:25:13 +08:00
|
|
|
|
if (salaryAcctRecord.getBackCalcStatus() != null && salaryAcctRecord.getBackCalcStatus().equals(NumberUtils.INTEGER_ONE)) {
|
2022-12-02 17:35:14 +08:00
|
|
|
|
// todo 一般只有一个未冻结,同一个原始核算id,后面如果有多级回算,就会换成不同核算id
|
|
|
|
|
|
salarySend = salarySends.stream().filter(s -> s.getSendStatus().equals(NumberUtils.INTEGER_ZERO)).findFirst().orElse(null);
|
2022-12-07 18:00:31 +08:00
|
|
|
|
// if (salarySend != null && salarySend.getSendNum() < salarySend.getSendTotal()) {
|
|
|
|
|
|
// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(139702, "正常原始核算或上一个回算尚未全部发送完成,不能进行撤回"));
|
|
|
|
|
|
// }
|
2022-12-02 17:35:14 +08:00
|
|
|
|
if (salarySend != null) {
|
|
|
|
|
|
// 将上一版本未冻结的给冻结掉
|
|
|
|
|
|
salarySend.setSendStatus(NumberUtils.INTEGER_ONE);
|
|
|
|
|
|
getSalarySendMapper().updateIgnoreNull(salarySend);
|
|
|
|
|
|
}
|
|
|
|
|
|
// 已经回算的删除 todo 以后多级回算注意要修改
|
|
|
|
|
|
salarySend = salarySends.stream().filter(s -> s.getSalaryAcctType() != null && s.getSalaryAcctType().equals(NumberUtils.INTEGER_ONE)).findFirst().orElse(null);
|
|
|
|
|
|
handleDelSalaryBill(salarySend);
|
|
|
|
|
|
// 2.正常核算处理
|
|
|
|
|
|
} else {
|
|
|
|
|
|
salarySend = salarySends.stream().filter(s -> s.getSendStatus().equals(NumberUtils.INTEGER_ZERO)).findFirst().orElse(null);
|
|
|
|
|
|
handleDelSalaryBill(salarySend);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void handleDelSalaryBill(SalarySendPO salarySend) {
|
|
|
|
|
|
if (salarySend == null) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2022-05-09 11:18:54 +08:00
|
|
|
|
// 已发送工资单
|
|
|
|
|
|
SalarySendInfoPO sendInfo = SalarySendInfoPO.builder()
|
|
|
|
|
|
.deleteType(0)
|
|
|
|
|
|
.salarySendId(salarySend.getId())
|
2022-12-02 17:35:14 +08:00
|
|
|
|
.sendStatus(SalarySendStatusEnum.ALREADYSEND.getValue())
|
|
|
|
|
|
.salaryAcctType(NumberUtils.INTEGER_ZERO).build();
|
2022-05-09 11:18:54 +08:00
|
|
|
|
List<SalarySendInfoPO> salarySendInfos = getSalarySendInfoMapper().listSome(sendInfo);
|
2023-02-13 17:25:13 +08:00
|
|
|
|
if ((salarySend.getSendNum() > 0 || CollectionUtils.isNotEmpty(salarySendInfos)) && Objects.equals(salarySend.getSalaryAcctType(), NumberUtils.INTEGER_ONE)) {
|
2022-12-19 18:03:17 +08:00
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100507, "补发工资单已经发放,不可进行回算"));
|
2023-02-13 17:25:13 +08:00
|
|
|
|
} else if (salarySend.getSendNum() > 0 || CollectionUtils.isNotEmpty(salarySendInfos)) {
|
2022-12-02 17:35:14 +08:00
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100507, "工资单已经发放,不可撤销,可以进行回算"));
|
2022-05-09 11:18:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
// 删除工资单
|
|
|
|
|
|
SalarySendPO salarySendPO = SalarySendPO.builder()
|
|
|
|
|
|
.id(salarySend.getId())
|
|
|
|
|
|
.sendNum(0)
|
|
|
|
|
|
.deleteType(1)
|
|
|
|
|
|
.build();
|
|
|
|
|
|
getSalarySendMapper().updateIgnoreNull(salarySendPO);
|
|
|
|
|
|
// 删除工资单发放
|
|
|
|
|
|
SalarySendInfoPO infoPO = SalarySendInfoPO.builder()
|
|
|
|
|
|
.salarySendId(salarySend.getId())
|
|
|
|
|
|
.deleteType(1)
|
|
|
|
|
|
.build();
|
|
|
|
|
|
getSalarySendInfoMapper().updateGrantWithdraw(infoPO, salarySend.getId(), null, null);
|
2022-12-02 17:35:14 +08:00
|
|
|
|
|
2022-05-09 11:18:54 +08:00
|
|
|
|
}
|
2022-04-12 10:11:53 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public PageInfo<SalarySendListDTO> listPage(SalarySendQueryParam queryParam) {
|
|
|
|
|
|
List<SalarySendListDTO> list = mapper.list(queryParam);
|
|
|
|
|
|
PageInfo<SalarySendListDTO> pageInfo = new PageInfo<>(list, SalarySendListDTO.class);
|
|
|
|
|
|
return pageInfo;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public SalarySendBaseInfoDTO getBaseInfo(Long id) {
|
|
|
|
|
|
SalarySendPO salarySend = mapper.getById(id);
|
|
|
|
|
|
if (salarySend == null) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在"));
|
|
|
|
|
|
}
|
|
|
|
|
|
Long salaryAcctId = salarySend.getSalaryAccountingId();
|
|
|
|
|
|
SalarySobCycleDTO salarySobCycleDTO = getSalaryAcctRecordService(user).getSalarySobCycleById(salaryAcctId);
|
|
|
|
|
|
String template = "";
|
|
|
|
|
|
// 获取默认模板
|
|
|
|
|
|
List<SalaryTemplatePO> salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId()));
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(salaryTemplates)) {
|
2022-12-06 15:29:08 +08:00
|
|
|
|
// 是否是回算
|
2023-02-13 17:25:13 +08:00
|
|
|
|
if (Objects.equals(salarySend.getSalaryAcctType(), NumberUtils.INTEGER_ONE)) {
|
2022-12-06 15:29:08 +08:00
|
|
|
|
template = salaryTemplates.get(0).getReplenishName();
|
2023-02-13 17:25:13 +08:00
|
|
|
|
} else {
|
2022-12-06 15:29:08 +08:00
|
|
|
|
template = salaryTemplates.get(0).getName();
|
|
|
|
|
|
}
|
2022-04-12 10:11:53 +08:00
|
|
|
|
}
|
2023-06-16 16:41:49 +08:00
|
|
|
|
|
|
|
|
|
|
Boolean canSend = true;
|
|
|
|
|
|
SalaryAcctRecordPO acctRecord = getSalaryAcctRecordService(user).getById(salaryAcctId);
|
|
|
|
|
|
// 回算过,但是查看的是普通工资单(不能发);回算过,但是查看的是回算工资单(可以发);记录没回算过(可以发)
|
|
|
|
|
|
if(Objects.equals(acctRecord.getBackCalcStatus(), NumberUtils.INTEGER_ONE) && Objects.equals(salarySend.getSalaryAcctType(),NumberUtils.INTEGER_ZERO)){
|
|
|
|
|
|
canSend = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
return SalarySendBaseInfoDTO.builder()
|
2023-03-02 11:25:25 +08:00
|
|
|
|
.salaryMonth(salarySobCycleDTO.getSalaryMonth())
|
2022-09-21 19:08:44 +08:00
|
|
|
|
.template(template)
|
|
|
|
|
|
.salarySobCycle(salarySobCycleDTO)
|
|
|
|
|
|
.sendNum(salarySend.getSendNum())
|
|
|
|
|
|
.sendTotal(salarySend.getSendTotal())
|
2023-06-16 16:41:49 +08:00
|
|
|
|
.canSend(canSend)
|
|
|
|
|
|
// .salaryAcctType(salarySend.getSalaryAcctType().toString())
|
|
|
|
|
|
// .haveBackCalc(haveBackCalc ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO)
|
2022-09-21 19:08:44 +08:00
|
|
|
|
.build();
|
2022-04-12 10:11:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public Map<String, Object> mySalaryBill(Long salaryInfoId, Long currentEmployeeId) {
|
|
|
|
|
|
// List<SalarySendInfoPO> salarySendInfos = new LambdaQueryChainWrapper<>(salarySendInfoMapper)
|
|
|
|
|
|
// .eq(SalarySendInfoPO::getDeleteType, 0)
|
|
|
|
|
|
// .eq(SalarySendInfoPO::getTenantKey, currentTenantKey)
|
|
|
|
|
|
// .eq(SalarySendInfoPO::getId, salaryInfoId).list();
|
|
|
|
|
|
|
2023-02-13 17:25:13 +08:00
|
|
|
|
if (salaryInfoId == null) {
|
|
|
|
|
|
throw new SalaryRunTimeException("工资单记录不存在!");
|
|
|
|
|
|
}
|
2022-04-12 10:11:53 +08:00
|
|
|
|
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, "工资单信息不存在"));
|
|
|
|
|
|
}
|
2023-06-16 10:14:28 +08:00
|
|
|
|
if(currentEmployeeId.compareTo(salarySendInfos.get(0).getEmployeeId()) != 0){
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100511, "当前账号无法查看此工资单"));
|
|
|
|
|
|
}
|
2022-04-12 10:11:53 +08:00
|
|
|
|
SalarySendInfoPO salarySendInfo = salarySendInfos.get(0);
|
2023-07-13 11:50:02 +08:00
|
|
|
|
// 获取默认模板信息
|
|
|
|
|
|
SalarySendPO salarySendPO = getSalarySendMapper().getById(salarySendInfo.getSalarySendId());
|
|
|
|
|
|
if(ObjectUtils.isEmpty(salarySendPO))
|
|
|
|
|
|
throw new SalaryRunTimeException("工资单不存在");
|
2023-07-11 15:29:13 +08:00
|
|
|
|
// 更新查看状态
|
2023-07-17 11:27:40 +08:00
|
|
|
|
if (salarySendInfo.getBillReadStatus() == null || NumberUtils.compare(salarySendInfo.getBillReadStatus(),BillReadStatusEnum.UNREAD.getValue()) == 0) {
|
2023-07-13 11:50:02 +08:00
|
|
|
|
salarySendInfo.setBillReadStatus(BillReadStatusEnum.READED.getValue());
|
|
|
|
|
|
salarySendInfo.setUpdateTime(new Date());
|
|
|
|
|
|
getSalarySendInfoMapper().updateIgnoreNull(salarySendInfo);
|
2023-07-11 15:29:13 +08:00
|
|
|
|
}
|
2022-04-12 10:11:53 +08:00
|
|
|
|
// List<SalarySendPO> salarySends = new LambdaQueryChainWrapper<>(mapper)
|
|
|
|
|
|
// .eq(SalarySendPO::getDeleteType, 0)
|
|
|
|
|
|
// .eq(SalarySendPO::getTenantKey, currentTenantKey)
|
|
|
|
|
|
// .eq(SalarySendPO::getId, salarySendInfo.getSalarySendId()).list();
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
2022-04-14 09:08:04 +08:00
|
|
|
|
Date salaryMonth = salarySend.getSalaryMonth();
|
2022-04-12 10:11:53 +08:00
|
|
|
|
// 获取模板
|
|
|
|
|
|
String salaryTemplateContent = salarySendInfo.getSalaryTemplate();
|
|
|
|
|
|
if (StringUtils.isBlank(salaryTemplateContent)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100513, "没有默认模板,无法查看"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-02-13 17:25:13 +08:00
|
|
|
|
SalaryTemplatePO salaryTemplate = buildSalaryTemplateContent(salaryTemplateContent);
|
2022-12-08 15:25:16 +08:00
|
|
|
|
// 判断是否是补发
|
|
|
|
|
|
boolean isReplenish = NumberUtils.INTEGER_ONE.equals(salarySendInfo.getSalaryAcctType());
|
2022-04-14 19:32:09 +08:00
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
// if (StringUtils.isNotBlank(salaryTemplate.getBackground())) {
|
|
|
|
|
|
// FileData fileByte = fileDownloadClient.getFileByte(Long.valueOf(salaryTemplate.getBackground()), currentTenantKey);
|
|
|
|
|
|
// String encode = Base64Encoder.encode(fileByte.getData());
|
|
|
|
|
|
// salaryTemplate.setBackground(encode);
|
|
|
|
|
|
// }
|
2022-04-14 19:32:09 +08:00
|
|
|
|
|
2022-04-21 14:46:45 +08:00
|
|
|
|
// 获取薪资项目数据
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SalaryAcctResultPO acctPo = new SalaryAcctResultPO();
|
|
|
|
|
|
acctPo.setDeleteType(0);
|
|
|
|
|
|
acctPo.setSalaryAcctRecordId(salarySendInfo.getSalaryAcctRecordId());
|
|
|
|
|
|
acctPo.setEmployeeId(currentEmployeeId);
|
2022-05-24 09:23:17 +08:00
|
|
|
|
List<SalaryAcctResultPO> salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(acctPo);
|
2022-12-12 16:42:44 +08:00
|
|
|
|
encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class);
|
2023-05-16 15:05:02 +08:00
|
|
|
|
|
|
|
|
|
|
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salarySendInfo.getSalaryAcctRecordId());
|
2023-06-05 13:35:17 +08:00
|
|
|
|
if (salaryAcctRecordPO == null) {
|
2023-05-16 15:05:02 +08:00
|
|
|
|
throw new SalaryRunTimeException("薪资核算记录不存在!");
|
|
|
|
|
|
}
|
2023-06-05 13:35:17 +08:00
|
|
|
|
List<Map<String, Object>> salaryAcctResultS = null;
|
|
|
|
|
|
if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), NumberUtils.INTEGER_ONE) && !isReplenish) {
|
2023-05-16 15:05:02 +08:00
|
|
|
|
// 该记录回算过,并且获取的不是回算后的工资单
|
|
|
|
|
|
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());
|
2023-06-05 13:35:17 +08:00
|
|
|
|
} else {
|
2023-05-16 15:05:02 +08:00
|
|
|
|
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());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-21 14:46:45 +08:00
|
|
|
|
|
|
|
|
|
|
Map<String, Object> map = new LinkedHashMap<>();
|
|
|
|
|
|
map.put("tenantName", "");
|
|
|
|
|
|
map.put("sendTime", SalaryDateUtil.getFormatLocalDateTime(salarySendInfo.getSendTime()));
|
2023-02-13 17:25:13 +08:00
|
|
|
|
List<SalaryTemplateSalaryItemSetListDTO> listDTOS = JSONArray.parseArray(isReplenish ? salaryTemplate.getReplenishSalaryItemSetting() : salaryTemplate.getSalaryItemSetting(), SalaryTemplateSalaryItemSetListDTO.class);
|
2022-04-21 14:46:45 +08:00
|
|
|
|
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());
|
2023-05-16 15:05:02 +08:00
|
|
|
|
List<Map<String, Object>> finalSalaryAcctResultS = salaryAcctResultS;
|
2022-04-21 14:46:45 +08:00
|
|
|
|
itemSetListDTOS.stream().forEach(item -> {
|
2022-09-21 19:08:44 +08:00
|
|
|
|
item.getItems()
|
|
|
|
|
|
.forEach(e -> {
|
2023-05-16 15:05:02 +08:00
|
|
|
|
if (CollectionUtils.isEmpty(finalSalaryAcctResultS)) {
|
2022-09-21 19:08:44 +08:00
|
|
|
|
e.setSalaryItemValue("");
|
|
|
|
|
|
} else {
|
2023-05-16 15:05:02 +08:00
|
|
|
|
Object o = finalSalaryAcctResultS.stream()
|
2022-09-21 19:08:44 +08:00
|
|
|
|
.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);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2022-04-21 14:46:45 +08:00
|
|
|
|
});
|
2022-09-21 19:08:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 过滤空
|
|
|
|
|
|
*/
|
|
|
|
|
|
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
|
2022-09-21 19:13:17 +08:00
|
|
|
|
|| BigDecimal.ZERO.compareTo(SalaryEntityUtil.string2BigDecimal(item.getSalaryItemValue())) != 0)
|
2022-09-21 19:08:44 +08:00
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
itemSetListDTO.setItems(collect);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-31 16:41:11 +08:00
|
|
|
|
TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(salarySendInfo.getTaxAgentId());
|
2022-04-21 14:46:45 +08:00
|
|
|
|
DataCollectionEmployee simpleEmployee = getSalaryEmployeeService(user).getEmployeeById(salarySendInfo.getEmployeeId());
|
2022-05-31 16:41:11 +08:00
|
|
|
|
buildEmployeeInfo(employeeInformation, simpleEmployee, taxAgentPO.getName(), SalaryAcctResultBO.buildEmployeeFieldName());
|
2022-04-21 14:46:45 +08:00
|
|
|
|
map.put("employeeInformation", employeeInformation);
|
|
|
|
|
|
map.put("salaryGroups", itemSetListDTOS);
|
|
|
|
|
|
|
|
|
|
|
|
salaryTemplate.setTheme(getBillTitle(salaryTemplate.getTheme(), salaryMonth, currentEmployeeId));
|
2023-06-09 17:57:17 +08:00
|
|
|
|
// 工资单水印文本型动态变量 == 处理
|
2023-06-16 09:58:54 +08:00
|
|
|
|
handleSalaryWatermark(salaryTemplate, salarySendInfo, currentEmployeeId);
|
2022-04-21 14:46:45 +08:00
|
|
|
|
map.put("salaryTemplate", salaryTemplate);
|
|
|
|
|
|
map.put("salaryAcctResult", salaryAcctResultS);
|
2023-07-11 15:29:13 +08:00
|
|
|
|
// 工资单发送人、是否已确认
|
2023-07-17 12:11:31 +08:00
|
|
|
|
if (NumberUtils.compare(salaryTemplate.getAckFeedbackStatus(),1) == 0) {
|
2023-07-12 11:25:44 +08:00
|
|
|
|
map.put("confirmStatus", salarySendInfo.getBillConfirmStatus() == null ? "0" : salarySendInfo.getBillConfirmStatus().toString());
|
2023-07-13 11:50:02 +08:00
|
|
|
|
map.put("sendEmployeeId", salarySendInfo.getSendEmployeeId());
|
2023-07-12 11:25:44 +08:00
|
|
|
|
}else{
|
|
|
|
|
|
map.put("confirmStatus", "1");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-21 14:46:45 +08:00
|
|
|
|
return map;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-09 17:57:17 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 工资单水印文本型动态变量 == 处理
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param salaryTemplate
|
|
|
|
|
|
* @param salarySendInfo
|
|
|
|
|
|
*/
|
2023-06-16 09:58:54 +08:00
|
|
|
|
private void handleSalaryWatermark(SalaryTemplatePO salaryTemplate, SalarySendInfoPO salarySendInfo, Long currentEmployeeId) {
|
2023-06-09 17:57:17 +08:00
|
|
|
|
SalaryBillWatermarkDTO salaryBillWatermark = JsonUtil.parseObject(salaryTemplate.getSalaryWatermark(), SalaryBillWatermarkDTO.class);
|
2023-07-11 17:28:15 +08:00
|
|
|
|
if (Objects.isNull(salaryBillWatermark) || Boolean.FALSE.equals(salaryBillWatermark.getWatermarkStatus()) ) {
|
2023-06-09 17:57:17 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 发送时已经处理好变量字段,可直接获取判断
|
|
|
|
|
|
List<String> wmTextFieldIds = (List<String>) salaryBillWatermark.getWmSetting().getOrDefault("wmSelectedFieldIds", Lists.newArrayList());
|
|
|
|
|
|
if (CollectionUtils.isEmpty(wmTextFieldIds)) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
boolean needQueryEmp = (boolean) salaryBillWatermark.getWmSetting().getOrDefault("needQueryEmp", false);
|
|
|
|
|
|
DataCollectionEmployee simpleEmployee = null;
|
|
|
|
|
|
if (needQueryEmp) {
|
2023-06-16 09:58:54 +08:00
|
|
|
|
simpleEmployee = getSalaryEmployeeService(user).getEmployeeById(currentEmployeeId);
|
2023-06-09 17:57:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String wmText = salaryBillWatermark.getWmSetting().getOrDefault("wmText", StringUtils.EMPTY).toString();
|
2023-06-13 10:02:11 +08:00
|
|
|
|
wmText = SalaryBillBO.handleWmText(wmText, wmTextFieldIds, simpleEmployee);
|
|
|
|
|
|
|
2023-06-09 17:57:17 +08:00
|
|
|
|
// 重新设回水印
|
|
|
|
|
|
salaryBillWatermark.getWmSetting().put("wmText", wmText);
|
|
|
|
|
|
salaryTemplate.setSalaryWatermark(JSON.toJSONString(salaryBillWatermark));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-13 10:02:11 +08:00
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public PageInfo<SalarySendInfoListDTO> salarySendInfoListPage(SalarySendInfoQueryParam queryParam) {
|
2022-09-26 18:51:17 +08:00
|
|
|
|
|
|
|
|
|
|
//排序配置
|
|
|
|
|
|
OrderRuleVO orderRule = getSalarySysConfService(user).orderRule();
|
|
|
|
|
|
queryParam.setOrderRule(orderRule);
|
|
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
List<SalarySendInfoListDTO> page = salarySendInfoMapper.list(queryParam);
|
2023-07-11 15:29:13 +08:00
|
|
|
|
PageInfo<SalarySendInfoListDTO> pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(),
|
2022-12-12 10:25:55 +08:00
|
|
|
|
page, SalarySendInfoListDTO.class);
|
2023-07-13 11:50:02 +08:00
|
|
|
|
SalarySendPO salarySendPO = getSalarySendMapper().getById(queryParam.getSalarySendId());
|
|
|
|
|
|
if (ObjectUtils.isEmpty(salarySendPO))
|
|
|
|
|
|
throw new SalaryRunTimeException("工资单不存在或已被删除");
|
|
|
|
|
|
List<SalaryTemplatePO> salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySendPO.getSalarySobId()));
|
2023-07-19 11:51:31 +08:00
|
|
|
|
if(CollectionUtils.isEmpty(salaryTemplates))
|
|
|
|
|
|
throw new SalaryRunTimeException("请先设置工资单模板");
|
2023-07-13 11:50:02 +08:00
|
|
|
|
Integer ackFeedbackStatus = salaryTemplates.get(0).getAckFeedbackStatus();
|
2023-07-17 11:27:40 +08:00
|
|
|
|
if (ackFeedbackStatus!=null && NumberUtils.compare(ackFeedbackStatus,1) == 0) {
|
2023-07-11 15:29:13 +08:00
|
|
|
|
// 默认为空时,未读未确认
|
2023-07-11 17:28:15 +08:00
|
|
|
|
pageInfo.getList().stream().forEach(obj -> {
|
|
|
|
|
|
SalarySendInfoListDTO dto = (SalarySendInfoListDTO) obj;
|
|
|
|
|
|
if (StringUtils.isBlank( dto.getBillReadStatus() )){
|
|
|
|
|
|
dto.setBillReadStatus(BillReadStatusEnum.UNREAD.getDefaultLabel());
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dto.setBillReadStatus(BillReadStatusEnum.getDefaultLabelByValue( Integer.valueOf(dto.getBillReadStatus()) ));
|
2023-07-11 15:29:13 +08:00
|
|
|
|
}
|
2023-07-11 17:28:15 +08:00
|
|
|
|
if (StringUtils.isBlank(dto.getBillConfirmStatus())){
|
|
|
|
|
|
dto.setBillConfirmStatus(BillConfimStatusEnum.UNCONFIRMED.getDefaultLabel());
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dto.setBillConfirmStatus(BillConfimStatusEnum.getDefaultLabelByValue( Integer.valueOf(dto.getBillConfirmStatus()) ));
|
2023-07-11 15:29:13 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
return pageInfo;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-11-25 10:53:23 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalarySendInfoListDTO> salarySendInfoList(Long salarySendId) {
|
|
|
|
|
|
return salarySendInfoMapper.list(SalarySendInfoQueryParam.builder().salarySendId(salarySendId).build());
|
2022-04-12 10:11:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public PageInfo<SalaryMySalaryBillListDTO> mySalaryBillListPage(SalaryBillQueryParam queryParam) {
|
|
|
|
|
|
List<SalaryMySalaryBillListDTO> list = salarySendInfoMapper.mySalaryBillList(queryParam);
|
|
|
|
|
|
PageInfo<SalaryMySalaryBillListDTO> pageInfo = new PageInfo<>(list, SalaryMySalaryBillListDTO.class);
|
2023-02-08 12:12:45 +08:00
|
|
|
|
pageInfo.setTotal(list.size());
|
|
|
|
|
|
pageInfo.setPageNum(queryParam.getCurrent());
|
|
|
|
|
|
pageInfo.setPageSize(queryParam.getPageSize());
|
2022-04-12 10:11:53 +08:00
|
|
|
|
return pageInfo;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public PageInfo<SalarySendDetailListDTO> salarySendInfoDetailListPage(SalarySendDetailQueryParam queryParam) {
|
2022-09-26 18:51:17 +08:00
|
|
|
|
//排序配置
|
|
|
|
|
|
OrderRuleVO orderRule = getSalarySysConfService(user).orderRule();
|
|
|
|
|
|
queryParam.setOrderRule(orderRule);
|
2022-11-02 17:20:34 +08:00
|
|
|
|
Set<Long> otherSalaryAcctRecordIds = null;
|
|
|
|
|
|
if (queryParam.getMergeCountTax() != null && queryParam.getMergeCountTax()) {
|
|
|
|
|
|
//查询关联的核酸id,这里认为一次发放只对应一条核算记录
|
|
|
|
|
|
Long salaryAccRecordId =
|
|
|
|
|
|
salarySendInfoMapper.listSalaryAccRecordIds(queryParam).stream().findFirst().orElse(null);
|
|
|
|
|
|
// 查询合并计税的其他薪资核算记录
|
|
|
|
|
|
List<SalaryAcctRecordPO> otherSalaryAcctRecordPOS =
|
|
|
|
|
|
getSalaryAcctRecordService(user).listById4OtherConsolidatedTax(salaryAccRecordId);
|
|
|
|
|
|
if (CollectionUtils.isEmpty(otherSalaryAcctRecordPOS)) {
|
|
|
|
|
|
return new PageInfo<>();
|
|
|
|
|
|
}
|
|
|
|
|
|
// 查询合并计税的薪资核算人员
|
|
|
|
|
|
otherSalaryAcctRecordIds = SalaryEntityUtil.properties(otherSalaryAcctRecordPOS, SalaryAcctRecordPO::getId);
|
|
|
|
|
|
if (otherSalaryAcctRecordIds.isEmpty()) {
|
|
|
|
|
|
return new PageInfo<>();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-12-08 15:45:15 +08:00
|
|
|
|
List<SalarySendDetailListDTO> list = MapperProxyFactory.getProxy(SalarySendInfoMapper.class).detailList(queryParam, otherSalaryAcctRecordIds);
|
2022-12-12 10:25:55 +08:00
|
|
|
|
return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(),
|
|
|
|
|
|
list, SalarySendDetailListDTO.class);
|
2022-04-12 10:11:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取工资单标题
|
2022-09-21 19:08:44 +08:00
|
|
|
|
*
|
2022-04-12 10:11:53 +08:00
|
|
|
|
* @param theme
|
|
|
|
|
|
* @param salaryMonth
|
|
|
|
|
|
* @param currentEmployeeId
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
2022-04-21 14:46:45 +08:00
|
|
|
|
private String getBillTitle(String theme, Date salaryMonth, Long currentEmployeeId) {
|
2022-04-12 10:11:53 +08:00
|
|
|
|
String yearI18n = SalaryI18nUtil.getI18nLabel(100325, "年");
|
|
|
|
|
|
String monthI18n = SalaryI18nUtil.getI18nLabel(100326, "月");
|
2023-03-02 17:11:42 +08:00
|
|
|
|
String companyName = "";
|
|
|
|
|
|
if (currentEmployeeId != null) {
|
|
|
|
|
|
ResourceComInfo resourceComInfo = null;
|
|
|
|
|
|
SubCompanyComInfo subCompanyComInfo = new SubCompanyComInfo();
|
|
|
|
|
|
try {
|
|
|
|
|
|
resourceComInfo = new ResourceComInfo();
|
|
|
|
|
|
subCompanyComInfo = new SubCompanyComInfo();
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
log.error("资源异常", e);
|
|
|
|
|
|
}
|
|
|
|
|
|
companyName = subCompanyComInfo.getSubCompanyname(resourceComInfo.getSubCompanyID(currentEmployeeId + ""));
|
|
|
|
|
|
}
|
2022-04-12 10:11:53 +08:00
|
|
|
|
return theme
|
2023-03-02 17:11:42 +08:00
|
|
|
|
.replace("${companyName}", companyName)
|
2022-04-21 14:46:45 +08:00
|
|
|
|
.replace("${salaryMonth}", new SimpleDateFormat("yyyy年MM月").format(salaryMonth));
|
2022-04-12 10:11:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 根据模板内容转为工资单模板对象
|
|
|
|
|
|
* 注意:不要通过反序列化,可能会因为历史原因修改字段名称而无法序列化
|
2022-09-21 19:08:44 +08:00
|
|
|
|
*
|
2022-04-12 10:11:53 +08:00
|
|
|
|
* @param salaryTemplateContent
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
|
|
|
|
|
private SalaryTemplatePO buildSalaryTemplateContent(String salaryTemplateContent) {
|
|
|
|
|
|
Map<String, Object> map = JsonUtil.parseMap(salaryTemplateContent, Object.class);
|
|
|
|
|
|
return SalaryTemplatePO.builder()
|
2022-09-21 19:08:44 +08:00
|
|
|
|
.id(Long.valueOf(map.getOrDefault("id", "0").toString()))
|
2023-07-17 11:27:40 +08:00
|
|
|
|
.ackFeedbackStatus(Integer.valueOf(map.getOrDefault("ackFeedbackStatus", "0").toString()))
|
|
|
|
|
|
.autoAckDays(Integer.valueOf(map.getOrDefault("autoAckDays", "0").toString()))
|
|
|
|
|
|
.feedbackUrl(map.getOrDefault("feedbackUrl", "").toString())
|
2022-09-21 19:08:44 +08:00
|
|
|
|
.name(map.getOrDefault("name", "").toString())
|
|
|
|
|
|
.salarySobId(Long.valueOf(map.getOrDefault("salarySobId", "0").toString()))
|
|
|
|
|
|
.useType(Integer.valueOf(map.getOrDefault("useType", "0").toString()))
|
|
|
|
|
|
.description(map.getOrDefault("description", "").toString())
|
|
|
|
|
|
.emailStatus(Integer.valueOf(map.getOrDefault("emailStatus", "0").toString()))
|
|
|
|
|
|
.sendEmailId(Long.valueOf(map.getOrDefault("sendEmailId", "0").toString()))
|
|
|
|
|
|
.msgStatus(Integer.valueOf(map.getOrDefault("msgStatus", "0").toString()))
|
2023-06-09 17:57:17 +08:00
|
|
|
|
.salaryWatermark(map.getOrDefault("salaryWatermark", StringUtils.EMPTY).toString())
|
2022-09-21 19:08:44 +08:00
|
|
|
|
.theme(map.getOrDefault("theme", "").toString())
|
|
|
|
|
|
.background(map.getOrDefault("background", "").toString())
|
|
|
|
|
|
.textContent(map.getOrDefault("textContent", "").toString())
|
|
|
|
|
|
.textContentPosition(Integer.valueOf(map.getOrDefault("textContentPosition", "0").toString()))
|
|
|
|
|
|
.salaryItemNullStatus(Integer.valueOf(map.getOrDefault("salaryItemNullStatus", "0").toString()))
|
|
|
|
|
|
.salaryItemZeroStatus(Integer.valueOf(map.getOrDefault("salaryItemZeroStatus", "0").toString()))
|
|
|
|
|
|
.salaryItemSetting(map.getOrDefault("salaryItemSetting", "").toString())
|
2023-02-13 17:25:13 +08:00
|
|
|
|
.replenishName(map.getOrDefault("replenishName", "").toString())
|
|
|
|
|
|
.replenishSalaryItemSetting(map.getOrDefault("replenishSalaryItemSetting", "").toString())
|
2022-04-12 10:11:53 +08:00
|
|
|
|
.build();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 构建工资单中的人员信息
|
2022-09-21 19:08:44 +08:00
|
|
|
|
*
|
2022-04-12 10:11:53 +08:00
|
|
|
|
* @param employeeInformation
|
|
|
|
|
|
* @param simpleEmployee
|
|
|
|
|
|
* @param taxAgentName
|
|
|
|
|
|
* @param employeeField
|
|
|
|
|
|
*/
|
2022-04-21 14:46:45 +08:00
|
|
|
|
private void buildEmployeeInfo(SalaryTemplateSalaryItemSetListDTO employeeInformation, DataCollectionEmployee simpleEmployee, String taxAgentName, Map<String, String> employeeField) {
|
|
|
|
|
|
if (employeeInformation == null) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(employeeInformation.getItems())) {
|
|
|
|
|
|
//获取员工信息的字段名和中文描述的map关系
|
|
|
|
|
|
SalaryFormulaEmployeeDTO salaryFormulaEmployeeDTO = SalaryFormulaEmployeeDTO.builder().employeeId(simpleEmployee.getEmployeeId())
|
|
|
|
|
|
.birthday(simpleEmployee.getBirthday())
|
2022-09-21 19:08:44 +08:00
|
|
|
|
.departmentName(simpleEmployee.getDepartmentName())
|
2022-04-21 14:46:45 +08:00
|
|
|
|
.email(StringUtils.isEmpty(simpleEmployee.getEmail()) ? "" : simpleEmployee.getEmail())
|
2022-04-29 14:17:31 +08:00
|
|
|
|
.jobcall(simpleEmployee.getJobcall())
|
|
|
|
|
|
.companystartdate(simpleEmployee.getCompanystartdate())
|
|
|
|
|
|
.sex("0".equals(simpleEmployee.getSex()) ? "男" : "女")
|
2022-04-21 14:46:45 +08:00
|
|
|
|
.mobile(StringUtils.isEmpty(simpleEmployee.getMobile()) ? "" : simpleEmployee.getMobile())
|
2022-04-29 14:17:31 +08:00
|
|
|
|
.jobtitleName(simpleEmployee.getJobtitleName())
|
2022-04-21 14:46:45 +08:00
|
|
|
|
.status(simpleEmployee.getStatus() == null ? "" : simpleEmployee.getStatus())
|
|
|
|
|
|
.telephone(StringUtils.isEmpty(simpleEmployee.getTelephone()) ? "" : simpleEmployee.getTelephone())
|
|
|
|
|
|
.username(StringUtils.isEmpty(simpleEmployee.getUsername()) ? "" : simpleEmployee.getUsername())
|
2023-03-07 17:43:51 +08:00
|
|
|
|
.workcode(StringUtils.isEmpty(simpleEmployee.getWorkcode()) ? "" : simpleEmployee.getWorkcode())
|
2022-04-21 14:46:45 +08:00
|
|
|
|
.taxAgentName(taxAgentName)
|
|
|
|
|
|
.build();
|
|
|
|
|
|
List<SalaryTemplateSalaryItemListDTO> items = employeeInformation.getItems();
|
|
|
|
|
|
Set<Map.Entry<String, String>> entries = employeeField.entrySet();
|
|
|
|
|
|
for (SalaryTemplateSalaryItemListDTO e : items) {
|
|
|
|
|
|
Optional<Map.Entry<String, String>> entry = entries.stream().filter(f -> Objects.equals(e.getName(), f.getValue())).findFirst();
|
|
|
|
|
|
if (entry.isPresent()) {
|
|
|
|
|
|
String key = entry.get().getKey();
|
|
|
|
|
|
if (StringUtils.isNotBlank(key)) {
|
|
|
|
|
|
String getter = "get" + key.substring(0, 1).toUpperCase() + key.substring(1);
|
|
|
|
|
|
try {
|
|
|
|
|
|
Method method = salaryFormulaEmployeeDTO.getClass().getMethod(getter);
|
|
|
|
|
|
Object invoke = method.invoke(salaryFormulaEmployeeDTO);
|
|
|
|
|
|
e.setSalaryItemValue((String) invoke);
|
|
|
|
|
|
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) {
|
|
|
|
|
|
log.error("no such method", e);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-04-12 10:11:53 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 组装详情数据
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param salaryItems
|
|
|
|
|
|
* @param list
|
|
|
|
|
|
* @param salaryAccountingId
|
|
|
|
|
|
*/
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<Map<String, Object>> buildDetailList(List<SalaryTemplateSalaryItemListDTO> salaryItems, List<SalarySendDetailListDTO> list, Long salaryAccountingId) {
|
|
|
|
|
|
List<Map<String, Object>> listMaps = new ArrayList<>();
|
|
|
|
|
|
if (CollectionUtils.isEmpty(list)) {
|
|
|
|
|
|
return listMaps;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 获取薪资项目数据
|
|
|
|
|
|
// List<SalaryAcctResultPO> salaryAccountingResults = new LambdaQueryChainWrapper<>(salaryAcctResultMapper)
|
|
|
|
|
|
// .eq(SalaryAcctResultPO::getDeleteType, 0)
|
|
|
|
|
|
// .eq(SalaryAcctResultPO::getSalaryAcctRecordId, salaryAccountingId).list();
|
|
|
|
|
|
|
|
|
|
|
|
SalaryAcctResultPO po = new SalaryAcctResultPO();
|
|
|
|
|
|
po.setDeleteType(0);
|
|
|
|
|
|
po.setSalaryAcctRecordId(salaryAccountingId);
|
2022-12-08 15:45:15 +08:00
|
|
|
|
po.setEmployeeIds(list.stream().map(SalarySendDetailListDTO::getEmployeeId).collect(Collectors.toList()));
|
2022-04-12 10:11:53 +08:00
|
|
|
|
List<SalaryAcctResultPO> salaryAccountingResults = getSalaryAcctResultMapper().listSome(po);
|
2022-12-12 16:42:44 +08:00
|
|
|
|
encryptUtil.decryptList(salaryAccountingResults, SalaryAcctResultPO.class);
|
2022-04-12 10:11:53 +08:00
|
|
|
|
// 动态列
|
|
|
|
|
|
list.forEach(e -> {
|
|
|
|
|
|
Map<String, Object> map = new LinkedHashMap<>();
|
|
|
|
|
|
map.put("id", e.getId());
|
|
|
|
|
|
map.put("employeeId", e.getEmployeeId());
|
|
|
|
|
|
map.put("username", e.getUsername());
|
|
|
|
|
|
map.put("taxAgent", e.getTaxAgent());
|
|
|
|
|
|
map.put("department", e.getDepartment());
|
|
|
|
|
|
map.put("mobile", e.getMobile());
|
|
|
|
|
|
map.put("jobNum", e.getJobNum());
|
|
|
|
|
|
map.put("email", e.getEmail());
|
|
|
|
|
|
salaryItems.forEach(i -> {
|
|
|
|
|
|
Optional<SalaryAcctResultPO> optional = salaryAccountingResults.stream()
|
2022-09-21 19:08:44 +08:00
|
|
|
|
.filter(r -> r.getEmployeeId().equals(e.getEmployeeId()) && r.getSalaryItemId().equals(Long.valueOf(i.getSalaryItemId()))).findFirst();
|
2022-04-12 10:11:53 +08:00
|
|
|
|
map.put(i.getSalaryItemId() + SalaryItemConstant.DYNAMIC_SUFFIX, optional.isPresent() ? optional.get().getResultValue() : "");
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
listMaps.add(map);
|
|
|
|
|
|
});
|
|
|
|
|
|
return listMaps;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-08 09:27:20 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 组装详情数据
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param list
|
|
|
|
|
|
* @param salaryAcctResultValues
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<Map<String, Object>> buildDetailList(List<SalarySendInfoListDTO> list,
|
|
|
|
|
|
List<SalaryAcctEmployeePO> salaryAcctEmployees, List<SalaryAcctResultPO> salaryAcctResultValues) {
|
|
|
|
|
|
List<Map<String, Object>> listMaps = new ArrayList<>();
|
|
|
|
|
|
if (CollectionUtils.isEmpty(list)) {
|
|
|
|
|
|
return listMaps;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 所有个税扣缴义务人
|
2023-06-06 14:21:35 +08:00
|
|
|
|
// Map<Long, String> taxAgentMap = SalaryEntityUtil.convert2Map(getTaxAgentService(user).listAll(), TaxAgentPO::getId, TaxAgentPO::getName);
|
2023-05-08 09:27:20 +08:00
|
|
|
|
// 按人员分组核算数据
|
2023-06-06 14:21:35 +08:00
|
|
|
|
// Map<Long, List<SalaryAcctEmployeePO>> relationSalaryAcctEmployeeMap = SalaryEntityUtil.group2Map(salaryAcctEmployees, SalaryAcctEmployeePO::getEmployeeId);
|
2023-05-08 09:27:20 +08:00
|
|
|
|
Map<String, SalaryAcctEmployeePO> salaryAcctEmployeeMap = SalaryEntityUtil.convert2Map(salaryAcctEmployees, salaryAcctEmployee -> salaryAcctEmployee.getEmployeeId() + "-" + salaryAcctEmployee.getTaxAgentId());
|
|
|
|
|
|
Map<Long, List<SalaryAcctResultPO>> singleEmpAcctMap = SalaryEntityUtil.group2Map(salaryAcctResultValues, SalaryAcctResultPO::getSalaryAcctEmpId);
|
|
|
|
|
|
List<Long> employeeIds = list.stream().map(SalarySendInfoListDTO::getEmployeeId).distinct().collect(Collectors.toList());
|
|
|
|
|
|
// 查询分部 查询部门
|
|
|
|
|
|
List<DataCollectionEmployee> comInfos = getSalaryEmployeeService(user).getEmployeeByIdsAll(employeeIds);
|
|
|
|
|
|
Map<Long, DataCollectionEmployee> empComMap = SalaryEntityUtil.convert2Map(comInfos, DataCollectionEmployee::getEmployeeId);
|
|
|
|
|
|
|
|
|
|
|
|
// 当前查询核算记录是回算,但是发放不是回算的,那么就取源头核算结果
|
|
|
|
|
|
boolean isOrigin = false;
|
|
|
|
|
|
SalaryAcctRecordPO salaryAcctRecord = CollectionUtils.isEmpty(list) ? null : getSalaryAcctRecordService(user).getById(list.get(0).getSalaryAcctRecordId());
|
|
|
|
|
|
if (Objects.nonNull(salaryAcctRecord) && Objects.nonNull(salaryAcctRecord.getBackCalcStatus())) {
|
|
|
|
|
|
isOrigin = !NumberUtils.INTEGER_ONE.equals(list.get(0).getSalaryAcctType()) && salaryAcctRecord.getBackCalcStatus().equals(NumberUtils.INTEGER_ONE);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 动态列
|
|
|
|
|
|
long l = System.currentTimeMillis();
|
|
|
|
|
|
Map<Long, DataCollectionEmployee> finalEmpSubComMap = empComMap;
|
|
|
|
|
|
boolean finalIsOrigin = isOrigin;
|
|
|
|
|
|
list.forEach(e -> {
|
|
|
|
|
|
Map<String, Object> map = new LinkedHashMap<>();
|
|
|
|
|
|
map.put("id", e.getId() + "");
|
|
|
|
|
|
DataCollectionEmployee hrmDepartmentComInfo = finalEmpSubComMap.get(e.getEmployeeId());
|
|
|
|
|
|
if (hrmDepartmentComInfo != null) {
|
|
|
|
|
|
map.put("subCompanyName", hrmDepartmentComInfo.getSubcompanyName());
|
|
|
|
|
|
} else {
|
|
|
|
|
|
map.put("subCompanyName", "");
|
|
|
|
|
|
}
|
|
|
|
|
|
if (hrmDepartmentComInfo != null) {
|
|
|
|
|
|
map.put("department", e.getDepartment());
|
|
|
|
|
|
}
|
|
|
|
|
|
map.put("employeeId", e.getEmployeeId() + "");
|
|
|
|
|
|
map.put("username", e.getUsername());
|
|
|
|
|
|
map.put("mobile", e.getMobile());
|
|
|
|
|
|
map.put("jobNum", e.getJobNum());
|
|
|
|
|
|
map.put("email", e.getEmail());
|
|
|
|
|
|
// map.put("employeeType", SalarySendEmployeeTypeEnum.getNameByValue(e.getEmployeeType()));
|
|
|
|
|
|
// 单个人的核算数据
|
|
|
|
|
|
List<SalaryAcctResultPO> resultValues = Lists.newArrayList();
|
|
|
|
|
|
// 个税扣缴义务人
|
|
|
|
|
|
// if (incomeCategorys.size() > 1) {
|
|
|
|
|
|
// List<SalaryAcctEmployeePO> acctEmployees = relationSalaryAcctEmployeeMap.getOrDefault(e.getEmployeeId(), Collections.emptyList());
|
|
|
|
|
|
// for (SalaryAcctEmployeePO salaryAcctEmployee : acctEmployees) {
|
|
|
|
|
|
// if (singleEmpAcctMap.containsKey(salaryAcctEmployee.getId())) {
|
|
|
|
|
|
// resultValues.add(singleEmpAcctMap.get(salaryAcctEmployee.getId()));
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// SalaryAcctEmployeePO salaryAcctEmployee = salaryAcctEmployeeMap.get(e.getEmployeeId() + "-" + e.getTaxAgent());
|
|
|
|
|
|
// if (salaryAcctEmployee != null && singleEmpAcctMap.containsKey(salaryAcctEmployee.getId())) {
|
|
|
|
|
|
// resultValues.add(singleEmpAcctMap.get(salaryAcctEmployee.getId()));
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
SalaryAcctEmployeePO salaryAcctEmployee = salaryAcctEmployeeMap.get(e.getEmployeeId() + "-" + e.getTaxAgentId());
|
|
|
|
|
|
if (salaryAcctEmployee != null && singleEmpAcctMap.containsKey(salaryAcctEmployee.getId())) {
|
|
|
|
|
|
resultValues.addAll(singleEmpAcctMap.get(salaryAcctEmployee.getId()));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 薪资项目
|
|
|
|
|
|
// singleEmpAcctResultList.forEach(i-> map.put(i.getSalaryItemId() + SalaryArchiveConstant.DYNAMIC_SUFFIX, i.getResultValue()));
|
|
|
|
|
|
for (SalaryAcctResultPO salaryAcctResultValue : resultValues) {
|
|
|
|
|
|
if (finalIsOrigin) {
|
|
|
|
|
|
map.put(salaryAcctResultValue.getSalaryItemId() + SalaryArchiveConstant.DYNAMIC_SUFFIX, salaryAcctResultValue.getResultValue());
|
|
|
|
|
|
} else {
|
|
|
|
|
|
map.put(salaryAcctResultValue.getSalaryItemId() + SalaryArchiveConstant.DYNAMIC_SUFFIX, salaryAcctResultValue.getResultValue());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
listMaps.add(map);
|
|
|
|
|
|
});
|
|
|
|
|
|
log.info("工资单详情构建总耗时:{}毫秒", System.currentTimeMillis() - l);
|
|
|
|
|
|
return listMaps;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 通过薪资账套获取模板的薪资项目
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param salaryTemplate
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
|
|
|
|
|
@Override
|
2023-02-13 17:25:13 +08:00
|
|
|
|
public List<SalaryTemplateSalaryItemListDTO> getSalaryItemsSetting(SalaryTemplatePO salaryTemplate, boolean isReplenish) {
|
2022-04-12 10:11:53 +08:00
|
|
|
|
List<SalaryTemplateSalaryItemListDTO> salaryItems = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
|
|
if (salaryTemplate == null) {
|
|
|
|
|
|
return salaryItems;
|
|
|
|
|
|
}
|
2022-12-06 15:29:08 +08:00
|
|
|
|
// 正常模板
|
|
|
|
|
|
if (!isReplenish && StringUtils.isNotEmpty(salaryTemplate.getSalaryItemSetting())) {
|
2022-04-12 10:11:53 +08:00
|
|
|
|
List<SalaryTemplateSalaryItemSetListDTO> salaryTemplateShowSetData = JsonUtil.parseList(salaryTemplate.getSalaryItemSetting(),
|
2022-09-21 19:08:44 +08:00
|
|
|
|
SalaryTemplateSalaryItemSetListDTO.class);
|
2022-04-12 10:11:53 +08:00
|
|
|
|
salaryTemplateShowSetData.stream().filter(f -> !f.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID)).forEach(e -> {
|
|
|
|
|
|
salaryItems.addAll(e.getItems());
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2022-12-06 15:29:08 +08:00
|
|
|
|
// 补发模板
|
|
|
|
|
|
if (isReplenish && StringUtils.isNotEmpty(salaryTemplate.getReplenishSalaryItemSetting())) {
|
|
|
|
|
|
List<SalaryTemplateSalaryItemSetListDTO> salaryTemplateShowSetData = JsonUtil.parseList(salaryTemplate.getReplenishSalaryItemSetting(),
|
|
|
|
|
|
SalaryTemplateSalaryItemSetListDTO.class);
|
2023-07-11 17:28:15 +08:00
|
|
|
|
salaryTemplateShowSetData.stream().filter(f -> !f.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID)).forEach(e ->
|
|
|
|
|
|
salaryItems.addAll(e.getItems())
|
|
|
|
|
|
);
|
2022-12-06 15:29:08 +08:00
|
|
|
|
}
|
2022-04-12 10:11:53 +08:00
|
|
|
|
return salaryItems;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
2022-04-14 19:32:09 +08:00
|
|
|
|
public Map<String, Object> grant(SalarySendGrantParam param) {
|
2023-06-06 11:48:19 +08:00
|
|
|
|
if (param.getSalarySendId() == null) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100327, "工资单发放Id必传"));
|
|
|
|
|
|
}
|
2023-06-06 09:51:07 +08:00
|
|
|
|
|
2023-06-06 11:48:19 +08:00
|
|
|
|
Long salarySendId = param.getSalarySendId();
|
|
|
|
|
|
Collection<Long> ids = param.getIds();
|
|
|
|
|
|
|
|
|
|
|
|
if (param.getSalarySendRangeIds() != null) {
|
|
|
|
|
|
//如果传了范围id,则使用范围id发放
|
|
|
|
|
|
ids = getSalarySendRangeService(user)
|
|
|
|
|
|
.getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds(), SalarySendGrantTypeEnum.GRANT);
|
|
|
|
|
|
if (ids.isEmpty()) {// 由于查出来是空的,会导致全部发放,在此进行拦截
|
|
|
|
|
|
throw new SalaryRunTimeException("工资发放范围内没有匹配员工");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SalarySendPO salarySend = mapper.getById(salarySendId);
|
|
|
|
|
|
if (salarySend == null) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 已经冻结不能操作
|
|
|
|
|
|
if (Objects.equals(salarySend.getSendStatus(), NumberUtils.INTEGER_ONE)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "工资单已冻结"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 获取默认模板
|
|
|
|
|
|
List<SalaryTemplatePO> salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId()));
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salaryTemplates)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100518, "没有默认模板,无法发送"));
|
|
|
|
|
|
}
|
|
|
|
|
|
SalaryTemplatePO templatePO = salaryTemplates.get(0);
|
|
|
|
|
|
Date sendTime = new Date();
|
|
|
|
|
|
// 获取可发送的列表
|
|
|
|
|
|
List<Map<String, Object>> enableSendList = getEnableSendList(salarySend, ids, templatePO);
|
|
|
|
|
|
// 1.发放
|
|
|
|
|
|
|
|
|
|
|
|
SalarySendInfoPO po = new SalarySendInfoPO();
|
|
|
|
|
|
po.setSendStatus(SalarySendStatusEnum.ALREADYSEND.getValue());
|
|
|
|
|
|
po.setSendTime(sendTime);
|
|
|
|
|
|
po.setSalaryTemplate(JsonUtil.toJsonString(templatePO));
|
2023-07-11 17:51:52 +08:00
|
|
|
|
po.setBillReadStatus(BillReadStatusEnum.UNREAD.getValue());
|
|
|
|
|
|
po.setBillConfirmStatus(BillConfimStatusEnum.UNCONFIRMED.getValue());
|
|
|
|
|
|
po.setSendEmployeeId(Long.valueOf(user.getUID()));
|
2023-06-06 11:48:19 +08:00
|
|
|
|
salarySendInfoMapper.updateGrantWithdraw(po, salarySendId, Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue()), ids);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<SalarySendInfoPO> list = salarySendInfoMapper.listSome(SalarySendInfoPO.builder().salarySendId(salarySendId).build());
|
|
|
|
|
|
//需要发送工资的人
|
|
|
|
|
|
|
|
|
|
|
|
List<SalarySendInfoPO> sendList = list.stream().filter(e -> e.getSendStatus().equals(SalarySendStatusEnum.ALREADYSEND.getValue())).collect(Collectors.toList());
|
|
|
|
|
|
int sendNum = sendList.size();
|
|
|
|
|
|
int sendTotal = list.size();
|
|
|
|
|
|
SalarySendPO salarySendNew = new SalarySendPO();
|
|
|
|
|
|
try {
|
|
|
|
|
|
BeanUtils.copyProperties(salarySendNew, salarySend);
|
|
|
|
|
|
} catch (IllegalAccessException e) {
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
} catch (InvocationTargetException e) {
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
}
|
|
|
|
|
|
salarySendNew.setSendNum(sendNum);
|
|
|
|
|
|
salarySendNew.setSendTotal(sendTotal);
|
|
|
|
|
|
salarySendNew.setLastSendTime(sendTime);
|
|
|
|
|
|
|
|
|
|
|
|
mapper.updateById(salarySendNew);
|
|
|
|
|
|
|
|
|
|
|
|
List<SalarySendInfoPO> needSendList = Lists.newArrayList();
|
|
|
|
|
|
enableSendList.forEach(map -> {
|
|
|
|
|
|
sendList.forEach(item -> {
|
|
|
|
|
|
if (item.getId() == Long.valueOf(map.get("id").toString()).longValue()) {
|
|
|
|
|
|
needSendList.add(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 发送消息
|
|
|
|
|
|
param.setTemplate(templatePO);
|
|
|
|
|
|
sendMessage(true, needSendList, param, salarySend);
|
|
|
|
|
|
|
|
|
|
|
|
Map<String, Object> map = new HashMap<>(2);
|
|
|
|
|
|
map.put("sendNum", sendNum);
|
|
|
|
|
|
map.put("sendTotal", sendTotal);
|
|
|
|
|
|
|
|
|
|
|
|
return map;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-06 13:56:47 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 发送消息
|
2022-09-21 19:08:44 +08:00
|
|
|
|
*
|
|
|
|
|
|
* @param sendFlag true 发送 false 撤回
|
2022-06-06 13:56:47 +08:00
|
|
|
|
* @param list
|
|
|
|
|
|
* @param param
|
|
|
|
|
|
* @param salarySend
|
|
|
|
|
|
*/
|
|
|
|
|
|
private void sendMessage(boolean sendFlag, List<SalarySendInfoPO> list, SalarySendGrantParam param, SalarySendPO salarySend) {
|
|
|
|
|
|
new Thread() {
|
|
|
|
|
|
public void run() {
|
2023-03-02 17:11:42 +08:00
|
|
|
|
List<SalarySendInfoPO> pos = list;
|
2022-09-21 19:08:44 +08:00
|
|
|
|
if (CollectionUtils.isNotEmpty(param.getIds())) {
|
2023-03-02 17:11:42 +08:00
|
|
|
|
pos = list.stream().filter(f -> param.getIds().contains(f.getId())).collect(Collectors.toList());
|
2022-06-06 13:56:47 +08:00
|
|
|
|
}
|
2023-03-02 17:11:42 +08:00
|
|
|
|
pos.forEach(po -> {
|
|
|
|
|
|
Long employeeId = po.getEmployeeId();
|
|
|
|
|
|
if (sendFlag) {
|
|
|
|
|
|
sendPayRollEMMessage(po, param.getTemplate(), employeeId);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
withdrawPayrollEMMessage(po, employeeId);
|
2022-06-06 13:56:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}.start();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 发送Em消息
|
|
|
|
|
|
*/
|
2023-03-02 17:11:42 +08:00
|
|
|
|
private void sendPayRollEMMessage(SalarySendInfoPO po, SalaryTemplatePO template, Long employeeId) {
|
2023-05-08 09:27:20 +08:00
|
|
|
|
|
|
|
|
|
|
// try {
|
|
|
|
|
|
// MessageUtil.sendSMS(mobile, content);
|
|
|
|
|
|
// } catch (Exception e) {
|
|
|
|
|
|
// kqLog.info("SendSMS error.resourceId:" + resourceId + ">>>>>>mobile>>>>>>" + mobile);
|
|
|
|
|
|
// log.writeLog(e);
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-03-02 17:11:42 +08:00
|
|
|
|
Long id = po.getId();
|
2023-04-03 18:49:28 +08:00
|
|
|
|
String background = template.getBackground();
|
2023-03-02 17:59:58 +08:00
|
|
|
|
String billTitle = getBillTitle(template.getTheme(), po.getSalaryMonth(), employeeId);
|
2023-03-20 17:36:29 +08:00
|
|
|
|
MessageType messageType = MessageType.newInstance(499); // 消息来源(见文档第四点补充 必填)
|
2022-06-06 13:56:47 +08:00
|
|
|
|
Set<String> userIdList = new HashSet<>(); // 接收人id 必填
|
2022-06-15 17:03:48 +08:00
|
|
|
|
userIdList.add(employeeId.toString());
|
2023-03-02 17:11:42 +08:00
|
|
|
|
String title = billTitle; // 标题
|
2022-06-06 13:56:47 +08:00
|
|
|
|
String context = "点击查看详情"; // 内容
|
2023-05-17 14:10:12 +08:00
|
|
|
|
// PC端链接
|
|
|
|
|
|
String linkUrl = weaver.general.GCONST.getContextPath() + "/spa/hrmSalary/static/index.html#/main/hrmSalary/mobilepayroll?id=" + id + "&recipient=" + employeeId;
|
|
|
|
|
|
// 移动端链接
|
|
|
|
|
|
String linkMobileUrl = weaver.general.GCONST.getContextPath() + "/spa/hrmSalary/static/index.html#/main/hrmSalary/mobilepayroll?type=phone&id=" + id + "&recipient=" + employeeId;
|
2023-03-20 17:36:29 +08:00
|
|
|
|
try {
|
|
|
|
|
|
MessageBean messageBean = Util_Message.createMessage(messageType, userIdList, title, context, linkUrl, linkMobileUrl);
|
|
|
|
|
|
messageBean.setCreater(user.getUID());// 创建人id
|
|
|
|
|
|
messageBean.setBizState("0");// 需要修改消息为已处理等状态时传入,表示消息最初状态为待处理
|
|
|
|
|
|
messageBean.setTargetId("499|" + id); //消息来源code +“|”+业务id需要修改消息为已处理等状态时传入
|
2023-04-03 18:49:28 +08:00
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isNotBlank(background)) {
|
|
|
|
|
|
messageBean.setPictureUrl(background);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
messageBean.setPictureUrl("/hrm/hrm_e9/images/payroll.jpg?pictype=jpg");
|
|
|
|
|
|
}
|
2023-03-20 17:36:29 +08:00
|
|
|
|
Util_Message.store(messageBean);
|
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
|
e.printStackTrace();
|
2022-06-06 13:56:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 撤回EM消息
|
2022-09-21 19:08:44 +08:00
|
|
|
|
*
|
2023-03-02 17:11:42 +08:00
|
|
|
|
* @param po
|
2022-06-06 13:56:47 +08:00
|
|
|
|
*/
|
2023-03-02 17:11:42 +08:00
|
|
|
|
private void withdrawPayrollEMMessage(SalarySendInfoPO po, Long employeeId) {
|
2022-06-06 13:56:47 +08:00
|
|
|
|
try {
|
|
|
|
|
|
MessageBean messageBean = Util_Message.createMessage();
|
|
|
|
|
|
messageBean.setUserList(new HashSet<>());//接收人id
|
|
|
|
|
|
messageBean.setUserId(employeeId.intValue());
|
2023-03-02 17:11:42 +08:00
|
|
|
|
messageBean.setTargetId("499|" + po.getId()); //code + “|” + 业务id
|
2022-06-06 13:56:47 +08:00
|
|
|
|
//messageBean.setMessageType(MessageType.newInstance(121));//消息来源code(传了代表code也做为删除时的条件,默认不传)
|
|
|
|
|
|
Util_Message.delMessageTargetid(messageBean);
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
private List<Map<String, Object>> getEnableSendList(SalarySendPO salarySend, Collection<Long> ids, SalaryTemplatePO salaryTemplate) {
|
|
|
|
|
|
// 1.根据模板获取薪资项目设置
|
2022-12-06 15:29:08 +08:00
|
|
|
|
SalaryAcctRecordPO salaryAcctRecord = getSalaryAcctRecordService(user).getById(salarySend.getSalaryAccountingId());
|
|
|
|
|
|
boolean isReplenish = salaryAcctRecord != null && Objects.equals(salaryAcctRecord.getBackCalcStatus(), (NumberUtils.INTEGER_ONE));
|
2023-02-13 17:25:13 +08:00
|
|
|
|
List<SalaryTemplateSalaryItemListDTO> salaryItems = getSalaryItemsSetting(salaryTemplate, isReplenish);
|
2022-04-12 10:11:53 +08:00
|
|
|
|
SalarySendDetailQueryParam queryParam = new SalarySendDetailQueryParam();
|
|
|
|
|
|
queryParam.setSalarySendId(salarySend.getId());
|
|
|
|
|
|
// 空就是所有
|
|
|
|
|
|
queryParam.setIds(ids);
|
|
|
|
|
|
queryParam.setSendStatuss(Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue()));
|
|
|
|
|
|
// 2.获取基本数据
|
2022-10-28 09:39:31 +08:00
|
|
|
|
List<SalarySendDetailListDTO> list = salarySendInfoMapper.detailList(queryParam, null);
|
2022-04-12 10:11:53 +08:00
|
|
|
|
// 3.组装详情数据
|
|
|
|
|
|
List<Map<String, Object>> listMaps = buildDetailList(salaryItems, list, salarySend.getSalaryAccountingId());
|
|
|
|
|
|
return listMaps;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-06 13:56:47 +08:00
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
// /**
|
|
|
|
|
|
// * 发送消息
|
|
|
|
|
|
// *
|
|
|
|
|
|
// * @param salarySend
|
|
|
|
|
|
// * @param enableSendList
|
|
|
|
|
|
// * @param salaryTemplate
|
|
|
|
|
|
// * @param currentTenantKey
|
|
|
|
|
|
// */
|
|
|
|
|
|
// private void sendMessage(SalarySendPO salarySend, List<Map<String, Object>> enableSendList, SalaryTemplatePO salaryTemplate, String tenantName, Long currentEmployeeId, String currentTenantKey) {
|
|
|
|
|
|
// if (StringUtils.isNotBlank(salaryTemplate.getBackground())) {
|
|
|
|
|
|
// FileData fileByte = fileDownloadClient.getFileByte(Long.valueOf(salaryTemplate.getBackground()), currentTenantKey);
|
|
|
|
|
|
// String encode = Base64Encoder.encode(fileByte.getData());
|
|
|
|
|
|
// salaryTemplate.setBackground(encode);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// // 邮箱打开
|
|
|
|
|
|
// boolean isEmailOpen = salaryTemplate.getEmailStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue());
|
|
|
|
|
|
//
|
|
|
|
|
|
// LocalDate salaryMonth = salarySend.getSalaryMonth();
|
|
|
|
|
|
// String yearI18n = SalaryI18nUtil.getI18nLabel(currentTenantKey, currentEmployeeId, 100325, "年");
|
|
|
|
|
|
// String monthI18n = SalaryI18nUtil.getI18nLabel(currentTenantKey, currentEmployeeId, 100326, "月");
|
|
|
|
|
|
// String text = salaryMonth.getYear() +
|
|
|
|
|
|
// yearI18n +
|
|
|
|
|
|
// salaryMonth.getMonth().getValue() +
|
|
|
|
|
|
// monthI18n +
|
|
|
|
|
|
// SalaryI18nUtil.getI18nLabel(currentTenantKey, currentEmployeeId, 100520, "工资待发明细");
|
|
|
|
|
|
//
|
|
|
|
|
|
// UserEntity sendUser = null;
|
|
|
|
|
|
// // 标题
|
|
|
|
|
|
// String title = getBillTitle(salaryTemplate.getTheme(), salaryMonth, tenantName, currentEmployeeId, currentTenantKey);
|
|
|
|
|
|
//
|
|
|
|
|
|
// // 获取所有人员信息
|
|
|
|
|
|
// List<Long> ids = enableSendList.stream().map(e->Long.valueOf(e.get("employeeId").toString())).collect(Collectors.toList());
|
2023-04-19 10:15:01 +08:00
|
|
|
|
// List<DataCollectionEmployee> allEmployees = hrmCommonEmployeeService.getEmployeeByIds(ids, currentTenantKey);
|
2022-04-12 10:11:53 +08:00
|
|
|
|
// List<SalaryTemplateSalaryItemSetListDTO> listDTOS = JSONArray.parseArray(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);
|
|
|
|
|
|
// Map<String, String> employeeField = SalaryAcctResultBO.buildEmployeeFieldName();
|
|
|
|
|
|
// enableSendList.forEach(e -> {
|
2023-04-19 10:15:01 +08:00
|
|
|
|
// Optional<DataCollectionEmployee> optionalSimpleEmployee = allEmployees.stream().filter(f->f.getEmployeeId().equals(Long.valueOf(e.get("employeeId").toString()))).findFirst();
|
2022-04-12 10:11:53 +08:00
|
|
|
|
// if (optionalSimpleEmployee.isPresent()) {
|
|
|
|
|
|
// buildEmployeeInfo(employeeInformation, optionalSimpleEmployee.get(), e.get("taxAgent").toString(), employeeField);
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
// List<UserEntity> receivers = Collections.singletonList(
|
|
|
|
|
|
// SalarySendBO.buildUser(Long.valueOf(e.get("employeeId").toString()), e.get("email") == null ? "" : e.get("email").toString(), currentTenantKey));
|
|
|
|
|
|
// Entity entity = SalarySendBO.buildEntity(e.get("id").toString(), SalaryI18nUtil.getI18nLabel(currentTenantKey, currentEmployeeId, 94626, "工资单"));
|
|
|
|
|
|
// EmailEntity emailInfo = new EmailEntity();
|
|
|
|
|
|
// // 邮箱打开
|
|
|
|
|
|
// if (isEmailOpen) {
|
|
|
|
|
|
// String emailContent = SalarySendBO.buildEmailContent(e, employeeInformation, title, salaryTemplate);
|
|
|
|
|
|
// emailInfo = SalarySendBO.buildEmailInfo(text, emailContent, salaryTemplate.getSendEmailId());
|
|
|
|
|
|
// }
|
|
|
|
|
|
// SendMessageEntity message = SalarySendBO.buildSendMessageEntity(text, sendUser, receivers, entity, emailInfo);
|
|
|
|
|
|
// log.info("开始发送============:{}", JsonUtil.toJsonString(message));
|
|
|
|
|
|
// // 开始发送
|
|
|
|
|
|
// log.info("发送结果===:{}", JsonUtil.toJsonString(asyncSystemMessageRest.sendMsg(message)));
|
|
|
|
|
|
// });
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
2022-04-14 19:32:09 +08:00
|
|
|
|
public Map<String, Object> withdraw(SalarySendWithdrawParam param) {
|
2022-04-12 10:11:53 +08:00
|
|
|
|
if (param.getSalarySendId() == null) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100327, "工资单发放Id必传"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Long salarySendId = param.getSalarySendId();
|
|
|
|
|
|
Collection<Long> ids = param.getIds();
|
|
|
|
|
|
|
2023-06-05 13:35:17 +08:00
|
|
|
|
// 获取可撤回的工资单
|
2022-11-25 10:53:23 +08:00
|
|
|
|
if (param.getSalarySendRangeIds() != null) {
|
|
|
|
|
|
//如果传了范围id,则使用范围id撤回
|
|
|
|
|
|
ids = getSalarySendRangeService(user)
|
2022-11-29 14:36:37 +08:00
|
|
|
|
.getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds(), SalarySendGrantTypeEnum.WITHDRAW);
|
2022-12-05 16:05:38 +08:00
|
|
|
|
if (ids.isEmpty()) {// 由于查出来是空的,会导致全部发放,在此进行拦截
|
|
|
|
|
|
throw new SalaryRunTimeException("工资撤回范围内没有匹配的员工");
|
2022-12-05 14:06:22 +08:00
|
|
|
|
}
|
2022-11-25 10:53:23 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
SalarySendPO salarySend = mapper.getById(salarySendId);
|
|
|
|
|
|
if (salarySend == null) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在"));
|
|
|
|
|
|
}
|
2023-06-05 13:35:17 +08:00
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
// 撤回
|
|
|
|
|
|
SalarySendInfoPO po = new SalarySendInfoPO();
|
|
|
|
|
|
po.setSendStatus(SalarySendStatusEnum.WITHDRAW.getValue());
|
2023-07-11 17:51:52 +08:00
|
|
|
|
po.setBillReadStatus(BillReadStatusEnum.UNREAD.getValue());
|
|
|
|
|
|
po.setBillConfirmStatus(BillConfimStatusEnum.UNCONFIRMED.getValue());
|
2022-04-12 10:11:53 +08:00
|
|
|
|
List<Integer> statusList = new ArrayList<>();
|
|
|
|
|
|
statusList.add(SalarySendStatusEnum.ALREADYSEND.getValue());
|
2022-06-29 17:38:00 +08:00
|
|
|
|
salarySendInfoMapper.updateGrantWithdraw(po, salarySendId, statusList, ids);
|
2022-04-12 10:11:53 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
po = new SalarySendInfoPO();
|
|
|
|
|
|
po.setDeleteType(0);
|
|
|
|
|
|
po.setSalarySendId(salarySendId);
|
|
|
|
|
|
List<SalarySendInfoPO> list = salarySendInfoMapper.listSome(po);
|
|
|
|
|
|
|
|
|
|
|
|
int sendNum = (int) list.stream().filter(e -> e.getSendStatus().equals(SalarySendStatusEnum.ALREADYSEND.getValue())).count();
|
|
|
|
|
|
int sendTotal = list.size();
|
|
|
|
|
|
|
|
|
|
|
|
SalarySendPO salarySendNew = new SalarySendPO();
|
|
|
|
|
|
try {
|
2022-04-22 11:02:15 +08:00
|
|
|
|
BeanUtils.copyProperties(salarySendNew, salarySend);
|
2022-04-12 10:11:53 +08:00
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
throw new SalaryRunTimeException("数据转换异常, " + e.getMessage());
|
|
|
|
|
|
}
|
|
|
|
|
|
salarySendNew.setSendNum(sendNum);
|
|
|
|
|
|
salarySendNew.setSendTotal(sendTotal);
|
|
|
|
|
|
mapper.updateById(salarySendNew);
|
|
|
|
|
|
|
|
|
|
|
|
// 记录日志
|
|
|
|
|
|
// SalaryLoggerUtil.recordUpdateSingleLog(salarySendLoggerTemplate,
|
|
|
|
|
|
// salarySend.getId(),
|
|
|
|
|
|
// salarySend.getSalaryMonth() + "-" + (CollectionUtils.isNotEmpty(salarySobs) ? salarySobs.get(0).getName() : ""),
|
|
|
|
|
|
// SalaryI18nUtil.getI18nLabel(currentTenantKey, currentEmployeeId, 100521, "撤回工资单发放"),
|
|
|
|
|
|
// SalaryI18nUtil.getI18nLabel(currentTenantKey, currentEmployeeId, 100521, "撤回工资单发放"),
|
|
|
|
|
|
// salarySend,
|
|
|
|
|
|
// salarySendNew);
|
|
|
|
|
|
|
2022-06-06 13:56:47 +08:00
|
|
|
|
|
|
|
|
|
|
SalarySendGrantParam grantParam = SalarySendGrantParam.builder().ids(param.getIds()).salarySendId(param.getSalarySendId()).build();
|
2023-06-05 13:35:17 +08:00
|
|
|
|
|
|
|
|
|
|
// 异步发送消息:先修改数据再发消息,避免出错后无法撤回撤回消息
|
2022-06-06 13:56:47 +08:00
|
|
|
|
sendMessage(false, list, grantParam, salarySend);
|
2023-06-05 13:35:17 +08:00
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
|
|
|
|
|
|
Map<String, Object> map = new HashMap<>(2);
|
|
|
|
|
|
map.put("sendNum", sendNum);
|
|
|
|
|
|
map.put("sendTotal", sendTotal);
|
2022-04-14 19:32:09 +08:00
|
|
|
|
return map;
|
2022-04-12 10:11:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-06-06 13:56:47 +08:00
|
|
|
|
|
2022-04-14 19:32:09 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public XSSFWorkbook exportInfoList(SalarySendInfoQueryParam queryParam) {
|
|
|
|
|
|
// 1.工作簿名称
|
|
|
|
|
|
String sheetName = SalaryI18nUtil.getI18nLabel(100528, "工资单发放信息");
|
|
|
|
|
|
List<Object> header = new ArrayList<>();
|
|
|
|
|
|
header.add(SalaryI18nUtil.getI18nLabel(85429, "姓名"));
|
|
|
|
|
|
header.add(SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"));
|
|
|
|
|
|
header.add(SalaryI18nUtil.getI18nLabel(86185, "部门"));
|
|
|
|
|
|
header.add(SalaryI18nUtil.getI18nLabel(86186, "手机号"));
|
|
|
|
|
|
header.add(SalaryI18nUtil.getI18nLabel(86317, "工号"));
|
2022-09-21 19:08:44 +08:00
|
|
|
|
header.add(SalaryI18nUtil.getI18nLabel(86317, "发送状态"));
|
2022-04-14 19:32:09 +08:00
|
|
|
|
|
|
|
|
|
|
List<List<Object>> rows = new ArrayList<>();
|
|
|
|
|
|
// 2.表头
|
|
|
|
|
|
rows.add(header);
|
|
|
|
|
|
|
|
|
|
|
|
// 校验
|
|
|
|
|
|
SalarySendInfoQueryParam.checkParam(queryParam);
|
|
|
|
|
|
|
|
|
|
|
|
// 获取行数据
|
2022-09-27 17:43:43 +08:00
|
|
|
|
//排序配置
|
|
|
|
|
|
OrderRuleVO orderRule = getSalarySysConfService(user).orderRule();
|
|
|
|
|
|
queryParam.setOrderRule(orderRule);
|
2022-04-14 19:32:09 +08:00
|
|
|
|
List<SalarySendInfoListDTO> list = salarySendInfoMapper.list(queryParam);
|
|
|
|
|
|
list.forEach(e -> {
|
|
|
|
|
|
// 发放状态
|
|
|
|
|
|
e.setSendStatus(SalarySendStatusEnum.getDefaultLabelByValue(Integer.valueOf(e.getSendStatus())));
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 3.添加行记录
|
|
|
|
|
|
// 3.表数据
|
|
|
|
|
|
for (SalarySendInfoListDTO dto : list) {
|
|
|
|
|
|
List<Object> row = new ArrayList<>();
|
|
|
|
|
|
row.add(dto.getUsername());
|
|
|
|
|
|
row.add(dto.getTaxAgent());
|
|
|
|
|
|
row.add(dto.getDepartment());
|
|
|
|
|
|
row.add(dto.getMobile());
|
|
|
|
|
|
row.add(dto.getJobNum());
|
|
|
|
|
|
row.add(dto.getSendStatus());
|
|
|
|
|
|
rows.add(row);
|
|
|
|
|
|
}
|
|
|
|
|
|
return ExcelUtil.genWorkbookV2(rows, sheetName);
|
|
|
|
|
|
}
|
2022-04-12 10:11:53 +08:00
|
|
|
|
|
|
|
|
|
|
// @BatchExportHandler("exportSalarySendInfo")
|
|
|
|
|
|
// public void salarySendInfoExportHandler() {
|
|
|
|
|
|
// BatchCallbackMessage message = BatchExportContext.getBatchCallbackMessage();
|
|
|
|
|
|
// System.out.println("接受到导出的结果" + JSONObject.toJSONString(message));
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
2022-04-14 19:32:09 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public XSSFWorkbook exportDetailList(SalarySendPO salarySend, SalarySendDetailQueryParam queryParam) {
|
|
|
|
|
|
|
|
|
|
|
|
// 1.根据模板获取薪资项目设置
|
2022-12-06 15:29:08 +08:00
|
|
|
|
SalaryAcctRecordPO salaryAcctRecord = getSalaryAcctRecordService(user).getById(salarySend.getSalaryAccountingId());
|
|
|
|
|
|
boolean isReplenish = salaryAcctRecord != null && Objects.equals(salaryAcctRecord.getBackCalcStatus(), (NumberUtils.INTEGER_ONE));
|
2022-04-14 19:32:09 +08:00
|
|
|
|
List<SalaryTemplatePO> salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId()));
|
2023-02-13 17:25:13 +08:00
|
|
|
|
List<SalaryTemplateSalaryItemListDTO> salaryItems = getSalaryItemsSetting(CollectionUtils.isNotEmpty(salaryTemplates) ? salaryTemplates.get(0) : null, isReplenish);
|
2022-04-14 19:32:09 +08:00
|
|
|
|
|
|
|
|
|
|
// 2.获取基本数据
|
2022-09-26 18:51:17 +08:00
|
|
|
|
//排序配置
|
|
|
|
|
|
OrderRuleVO orderRule = getSalarySysConfService(user).orderRule();
|
|
|
|
|
|
queryParam.setOrderRule(orderRule);
|
|
|
|
|
|
|
2022-10-28 09:39:31 +08:00
|
|
|
|
List<SalarySendDetailListDTO> list = salarySendInfoMapper.detailList(queryParam, null);
|
2022-04-14 19:32:09 +08:00
|
|
|
|
|
|
|
|
|
|
// 3.组装详情数据
|
|
|
|
|
|
List<Map<String, Object>> listMaps = buildDetailList(salaryItems, list, salarySend.getSalaryAccountingId());
|
|
|
|
|
|
|
|
|
|
|
|
// 1.工作簿名称
|
|
|
|
|
|
String sheetName = SalaryI18nUtil.getI18nLabel(97036, "工资单发放详情");
|
|
|
|
|
|
List<Object> header = new ArrayList<>();
|
|
|
|
|
|
header.add(SalaryI18nUtil.getI18nLabel(85429, "姓名"));
|
|
|
|
|
|
header.add(SalaryI18nUtil.getI18nLabel(86185, "部门"));
|
|
|
|
|
|
header.add(SalaryI18nUtil.getI18nLabel(86186, "手机号"));
|
|
|
|
|
|
header.add(SalaryI18nUtil.getI18nLabel(86317, "工号"));
|
|
|
|
|
|
// 动态列
|
|
|
|
|
|
if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(salaryItems)) {
|
|
|
|
|
|
for (SalaryTemplateSalaryItemListDTO salaryItem : salaryItems) {
|
|
|
|
|
|
header.add(salaryItem.getName());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
List<List<Object>> rows = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
|
|
// 2.表头
|
|
|
|
|
|
rows.add(header);
|
|
|
|
|
|
|
|
|
|
|
|
// 3.表数据
|
|
|
|
|
|
for (Map<String, Object> dto : listMaps) {
|
|
|
|
|
|
List<Object> row = new ArrayList<>();
|
|
|
|
|
|
row.add(dto.get("username"));
|
2023-03-15 17:09:02 +08:00
|
|
|
|
row.add(dto.get("department"));
|
2022-04-14 19:32:09 +08:00
|
|
|
|
row.add(dto.get("mobile"));
|
|
|
|
|
|
row.add(dto.get("jobNum"));
|
|
|
|
|
|
|
|
|
|
|
|
// 动态列
|
|
|
|
|
|
Map<String, Object> mapColumn = listMaps.get(0);
|
|
|
|
|
|
for (SalaryTemplateSalaryItemListDTO salaryItem : salaryItems) {
|
|
|
|
|
|
if (mapColumn.containsKey(salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX)) {
|
|
|
|
|
|
row.add(dto.get(salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
rows.add(row);
|
|
|
|
|
|
}
|
|
|
|
|
|
return ExcelUtil.genWorkbookV2(rows, sheetName);
|
|
|
|
|
|
}
|
2022-12-02 17:35:14 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalarySendCheckDTO> getSalarySendCheckResult(Set<Long> salaryAcctRecordIds) {
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salaryAcctRecordIds)) {
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
}
|
|
|
|
|
|
Map<String, Object> condition = new HashMap<>();
|
2023-02-13 17:25:13 +08:00
|
|
|
|
condition.put("salaryAccountingIds", salaryAcctRecordIds);
|
2022-12-02 17:35:14 +08:00
|
|
|
|
List<SalarySendPO> salarySendPOS = getSalarySendMapper().listSomeWithCondition(condition);
|
|
|
|
|
|
Map<Long, SalarySendPO> map = SalaryEntityUtil.convert2Map(salarySendPOS, SalarySendPO::getSalaryAccountingId);
|
|
|
|
|
|
|
|
|
|
|
|
return salaryAcctRecordIds.stream().map(m -> {
|
|
|
|
|
|
SalarySendPO salarySend = map.get(m);
|
|
|
|
|
|
SalarySendCheckDTO salarySendCheck = new SalarySendCheckDTO();
|
|
|
|
|
|
salarySendCheck.setSalaryAcctId(m);
|
|
|
|
|
|
// 是否存在已经发送
|
|
|
|
|
|
salarySendCheck.setAlreadySend(salarySend != null && salarySend.getSendNum() > 0);
|
|
|
|
|
|
// 是否已经发送完成
|
2022-12-15 11:12:36 +08:00
|
|
|
|
salarySendCheck.setSendFinished(salarySend != null && Objects.equals(salarySend.getSendNum(), salarySend.getSendTotal()));
|
2022-12-02 17:35:14 +08:00
|
|
|
|
return salarySendCheck;
|
|
|
|
|
|
}).collect(Collectors.toList());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void handleHistory() {
|
|
|
|
|
|
mapper.batchHandleSendStatusHistory();
|
|
|
|
|
|
mapper.batchHandleSalaryAcctTypeHistory();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-12 10:11:53 +08:00
|
|
|
|
//
|
|
|
|
|
|
// @BatchExportHandler("exportSalarySendDetail")
|
|
|
|
|
|
// public void salarySendDetailExportHandler() {
|
|
|
|
|
|
// BatchCallbackMessage message = BatchExportContext.getBatchCallbackMessage();
|
|
|
|
|
|
// System.out.println("接受到导出的结果" + JSONObject.toJSONString(message));
|
|
|
|
|
|
// }
|
2023-03-15 16:00:37 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
2023-04-28 16:04:52 +08:00
|
|
|
|
public Map<String, Object> sumRow(SalarySendInfoQueryParam param) {
|
|
|
|
|
|
Long salarySendId = param.getSalarySendId();
|
2023-03-15 16:00:37 +08:00
|
|
|
|
// 获取薪资核算ID
|
|
|
|
|
|
SalarySendPO salarySendPO = getById(salarySendId);
|
2023-05-08 09:27:20 +08:00
|
|
|
|
if (Objects.isNull(salarySendPO)) {
|
2023-03-15 16:00:37 +08:00
|
|
|
|
throw new SalaryRunTimeException("工资发放记录不存在或已被删除");
|
|
|
|
|
|
}
|
2023-04-28 16:04:52 +08:00
|
|
|
|
|
|
|
|
|
|
SalaryAcctResultQueryParam queryParam = SalaryAcctResultQueryParam.builder().salaryAcctRecordId(salarySendPO.getSalaryAccountingId()).build();
|
|
|
|
|
|
// 查询薪资核算人员
|
|
|
|
|
|
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user)
|
|
|
|
|
|
.listByResultQueryParam(queryParam);
|
|
|
|
|
|
|
|
|
|
|
|
if (org.apache.commons.collections4.CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
|
2023-07-11 17:28:15 +08:00
|
|
|
|
return Collections.emptyMap();
|
2023-04-28 16:04:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
// 查询薪资核算记录
|
|
|
|
|
|
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId());
|
|
|
|
|
|
if (Objects.isNull(salaryAcctRecordPO)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 查询薪资核算所用薪资账套的薪资项目
|
|
|
|
|
|
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
|
|
|
|
|
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
|
2023-06-05 13:35:17 +08:00
|
|
|
|
if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), NumberUtils.INTEGER_ONE)) {
|
2023-04-28 16:04:52 +08:00
|
|
|
|
// 是回算,获取回算项
|
|
|
|
|
|
List<SalarySobBackItemPO> salarySobBackItemPOS = getSalarySobBackItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
|
|
|
|
|
|
salaryItemIds.addAll(salarySobBackItemPOS.stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList()));
|
|
|
|
|
|
}
|
|
|
|
|
|
List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
|
|
|
|
|
|
|
|
|
|
|
|
// 查询薪资核算结果
|
2023-05-26 15:13:56 +08:00
|
|
|
|
List<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getId, Collectors.toList());
|
2023-04-28 16:04:52 +08:00
|
|
|
|
List<SalaryAcctResultPO> salaryAcctResultPOS = getSalaryAcctResultService(user).listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
|
|
|
|
|
|
// 是否是补发工资单
|
|
|
|
|
|
List<SalarySendInfoPO> salarySendInfoPOS = getSalarySendInfoMapper().listSome(SalarySendInfoPO.builder().salarySendId(salarySendId).build());
|
|
|
|
|
|
List<Long> sendEmployeeIds = salarySendInfoPOS.stream().map(SalarySendInfoPO::getEmployeeId).collect(Collectors.toList());
|
2023-07-11 17:28:15 +08:00
|
|
|
|
salaryAcctResultPOS = salaryAcctResultPOS.stream().filter(po -> sendEmployeeIds.contains(po.getEmployeeId())).collect(Collectors.toList());
|
2023-04-28 16:04:52 +08:00
|
|
|
|
|
|
|
|
|
|
Map<String, Object> map = new HashMap<>();
|
|
|
|
|
|
Map<Long, List<SalaryAcctResultPO>> acctResultMap = SalaryEntityUtil.group2Map(salaryAcctResultPOS, SalaryAcctResultPO::getSalaryItemId);
|
|
|
|
|
|
salaryItemPOS.stream().filter(item -> SalaryDataTypeEnum.NUMBER.getValue().equals(item.getDataType())).forEach(item -> {
|
|
|
|
|
|
BigDecimal sum = Optional.ofNullable(acctResultMap.get(item.getId()))
|
|
|
|
|
|
.orElse(new ArrayList<>())
|
|
|
|
|
|
.stream()
|
|
|
|
|
|
.map(SalaryAcctResultPO::getResultValue)
|
|
|
|
|
|
.filter(NumberUtils::isCreatable)
|
|
|
|
|
|
.map(BigDecimal::new)
|
|
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
|
map.put(item.getId().toString(), SalaryAcctFormulaBO.roundResultValue(sum.toString(), item, Collections.emptyList(), Collections.emptyMap()));
|
|
|
|
|
|
});
|
|
|
|
|
|
return map;
|
2023-03-15 16:00:37 +08:00
|
|
|
|
}
|
2023-05-16 15:05:02 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void deleteBySalaryAcctRecordIds(Collection<Long> ids) {
|
2023-06-05 13:35:17 +08:00
|
|
|
|
if (CollectionUtils.isNotEmpty(ids)) {
|
2023-05-16 15:05:02 +08:00
|
|
|
|
getSalarySendMapper().deleteBySalaryAcctRecordIds(ids);
|
|
|
|
|
|
getSalarySendInfoMapper().deleteBySalaryAcctRecordIds(ids);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-06-14 15:51:26 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void sendMobileCode(SMSCodeSendParam param) {
|
|
|
|
|
|
Long id = param.getId();
|
|
|
|
|
|
SalarySendInfoPO po = getSalarySendInfoMapper().getById(id);
|
|
|
|
|
|
if (po == null) {
|
|
|
|
|
|
throw new SalaryRunTimeException("未获取工资单发放信息");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Long employeeId = po.getEmployeeId();
|
|
|
|
|
|
DataCollectionEmployee employee = getSalaryEmployeeService(user).getEmployeeById(employeeId);
|
|
|
|
|
|
if (employee == null) {
|
|
|
|
|
|
throw new SalaryRunTimeException("未获取人员信息");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String mobile = employee.getMobile();
|
|
|
|
|
|
if (Validator.isMobile(mobile)) {
|
|
|
|
|
|
throw new SalaryRunTimeException("手机号信息有误");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
boolean checkSendSMS = MessageUtil.checkSendSMS();
|
|
|
|
|
|
if (!checkSendSMS) {
|
|
|
|
|
|
throw new SalaryRunTimeException("短信服务异常");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//1、生成6位验证码
|
|
|
|
|
|
String mobileCode = (int) ((Math.random() * 9 + 1) * 100000) + "";
|
|
|
|
|
|
//失效时间
|
|
|
|
|
|
long expirationTime = LocalDateTime.now().plusMinutes(10L).toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
|
|
|
|
|
|
String cacheValue = mobileCode + "_" + expirationTime;
|
|
|
|
|
|
|
|
|
|
|
|
//2、验证码缓存,10分钟失效
|
|
|
|
|
|
getSalaryCacheService(user).set(SALARY_CACHE_SMS_CODE + "_" + id, cacheValue);
|
|
|
|
|
|
|
|
|
|
|
|
//3、发送短信
|
|
|
|
|
|
MessageUtil.sendSMS(mobile, "验证码:" + mobileCode + "有效时间10分钟,用于查看工资单,请不要告诉他人。");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public Boolean checkMobileCode(SMSCodeCheckParam param) {
|
|
|
|
|
|
Long id = param.getId();
|
|
|
|
|
|
|
|
|
|
|
|
String mobileCode = param.getMobileCode();
|
|
|
|
|
|
|
|
|
|
|
|
//取出验证码
|
|
|
|
|
|
String cacheValue = getSalaryCacheService(user).get(SALARY_CACHE_SMS_CODE + "_" + id);
|
|
|
|
|
|
String[] cache = cacheValue.split("_");
|
|
|
|
|
|
String code = cache[0];
|
|
|
|
|
|
//失效时间
|
|
|
|
|
|
long expirationTime = Long.parseLong(cache[1]);
|
|
|
|
|
|
|
|
|
|
|
|
long nowTime = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
|
|
|
|
|
|
if (nowTime > expirationTime) {
|
|
|
|
|
|
throw new SalaryRunTimeException("验证码已失效,请重新发送");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!StringUtils.equals(code, mobileCode)) {
|
|
|
|
|
|
throw new SalaryRunTimeException("验证码错误");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2023-07-03 17:46:11 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
2023-07-04 18:03:57 +08:00
|
|
|
|
public List<SalarySendInfoPO> getNeedSendInfoList(List<Long> salarySendIds) {
|
|
|
|
|
|
if(CollectionUtils.isEmpty(salarySendIds)){
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
}
|
|
|
|
|
|
return getSalarySendInfoMapper().getNeedSendInfoList(salarySendIds);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalarySendPO> getNeedSendListBySalarySobIds(List<Long> salarySobIds) {
|
2023-07-04 14:35:51 +08:00
|
|
|
|
if(CollectionUtils.isEmpty(salarySobIds)){
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
}
|
2023-07-05 10:36:02 +08:00
|
|
|
|
return getSalarySendMapper().getNeedSendListBySalarySobIds(salarySobIds);
|
2023-07-03 17:46:11 +08:00
|
|
|
|
}
|
2023-07-11 17:28:15 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
2023-07-14 09:55:36 +08:00
|
|
|
|
public List<SalarySendInfoPO> listUnConfirmedSendInfo(List<Long> salarySobIds) {
|
|
|
|
|
|
if(CollectionUtils.isEmpty(salarySobIds))
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
return getSalarySendInfoMapper().listUnConfirmedSendInfo(salarySobIds);
|
2023-07-11 17:28:15 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void autoConfirmSalaryBill(List<Long> needAutoSendIds) {
|
|
|
|
|
|
if(CollectionUtils.isEmpty(needAutoSendIds)){
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2023-07-14 09:55:36 +08:00
|
|
|
|
List<List<Long>> partition = Lists.partition((List) needAutoSendIds, 500);
|
|
|
|
|
|
partition.forEach(getSalarySendInfoMapper()::autoConfirmSalaryBill);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalarySendPO> getByIds(List<Long> salarySendId) {
|
|
|
|
|
|
if(CollectionUtils.isEmpty(salarySendId)){
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
}
|
|
|
|
|
|
return getSalarySendMapper().getByIds(salarySendId);
|
2023-07-11 17:28:15 +08:00
|
|
|
|
}
|
2022-04-12 10:11:53 +08:00
|
|
|
|
}
|