2022-03-17 15:14:35 +08:00
|
|
|
|
package com.engine.salary.service.impl;
|
|
|
|
|
|
|
2024-08-07 09:06:09 +08:00
|
|
|
|
import cn.hutool.core.util.NumberUtil;
|
2023-02-06 17:16:11 +08:00
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
2024-08-06 10:32:57 +08:00
|
|
|
|
import com.api.formmode.mybatis.util.SqlProxyHandle;
|
2022-03-30 20:27:17 +08:00
|
|
|
|
import com.engine.common.util.ServiceUtil;
|
2022-03-17 15:14:35 +08:00
|
|
|
|
import com.engine.core.impl.Service;
|
2024-08-06 10:32:57 +08:00
|
|
|
|
import com.engine.hrmelog.entity.dto.LoggerContext;
|
2022-03-17 15:14:35 +08:00
|
|
|
|
import com.engine.salary.biz.SalaryItemBiz;
|
2022-03-21 09:33:21 +08:00
|
|
|
|
import com.engine.salary.biz.SysSalaryItemBiz;
|
2023-12-21 20:25:00 +08:00
|
|
|
|
import com.engine.salary.config.SalaryElogConfig;
|
2024-08-07 09:06:09 +08:00
|
|
|
|
import com.engine.salary.constant.SalaryDefaultTenantConstant;
|
|
|
|
|
|
import com.engine.salary.entity.salaryformula.param.SalaryFormulaSaveParam;
|
2023-02-17 17:19:17 +08:00
|
|
|
|
import com.engine.salary.entity.salaryformula.po.FormulaPO;
|
2023-02-17 14:37:59 +08:00
|
|
|
|
import com.engine.salary.entity.salaryformula.po.FormulaVar;
|
2022-03-21 09:33:21 +08:00
|
|
|
|
import com.engine.salary.entity.salaryitem.bo.SalaryItemBO;
|
2024-08-08 16:53:31 +08:00
|
|
|
|
import com.engine.salary.entity.salaryitem.config.SalaryItemAllConfig;
|
2024-08-07 09:06:09 +08:00
|
|
|
|
import com.engine.salary.entity.salaryitem.config.SalaryItemExcelConfig;
|
|
|
|
|
|
import com.engine.salary.entity.salaryitem.param.*;
|
2022-03-17 15:14:35 +08:00
|
|
|
|
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
|
2022-03-21 09:33:21 +08:00
|
|
|
|
import com.engine.salary.entity.salaryitem.po.SysSalaryItemPO;
|
2023-02-17 14:37:59 +08:00
|
|
|
|
import com.engine.salary.entity.salarysob.po.SalarySobBackItemPO;
|
2022-03-30 20:27:17 +08:00
|
|
|
|
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
|
2023-08-31 09:24:41 +08:00
|
|
|
|
import com.engine.salary.entity.salarysob.po.SalarySobPO;
|
2022-11-11 13:59:37 +08:00
|
|
|
|
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
|
2024-08-07 09:06:09 +08:00
|
|
|
|
import com.engine.salary.enums.*;
|
|
|
|
|
|
import com.engine.salary.enums.salaryformula.ReferenceTypeEnum;
|
|
|
|
|
|
import com.engine.salary.enums.salaryformula.ReturnTypeEnum;
|
|
|
|
|
|
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
|
2022-11-11 13:59:37 +08:00
|
|
|
|
import com.engine.salary.enums.sicategory.SharedTypeEnum;
|
2022-03-21 09:33:21 +08:00
|
|
|
|
import com.engine.salary.exception.SalaryRunTimeException;
|
2024-08-06 10:32:57 +08:00
|
|
|
|
import com.engine.salary.mapper.salaryitem.SalaryItemMapper;
|
2023-02-17 14:37:59 +08:00
|
|
|
|
import com.engine.salary.service.*;
|
2024-08-07 14:40:08 +08:00
|
|
|
|
import com.engine.salary.util.JsonUtil;
|
2022-03-21 09:33:21 +08:00
|
|
|
|
import com.engine.salary.util.SalaryEntityUtil;
|
|
|
|
|
|
import com.engine.salary.util.SalaryI18nUtil;
|
2024-08-07 09:06:09 +08:00
|
|
|
|
import com.engine.salary.util.db.IdGenerator;
|
|
|
|
|
|
import com.engine.salary.util.excel.ExcelParseHelper;
|
2024-08-07 14:23:35 +08:00
|
|
|
|
import com.engine.salary.util.excel.ExcelSupport;
|
2024-08-07 14:40:08 +08:00
|
|
|
|
import com.engine.salary.util.excel.ExcelUtil;
|
2024-08-07 09:06:09 +08:00
|
|
|
|
import com.engine.salary.util.excel.ImportExcelResponse;
|
2022-04-15 13:54:47 +08:00
|
|
|
|
import com.engine.salary.util.page.PageInfo;
|
2022-11-11 13:59:37 +08:00
|
|
|
|
import com.engine.salary.util.page.SalaryPageUtil;
|
2023-08-31 09:24:41 +08:00
|
|
|
|
import com.engine.salary.util.valid.ValidUtil;
|
2024-08-07 14:40:08 +08:00
|
|
|
|
import com.google.common.collect.Lists;
|
|
|
|
|
|
import com.weaver.general.Util;
|
2023-02-17 14:37:59 +08:00
|
|
|
|
import lombok.AllArgsConstructor;
|
|
|
|
|
|
import lombok.Builder;
|
|
|
|
|
|
import lombok.Data;
|
|
|
|
|
|
import lombok.NoArgsConstructor;
|
2022-03-17 15:14:35 +08:00
|
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
2023-02-17 15:58:33 +08:00
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
2024-08-07 14:23:35 +08:00
|
|
|
|
import org.apache.poi.ss.usermodel.Sheet;
|
2024-08-07 13:25:57 +08:00
|
|
|
|
import org.apache.poi.util.IOUtils;
|
2024-08-07 14:40:08 +08:00
|
|
|
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
2022-03-21 09:33:21 +08:00
|
|
|
|
import org.springframework.beans.BeanUtils;
|
2024-08-07 09:06:09 +08:00
|
|
|
|
import weaver.file.ImageFileManager;
|
2022-03-30 20:27:17 +08:00
|
|
|
|
import weaver.hrm.User;
|
2022-03-17 15:14:35 +08:00
|
|
|
|
|
2024-08-07 09:06:09 +08:00
|
|
|
|
import java.io.InputStream;
|
2022-03-21 09:33:21 +08:00
|
|
|
|
import java.util.*;
|
2022-11-11 13:59:37 +08:00
|
|
|
|
import java.util.stream.Collectors;
|
2022-03-17 15:14:35 +08:00
|
|
|
|
|
2024-08-07 09:06:09 +08:00
|
|
|
|
import static com.engine.salary.util.excel.ExcelSupport.EXCEL_TYPE_XLSX;
|
|
|
|
|
|
|
2022-03-17 15:14:35 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 薪资项目
|
|
|
|
|
|
* <p>Copyright: Copyright (c) 2022</p>
|
|
|
|
|
|
* <p>Company: 泛微软件</p>
|
|
|
|
|
|
*
|
|
|
|
|
|
* @author qiantao
|
|
|
|
|
|
* @version 1.0
|
|
|
|
|
|
**/
|
|
|
|
|
|
public class SalaryItemServiceImpl extends Service implements SalaryItemService {
|
|
|
|
|
|
|
2022-03-21 09:33:21 +08:00
|
|
|
|
private SalaryItemBiz salaryItemBiz = new SalaryItemBiz();
|
2022-03-30 20:27:17 +08:00
|
|
|
|
|
|
|
|
|
|
private SalarySobItemService getSalarySobItemService(User user) {
|
2023-02-17 14:37:59 +08:00
|
|
|
|
return ServiceUtil.getService(SalarySobItemServiceImpl.class, user);
|
2022-03-30 20:27:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-11-11 13:59:37 +08:00
|
|
|
|
private TaxAgentService getTaxAgentService(User user) {
|
2023-02-17 14:37:59 +08:00
|
|
|
|
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private SysSalaryItemService getSysSalaryItemService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SysSalaryItemServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private SalaryFormulaService getSalaryFormulaService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SalaryFormulaServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private SalarySobBackItemService getSalarySobBackItemService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SalarySobBackItemServiceImpl.class, user);
|
2022-11-11 13:59:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-31 09:24:41 +08:00
|
|
|
|
public SalarySobService getSalarySobService(User user) {
|
|
|
|
|
|
return ServiceUtil.getService(SalarySobServiceImpl.class, user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-21 09:33:21 +08:00
|
|
|
|
private SysSalaryItemBiz sysSalaryItemBiz = new SysSalaryItemBiz();
|
2024-08-06 10:32:57 +08:00
|
|
|
|
|
|
|
|
|
|
private SalaryItemMapper getSalaryItemMapper() {
|
|
|
|
|
|
return SqlProxyHandle.getProxy(SalaryItemMapper.class);
|
|
|
|
|
|
}
|
2022-03-17 15:14:35 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public SalaryItemPO getById(Long id) {
|
2022-03-21 09:33:21 +08:00
|
|
|
|
return salaryItemBiz.getById(id);
|
2022-03-17 15:14:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryItemPO> listAll() {
|
2022-03-21 09:33:21 +08:00
|
|
|
|
return salaryItemBiz.listAll();
|
2022-03-17 15:14:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryItemPO> listByIds(Collection<Long> ids) {
|
|
|
|
|
|
if (CollectionUtils.isEmpty(ids)) {
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
}
|
2022-03-21 09:33:21 +08:00
|
|
|
|
return salaryItemBiz.listSome(SalaryItemPO.builder().ids(ids).build());
|
2022-03-17 15:14:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryItemPO> listBySysSalaryItemIds(Collection<Long> sysSalaryItemIds) {
|
|
|
|
|
|
if (CollectionUtils.isEmpty(sysSalaryItemIds)) {
|
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
|
}
|
2022-03-21 09:33:21 +08:00
|
|
|
|
return salaryItemBiz.listSome(SalaryItemPO.builder().sysSalaryItemIds(sysSalaryItemIds).build());
|
2022-03-17 15:14:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryItemPO> listByName(String name) {
|
2022-03-21 09:33:21 +08:00
|
|
|
|
return salaryItemBiz.listSome(SalaryItemPO.builder().name(name).build());
|
2022-03-17 15:14:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-08-07 09:06:09 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public SalaryItemPO getByName(String name) {
|
|
|
|
|
|
return getSalaryItemMapper().getByName(name);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-03-17 15:14:35 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryItemPO> listBySystemType(SalarySystemTypeEnum systemType) {
|
2022-03-21 09:33:21 +08:00
|
|
|
|
return salaryItemBiz.listSome(SalaryItemPO.builder().systemType(systemType.getValue()).build());
|
2022-03-17 15:14:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryItemPO> listBySystemTypeAndUseDefault(SalarySystemTypeEnum systemType, Integer useDefault) {
|
2022-03-21 09:33:21 +08:00
|
|
|
|
return salaryItemBiz.listSome(SalaryItemPO.builder().systemType(systemType.getValue()).useDefault(useDefault).build());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryItemPO> listByParam(SalaryItemSearchParam searchParam) {
|
|
|
|
|
|
return salaryItemBiz.listByParam(searchParam);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-31 09:55:24 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public List<SalaryItemPO> listByParamOrderById(SalaryItemSearchParam searchParam) {
|
|
|
|
|
|
return salaryItemBiz.listByParamOrderById(searchParam);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-21 09:33:21 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public PageInfo<SalaryItemPO> listPageByParam(SalaryItemSearchParam searchParam) {
|
2022-11-11 13:59:37 +08:00
|
|
|
|
Boolean needAuth = getTaxAgentService(user).isNeedAuth((long) user.getUID());
|
2023-02-21 16:39:17 +08:00
|
|
|
|
Boolean isAdminEnable = getTaxAgentService(user).isAdminEnable((long) user.getUID());
|
2022-11-11 13:59:37 +08:00
|
|
|
|
List<SalaryItemPO> salaryItemPOS = salaryItemBiz.listByParam(searchParam);
|
|
|
|
|
|
if (needAuth) {
|
2023-02-21 17:02:39 +08:00
|
|
|
|
if (isAdminEnable) {
|
|
|
|
|
|
//管理员
|
2023-02-21 16:39:17 +08:00
|
|
|
|
Set<Long> userTaxAgentIds = getTaxAgentService(user).listAllTaxAgents((long) user.getUID())
|
|
|
|
|
|
.stream().map(TaxAgentPO::getId).collect(Collectors.toSet());
|
|
|
|
|
|
salaryItemPOS = salaryItemPOS.stream()
|
2023-05-17 16:57:37 +08:00
|
|
|
|
.filter(po -> filterInRange(userTaxAgentIds, po))
|
2023-06-01 17:52:31 +08:00
|
|
|
|
.sorted(new Comparator<SalaryItemPO>() {
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public int compare(SalaryItemPO o1, SalaryItemPO o2) {
|
2023-09-27 17:17:56 +08:00
|
|
|
|
if (o1.getSortedIndex() == null && o2.getSortedIndex() == null) {
|
|
|
|
|
|
Integer systemType1 = o1.getSystemType() == null ? 0 : o1.getSystemType();
|
|
|
|
|
|
Integer systemType2 = o2.getSystemType() == null ? 0 : o2.getSystemType();
|
2023-06-01 17:52:31 +08:00
|
|
|
|
return systemType1.compareTo(systemType2);
|
2023-09-27 17:17:56 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
Integer sortedIndex1 = o1.getSortedIndex() == null ? 0 : o1.getSortedIndex();
|
|
|
|
|
|
Integer sortedIndex2 = o2.getSortedIndex() == null ? 0 : o2.getSortedIndex();
|
2023-06-01 17:52:31 +08:00
|
|
|
|
return sortedIndex2.compareTo(sortedIndex1);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
2023-05-17 16:57:37 +08:00
|
|
|
|
.collect(Collectors.toList());
|
2023-02-21 17:02:39 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
//普通用户
|
2023-02-21 16:39:17 +08:00
|
|
|
|
salaryItemPOS = new ArrayList<>();
|
|
|
|
|
|
}
|
2022-11-11 13:59:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
return SalaryPageUtil.buildPage(searchParam.getCurrent(), searchParam.getPageSize(), salaryItemPOS);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-31 09:55:24 +08:00
|
|
|
|
|
2022-11-11 13:59:37 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public boolean filterInRange(Set<Long> userTaxAgentIds, SalaryItemPO po) {
|
|
|
|
|
|
return null == po.getSharedType()
|
|
|
|
|
|
|| SharedTypeEnum.PUBLIC.getValue().equals(po.getSharedType().toString())
|
2023-02-06 17:16:11 +08:00
|
|
|
|
|| (StrUtil.isNotBlank(po.getTaxAgentIds())
|
2022-11-11 13:59:37 +08:00
|
|
|
|
&& Arrays.stream(po.getTaxAgentIds().split(","))
|
|
|
|
|
|
.map(Long::valueOf)
|
|
|
|
|
|
.anyMatch(userTaxAgentIds::contains));
|
2022-03-17 15:14:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// @Override
|
|
|
|
|
|
// public Page<SalaryItemPO> listPageByParam(SalaryItemSearchParam searchParam, String tenantKey) {
|
|
|
|
|
|
// // 分页参数
|
|
|
|
|
|
// Page<SalaryItemPO> page = SalaryPageUtil.buildPage(searchParam.getCurrent(), searchParam.getPageSize());
|
|
|
|
|
|
// // 构建查询参数
|
|
|
|
|
|
// Wrapper<SalaryItemPO> queryWrapper = SalaryItemBO.buildQueryWrapper(searchParam, tenantKey);
|
|
|
|
|
|
// // 返回查询结果
|
2022-03-21 09:33:21 +08:00
|
|
|
|
// return SalaryItemBiz.selectPage(page, queryWrapper);
|
2022-03-17 15:14:35 +08:00
|
|
|
|
// }
|
|
|
|
|
|
|
2022-03-21 09:33:21 +08:00
|
|
|
|
@Override
|
2024-02-21 18:19:02 +08:00
|
|
|
|
public SalaryItemPO save(SalaryItemSaveParam saveParam) {
|
2022-03-21 09:33:21 +08:00
|
|
|
|
// 名称不能和已有的自定义薪资项目重名
|
|
|
|
|
|
List<SalaryItemPO> salaryItemPOS = listByName(saveParam.getName());
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(salaryItemPOS)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98326, "薪资项目名称已存在,请重新命名"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 名称不能和已有的系统薪资项目重名
|
2023-07-11 11:05:35 +08:00
|
|
|
|
SysSalaryItemPO sysSalaryItem = sysSalaryItemBiz.selectOneByName(saveParam.getName());
|
|
|
|
|
|
if (sysSalaryItem != null) {
|
2022-03-21 09:33:21 +08:00
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98328, "自定义薪资项目的名称不能和系统薪资项目的名称重名"));
|
|
|
|
|
|
}
|
2022-03-24 16:59:52 +08:00
|
|
|
|
SalaryItemPO salaryItemPO = SalaryItemBO.convert2SalaryItemPO(saveParam, (long) user.getUID());
|
2022-03-21 09:33:21 +08:00
|
|
|
|
salaryItemBiz.insert(salaryItemPO);
|
2024-02-21 18:19:02 +08:00
|
|
|
|
return salaryItemPO;
|
2022-03-21 09:33:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void batchSave(Collection<SalaryItemPO> salaryItemPOS) {
|
|
|
|
|
|
salaryItemBiz.batchSave(salaryItemPOS);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
2024-02-21 18:19:02 +08:00
|
|
|
|
public SalaryItemPO update(SalaryItemSaveParam saveParam) {
|
2022-03-21 09:33:21 +08:00
|
|
|
|
// 查询薪资项目,判断薪资项目是否存在
|
|
|
|
|
|
SalaryItemPO salaryItemPO = getById(saveParam.getId());
|
|
|
|
|
|
if (Objects.isNull(salaryItemPO)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98299, "参数错误,薪资项目不存在或已被删除"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 名称不能和已有的自定义薪资项目重名
|
|
|
|
|
|
List<SalaryItemPO> salaryItemPOS = listByName(saveParam.getName());
|
|
|
|
|
|
boolean nameExist = salaryItemPOS.stream().anyMatch(e -> !Objects.equals(salaryItemPO.getId(), e.getId()));
|
|
|
|
|
|
if (nameExist) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98326, "薪资项目名称已存在,请重新命名"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 名称不能和已有的系统薪资项目重名
|
|
|
|
|
|
List<SysSalaryItemPO> sysSalaryItemPOS = sysSalaryItemBiz.listSome(SysSalaryItemPO.builder().name(saveParam.getName()).build());
|
|
|
|
|
|
boolean sysNameExist = sysSalaryItemPOS.stream().anyMatch(e -> !Objects.equals(salaryItemPO.getSysSalaryItemId(), e.getId()));
|
|
|
|
|
|
if (sysNameExist) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98328, "自定义薪资项目的名称不能和系统薪资项目的名称重名"));
|
|
|
|
|
|
}
|
|
|
|
|
|
// 更新薪资项目
|
|
|
|
|
|
SalaryItemPO newSalaryItemPO = new SalaryItemPO();
|
|
|
|
|
|
BeanUtils.copyProperties(salaryItemPO, newSalaryItemPO);
|
|
|
|
|
|
newSalaryItemPO.setName(saveParam.getName());
|
|
|
|
|
|
newSalaryItemPO.setUseDefault(saveParam.getUseDefault());
|
|
|
|
|
|
newSalaryItemPO.setUseInEmployeeSalary(saveParam.getUseInEmployeeSalary());
|
2023-07-14 11:34:53 +08:00
|
|
|
|
newSalaryItemPO.setHideDefault(saveParam.getHideDefault());
|
2022-03-22 21:01:38 +08:00
|
|
|
|
newSalaryItemPO.setRoundingMode(saveParam.getRoundingMode());
|
2022-03-21 09:33:21 +08:00
|
|
|
|
newSalaryItemPO.setPattern(saveParam.getPattern());
|
2023-07-28 09:48:27 +08:00
|
|
|
|
newSalaryItemPO.setValueType(saveParam.getValueType());
|
2022-05-07 15:20:39 +08:00
|
|
|
|
newSalaryItemPO.setDataType(saveParam.getDataType());
|
2022-03-22 21:01:38 +08:00
|
|
|
|
newSalaryItemPO.setFormulaId(Objects.equals(saveParam.getValueType(), SalaryValueTypeEnum.INPUT.getValue()) ? 0L : saveParam.getFormulaId());
|
2022-03-21 09:33:21 +08:00
|
|
|
|
newSalaryItemPO.setDescription(saveParam.getDescription());
|
|
|
|
|
|
newSalaryItemPO.setUpdateTime(new Date());
|
2022-11-15 17:24:23 +08:00
|
|
|
|
newSalaryItemPO.setSharedType(saveParam.getSharedType());
|
|
|
|
|
|
newSalaryItemPO.setTaxAgentIds(saveParam.getTaxAgentIds());
|
2023-06-01 17:52:31 +08:00
|
|
|
|
newSalaryItemPO.setSortedIndex(saveParam.getSortedIndex());
|
2024-01-02 16:37:07 +08:00
|
|
|
|
newSalaryItemPO.setWidth(saveParam.getWidth());
|
2024-05-20 15:04:14 +08:00
|
|
|
|
newSalaryItemPO.setDefaultValue(saveParam.getDefaultValue());
|
2022-03-21 09:33:21 +08:00
|
|
|
|
salaryItemBiz.updateById(newSalaryItemPO);
|
2023-02-17 15:58:33 +08:00
|
|
|
|
|
2023-02-17 17:52:29 +08:00
|
|
|
|
//改名后更新公式
|
2023-02-17 15:58:33 +08:00
|
|
|
|
String oldName = salaryItemPO.getName();
|
|
|
|
|
|
String newName = saveParam.getName();
|
|
|
|
|
|
if (!StringUtils.equals(oldName, newName)) {
|
2023-02-17 17:52:29 +08:00
|
|
|
|
|
|
|
|
|
|
//薪资项目
|
2023-02-17 15:58:33 +08:00
|
|
|
|
|
2023-09-27 17:17:56 +08:00
|
|
|
|
if (newSalaryItemPO.getUseInEmployeeSalary() == 0) {
|
|
|
|
|
|
String itemPrefix = "salaryItem_";
|
|
|
|
|
|
String fieldNamePrefix = "{薪资项目.%s}";
|
|
|
|
|
|
changeName(salaryItemPO, oldName, newName, itemPrefix, fieldNamePrefix);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (newSalaryItemPO.getUseInEmployeeSalary() == 1) {
|
|
|
|
|
|
//引用档案
|
|
|
|
|
|
String itemPrefix = "salaryArchives_";
|
|
|
|
|
|
String fieldNamePrefix = "{薪资档案.%s}";
|
|
|
|
|
|
changeName(salaryItemPO, oldName, newName, itemPrefix, fieldNamePrefix);
|
|
|
|
|
|
|
|
|
|
|
|
//引用项目
|
|
|
|
|
|
itemPrefix = "salaryItem_";
|
|
|
|
|
|
fieldNamePrefix = "{薪资项目.%s}";
|
|
|
|
|
|
changeName(salaryItemPO, oldName, newName, itemPrefix, fieldNamePrefix);
|
|
|
|
|
|
}
|
2023-02-17 15:58:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-02-21 18:19:02 +08:00
|
|
|
|
return salaryItemPO;
|
2022-03-21 09:33:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-27 17:17:56 +08:00
|
|
|
|
private void changeName(SalaryItemPO salaryItemPO, String oldName, String newName, String itemPrefix, String fieldNamePrefix) {
|
|
|
|
|
|
String code = itemPrefix + salaryItemPO.getCode();
|
|
|
|
|
|
Date now = new Date();
|
|
|
|
|
|
List<FormulaVar> formulaVars = getSalaryFormulaService(user).listByCode(code);
|
|
|
|
|
|
formulaVars.forEach(v -> {
|
|
|
|
|
|
FormulaVar formulaVar = FormulaVar.builder()
|
|
|
|
|
|
.id(v.getId())
|
|
|
|
|
|
.name(newName)
|
|
|
|
|
|
.fieldName(String.format(fieldNamePrefix, newName))
|
|
|
|
|
|
.updateTime(now)
|
|
|
|
|
|
.build();
|
|
|
|
|
|
getSalaryFormulaService(user).updateVar(formulaVar);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
List<Long> formulaIds = SalaryEntityUtil.properties(formulaVars, FormulaVar::getFormulaId, Collectors.toList());
|
|
|
|
|
|
List<FormulaPO> formulaPOS = getSalaryFormulaService(user).listByIds(formulaIds);
|
|
|
|
|
|
formulaPOS.forEach(f -> {
|
|
|
|
|
|
String formula = f.getFormula();
|
|
|
|
|
|
formula = formula.replace(String.format(fieldNamePrefix, oldName), String.format(fieldNamePrefix, newName));
|
|
|
|
|
|
FormulaPO formulaPO = FormulaPO.builder()
|
|
|
|
|
|
.id(f.getId())
|
|
|
|
|
|
.formula(formula)
|
|
|
|
|
|
.updateTime(now)
|
|
|
|
|
|
.build();
|
|
|
|
|
|
getSalaryFormulaService(user).update(formulaPO);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-21 09:33:21 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public void deleteByIds(Collection<Long> ids) {
|
2023-02-17 14:37:59 +08:00
|
|
|
|
SalaryItemServiceImpl.UsingItem usingItem = getUsingItem();
|
|
|
|
|
|
List<Long> usingItemIds = usingItem.getUsingItemIds();
|
|
|
|
|
|
List<String> usingCodes = usingItem.getUsingCodes();
|
|
|
|
|
|
|
2022-03-21 09:33:21 +08:00
|
|
|
|
// 查询薪资项目
|
|
|
|
|
|
List<SalaryItemPO> salaryItemPOS = listByIds(ids);
|
|
|
|
|
|
if (CollectionUtils.isEmpty(salaryItemPOS)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98299, "参数错误,薪资项目不存在或已被删除"));
|
|
|
|
|
|
}
|
2023-02-17 14:37:59 +08:00
|
|
|
|
if (CollectionUtils.containsAny(usingItemIds, ids)) {
|
2022-03-30 20:27:17 +08:00
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98322, "薪资账套正在使用该薪资项目,不允许删除"));
|
|
|
|
|
|
}
|
2023-02-17 14:37:59 +08:00
|
|
|
|
List<String> codes = SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getCode, Collectors.toList());
|
|
|
|
|
|
if (CollectionUtils.containsAny(usingCodes, codes)) {
|
|
|
|
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98322, "公式正在使用该薪资项目,不允许删除"));
|
|
|
|
|
|
}
|
2023-02-17 10:54:18 +08:00
|
|
|
|
|
|
|
|
|
|
|
2022-03-21 09:33:21 +08:00
|
|
|
|
// 删除薪资项目
|
|
|
|
|
|
ids = SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getId);
|
|
|
|
|
|
salaryItemBiz.deleteByIds(ids);
|
2024-02-21 18:19:02 +08:00
|
|
|
|
Integer useInEmployeeSalary = salaryItemPOS.get(0).getUseInEmployeeSalary();
|
2023-12-22 16:36:11 +08:00
|
|
|
|
// 记录删除日志
|
2024-02-21 18:19:02 +08:00
|
|
|
|
if (useInEmployeeSalary == 0) {
|
|
|
|
|
|
// 薪资项目
|
|
|
|
|
|
salaryItemPOS.forEach(salaryItemPO -> {
|
|
|
|
|
|
LoggerContext<SalaryItemPO> loggerContext = new LoggerContext<>();
|
|
|
|
|
|
loggerContext.setUser(user);
|
|
|
|
|
|
loggerContext.setTargetId(String.valueOf(salaryItemPO.getId()));
|
|
|
|
|
|
loggerContext.setTargetName(salaryItemPO.getName());
|
|
|
|
|
|
loggerContext.setOperateType(OperateTypeEnum.DELETE.getValue());
|
|
|
|
|
|
loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(0, "删除薪资项目"));
|
|
|
|
|
|
loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(0, "删除薪资项目") + ": " + salaryItemPO.getName());
|
|
|
|
|
|
loggerContext.setOldValues(salaryItemPO);
|
|
|
|
|
|
SalaryElogConfig.salaryItemLoggerTemplate.write(loggerContext);
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 字段管理
|
|
|
|
|
|
salaryItemPOS.forEach(salaryItemPO -> {
|
|
|
|
|
|
LoggerContext<SalaryItemPO> loggerContext = new LoggerContext<>();
|
|
|
|
|
|
loggerContext.setUser(user);
|
|
|
|
|
|
loggerContext.setTargetId(String.valueOf(salaryItemPO.getId()));
|
|
|
|
|
|
loggerContext.setTargetName(salaryItemPO.getName());
|
|
|
|
|
|
loggerContext.setOperateType(OperateTypeEnum.DELETE.getValue());
|
|
|
|
|
|
loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(0, "删除字段"));
|
|
|
|
|
|
loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(0, "删除字段") + ": " + salaryItemPO.getName());
|
|
|
|
|
|
loggerContext.setOldValues(salaryItemPO);
|
|
|
|
|
|
SalaryElogConfig.salaryArchiveFieldLoggerTemplate.write(loggerContext);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-21 09:33:21 +08:00
|
|
|
|
}
|
2023-02-17 14:37:59 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取使用中的项目id、项目编码、公式id
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return 项目id、项目编码、公式id
|
|
|
|
|
|
*/
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public UsingItem getUsingItem() {
|
|
|
|
|
|
|
|
|
|
|
|
//系统项目
|
|
|
|
|
|
List<SysSalaryItemPO> sysItems = getSysSalaryItemService(user).listAll();
|
|
|
|
|
|
List<Long> sysItemFormulaIds = SalaryEntityUtil.properties(sysItems, SysSalaryItemPO::getFormulaId, Collectors.toList());
|
|
|
|
|
|
|
|
|
|
|
|
//薪资项目
|
|
|
|
|
|
List<SalaryItemPO> items = listAll();
|
|
|
|
|
|
List<Long> itemFormulaIds = SalaryEntityUtil.properties(items, SalaryItemPO::getFormulaId, Collectors.toList());
|
|
|
|
|
|
|
|
|
|
|
|
//账套项目
|
|
|
|
|
|
List<SalarySobItemPO> sobItems = getSalarySobItemService(user).list();
|
|
|
|
|
|
List<Long> sobItemFormulaIds = SalaryEntityUtil.properties(sobItems, SalarySobItemPO::getFormulaId, Collectors.toList());
|
|
|
|
|
|
|
|
|
|
|
|
//回算项目
|
|
|
|
|
|
List<SalarySobBackItemPO> backItems = getSalarySobBackItemService(user).listAll();
|
|
|
|
|
|
List<Long> backItemFormulaIds = SalaryEntityUtil.properties(backItems, SalarySobBackItemPO::getFormulaId, Collectors.toList());
|
|
|
|
|
|
|
|
|
|
|
|
List<Long> usingFormulaIds = new ArrayList<>();
|
|
|
|
|
|
usingFormulaIds.addAll(sysItemFormulaIds);
|
|
|
|
|
|
usingFormulaIds.addAll(itemFormulaIds);
|
|
|
|
|
|
usingFormulaIds.addAll(sobItemFormulaIds);
|
|
|
|
|
|
usingFormulaIds.addAll(backItemFormulaIds);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//账套里的项目,项目里的项目
|
|
|
|
|
|
List<Long> sobItemIds = SalaryEntityUtil.properties(sobItems, SalarySobItemPO::getSalaryItemId, Collectors.toList());
|
|
|
|
|
|
List<Long> backItemIds = SalaryEntityUtil.properties(backItems, SalarySobBackItemPO::getSalaryItemId, Collectors.toList());
|
|
|
|
|
|
List<Long> usingItemIds = new ArrayList<>();
|
|
|
|
|
|
usingItemIds.addAll(sobItemIds);
|
|
|
|
|
|
usingItemIds.addAll(backItemIds);
|
|
|
|
|
|
|
|
|
|
|
|
//使用中的code
|
|
|
|
|
|
List<FormulaVar> formulaVars = getSalaryFormulaService(user).listVarByFormulaIds(usingFormulaIds);
|
2023-02-21 17:19:32 +08:00
|
|
|
|
List<String> itemCode = formulaVars.stream()
|
|
|
|
|
|
.map(FormulaVar::getFieldId)
|
|
|
|
|
|
.map(v -> v.replaceAll("salaryItem_", ""))
|
|
|
|
|
|
.map(v -> v.replaceAll("salaryArchives_", ""))
|
|
|
|
|
|
.map(v -> v.replaceAll("ISSUED_", ""))
|
|
|
|
|
|
.collect(Collectors.toList());
|
2023-02-17 14:37:59 +08:00
|
|
|
|
|
|
|
|
|
|
return UsingItem.builder().usingFormulaIds(usingFormulaIds).usingItemIds(usingItemIds).usingCodes(itemCode).build();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-05-31 09:55:24 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public void batchUpdateSortedIndex(List<SalaryItemPO> values) {
|
|
|
|
|
|
salaryItemBiz.batchUpdateSortedIndex(values);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-31 09:24:41 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public List<Map<String, Object>> getSalarySobBySalaryItem(Long salaryItemId) {
|
|
|
|
|
|
// 查询所有启用的薪资账套
|
|
|
|
|
|
List<SalarySobItemPO> salarySobItemList = getSalarySobItemService(user).listBySalaryItemIds(Collections.singleton(salaryItemId));
|
|
|
|
|
|
Set<Long> salarySobIds = SalaryEntityUtil.properties(salarySobItemList, SalarySobItemPO::getSalarySobId);
|
|
|
|
|
|
List<SalarySobPO> salarySobs = getSalarySobService(user).listByIds(salarySobIds);
|
2023-12-29 10:27:35 +08:00
|
|
|
|
// 获取能够管理的义务人
|
2024-05-10 18:25:32 +08:00
|
|
|
|
Boolean isChief = getTaxAgentService(user).isChief(Long.valueOf(user.getUID()));
|
|
|
|
|
|
if (!isChief) {
|
|
|
|
|
|
Set<Long> taxAgentIds = SalaryEntityUtil.properties(getTaxAgentService(user).listAllTaxAgentsAsAdmin(Long.valueOf(user.getUID())), TaxAgentPO::getId);
|
|
|
|
|
|
salarySobs = salarySobs.stream().filter(sob -> taxAgentIds.contains(sob.getTaxAgentId())).collect(Collectors.toList());
|
|
|
|
|
|
}
|
2023-08-31 09:24:41 +08:00
|
|
|
|
return salarySobs.stream().map(m -> {
|
|
|
|
|
|
Map<String, Object> map = new HashMap<>();
|
|
|
|
|
|
map.put("id", String.valueOf(m.getId()));
|
|
|
|
|
|
map.put("content", m.getName());
|
|
|
|
|
|
return map;
|
|
|
|
|
|
}).collect(Collectors.toList());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void syncSalaryItemToSalarySobItem(SyncSalaryItemParam param) {
|
|
|
|
|
|
ValidUtil.doValidator(param);
|
|
|
|
|
|
// 获取薪资项目信息
|
|
|
|
|
|
SalaryItemPO salaryItemPO = salaryItemBiz.getById(param.getSalaryItemId());
|
2023-10-09 10:43:43 +08:00
|
|
|
|
if (salaryItemPO == null) {
|
2023-08-31 09:24:41 +08:00
|
|
|
|
throw new SalaryRunTimeException("薪资项目不存在或已被删除");
|
|
|
|
|
|
}
|
|
|
|
|
|
// 获取薪资账套中薪资项目信息
|
|
|
|
|
|
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalaryItemIds(Collections.singleton(param.getSalaryItemId()));
|
2023-09-27 17:17:56 +08:00
|
|
|
|
salarySobItemPOS = salarySobItemPOS.stream().filter(po -> param.getSalarySobIds().contains(po.getSalarySobId())).collect(Collectors.toList());
|
2023-08-31 09:24:41 +08:00
|
|
|
|
// 更新薪资账套中的薪资项目信息
|
|
|
|
|
|
Date now = new Date();
|
|
|
|
|
|
for (SalarySobItemPO sobItem : salarySobItemPOS) {
|
2023-08-31 10:23:14 +08:00
|
|
|
|
sobItem.setFormulaId(salaryItemPO.getFormulaId());
|
|
|
|
|
|
sobItem.setRoundingMode(salaryItemPO.getRoundingMode());
|
|
|
|
|
|
sobItem.setPattern(salaryItemPO.getPattern());
|
|
|
|
|
|
sobItem.setValueType(salaryItemPO.getValueType());
|
|
|
|
|
|
sobItem.setDescription(salaryItemPO.getDescription());
|
2023-08-31 09:24:41 +08:00
|
|
|
|
sobItem.setUpdateTime(now);
|
2024-06-20 11:43:57 +08:00
|
|
|
|
sobItem.setDefaultValue(salaryItemPO.getDefaultValue() == null ? "" : salaryItemPO.getDefaultValue());
|
2023-08-31 09:24:41 +08:00
|
|
|
|
getSalarySobItemService(user).update(sobItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-02-17 14:37:59 +08:00
|
|
|
|
|
2024-08-08 16:53:31 +08:00
|
|
|
|
|
2023-02-17 14:37:59 +08:00
|
|
|
|
@Data
|
|
|
|
|
|
@Builder
|
|
|
|
|
|
@NoArgsConstructor
|
|
|
|
|
|
@AllArgsConstructor
|
|
|
|
|
|
public static class UsingItem {
|
|
|
|
|
|
private List<Long> usingFormulaIds;
|
|
|
|
|
|
|
|
|
|
|
|
private List<Long> usingItemIds;
|
|
|
|
|
|
|
|
|
|
|
|
private List<String> usingCodes;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2023-02-17 15:58:33 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public UsingItem getUsingItem(Long id) {
|
|
|
|
|
|
|
|
|
|
|
|
//薪资项目
|
|
|
|
|
|
SalaryItemPO items = getById(id);
|
|
|
|
|
|
|
|
|
|
|
|
//账套项目
|
|
|
|
|
|
List<SalarySobItemPO> sobItems = getSalarySobItemService(user).listBySalaryItemIds(Collections.singleton(id));
|
|
|
|
|
|
|
|
|
|
|
|
//回算项目
|
|
|
|
|
|
List<SalarySobBackItemPO> backItems = getSalarySobBackItemService(user).listBySalaryItemIds(Collections.singleton(id));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// //账套里的项目,项目里的项目
|
|
|
|
|
|
// List<Long> sobItemIds = SalaryEntityUtil.properties(sobItems, SalarySobItemPO::getSalaryItemId, Collectors.toList());
|
|
|
|
|
|
// List<Long> backItemIds = SalaryEntityUtil.properties(backItems, SalarySobBackItemPO::getSalaryItemId, Collectors.toList());
|
|
|
|
|
|
// List<Long> usingItemIds = new ArrayList<>();
|
|
|
|
|
|
// usingItemIds.addAll(sobItemIds);
|
|
|
|
|
|
// usingItemIds.addAll(backItemIds);
|
|
|
|
|
|
//
|
|
|
|
|
|
// //使用中的code
|
|
|
|
|
|
// List<FormulaVar> formulaVars = getSalaryFormulaService(user).listVarByFormulaIds(usingFormulaIds);
|
|
|
|
|
|
// List<String> itemCode = formulaVars.stream().map(FormulaVar::getFieldId).map(v -> v.replaceAll("salaryItem_", "")).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
|
|
return UsingItem.builder().build();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-08-06 10:32:57 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
2024-08-12 15:16:06 +08:00
|
|
|
|
public List<SalaryItemExcelConfig> getConfig(SalaryItemExportParam param) {
|
2024-08-06 10:32:57 +08:00
|
|
|
|
return getSalaryItemMapper().getConfig(param.getIds());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-08-08 09:50:04 +08:00
|
|
|
|
|
2024-08-07 14:23:35 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public Map<String, Object> preview(SalaryItemImportParam param) {
|
|
|
|
|
|
InputStream fileInputStream = null;
|
|
|
|
|
|
try {
|
|
|
|
|
|
fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(param.getImageId()));
|
|
|
|
|
|
Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX);
|
|
|
|
|
|
Map<String, Object> apidatas = new HashMap<String, Object>();
|
|
|
|
|
|
apidatas.put("headers", ExcelSupport.getSheetHeader(sheet, 0));
|
|
|
|
|
|
apidatas.put("list", ExcelParseHelper.parse2List(sheet, 1));
|
|
|
|
|
|
return apidatas;
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
IOUtils.closeQuietly(fileInputStream);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-08-07 09:06:09 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public ImportExcelResponse importSalaryItem(SalaryItemImportParam param) {
|
|
|
|
|
|
|
|
|
|
|
|
Date now = new Date();
|
|
|
|
|
|
InputStream fileInputStream = null;
|
2024-08-07 13:25:57 +08:00
|
|
|
|
try {
|
|
|
|
|
|
fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(param.getImageId()));
|
|
|
|
|
|
List<SalaryItemExcelConfig> configs = ExcelParseHelper.parse2Map(fileInputStream, SalaryItemExcelConfig.class, 0, 1, 13, EXCEL_TYPE_XLSX);
|
|
|
|
|
|
|
|
|
|
|
|
// 错误excel内容
|
|
|
|
|
|
ImportExcelResponse response = ImportExcelResponse.builder().totalCount(configs.size()).successCount(configs.size()).errorCount(0).errorData(new ArrayList<>()).build();
|
|
|
|
|
|
|
|
|
|
|
|
List<SysSalaryItemPO> sysSalaryItemPOS = sysSalaryItemBiz.listAll();
|
|
|
|
|
|
Set<String> sysItems = SalaryEntityUtil.properties(sysSalaryItemPOS, SysSalaryItemPO::getName);
|
|
|
|
|
|
|
|
|
|
|
|
List<SalaryItemPO> adds = new ArrayList<>();
|
|
|
|
|
|
List<SalaryItemPO> updates = new ArrayList<>();
|
|
|
|
|
|
Map<Long, Map<String, String>> formulaItems = new HashMap<>();
|
|
|
|
|
|
for (int i = 0; i < configs.size(); i++) {
|
|
|
|
|
|
String rowIndex = String.format("第%s行", i + 2);
|
|
|
|
|
|
SalaryItemExcelConfig config = configs.get(i);
|
|
|
|
|
|
String name = config.getName();
|
|
|
|
|
|
SalaryValueTypeEnum salaryValueTypeEnum = SalaryValueTypeEnum.parseByDefaultLabel(config.getValueType());
|
2024-08-12 15:16:06 +08:00
|
|
|
|
SalaryDataTypeEnum salaryDataTypeEnum = SalaryDataTypeEnum.parseByDefaultLabel(config.getDataType());
|
2024-08-07 13:25:57 +08:00
|
|
|
|
SalaryItemPO itemPO = getByName(name);
|
|
|
|
|
|
if (itemPO == null) {
|
|
|
|
|
|
|
|
|
|
|
|
if (sysItems.contains(name)) {
|
|
|
|
|
|
ImportExcelResponse.Error error = ImportExcelResponse.Error.builder().message(String.format("%s“%s”的名称与系统名称冲突", rowIndex, name)).build();
|
|
|
|
|
|
response.setSuccessCount(response.getSuccessCount() - 1);
|
|
|
|
|
|
response.setErrorCount(response.getErrorCount() + 1);
|
|
|
|
|
|
response.getErrorData().add(error);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
itemPO = SalaryItemPO.builder()
|
|
|
|
|
|
.id(IdGenerator.generate())
|
|
|
|
|
|
.code(IdGenerator.getUUID())
|
|
|
|
|
|
.name(name)
|
|
|
|
|
|
.systemType(SalarySystemTypeEnum.CUSTOM.getValue())
|
|
|
|
|
|
.sysSalaryItemId(org.apache.commons.lang3.math.NumberUtils.LONG_ZERO)
|
|
|
|
|
|
.useDefault(SalaryOnOffEnum.parseByDefaultLabel(config.getUseDefault()).getValue())
|
|
|
|
|
|
.useInEmployeeSalary(SalaryOnOffEnum.OFF.getValue())
|
|
|
|
|
|
.hideDefault(SalaryOnOffEnum.parseByDefaultLabel(config.getHideDefault()).getValue())
|
|
|
|
|
|
.roundingMode(SalaryRoundingModeEnum.parseByDefaultLabel(config.getRoundingMode()).getValue())
|
|
|
|
|
|
.pattern(NumberUtil.isNumber(config.getPattern()) ? Integer.parseInt(config.getPattern()) : 2)
|
|
|
|
|
|
.valueType(salaryValueTypeEnum.getValue())
|
|
|
|
|
|
.dataType(salaryDataTypeEnum.getValue())
|
|
|
|
|
|
//后补
|
|
|
|
|
|
.formulaId(0L)
|
|
|
|
|
|
.description(config.getDescription())
|
|
|
|
|
|
.canEdit(org.apache.commons.lang3.math.NumberUtils.INTEGER_ONE)
|
|
|
|
|
|
.creator((long) user.getUID())
|
|
|
|
|
|
.deleteType(0)
|
|
|
|
|
|
.createTime(now)
|
|
|
|
|
|
.updateTime(now)
|
|
|
|
|
|
.tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
|
|
|
|
|
|
.sharedType(0)
|
|
|
|
|
|
.taxAgentIds("")
|
|
|
|
|
|
.sortedIndex(NumberUtil.isNumber(config.getSortedIndex()) ? Integer.parseInt(config.getSortedIndex()) : null)
|
|
|
|
|
|
.width(NumberUtil.isNumber(config.getWidth()) ? Integer.parseInt(config.getWidth()) : null)
|
|
|
|
|
|
.defaultValue(config.getDefaultValue())
|
|
|
|
|
|
.build();
|
|
|
|
|
|
adds.add(itemPO);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
|
|
if (SalarySystemTypeEnum.parseByValue(itemPO.getSystemType()) == SalarySystemTypeEnum.SYSTEM) {
|
|
|
|
|
|
ImportExcelResponse.Error error = ImportExcelResponse.Error.builder().message(String.format("%s“%s”是系统薪资项目不支持修改", rowIndex, name)).build();
|
|
|
|
|
|
response.setSuccessCount(response.getSuccessCount() - 1);
|
|
|
|
|
|
response.setErrorCount(response.getErrorCount() + 1);
|
|
|
|
|
|
response.getErrorData().add(error);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
itemPO.setUseDefault(SalaryOnOffEnum.parseByDefaultLabel(config.getUseDefault()).getValue());
|
|
|
|
|
|
itemPO.setHideDefault(SalaryOnOffEnum.parseByDefaultLabel(config.getHideDefault()).getValue());
|
|
|
|
|
|
itemPO.setRoundingMode(SalaryRoundingModeEnum.parseByDefaultLabel(config.getRoundingMode()).getValue());
|
|
|
|
|
|
itemPO.setPattern(NumberUtil.isNumber(config.getPattern()) ? Integer.parseInt(config.getPattern()) : 2);
|
|
|
|
|
|
itemPO.setValueType(salaryValueTypeEnum.getValue());
|
|
|
|
|
|
itemPO.setDataType(salaryDataTypeEnum.getValue());
|
|
|
|
|
|
//后补
|
|
|
|
|
|
itemPO.setFormulaId(0L);
|
|
|
|
|
|
itemPO.setDescription(config.getDescription());
|
|
|
|
|
|
itemPO.setUpdateTime(now);
|
|
|
|
|
|
itemPO.setSortedIndex(NumberUtil.isNumber(config.getSortedIndex()) ? Integer.parseInt(config.getSortedIndex()) : null);
|
|
|
|
|
|
itemPO.setWidth(NumberUtil.isNumber(config.getWidth()) ? Integer.parseInt(config.getWidth()) : null);
|
|
|
|
|
|
itemPO.setDefaultValue(config.getDefaultValue());
|
|
|
|
|
|
updates.add(itemPO);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//解析公式
|
|
|
|
|
|
if (salaryValueTypeEnum == SalaryValueTypeEnum.FORMULA || salaryValueTypeEnum == SalaryValueTypeEnum.SQL) {
|
|
|
|
|
|
Long id = itemPO.getId();
|
|
|
|
|
|
String formula = config.getFormula();
|
2024-08-12 15:16:06 +08:00
|
|
|
|
String sqlReturnKey = config.getExtendParam();
|
2024-08-07 13:25:57 +08:00
|
|
|
|
Map<String, String> map = new HashMap<>();
|
|
|
|
|
|
map.put("rowIndex", rowIndex);
|
|
|
|
|
|
map.put("formula", formula);
|
|
|
|
|
|
map.put("sqlReturnKey", sqlReturnKey);
|
|
|
|
|
|
formulaItems.put(id, map);
|
|
|
|
|
|
}
|
2024-08-07 09:06:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-08-07 13:25:57 +08:00
|
|
|
|
adds.forEach(getSalaryItemMapper()::insertIgnoreNull);
|
|
|
|
|
|
updates.forEach(getSalaryItemMapper()::updateIgnoreNull);
|
|
|
|
|
|
|
|
|
|
|
|
for (Long id : formulaItems.keySet()) {
|
|
|
|
|
|
SalaryItemPO itemPO = getById(id);
|
|
|
|
|
|
Map<String, String> map = formulaItems.get(id);
|
|
|
|
|
|
String rowIndex = map.get("rowIndex");
|
|
|
|
|
|
String formula = map.get("formula");
|
|
|
|
|
|
String sqlReturnKey = map.get("sqlReturnKey");
|
|
|
|
|
|
SalaryValueTypeEnum salaryValueTypeEnum = SalaryValueTypeEnum.parseByValue(itemPO.getValueType());
|
|
|
|
|
|
SalaryDataTypeEnum salaryDataTypeEnum = SalaryDataTypeEnum.parseByValue(itemPO.getDataType());
|
|
|
|
|
|
SalaryFormulaSaveParam saveParam = SalaryFormulaSaveParam.builder()
|
|
|
|
|
|
.name(itemPO.getName())
|
|
|
|
|
|
.module("salary")
|
|
|
|
|
|
.useFor("salaryitem")
|
|
|
|
|
|
.referenceType(salaryValueTypeEnum == SalaryValueTypeEnum.FORMULA ? ReferenceTypeEnum.FORMULA.getValue() : ReferenceTypeEnum.SQL.getValue())
|
|
|
|
|
|
.returnType(salaryDataTypeEnum == SalaryDataTypeEnum.STRING ? ReturnTypeEnum.STRING.getValue() : ReturnTypeEnum.NUMBER.getValue())
|
|
|
|
|
|
.validateType(salaryDataTypeEnum == SalaryDataTypeEnum.STRING ? ReturnTypeEnum.STRING.getValue() : ReturnTypeEnum.NUMBER.getValue())
|
|
|
|
|
|
.extendParam("{\"isCustomFunction\":\"0\",\"sqlReturnKey\":\"" + sqlReturnKey + "\",\"openDecrypt\":\"0\",\"datasource\":{\"datasourceId\":\"\"}}")
|
|
|
|
|
|
.formula(formula)
|
|
|
|
|
|
.build();
|
2024-08-07 09:06:09 +08:00
|
|
|
|
|
2024-08-07 13:25:57 +08:00
|
|
|
|
try {
|
|
|
|
|
|
FormulaPO formulaPO = getSalaryFormulaService(user).save(saveParam);
|
|
|
|
|
|
itemPO.setFormulaId(formulaPO.getId());
|
|
|
|
|
|
getSalaryItemMapper().updateIgnoreNull(itemPO);
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
ImportExcelResponse.Error error = ImportExcelResponse.Error.builder().message(String.format("%s“%s”的公式设置有误:%s", rowIndex, itemPO.getName(), e.getMessage())).build();
|
|
|
|
|
|
response.setSuccessCount(response.getSuccessCount() - 1);
|
|
|
|
|
|
response.setErrorCount(response.getErrorCount() + 1);
|
|
|
|
|
|
response.getErrorData().add(error);
|
|
|
|
|
|
}
|
2024-08-07 09:06:09 +08:00
|
|
|
|
}
|
2024-08-07 13:25:57 +08:00
|
|
|
|
return response;
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
IOUtils.closeQuietly(fileInputStream);
|
2024-08-07 09:06:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-08-07 14:40:08 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public XSSFWorkbook export(SalaryItemExportParam param) {
|
|
|
|
|
|
|
|
|
|
|
|
List<Object> titles = Lists.newArrayList();
|
|
|
|
|
|
List<String> dataIndexList = Lists.newArrayList();
|
|
|
|
|
|
ExcelUtil.parseHeader(SalaryItemExcelConfig.class, titles, dataIndexList);
|
|
|
|
|
|
|
2024-08-12 15:16:06 +08:00
|
|
|
|
List<SalaryItemExcelConfig> configs = getConfig(param);
|
2024-08-07 14:40:08 +08:00
|
|
|
|
|
|
|
|
|
|
List<List<Object>> rows = new ArrayList<>();
|
|
|
|
|
|
rows.add(titles);
|
|
|
|
|
|
configs.forEach(e -> {
|
|
|
|
|
|
List<Object> row = new ArrayList<>();
|
|
|
|
|
|
row.add(e.getName());
|
2024-08-12 15:16:06 +08:00
|
|
|
|
row.add(e.getUseDefault() == null ? "否" : SalaryOnOffEnum.parseByValue(Integer.parseInt(e.getUseDefault())).getDefaultLabel());
|
|
|
|
|
|
row.add(e.getHideDefault() == null ? "否" : SalaryOnOffEnum.parseByValue(Integer.parseInt(e.getHideDefault())).getDefaultLabel());
|
2024-08-09 17:30:44 +08:00
|
|
|
|
row.add(SalaryDataTypeEnum.parseByValue(Util.null2String(e.getDataType())).getDefaultLabel());
|
2024-08-12 15:16:06 +08:00
|
|
|
|
row.add(e.getRoundingMode() == null ? "四舍五入" : SalaryRoundingModeEnum.parseByValue(Integer.parseInt(e.getRoundingMode())).getDefaultLabel());
|
2024-08-09 17:30:44 +08:00
|
|
|
|
row.add(e.getPattern() == null ? "2" : e.getPattern());
|
2024-08-12 15:16:06 +08:00
|
|
|
|
row.add(e.getValueType() == null ? "输入" : SalaryValueTypeEnum.parseByValue(Integer.parseInt(e.getValueType())).getDefaultLabel());
|
|
|
|
|
|
row.add(e.getFormula() == null ? "" : e.getFormula());
|
|
|
|
|
|
String sqlReturnKey = "";
|
2024-08-13 18:15:04 +08:00
|
|
|
|
if (e.getExtendParam() != null) {
|
2024-08-12 15:16:06 +08:00
|
|
|
|
sqlReturnKey = JsonUtil.parseMap(Util.null2String(e.getExtendParam()), String.class).getOrDefault("sqlReturnKey", "");
|
2024-08-13 18:15:04 +08:00
|
|
|
|
if ("null".equals(sqlReturnKey)) {
|
2024-08-12 15:16:06 +08:00
|
|
|
|
sqlReturnKey = "";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
row.add(sqlReturnKey);
|
2024-08-09 17:30:44 +08:00
|
|
|
|
row.add(e.getSortedIndex() == null ? "" : e.getSortedIndex());
|
|
|
|
|
|
row.add(e.getWidth() == null ? "" : e.getWidth());
|
|
|
|
|
|
row.add(e.getDefaultValue() == null ? "" : e.getDefaultValue());
|
2024-08-13 18:15:04 +08:00
|
|
|
|
row.add(e.getDescription() == null ? "" : e.getDescription());
|
2024-08-07 14:40:08 +08:00
|
|
|
|
rows.add(row);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return ExcelUtil.genWorkbookV2(rows, "薪资项目");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public XSSFWorkbook downloadTemplate(SalaryItemDownloadTemplateParam param) {
|
|
|
|
|
|
List<Object> titles = Lists.newArrayList();
|
|
|
|
|
|
List<String> dataIndexList = Lists.newArrayList();
|
|
|
|
|
|
ExcelUtil.parseHeader(SalaryItemExcelConfig.class, titles, dataIndexList);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<List<Object>> rows = new ArrayList<>();
|
|
|
|
|
|
rows.add(titles);
|
2024-08-08 16:53:31 +08:00
|
|
|
|
if (param.isHasData()) {
|
2024-08-12 15:16:06 +08:00
|
|
|
|
List<SalaryItemExcelConfig> configs = getConfig(SalaryItemExportParam.builder().build());
|
2024-08-07 14:40:08 +08:00
|
|
|
|
configs.forEach(e -> {
|
|
|
|
|
|
List<Object> row = new ArrayList<>();
|
|
|
|
|
|
row.add(e.getName());
|
2024-08-12 15:16:06 +08:00
|
|
|
|
row.add(e.getUseDefault() == null ? "否" : SalaryOnOffEnum.parseByValue(Integer.parseInt(e.getUseDefault())).getDefaultLabel());
|
|
|
|
|
|
row.add(e.getHideDefault() == null ? "否" : SalaryOnOffEnum.parseByValue(Integer.parseInt(e.getHideDefault())).getDefaultLabel());
|
2024-08-09 17:30:44 +08:00
|
|
|
|
row.add(SalaryDataTypeEnum.parseByValue(Util.null2String(e.getDataType())).getDefaultLabel());
|
2024-08-12 15:16:06 +08:00
|
|
|
|
row.add(e.getRoundingMode() == null ? "四舍五入" : SalaryRoundingModeEnum.parseByValue(Integer.parseInt(e.getRoundingMode())).getDefaultLabel());
|
2024-08-09 17:30:44 +08:00
|
|
|
|
row.add(e.getPattern() == null ? "2" : e.getPattern());
|
2024-08-12 15:16:06 +08:00
|
|
|
|
row.add(e.getValueType() == null ? "输入" : SalaryValueTypeEnum.parseByValue(Integer.parseInt(e.getValueType())).getDefaultLabel());
|
|
|
|
|
|
row.add(e.getFormula() == null ? "" : e.getFormula());
|
|
|
|
|
|
String sqlReturnKey = "";
|
2024-08-13 18:15:04 +08:00
|
|
|
|
if (e.getExtendParam() != null) {
|
2024-08-12 15:16:06 +08:00
|
|
|
|
sqlReturnKey = JsonUtil.parseMap(Util.null2String(e.getExtendParam()), String.class).getOrDefault("sqlReturnKey", "");
|
2024-08-13 18:15:04 +08:00
|
|
|
|
if ("null".equals(sqlReturnKey)) {
|
2024-08-12 15:16:06 +08:00
|
|
|
|
sqlReturnKey = "";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
row.add(sqlReturnKey);
|
2024-08-09 17:30:44 +08:00
|
|
|
|
row.add(e.getSortedIndex() == null ? "" : e.getSortedIndex());
|
|
|
|
|
|
row.add(e.getWidth() == null ? "" : e.getWidth());
|
|
|
|
|
|
row.add(e.getDefaultValue() == null ? "" : e.getDefaultValue());
|
2024-08-13 18:15:04 +08:00
|
|
|
|
row.add(e.getDescription() == null ? "" : e.getDescription());
|
2024-08-07 14:40:08 +08:00
|
|
|
|
rows.add(row);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
return ExcelUtil.genWorkbookV2(rows, "薪资项目");
|
|
|
|
|
|
}
|
2024-08-08 18:04:50 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public SalaryItemAllConfig getConfig() {
|
|
|
|
|
|
List<SalaryItemPO> salaryItemPOList = listByParam(SalaryItemSearchParam.builder().useInEmployeeSalary(0).build());
|
2024-08-13 18:15:04 +08:00
|
|
|
|
List<FormulaPO> formulaPOS = getSalaryFormulaService(user).listAll();
|
|
|
|
|
|
Map<Long, FormulaPO> formulaMap = SalaryEntityUtil.convert2Map(formulaPOS, FormulaPO::getId);
|
|
|
|
|
|
List<FormulaVar> formulaVars = getSalaryFormulaService(user).listAllVar();
|
|
|
|
|
|
Map<Long, List<FormulaVar>> varListMap = SalaryEntityUtil.group2Map(formulaVars, FormulaVar::getFormulaId);
|
|
|
|
|
|
|
|
|
|
|
|
salaryItemPOList.forEach(itemPO -> {
|
|
|
|
|
|
if (itemPO.getFormulaId() != null) {
|
|
|
|
|
|
FormulaPO formulaPO = formulaMap.get(itemPO.getFormulaId());
|
|
|
|
|
|
if (formulaPO != null) {
|
|
|
|
|
|
formulaPO.setFormulaVars(varListMap.get(itemPO.getFormulaId()));
|
|
|
|
|
|
itemPO.setFormula(formulaPO);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2024-08-08 18:04:50 +08:00
|
|
|
|
return SalaryItemAllConfig.builder().salaryItems(salaryItemPOList).build();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void parseConfig(SalaryItemAllConfig salaryItemConfig) {
|
2024-08-12 17:17:52 +08:00
|
|
|
|
long uid = user.getUID();
|
2024-08-08 18:04:50 +08:00
|
|
|
|
List<SalaryItemPO> salaryItemPOList = listAll();
|
2024-08-12 17:17:52 +08:00
|
|
|
|
Map<Long, SalaryItemPO> idMap = SalaryEntityUtil.convert2Map(salaryItemPOList, SalaryItemPO::getId);
|
|
|
|
|
|
Map<String, SalaryItemPO> nameMap = SalaryEntityUtil.convert2Map(salaryItemPOList, SalaryItemPO::getName);
|
|
|
|
|
|
Map<String, SalaryItemPO> codeMap = SalaryEntityUtil.convert2Map(salaryItemPOList, SalaryItemPO::getCode);
|
2024-08-08 18:04:50 +08:00
|
|
|
|
|
|
|
|
|
|
Optional.ofNullable(salaryItemConfig.getSalaryItems())
|
|
|
|
|
|
.orElse(new ArrayList<>())
|
|
|
|
|
|
.forEach(itemPO -> {
|
2024-08-13 18:15:04 +08:00
|
|
|
|
|
|
|
|
|
|
Long formulaId = getSalaryFormulaService(user).add(itemPO.getFormula());
|
|
|
|
|
|
itemPO.setFormulaId(formulaId);
|
|
|
|
|
|
|
2024-08-12 17:17:52 +08:00
|
|
|
|
if (idMap.containsKey(itemPO.getId())) {
|
2024-08-13 18:15:04 +08:00
|
|
|
|
itemPO.setCode(null);
|
|
|
|
|
|
itemPO.setName(null);
|
|
|
|
|
|
itemPO.setCreator(uid);
|
2024-08-12 17:17:52 +08:00
|
|
|
|
getSalaryItemMapper().updateIgnoreNull(itemPO);
|
|
|
|
|
|
} else if (nameMap.containsKey(itemPO.getName())) {
|
|
|
|
|
|
SalaryItemPO salaryItemPO = nameMap.get(itemPO.getName());
|
|
|
|
|
|
itemPO.setId(salaryItemPO.getId());
|
2024-08-13 18:15:04 +08:00
|
|
|
|
//不许修改code
|
|
|
|
|
|
itemPO.setCode(null);
|
2024-08-12 17:17:52 +08:00
|
|
|
|
itemPO.setCreator(uid);
|
|
|
|
|
|
getSalaryItemMapper().updateIgnoreNull(itemPO);
|
|
|
|
|
|
} else if (codeMap.containsKey(itemPO.getCode())) {
|
|
|
|
|
|
SalaryItemPO salaryItemPO = codeMap.get(itemPO.getCode());
|
|
|
|
|
|
itemPO.setId(salaryItemPO.getId());
|
2024-08-13 18:15:04 +08:00
|
|
|
|
//不许修改名字
|
|
|
|
|
|
itemPO.setName(null);
|
2024-08-12 17:17:52 +08:00
|
|
|
|
itemPO.setCreator(uid);
|
|
|
|
|
|
getSalaryItemMapper().updateIgnoreNull(itemPO);
|
2024-08-09 17:30:44 +08:00
|
|
|
|
} else {
|
2024-08-08 18:04:50 +08:00
|
|
|
|
getSalaryItemMapper().insertIgnoreNull(itemPO);
|
|
|
|
|
|
}
|
2024-08-09 09:22:27 +08:00
|
|
|
|
});
|
2024-08-08 18:04:50 +08:00
|
|
|
|
}
|
2022-03-17 15:14:35 +08:00
|
|
|
|
}
|