Ver código fonte

修改
1、账单导出列能够通过收费项目中的关联标识配置决定该项目统计到哪一列

liangwenxuan 15 horas atrás
pai
commit
202ba333bc

+ 10 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/biz/ExpenseOrderItemMapper.java

@@ -19,6 +19,16 @@ public interface ExpenseOrderItemMapper extends BaseMapperX<ExpenseOrderItemDO>
 
 
     List<ExpenseOrderItemDO> selectListByOrderId(@Param("orderId") Long orderId,@Param("tenantId") Long tenantId);
+
+    /**
+     * 通过来源类型与来源项 ID 一次性 JOIN 查询费用标识(identification)
+     *
+     * @param expenseSource       费用来源 {@code expense_item} 或 {@code daily_expenses}
+     * @param sourceExpenseItemId 来源项主键
+     * @return sys_charge_category.identification,未找到返回 null
+     */
+    String selectIdentificationBySourceAndItemId(@Param("expenseSource") String expenseSource,
+                                                  @Param("sourceExpenseItemId") Long sourceExpenseItemId);
 //    default PageResult<ExpenseBillItemDO> selectPage(ExpenseBillItemPageReqVO reqVO) {
 //        return selectPage(reqVO, new LambdaQueryWrapperX<ExpenseBillItemDO>()
 //                .eqIfPresent(ExpenseBillItemDO::getExpenseBillId, reqVO.getExpenseBillId())

+ 43 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java

@@ -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;
         }
     }
 

+ 27 - 0
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ExpenseOrderItemMapper.xml

@@ -18,6 +18,8 @@
             ede.item_name,
             eeoi.item_category_name,
             eeoi.total_amount,
+            eeoi.source_expense_item_id,
+            eeoi.expense_source,
             scc.identification AS type
         FROM
             `elderly_expense_order_item` eeoi
@@ -34,6 +36,8 @@
             eei.item_name,
             eeoi.item_category_name,
             eeoi.total_amount,
+            eeoi.source_expense_item_id,
+            eeoi.expense_source,
             eei.type
         FROM
             `elderly_expense_order_item` eeoi
@@ -51,4 +55,27 @@
         LEFT JOIN elderly_expense_item ei ON oi.source_expense_item_id = ei.id
         WHERE oi.expense_order_id = #{orderId} AND oi.tenant_id = #{tenantId}
     </select>
+
+    <select id="selectIdentificationBySourceAndItemId" resultType="java.lang.String">
+        <choose>
+            <when test='expenseSource == "expense_item"'>
+                SELECT scc.identification
+                FROM elderly_expense_item eei
+                INNER JOIN sys_overhead_charge soc ON eei.item_id = soc.id
+                INNER JOIN sys_charge_category scc ON soc.superiors_id = scc.id
+                WHERE eei.id = #{sourceExpenseItemId}
+                  AND scc.identification IS NOT NULL
+                LIMIT 1
+            </when>
+            <when test='expenseSource == "daily_expenses"'>
+                SELECT scc.identification
+                FROM elderly_daily_expenses ede
+                INNER JOIN sys_overhead_charge soc ON ede.item_id = soc.id
+                INNER JOIN sys_charge_category scc ON soc.superiors_id = scc.id
+                WHERE ede.id = #{sourceExpenseItemId}
+                  AND scc.identification IS NOT NULL
+                LIMIT 1
+            </when>
+        </choose>
+    </select>
 </mapper>