From 271daf29be790be38cf19acc7e403b252f1104e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Thu, 17 Nov 2022 09:28:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E9=87=8F=E9=94=81=E5=AE=9A=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salaryacct/bo/SalaryAcctCalculateBO.java | 7 + .../bo/SalaryAcctResultListContext.java | 52 +++++++ .../SalaryAcctEmployeeListQueryParam.java | 61 +++++++++ ...SalaryAcctResultUpdateLockStatusParam.java | 28 ++++ .../salaryacct/po/SalaryAcctRecordPO.java | 6 + .../salaryaccounting/LockStatusEnum.java | 37 +++++ .../salary/handle/SalaryListTypeHandler.java | 49 +++++++ .../salaryacct/SalaryAcctRecordMapper.java | 2 + .../salaryacct/SalaryAcctRecordMapper.xml | 22 ++- .../service/SalaryAcctRecordService.java | 2 + .../service/SalaryAcctResultService.java | 11 +- .../impl/SalaryAcctCalculateServiceImpl.java | 18 ++- .../impl/SalaryAcctRecordServiceImpl.java | 5 + .../impl/SalaryAcctResultServiceImpl.java | 128 +++++++++++++++++- .../salary/web/SalaryAcctController.java | 11 +- .../wrapper/SalaryAcctResultWrapper.java | 35 ++--- 16 files changed, 435 insertions(+), 39 deletions(-) create mode 100644 src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultListContext.java create mode 100644 src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmployeeListQueryParam.java create mode 100644 src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultUpdateLockStatusParam.java create mode 100644 src/com/engine/salary/enums/salaryaccounting/LockStatusEnum.java create mode 100644 src/com/engine/salary/handle/SalaryListTypeHandler.java diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculateBO.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculateBO.java index 144e6773b..8eba860bb 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculateBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculateBO.java @@ -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 salaryAcctLockResultPOS; + + /** * 相同税款所属期内其他薪资核算记录(薪资类型为工资薪金的账套的) */ diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultListContext.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultListContext.java new file mode 100644 index 000000000..a406eee1d --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultListContext.java @@ -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.*; + +/** + * 薪资核算人员 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +@Data +@Accessors(chain = true) +public class SalaryAcctResultListContext { + + private SalaryAcctRecordPO salaryAcctRecord; + + private SalarySobItemAggregateDTO salarySobItemAggregate; + + //存在合并计税的薪资核算人员(employeeId-taxAgentId)") + private Set sameTaxCycleKeySet; + + //薪资核算人员") + private List salaryAcctEmployees; + + private Integer total; + + private Map hrmStatusMap; + + private Map simpleEmployeeMap; + +// private Map extEmployeeMap; + + private Map 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<>(); + } +} diff --git a/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmployeeListQueryParam.java b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmployeeListQueryParam.java new file mode 100644 index 000000000..a35dce175 --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmployeeListQueryParam.java @@ -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; + +/** + * 薪资核算人员列表查询条件 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @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 employeeIds; + + //部门") + private Collection departmentIds; + + //岗位") + private Collection positionIds; + + //状态") + private String status; + + //工号") + private String jobNum; + + //列表主键id") + private Collection ids; + + //薪资核算人员类型") + private EmployeeTypeEnum employeeType; +} diff --git a/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultUpdateLockStatusParam.java b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultUpdateLockStatusParam.java new file mode 100644 index 000000000..d5ae5718f --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultUpdateLockStatusParam.java @@ -0,0 +1,28 @@ +package com.engine.salary.entity.salaryacct.param; + +import com.engine.salary.enums.salaryaccounting.LockStatusEnum; +import lombok.Data; + +/** + * 更新核算锁定状态 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +@Data +public class SalaryAcctResultUpdateLockStatusParam { + + //锁定状态 + private LockStatusEnum lockStatus; + + //薪资项目的Id") + private Long salaryItemId; + + //薪资核算人员的id") +// private Set idStrSet; + + //薪资核算记录的id") + private Long salaryAcctRecordId; +} diff --git a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctRecordPO.java b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctRecordPO.java index 9c239617f..7f1bbf645 100644 --- a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctRecordPO.java +++ b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctRecordPO.java @@ -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 lockSalaryItemIds; + //查询条件------------------------------- Collection ids; diff --git a/src/com/engine/salary/enums/salaryaccounting/LockStatusEnum.java b/src/com/engine/salary/enums/salaryaccounting/LockStatusEnum.java new file mode 100644 index 000000000..316f9aa91 --- /dev/null +++ b/src/com/engine/salary/enums/salaryaccounting/LockStatusEnum.java @@ -0,0 +1,37 @@ +package com.engine.salary.enums.salaryaccounting; + +import com.engine.salary.enums.BaseEnum; + + +public enum LockStatusEnum implements BaseEnum { + 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; + } +} diff --git a/src/com/engine/salary/handle/SalaryListTypeHandler.java b/src/com/engine/salary/handle/SalaryListTypeHandler.java new file mode 100644 index 000000000..06396ed7c --- /dev/null +++ b/src/com/engine/salary/handle/SalaryListTypeHandler.java @@ -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; + +/** + * 集合的转换 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +@Slf4j +public class SalaryListTypeHandler extends BaseTypeHandler { + + @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; + } +} diff --git a/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.java b/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.java index eda9abadb..4dfe0485b 100644 --- a/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.java +++ b/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.java @@ -74,4 +74,6 @@ public interface SalaryAcctRecordMapper { void deleteByIds(@Param("ids") Collection ids); List listByCreateDate(@Param(value = "createRange") LocalDateRange createRange, @Param(value = "salarySobIds") Set salarySobIds); + + void updateLockSalaryItemIds(SalaryAcctRecordPO salaryAcctRecord); } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml b/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml index 123da569a..70b128008 100644 --- a/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml +++ b/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml @@ -14,11 +14,14 @@ + - 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 @@ -222,9 +226,10 @@ - - + select hrsa_salary_acct_record_id.currval from dual INSERT INTO hrsa_salary_acct_record @@ -387,4 +392,15 @@ + + + + UPDATE hrsa_salary_acct_record + + lock_salary_item_ids = + #{lockSalaryItemIds, jdbcType=ARRAY, typeHandler=com.engine.salary.handle.SalaryListTypeHandler}, + + WHERE id = #{id} AND delete_type = 0 + + \ No newline at end of file diff --git a/src/com/engine/salary/service/SalaryAcctRecordService.java b/src/com/engine/salary/service/SalaryAcctRecordService.java index 36ab36590..c1b903a68 100644 --- a/src/com/engine/salary/service/SalaryAcctRecordService.java +++ b/src/com/engine/salary/service/SalaryAcctRecordService.java @@ -180,4 +180,6 @@ public interface SalaryAcctRecordService { * @return */ List listByStatusAndEmployeeId(SalaryAcctRecordStatusEnum status, Long employeeId); + + void updateLockSalaryItemIds(SalaryAcctRecordPO salaryAcctRecord); } diff --git a/src/com/engine/salary/service/SalaryAcctResultService.java b/src/com/engine/salary/service/SalaryAcctResultService.java index 1e9ab320e..6a9a0ea6a 100644 --- a/src/com/engine/salary/service/SalaryAcctResultService.java +++ b/src/com/engine/salary/service/SalaryAcctResultService.java @@ -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 listBySalaryAcctRecordIdsAndTaxAgentIds(Collection salaryAcctRecordIds, Collection taxAgentIds); + + /** + * 更新锁定状态 + * + * @param updateParam + */ + void updateLockStatusByParam(SalaryAcctResultUpdateLockStatusParam updateParam); } diff --git a/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java index c793713d9..377b963dc 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java @@ -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 salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctCalculateBO.getSalaryAcctEmployeePOS(), SalaryAcctEmployeePO::getId); List salaryAcctResultPOS = getSalaryAcctResultService(user).listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds); + //核算锁定的值 + Map salaryAcctLockResultPOS = MapUtils.emptyIfNull(salaryAcctCalculateBO.getSalaryAcctLockResultPOS()); // 9、查询相同税款所属期内涉及合并计税的其他薪资核算结果 Set otherSalaryAcctRecordIds = SalaryEntityUtil.properties(salaryAcctCalculateBO.getOtherSalaryAcctRecordPOS(), SalaryAcctRecordPO::getId); List 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 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 otherSalaryAcctEmployeePOS, List otherSalaryAcctResultPOS) { // 如果相同税款所属期内没有其他薪资核算人员,就不存在合并计税 - if (CollectionUtils.isEmpty(otherSalaryAcctEmployeePOS)||CollectionUtils.isEmpty(otherSalaryAcctResultPOS)) { + if (CollectionUtils.isEmpty(otherSalaryAcctEmployeePOS) || CollectionUtils.isEmpty(otherSalaryAcctResultPOS)) { return resultValue; } // 相同税款所属期内其他薪资核算记录 diff --git a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java index 5f9ff6c7d..a7347ea31 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java @@ -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); + } + /** * 开启分权后需要判断是否能查看对应的薪资核算记录 diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index d6b21f47a..600f13d9c 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -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 welfareColumns = getSIAccountService(user).welfareColumns(); // 7、查询考勤引用的所有字段 List attendQuoteFieldListDTOS = getAttendQuoteFieldService(user).listAll(); + + //核算锁定值 + List lockSalaryItemIds = salaryAcctRecordPO.getLockSalaryItemIds(); + Map acctResults = new HashMap<>(); + if (CollectionUtils.isNotEmpty(lockSalaryItemIds)) { + List 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 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 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 querySalaryAcctEmployee(SalaryAcctResultListContext salaryAcctResultListContext, SalaryAcctResultQueryParam queryParam, SalaryAcctRecordPO salaryAcctRecord) { +// // 构建薪资核算人员的查询参数 +// SalaryAcctEmployeeQueryParam salaryAcctEmployeeListQueryParam = new SalaryAcctEmployeeQueryParam(); +// BeanUtils.copyProperties(queryParam, salaryAcctEmployeeListQueryParam); +// // 查询薪资核算人员 +// List salaryAcctEmployees = getSalaryAcctEmployeeService(user).listByParam(salaryAcctEmployeeListQueryParam); +// // 查询相同税款所属期内的薪资核算人员 +// List sameTaxCycleSalaryAcctEmployees = salaryAcctEmployeeService +// .listSameTaxCycle(salaryAcctEmployees, SalaryDateUtil.getFormatYearMonth(salaryAcctRecord.getTaxCycle())); +// Set 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 salaryAcctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(updateParam.getSalaryAcctRecordId()); + if (CollectionUtils.isEmpty(salaryAcctEmployees)) { + return; + } + // 查询薪资核算结果 + Set salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployees, SalaryAcctEmployeePO::getId); + List salaryAcctResultValues = this.listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds); + Map salaryAcctResultValueMap = SalaryEntityUtil.convert2Map(salaryAcctResultValues, SalaryAcctResultPO::getSalaryAcctEmpId); + // 值可以锁定的薪资项目 + Set 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 canLockSalaryItemIds(Long salarySobId) { + // 值可以锁定的薪资项目 + Set salaryItemIds = Sets.newHashSet(); + // 查询薪资核算记录所用的薪资账套的薪资项目 + List 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; + } } diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index 4260af162..20eae426e 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -360,7 +360,6 @@ public class SalaryAcctController { } - // **********************************薪资核算人员相关 end*********************************/ // **********************************薪资核算结果 start*********************************/ @@ -411,6 +410,16 @@ public class SalaryAcctController { return new ResponseResult(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(user).run(getSalaryAcctResultWrapper(user)::updateLockStatusByParam, param); + } + //薪资核算 @POST @Path("/acctresult/accounting") diff --git a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java index 53bae8140..6cfc09547 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java @@ -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.getInstance() -// .buildCondition(SalaryAcctResultSearchConditionDTO.class, searchConditionDTO, "SalaryAcctResultCondition"); -// // 查询个税扣缴义务人 -// List taxAgentPOS = getTaxAgentService(user).listAll(tenantKey); -// List 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); + } + /** * 薪资核算-核算 *