diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java index 10f6d4ff..64dd93aa 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java @@ -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, "超市营业统计不存在"); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleAdminVo.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleAdminVo.java index 92b45193..ef1727ba 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleAdminVo.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleAdminVo.java @@ -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; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleSaveReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleSaveReqVO.java index 4221d49e..d8e6e035 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleSaveReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleSaveReqVO.java @@ -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; /** * 退款金额 diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleStatisticsComVo.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleStatisticsComVo.java new file mode 100644 index 00000000..9757eeb7 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleStatisticsComVo.java @@ -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; +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleStatisticsVo.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleStatisticsVo.java new file mode 100644 index 00000000..1838f759 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleStatisticsVo.java @@ -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 compMoney; + @Schema(description = "使用时长对比") + private List compHour; +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/orderspacecapsule/AppOrderSpaceCapsuleController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/orderspacecapsule/AppOrderSpaceCapsuleController.java index 9615b6bc..366d3aa8 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/orderspacecapsule/AppOrderSpaceCapsuleController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/orderspacecapsule/AppOrderSpaceCapsuleController.java @@ -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 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)); + } } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/OrderSpaceCapsuleJob.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/OrderSpaceCapsuleJob.java new file mode 100644 index 00000000..19c74a16 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/OrderSpaceCapsuleJob.java @@ -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 + * @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 orderSpaceCapsuleDOS = orderSpaceCapsuleMapper.selectList(new LambdaQueryWrapperX() + .eq(OrderSpaceCapsuleDO::getStatus, SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_IN_USE.getCode())); + if(orderSpaceCapsuleDOS==null){ + log.info("订单还在有效期内"); + return "太空舱订单扣款,订单还在有效期内"; + } + //获得到需要扣款的数据 + List 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(); + } +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderspacecapsule/OrderSpaceCapsuleService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderspacecapsule/OrderSpaceCapsuleService.java index 9cee2fd0..2d1a4803 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderspacecapsule/OrderSpaceCapsuleService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderspacecapsule/OrderSpaceCapsuleService.java @@ -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); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderspacecapsule/OrderSpaceCapsuleServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderspacecapsule/OrderSpaceCapsuleServiceImpl.java index bc5c6537..e02afbda 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderspacecapsule/OrderSpaceCapsuleServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderspacecapsule/OrderSpaceCapsuleServiceImpl.java @@ -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() + .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 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 compMoney = getComparisonData(carTeenId, startTime, endTime ); + List 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 getOrderList(Long carTeenId, Date startTime, Date endTime) { + return orderSpaceCapsuleMapper.selectList( + new LambdaQueryWrapperX() + .eq(OrderSpaceCapsuleDO::getCarteenId, carTeenId) + .between(OrderSpaceCapsuleDO::getCreateTime, startTime, endTime) + .eq(OrderSpaceCapsuleDO::getStatus, SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_DONE.getCode()) + ); + } + // 计算订单列表的总金额 + private BigDecimal calculateTotalMoney(List orderSpaceCapsuleDOS) { + return orderSpaceCapsuleDOS.stream() + .map(OrderSpaceCapsuleDO::getMoney) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + // 计算订单列表的总时长(小时) + private BigDecimal calculateTotalHours(List 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 getComparisonDataHoru(Long carTeenId,List orderSpaceCapsuleDOS){ + Map> collect = spaceCapsuleService.getListByCarteenId(carTeenId).stream().collect(Collectors.groupingBy(SpaceCapsuleDO::getSpaceName)); + Map> collect1 = orderSpaceCapsuleDOS.stream().collect(Collectors.groupingBy(OrderSpaceCapsuleDO::getPayNum)); + List list=new ArrayList<>(); + for (Map.Entry> entry : collect.entrySet()) { + OrderSpaceCapsuleStatisticsComVo vo=new OrderSpaceCapsuleStatisticsComVo(); + vo.setDate(entry.getKey()); + List orderSpaceCapsuleDOS1 = collect1.get(entry.getValue().get(0).getPayNum()); + vo.setTotalMoney(calculateTotalHours(orderSpaceCapsuleDOS1)); + list.add(vo); + } + return list; + } + // 获取指定时间范围内的对比数据(营业额) + private List getComparisonData(Long carTeenId, Date startTime, Date endTime) { + List comparisonData = new ArrayList<>(); + DateTime currentDate = DateUtil.beginOfDay(startTime); + while (!currentDate.isAfter(endTime)) { + DateTime nextDate = DateUtil.endOfDay(currentDate); + // 获取当天的订单列表并计算总金额或总时长 + List 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; + } } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleService.java index 78b9d471..ffd31a95 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleService.java @@ -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 getSpaceCapsulePage(SpaceCapsulePageReqVO pageReqVO); + List getListByCarteenId(Long carteenId); /** * 支付编码查询 diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleServiceImpl.java index 26f0d817..fa615eee 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleServiceImpl.java @@ -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 getListByCarteenId(Long carteenId) { + return spaceCapsuleMapper.selectList(new LambdaQueryWrapperX().eq(SpaceCapsuleDO::getCarteenId,carteenId)); + } + @Override public SpaceCapsuleDO getPayNum(String payNum) { return spaceCapsuleMapper.selectOne(new LambdaQueryWrapperX()