Переглянути джерело

新增
1、账单导出增加供养类型列
BUGFIX
1、解决账单导出中的消费券和长护险金额取反问题
2、解决获取月度账单明细存在变更时,变更字段取值错误导致输出明细有误的问题

liangwenxuan 1 тиждень тому
батько
коміт
bb7d5821f3

+ 33 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java

@@ -1232,11 +1232,25 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
     public void exportExpenseOrderExcel(HttpServletResponse response, ExpenseBillPageReqVO pageReqVO) throws IOException {
         List<ExpenseOrderDO> list = expenseOrderMapper.getExpenseBillPage(null, pageReqVO);
 
+        Map<Long, Integer> elderCareTypeMap = new HashMap<>();
+        List<Long> elderIds = list.stream()
+                .map(ExpenseOrderDO::getElderId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+        if (CollectionUtil.isNotEmpty(elderIds)) {
+            elderlyInfoMapper.selectList(new LambdaQueryWrapperX<ElderlyInfoDO>()
+                            .select(ElderlyInfoDO::getId, ElderlyInfoDO::getCareType)
+                            .in(ElderlyInfoDO::getId, elderIds))
+                    .forEach(elder -> elderCareTypeMap.put(elder.getId(), elder.getCareType()));
+        }
+
         List<List<String>> head = new ArrayList<>();
         List<List<Object>> data = new ArrayList<>();
 
         head.add(Arrays.asList("长者姓名"));
         head.add(Arrays.asList("床位号"));
+        head.add(Arrays.asList("供养类型"));
         head.add(Arrays.asList("账单月"));
         head.add(Arrays.asList("推送状态"));
         head.add(Arrays.asList("支付状态"));
@@ -1273,6 +1287,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
             List<Object> row = new ArrayList<>();
             row.add(order.getElderName());
             row.add(buildService.getFullBedName(order.getElderId()));
+            row.add(formatCareType(elderCareTypeMap.get(order.getElderId())));
             row.add(order.getBillingMonth());
 
             if (order.getPushStatus() == 0) {
@@ -1324,12 +1339,12 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
                     .eq(ExpenseSubsidyDO::getStatus, 1));
             BigDecimal subsidyAmount = BigDecimal.ZERO;
             if(CollectionUtil.isNotEmpty(expenseSubsidyDOS)){
-                subsidyAmount = expenseSubsidyDOS.stream().map(e -> e.getAmount().negate()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                subsidyAmount = expenseSubsidyDOS.stream().map(ExpenseSubsidyDO::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
             }
             List<ElderlyConsumerVouchersDO> elderlyConsumerVouchersDOS = elderlyConsumerVouchersMapper.selectList(new LambdaQueryWrapperX<ElderlyConsumerVouchersDO>().eq(ElderlyConsumerVouchersDO::getOrderId, order.getId()));
             BigDecimal consumerVouchers = BigDecimal.ZERO;
             if(CollectionUtil.isNotEmpty(elderlyConsumerVouchersDOS)){
-                consumerVouchers = elderlyConsumerVouchersDOS.stream().map(e -> e.getAmount().negate()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                consumerVouchers = elderlyConsumerVouchersDOS.stream().map(ElderlyConsumerVouchersDO::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
             }
             row.add(subsidyAmount);
             row.add(consumerVouchers);
@@ -1409,6 +1424,22 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
 
     }
 
+    private static String formatCareType(Integer careType) {
+        if (careType == null) {
+            return null;
+        }
+        switch (careType) {
+            case 1:
+                return "供养";
+            case 2:
+                return "寄养";
+            case 3:
+                return "托养";
+            default:
+                return null;
+        }
+    }
+
     @Override
     public PageResult<ExpenseOrderDO> getExpenseOrderPageByElderId(ExpenseBillPageReqVO pageReqVO) {
         PageResult<ExpenseOrderDO> pageResult = expenseOrderMapper.selectPage(pageReqVO);

+ 227 - 195
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ExpenseItemMapper.xml

@@ -30,7 +30,8 @@
     </select>
     <!-- 月度账单生成查询 -->
     <select id="generateMonthlyBill" resultType="cn.iocoder.yudao.module.system.dal.dataobject.biz.ExpenseItemDO">
-        SELECT
+        <![CDATA[
+    SELECT
         expense_data.id,
         expense_data.expenseId,
         expense_data.itemId,
@@ -61,205 +62,236 @@
         expense_data.createTime,
         expense_data.billAmount,
         expense_data.isDayCalculate
-        FROM (
+    FROM (
         SELECT
-        eei.id,
-        eei.expense_id AS expenseId,
-        CASE
-        WHEN DATE_FORMAT(eei.change_start_date, '%Y-%m') = #{billingMonth}
-        THEN COALESCE(
-        (
-        SELECT ecr.overhead_charge_id
-        FROM elderly_change_record ecr
-        WHERE ecr.elderly_id = ee.elder_id
-        AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
-        AND ecr.deleted = 0
-        LIMIT 1
-        ),
-        (
-        SELECT epcr.original_id
-        FROM elderly_change_record ecr
-        INNER JOIN elderly_price_change_record epcr ON ecr.id = epcr.change_id
-        WHERE ecr.elderly_id = ee.elder_id
-        AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
-        AND ecr.deleted = 0
-        AND epcr.deleted = 0
-        LIMIT 1
-        ),
-        eei.item_id
-        )
-        ELSE eei.item_id
-        END AS itemId,
-        eei.item_category_id AS itemCategoryId,
-        CASE
-        WHEN DATE_FORMAT(eei.change_start_date, '%Y-%m') = #{billingMonth}
-        THEN COALESCE(
-        (
-        SELECT ecr.category_name
-        FROM elderly_change_record ecr
-        WHERE ecr.elderly_id = ee.elder_id
-        AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
-        AND ecr.deleted = 0
-        LIMIT 1
-        ),
-        (
-        SELECT epcr.category_name
-        FROM elderly_change_record ecr
-        INNER JOIN elderly_price_change_record epcr ON ecr.id = epcr.change_id
-        WHERE ecr.elderly_id = ee.elder_id
-        AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
-        AND ecr.deleted = 0
-        AND epcr.deleted = 0
-        LIMIT 1
-        ),
-        eei.item_category_name
-        )
-        ELSE eei.item_category_name
-        END AS itemCategoryName,
-        CASE
-        WHEN DATE_FORMAT(eei.change_start_date, '%Y-%m') = #{billingMonth}
-        THEN COALESCE(
-        (
-        SELECT ecr.original_name
-        FROM elderly_change_record ecr
-        WHERE ecr.elderly_id = ee.elder_id
-        AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
-        AND ecr.deleted = 0
-        LIMIT 1
-        ),
-        (
-        SELECT epcr.original_name
-        FROM elderly_change_record ecr
-        INNER JOIN elderly_price_change_record epcr ON ecr.id = epcr.change_id
-        WHERE ecr.elderly_id = ee.elder_id
-        AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
-        AND ecr.deleted = 0
-        AND epcr.deleted = 0
-        LIMIT 1
-        ),
-        eei.item_name
-        )
-        ELSE eei.item_name
-        END AS itemName,
-        eei.is_discount AS isDiscount,
-        eei.discount,
-        eei.is_monthly_expense AS isMonthlyExpense,
-        eei.is_one_time_fee AS isOneTimeFee,
-        eei.is_deposit AS isDeposit,
-        eei.is_free_gift AS isFreeGift,
-        eei.free_start_time AS freeStartTime,
-        eei.free_end_time AS freeEndTime,
-        eei.is_hire_purchase AS isHirePurchase,
-        eei.hire_purchase_number AS hirePurchaseNumber,
-        eei.hire_purchase_amount AS hirePurchaseAmount,
-        eei.count,
-        eei.type,
-        eei.discount_amount AS discountAmount,
-        eei.tenant_id AS tenantId,
-        eei.change_start_date AS changeStartDate,
-        eei.change_end_date AS changeEndDate,
-        eei.change_flag AS changeFlag,
-        eei.create_time AS createTime,
-        eei.is_day_calculate AS isDayCalculate,
-        CASE
-        WHEN DATE_FORMAT(eei.change_start_date, '%Y-%m') = #{billingMonth}
-        THEN COALESCE(
-        (
-        SELECT pcr.original_amount
-        FROM elderly_price_change_record pcr
-        INNER JOIN elderly_change_record ecr ON pcr.change_id = ecr.id
-        WHERE pcr.original_id = eei.item_id
-        AND ecr.elderly_id = ee.elder_id
-        AND pcr.deleted = 0
-        AND ecr.deleted = 0
-        AND ecr.change_date = STR_TO_DATE(CONCAT(#{billingMonth}, '-01'), '%Y-%m-%d')
-        LIMIT 1
-        ),
-        (
-        SELECT pcr.original_amount
-        FROM elderly_price_change_record pcr
-        INNER JOIN elderly_change_record ecr ON pcr.change_id = ecr.id
-        WHERE pcr.original_id = eei.item_id
-        AND ecr.elderly_id = ee.elder_id
-        AND pcr.deleted = 0
-        AND ecr.deleted = 0
-        ORDER BY ecr.change_date DESC
-        LIMIT 1
-        ),
-        (
-        SELECT original_amount
-        FROM elderly_change_record ecr
-        WHERE ecr.elderly_id = ee.elder_id
-        AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
-        AND ecr.deleted = 0
-        AND ecr.change_date = STR_TO_DATE(CONCAT(#{billingMonth}, '-01'), '%Y-%m-%d')
-        ORDER BY ecr.change_date DESC
-        LIMIT 1
-        ),
-        (
-        SELECT original_amount
-        FROM elderly_change_record ecr
-        WHERE ecr.elderly_id = ee.elder_id
-        AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
-        AND ecr.deleted = 0
-        ORDER BY ecr.change_date DESC
-        LIMIT 1
-        ),
-        eei.actual_amount
-        )
-        ELSE eei.actual_amount
-        END AS billAmount
+            eei.id,
+            eei.expense_id AS expenseId,
+            -- 判断依据:账单月内是否有针对此费用项的变更记录(基于 change_date)
+            CASE
+                WHEN EXISTS (
+                    SELECT 1
+                    FROM elderly_change_record ecr
+                    WHERE ecr.elderly_id = ee.elder_id
+                      AND (ecr.expect_overhead_charge_id = eei.item_id OR ecr.overhead_charge_id = eei.item_id)
+                      AND DATE_FORMAT(ecr.change_date, '%Y-%m') = #{billingMonth}
+                      AND ecr.deleted = 0
+                )
+                THEN COALESCE(
+                    (
+                        SELECT ecr.overhead_charge_id
+                        FROM elderly_change_record ecr
+                        WHERE ecr.elderly_id = ee.elder_id
+                          AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
+                          AND ecr.deleted = 0
+                        LIMIT 1
+                    ),
+                    (
+                        SELECT epcr.original_id
+                        FROM elderly_change_record ecr
+                        INNER JOIN elderly_price_change_record epcr ON ecr.id = epcr.change_id
+                        WHERE ecr.elderly_id = ee.elder_id
+                          AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
+                          AND ecr.deleted = 0
+                          AND epcr.deleted = 0
+                        LIMIT 1
+                    ),
+                    eei.item_id
+                )
+                ELSE eei.item_id
+            END AS itemId,
+            eei.item_category_id AS itemCategoryId,
+            CASE
+                WHEN EXISTS (
+                    SELECT 1
+                    FROM elderly_change_record ecr
+                    WHERE ecr.elderly_id = ee.elder_id
+                      AND (ecr.expect_overhead_charge_id = eei.item_id OR ecr.overhead_charge_id = eei.item_id)
+                      AND DATE_FORMAT(ecr.change_date, '%Y-%m') = #{billingMonth}
+                      AND ecr.deleted = 0
+                )
+                THEN COALESCE(
+                    (
+                        SELECT ecr.category_name
+                        FROM elderly_change_record ecr
+                        WHERE ecr.elderly_id = ee.elder_id
+                          AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
+                          AND ecr.deleted = 0
+                        LIMIT 1
+                    ),
+                    (
+                        SELECT epcr.category_name
+                        FROM elderly_change_record ecr
+                        INNER JOIN elderly_price_change_record epcr ON ecr.id = epcr.change_id
+                        WHERE ecr.elderly_id = ee.elder_id
+                          AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
+                          AND ecr.deleted = 0
+                          AND epcr.deleted = 0
+                        LIMIT 1
+                    ),
+                    eei.item_category_name
+                )
+                ELSE eei.item_category_name
+            END AS itemCategoryName,
+            CASE
+                WHEN EXISTS (
+                    SELECT 1
+                    FROM elderly_change_record ecr
+                    WHERE ecr.elderly_id = ee.elder_id
+                      AND (ecr.expect_overhead_charge_id = eei.item_id OR ecr.overhead_charge_id = eei.item_id)
+                      AND DATE_FORMAT(ecr.change_date, '%Y-%m') = #{billingMonth}
+                      AND ecr.deleted = 0
+                )
+                THEN COALESCE(
+                    (
+                        SELECT ecr.original_name
+                        FROM elderly_change_record ecr
+                        WHERE ecr.elderly_id = ee.elder_id
+                          AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
+                          AND ecr.deleted = 0
+                        LIMIT 1
+                    ),
+                    (
+                        SELECT epcr.original_name
+                        FROM elderly_change_record ecr
+                        INNER JOIN elderly_price_change_record epcr ON ecr.id = epcr.change_id
+                        WHERE ecr.elderly_id = ee.elder_id
+                          AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
+                          AND ecr.deleted = 0
+                          AND epcr.deleted = 0
+                        LIMIT 1
+                    ),
+                    eei.item_name
+                )
+                ELSE eei.item_name
+            END AS itemName,
+            eei.is_discount AS isDiscount,
+            eei.discount,
+            eei.is_monthly_expense AS isMonthlyExpense,
+            eei.is_one_time_fee AS isOneTimeFee,
+            eei.is_deposit AS isDeposit,
+            eei.is_free_gift AS isFreeGift,
+            eei.free_start_time AS freeStartTime,
+            eei.free_end_time AS freeEndTime,
+            eei.is_hire_purchase AS isHirePurchase,
+            eei.hire_purchase_number AS hirePurchaseNumber,
+            eei.hire_purchase_amount AS hirePurchaseAmount,
+            eei.count,
+            eei.type,
+            eei.discount_amount AS discountAmount,
+            eei.tenant_id AS tenantId,
+            eei.change_start_date AS changeStartDate,
+            eei.change_end_date AS changeEndDate,
+            eei.change_flag AS changeFlag,
+            eei.create_time AS createTime,
+            eei.is_day_calculate AS isDayCalculate,
+            -- billAmount 修正(同样基于实际变更日期)
+            CASE
+                WHEN EXISTS (
+                    SELECT 1
+                    FROM elderly_change_record ecr
+                    WHERE ecr.elderly_id = ee.elder_id
+                      AND (ecr.expect_overhead_charge_id = eei.item_id OR ecr.overhead_charge_id = eei.item_id)
+                      AND DATE_FORMAT(ecr.change_date, '%Y-%m') = #{billingMonth}
+                      AND ecr.deleted = 0
+                )
+                THEN COALESCE(
+                    (
+                        SELECT pcr.original_amount
+                        FROM elderly_price_change_record pcr
+                        INNER JOIN elderly_change_record ecr ON pcr.change_id = ecr.id
+                        WHERE pcr.original_id = eei.item_id
+                          AND ecr.elderly_id = ee.elder_id
+                          AND pcr.deleted = 0
+                          AND ecr.deleted = 0
+                          AND ecr.change_date = STR_TO_DATE(CONCAT(#{billingMonth}, '-01'), '%Y-%m-%d')
+                        LIMIT 1
+                    ),
+                    (
+                        SELECT pcr.original_amount
+                        FROM elderly_price_change_record pcr
+                        INNER JOIN elderly_change_record ecr ON pcr.change_id = ecr.id
+                        WHERE pcr.original_id = eei.item_id
+                          AND ecr.elderly_id = ee.elder_id
+                          AND pcr.deleted = 0
+                          AND ecr.deleted = 0
+                        ORDER BY ecr.change_date DESC
+                        LIMIT 1
+                    ),
+                    (
+                        SELECT original_amount
+                        FROM elderly_change_record ecr
+                        WHERE ecr.elderly_id = ee.elder_id
+                          AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
+                          AND ecr.deleted = 0
+                          AND ecr.change_date = STR_TO_DATE(CONCAT(#{billingMonth}, '-01'), '%Y-%m-%d')
+                        ORDER BY ecr.change_date DESC
+                        LIMIT 1
+                    ),
+                    (
+                        SELECT original_amount
+                        FROM elderly_change_record ecr
+                        WHERE ecr.elderly_id = ee.elder_id
+                          AND (ecr.overhead_charge_id = eei.item_id OR ecr.expect_overhead_charge_id = eei.item_id)
+                          AND ecr.deleted = 0
+                        ORDER BY ecr.change_date DESC
+                        LIMIT 1
+                    ),
+                    eei.actual_amount
+                )
+                ELSE eei.actual_amount
+            END AS billAmount
         FROM elderly_expense_item eei
         INNER JOIN elderly_expense ee ON eei.expense_id = ee.id
         INNER JOIN (
-        SELECT
-        eei2.item_id,
-        MAX(eei2.create_time) AS max_create_time
-        FROM elderly_expense_item eei2
-        INNER JOIN elderly_expense ee2 ON eei2.expense_id = ee2.id
-        WHERE eei2.is_monthly_expense = 1
-        AND ee2.elder_id = #{elderId}
-        AND (
-        (DATE_FORMAT(eei2.change_start_date, '%Y-%m') <![CDATA[ <= ]]> #{billingMonth}
-        AND DATE_FORMAT(eei2.change_end_date, '%Y-%m') <![CDATA[ >= ]]> #{billingMonth})
-        OR (DATE_FORMAT(eei2.change_start_date, '%Y-%m') <![CDATA[ <= ]]> #{billingMonth}
-        AND eei2.change_end_date IS NULL)
-        )
-        AND NOT (
-        DATE_FORMAT(eei2.change_start_date, '%Y-%m') = #{billingMonth}
-        AND eei2.change_start_date > STR_TO_DATE(CONCAT(#{billingMonth}, '-01'), '%Y-%m-%d')
-        AND EXISTS (
-        SELECT 1
-        FROM elderly_change_record ecr
-        WHERE ecr.elderly_id = ee2.elder_id
-        AND ecr.expect_overhead_charge_id = eei2.item_id
-        AND DATE_FORMAT(ecr.change_date, '%Y-%m') = #{billingMonth}
-        AND ecr.deleted = 0
-        )
-        )
-        GROUP BY eei2.item_id
+            SELECT
+                eei2.item_id,
+                MAX(eei2.create_time) AS max_create_time
+            FROM elderly_expense_item eei2
+            INNER JOIN elderly_expense ee2 ON eei2.expense_id = ee2.id
+            WHERE eei2.is_monthly_expense = 1
+              AND ee2.elder_id = #{elderId}
+              AND (
+                  (DATE_FORMAT(eei2.change_start_date, '%Y-%m') <= #{billingMonth}
+                   AND DATE_FORMAT(eei2.change_end_date, '%Y-%m') >= #{billingMonth})
+                  OR (DATE_FORMAT(eei2.change_start_date, '%Y-%m') <= #{billingMonth}
+                      AND eei2.change_end_date IS NULL)
+              )
+              AND NOT (
+                  DATE_FORMAT(eei2.change_start_date, '%Y-%m') = #{billingMonth}
+                  AND eei2.change_start_date > STR_TO_DATE(CONCAT(#{billingMonth}, '-01'), '%Y-%m-%d')
+                  AND EXISTS (
+                      SELECT 1
+                      FROM elderly_change_record ecr
+                      WHERE ecr.elderly_id = ee2.elder_id
+                        AND ecr.expect_overhead_charge_id = eei2.item_id
+                        AND DATE_FORMAT(ecr.change_date, '%Y-%m') = #{billingMonth}
+                        AND ecr.deleted = 0
+                  )
+              )
+            GROUP BY eei2.item_id
         ) latest ON eei.item_id = latest.item_id AND eei.create_time = latest.max_create_time
         WHERE eei.is_monthly_expense = 1
-        AND ee.elder_id = #{elderId}
-        AND (
-        (DATE_FORMAT(eei.change_start_date, '%Y-%m') <![CDATA[ <= ]]> #{billingMonth}
-        AND DATE_FORMAT(eei.change_end_date, '%Y-%m') <![CDATA[ >= ]]> #{billingMonth})
-        OR (DATE_FORMAT(eei.change_start_date, '%Y-%m') <![CDATA[ <= ]]> #{billingMonth}
-        AND eei.change_end_date IS NULL)
-        )
-        AND NOT (
-        DATE_FORMAT(eei.change_start_date, '%Y-%m') = #{billingMonth}
-        AND eei.change_start_date > STR_TO_DATE(CONCAT(#{billingMonth}, '-01'), '%Y-%m-%d')
-        AND EXISTS (
-        SELECT 1
-        FROM elderly_change_record ecr
-        WHERE ecr.elderly_id = ee.elder_id
-        AND ecr.expect_overhead_charge_id = eei.item_id
-        AND DATE_FORMAT(ecr.change_date, '%Y-%m') = #{billingMonth}
-        AND ecr.deleted = 0
-        )
-        )
-        ) expense_data
-        LEFT JOIN sys_overhead_charge soc ON soc.id = expense_data.itemId
+          AND ee.elder_id = #{elderId}
+          AND (
+              (DATE_FORMAT(eei.change_start_date, '%Y-%m') <= #{billingMonth}
+               AND DATE_FORMAT(eei.change_end_date, '%Y-%m') >= #{billingMonth})
+              OR (DATE_FORMAT(eei.change_start_date, '%Y-%m') <= #{billingMonth}
+                  AND eei.change_end_date IS NULL)
+          )
+          AND NOT (
+              DATE_FORMAT(eei.change_start_date, '%Y-%m') = #{billingMonth}
+              AND eei.change_start_date > STR_TO_DATE(CONCAT(#{billingMonth}, '-01'), '%Y-%m-%d')
+              AND EXISTS (
+                  SELECT 1
+                  FROM elderly_change_record ecr
+                  WHERE ecr.elderly_id = ee.elder_id
+                    AND ecr.expect_overhead_charge_id = eei.item_id
+                    AND DATE_FORMAT(ecr.change_date, '%Y-%m') = #{billingMonth}
+                    AND ecr.deleted = 0
+              )
+          )
+    ) expense_data
+    LEFT JOIN sys_overhead_charge soc ON soc.id = expense_data.itemId
+    ]]>
     </select>
 </mapper>