|
|
@@ -0,0 +1,256 @@
|
|
|
+<?xml version="1.0" encoding="UTF-8"?>
|
|
|
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
|
|
+<mapper namespace="org.jeecg.modules.system.app.mapper.StatisticsMapper">
|
|
|
+ <select id="findByShopSum" resultType="map">
|
|
|
+ SELECT
|
|
|
+ product_name,
|
|
|
+ SUM(quantity) AS total_quantity,
|
|
|
+ SUM(price) AS total_price,
|
|
|
+ ROW_NUMBER() OVER (ORDER BY SUM(quantity) DESC, SUM(price) DESC) AS ranking
|
|
|
+ FROM nm_order_pro_info opi
|
|
|
+ JOIN nm_order o ON opi.order_code = o.order_code
|
|
|
+ JOIN nm_site s ON o.org_code = s.org_code
|
|
|
+ WHERE opi.type NOT IN (0,3, 4, 6)
|
|
|
+ AND opi.order_status NOT IN (3, 4, 5, 6)
|
|
|
+ AND (
|
|
|
+ (#{type} = 1 AND DATE(opi.create_time) = CURDATE()) OR
|
|
|
+ (#{type} = 2 AND YEARWEEK(opi.create_time, 1) = YEARWEEK(CURDATE(), 1)) OR
|
|
|
+ (#{type} = 3 AND YEAR(opi.create_time) = YEAR(CURDATE()) AND MONTH(opi.create_time) = MONTH(CURDATE())) OR
|
|
|
+ (#{type} IS NULL OR #{type} NOT IN (1,2,3))
|
|
|
+ )
|
|
|
+ AND s.org_code LIKE CONCAT(#{orgCode}, '%')
|
|
|
+ GROUP BY product_name
|
|
|
+ ORDER BY total_quantity DESC, total_price DESC
|
|
|
+ LIMIT 30;
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="findByDeptSum" resultType="map">
|
|
|
+ SELECT
|
|
|
+ s.name AS name,
|
|
|
+ SUM(opi.price) AS total_price,
|
|
|
+ ROW_NUMBER() OVER (ORDER BY SUM(opi.quantity) DESC, SUM(opi.price) DESC) AS ranking
|
|
|
+ FROM nm_order_pro_info opi
|
|
|
+ JOIN nm_order o ON opi.order_code = o.order_code
|
|
|
+ JOIN nm_site s ON o.org_code = s.org_code
|
|
|
+ WHERE opi.type NOT IN (0,3,4,6)
|
|
|
+ AND opi.order_status NOT IN (3,4,5,6)
|
|
|
+ AND (
|
|
|
+ (#{type} = 1 AND opi.create_time >= CURDATE() AND opi.create_time < CURDATE() + INTERVAL 1 DAY) OR
|
|
|
+ (#{type} = 2 AND opi.create_time >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) AND opi.create_time < DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) + INTERVAL 7 DAY) OR
|
|
|
+ (#{type} = 3 AND opi.create_time >= DATE_FORMAT(CURDATE(), '%Y-%m-01') AND opi.create_time < DATE_FORMAT(CURDATE(), '%Y-%m-01') + INTERVAL 1 MONTH) OR
|
|
|
+ (#{type} IS NULL OR #{type} NOT IN (1,2,3))
|
|
|
+ )
|
|
|
+ AND s.org_code LIKE CONCAT(#{orgCode}, '%')
|
|
|
+ GROUP BY s.org_code
|
|
|
+ ORDER BY total_price DESC
|
|
|
+ LIMIT 30
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="findIndexStatistics" resultType="map">
|
|
|
+ -- 今日和昨日数据对比
|
|
|
+ SELECT
|
|
|
+ today.salesAmount AS salesAmount,
|
|
|
+ yesterday.salesAmount AS yesterdaySalesAmount,
|
|
|
+ CASE
|
|
|
+ WHEN yesterday.salesAmount = 0 THEN '无环比数据'
|
|
|
+ ELSE CONCAT(
|
|
|
+ CASE WHEN (today.salesAmount - yesterday.salesAmount) / yesterday.salesAmount >= 0 THEN '+' ELSE '' END,
|
|
|
+ ROUND(((today.salesAmount - yesterday.salesAmount) / yesterday.salesAmount) * 100, 2), '%'
|
|
|
+ )
|
|
|
+ END AS salesGrowthRate,
|
|
|
+
|
|
|
+ today.insuranceSalesAmount AS insuranceSalesAmount,
|
|
|
+ yesterday.insuranceSalesAmount AS yesterdayInsuranceSalesAmount,
|
|
|
+ CASE
|
|
|
+ WHEN yesterday.insuranceSalesAmount = 0 THEN '无环比数据'
|
|
|
+ ELSE CONCAT(
|
|
|
+ CASE WHEN (today.insuranceSalesAmount - yesterday.insuranceSalesAmount) / yesterday.insuranceSalesAmount >= 0 THEN '+' ELSE '' END,
|
|
|
+ ROUND(((today.insuranceSalesAmount - yesterday.insuranceSalesAmount) / yesterday.insuranceSalesAmount) * 100, 2), '%'
|
|
|
+ )
|
|
|
+ END AS insuranceSalesGrowthRate,
|
|
|
+
|
|
|
+ today.validOrderCount AS validOrderCount,
|
|
|
+ yesterday.validOrderCount AS yesterdayValidOrderCount,
|
|
|
+ CASE
|
|
|
+ WHEN yesterday.validOrderCount = 0 THEN '无环比数据'
|
|
|
+ ELSE CONCAT(
|
|
|
+ CASE WHEN (today.validOrderCount - yesterday.validOrderCount) / yesterday.validOrderCount >= 0 THEN '+' ELSE '' END,
|
|
|
+ ROUND(((today.validOrderCount - yesterday.validOrderCount) / yesterday.validOrderCount) * 100, 2), '%'
|
|
|
+ )
|
|
|
+ END AS validOrderGrowthRate,
|
|
|
+
|
|
|
+ today.expectedIncome AS expectedIncome,
|
|
|
+ yesterday.expectedIncome AS yesterdayExpectedIncome,
|
|
|
+ CASE
|
|
|
+ WHEN yesterday.expectedIncome = 0 THEN '无环比数据'
|
|
|
+ ELSE CONCAT(
|
|
|
+ CASE WHEN (today.expectedIncome - yesterday.expectedIncome) / yesterday.expectedIncome >= 0 THEN '+' ELSE '' END,
|
|
|
+ ROUND(((today.expectedIncome - yesterday.expectedIncome) / yesterday.expectedIncome) * 100, 2), '%'
|
|
|
+ )
|
|
|
+ END AS expectedIncomeGrowthRate,
|
|
|
+
|
|
|
+ today.platformConsumptionUsers AS platformConsumptionUsers,
|
|
|
+ yesterday.platformConsumptionUsers AS yesterdayPlatformConsumptionUsers,
|
|
|
+ CASE
|
|
|
+ WHEN yesterday.platformConsumptionUsers = 0 THEN '无环比数据'
|
|
|
+ ELSE CONCAT(
|
|
|
+ CASE WHEN (today.platformConsumptionUsers - yesterday.platformConsumptionUsers) / yesterday.platformConsumptionUsers >= 0 THEN '+' ELSE '' END,
|
|
|
+ ROUND(((today.platformConsumptionUsers - yesterday.platformConsumptionUsers) / yesterday.platformConsumptionUsers) * 100, 2), '%'
|
|
|
+ )
|
|
|
+ END AS platformConsumptionGrowthRate,
|
|
|
+
|
|
|
+ today.newUsersCount AS newUsersCount,
|
|
|
+ yesterday.newUsersCount AS yesterdayNewUsersCount,
|
|
|
+ CASE
|
|
|
+ WHEN yesterday.newUsersCount = 0 THEN '无环比数据'
|
|
|
+ ELSE CONCAT(
|
|
|
+ CASE WHEN (today.newUsersCount - yesterday.newUsersCount) / yesterday.newUsersCount >= 0 THEN '+' ELSE '' END,
|
|
|
+ ROUND(((today.newUsersCount - yesterday.newUsersCount) / yesterday.newUsersCount) * 100, 2), '%'
|
|
|
+ )
|
|
|
+ END AS newUsersGrowthRate
|
|
|
+
|
|
|
+ FROM (
|
|
|
+ -- 今日数据
|
|
|
+ SELECT
|
|
|
+ COALESCE((
|
|
|
+ SELECT SUM(nm_order_pro_info.price)
|
|
|
+ FROM nm_order_pro_info
|
|
|
+ LEFT JOIN nm_order ON nm_order_pro_info.order_code = nm_order.order_code
|
|
|
+ WHERE DATE(nm_order_pro_info.create_time) = CURDATE()
|
|
|
+ AND nm_order_pro_info.order_status NOT IN (3, 4, 5, 6)
|
|
|
+ AND nm_order.org_code LIKE CONCAT(#{orgCode}, '%')
|
|
|
+ ), 0) AS salesAmount,
|
|
|
+
|
|
|
+ COALESCE((
|
|
|
+ SELECT SUM(nm_order_pro_info.price)
|
|
|
+ FROM nm_order_pro_info
|
|
|
+ LEFT JOIN nm_order ON nm_order_pro_info.order_code = nm_order.order_code
|
|
|
+ WHERE DATE(nm_order_pro_info.create_time) = CURDATE()
|
|
|
+ AND nm_order_pro_info.order_status NOT IN (3, 4, 5, 6)
|
|
|
+ AND nm_order_pro_info.type = 6
|
|
|
+ AND nm_order.org_code LIKE CONCAT(#{orgCode}, '%')
|
|
|
+ ), 0) AS insuranceSalesAmount,
|
|
|
+
|
|
|
+ COALESCE((
|
|
|
+ SELECT COUNT(nm_order_pro_info.id)
|
|
|
+ FROM nm_order_pro_info
|
|
|
+ LEFT JOIN nm_order ON nm_order_pro_info.order_code = nm_order.order_code
|
|
|
+ WHERE DATE(nm_order_pro_info.create_time) = CURDATE()
|
|
|
+ AND nm_order_pro_info.order_status NOT IN (3, 4, 5, 6)
|
|
|
+ AND nm_order.org_code LIKE CONCAT(#{orgCode}, '%')
|
|
|
+ ), 0) AS validOrderCount,
|
|
|
+
|
|
|
+ COALESCE((
|
|
|
+ SELECT SUM(pre_amount) / 100
|
|
|
+ FROM nm_profit_sharing_info
|
|
|
+ WHERE org_code = #{orgCode}
|
|
|
+ AND DATE(create_time) = CURDATE()
|
|
|
+ ), 0) AS expectedIncome,
|
|
|
+
|
|
|
+ COALESCE((
|
|
|
+ SELECT COUNT(DISTINCT nm_order_pro_info.family_user_id)
|
|
|
+ FROM nm_order_pro_info
|
|
|
+ LEFT JOIN nm_order ON nm_order_pro_info.order_code = nm_order.order_code
|
|
|
+ WHERE DATE(nm_order_pro_info.create_time) = CURDATE()
|
|
|
+ AND nm_order_pro_info.order_status NOT IN (3, 4, 5, 6)
|
|
|
+ AND nm_order.org_code LIKE CONCAT(#{orgCode}, '%')
|
|
|
+ ), 0) AS platformConsumptionUsers,
|
|
|
+
|
|
|
+ COALESCE((
|
|
|
+ SELECT COUNT(id)
|
|
|
+ FROM sys_user
|
|
|
+ WHERE user_identity = 3
|
|
|
+ AND DATE(create_time) = CURDATE()
|
|
|
+ ), 0) AS newUsersCount
|
|
|
+ FROM DUAL
|
|
|
+ ) today,
|
|
|
+
|
|
|
+ (
|
|
|
+ -- 昨日数据
|
|
|
+ SELECT
|
|
|
+ COALESCE((
|
|
|
+ SELECT SUM(nm_order_pro_info.price)
|
|
|
+ FROM nm_order_pro_info
|
|
|
+ LEFT JOIN nm_order ON nm_order_pro_info.order_code = nm_order.order_code
|
|
|
+ WHERE DATE(nm_order_pro_info.create_time) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
|
|
|
+ AND nm_order_pro_info.order_status NOT IN (3, 4, 5, 6)
|
|
|
+ AND nm_order.org_code LIKE CONCAT(#{orgCode}, '%')
|
|
|
+ ), 0) AS salesAmount,
|
|
|
+
|
|
|
+ COALESCE((
|
|
|
+ SELECT SUM(nm_order_pro_info.price)
|
|
|
+ FROM nm_order_pro_info
|
|
|
+ LEFT JOIN nm_order ON nm_order_pro_info.order_code = nm_order.order_code
|
|
|
+ WHERE DATE(nm_order_pro_info.create_time) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
|
|
|
+ AND nm_order_pro_info.order_status NOT IN (3, 4, 5, 6)
|
|
|
+ AND nm_order_pro_info.type = 6
|
|
|
+ AND nm_order.org_code LIKE CONCAT(#{orgCode}, '%')
|
|
|
+ ), 0) AS insuranceSalesAmount,
|
|
|
+
|
|
|
+ COALESCE((
|
|
|
+ SELECT COUNT(nm_order_pro_info.id)
|
|
|
+ FROM nm_order_pro_info
|
|
|
+ LEFT JOIN nm_order ON nm_order_pro_info.order_code = nm_order.order_code
|
|
|
+ WHERE DATE(nm_order_pro_info.create_time) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
|
|
|
+ AND nm_order_pro_info.order_status NOT IN (3, 4, 5, 6)
|
|
|
+ AND nm_order.org_code LIKE CONCAT(#{orgCode}, '%')
|
|
|
+ ), 0) AS validOrderCount,
|
|
|
+
|
|
|
+ COALESCE((
|
|
|
+ SELECT SUM(pre_amount) / 100
|
|
|
+ FROM nm_profit_sharing_info
|
|
|
+ WHERE org_code = #{orgCode}
|
|
|
+ AND DATE(create_time) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
|
|
|
+ ), 0) AS expectedIncome,
|
|
|
+
|
|
|
+ COALESCE((
|
|
|
+ SELECT COUNT(DISTINCT nm_order_pro_info.family_user_id)
|
|
|
+ FROM nm_order_pro_info
|
|
|
+ LEFT JOIN nm_order ON nm_order_pro_info.order_code = nm_order.order_code
|
|
|
+ WHERE DATE(nm_order_pro_info.create_time) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
|
|
|
+ AND nm_order_pro_info.order_status NOT IN (3, 4, 5, 6)
|
|
|
+ AND nm_order.org_code LIKE CONCAT(#{orgCode}, '%')
|
|
|
+ ), 0) AS platformConsumptionUsers,
|
|
|
+
|
|
|
+ COALESCE((
|
|
|
+ SELECT COUNT(id)
|
|
|
+ FROM sys_user
|
|
|
+ WHERE user_identity = 3
|
|
|
+ AND DATE(create_time) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
|
|
|
+ ), 0) AS newUsersCount
|
|
|
+ FROM DUAL
|
|
|
+ ) yesterday
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="findMonthSaleTrend" resultType="map">
|
|
|
+ WITH RECURSIVE date_range AS (
|
|
|
+ SELECT
|
|
|
+ DATE(CONCAT(YEAR(CURDATE()), '-', MONTH(CURDATE()), '-01')) AS date
|
|
|
+ UNION ALL
|
|
|
+ SELECT
|
|
|
+ date + INTERVAL 1 DAY
|
|
|
+ FROM date_range
|
|
|
+ WHERE date < CURDATE()
|
|
|
+ ),
|
|
|
+ sales_data AS (
|
|
|
+ SELECT
|
|
|
+ DATE(nm_order_pro_info.create_time) AS sales_date,
|
|
|
+ SUM(nm_order_pro_info.price) AS daily_sales_amount
|
|
|
+ FROM nm_order_pro_info
|
|
|
+ LEFT JOIN nm_order ON nm_order_pro_info.order_code = nm_order.order_code
|
|
|
+ WHERE
|
|
|
+ nm_order_pro_info.order_status NOT IN (3, 4, 5, 6)
|
|
|
+ AND nm_order.org_code LIKE CONCAT(#{orgCode}, '%')
|
|
|
+ AND YEAR(nm_order_pro_info.create_time) = YEAR(CURDATE())
|
|
|
+ AND MONTH(nm_order_pro_info.create_time) = MONTH(CURDATE())
|
|
|
+ AND DAY(nm_order_pro_info.create_time) <= DAY(CURDATE())
|
|
|
+ GROUP BY DATE(nm_order_pro_info.create_time)
|
|
|
+ )
|
|
|
+ SELECT
|
|
|
+ dr.date,
|
|
|
+ COALESCE(sd.daily_sales_amount, 0) AS dailySalesAmount
|
|
|
+ FROM date_range dr
|
|
|
+ LEFT JOIN sales_data sd ON dr.date = sd.sales_date
|
|
|
+ ORDER BY dr.date ASC
|
|
|
+ </select>
|
|
|
+</mapper>
|