Explorar o código

feat(statistics): 新增店铺资金变动分页查询功能- 在IStatisticsService接口中添加selectFundChanges方法定义
- 在StatisticsController中新增selectFundChanges接口,支持分页及多条件查询- 在StatisticsMapper中增加对应方法及XML SQL实现
- 实现资金变动记录的复杂查询逻辑,包括收入支出类型、变动原因等筛选
- 优化SQL查询性能,使用ROW_NUMBER去重并按时间排序- 支持动态条件过滤,提高查询灵活性

SheepHy hai 1 semana
pai
achega
5ac507f94f

+ 18 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/controller/StatisticsController.java

@@ -101,4 +101,22 @@ public class StatisticsController {
     public Result<List<Map<String, Object>>> findShopAccountOverviewDept(){
         return Result.ok(statisticsService.findShopAccountOverviewDept());
     }
+
+    /**
+     * <p>分页查询店铺资金总览-门店</p>
+     * @author SheepHy
+     * @param 参数描述,参数为类则包含{@link Object}
+     * @return 返回值描述,如无返回值则为void 返回值为类则包含{@link object}
+     *
+     */
+    @GetMapping("/selectFundChanges")
+    @Operation(summary = "分页查询店铺资金总览-门店")
+    public Result<List<Map<String, Object>>> selectFundChanges(@RequestParam(name="pageNo",required=false) Integer pageNo,
+                                                               @RequestParam(name="pageSize",required=false) Integer pageSize,
+                                                               @RequestParam(name="incomeExpenseType",required=false)String incomeExpenseType,
+                                                               @RequestParam(name="changeReason",required=false)String changeReason,
+                                                               @RequestParam(name="amountType",required=false)String amountType){
+        Page<Map<String, Object>> page = new Page<>(pageNo, pageSize);
+        return Result.ok(statisticsService.selectFundChanges(page,incomeExpenseType,changeReason,amountType));
+    }
 }

+ 14 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/StatisticsMapper.java

@@ -62,5 +62,18 @@ public interface StatisticsMapper {
      * @return 返回值描述,如无返回值则为void 返回值为类则包含{@link object}
      *
      */
-    List<Map<String, Object>> findShopAccountOverviewDept(@Param("orgCode")String name);
+    List<Map<String, Object>> findShopAccountOverviewDept(@Param("orgCode")String orgCode);
+
+    /**
+     * <p>分页查询店铺资金总览-门店</p>
+     * @author SheepHy
+     * @param 参数描述,参数为类则包含{@link Object}
+     * @return 返回值描述,如无返回值则为void 返回值为类则包含{@link object}
+     *
+     */
+    List<Map<String, Object>> selectFundChanges(@Param("page")Page<Map<String, Object>> page,
+                                                @Param("orgCode")String orgCode,
+                                                @Param("incomeExpenseType")String incomeExpenseType,
+                                                @Param("changeReason")String changeReason,
+                                                @Param("amountType")String amountType);
 }

+ 98 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/StatisticsMapper.xml

@@ -259,7 +259,7 @@
             a.id,
             a.name,
             a.cover,
-            COALESCE(settled.to_be_settled, 0) AS to_be_settled,
+            COALESCE(settled.toBeSettled, 0) AS to_be_settled,
             COALESCE(settled.received, 0) AS received,
             settled.update_time AS updateTime
         FROM nm_site a
@@ -299,4 +299,101 @@
         ) settled ON a.org_code = settled.org_code
         WHERE a.org_code = #{orgCode}
     </select>
+
+    <select id="selectFundChanges" resultType="map">
+        WITH RankedData AS (
+        SELECT
+        b.id,
+        CASE
+        WHEN a.order_status IN (0, 1, 2) THEN '收入'
+        WHEN a.order_status IN (3, 5, 6) THEN '支出'
+        ELSE '其他'
+        END AS income_expense_type,
+        CASE
+        WHEN b.order_id IS NULL THEN '待结算'
+        WHEN c.profit_sharing_status = 0 THEN '待结算'
+        WHEN c.profit_sharing_status = 1 THEN '已到账'
+        ELSE '其他'
+        END AS amount_type,
+        CASE
+        WHEN a.order_status IN (5, 6) THEN '用户退款'
+        WHEN a.order_status IN (0, 1, 2) THEN '用户支付'
+        WHEN c.profit_sharing_status = 0 THEN '分账'
+        WHEN c.profit_sharing_status = 1 THEN '银行卡到账'
+        ELSE '其他原因'
+        END AS change_reason,
+        CASE
+        WHEN b.id IS NOT NULL THEN b.cumulative - b.pre_amount
+        WHEN b.order_id IS NULL THEN a.price
+        ELSE 0
+        END AS amount_before,
+        CASE
+        WHEN b.id IS NOT NULL THEN b.cumulative + b.pre_amount
+        ELSE 0
+        END AS amount_after,
+        CASE
+        WHEN b.id IS NOT NULL THEN b.pre_amount
+        WHEN b.order_id IS NULL THEN a.price
+        ELSE 0
+        END AS change_amount,
+        a.create_time,
+        ROW_NUMBER() OVER (
+        PARTITION BY
+        COALESCE(b.id, a.order_id)
+        ORDER BY
+        CASE WHEN b.id IS NULL THEN 1 ELSE 0 END,
+        b.id DESC,
+        a.order_id
+        ) as rn
+        FROM nm_order_pro_info a
+        LEFT JOIN nm_profit_sharing_info b ON a.order_id = b.order_id
+        LEFT JOIN nm_order c ON a.order_id = c.id
+        WHERE a.price > 0
+        AND a.type NOT IN (3, 4, 6)
+        AND c.org_code = #{orgCode}
+        <!-- 动态条件 -->
+        <if test="incomeExpenseType != null and incomeExpenseType != '' and incomeExpenseType != '全部'">
+            AND (
+            CASE
+            WHEN a.order_status IN (0, 1, 2) THEN '收入'
+            WHEN a.order_status IN (3, 5, 6) THEN '支出'
+            ELSE '其他'
+            END
+            ) = #{incomeExpenseType}
+        </if>
+        <if test="amountType != null and amountType != '' and amountType != '全部'">
+            AND (
+            CASE
+            WHEN b.order_id IS NULL THEN '待结算'
+            WHEN c.profit_sharing_status = 0 THEN '待结算'
+            WHEN c.profit_sharing_status = 1 THEN '已到账'
+            ELSE '其他'
+            END
+            ) = #{amountType}
+        </if>
+        <if test="changeReason != null and changeReason != '' and changeReason != '全部'">
+            AND (
+            CASE
+            WHEN a.order_status IN (5, 6) THEN '用户退款'
+            WHEN a.order_status IN (0, 1, 2) THEN '用户支付'
+            WHEN c.profit_sharing_status = 0 THEN '分账'
+            WHEN c.profit_sharing_status = 1 THEN '银行卡到账'
+            ELSE '其他原因'
+            END
+            ) = #{changeReason}
+        </if>
+        )
+        SELECT
+        id,
+        income_expense_type,
+        amount_type,
+        change_reason,
+        amount_before,
+        amount_after,
+        change_amount,
+        create_time
+        FROM RankedData
+        WHERE rn = 1
+        ORDER BY create_time DESC
+    </select>
 </mapper>

+ 13 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IStatisticsService.java

@@ -1,6 +1,7 @@
 package org.jeecg.modules.system.app.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -60,4 +61,16 @@ public interface IStatisticsService {
      */
     List<Map<String, Object>> findShopAccountOverviewDept();
 
+    /**
+     * <p>分页查询店铺资金总览-门店</p>
+     * @author SheepHy
+     * @param 参数描述,参数为类则包含{@link Object}
+     * @return 返回值描述,如无返回值则为void 返回值为类则包含{@link object}
+     *
+     */
+    List<Map<String, Object>> selectFundChanges(Page<Map<String, Object>> page,
+                                                String incomeExpenseType,
+                                                String changeReason,
+                                                String amountType);
+
 }

+ 6 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/StatisticsServiceImpl.java

@@ -51,4 +51,10 @@ public class StatisticsServiceImpl implements IStatisticsService {
         LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         return statisticsMapper.findShopAccountOverviewDept(loginUser.getOrgCode());
     }
+
+    @Override
+    public List<Map<String, Object>> selectFundChanges(Page<Map<String, Object>> page, String incomeExpenseType, String changeReason, String amountType) {
+        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        return statisticsMapper.selectFundChanges(page,loginUser.getOrgCode(), incomeExpenseType, changeReason, amountType );
+    }
 }