diff --git a/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml b/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml index 0147aa432..9cc2be7f6 100644 --- a/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml +++ b/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml @@ -410,6 +410,9 @@ approval_status=#{approvalStatus}, + + run_status=#{runStatus}, + WHERE id = #{id} AND delete_type = 0 diff --git a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java index 6b350adf0..abdd385ef 100644 --- a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java @@ -2198,7 +2198,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { } @Override - public void socialSecurityBenefitsRecalculate(InsuranceAccountBatchPO param) { + public void socialSecurityBenefitsRecalculate(InsuranceAccountBatchPO insuranceAccountBatchParam) { //fixme 重新核算的校验逻辑 1、先取台账对应扣缴义务人下的所有账套 2、取账套下所有核算记录 3、判断核算记录有没有使用对应月份的福利台账 // int num = getSiAccountBiz(user).checkIfBusinessaccounting(param); // int num = checkIfBusinessAccounting(param); @@ -2206,11 +2206,63 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { // if (num > 0) { // throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "已被薪酬核算给核算过,无法重新核算!")); // } - param.setBillStatus(0); + insuranceAccountBatchParam.setBillStatus(0); // getSiAccountBiz(user).updateById(param); - updateById(param); + updateById(insuranceAccountBatchParam); + InsuranceAccountBatchPO po = getInsuranceAccountBatchMapper().getById(insuranceAccountBatchParam.getId()); + if (po == null) { + return; + } + + // 核算 + AccountParam param = new AccountParam(); + param.setBillMonth(po.getBillMonth()); + param.setFlag(false); + param.setPaymentOrganization(po.getPaymentOrganization()); + ValidUtil.doValidator(param); + + try { + List employeeIds = getInsuranceAccountDetailMapper().selectEmpByPaymentOrg(param.getPaymentOrganization()); + if (CollectionUtils.isEmpty(employeeIds)) { + List list = Lists.newArrayList(getInsuranceAccountDetailMapper().queryNormalListByBillMonth(param.getBillMonth(), param.getPaymentOrganization())); + encryptUtil.decryptList(list, InsuranceAccountDetailPO.class); + if (CollectionUtils.isNotEmpty(list)) { + list.stream().forEach(f -> { + getInsuranceAccountDetailMapper().deleteById(f.getId()); + }); + } + } + SalaryAssert.notEmpty(employeeIds, SalaryI18nUtil.getI18nLabel(0, "没有需要核算的人员")); + + //福利核算进度 + ProgressDTO salaryAcctProgressDTO = getSalaryAcctProgressService(user).getProgress(SalaryCacheKey.ACCT_PROGRESS + param.getBillMonth() + "_" + param.getPaymentOrganization()); + if (salaryAcctProgressDTO != null && salaryAcctProgressDTO.isStatus() && salaryAcctProgressDTO.getProgress().compareTo(BigDecimal.ONE) < 0) { + return; + } + // 初始化进度 + ProgressDTO initProgress = new ProgressDTO() + .setTitle(SalaryI18nUtil.getI18nLabel(0, "核算中")) + .setTitleLabelId(97515L) + .setTotalQuantity(2000) + .setCalculatedQuantity(NumberUtils.INTEGER_ZERO) + .setProgress(BigDecimal.ZERO) + .setStatus(true) + .setMessage(StringUtils.EMPTY); + getSalaryAcctProgressService(user).initProgress(SalaryCacheKey.ACCT_PROGRESS + param.getBillMonth() + "_" + param.getPaymentOrganization(), initProgress); + siAccounting(param); + } catch (Exception e) { + // 回滚 + List list = Lists.newArrayList(getInsuranceAccountBatchMapper().getByBillMonth(param.getBillMonth(), param.getPaymentOrganization())); + list = encryptUtil.decryptList(list, InsuranceAccountBatchPO.class); + if (CollectionUtils.isNotEmpty(list)) { + list.stream().forEach(f -> { + getInsuranceAccountBatchMapper().deleteById(f.getId()); + }); + } + throw new SalaryRunTimeException(e.getMessage()); + } //记录操作日志 - InsuranceAccountBatchPO targetPO = getInsuranceAccountBatchMapper().getById(param.getId()); + InsuranceAccountBatchPO targetPO = getInsuranceAccountBatchMapper().getById(insuranceAccountBatchParam.getId()); encryptUtil.decrypt(targetPO, InsuranceAccountBatchPO.class); TaxAgentPO taxAgentInfo = getTaxAgentMapper().getById(targetPO.getPaymentOrganization()); LoggerContext loggerContext = new LoggerContext<>(); @@ -5557,14 +5609,20 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { .setStatus(true) .setMessage(StringUtils.EMPTY); getSalaryAcctProgressService(user).initProgress(SalaryCacheKey.ACCT_PROGRESS + param.getBillMonth() + "_" + param.getPaymentOrganization(), initProgress); - - ExecutorService taskExecutor = Executors.newCachedThreadPool(); - taskExecutor.execute(() -> { + if (param.isFlag()) { siAccounting(param); if (param.isFileFlag()) { siFile(param.getBillMonth(), param.getPaymentOrganization()); } - }); + } else { + ExecutorService taskExecutor = Executors.newCachedThreadPool(); + taskExecutor.execute(() -> { + siAccounting(param); + if (param.isFileFlag()) { + siFile(param.getBillMonth(), param.getPaymentOrganization()); + } + }); + } } catch (Exception e) { // 回滚 List list = Lists.newArrayList(getInsuranceAccountBatchMapper().getByBillMonth(param.getBillMonth(), param.getPaymentOrganization())); diff --git a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java index d40e88b79..1ae2604b0 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java @@ -10,6 +10,7 @@ import com.engine.salary.config.SalaryElogConfig; import com.engine.salary.entity.salaryBill.po.SalarySendPO; import com.engine.salary.entity.salaryacct.bo.SalaryAcctRecordBO; import com.engine.salary.entity.salaryacct.param.SalaryAcctBatParam; +import com.engine.salary.entity.salaryacct.param.SalaryAcctCalculateParam; import com.engine.salary.entity.salaryacct.param.SalaryAcctRecordQueryParam; import com.engine.salary.entity.salaryacct.param.SalaryAcctRecordSaveParam; import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; @@ -36,6 +37,7 @@ import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.engine.salary.util.valid.ValidUtil; +import com.engine.salary.wrapper.SalaryAcctResultWrapper; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; @@ -116,6 +118,9 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); } + private SalaryAcctResultWrapper getSalaryAcctResultWrapper(User user) { + return ServiceUtil.getService(SalaryAcctResultWrapper.class, user); + } @Override public SalaryAcctRecordPO getById(Long id) { @@ -506,6 +511,21 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe }); } + public void updateRunStatusByIds(Collection ids, String runStatus) { + // 查询薪资核算记录 + List salaryAcctRecordPOS = listByIds(ids); + if (CollectionUtils.isEmpty(salaryAcctRecordPOS)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除")); + } + // 更新薪资核算记录的状态 + Date now = new Date(); + salaryAcctRecordPOS.forEach(salaryAcctRecordPO -> { + salaryAcctRecordPO.setRunStatus(runStatus); + salaryAcctRecordPO.setUpdateTime(now); + getSalaryAcctRecordMapper().updateIgnoreNull(salaryAcctRecordPO); + }); + } + @Override public void deleteByIds(Collection ids) { // 查询薪资核算记录 @@ -879,7 +899,20 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe List salaryAcctRecordIds = param.getSalaryAcctRecordIds(); for (int i = 0; i < salaryAcctRecordIds.size(); i++) { Long recordId = salaryAcctRecordIds.get(i); - reCalculate(recordId); + SalaryAcctRecordPO salaryAcctRecordPO = getById(recordId); + if (salaryAcctRecordPO != null && salaryAcctRecordPO.getStatus().equals(SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue())) { + // 未归档直接重新核算 + } else { + reCalculate(recordId); + } } + + // 更新核算状态 + updateRunStatusByIds(salaryAcctRecordIds, "核算中"); + + // 重新核算 + salaryAcctRecordIds.forEach(salaryAcctRecordId -> { + getSalaryAcctResultWrapper(user).calculate4Sync(SalaryAcctCalculateParam.builder().salaryAcctRecordId(salaryAcctRecordId).build()); + }); } }