|
|
@@ -136,6 +136,8 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
@Resource
|
|
|
private SysOverheadChargeMapper sysOverheadChargeMapper;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private SysChargeCategoryMapper sysChargeCategoryMapper;
|
|
|
|
|
|
@Resource
|
|
|
private ElderlyContractMapper elderlyContractMapper;
|
|
|
@@ -3665,6 +3667,47 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
matchedType = inferIdentificationTypeByText(itemCategoryName, identificationTypeDictList);
|
|
|
if (matchedType != null) {
|
|
|
expenseOrderItemDO.setType(matchedType);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 关键词匹配均未命中时,通过数据库链路回退查询 identification
|
|
|
+ Integer fallbackType = resolveIdentificationFromDb(expenseOrderItemDO);
|
|
|
+ if (fallbackType != null) {
|
|
|
+ expenseOrderItemDO.setType(fallbackType);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过数据库链路回退查询费用标识类型。
|
|
|
+ *
|
|
|
+ * <p>当关键词匹配无法推断 type 时,根据 {@code expenseSource} 决定查询链路:
|
|
|
+ * <ul>
|
|
|
+ * <li>{@code expense_item}:sourceExpenseItemId → elderly_expense_item.item_id
|
|
|
+ * → sys_overhead_charge.superiors_id → sys_charge_category.identification</li>
|
|
|
+ * <li>{@code daily_expenses}:sourceExpenseItemId → elderly_daily_expenses.item_id
|
|
|
+ * → sys_overhead_charge.superiors_id → sys_charge_category.identification</li>
|
|
|
+ * </ul>
|
|
|
+ *
|
|
|
+ * @param expenseOrderItemDO 账单明细
|
|
|
+ * @return 费用标识类型,查询失败返回 null
|
|
|
+ */
|
|
|
+ private Integer resolveIdentificationFromDb(ExpenseOrderItemDO expenseOrderItemDO) {
|
|
|
+ Long sourceExpenseItemId = expenseOrderItemDO.getSourceExpenseItemId();
|
|
|
+ String expenseSource = expenseOrderItemDO.getExpenseSource();
|
|
|
+ if (sourceExpenseItemId == null || StringUtils.isBlank(expenseSource)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 一次性 JOIN 查询:source → overhead_charge → charge_category → identification
|
|
|
+ String identification = expenseOrderItemMapper.selectIdentificationBySourceAndItemId(expenseSource, sourceExpenseItemId);
|
|
|
+ if (StringUtils.isBlank(identification)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ return Integer.valueOf(identification);
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ return null;
|
|
|
}
|
|
|
}
|
|
|
|