太空舱订单报表生成。定时检测订单完成状态
This commit is contained in:
@ -125,6 +125,7 @@ public interface ErrorCodeConstants {
|
||||
ErrorCode ORDER_SPACE_CAPSULE_NOT_EXISTS = new ErrorCode(1_004_016_001, "太空舱订单不存在");
|
||||
ErrorCode ORDER_SPACE_CAPSULE_ERREO = new ErrorCode(1_004_016_002, "太空舱订单状态非法");
|
||||
ErrorCode ORDER_SPACE_CAPSULE_CLOSE = new ErrorCode(1_004_016_003, "太空舱订单已结束,不可再开门");
|
||||
ErrorCode ORDER_SPACE_CAPSULE_EXIST = new ErrorCode(1_004_016_005, "太空舱在使用中,不可再开门");
|
||||
|
||||
ErrorCode STORE_BUSINESS_NOT_EXISTS = new ErrorCode(1_004_017_001, "超市营业统计不存在");
|
||||
|
||||
|
@ -9,9 +9,9 @@ import javax.validation.constraints.NotNull;
|
||||
@Schema(description = "小程序 - 太空舱管理员 vo")
|
||||
@Data
|
||||
public class OrderSpaceCapsuleAdminVo {
|
||||
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23511")
|
||||
@NotNull(message = "用户编号不能为空")
|
||||
private Long userId;
|
||||
@Schema(description = "用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "23511")
|
||||
@NotNull(message = "用户不能为空")
|
||||
private String type;
|
||||
@Schema(description = "太空舱支付编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
@NotBlank(message = "太空舱支付编码不能为空")
|
||||
private String zfCode;
|
||||
|
@ -20,30 +20,24 @@ public class OrderSpaceCapsuleSaveReqVO {
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "订单金额", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "订单金额不能为空")
|
||||
private BigDecimal money;
|
||||
|
||||
@Schema(description = "太空船id", requiredMode = Schema.RequiredMode.REQUIRED, example = "22979")
|
||||
private Long spaceCapsuleId;
|
||||
|
||||
@Schema(description = "门店id", requiredMode = Schema.RequiredMode.REQUIRED, example = "5246")
|
||||
@NotNull(message = "门店id不能为空")
|
||||
private Long carteenId;
|
||||
|
||||
@Schema(description = "0未使用1使用中2已完成3已退款", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
@NotNull(message = "0未使用1使用中2已完成3已退款不能为空")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "套餐金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "32723")
|
||||
@NotNull(message = "套餐金额不能为空")
|
||||
private BigDecimal comboPrice;
|
||||
|
||||
@Schema(description = "套餐时间/分钟", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "套餐时间/分钟不能为空")
|
||||
private Integer comboMinutes;
|
||||
|
||||
@Schema(description = "套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
|
||||
@NotEmpty(message = "套餐名称不能为空")
|
||||
private String comboPackageName;
|
||||
|
||||
@Schema(description = "套餐开始使用时间")
|
||||
@ -53,7 +47,6 @@ public class OrderSpaceCapsuleSaveReqVO {
|
||||
private LocalDateTime orderEndTime;
|
||||
|
||||
@Schema(description = "产生订单的用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "30766")
|
||||
@NotNull(message = "产生订单的用户id不能为空")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "消费前的余额", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ -68,7 +61,6 @@ public class OrderSpaceCapsuleSaveReqVO {
|
||||
* 套餐数量
|
||||
*/
|
||||
@Schema(description = "套餐数量", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "套餐数量不能为空")
|
||||
private Integer comboNum;
|
||||
/**
|
||||
* 退款金额
|
||||
|
@ -0,0 +1,15 @@
|
||||
package cn.iocoder.yudao.module.member.controller.admin.orderspacecapsule.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
@Schema(description = "小程序 - 太空舱订单统计营业额对比")
|
||||
@Data
|
||||
public class OrderSpaceCapsuleStatisticsComVo {
|
||||
@Schema(description = "日期", example = "9-21")
|
||||
private String date;
|
||||
@Schema(description = "金额")
|
||||
private BigDecimal totalMoney;
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package cn.iocoder.yudao.module.member.controller.admin.orderspacecapsule.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
@Schema(description = "小程序 - 太空舱订单统计操作")
|
||||
@Data
|
||||
public class OrderSpaceCapsuleStatisticsVo {
|
||||
@Schema(description = "营业额", example = "23511")
|
||||
private BigDecimal totalMoney;
|
||||
@Schema(description = "总时长", example = "23511")
|
||||
private BigDecimal totalHour;
|
||||
@Schema(description = "对比", example = "23511")
|
||||
private BigDecimal compTotalMoney;
|
||||
@Schema(description = "类型 是-/+", example = "23511")
|
||||
private String compType;
|
||||
@Schema(description = "总订单数", example = "23511")
|
||||
private Integer totalOrderSum;
|
||||
@Schema(description = "营业额对比")
|
||||
private List<OrderSpaceCapsuleStatisticsComVo> compMoney;
|
||||
@Schema(description = "使用时长对比")
|
||||
private List<OrderSpaceCapsuleStatisticsComVo> compHour;
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
package cn.iocoder.yudao.module.member.controller.app.orderspacecapsule;
|
||||
|
||||
import cn.hutool.core.date.DatePattern;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
@ -9,12 +10,15 @@ import cn.iocoder.yudao.module.member.service.orderspacecapsule.OrderSpaceCapsul
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.Valid;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
|
||||
|
||||
@ -74,4 +78,11 @@ public class AppOrderSpaceCapsuleController {
|
||||
OrderSpaceCapsuleDO orderSpaceCapsuleDO = orderSpaceCapsuleService.openCmdAdmin(adminVo);
|
||||
return success(BeanUtils.toBean(orderSpaceCapsuleDO, OrderSpaceCapsuleRespVO.class));
|
||||
}
|
||||
@GetMapping("/statistics")
|
||||
@Operation(summary = "日报,月报")
|
||||
public CommonResult<OrderSpaceCapsuleStatisticsVo> getStatistics(@RequestParam("carteenId") Long carTeenId,
|
||||
@RequestParam("startTime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
|
||||
@RequestParam("endTime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime) {
|
||||
return success(orderSpaceCapsuleService.getStatistics(carTeenId, startTime, endTime));
|
||||
}
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
package cn.iocoder.yudao.module.member.job;
|
||||
|
||||
import cn.hutool.core.date.LocalDateTimeUtil;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
|
||||
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.orderspacecapsule.vo.OrderSpaceCapsuleSaveReqVO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.orderspacecapsule.OrderSpaceCapsuleDO;
|
||||
import cn.iocoder.yudao.module.member.dal.mysql.orderspacecapsule.OrderSpaceCapsuleMapper;
|
||||
import cn.iocoder.yudao.module.member.enums.SpaceCapsuleOrderEnum;
|
||||
import cn.iocoder.yudao.module.member.service.orderspacecapsule.OrderSpaceCapsuleService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author zt 定时任务太空舱订单结算
|
||||
* @description <description class purpose>
|
||||
* @since 2024/10/11
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class OrderSpaceCapsuleJob implements JobHandler {
|
||||
@Resource
|
||||
private OrderSpaceCapsuleMapper orderSpaceCapsuleMapper;
|
||||
@Resource
|
||||
private OrderSpaceCapsuleService order;
|
||||
@Override
|
||||
@TenantIgnore
|
||||
public String execute(String param) throws Exception {
|
||||
List<OrderSpaceCapsuleDO> orderSpaceCapsuleDOS = orderSpaceCapsuleMapper.selectList(new LambdaQueryWrapperX<OrderSpaceCapsuleDO>()
|
||||
.eq(OrderSpaceCapsuleDO::getStatus, SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_IN_USE.getCode()));
|
||||
if(orderSpaceCapsuleDOS==null){
|
||||
log.info("订单还在有效期内");
|
||||
return "太空舱订单扣款,订单还在有效期内";
|
||||
}
|
||||
//获得到需要扣款的数据
|
||||
List<OrderSpaceCapsuleDO> collect = orderSpaceCapsuleDOS.stream().map(m -> {
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
LocalDateTime orderStartTime = m.getOrderStartTime();
|
||||
int t = m.getComboNum() * m.getComboMinutes();
|
||||
LocalDateTime offset = LocalDateTimeUtil.offset(orderStartTime, t, ChronoUnit.MINUTES);
|
||||
if (now.isAfter(offset)) {
|
||||
return m;
|
||||
}
|
||||
return null;
|
||||
}).collect(Collectors.toList());
|
||||
log.info("太空舱订单扣款数量为{}",collect.size());
|
||||
for (OrderSpaceCapsuleDO aDo : collect) {
|
||||
aDo.setStatus(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_DONE.getCode());
|
||||
order.updateOrderSpaceCapsule(BeanUtils.toBean(aDo, OrderSpaceCapsuleSaveReqVO.class));
|
||||
}
|
||||
return "太空舱订单扣款数量为:"+collect.size();
|
||||
}
|
||||
}
|
@ -1,14 +1,12 @@
|
||||
package cn.iocoder.yudao.module.member.service.orderspacecapsule;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.orderspacecapsule.vo.OrderSpaceCapsuleAdminVo;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.orderspacecapsule.vo.OrderSpaceCapsuleOperateVo;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.orderspacecapsule.vo.OrderSpaceCapsulePageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.orderspacecapsule.vo.OrderSpaceCapsuleSaveReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.orderspacecapsule.vo.*;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.orderspacecapsule.OrderSpaceCapsuleDO;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
import javax.validation.*;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 太空舱订单 Service 接口
|
||||
@ -67,4 +65,13 @@ public interface OrderSpaceCapsuleService {
|
||||
* @return
|
||||
*/
|
||||
OrderSpaceCapsuleDO openCmdAdmin(@Valid @RequestBody OrderSpaceCapsuleAdminVo adminVo);
|
||||
|
||||
/**
|
||||
* 统计,太空舱 日报,周报
|
||||
* @param carTeenId
|
||||
* @param startTime
|
||||
* @param endTime
|
||||
* @return
|
||||
*/
|
||||
OrderSpaceCapsuleStatisticsVo getStatistics(Long carTeenId, Date startTime,Date endTime);
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
package cn.iocoder.yudao.module.member.service.orderspacecapsule;
|
||||
|
||||
import cn.hutool.core.date.DateTime;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.lang.UUID;
|
||||
import cn.hutool.extra.qrcode.QrCodeUtil;
|
||||
import cn.hutool.http.HttpRequest;
|
||||
@ -9,6 +11,7 @@ import cn.hutool.json.JSONUtil;
|
||||
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.orderspacecapsule.vo.*;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.orderspacecapsule.OrderSpaceCapsuleDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.spacecapsule.SpaceCapsuleDO;
|
||||
@ -20,6 +23,7 @@ import cn.iocoder.yudao.module.member.service.carteenmoney.CarteenMoneyService;
|
||||
import cn.iocoder.yudao.module.member.service.spacecapsule.SpaceCapsuleService;
|
||||
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
|
||||
import cn.iocoder.yudao.module.system.api.carteen.CarteenApi;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
import javax.annotation.Resource;
|
||||
import javax.imageio.ImageIO;
|
||||
@ -38,8 +42,9 @@ import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Base64;
|
||||
import java.util.Objects;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*;
|
||||
|
||||
@ -112,19 +117,27 @@ public class OrderSpaceCapsuleServiceImpl implements OrderSpaceCapsuleService {
|
||||
return; // 状态一致,无需更新
|
||||
}
|
||||
// 获取太空舱信息
|
||||
SpaceCapsuleDO spaceCapsule = spaceCapsuleService.getSpaceCapsule(updateObj.getSpaceCapsuleId());
|
||||
SpaceCapsuleDO spaceCapsule = spaceCapsuleService.getPayNum(updateReqVO.getPayNum().toString());
|
||||
// 根据新状态处理逻辑
|
||||
if(updateObj.getStatus().equals(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_APPOINTMENT.getCode())){
|
||||
// TODO: 预约逻辑待完成
|
||||
}else if(updateObj.getStatus().equals(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_REFUNDED.getCode())){
|
||||
handleRefund(updateObj,currentStatus);
|
||||
updateObj.setStatus(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_REFUNDED.getCode());
|
||||
updateSpaceCapsuleStatus(spaceCapsule, SpaceCapsuleEnum.SPACE_CAPSULE_ENUM_FREE_TIME.getCode());
|
||||
if(spaceCapsule!=null){
|
||||
updateSpaceCapsuleStatus(spaceCapsule, SpaceCapsuleEnum.SPACE_CAPSULE_ENUM_FREE_TIME.getCode());
|
||||
}
|
||||
updateObj.setOrderEndTime(LocalDateTime.now());
|
||||
}else if(updateObj.getStatus().equals(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_DONE.getCode())){
|
||||
updateObj.setSpaceCapsuleId(spaceCapsule.getId());
|
||||
updateObj.setOrderEndTime(LocalDateTime.now());
|
||||
updateSpaceCapsuleStatus(spaceCapsule, SpaceCapsuleEnum.SPACE_CAPSULE_ENUM_FREE_TIME.getCode());
|
||||
}else if(updateObj.getStatus().equals(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_IN_USE.getCode())){
|
||||
if(currentStatus.equals(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_UNUSED.getCode())
|
||||
&&spaceCapsule.getStatus().equals(SpaceCapsuleEnum.SPACE_CAPSULE_ENUM_IN_USE.getCode())){
|
||||
throw exception(ORDER_SPACE_CAPSULE_EXIST);
|
||||
}
|
||||
updateObj.setSpaceCapsuleId(spaceCapsule.getId());
|
||||
updateObj.setOrderStartTime(LocalDateTime.now());
|
||||
updateSpaceCapsuleStatus(spaceCapsule, SpaceCapsuleEnum.SPACE_CAPSULE_ENUM_IN_USE.getCode());
|
||||
}
|
||||
@ -216,14 +229,132 @@ public class OrderSpaceCapsuleServiceImpl implements OrderSpaceCapsuleService {
|
||||
|
||||
@Override
|
||||
public OrderSpaceCapsuleDO openCmdAdmin(OrderSpaceCapsuleAdminVo adminVo) {
|
||||
MemberUserDO user = userService.getUser(adminVo.getUserId());
|
||||
//判断是0和2
|
||||
SpaceCapsuleDO payNum = spaceCapsuleService.getPayNum(adminVo.getZfCode());
|
||||
OrderSpaceCapsuleDO capsuleDO=new OrderSpaceCapsuleDO();
|
||||
capsuleDO.setComboNum(9999);
|
||||
capsuleDO.setComboMinutes(9999);
|
||||
handleFirstOpening(capsuleDO,payNum);
|
||||
if(adminVo.getType().equals("0")){
|
||||
capsuleDO.setComboNum(9999);
|
||||
capsuleDO.setComboMinutes(9999);
|
||||
handleFirstOpening(capsuleDO,payNum);
|
||||
}else if(adminVo.getType().equals("2")){
|
||||
capsuleDO.setComboNum(5);
|
||||
capsuleDO.setComboMinutes(1);
|
||||
handleFirstOpening(capsuleDO,payNum);
|
||||
}
|
||||
return capsuleDO;
|
||||
}
|
||||
public BigDecimal getTotalMoney(Long carTeenId, Date startTime, Date endTime) {
|
||||
return orderSpaceCapsuleMapper.selectObjs(
|
||||
new QueryWrapper<OrderSpaceCapsuleDO>()
|
||||
.select("SUM(money) as totalMoney")
|
||||
.eq("carteen_id", carTeenId)
|
||||
.between("create_time", startTime, endTime)
|
||||
.eq("status", SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_DONE.getCode())
|
||||
).stream()
|
||||
.filter(Objects::nonNull)
|
||||
.map(obj -> (BigDecimal) obj)
|
||||
.findFirst()
|
||||
.orElse(BigDecimal.ZERO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public OrderSpaceCapsuleStatisticsVo getStatistics(Long carTeenId, Date startTime, Date endTime) {
|
||||
// 查询符合条件的订单列表
|
||||
List<OrderSpaceCapsuleDO> orderSpaceCapsuleDOS = getOrderList(carTeenId, startTime, endTime);
|
||||
|
||||
// 计算营业额总和
|
||||
BigDecimal totalMoney = calculateTotalMoney(orderSpaceCapsuleDOS);
|
||||
|
||||
// 计算总时长 (小时)
|
||||
BigDecimal totalHour = calculateTotalHours(orderSpaceCapsuleDOS);
|
||||
|
||||
// 计算总订单数
|
||||
int totalOrderSum = orderSpaceCapsuleDOS.size();
|
||||
Date endTime1=DateUtil.offsetSecond(endTime,1);
|
||||
// 计算营业额对比
|
||||
long daysBetween = DateUtil.betweenDay(startTime, endTime1, false);
|
||||
BigDecimal previousTotalMoney = getTotalMoney(carTeenId, DateUtil.offsetDay(startTime, -Math.toIntExact(daysBetween)), DateUtil.offsetDay(endTime, -Math.toIntExact(daysBetween)));
|
||||
BigDecimal compTotalMoney = totalMoney.subtract(previousTotalMoney);
|
||||
String compType = compTotalMoney.compareTo(BigDecimal.ZERO) >= 0 ? "+" : "-";
|
||||
|
||||
// 获取对比数据列表
|
||||
List<OrderSpaceCapsuleStatisticsComVo> compMoney = getComparisonData(carTeenId, startTime, endTime );
|
||||
List<OrderSpaceCapsuleStatisticsComVo> compHour = getComparisonDataHoru(carTeenId,orderSpaceCapsuleDOS );
|
||||
// 构建统计结果对象
|
||||
OrderSpaceCapsuleStatisticsVo vo = new OrderSpaceCapsuleStatisticsVo();
|
||||
vo.setTotalMoney(totalMoney);
|
||||
vo.setTotalHour(totalHour);
|
||||
vo.setCompTotalMoney(compTotalMoney.abs()); // 显示绝对值
|
||||
vo.setCompType(compType);
|
||||
vo.setTotalOrderSum(totalOrderSum);
|
||||
vo.setCompMoney(compMoney);
|
||||
vo.setCompHour(compHour);
|
||||
return vo;
|
||||
}
|
||||
// 获取指定时间范围的订单列表
|
||||
private List<OrderSpaceCapsuleDO> getOrderList(Long carTeenId, Date startTime, Date endTime) {
|
||||
return orderSpaceCapsuleMapper.selectList(
|
||||
new LambdaQueryWrapperX<OrderSpaceCapsuleDO>()
|
||||
.eq(OrderSpaceCapsuleDO::getCarteenId, carTeenId)
|
||||
.between(OrderSpaceCapsuleDO::getCreateTime, startTime, endTime)
|
||||
.eq(OrderSpaceCapsuleDO::getStatus, SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_DONE.getCode())
|
||||
);
|
||||
}
|
||||
// 计算订单列表的总金额
|
||||
private BigDecimal calculateTotalMoney(List<OrderSpaceCapsuleDO> orderSpaceCapsuleDOS) {
|
||||
return orderSpaceCapsuleDOS.stream()
|
||||
.map(OrderSpaceCapsuleDO::getMoney)
|
||||
.filter(Objects::nonNull)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
|
||||
// 计算订单列表的总时长(小时)
|
||||
private BigDecimal calculateTotalHours(List<OrderSpaceCapsuleDO> orderSpaceCapsuleDOS) {
|
||||
if(orderSpaceCapsuleDOS==null){
|
||||
return BigDecimal.ZERO;
|
||||
}
|
||||
return orderSpaceCapsuleDOS.stream()
|
||||
.map(order -> new BigDecimal(order.getComboMinutes() * order.getComboNum()))
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add)
|
||||
.divide(new BigDecimal(60), 2, RoundingMode.HALF_UP); // 转换为小时并保留2位小数
|
||||
}
|
||||
// 获取指定时间范围内的对比数据(时长)
|
||||
private List<OrderSpaceCapsuleStatisticsComVo> getComparisonDataHoru(Long carTeenId,List<OrderSpaceCapsuleDO> orderSpaceCapsuleDOS){
|
||||
Map<String, List<SpaceCapsuleDO>> collect = spaceCapsuleService.getListByCarteenId(carTeenId).stream().collect(Collectors.groupingBy(SpaceCapsuleDO::getSpaceName));
|
||||
Map<Integer, List<OrderSpaceCapsuleDO>> collect1 = orderSpaceCapsuleDOS.stream().collect(Collectors.groupingBy(OrderSpaceCapsuleDO::getPayNum));
|
||||
List<OrderSpaceCapsuleStatisticsComVo> list=new ArrayList<>();
|
||||
for (Map.Entry<String, List<SpaceCapsuleDO>> entry : collect.entrySet()) {
|
||||
OrderSpaceCapsuleStatisticsComVo vo=new OrderSpaceCapsuleStatisticsComVo();
|
||||
vo.setDate(entry.getKey());
|
||||
List<OrderSpaceCapsuleDO> orderSpaceCapsuleDOS1 = collect1.get(entry.getValue().get(0).getPayNum());
|
||||
vo.setTotalMoney(calculateTotalHours(orderSpaceCapsuleDOS1));
|
||||
list.add(vo);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
// 获取指定时间范围内的对比数据(营业额)
|
||||
private List<OrderSpaceCapsuleStatisticsComVo> getComparisonData(Long carTeenId, Date startTime, Date endTime) {
|
||||
List<OrderSpaceCapsuleStatisticsComVo> comparisonData = new ArrayList<>();
|
||||
DateTime currentDate = DateUtil.beginOfDay(startTime);
|
||||
while (!currentDate.isAfter(endTime)) {
|
||||
DateTime nextDate = DateUtil.endOfDay(currentDate);
|
||||
// 获取当天的订单列表并计算总金额或总时长
|
||||
List<OrderSpaceCapsuleDO> dailyOrders = getOrderList(carTeenId, currentDate.toJdkDate(), nextDate.toJdkDate());
|
||||
BigDecimal total = dailyOrders.stream()
|
||||
.map(OrderSpaceCapsuleDO::getMoney)
|
||||
.filter(Objects::nonNull)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
// 创建并添加当天的统计数据
|
||||
OrderSpaceCapsuleStatisticsComVo compVo = new OrderSpaceCapsuleStatisticsComVo();
|
||||
compVo.setDate(currentDate.toString("MM-dd"));
|
||||
compVo.setTotalMoney(total);
|
||||
comparisonData.add(compVo);
|
||||
// 移动到下一天
|
||||
currentDate = DateUtil.offsetDay(currentDate, 1);
|
||||
}
|
||||
|
||||
return comparisonData;
|
||||
}
|
||||
|
||||
private void validateSpaceCapsuleStatus(SpaceCapsuleDO payNum) {
|
||||
if (payNum.getStatus().equals(SpaceCapsuleEnum.SPACE_CAPSULE_ENUM_FAULT.getCode())) {
|
||||
@ -270,19 +401,18 @@ public class OrderSpaceCapsuleServiceImpl implements OrderSpaceCapsuleService {
|
||||
orderSpaceCapsuleDO.setQrCode(qrCode);
|
||||
}
|
||||
}
|
||||
|
||||
public static String createQrCode(String content){
|
||||
// 生成二维码,指定大小
|
||||
BufferedImage qrImage = QrCodeUtil.generate(content, 300, 300);
|
||||
// 转换为 Base64
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
try {
|
||||
ImageIO.write(qrImage, "png", baos);
|
||||
byte[] imageBytes = baos.toByteArray();
|
||||
return Base64.getEncoder().encodeToString(imageBytes);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
// 生成二维码,指定大小
|
||||
BufferedImage qrImage = QrCodeUtil.generate(content, 300, 300);
|
||||
// 转换为 Base64
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
try {
|
||||
ImageIO.write(qrImage, "png", baos);
|
||||
byte[] imageBytes = baos.toByteArray();
|
||||
return Base64.getEncoder().encodeToString(imageBytes);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.member.controller.admin.spacecapsule.vo.SpaceCaps
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.spacecapsule.SpaceCapsuleDO;
|
||||
|
||||
import javax.validation.*;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 太空舱 Service 接口
|
||||
@ -52,6 +53,7 @@ public interface SpaceCapsuleService {
|
||||
* @return 太空舱分页
|
||||
*/
|
||||
PageResult<SpaceCapsuleDO> getSpaceCapsulePage(SpaceCapsulePageReqVO pageReqVO);
|
||||
List<SpaceCapsuleDO> getListByCarteenId(Long carteenId);
|
||||
|
||||
/**
|
||||
* 支付编码查询
|
||||
|
@ -10,6 +10,9 @@ import org.springframework.stereotype.Service;
|
||||
import javax.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.SPACE_CAPSULE_NOT_EXISTS;
|
||||
|
||||
@ -74,6 +77,11 @@ public class SpaceCapsuleServiceImpl implements SpaceCapsuleService {
|
||||
return spaceCapsuleMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SpaceCapsuleDO> getListByCarteenId(Long carteenId) {
|
||||
return spaceCapsuleMapper.selectList(new LambdaQueryWrapperX<SpaceCapsuleDO>().eq(SpaceCapsuleDO::getCarteenId,carteenId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public SpaceCapsuleDO getPayNum(String payNum) {
|
||||
return spaceCapsuleMapper.selectOne(new LambdaQueryWrapperX<SpaceCapsuleDO>()
|
||||
|
Reference in New Issue
Block a user