批量锁定功能
This commit is contained in:
parent
15749ecc10
commit
271daf29be
|
|
@ -3,6 +3,7 @@ package com.engine.salary.entity.salaryacct.bo;
|
|||
import com.engine.salary.entity.datacollection.dto.AttendQuoteFieldListDTO;
|
||||
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.ExpressFormula;
|
||||
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
|
||||
import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO;
|
||||
|
|
@ -45,6 +46,12 @@ public class SalaryAcctCalculateBO {
|
|||
*/
|
||||
private SalarySobCycleDTO salarySobCycleDTO;
|
||||
|
||||
/**
|
||||
* 核算锁定值
|
||||
*/
|
||||
private Map<Long, SalaryAcctResultPO> salaryAcctLockResultPOS;
|
||||
|
||||
|
||||
/**
|
||||
* 相同税款所属期内其他薪资核算记录(薪资类型为工资薪金的账套的)
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -0,0 +1,52 @@
|
|||
package com.engine.salary.entity.salaryacct.bo;
|
||||
|
||||
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
|
||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
|
||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
|
||||
import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 薪资核算人员
|
||||
* <p>Copyright: Copyright (c) 2022</p>
|
||||
* <p>Company: 泛微软件</p>
|
||||
*
|
||||
* @author qiantao
|
||||
* @version 1.0
|
||||
**/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class SalaryAcctResultListContext {
|
||||
|
||||
private SalaryAcctRecordPO salaryAcctRecord;
|
||||
|
||||
private SalarySobItemAggregateDTO salarySobItemAggregate;
|
||||
|
||||
//存在合并计税的薪资核算人员(employeeId-taxAgentId)")
|
||||
private Set<String> sameTaxCycleKeySet;
|
||||
|
||||
//薪资核算人员")
|
||||
private List<SalaryAcctEmployeePO> salaryAcctEmployees;
|
||||
|
||||
private Integer total;
|
||||
|
||||
private Map<String, String> hrmStatusMap;
|
||||
|
||||
private Map<Long, DataCollectionEmployee> simpleEmployeeMap;
|
||||
|
||||
// private Map<Long, ExtEmployeePO> extEmployeeMap;
|
||||
|
||||
private Map<Long, String> taxAgentNameMap;
|
||||
|
||||
public SalaryAcctResultListContext() {
|
||||
this.sameTaxCycleKeySet = new HashSet<>();
|
||||
this.salaryAcctEmployees = new ArrayList<>();
|
||||
this.hrmStatusMap = new HashMap<>();
|
||||
this.simpleEmployeeMap = new HashMap<>();
|
||||
// this.extEmployeeMap = new HashMap<>();
|
||||
this.taxAgentNameMap = new HashMap<>();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
package com.engine.salary.entity.salaryacct.param;
|
||||
|
||||
import com.engine.salary.common.BaseQueryParam;
|
||||
import com.engine.salary.enums.salaryaccounting.EmployeeTypeEnum;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 薪资核算人员列表查询条件
|
||||
* <p>Copyright: Copyright (c) 2022</p>
|
||||
* <p>Company: 泛微软件</p>
|
||||
*
|
||||
* @author qiantao
|
||||
* @version 1.0
|
||||
**/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
//薪资核算人员列表查询条件")
|
||||
public class SalaryAcctEmployeeListQueryParam extends BaseQueryParam {
|
||||
|
||||
/**
|
||||
* 参数错误,薪资核算记录ID不能为空
|
||||
*/
|
||||
@NotNull(message = "LABEL:99845")
|
||||
//薪资核算记录id")
|
||||
private Long salaryAcctRecordId;
|
||||
|
||||
//人员姓名")
|
||||
private String employeeName;
|
||||
|
||||
//个税扣缴义务人")
|
||||
private Long taxAgentId;
|
||||
|
||||
//人员")
|
||||
private Collection<Long> employeeIds;
|
||||
|
||||
//部门")
|
||||
private Collection<Long> departmentIds;
|
||||
|
||||
//岗位")
|
||||
private Collection<Long> positionIds;
|
||||
|
||||
//状态")
|
||||
private String status;
|
||||
|
||||
//工号")
|
||||
private String jobNum;
|
||||
|
||||
//列表主键id")
|
||||
private Collection<Long> ids;
|
||||
|
||||
//薪资核算人员类型")
|
||||
private EmployeeTypeEnum employeeType;
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
package com.engine.salary.entity.salaryacct.param;
|
||||
|
||||
import com.engine.salary.enums.salaryaccounting.LockStatusEnum;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 更新核算锁定状态
|
||||
* <p>Copyright: Copyright (c) 2022</p>
|
||||
* <p>Company: 泛微软件</p>
|
||||
*
|
||||
* @author qiantao
|
||||
* @version 1.0
|
||||
**/
|
||||
@Data
|
||||
public class SalaryAcctResultUpdateLockStatusParam {
|
||||
|
||||
//锁定状态
|
||||
private LockStatusEnum lockStatus;
|
||||
|
||||
//薪资项目的Id")
|
||||
private Long salaryItemId;
|
||||
|
||||
//薪资核算人员的id")
|
||||
// private Set<String> idStrSet;
|
||||
|
||||
//薪资核算记录的id")
|
||||
private Long salaryAcctRecordId;
|
||||
}
|
||||
|
|
@ -10,6 +10,7 @@ import lombok.experimental.Accessors;
|
|||
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 薪资核算表
|
||||
|
|
@ -88,6 +89,11 @@ public class SalaryAcctRecordPO {
|
|||
*/
|
||||
private Date updateTime;
|
||||
|
||||
/**
|
||||
* 锁定的薪资项目
|
||||
*/
|
||||
private List<Long> lockSalaryItemIds;
|
||||
|
||||
//查询条件-------------------------------
|
||||
Collection<Long> ids;
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,37 @@
|
|||
package com.engine.salary.enums.salaryaccounting;
|
||||
|
||||
import com.engine.salary.enums.BaseEnum;
|
||||
|
||||
|
||||
public enum LockStatusEnum implements BaseEnum<String> {
|
||||
DEFAULT("DEFAULT", "默认", 0),
|
||||
LOCK("LOCK", "锁定", 0),
|
||||
UNLOCK("UNLOCK", "未锁定", 0);
|
||||
|
||||
private String value;
|
||||
|
||||
private String defaultLabel;
|
||||
|
||||
private int labelId;
|
||||
|
||||
LockStatusEnum(String value, String defaultLabel, int labelId) {
|
||||
this.value = value;
|
||||
this.defaultLabel = defaultLabel;
|
||||
this.labelId = labelId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getLabelId() {
|
||||
return labelId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDefaultLabel() {
|
||||
return defaultLabel;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
package com.engine.salary.handle;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.huawei.shade.com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.ibatis.type.BaseTypeHandler;
|
||||
import org.apache.ibatis.type.JdbcType;
|
||||
|
||||
import java.sql.CallableStatement;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 集合的转换
|
||||
* <p>Copyright: Copyright (c) 2022</p>
|
||||
* <p>Company: 泛微软件</p>
|
||||
*
|
||||
* @author qiantao
|
||||
* @version 1.0
|
||||
**/
|
||||
@Slf4j
|
||||
public class SalaryListTypeHandler extends BaseTypeHandler<List> {
|
||||
|
||||
@Override
|
||||
public void setNonNullParameter(PreparedStatement preparedStatement, int i, List list, JdbcType jdbcType) throws SQLException {
|
||||
preparedStatement.setString(i, JSON.toJSONString(list));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List getNullableResult(ResultSet resultSet, String s) throws SQLException {
|
||||
JSONArray jsonArray = JSONArray.parseArray(resultSet.getString(s));
|
||||
return jsonArray == null ? new ArrayList<>() : jsonArray;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List getNullableResult(ResultSet resultSet, int i) throws SQLException {
|
||||
JSONArray jsonArray = JSONArray.parseArray(resultSet.getString(i));
|
||||
return jsonArray == null ? new ArrayList<>() : jsonArray;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
|
||||
JSONArray jsonArray = JSONArray.parseArray(callableStatement.getString(i));
|
||||
return jsonArray == null ? new ArrayList<>() : jsonArray;
|
||||
}
|
||||
}
|
||||
|
|
@ -74,4 +74,6 @@ public interface SalaryAcctRecordMapper {
|
|||
void deleteByIds(@Param("ids") Collection<Long> ids);
|
||||
|
||||
List<SalaryAcctRecordPO> listByCreateDate(@Param(value = "createRange") LocalDateRange createRange, @Param(value = "salarySobIds") Set<Long> salarySobIds);
|
||||
|
||||
void updateLockSalaryItemIds(SalaryAcctRecordPO salaryAcctRecord);
|
||||
}
|
||||
|
|
@ -14,11 +14,14 @@
|
|||
<result column="update_time" property="updateTime"/>
|
||||
<result column="delete_type" property="deleteType"/>
|
||||
<result column="tenant_key" property="tenantKey"/>
|
||||
<result column="lock_salary_item_ids" property="lockSalaryItemIds" typeHandler="com.engine.salary.handle.SalaryListTypeHandler"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- 表字段 -->
|
||||
<sql id="baseColumns">
|
||||
t.id
|
||||
t
|
||||
.
|
||||
id
|
||||
, t.salary_month
|
||||
, t.tax_cycle
|
||||
, t.salary_sob_id
|
||||
|
|
@ -30,6 +33,7 @@
|
|||
, t.update_time
|
||||
, t.delete_type
|
||||
, t.tenant_key
|
||||
,t.lock_salary_item_ids
|
||||
</sql>
|
||||
|
||||
<!-- 查询全部 -->
|
||||
|
|
@ -222,9 +226,10 @@
|
|||
</trim>
|
||||
</insert>
|
||||
|
||||
<insert id="insertIgnoreNull" parameterType="com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO" databaseId="oracle"
|
||||
<insert id="insertIgnoreNull" parameterType="com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO"
|
||||
databaseId="oracle"
|
||||
>
|
||||
<selectKey keyProperty="id" resultType="long" order="AFTER">
|
||||
<selectKey keyProperty="id" resultType="long" order="AFTER">
|
||||
select hrsa_salary_acct_record_id.currval from dual
|
||||
</selectKey>
|
||||
INSERT INTO hrsa_salary_acct_record
|
||||
|
|
@ -387,4 +392,15 @@
|
|||
</foreach>
|
||||
</update>
|
||||
|
||||
|
||||
<!-- 更新不为NULL的字段 -->
|
||||
<update id="updateLockSalaryItemIds" parameterType="com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO">
|
||||
UPDATE hrsa_salary_acct_record
|
||||
<set>
|
||||
lock_salary_item_ids =
|
||||
#{lockSalaryItemIds, jdbcType=ARRAY, typeHandler=com.engine.salary.handle.SalaryListTypeHandler},
|
||||
</set>
|
||||
WHERE id = #{id} AND delete_type = 0
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
|
|
@ -180,4 +180,6 @@ public interface SalaryAcctRecordService {
|
|||
* @return
|
||||
*/
|
||||
List<SalaryAcctRecordPO> listByStatusAndEmployeeId(SalaryAcctRecordStatusEnum status, Long employeeId);
|
||||
|
||||
void updateLockSalaryItemIds(SalaryAcctRecordPO salaryAcctRecord);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO;
|
|||
import com.engine.salary.entity.salaryacct.param.SalaryAcctCalculateParam;
|
||||
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultQueryParam;
|
||||
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultSaveParam;
|
||||
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultUpdateLockStatusParam;
|
||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
|
||||
import com.engine.salary.util.page.PageInfo;
|
||||
|
||||
|
|
@ -75,6 +76,7 @@ public interface SalaryAcctResultService {
|
|||
|
||||
/**
|
||||
* 合计行
|
||||
*
|
||||
* @param queryParam
|
||||
* @return
|
||||
*/
|
||||
|
|
@ -107,7 +109,7 @@ public interface SalaryAcctResultService {
|
|||
/**
|
||||
* 保存
|
||||
*
|
||||
* @param saveParam 保存参数
|
||||
* @param saveParam 保存参数
|
||||
*/
|
||||
void save(SalaryAcctResultSaveParam saveParam);
|
||||
|
||||
|
|
@ -156,4 +158,11 @@ public interface SalaryAcctResultService {
|
|||
* @return
|
||||
*/
|
||||
List<SalaryAcctResultPO> listBySalaryAcctRecordIdsAndTaxAgentIds(Collection<Long> salaryAcctRecordIds, Collection<Long> taxAgentIds);
|
||||
|
||||
/**
|
||||
* 更新锁定状态
|
||||
*
|
||||
* @param updateParam
|
||||
*/
|
||||
void updateLockStatusByParam(SalaryAcctResultUpdateLockStatusParam updateParam);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ import com.engine.salary.util.SalaryEntityUtil;
|
|||
import com.google.common.collect.Lists;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.collections4.MapUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.math.NumberUtils;
|
||||
import weaver.hrm.User;
|
||||
|
|
@ -102,7 +103,6 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc
|
|||
|
||||
@Override
|
||||
public void calculate(SalaryAcctCalculateBO salaryAcctCalculateBO, DataCollectionEmployee simpleEmployee) {
|
||||
log.info("开始核算V3{}", salaryAcctCalculateBO);
|
||||
Date now = new Date();
|
||||
try {
|
||||
// 数据库字段加密用
|
||||
|
|
@ -132,6 +132,8 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc
|
|||
// 8、查询薪资核算人员的薪资核算结果
|
||||
Set<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctCalculateBO.getSalaryAcctEmployeePOS(), SalaryAcctEmployeePO::getId);
|
||||
List<SalaryAcctResultPO> salaryAcctResultPOS = getSalaryAcctResultService(user).listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
|
||||
//核算锁定的值
|
||||
Map<Long, SalaryAcctResultPO> salaryAcctLockResultPOS = MapUtils.emptyIfNull(salaryAcctCalculateBO.getSalaryAcctLockResultPOS());
|
||||
// 9、查询相同税款所属期内涉及合并计税的其他薪资核算结果
|
||||
Set<Long> otherSalaryAcctRecordIds = SalaryEntityUtil.properties(salaryAcctCalculateBO.getOtherSalaryAcctRecordPOS(), SalaryAcctRecordPO::getId);
|
||||
List<SalaryAcctResultPO> otherSalaryAcctResultPOS = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndEmployeeIds(otherSalaryAcctRecordIds, employeeIds);
|
||||
|
|
@ -190,6 +192,12 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc
|
|||
resultValue = handleConsolidatedTax(resultValue, salaryItemPO, salaryAcctCalculateBO, otherSalaryAcctEmployeePOMap.get(salaryAcctEmployeePO.getEmployeeId() + "_" + salaryAcctEmployeePO.getTaxAgentId()), otherSalaryAcctResultPOMap.get(salaryAcctEmployeePO.getEmployeeId() + "_" + salaryAcctEmployeePO.getTaxAgentId()));
|
||||
// 处理小数点
|
||||
resultValue = SalaryAcctFormulaBO.roundResultValue(resultValue, salaryItemPO);
|
||||
|
||||
//是否锁定
|
||||
if (salaryAcctLockResultPOS.containsKey(salaryItemId) && salaryAcctLockResultPOS.get(salaryItemId) != null) {
|
||||
resultValue = salaryAcctLockResultPOS.get(salaryItemId).getResultValue();
|
||||
}
|
||||
|
||||
// 将已经计算过的薪资项目的值转换成公式变量的值添加到集合中
|
||||
String key = SalaryFormulaReferenceEnum.SALARY_ITEM.getValue() + SalaryFormulaFieldConstant.FIELD_ID_SEPARATOR + salaryItemPO.getCode();
|
||||
formulaVarValueMap.put(key, resultValue);
|
||||
|
|
@ -246,10 +254,14 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc
|
|||
try {
|
||||
List<FormulaVar> formulaVars = ExpressFormulaBO.buildFormulaVar4Accounting(expressFormula, formulaVarValueMap);
|
||||
Object run = getFormulaRunService(user).run(expressFormula, formulaVars, simpleEmployee);
|
||||
return run == null ? StringUtils.EMPTY : run.toString();
|
||||
return run.toString();
|
||||
} catch (Exception e) {
|
||||
log.error("express execute fail ", e);
|
||||
}
|
||||
|
||||
if ("number".equals(expressFormula.getReturnType())) {
|
||||
return "0";
|
||||
}
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
|
||||
|
|
@ -260,7 +272,7 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc
|
|||
*/
|
||||
private String handleConsolidatedTax(String resultValue, SalaryItemPO salaryItemPO, SalaryAcctCalculateBO salaryAcctCalculateBO, List<SalaryAcctEmployeePO> otherSalaryAcctEmployeePOS, List<SalaryAcctResultPO> otherSalaryAcctResultPOS) {
|
||||
// 如果相同税款所属期内没有其他薪资核算人员,就不存在合并计税
|
||||
if (CollectionUtils.isEmpty(otherSalaryAcctEmployeePOS)||CollectionUtils.isEmpty(otherSalaryAcctResultPOS)) {
|
||||
if (CollectionUtils.isEmpty(otherSalaryAcctEmployeePOS) || CollectionUtils.isEmpty(otherSalaryAcctResultPOS)) {
|
||||
return resultValue;
|
||||
}
|
||||
// 相同税款所属期内其他薪资核算记录
|
||||
|
|
|
|||
|
|
@ -658,6 +658,11 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe
|
|||
return getSalaryAcctRecordMapper().listSome(SalaryAcctRecordPO.builder().status(status.getValue()).creator(employeeId).build());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateLockSalaryItemIds(SalaryAcctRecordPO salaryAcctRecord) {
|
||||
getSalaryAcctRecordMapper().updateLockSalaryItemIds(salaryAcctRecord);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 开启分权后需要判断是否能查看对应的薪资核算记录
|
||||
|
|
|
|||
|
|
@ -17,10 +17,7 @@ import com.engine.salary.entity.salaryacct.dto.ConsolidatedTaxDetailDTO;
|
|||
import com.engine.salary.entity.salaryacct.dto.SalaryAcctProgressDTO;
|
||||
import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultDetailDTO;
|
||||
import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO;
|
||||
import com.engine.salary.entity.salaryacct.param.SalaryAcctCalculateParam;
|
||||
import com.engine.salary.entity.salaryacct.param.SalaryAcctEmployeeQueryParam;
|
||||
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultQueryParam;
|
||||
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultSaveParam;
|
||||
import com.engine.salary.entity.salaryacct.param.*;
|
||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
|
||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
|
||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
|
||||
|
|
@ -30,6 +27,8 @@ import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
|
|||
import com.engine.salary.entity.salarysob.dto.*;
|
||||
import com.engine.salary.entity.salarysob.po.*;
|
||||
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
|
||||
import com.engine.salary.enums.SalaryValueTypeEnum;
|
||||
import com.engine.salary.enums.salaryaccounting.LockStatusEnum;
|
||||
import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum;
|
||||
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
|
||||
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
|
||||
|
|
@ -43,6 +42,7 @@ import com.engine.salary.util.db.MapperProxyFactory;
|
|||
import com.engine.salary.util.page.PageInfo;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.weaver.util.threadPool.ThreadPoolUtil;
|
||||
import com.weaver.util.threadPool.constant.ModulePoolEnum;
|
||||
import com.weaver.util.threadPool.entity.LocalRunnable;
|
||||
|
|
@ -59,6 +59,7 @@ import java.util.*;
|
|||
import java.util.concurrent.BlockingDeque;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.LinkedBlockingDeque;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
|
|
@ -515,7 +516,6 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
|
|||
|
||||
@Override
|
||||
public void calculate(SalaryAcctCalculateParam calculateParam, DataCollectionEmployee simpleEmployee) {
|
||||
log.info("开始核算V2{}", calculateParam);
|
||||
try {
|
||||
// 1、查询薪资核算记录
|
||||
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(calculateParam.getSalaryAcctRecordId());
|
||||
|
|
@ -546,6 +546,19 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
|
|||
Map<String, String> welfareColumns = getSIAccountService(user).welfareColumns();
|
||||
// 7、查询考勤引用的所有字段
|
||||
List<AttendQuoteFieldListDTO> attendQuoteFieldListDTOS = getAttendQuoteFieldService(user).listAll();
|
||||
|
||||
//核算锁定值
|
||||
List<Long> lockSalaryItemIds = salaryAcctRecordPO.getLockSalaryItemIds();
|
||||
Map<Long, SalaryAcctResultPO> acctResults = new HashMap<>();
|
||||
if (CollectionUtils.isNotEmpty(lockSalaryItemIds)) {
|
||||
List<SalaryAcctResultPO> acctResultPOS = listBySalaryAcctRecordIds(Collections.singleton(calculateParam.getSalaryAcctRecordId()));
|
||||
acctResults = Optional.ofNullable(acctResultPOS)
|
||||
.orElse(new ArrayList<>())
|
||||
.stream()
|
||||
.filter(po -> lockSalaryItemIds.contains(po.getSalaryItemId()))
|
||||
.collect(Collectors.toMap(SalaryAcctResultPO::getSalaryItemId, Function.identity()));
|
||||
}
|
||||
|
||||
// 8、查询公式详情
|
||||
Set<Long> formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
|
||||
formulaIds.addAll(SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getFormulaId));
|
||||
|
|
@ -577,7 +590,23 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
|
|||
String calculateKey = UUID.randomUUID().toString();
|
||||
// 12.4、多线程运算,运算结果存放在临时表中
|
||||
for (List<SalaryAcctEmployeePO> acctEmployeePOS : partition) {
|
||||
SalaryAcctCalculateBO salaryAcctCalculateBO = new SalaryAcctCalculateBO().setSalaryAcctRecordPO(salaryAcctRecordPO).setSalarySobPO(salarySobPO).setSalarySobCycleDTO(salarySobCycleDTO).setOtherSalaryAcctRecordPOS(otherSalaryAcctRecordPOS).setSalarySobItemPOS(salarySobItemPOS).setSalaryItemIdWithPriorityList(salarySobItemsWithPriority).setExpressFormulas(expressFormulas).setSalaryItemPOS(salaryItemPOS).setSalarySobAdjustRulePOS(salarySobAdjustRulePOS).setWelfareColumns(MapUtils.emptyIfNull(welfareColumns)).setAttendQuoteFieldListDTOS(attendQuoteFieldListDTOS).setSalaryAcctEmployeePOS(acctEmployeePOS).setChildMonitor(childMonitor).setResults(calculateResults).setCalculateKey(calculateKey);
|
||||
SalaryAcctCalculateBO salaryAcctCalculateBO = new SalaryAcctCalculateBO()
|
||||
.setSalaryAcctRecordPO(salaryAcctRecordPO)
|
||||
.setSalarySobPO(salarySobPO)
|
||||
.setSalarySobCycleDTO(salarySobCycleDTO)
|
||||
.setOtherSalaryAcctRecordPOS(otherSalaryAcctRecordPOS)
|
||||
.setSalaryAcctLockResultPOS(MapUtils.emptyIfNull(acctResults))
|
||||
.setSalarySobItemPOS(salarySobItemPOS)
|
||||
.setSalaryItemIdWithPriorityList(salarySobItemsWithPriority)
|
||||
.setExpressFormulas(expressFormulas)
|
||||
.setSalaryItemPOS(salaryItemPOS)
|
||||
.setSalarySobAdjustRulePOS(salarySobAdjustRulePOS)
|
||||
.setWelfareColumns(MapUtils.emptyIfNull(welfareColumns))
|
||||
.setAttendQuoteFieldListDTOS(attendQuoteFieldListDTOS)
|
||||
.setSalaryAcctEmployeePOS(acctEmployeePOS)
|
||||
.setChildMonitor(childMonitor)
|
||||
.setResults(calculateResults)
|
||||
.setCalculateKey(calculateKey);
|
||||
LocalRunnable localRunnable = new LocalRunnable() {
|
||||
@Override
|
||||
public void execute() {
|
||||
|
|
@ -667,4 +696,91 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
|
|||
}
|
||||
return SalaryAcctResultPOEncrypt.decryptList(getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).taxAgentIds(taxAgentIds).build()));
|
||||
}
|
||||
|
||||
|
||||
// /**
|
||||
// * 查询薪资核算人员
|
||||
// *
|
||||
// * @param queryParam
|
||||
// * @param salaryAcctRecord
|
||||
// * @return
|
||||
// */
|
||||
// private List<SalaryAcctEmployeePO> querySalaryAcctEmployee(SalaryAcctResultListContext salaryAcctResultListContext, SalaryAcctResultQueryParam queryParam, SalaryAcctRecordPO salaryAcctRecord) {
|
||||
// // 构建薪资核算人员的查询参数
|
||||
// SalaryAcctEmployeeQueryParam salaryAcctEmployeeListQueryParam = new SalaryAcctEmployeeQueryParam();
|
||||
// BeanUtils.copyProperties(queryParam, salaryAcctEmployeeListQueryParam);
|
||||
// // 查询薪资核算人员
|
||||
// List<SalaryAcctEmployeePO> salaryAcctEmployees = getSalaryAcctEmployeeService(user).listByParam(salaryAcctEmployeeListQueryParam);
|
||||
// // 查询相同税款所属期内的薪资核算人员
|
||||
// List<SalaryAcctEmployeePO> sameTaxCycleSalaryAcctEmployees = salaryAcctEmployeeService
|
||||
// .listSameTaxCycle(salaryAcctEmployees, SalaryDateUtil.getFormatYearMonth(salaryAcctRecord.getTaxCycle()));
|
||||
// Set<String> sameTaxCycleKeySet = SalaryEntityUtil.properties(sameTaxCycleSalaryAcctEmployees, o -> o.getEmployeeId() + "-" + o.getTaxAgentId());
|
||||
// salaryAcctResultListContext.setSameTaxCycleKeySet(sameTaxCycleKeySet);
|
||||
// // 过滤合并计税的人员
|
||||
// if (StringUtils.isNotEmpty(queryParam.getConsolidatedTaxation())) {
|
||||
// salaryAcctEmployees = salaryAcctEmployees.stream()
|
||||
// .filter(salaryAcctEmployeePO -> sameTaxCycleKeySet.contains(salaryAcctEmployeePO.getEmployeeId() + "-" + salaryAcctEmployeePO.getTaxAgentId()))
|
||||
// .collect(Collectors.toList());
|
||||
// }
|
||||
// // 根据权限过滤
|
||||
// return salaryAcctEmployeeService.filterByAuthority(salaryAcctEmployees, employeeId);
|
||||
// }
|
||||
|
||||
@Override
|
||||
public void updateLockStatusByParam(SalaryAcctResultUpdateLockStatusParam updateParam) {
|
||||
// 查询薪资核算记录
|
||||
SalaryAcctRecordPO salaryAcctRecord = getSalaryAcctRecordService(user).getById(updateParam.getSalaryAcctRecordId());
|
||||
if(CollectionUtils.isEmpty(salaryAcctRecord.getLockSalaryItemIds())){
|
||||
salaryAcctRecord.setLockSalaryItemIds(new ArrayList<>());
|
||||
}
|
||||
List<SalaryAcctEmployeePO> salaryAcctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(updateParam.getSalaryAcctRecordId());
|
||||
if (CollectionUtils.isEmpty(salaryAcctEmployees)) {
|
||||
return;
|
||||
}
|
||||
// 查询薪资核算结果
|
||||
Set<Long> salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployees, SalaryAcctEmployeePO::getId);
|
||||
List<SalaryAcctResultPO> salaryAcctResultValues = this.listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds);
|
||||
Map<Long, SalaryAcctResultPO> salaryAcctResultValueMap = SalaryEntityUtil.convert2Map(salaryAcctResultValues, SalaryAcctResultPO::getSalaryAcctEmpId);
|
||||
// 值可以锁定的薪资项目
|
||||
Set<Long> salaryItemIds = canLockSalaryItemIds(salaryAcctRecord.getSalarySobId());
|
||||
// if (Objects.nonNull(updateParam.getSalaryItemId())) {
|
||||
// if (!salaryItemIds.contains(updateParam.getSalaryItemId())) {
|
||||
// return;
|
||||
// }
|
||||
// salaryItemIds = Collections.singleton(updateParam.getSalaryItemId());
|
||||
// }
|
||||
salaryItemIds = Collections.singleton(updateParam.getSalaryItemId());
|
||||
if (updateParam.getLockStatus() == LockStatusEnum.LOCK) {
|
||||
salaryAcctRecord.getLockSalaryItemIds().addAll(salaryItemIds);
|
||||
} else {
|
||||
salaryAcctRecord.getLockSalaryItemIds().removeAll(salaryItemIds);
|
||||
}
|
||||
getSalaryAcctRecordService(user).updateLockSalaryItemIds(salaryAcctRecord);
|
||||
|
||||
}
|
||||
|
||||
private Set<Long> canLockSalaryItemIds(Long salarySobId) {
|
||||
// 值可以锁定的薪资项目
|
||||
Set<Long> salaryItemIds = Sets.newHashSet();
|
||||
// 查询薪资核算记录所用的薪资账套的薪资项目
|
||||
List<SalarySobItemDTO> salarySobItems = Lists.newArrayList();
|
||||
SalarySobItemAggregateDTO salarySobItemAggregate = getSalarySobItemService(user).getAggregateBySalarySobId(salarySobId);
|
||||
for (SalarySobItemIncomeCategoryDTO incomeCategory : salarySobItemAggregate.getIncomeCategories()) {
|
||||
for (SalarySobItemGroupDTO itemGroup : incomeCategory.getItemGroups()) {
|
||||
salarySobItems.addAll(itemGroup.getItems());
|
||||
}
|
||||
salarySobItems.addAll(incomeCategory.getItems());
|
||||
}
|
||||
for (SalarySobItemDTO salarySobItem : salarySobItems) {
|
||||
if (Objects.equals(salarySobItem.getValueType(), SalaryValueTypeEnum.FORMULA.getValue()) && salarySobItem.isCanEdit()) {
|
||||
salaryItemIds.add(salarySobItem.getSalaryItemId());
|
||||
}
|
||||
}
|
||||
// for (SalarySobItemDTO backCalcItem : salarySobItemAggregate.getBackCalcItems()) {
|
||||
// if (Objects.equals(backCalcItem.getValueType(), SalaryValueTypeEnum.FORMULA.getValue()) && backCalcItem.isCanEdit()) {
|
||||
// salaryItemIds.add(backCalcItem.getSalaryItemId());
|
||||
// }
|
||||
// }
|
||||
return salaryItemIds;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -360,7 +360,6 @@ public class SalaryAcctController {
|
|||
}
|
||||
|
||||
|
||||
|
||||
// **********************************薪资核算人员相关 end*********************************/
|
||||
|
||||
// **********************************薪资核算结果 start*********************************/
|
||||
|
|
@ -411,6 +410,16 @@ public class SalaryAcctController {
|
|||
return new ResponseResult<SalaryAcctResultSaveParam, String>(user).run(getSalaryAcctResultWrapper(user)::save, param);
|
||||
}
|
||||
|
||||
|
||||
//更新薪资核算结果的锁定状态
|
||||
@POST
|
||||
@Path("/acctresult/updateLockStatus")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
public String updateLockStatus(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctResultUpdateLockStatusParam param) {
|
||||
User user = HrmUserVarify.getUser(request, response);
|
||||
return new ResponseResult<SalaryAcctResultUpdateLockStatusParam, String>(user).run(getSalaryAcctResultWrapper(user)::updateLockStatusByParam, param);
|
||||
}
|
||||
|
||||
//薪资核算
|
||||
@POST
|
||||
@Path("/acctresult/accounting")
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO;
|
|||
import com.engine.salary.entity.salaryacct.param.SalaryAcctCalculateParam;
|
||||
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultQueryParam;
|
||||
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultSaveParam;
|
||||
import com.engine.salary.entity.salaryacct.param.SalaryAcctResultUpdateLockStatusParam;
|
||||
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
|
||||
import com.engine.salary.exception.SalaryRunTimeException;
|
||||
import com.engine.salary.service.*;
|
||||
|
|
@ -142,31 +143,6 @@ public class SalaryAcctResultWrapper extends Service {
|
|||
return datas;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取薪资核算列表的高级搜索
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
// public WeaSearchCondition getSearchCondition(String tenantKey) {
|
||||
// SalaryAcctResultSearchConditionDTO searchConditionDTO = new SalaryAcctResultSearchConditionDTO();
|
||||
// WeaSearchCondition searchCondition = SalaryFormatUtil.<SalaryAcctResultSearchConditionDTO>getInstance()
|
||||
// .buildCondition(SalaryAcctResultSearchConditionDTO.class, searchConditionDTO, "SalaryAcctResultCondition");
|
||||
// // 查询个税扣缴义务人
|
||||
// List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).listAll(tenantKey);
|
||||
// List<WeaSearchConditionOption> weaSearchConditionOptions = taxAgentPOS.stream()
|
||||
// .map(taxAgentPO -> new WeaSearchConditionOption(String.valueOf(taxAgentPO.getId()), taxAgentPO.getName()))
|
||||
// .collect(Collectors.toList());
|
||||
// // 给查询条件中的个税扣缴义务人填充下拉项
|
||||
// searchCondition.getItems().forEach((k, v) -> {
|
||||
// if (StringUtils.equals("taxAgentId", k)) {
|
||||
// v.setOptions(weaSearchConditionOptions);
|
||||
// }
|
||||
// });
|
||||
// // 其他条件不要
|
||||
// searchCondition.getGroups().remove(1);
|
||||
// return searchCondition;
|
||||
// }
|
||||
|
||||
/**
|
||||
* 薪资核算结果详情
|
||||
*
|
||||
|
|
@ -208,6 +184,15 @@ public class SalaryAcctResultWrapper extends Service {
|
|||
getSalaryAcctResultService(user).save(saveParam);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新薪资核算结果的值的锁定状态
|
||||
*
|
||||
* @param updateParam
|
||||
*/
|
||||
public void updateLockStatusByParam(SalaryAcctResultUpdateLockStatusParam updateParam) {
|
||||
getSalaryAcctResultService(user).updateLockStatusByParam(updateParam);
|
||||
}
|
||||
|
||||
/**
|
||||
* 薪资核算-核算
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue