From c90ffe21e2b449f72a24baef9d2da457c6e3b36a Mon Sep 17 00:00:00 2001 From: 18650502300 <18650502300@163.com> Date: Tue, 12 Nov 2024 17:12:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IndexController/IndexController.java | 39 ++++- .../controller/app/AppVerifyController.java | 16 +- .../ruoyi/common/utils/CollectionUtils.java | 155 ++++++++++++++++++ .../com/ruoyi/common/utils/DateUtils.java | 33 ++++ .../com/ruoyi/system/domain/IncomeQuery.java | 21 +++ .../com/ruoyi/system/domain/vo/IncomeVo.java | 19 +++ .../ruoyi/system/mapper/EtOrderMapper.java | 8 + .../ruoyi/system/service/IEtOrderService.java | 4 +- .../service/impl/EtOrderServiceImpl.java | 64 +------- .../mapper/system/EtOnlineLogMapper.xml | 13 +- .../resources/mapper/system/EtOrderMapper.xml | 22 +++ 11 files changed, 311 insertions(+), 83 deletions(-) create mode 100644 electripper-common/src/main/java/com/ruoyi/common/utils/CollectionUtils.java create mode 100644 electripper-system/src/main/java/com/ruoyi/system/domain/IncomeQuery.java create mode 100644 electripper-system/src/main/java/com/ruoyi/system/domain/vo/IncomeVo.java diff --git a/electripper-admin/src/main/java/com/ruoyi/web/controller/IndexController/IndexController.java b/electripper-admin/src/main/java/com/ruoyi/web/controller/IndexController/IndexController.java index 20ce0cb..83d4f3d 100644 --- a/electripper-admin/src/main/java/com/ruoyi/web/controller/IndexController/IndexController.java +++ b/electripper-admin/src/main/java/com/ruoyi/web/controller/IndexController/IndexController.java @@ -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 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 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())); diff --git a/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java b/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java index ff97d0d..a1ca81d 100644 --- a/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java +++ b/electripper-admin/src/main/java/com/ruoyi/web/controller/app/AppVerifyController.java @@ -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("【实名认证】保存身份信息成功"); // 更新缓存用户信息 diff --git a/electripper-common/src/main/java/com/ruoyi/common/utils/CollectionUtils.java b/electripper-common/src/main/java/com/ruoyi/common/utils/CollectionUtils.java new file mode 100644 index 0000000..ef89142 --- /dev/null +++ b/electripper-common/src/main/java/com/ruoyi/common/utils/CollectionUtils.java @@ -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 数据列表中元素的类型 + * @return 完整日期序列下的数据列表,缺失的日期已由customFactory填充 + */ + public static List completeMissingDates(List dataList, + Function dateGetter, + Function customFactory) { + if (dataList == null || dataList.isEmpty()) { + return Collections.emptyList(); + } + + List dates = dataList.stream() + .map(dateGetter) + .sorted() + .collect(Collectors.toList()); + + Date startDate = dates.get(0); + Date endDate = dates.get(dates.size() - 1); + + List 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 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 List map(List list, Function 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 List fillVoids(List list, Function getDateFunction, Function function, LocalDate start, LocalDate end) { + // 输入验证 + if (start.isAfter(end)) { + throw new IllegalArgumentException("起始日期必须早于结束日期"); + } + + // 获取当前日期 + LocalDate today = LocalDate.now(); + + // 使用Map优化查找性能 + Map fillAbleMap = new HashMap<>(); + for (T item : list) { + fillAbleMap.put(DateUtils.getYYYY_MM_DD(getDateFunction.apply(item)), item); + } + + // 构建结果列表,并确保线程安全 + List 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; + } +} diff --git a/electripper-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/electripper-common/src/main/java/com/ruoyi/common/utils/DateUtils.java index c56ddbe..3e157e5 100644 --- a/electripper-common/src/main/java/com/ruoyi/common/utils/DateUtils.java +++ b/electripper-common/src/main/java/com/ruoyi/common/utils/DateUtils.java @@ -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; + } } diff --git a/electripper-system/src/main/java/com/ruoyi/system/domain/IncomeQuery.java b/electripper-system/src/main/java/com/ruoyi/system/domain/IncomeQuery.java new file mode 100644 index 0000000..443e9f2 --- /dev/null +++ b/electripper-system/src/main/java/com/ruoyi/system/domain/IncomeQuery.java @@ -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 areaIds; +} diff --git a/electripper-system/src/main/java/com/ruoyi/system/domain/vo/IncomeVo.java b/electripper-system/src/main/java/com/ruoyi/system/domain/vo/IncomeVo.java new file mode 100644 index 0000000..f95b81c --- /dev/null +++ b/electripper-system/src/main/java/com/ruoyi/system/domain/vo/IncomeVo.java @@ -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; +} diff --git a/electripper-system/src/main/java/com/ruoyi/system/mapper/EtOrderMapper.java b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtOrderMapper.java index d5e66f2..661f166 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/mapper/EtOrderMapper.java +++ b/electripper-system/src/main/java/com/ruoyi/system/mapper/EtOrderMapper.java @@ -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 selectDailyAmount(@Param("query") IncomeQuery incomeQuery); } diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/IEtOrderService.java b/electripper-system/src/main/java/com/ruoyi/system/service/IEtOrderService.java index 0c3300e..9808559 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/IEtOrderService.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/IEtOrderService.java @@ -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 getIncomeList(Long deptId, String date); + List getIncomeList(IncomeQuery incomeQuery); } diff --git a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java index 84cf38e..a9228c9 100644 --- a/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java +++ b/electripper-system/src/main/java/com/ruoyi/system/service/impl/EtOrderServiceImpl.java @@ -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 getIncomeList(Long deptId, String date) { - // 定义缓存的键 - String cacheKey = "income:deptId_" + deptId + ":date_" + date; - - // 尝试从缓存中获取数据 - List cachedIncomeVos = redisCache.getCacheObject(cacheKey); - if (cachedIncomeVos != null) { - log.info("【营收统计】从缓存中获取数据:" + cacheKey); - return cachedIncomeVos; // 如果缓存中有数据,直接返回 - } - - ArrayList 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 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 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); } /** diff --git a/electripper-system/src/main/resources/mapper/system/EtOnlineLogMapper.xml b/electripper-system/src/main/resources/mapper/system/EtOnlineLogMapper.xml index d903472..eb7a993 100644 --- a/electripper-system/src/main/resources/mapper/system/EtOnlineLogMapper.xml +++ b/electripper-system/src/main/resources/mapper/system/EtOnlineLogMapper.xml @@ -3,7 +3,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -20,18 +20,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + insert into et_online_log @@ -70,9 +71,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from et_online_log where id in + delete from et_online_log where id in #{id} - \ No newline at end of file + diff --git a/electripper-system/src/main/resources/mapper/system/EtOrderMapper.xml b/electripper-system/src/main/resources/mapper/system/EtOrderMapper.xml index e4a7d4d..5108e8c 100644 --- a/electripper-system/src/main/resources/mapper/system/EtOrderMapper.xml +++ b/electripper-system/src/main/resources/mapper/system/EtOrderMapper.xml @@ -1291,5 +1291,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ) AS combined_amounts + +