This commit is contained in:
邱贞招 2024-11-12 17:12:25 +08:00
parent 8ba93b74ac
commit c90ffe21e2
11 changed files with 311 additions and 83 deletions

View File

@ -1,19 +1,19 @@
package com.ruoyi.web.controller.IndexController;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.CollectionUtils;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.EtOperatingArea;
import com.ruoyi.system.domain.vo.IndexAdminVo;
import com.ruoyi.system.domain.vo.IndexVo;
import com.ruoyi.system.domain.vo.StatisticsResult;
import com.ruoyi.system.domain.vo.LeaderboardVo;
import com.ruoyi.system.domain.IncomeQuery;
import com.ruoyi.system.domain.vo.*;
import com.ruoyi.system.service.IEtOperatingAreaService;
import com.ruoyi.system.service.IEtOrderService;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@ -21,7 +21,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Calendar;
import java.util.List;
/**
@ -110,13 +113,33 @@ public class IndexController extends BaseController
if(deptId == null){
throw new ServiceException("运营商id不能为空deptId");
}
if(date == null){
if(StrUtil.isBlank(date)){
throw new ServiceException("时间参数不能为空date");
}
List<IndexVo.IncomeVo> incomeList = etOrderService.getIncomeList(deptId, date);
LocalDate[] firstAndLastDay =DateUtils.getFirstAndLastDayOfMonth(date);
LocalDate startTime = firstAndLastDay[0];
LocalDate endTime = firstAndLastDay[1];
IncomeQuery incomeQuery = new IncomeQuery();
incomeQuery.setDeptId(deptId);
incomeQuery.setStartTime(startTime);
incomeQuery.setEndTime(endTime);
List<IncomeVo> incomeList = etOrderService.getIncomeList(incomeQuery);
incomeList = CollectionUtils.fillVoids(incomeList, IncomeVo::getDay, (d) -> {
IncomeVo vo = new IncomeVo();
vo.setDay(d);
vo.setIncome(BigDecimal.ZERO);
vo.setOrderNum(0);
return vo;
}, startTime, endTime);
return success(incomeList);
}
private String getDateStr(Calendar calendar,int day) {
calendar.set(Calendar.DAY_OF_MONTH, day);
return new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
}
private static void assign(IndexVo result, IndexVo areaIndexVo) {
result.setBalance(result.getBalance().add(areaIndexVo.getBalance()));
result.setWithdraw(result.getWithdraw().add(areaIndexVo.getWithdraw()));

View File

@ -830,7 +830,7 @@ public class AppVerifyController extends BaseController
*/
@Log(title = "实名认证", businessType = BusinessType.AUTHENTICATION)
@GetMapping("/user/authentication")
public AjaxResult partnerBillList(AuthenticationVo authenticationVo)
public AjaxResult authentication(AuthenticationVo authenticationVo)
{
logger.info("【实名认证】请求参数authenticationVo={}", JSON.toJSON(authenticationVo));
Object authentication = asUserService.authentication(authenticationVo);
@ -843,13 +843,13 @@ public class AppVerifyController extends BaseController
//保存身份信息
// 更新用户并更新缓存
LoginUser loginUser = SecurityUtils.getLoginUser();
AsUser asUser = loginUser.getAsUser();
asUser.setUserId(authenticationVo.getUserId());
asUser.setRealName(authenticationVo.getRealName());
asUser.setIdCard(authenticationVo.getIdCard());
asUser.setIsAuthentication(ServiceConstants.IS_AUTHENTICATION_YES);
int updateUser = asUserService.updateUser(asUser);
if (updateUser>0)
AsUser updateUser = new AsUser();
updateUser.setUserId(authenticationVo.getUserId());
updateUser.setRealName(authenticationVo.getRealName());
updateUser.setIdCard(authenticationVo.getIdCard());
updateUser.setIsAuthentication(ServiceConstants.IS_AUTHENTICATION_YES);
int updated = asUserService.updateUser(updateUser);
if (updated>0)
{
logger.info("【实名认证】保存身份信息成功");
// 更新缓存用户信息

View File

@ -0,0 +1,155 @@
package com.ruoyi.common.utils;
import java.time.LocalDate;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author wjh
* 2024/4/29
*/
public class CollectionUtils extends org.springframework.util.CollectionUtils {
/**
* 是否为空包括空集合空元素
* @param collection
* @return
*/
public static boolean isEmptyElement(Collection<?> collection) {
if (collection == null) {
return true;
}
// 过滤空元素
List<?> collect = collection.stream().filter(Objects::nonNull).collect(Collectors.toList());
return org.springframework.util.CollectionUtils.isEmpty(collect);
}
public static boolean isNotEmptyElement(Collection<?> collection) {
return !isEmptyElement(collection);
}
// TODO 未经验证
/**
* 补全列表中的日期数据对于缺失的日期使用提供的工厂方法生成对象
*
* @param dataList 原始数据列表元素需有getDateMethod返回Date类型属性的方法
* @param dateGetter 获取元素日期属性的方法引用
* @param customFactory 当日期缺失时用于生成对应元素的对象工厂方法
* @param <T> 数据列表中元素的类型
* @return 完整日期序列下的数据列表缺失的日期已由customFactory填充
*/
public static <T> List<T> completeMissingDates(List<T> dataList,
Function<T, Date> dateGetter,
Function<Date, T> customFactory) {
if (dataList == null || dataList.isEmpty()) {
return Collections.emptyList();
}
List<Date> dates = dataList.stream()
.map(dateGetter)
.sorted()
.collect(Collectors.toList());
Date startDate = dates.get(0);
Date endDate = dates.get(dates.size() - 1);
List<Date> fullDates = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);
while (!calendar.getTime().after(endDate)) {
fullDates.add(calendar.getTime());
calendar.add(Calendar.DATE, 1);
}
Map<Date, T> dateToObjectMap = dataList.stream()
.collect(Collectors.toMap(dateGetter, Function.identity()));
return fullDates.stream()
.map(date -> dateToObjectMap.getOrDefault(date, customFactory.apply(date)))
.collect(Collectors.toList());
}
public static boolean isNotEmpty(List<?> deviceList) {
return !isEmpty(deviceList);
}
/**
* 集合映射去除空值重复值
*/
public static <T, R> List<R> map(List<T> list, Function<? super T, ? extends R> keyMapper) {
return list.stream().map(keyMapper).filter(Objects::nonNull).distinct().collect(Collectors.toList());
}
/**
* 判断两个列表及其内容是否一致
*/
public static boolean equals(List l1, List l2) {
if (Objects.equals(l1, l2)) {
return true;
}
if (l1.size() != l2.size()) {
return false;
}
for(int i = 0; i < l1.size(); i ++) {
Object o1 = l1.get(i);
Object o2 = l2.get(i);
if (!o1.equals(o2)) {
return false;
}
}
return true;
}
/**
* 填充空值
* @param list 原始列表
* @param getDateFunction 获取日期的方法
* @param function 获取填充物的方法
* @param start 起始日期
* @param end 结束日期
* @return 填充后的列表
*/
public static <T> List<T> fillVoids(List<? extends T> list, Function<? super T, LocalDate> getDateFunction, Function<LocalDate, ? extends T> function, LocalDate start, LocalDate end) {
// 输入验证
if (start.isAfter(end)) {
throw new IllegalArgumentException("起始日期必须早于结束日期");
}
// 获取当前日期
LocalDate today = LocalDate.now();
// 使用Map优化查找性能
Map<String, T> fillAbleMap = new HashMap<>();
for (T item : list) {
fillAbleMap.put(DateUtils.getYYYY_MM_DD(getDateFunction.apply(item)), item);
}
// 构建结果列表并确保线程安全
List<T> result = Collections.synchronizedList(new ArrayList<>());
LocalDate current = start;
while (!current.isAfter(end)) {
// 如果当前日期已经超过今天则不再填充
if (current.isAfter(today)) {
break;
}
T currentItem = fillAbleMap.get(DateUtils.getYYYY_MM_DD(current));
if (currentItem == null) {
try {
currentItem = function.apply(current);
} catch (Exception e) {
// 异常处理逻辑例如记录日志或抛出自定义异常
System.err.println("处理日期 " + current + " 时发生异常: " + e.getMessage());
}
}
if (currentItem != null) {
result.add(currentItem);
}
current = current.plusDays(1);
}
return result;
}
}

View File

@ -6,6 +6,7 @@ import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
@ -116,6 +117,22 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
return DateFormatUtils.format(date, YYYY_MM_DD);
}
/**
* 日期路径 即年// 如20180808
*/
public static final String getYYYY_MM_DD(LocalDate date)
{
return format(date, YYYY_MM_DD);
}
private static String format(LocalDate localDate, String format) {
if (localDate == null) {
return null;
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
return localDate.format(formatter);
}
/**
* 日期型字符串转化为日期 格式
*/
@ -368,4 +385,20 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
}
return calendar.getTime(); // 返回新的时间
}
public static LocalDate[] getFirstAndLastDayOfMonth(String month) {
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate[] result = new LocalDate[2];
// 解析传入的月份字符串为 LocalDate
LocalDate date = LocalDate.parse(month + "-01", dateFormat);
// 获取该月的第一天
result[0] = date.withDayOfMonth(1);
// 获取该月的最后一天
result[1] = date.withDayOfMonth(date.lengthOfMonth());
return result;
}
}

View File

@ -0,0 +1,21 @@
package com.ruoyi.system.domain;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.util.List;
@Data
public class IncomeQuery {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate startTime;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate endTime;
private Long deptId;
private List<Long> areaIds;
}

View File

@ -0,0 +1,19 @@
package com.ruoyi.system.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 收入统计 incomeVo
*/
@Data
public class IncomeVo {
/** 日期 */
private LocalDate day;
/** 收入 */
private BigDecimal income;
/** 订单数 */
private Integer orderNum;
}

View File

@ -1,9 +1,13 @@
package com.ruoyi.system.mapper;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import com.ruoyi.system.domain.EtOrder;
import com.ruoyi.system.domain.EtOrderQuery;
import com.ruoyi.system.domain.IncomeQuery;
import com.ruoyi.system.domain.vo.IncomeVo;
import com.ruoyi.system.domain.vo.IndexVo;
import org.apache.ibatis.annotations.Param;
/**
@ -360,4 +364,8 @@ public interface EtOrderMapper
*/
BigDecimal getDepositDeductionAmount(@Param("startDateStr") String startDateStr , @Param("endDateStr") String endDateStr ,@Param("areaId") Long areaId,@Param("channelId") Long channelId);
/**
* 日报查询
*/
List<IncomeVo> selectDailyAmount(@Param("query") IncomeQuery incomeQuery);
}

View File

@ -3,10 +3,12 @@ package com.ruoyi.system.service;
import com.ruoyi.system.domain.EtOrder;
import com.ruoyi.system.domain.EtOrderQuery;
import com.ruoyi.system.domain.EtRefund;
import com.ruoyi.system.domain.IncomeQuery;
import com.ruoyi.system.domain.vo.*;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
@ -283,5 +285,5 @@ public interface IEtOrderService
/**
* 获取营收统计按月份
*/
List<IndexVo.IncomeVo> getIncomeList(Long deptId, String date);
List<IncomeVo> getIncomeList(IncomeQuery incomeQuery);
}

View File

@ -45,6 +45,7 @@ import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
@ -2324,67 +2325,10 @@ public class EtOrderServiceImpl implements IEtOrderService
* 获取营收统计按月份
*/
@Override
public List<IndexVo.IncomeVo> getIncomeList(Long deptId, String date) {
// 定义缓存的键
String cacheKey = "income:deptId_" + deptId + ":date_" + date;
// 尝试从缓存中获取数据
List<IndexVo.IncomeVo> cachedIncomeVos = redisCache.getCacheObject(cacheKey);
if (cachedIncomeVos != null) {
log.info("【营收统计】从缓存中获取数据:" + cacheKey);
return cachedIncomeVos; // 如果缓存中有数据直接返回
}
ArrayList<IndexVo.IncomeVo> incomeVos = new ArrayList<>();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
SimpleDateFormat dayFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setTime(DateUtils.getNowDate());
List<Long> areaIds = etOperatingAreaService.selectAreaListByDeptId(deptId);
try {
// 将传入的 date 字符串解析为日期
Date parsedDate = dateFormat.parse(date);
calendar.setTime(parsedDate);
} catch (ParseException e) {
log.error("日期解析失败, 请检查日期格式,错误信息: {}", e.getMessage());
return incomeVos;
}
public List<IncomeVo> getIncomeList(IncomeQuery incomeQuery) {
incomeQuery.setAreaIds(etOperatingAreaService.selectAreaListByDeptId(incomeQuery.getDeptId()));
// 获取当前月的最后一天
int lastDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
for (int day = 1; day <= lastDayOfMonth; day ++) {
// 设置当前日期为每一天
calendar.set(Calendar.DAY_OF_MONTH, day);
String formattedDate = dayFormat.format(calendar.getTime());
// 拼接查询的开始和结束时间
String startDateStr = formattedDate + " " + Constants.DATE_FORMAT_START_PEREND;
String endDateStr = formattedDate + " " + Constants.DATE_FORMAT_END_PEREND;
// 获取当天的订单统计信息
IndexVo.OrderFeeStatisticsVo todayOrderInfo = getOrderFeeStatisticsByDeptId(startDateStr, endDateStr, areaIds);
log.info("【获取营收统计】营收统计----------todayOrderInfo: {}" , JSON.toJSON(todayOrderInfo));
// 如果 orderNum income 0跳过当前循环
if (todayOrderInfo.getOrderCount() == 0 && todayOrderInfo.getIncomeFee().compareTo(BigDecimal.ZERO) == 0) {
continue;
}
// 构建收入统计对象
IndexVo.IncomeVo incomeVo = new IndexVo.IncomeVo();
incomeVo.setDay(formattedDate);
incomeVo.setOrderNum(todayOrderInfo.getOrderCount());
incomeVo.setIncome(todayOrderInfo.getIncomeFee());
// 添加到结果列表中
incomeVos.add(incomeVo);
}
// 将计算得到的数据存入缓存缓存有效期为30分钟
redisCache.setCacheObject(cacheKey, incomeVos, 30, TimeUnit.MINUTES);
return incomeVos;
return etOrderMapper.selectDailyAmount(incomeQuery);
}
/**

View File

@ -3,7 +3,7 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.EtOnlineLogMapper">
<resultMap type="EtOnlineLog" id="EtOnlineLogResult">
<result property="id" column="id" />
<result property="mac" column="mac" />
@ -20,18 +20,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectEtOnlineLogList" parameterType="EtOnlineLog" resultMap="EtOnlineLogResult">
<include refid="selectEtOnlineLogVo"/>
<where>
<where>
<if test="mac != null and mac != ''"> and mac like concat('%', #{mac}, '%')</if>
<if test="sn != null and sn != ''"> and sn like concat('%', #{sn}, '%')</if>
<if test="onlineStatus != null and onlineStatus != ''"> and online_status = #{onlineStatus}</if>
</where>
order by create_time desc
</select>
<select id="selectEtOnlineLogById" parameterType="Long" resultMap="EtOnlineLogResult">
<include refid="selectEtOnlineLogVo"/>
where id = #{id}
</select>
<insert id="insertEtOnlineLog" parameterType="EtOnlineLog" useGeneratedKeys="true" keyProperty="id">
insert into et_online_log
<trim prefix="(" suffix=")" suffixOverrides=",">
@ -70,9 +71,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</delete>
<delete id="deleteEtOnlineLogByIds" parameterType="String">
delete from et_online_log where id in
delete from et_online_log where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>
</mapper>

View File

@ -1291,5 +1291,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
) AS combined_amounts
</select>
<select id="selectDailyAmount" resultType="com.ruoyi.system.domain.vo.IncomeVo">
select
date(o.pay_time) as `day`,
COALESCE(sum(o.pay_fee),0) as `income`,
count(1) `orderNum`
from et_order o
where o.status = 4 and o.type = 1 and o.paid = 1
<if test="query.areaIds != null and query.areaIds.size() > 0">
and area_id IN
<foreach item="item" index="index" collection="query.areaIds" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
<if test="query.startTime != null ">
and DATE(o.pay_time) &gt;= #{query.startTime}
</if>
<if test="query.endTime != null ">
and DATE(o.pay_time) &lt;= #{query.endTime}
</if>
group by `day`
</select>
</mapper>