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());
+ });
}
}