|
|
@@ -171,6 +171,64 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
@Autowired
|
|
|
private ElderlyConsumerVouchersMapper elderlyConsumerVouchersMapper;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private cn.iocoder.yudao.module.system.api.sys.BusinessParamsConfigApi businessParamsConfigApi;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 账单金额单项取整设置:配置所属标题
|
|
|
+ */
|
|
|
+ private static final String AMOUNT_ROUND_CONFIG_TITLE = "财务模块配置";
|
|
|
+ /**
|
|
|
+ * 账单金额单项取整设置:配置名称
|
|
|
+ */
|
|
|
+ private static final String AMOUNT_ROUND_CONFIG_NAME = "账单金额单项取整设置";
|
|
|
+ /**
|
|
|
+ * 配置值:保留两位小数(四舍五入)
|
|
|
+ */
|
|
|
+ private static final String AMOUNT_ROUND_VALUE_TWO_SCALE = "4";
|
|
|
+ /**
|
|
|
+ * 配置值:四舍五入取整
|
|
|
+ */
|
|
|
+ private static final String AMOUNT_ROUND_VALUE_INTEGER = "2";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前机构的「账单金额单项取整设置」配置值
|
|
|
+ */
|
|
|
+ private String getAmountRoundConfigValue(Long tenantId) {
|
|
|
+ try {
|
|
|
+ return businessParamsConfigApi.getConfigValue(tenantId, AMOUNT_ROUND_CONFIG_TITLE, AMOUNT_ROUND_CONFIG_NAME);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("[getAmountRoundConfigValue] 获取账单金额单项取整设置失败,tenantId={}", tenantId, e);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断「账单金额单项取整设置」是否配置了需要处理的取整方式
|
|
|
+ */
|
|
|
+ private static boolean isAmountRoundConfigured(String configValue) {
|
|
|
+ return AMOUNT_ROUND_VALUE_TWO_SCALE.equals(configValue) || AMOUNT_ROUND_VALUE_INTEGER.equals(configValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按照机构的「账单金额单项取整设置」配置,对金额做小数位处理
|
|
|
+ *
|
|
|
+ * @param v 金额
|
|
|
+ * @param configValue 配置值:4-保留两位小数四舍五入;2-四舍五入取整;其它-保持现状
|
|
|
+ */
|
|
|
+ private static BigDecimal roundByConfig(BigDecimal v, String configValue) {
|
|
|
+ if (v == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ if (AMOUNT_ROUND_VALUE_TWO_SCALE.equals(configValue)) {
|
|
|
+ return v.setScale(2, RoundingMode.HALF_UP);
|
|
|
+ }
|
|
|
+ if (AMOUNT_ROUND_VALUE_INTEGER.equals(configValue)) {
|
|
|
+ return v.setScale(0, RoundingMode.HALF_UP);
|
|
|
+ }
|
|
|
+ return v;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public PageResult<ExpenseOrderDO> getExpenseBillPage(ExpenseBillPageReqVO pageReqVO) {
|
|
|
Page<ExpenseOrderDO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
|
|
|
@@ -844,8 +902,8 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
actualEnd = LocalDate.parse(collect.get(0).getEndTime());
|
|
|
}
|
|
|
List<ExpenseItemRespVO> dailyExpensesCollect = collectDailyExpenseItemsNoBill(elderId, billingMonth);
|
|
|
- List<ExpenseItemRespVO> subsidyCollect = collectSubsidyItems(elderId, billingMonth, actualStart, actualEnd, false);
|
|
|
- List<ExpenseItemRespVO> consumerVoucherCollect = collectConsumerVoucherItems(elderId, billingMonth, actualStart, actualEnd, false);
|
|
|
+ List<ExpenseItemRespVO> subsidyCollect = collectSubsidyItems(elderId, billingMonth, actualStart, actualEnd, false,null);
|
|
|
+ List<ExpenseItemRespVO> consumerVoucherCollect = collectConsumerVoucherItems(elderId, billingMonth, actualStart, actualEnd, false,null);
|
|
|
|
|
|
// 优惠抵扣项:按实际区间折算金额 & 展示区间
|
|
|
List<ExpenseItemRespVO> discountCollect = adjustDiscountByActualRange(elderId, billingMonth, actualStart, actualEnd);
|
|
|
@@ -864,8 +922,8 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
LocalDate monthStart = billingYm.atDay(1);
|
|
|
LocalDate monthEnd = billingYm.atEndOfMonth();
|
|
|
resultList.addAll(collectDailyExpenseItemsNoBill(elderId, billingMonth));
|
|
|
- resultList.addAll(collectSubsidyItems(elderId, billingMonth, monthStart, monthEnd, false));
|
|
|
- resultList.addAll(collectConsumerVoucherItems(elderId, billingMonth, monthStart, monthEnd, false));
|
|
|
+ resultList.addAll(collectSubsidyItems(elderId, billingMonth, monthStart, monthEnd, false,null));
|
|
|
+ resultList.addAll(collectConsumerVoucherItems(elderId, billingMonth, monthStart, monthEnd, false,null));
|
|
|
resultList.addAll(calculateDiscountDeduction(elderId, billingMonth));
|
|
|
return resultList;
|
|
|
}
|
|
|
@@ -907,7 +965,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
|
|
|
private List<ExpenseItemRespVO> collectSubsidyItems(Long elderId, String billingMonth,
|
|
|
LocalDate startDate, LocalDate endDate,
|
|
|
- boolean markUsed) {
|
|
|
+ boolean markUsed,ExpenseOrderDO expenseOrder) {
|
|
|
List<ExpenseSubsidyDO> unclaimedSubsidies = expenseSubsidyMapper.selectList(new LambdaQueryWrapperX<ExpenseSubsidyDO>()
|
|
|
.eq(ExpenseSubsidyDO::getElderId, elderId)
|
|
|
.eq(ExpenseSubsidyDO::getDeductionBillMonth, billingMonth)
|
|
|
@@ -928,6 +986,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
respVO.setStartTime(startDate.toString());
|
|
|
respVO.setEndTime(endDate.toString());
|
|
|
if (markUsed) {
|
|
|
+ subsidy.setOrderNumber(expenseOrder.getBillOrderNumber());
|
|
|
subsidy.setStatus(BooleanEnum.TRUE.getValue());
|
|
|
updateList.add(subsidy);
|
|
|
}
|
|
|
@@ -942,7 +1001,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
|
|
|
private List<ExpenseItemRespVO> collectConsumerVoucherItems(Long elderId, String billingMonth,
|
|
|
LocalDate startDate, LocalDate endDate,
|
|
|
- boolean markUsed) {
|
|
|
+ boolean markUsed,ExpenseOrderDO expenseOrder) {
|
|
|
List<ElderlyConsumerVouchersDO> voucherList = elderlyConsumerVouchersMapper.selectList(new LambdaQueryWrapperX<ElderlyConsumerVouchersDO>()
|
|
|
.eq(ElderlyConsumerVouchersDO::getElderId, elderId)
|
|
|
.eq(ElderlyConsumerVouchersDO::getBillingMonth, billingMonth)
|
|
|
@@ -963,6 +1022,8 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
respVO.setStartTime(startDate.toString());
|
|
|
respVO.setEndTime(endDate.toString());
|
|
|
if (markUsed) {
|
|
|
+ voucher.setOrderNumber(expenseOrder.getBillOrderNumber());
|
|
|
+ voucher.setId(expenseOrder.getId());
|
|
|
voucher.setStatus(BooleanEnum.TRUE.getValue());
|
|
|
updateList.add(voucher);
|
|
|
}
|
|
|
@@ -1257,6 +1318,9 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
public void exportExpenseOrderExcel(HttpServletResponse response, ExpenseBillPageReqVO pageReqVO) throws IOException {
|
|
|
List<ExpenseOrderDO> list = expenseOrderMapper.getExpenseBillPage(null, pageReqVO);
|
|
|
|
|
|
+ // 当前机构的「账单金额单项取整设置」,用于导出金额的小数位处理
|
|
|
+ String roundConfigValue = getAmountRoundConfigValue(TenantContextHolder.getTenantId());
|
|
|
+
|
|
|
Map<Long, Integer> elderCareTypeMap = new HashMap<>();
|
|
|
List<Long> elderIds = list.stream()
|
|
|
.map(ExpenseOrderDO::getElderId)
|
|
|
@@ -1340,10 +1404,11 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
setExpenseOrderType(expenseOrderItemDO, dictDataDOList);
|
|
|
|
|
|
if (identificationTypeMap.containsKey(expenseOrderItemDO.getType())) {
|
|
|
+ // 汇总时不做截断,最终统一按「账单金额单项取整设置」处理小数位
|
|
|
BigDecimal add = expenseOrderItemDO.getTotalAmount()
|
|
|
- .add(identificationTypeMap.get(expenseOrderItemDO.getType()))
|
|
|
- .setScale(2, RoundingMode.DOWN);
|
|
|
- identificationTypeMap.put(expenseOrderItemDO.getType(), add);
|
|
|
+ .add(identificationTypeMap.get(expenseOrderItemDO.getType()));
|
|
|
+ identificationTypeMap.put(expenseOrderItemDO.getType(), isAmountRoundConfigured(roundConfigValue)
|
|
|
+ ? add : add.setScale(2, RoundingMode.DOWN));
|
|
|
|
|
|
} else {
|
|
|
identificationTypeMap.put(expenseOrderItemDO.getType(), expenseOrderItemDO.getTotalAmount());
|
|
|
@@ -1352,7 +1417,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
|
|
|
for (DictDataDO dictDataDO : dictDataDOList) {
|
|
|
if (identificationTypeMap.containsKey(Integer.valueOf(dictDataDO.getValue()))) {
|
|
|
- row.add(identificationTypeMap.get(Integer.valueOf(dictDataDO.getValue())));
|
|
|
+ row.add(roundByConfig(identificationTypeMap.get(Integer.valueOf(dictDataDO.getValue())), roundConfigValue));
|
|
|
} else {
|
|
|
row.add(0);
|
|
|
}
|
|
|
@@ -1371,10 +1436,12 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
if(CollectionUtil.isNotEmpty(elderlyConsumerVouchersDOS)){
|
|
|
consumerVouchers = elderlyConsumerVouchersDOS.stream().map(ElderlyConsumerVouchersDO::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
}
|
|
|
- row.add(subsidyAmount);
|
|
|
- row.add(consumerVouchers);
|
|
|
- row.add(orderActualAmount.add(consumerVouchers).add(subsidyAmount));
|
|
|
- row.add(order.getInsuranceAmount().setScale(2, RoundingMode.DOWN));
|
|
|
+ row.add(roundByConfig(subsidyAmount, roundConfigValue));
|
|
|
+ row.add(roundByConfig(consumerVouchers, roundConfigValue));
|
|
|
+ row.add(roundByConfig(orderActualAmount.add(consumerVouchers).add(subsidyAmount), roundConfigValue));
|
|
|
+ row.add(isAmountRoundConfigured(roundConfigValue)
|
|
|
+ ? roundByConfig(order.getInsuranceAmount(), roundConfigValue)
|
|
|
+ : order.getInsuranceAmount().setScale(2, RoundingMode.DOWN));
|
|
|
|
|
|
List<ExpensePayOrderDO> expensePayOrderList = expensePayOrderMapper.selectList(new LambdaQueryWrapperX<ExpensePayOrderDO>()
|
|
|
.eq(ExpensePayOrderDO::getExpenseOrderId, order.getId()));
|
|
|
@@ -1385,7 +1452,10 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
if (CollectionUtil.isNotEmpty(expensePayOrderList)) {
|
|
|
for (ExpensePayOrderDO expensePayOrderDO : expensePayOrderList) {
|
|
|
if (expensePayOrderDO.getDiscountAmount() != null) {
|
|
|
- discountAmount = discountAmount.add(expensePayOrderDO.getDiscountAmount().setScale(2, RoundingMode.DOWN));
|
|
|
+ // 汇总时不做截断,最终统一按「账单金额单项取整设置」处理小数位
|
|
|
+ discountAmount = discountAmount.add(isAmountRoundConfigured(roundConfigValue)
|
|
|
+ ? expensePayOrderDO.getDiscountAmount()
|
|
|
+ : expensePayOrderDO.getDiscountAmount().setScale(2, RoundingMode.DOWN));
|
|
|
}
|
|
|
if (StringUtil.isNotEmptyORNull(expensePayOrderDO.getRemarks())) {
|
|
|
remark = remark + expensePayOrderDO.getRemarks() + ";";
|
|
|
@@ -1410,18 +1480,18 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
}
|
|
|
|
|
|
}
|
|
|
- row.add(discountAmount);
|
|
|
+ row.add(roundByConfig(discountAmount, roundConfigValue));
|
|
|
if (payTypeList.size() > 0) {
|
|
|
for (DictDataDO dictDataDO : billPayTypeList) {
|
|
|
if (payTypeMap.containsKey(dictDataDO.getValue())) {
|
|
|
- row.add(payTypeMap.get(dictDataDO.getValue()));
|
|
|
+ row.add(roundByConfig(payTypeMap.get(dictDataDO.getValue()), roundConfigValue));
|
|
|
} else {
|
|
|
row.add(BigDecimal.ZERO);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
- row.add(payAmount);
|
|
|
+ row.add(roundByConfig(payAmount, roundConfigValue));
|
|
|
}
|
|
|
row.add(remark);
|
|
|
data.add(row);
|
|
|
@@ -2438,19 +2508,6 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
actualEnd = LocalDate.parse(collect.get(0).getEndTime());
|
|
|
}
|
|
|
|
|
|
- List<ExpenseItemRespVO> dailyExpensesCollect = collectDailyExpenseItemsNoBill(elderId, billingMonth);
|
|
|
- List<ExpenseItemRespVO> subsidyCollect = collectSubsidyItems(elderId, billingMonth, actualStart, actualEnd, true);
|
|
|
- List<ExpenseItemRespVO> consumerVoucherCollect = collectConsumerVoucherItems(elderId, billingMonth, actualStart, actualEnd, true);
|
|
|
-
|
|
|
- // 4、优惠抵扣项:按实际区间折算金额 & 展示区间
|
|
|
- List<ExpenseItemRespVO> adjustedDiscountCollect = adjustDiscountByActualRange(elderId, billingMonth, actualStart, actualEnd);
|
|
|
-
|
|
|
- dataList.addAll(collect);
|
|
|
- dataList.addAll(dailyExpensesCollect);
|
|
|
- dataList.addAll(adjustedDiscountCollect);
|
|
|
- dataList.addAll(subsidyCollect);
|
|
|
- dataList.addAll(consumerVoucherCollect);
|
|
|
-
|
|
|
// 根据长者的入住类型确定账单类型
|
|
|
// inStatusType: 1=入住(长住), 2=试住, 3=短住
|
|
|
// type: 1=入院账单, 2=月度账单, 3=试住账单
|
|
|
@@ -2468,6 +2525,21 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
expenseOrder.setTenantId(elderlyInfo.getTenantId());
|
|
|
expenseOrderMapper.insert(expenseOrder);
|
|
|
|
|
|
+ List<ExpenseItemRespVO> dailyExpensesCollect = collectDailyExpenseItemsNoBill(elderId, billingMonth);
|
|
|
+ List<ExpenseItemRespVO> subsidyCollect = collectSubsidyItems(elderId, billingMonth, actualStart, actualEnd, true,expenseOrder);
|
|
|
+ List<ExpenseItemRespVO> consumerVoucherCollect = collectConsumerVoucherItems(elderId, billingMonth, actualStart, actualEnd, true,expenseOrder);
|
|
|
+
|
|
|
+ // 4、优惠抵扣项:按实际区间折算金额 & 展示区间
|
|
|
+ List<ExpenseItemRespVO> adjustedDiscountCollect = adjustDiscountByActualRange(elderId, billingMonth, actualStart, actualEnd);
|
|
|
+
|
|
|
+ dataList.addAll(collect);
|
|
|
+ dataList.addAll(dailyExpensesCollect);
|
|
|
+ dataList.addAll(adjustedDiscountCollect);
|
|
|
+ dataList.addAll(subsidyCollect);
|
|
|
+ dataList.addAll(consumerVoucherCollect);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
// 判断是否是当前月份
|
|
|
BigDecimal totalAmount = BigDecimal.ZERO;
|
|
|
// 生成账单费用项
|
|
|
@@ -2529,8 +2601,8 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
|
|
|
YearMonth attributionBillTime = YearMonth.parse(billingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
|
|
|
List<ExpenseItemRespVO> dataList = new ArrayList<>(collectDailyExpenseItemsNoBill(elderId, billingMonth));
|
|
|
- dataList.addAll(collectSubsidyItems(elderId, billingMonth, attributionBillTime.atDay(1), attributionBillTime.atEndOfMonth(), true));
|
|
|
- dataList.addAll(collectConsumerVoucherItems(elderId, billingMonth, attributionBillTime.atDay(1), attributionBillTime.atEndOfMonth(), true));
|
|
|
+ dataList.addAll(collectSubsidyItems(elderId, billingMonth, attributionBillTime.atDay(1), attributionBillTime.atEndOfMonth(), true,expenseOrder));
|
|
|
+ dataList.addAll(collectConsumerVoucherItems(elderId, billingMonth, attributionBillTime.atDay(1), attributionBillTime.atEndOfMonth(), true,expenseOrder));
|
|
|
dataList.addAll(calculateDiscountDeduction(elderId, billingMonth));
|
|
|
|
|
|
BigDecimal amount = BigDecimal.ZERO;
|