|
|
@@ -34,6 +34,7 @@ import cn.iocoder.yudao.module.system.service.biz.ExpenseOrderService;
|
|
|
import cn.iocoder.yudao.module.system.service.biz.RefundSettlementOrderService;
|
|
|
import com.mzt.logapi.starter.annotation.LogRecord;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
@@ -80,10 +81,6 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
|
|
|
@Resource
|
|
|
private ExpenseOrderMapper expenseOrderMapper;
|
|
|
|
|
|
-
|
|
|
- @Resource
|
|
|
- private ExpenseOrderItemMapper expenseOrderItemMapper;
|
|
|
-
|
|
|
@Resource
|
|
|
private AdminUserMapper userMapper;
|
|
|
@Resource
|
|
|
@@ -102,6 +99,11 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
|
|
|
@Resource
|
|
|
private RefundSettlementOrderItemMapper refundSettlementOrderItemMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ExpenseSubsidyMapper expenseSubsidyMapper;
|
|
|
+ @Autowired
|
|
|
+ private ElderlyConsumerVouchersMapper consumerVouchersMapper;
|
|
|
+
|
|
|
@Override
|
|
|
@LogRecord(type = EXPENSE_SETTLEMENT_TYPE, subType = EXPENSE_SETTLEMENT_TYPE_SUB_TYPE, bizNo = "{{#elderlyInfo.id}}",
|
|
|
success = EXPENSE_SETTLEMENT_INSERT_SUCCESS)
|
|
|
@@ -121,6 +123,12 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
|
|
|
.eq(ExpenseOrderDO::getElderId,elderlyInfo.getId())
|
|
|
.eq(ExpenseOrderDO::getPayStatus,0)
|
|
|
.ge(ExpenseOrderDO::getBillingMonth,costDeadlineYearMonth));
|
|
|
+ // 解锁退住日期后续月账单,避免推送至金蝶
|
|
|
+ expenseOrderMapper.update(new ExpenseOrderDO().setIsLock(Boolean.FALSE),new LambdaQueryWrapperX<ExpenseOrderDO>()
|
|
|
+ .eq(ExpenseOrderDO::getElderId,elderlyInfo.getId())
|
|
|
+ .eq(ExpenseOrderDO::getPayStatus,0)
|
|
|
+ .eq(ExpenseOrderDO::getIsShow,Boolean.FALSE)
|
|
|
+ .gt(ExpenseOrderDO::getBillingMonth,costDeadlineYearMonth));
|
|
|
if (elderlyCheckInRecordDO != null){
|
|
|
elderlyCheckInRecordDO.setStatus(3);
|
|
|
elderlyCheckInRecordMapper.updateById(elderlyCheckInRecordDO);
|
|
|
@@ -130,6 +138,7 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
|
|
|
RefundSettlementOrderDO order = new RefundSettlementOrderDO();
|
|
|
order.setElderId(elderlyInfo.getId());
|
|
|
order.setBusinessId(businessId);
|
|
|
+ order.setVersion(1);
|
|
|
order.setRefundAmount(BigDecimal.ZERO);
|
|
|
order.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
|
|
|
order.setCreatedTime(new Date());
|
|
|
@@ -137,6 +146,7 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
|
|
|
order.setTenantId(startTenantId);
|
|
|
refundSettlementOrderMapper.insert(order);
|
|
|
|
|
|
+// createRetreatChangeDailyExpenses(elderlyRetreatRecord, startTenantId);
|
|
|
|
|
|
// 生成退款单子项,获取退住结算数据
|
|
|
RefundSettlementOrderRespVO virtualRefundSettlementOrder = refundSettlementOrderService.getVirtualRefundSettlementOrder(order.getId());
|
|
|
@@ -159,80 +169,6 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
|
|
|
refundSettlementOrderMapper.updateById(order);
|
|
|
|
|
|
|
|
|
- //查询长者月度费项配置
|
|
|
- ExpenseDO expense = expenseMapper.selectList(new LambdaQueryWrapperX<ExpenseDO>()
|
|
|
- .eq(ExpenseDO::getElderId, elderlyInfo.getId())
|
|
|
- .eq(ExpenseDO::getTenantId, startTenantId)
|
|
|
- .orderByDesc(ExpenseDO::getCreatedTime))
|
|
|
- .stream()
|
|
|
- .findFirst()
|
|
|
- .get();
|
|
|
-
|
|
|
- List<ExpenseItemDO> expenseItems = expenseItemMapper.selectList(new LambdaQueryWrapperX<ExpenseItemDO>()
|
|
|
- .eq(ExpenseItemDO::getExpenseId, expense.getId())
|
|
|
- .eq(ExpenseItemDO::getIsMonthlyExpense, BooleanEnum.TRUE.getValue())
|
|
|
- .eq(ExpenseItemDO::getTenantId, startTenantId));
|
|
|
-
|
|
|
- for (ExpenseItemDO expenseItem : expenseItems) {
|
|
|
- List<ExpenseItemDO> list = expenseItemMapper.selectCurrentMonthList(elderlyRetreatRecord.getRetreatDate(),
|
|
|
- elderlyRetreatRecord.getElderlyId(), expenseItem.getType());
|
|
|
- LocalDate retreatDate = elderlyRetreatRecord.getRetreatDate();
|
|
|
- LocalDate firstDayOfMonth = retreatDate.withDayOfMonth(1);
|
|
|
- for (int i = 0; i < list.size(); i++) {
|
|
|
- ExpenseItemDO expenseItemDO = list.get(i);
|
|
|
- BigDecimal daysInCurrentMonth = BigDecimal.valueOf(elderlyRetreatRecord.getRetreatDate().lengthOfMonth());
|
|
|
- BigDecimal actualAmount = expenseItemDO.getActualAmount();
|
|
|
- LocalDate changeStartDate = expenseItemDO.getChangeStartDate();
|
|
|
- LocalDate changeEndDate = expenseItemDO.getChangeEndDate();
|
|
|
-
|
|
|
- if (null == changeEndDate && changeStartDate.isBefore(retreatDate)) {
|
|
|
- changeEndDate = retreatDate;
|
|
|
- }
|
|
|
-
|
|
|
- // 变更产生的金额
|
|
|
- BigDecimal amount = BigDecimal.ZERO;
|
|
|
- // 变更整月差额
|
|
|
- BigDecimal changeAmount = BigDecimal.ZERO;
|
|
|
- if (null != changeStartDate && null != changeEndDate) {
|
|
|
- long startDay = changeStartDate.toEpochDay();
|
|
|
- long endDay = changeEndDate.toEpochDay();
|
|
|
- BigDecimal currentDays = BigDecimal.valueOf(endDay - startDay);
|
|
|
- BigDecimal currentDayAmount = actualAmount.divide(daysInCurrentMonth, 8, RoundingMode.HALF_UP);
|
|
|
- amount = currentDayAmount.multiply(currentDays);
|
|
|
- if (i == list.size() - 1) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- ExpenseItemDO nextItem = list.get(i + 1);
|
|
|
- LocalDate lastDayOfMonth = firstDayOfMonth.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
- long epochDay = lastDayOfMonth.toEpochDay();
|
|
|
- BigDecimal changeDay = BigDecimal.valueOf(epochDay - endDay);
|
|
|
- BigDecimal changeDayAmount = nextItem.getActualAmount().divide(daysInCurrentMonth, 8, RoundingMode.HALF_UP);
|
|
|
- BigDecimal currentAmount = currentDayAmount.multiply(changeDay);
|
|
|
- changeAmount = changeDayAmount.multiply(changeDay);
|
|
|
- BigDecimal finalAmount = currentAmount.subtract(changeAmount);
|
|
|
-
|
|
|
- DailyExpensesDO dailyExpenses = new DailyExpensesDO();
|
|
|
- dailyExpenses.setType(2); // 2:变更
|
|
|
- dailyExpenses.setElderId(elderlyRetreatRecord.getElderlyId());
|
|
|
- dailyExpenses.setAttributionBillTime(lastDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM")));
|
|
|
- dailyExpenses.setItemId(nextItem.getId());
|
|
|
- dailyExpenses.setItemCategory(nextItem.getItemCategoryName());
|
|
|
- dailyExpenses.setItemName(nextItem.getItemName());
|
|
|
- dailyExpenses.setPrice(finalAmount);
|
|
|
- dailyExpenses.setAmount(finalAmount);
|
|
|
- String currentRemark = String.format(RETREAT_DAILY_PAY_REMARK, nextItem.getItemName(), changeEndDate
|
|
|
- ,changeEndDate, lastDayOfMonth);
|
|
|
- dailyExpenses.setRemarks(currentRemark); //todo 补充备注
|
|
|
- dailyExpenses.setCount(1);
|
|
|
- dailyExpenses.setCreatedTime(new Date());
|
|
|
- dailyExpenses.setAccountingTime(new Date());
|
|
|
- dailyExpenses.setIsGenerateBill(BooleanEnum.FALSE.getValue());
|
|
|
- dailyExpenses.setTenantId(startTenantId);
|
|
|
- dailyExpenses.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
|
|
|
- dailyExpensesMapper.insert(dailyExpenses);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
Map<String, Object> templateParams = new HashMap<>();
|
|
|
templateParams.put("elderName", elderlyInfo.getElderName());
|
|
|
List<BusinessParamsConfigDO> businessParamsConfigDOS = businessParamsConfigMapper.selectListByName(startTenantId ,NoticeConstants.REFUND_SETTLEMENT_HANDLE_NAME);
|
|
|
@@ -308,6 +244,85 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ private void createRetreatChangeDailyExpenses(ElderlyRetreatRecordDO elderlyRetreatRecord, Long startTenantId) {
|
|
|
+ ExpenseDO expense = expenseMapper.selectList(new LambdaQueryWrapperX<ExpenseDO>()
|
|
|
+ .eq(ExpenseDO::getElderId, elderlyRetreatRecord.getElderlyId())
|
|
|
+ .eq(ExpenseDO::getTenantId, startTenantId)
|
|
|
+ .orderByDesc(ExpenseDO::getCreatedTime))
|
|
|
+ .stream()
|
|
|
+ .findFirst()
|
|
|
+ .orElse(null);
|
|
|
+ if (expense == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<ExpenseItemDO> expenseItems = expenseItemMapper.selectList(new LambdaQueryWrapperX<ExpenseItemDO>()
|
|
|
+ .eq(ExpenseItemDO::getExpenseId, expense.getId())
|
|
|
+ .eq(ExpenseItemDO::getIsMonthlyExpense, BooleanEnum.TRUE.getValue())
|
|
|
+ .eq(ExpenseItemDO::getTenantId, startTenantId));
|
|
|
+
|
|
|
+ for (ExpenseItemDO expenseItem : expenseItems) {
|
|
|
+ List<ExpenseItemDO> list = expenseItemMapper.selectCurrentMonthList(elderlyRetreatRecord.getRetreatDate(),
|
|
|
+ elderlyRetreatRecord.getElderlyId(), expenseItem.getType());
|
|
|
+ LocalDate retreatDate = elderlyRetreatRecord.getRetreatDate();
|
|
|
+ LocalDate firstDayOfMonth = retreatDate.withDayOfMonth(1);
|
|
|
+ for (int i = 0; i < list.size(); i++) {
|
|
|
+ ExpenseItemDO expenseItemDO = list.get(i);
|
|
|
+ BigDecimal daysInCurrentMonth = BigDecimal.valueOf(elderlyRetreatRecord.getRetreatDate().lengthOfMonth());
|
|
|
+ BigDecimal actualAmount = expenseItemDO.getActualAmount();
|
|
|
+ LocalDate changeStartDate = expenseItemDO.getChangeStartDate();
|
|
|
+ LocalDate changeEndDate = expenseItemDO.getChangeEndDate();
|
|
|
+
|
|
|
+ if (changeStartDate == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (changeEndDate == null && changeStartDate.isBefore(retreatDate)) {
|
|
|
+ changeEndDate = retreatDate;
|
|
|
+ }
|
|
|
+ if (changeEndDate == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (i == list.size() - 1) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ long endDay = changeEndDate.toEpochDay();
|
|
|
+ ExpenseItemDO nextItem = list.get(i + 1);
|
|
|
+ LocalDate lastDayOfMonth = firstDayOfMonth.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
+ long epochDay = lastDayOfMonth.toEpochDay();
|
|
|
+ BigDecimal changeDay = BigDecimal.valueOf(epochDay - endDay);
|
|
|
+ if (changeDay.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal currentDayAmount = actualAmount.divide(daysInCurrentMonth, 8, RoundingMode.HALF_UP);
|
|
|
+ BigDecimal changeDayAmount = nextItem.getActualAmount().divide(daysInCurrentMonth, 8, RoundingMode.HALF_UP);
|
|
|
+ BigDecimal currentAmount = currentDayAmount.multiply(changeDay);
|
|
|
+ BigDecimal changeAmount = changeDayAmount.multiply(changeDay);
|
|
|
+ BigDecimal finalAmount = currentAmount.subtract(changeAmount);
|
|
|
+
|
|
|
+ DailyExpensesDO dailyExpenses = new DailyExpensesDO();
|
|
|
+ dailyExpenses.setType(2);
|
|
|
+ dailyExpenses.setElderId(elderlyRetreatRecord.getElderlyId());
|
|
|
+ dailyExpenses.setAttributionBillTime(lastDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM")));
|
|
|
+ dailyExpenses.setItemId(nextItem.getId());
|
|
|
+ dailyExpenses.setItemCategory(nextItem.getItemCategoryName());
|
|
|
+ dailyExpenses.setItemName(nextItem.getItemName());
|
|
|
+ dailyExpenses.setPrice(finalAmount);
|
|
|
+ dailyExpenses.setAmount(finalAmount);
|
|
|
+ String currentRemark = String.format(RETREAT_DAILY_PAY_REMARK, nextItem.getItemName(), changeEndDate, changeEndDate, lastDayOfMonth);
|
|
|
+ dailyExpenses.setRemarks(currentRemark);
|
|
|
+ dailyExpenses.setCount(1);
|
|
|
+ dailyExpenses.setCreatedTime(new Date());
|
|
|
+ dailyExpenses.setAccountingTime(new Date());
|
|
|
+ dailyExpenses.setIsGenerateBill(BooleanEnum.FALSE.getValue());
|
|
|
+ dailyExpenses.setTenantId(startTenantId);
|
|
|
+ dailyExpenses.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
|
|
|
+ dailyExpensesMapper.insert(dailyExpenses);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@NotNull
|
|
|
private static RefundSettlementOrderItemDO getRefundSettlementOrderItemDO(ExpenseOrderItemVO itemVO, RefundSettlementOrderDO order) {
|
|
|
RefundSettlementOrderItemDO refundItem = new RefundSettlementOrderItemDO();
|
|
|
@@ -319,6 +334,8 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
|
|
|
refundItem.setRefundAmount(itemVO.getAmount());
|
|
|
refundItem.setActualRefundAmount(itemVO.getAmount());
|
|
|
refundItem.setSourceItemId(itemVO.getItemId());
|
|
|
+ refundItem.setSourceOrderItemId(itemVO.getSourceOrderItemId());
|
|
|
+ refundItem.setExpenseSource(itemVO.getExpenseSource());
|
|
|
refundItem.setTenantId(TenantContextHolder.getTenantId());
|
|
|
// 根据费用类型设置type字段
|
|
|
if (itemVO.getIsDeposit() != null && itemVO.getIsDeposit() == 1) {
|
|
|
@@ -342,6 +359,76 @@ public class BpmElderlyExpenseApiImpl implements BpmElderlyExpenseApi {
|
|
|
return refundItem;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @TenantIgnore
|
|
|
+ @Transactional
|
|
|
+ public void revokeApprovedRetreat(Long retreatRecordId) {
|
|
|
+ ElderlyRetreatRecordDO retreatRecord = retreatRecordMapper.selectById(retreatRecordId);
|
|
|
+ if (retreatRecord == null) {
|
|
|
+ throw new RuntimeException("找不到该退住申请记录");
|
|
|
+ }
|
|
|
+
|
|
|
+ RefundSettlementOrderDO refundSettlementOrder = refundSettlementOrderMapper.selectOne(new LambdaQueryWrapperX<RefundSettlementOrderDO>()
|
|
|
+ .eq(RefundSettlementOrderDO::getBusinessId, retreatRecordId)
|
|
|
+ .orderByDesc(RefundSettlementOrderDO::getCreatedTime)
|
|
|
+ .last("LIMIT 1"));
|
|
|
+ if (refundSettlementOrder == null) {
|
|
|
+ throw new RuntimeException("未找到对应退住结算单,无法撤销退住申请");
|
|
|
+ }
|
|
|
+ if (Objects.equals(refundSettlementOrder.getStatus(), BooleanEnum.TRUE.getValue())) {
|
|
|
+ throw new RuntimeException("退住结算单已结算,请先撤销结算");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<RefundSettlementOrderItemDO> refundItems = refundSettlementOrderItemMapper.selectList(
|
|
|
+ new LambdaQueryWrapperX<RefundSettlementOrderItemDO>()
|
|
|
+ .eq(RefundSettlementOrderItemDO::getRefundSettlementOrderId, refundSettlementOrder.getId()));
|
|
|
+ Set<Long> subsidyIds = new HashSet<>();
|
|
|
+ Set<Long> voucherIds = new HashSet<>();
|
|
|
+ for (RefundSettlementOrderItemDO refundItem : refundItems) {
|
|
|
+ if(refundItem.getExpenseSource().equals(BusinessConstants.LONG_TERM_CARE_INSURANCE)){
|
|
|
+ subsidyIds.add(refundItem.getSourceItemId());
|
|
|
+ }
|
|
|
+ if(refundItem.getExpenseSource().equals(BusinessConstants.CONSUMER_VOUCHER)){
|
|
|
+ voucherIds.add(refundItem.getSourceItemId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<ExpenseSubsidyDO> expenseSubsidyDOS = expenseSubsidyMapper.selectList(new LambdaQueryWrapperX<ExpenseSubsidyDO>().in(ExpenseSubsidyDO::getId, subsidyIds));
|
|
|
+ List<ExpenseSubsidyDO> updateExpenseSubsidyList = new ArrayList<>();
|
|
|
+ for (ExpenseSubsidyDO expenseSubsidyDO : expenseSubsidyDOS) {
|
|
|
+ // 退住后补录的长护险未带入到任何月度账单,需要撤销抵扣状态
|
|
|
+ if (StringUtils.isBlank(expenseSubsidyDO.getOrderNumber())) {
|
|
|
+ expenseSubsidyDO.setStatus(0);
|
|
|
+ updateExpenseSubsidyList.add(expenseSubsidyDO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 更新退住后补录的长护险
|
|
|
+ expenseSubsidyMapper.updateBatch(updateExpenseSubsidyList);
|
|
|
+
|
|
|
+ List<ElderlyConsumerVouchersDO> vouchersDOS = consumerVouchersMapper.selectList(new LambdaQueryWrapperX<ElderlyConsumerVouchersDO>().in(ElderlyConsumerVouchersDO::getId, voucherIds));
|
|
|
+ List<ElderlyConsumerVouchersDO> updatevouchersList = new ArrayList<>();
|
|
|
+ for (ElderlyConsumerVouchersDO vouchersDO : vouchersDOS) {
|
|
|
+ if (StringUtils.isBlank(vouchersDO.getOrderNumber())) {
|
|
|
+ vouchersDO.setStatus(0);
|
|
|
+ updatevouchersList.add(vouchersDO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ consumerVouchersMapper.updateBatch(updatevouchersList);
|
|
|
+
|
|
|
+
|
|
|
+ refundSettlementOrderItemMapper.delete(new LambdaQueryWrapperX<RefundSettlementOrderItemDO>()
|
|
|
+ .eq(RefundSettlementOrderItemDO::getRefundSettlementOrderId, refundSettlementOrder.getId()));
|
|
|
+ refundSettlementOrderMapper.deleteById(refundSettlementOrder.getId());
|
|
|
+
|
|
|
+ Long elderId = retreatRecord.getElderlyId();
|
|
|
+ YearMonth costDeadlineYearMonth = YearMonth.from(retreatRecord.getCostDeadlineDate());
|
|
|
+ expenseOrderMapper.update(new ExpenseOrderDO().setIsShow(Boolean.TRUE), new LambdaQueryWrapperX<ExpenseOrderDO>()
|
|
|
+ .eq(ExpenseOrderDO::getElderId, elderId)
|
|
|
+ .eq(ExpenseOrderDO::getPayStatus, 0)
|
|
|
+ .eq(ExpenseOrderDO::getIsShow, Boolean.FALSE)
|
|
|
+ .ge(ExpenseOrderDO::getBillingMonth, costDeadlineYearMonth));
|
|
|
+ notifyMessageSendApi.updateMessageByCodeAndPkMessage(BpmMessageEnum.REFUND_SETTLEMENT_HANDLE.getTemplateCode(), elderId);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public void applyRetreatCheck(Long elderId,LocalDate costDeadlineDate){
|
|
|
ElderlyInfoDO elderlyInfoDO = elderlyInfoMapper.selectById(elderId);
|