后台景区端趋势图

This commit is contained in:
2025-06-20 16:44:59 +08:00
parent 6d8261ff25
commit 245387f280
5 changed files with 203 additions and 0 deletions

View File

@ -150,4 +150,9 @@ public class ScenicController {
query.setScenicId(scenicId); query.setScenicId(scenicId);
return appStatisticsService.userConversionFunnel(query); return appStatisticsService.userConversionFunnel(query);
} }
@PostMapping("/{scenicId}/orderChart")
public ApiResponse getOrderChart(@PathVariable("scenicId") Long scenicId, @RequestBody CommonQueryReq query) {
query.setScenicId(scenicId);
return appStatisticsService.orderChart(query);
}
} }

View File

@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Mapper;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
/** /**
@ -97,4 +98,8 @@ public interface StatisticsMapper {
List<AppStatisticsFunnelVO> listStatByScenic(Long scenicId, Date startTime, Date endTime); List<AppStatisticsFunnelVO> listStatByScenic(Long scenicId, Date startTime, Date endTime);
int insertStat(Long scenicId, Date date, AppStatisticsFunnelVO data); int insertStat(Long scenicId, Date date, AppStatisticsFunnelVO data);
List<HashMap<String, String>> orderChartByDate(CommonQueryReq query);
List<HashMap<String, String>> orderChartByHour(CommonQueryReq query);
} }

View File

@ -23,4 +23,6 @@ public interface AppStatisticsService {
ApiResponse<AppStatisticsFunnelVO> userConversionFunnel(CommonQueryReq query); ApiResponse<AppStatisticsFunnelVO> userConversionFunnel(CommonQueryReq query);
ApiResponse<String> addStatistics(StatisticsRecordAddReq req); ApiResponse<String> addStatistics(StatisticsRecordAddReq req);
ApiResponse orderChart(CommonQueryReq query);
} }

View File

@ -1,6 +1,7 @@
package com.ycwl.basic.service.mobile.impl; package com.ycwl.basic.service.mobile.impl;
import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@ -25,6 +26,7 @@ import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -313,6 +315,27 @@ public class AppStatisticsServiceImpl implements AppStatisticsService {
} }
} }
@Override
public ApiResponse orderChart(CommonQueryReq query) {
if(query.getEndTime()==null && query.getStartTime()==null){
// 没有传时间,则代表用户没有自定义查询时间,使用standard来判断查询时间范围
Integer standard = query.getStandard();
if(standard==null){
query.setStandard(0);
}
//获取当前周期的具体时间范围
standardToNewSpecificTime(query);
}
if (DateUtil.between(query.getStartTime(), query.getEndTime(), DateUnit.DAY) <= 2) {
// 如果是同一天
List<HashMap<String, String>> hashMaps = statisticsMapper.orderChartByHour(query);
return ApiResponse.success(hashMaps);
} else {
List<HashMap<String, String>> hashMaps = statisticsMapper.orderChartByDate(query);
return ApiResponse.success(hashMaps);
}
}
/** /**
* *
* @param num1 * @param num1

View File

@ -318,6 +318,174 @@
WHERE scenic_id = #{scenicId} WHERE scenic_id = #{scenicId}
AND date BETWEEN #{startTime} AND #{endTime} AND date BETWEEN #{startTime} AND #{endTime}
</select> </select>
<select id="orderChartByDate" resultType="java.util.HashMap">
SELECT
DATE(date_series.DATE) as t,
COALESCE ( count( `order`.id ), 0 ) AS count,
COALESCE ( sum( `order`.pay_price ), 0 ) AS price
FROM
(
SELECT
DATE_ADD( #{startTime}, INTERVAL ( units.i + tens.i * 10 + hundreds.i * 100 ) DAY ) AS DATE
FROM
(
SELECT
0 AS i UNION ALL
SELECT
1 UNION ALL
SELECT
2 UNION ALL
SELECT
3 UNION ALL
SELECT
4 UNION ALL
SELECT
5 UNION ALL
SELECT
6 UNION ALL
SELECT
7 UNION ALL
SELECT
8 UNION ALL
SELECT
9
) units
CROSS JOIN (
SELECT
0 AS i UNION ALL
SELECT
1 UNION ALL
SELECT
2 UNION ALL
SELECT
3 UNION ALL
SELECT
4 UNION ALL
SELECT
5 UNION ALL
SELECT
6 UNION ALL
SELECT
7 UNION ALL
SELECT
8 UNION ALL
SELECT
9
) tens
CROSS JOIN (
SELECT
0 AS i UNION ALL
SELECT
1 UNION ALL
SELECT
2 UNION ALL
SELECT
3 UNION ALL
SELECT
4 UNION ALL
SELECT
5 UNION ALL
SELECT
6 UNION ALL
SELECT
7 UNION ALL
SELECT
8 UNION ALL
SELECT
9
) hundreds
WHERE
DATE_ADD( #{startTime}, INTERVAL ( units.i + tens.i * 10 + hundreds.i * 100 ) DAY ) &lt;= #{endTime}
) date_series
LEFT JOIN `order` ON DATE ( `order`.create_at ) = date_series.DATE AND `order`.scenic_id = #{scenicId} AND ( `order`.STATUS = 1 OR `order`.STATUS = 2 )
GROUP BY
date_series.DATE
ORDER BY date_series.DATE
</select>
<select id="orderChartByHour" resultType="java.util.HashMap">
SELECT
date_series.HOUR as t,
COALESCE ( count( `order`.id ), 0 ) AS count,
COALESCE ( sum( `order`.pay_price ), 0 ) AS price
FROM
(
SELECT
DATE_FORMAT( DATE_ADD( #{startTime}, INTERVAL ( units.i + tens.i * 10 + hundreds.i * 100 ) HOUR ), '%m-%d %H') AS HOUR
FROM
(
SELECT
0 AS i UNION ALL
SELECT
1 UNION ALL
SELECT
2 UNION ALL
SELECT
3 UNION ALL
SELECT
4 UNION ALL
SELECT
5 UNION ALL
SELECT
6 UNION ALL
SELECT
7 UNION ALL
SELECT
8 UNION ALL
SELECT
9
) units
CROSS JOIN (
SELECT
0 AS i UNION ALL
SELECT
1 UNION ALL
SELECT
2 UNION ALL
SELECT
3 UNION ALL
SELECT
4 UNION ALL
SELECT
5 UNION ALL
SELECT
6 UNION ALL
SELECT
7 UNION ALL
SELECT
8 UNION ALL
SELECT
9
) tens
CROSS JOIN (
SELECT
0 AS i UNION ALL
SELECT
1 UNION ALL
SELECT
2 UNION ALL
SELECT
3 UNION ALL
SELECT
4 UNION ALL
SELECT
5 UNION ALL
SELECT
6 UNION ALL
SELECT
7 UNION ALL
SELECT
8 UNION ALL
SELECT
9
) hundreds
WHERE
DATE_ADD( #{startTime}, INTERVAL ( units.i + tens.i * 10 + hundreds.i * 100 ) HOUR ) &lt;= #{endTime}
) date_series
LEFT JOIN `order` ON DATE_FORMAT( `order`.create_at, '%m-%d %H' ) = date_series.HOUR AND `order`.scenic_id = #{scenicId} AND ( `order`.STATUS = 1 OR `order`.STATUS = 2 )
GROUP BY
date_series.HOUR
ORDER BY date_series.HOUR
</select>
<insert id="insertStat"> <insert id="insertStat">
REPLACE INTO scenic_stats (scenic_id, date, cs1, v1, sv1, u1, m1, gv1, gv2, pv1, pv2, cp1, o1, o2, o3, ro2, ro3) REPLACE INTO scenic_stats (scenic_id, date, cs1, v1, sv1, u1, m1, gv1, gv2, pv1, pv2, cp1, o1, o2, o3, ro2, ro3)
VALUES (#{scenicId}, #{date}, #{data.cameraShotOfMemberNum}, #{data.totalVisitorOfMemberNum}, #{data.scanCodeVisitorOfMemberNum}, #{data.uploadFaceOfMemberNum}, #{data.pushOfMemberNum}, #{data.completeVideoOfMemberNum}, #{data.completeOfVideoNum}, #{data.previewVideoOfMemberNum}, #{data.previewOfVideoNum}, #{data.clickOnPayOfMemberNum}, #{data.payOfMemberNum}, #{data.payOfOrderNum}, #{data.payOfOrderAmount}, #{data.refundOfOrderNum}, #{data.refundOfOrderAmount}) VALUES (#{scenicId}, #{date}, #{data.cameraShotOfMemberNum}, #{data.totalVisitorOfMemberNum}, #{data.scanCodeVisitorOfMemberNum}, #{data.uploadFaceOfMemberNum}, #{data.pushOfMemberNum}, #{data.completeVideoOfMemberNum}, #{data.completeOfVideoNum}, #{data.previewVideoOfMemberNum}, #{data.previewOfVideoNum}, #{data.clickOnPayOfMemberNum}, #{data.payOfMemberNum}, #{data.payOfOrderNum}, #{data.payOfOrderAmount}, #{data.refundOfOrderNum}, #{data.refundOfOrderAmount})