Pārlūkot izejas kodu

feat : 订单详情接口重写

bilingfeng 2 gadi atpakaļ
vecāks
revīzija
f567f6b398

+ 40 - 0
game-module/game-manage/src/main/java/com/zanxiang/manage/controller/OrderController.java

@@ -0,0 +1,40 @@
+package com.zanxiang.manage.controller;
+
+import com.zanxiang.common.domain.ResultVO;
+import com.zanxiang.erp.security.annotation.PreAuthorize;
+import com.zanxiang.manage.domain.params.OrderParam;
+import com.zanxiang.manage.domain.vo.OrderCompleteListVO;
+import com.zanxiang.manage.domain.vo.OrderListVO;
+import com.zanxiang.manage.service.OrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-11-07
+ * @description : 订单
+ */
+@Api(tags = "游戏订单全量宽表")
+@RestController
+@RequestMapping("/order")
+public class OrderController {
+
+    @Autowired
+    private OrderService orderService;
+
+    @ApiOperation(value = "列表")
+    @PostMapping(value = "/list")
+    @PreAuthorize(permissionKey = "sdk:order:list")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = OrderCompleteListVO.class, responseContainer = "list")})
+    public ResultVO<OrderListVO> list(@Validated @RequestBody OrderParam param) {
+        return ResultVO.ok(orderService.orderList(param));
+    }
+}

+ 92 - 0
game-module/game-manage/src/main/java/com/zanxiang/manage/domain/params/OrderParam.java

@@ -0,0 +1,92 @@
+package com.zanxiang.manage.domain.params;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zanxiang.common.base.BasePage;
+import com.zanxiang.mybatis.entity.Order;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-11-07
+ * @description : 订单
+ */
+@Data
+public class OrderParam extends BasePage<Order> {
+
+    @ApiModelProperty(notes = "订单ID:订单号")
+    private String orderId;
+
+    @ApiModelProperty(notes = "cp订单号")
+    private String cpOrderId;
+
+    @ApiModelProperty(notes = "第三方支付订单号")
+    private String merchantOrderNo;
+
+    @ApiModelProperty(notes = "玩家id")
+    private String userId;
+
+    @ApiModelProperty(notes = "玩家账号")
+    private String username;
+
+    @ApiModelProperty(notes = "游戏角色")
+    private String roleName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(notes = "玩家注册时间-开始")
+    private LocalDate regTimeStart;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(notes = "玩家注册时间-结束")
+    private LocalDate regTimeEnd;
+
+    @ApiModelProperty(notes = "cpId")
+    private String cpId;
+
+    @ApiModelProperty(notes = "注册游戏id")
+    private Long regGameId;
+
+    @ApiModelProperty(notes = "充值游戏id")
+    private String gameId;
+
+    @ApiModelProperty(notes = "注册渠道对应的id")
+    private Long channelId;
+
+    @ApiModelProperty(notes = "归因推广账号")
+    private String accountId;
+
+    @ApiModelProperty(notes = "归因投放人员")
+    private String pitcherId;
+
+    @ApiModelProperty(notes = "操作系统对应的id, 全部 : null或者不传")
+    private String deviceSystem;
+
+    @ApiModelProperty(notes = "是否切量  0 否 1 是")
+    private Integer isSwitch;
+
+    @ApiModelProperty(notes = "产品名称")
+    private String productName;
+
+    @ApiModelProperty(notes = "支付方式Id")
+    private String payWayId;
+
+    @ApiModelProperty(notes = "收款商户号")
+    private String merchantNo;
+
+    @ApiModelProperty(notes = "支付状态,1待支付,2 支付成功,-1 已取消")
+    private Integer status;
+
+    @ApiModelProperty(notes = "CP通知状态,1为待处理,2为成功,-1为失败")
+    private Integer cpStatus;
+
+    @ApiModelProperty(notes = "是否首充 0 否 1 是")
+    private Integer isFirstRecharge;
+
+    @ApiModelProperty(notes = "广告上报状态")
+    private Integer callBackStatus;
+}

+ 47 - 0
game-module/game-manage/src/main/java/com/zanxiang/manage/domain/vo/OrderListVO.java

@@ -0,0 +1,47 @@
+package com.zanxiang.manage.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-11-07
+ * @description : 订单展示
+ */
+@Data
+@NoArgsConstructor
+public class OrderListVO {
+
+    @ApiModelProperty(notes = "订单列表数据")
+    private List<OrderVO> data;
+
+    @ApiModelProperty(notes = "订单统计数据")
+    private Map<String, BigDecimal> totalData;
+
+    @ApiModelProperty(notes = "总数据")
+    private Long total;
+
+    @ApiModelProperty(notes = "每页显示条数")
+    private Long size;
+
+    @ApiModelProperty(notes = "当前页")
+    private Long current;
+
+    @ApiModelProperty(notes = "分页总页数")
+    private Long pages;
+
+    public OrderListVO(Long size) {
+        this.data = Collections.emptyList();
+        this.totalData = Collections.emptyMap();
+        this.total = 0L;
+        this.size = size;
+        this.current = 1L;
+        this.pages = 0L;
+    }
+}

+ 163 - 0
game-module/game-manage/src/main/java/com/zanxiang/manage/domain/vo/OrderVO.java

@@ -0,0 +1,163 @@
+package com.zanxiang.manage.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-11-07
+ * @description : 订单
+ */
+@Data
+public class OrderVO {
+
+    @ApiModelProperty(notes = "主键id")
+    private Long id;
+
+    @ApiModelProperty(notes = "日期")
+    private Long dateTime;
+
+    @ApiModelProperty(notes = "订单ID:订单号")
+    private Long orderId;
+
+    @ApiModelProperty(notes = "cp订单号")
+    private String cpOrderId;
+
+    @ApiModelProperty(notes = "玩家id")
+    private Long userId;
+
+    @ApiModelProperty(notes = "玩家账号")
+    private String username;
+
+    @ApiModelProperty(notes = "注册时间")
+    private LocalDateTime regTime;
+
+    @ApiModelProperty(notes = "充值渠道id")
+    private Long agentId;
+
+    @ApiModelProperty(notes = "充值渠道名称")
+    private String channel;
+
+    @ApiModelProperty(notes = "注册渠道id")
+    private Long regAgentId;
+
+    @ApiModelProperty(notes = "注册渠道名称")
+    private String regChannel;
+
+    @ApiModelProperty(notes = "注册游戏id")
+    private Long regGameId;
+
+    @ApiModelProperty(notes = "注册游戏名称")
+    private Long regGameName;
+
+    @ApiModelProperty(notes = "cpId")
+    private Long cpId;
+
+    @ApiModelProperty(notes = "cp名称")
+    private String cpName;
+
+    @ApiModelProperty(notes = "游戏应用类型id")
+    private Long regGameCategoryId;
+
+    @ApiModelProperty(notes = "游戏应用类型名称")
+    private String regGameCategoryName;
+
+    @ApiModelProperty(notes = "归因投放人员id")
+    private String pitcherId;
+
+    @ApiModelProperty(notes = "归因投放人员名字")
+    private String pitcherName;
+
+    @ApiModelProperty(notes = "归因推广账号id")
+    private Long accountId;
+
+    @ApiModelProperty(notes = "归因推广账号")
+    private String accountName;
+
+    @ApiModelProperty(notes = "归因媒体id")
+    private Long mediaId;
+
+    @ApiModelProperty(notes = "归因媒体名称")
+    private String mediaName;
+
+    @ApiModelProperty(notes = "归因广告id")
+    private String adId;
+
+    @ApiModelProperty(notes = "充值游戏id")
+    private Long gameId;
+
+    @ApiModelProperty(notes = "充值游戏名称")
+    private String gameName;
+
+    @ApiModelProperty(notes = "充值游戏类型")
+    private String gameCategoryId;
+
+    @ApiModelProperty(notes = "充值游戏类型")
+    private String gameCategory;
+
+    @ApiModelProperty(notes = "产品名称")
+    private String productName;
+
+    @ApiModelProperty(notes = "订单金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty(notes = "订单实付金额")
+    private BigDecimal realAmount;
+
+    @ApiModelProperty(notes = "支付方式")
+    private String payWay;
+
+    @ApiModelProperty(notes = "支付场景")
+    private String payDevice;
+
+    @ApiModelProperty(notes = "商户号")
+    private String merchantNo;
+
+    @ApiModelProperty(notes = "商户名称")
+    private String merchantName;
+
+    @ApiModelProperty(notes = "所在服务器名称")
+    private String serverName;
+
+    @ApiModelProperty(notes = "角色名称")
+    private String roleName;
+
+    @ApiModelProperty(notes = "角色等级")
+    private Long roleLevel;
+
+    @ApiModelProperty(notes = "角色VIP")
+    private Long roleVipLevel;
+
+    @ApiModelProperty(notes = "客户端操作系统, android, ios, windows, mac")
+    private String deviceSystem;
+
+    @ApiModelProperty(notes = "是否切量  0 否 1 是")
+    private Integer isSwitch;
+
+    @ApiModelProperty(notes = "创建时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(notes = "支付时间")
+    private LocalDateTime payTime;
+
+    @ApiModelProperty(notes = "订单结束时间")
+    private LocalDateTime endTime;
+
+    @ApiModelProperty(notes = "cp最后通知时间")
+    private LocalDateTime lastCpNotifyTime;
+
+    @ApiModelProperty(notes = "支付状态,1待支付,2 支付成功,-1 已取消")
+    private Integer status;
+
+    @ApiModelProperty(notes = "CP通知状态,1为待处理,2为成功,-1为失败")
+    private Integer cpStatus;
+
+    @ApiModelProperty(notes = "是否首充 0 否 1 是")
+    private Integer isFirstRecharge;
+
+    @ApiModelProperty(notes = "广告上报状态")
+    private Integer callBackStatus;
+}

+ 98 - 4
game-module/game-manage/src/main/java/com/zanxiang/manage/service/Impl/OrderServiceImpl.java

@@ -1,24 +1,35 @@
 package com.zanxiang.manage.service.Impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.common.utils.bean.BeanUtils;
 import com.zanxiang.manage.domain.dto.GameDTO;
 import com.zanxiang.manage.domain.dto.GameUserRoleDTO;
+import com.zanxiang.manage.domain.params.OrderParam;
 import com.zanxiang.manage.domain.params.UserOrderListParam;
 import com.zanxiang.manage.domain.vo.GameCategoryVO;
+import com.zanxiang.manage.domain.vo.OrderListVO;
+import com.zanxiang.manage.domain.vo.OrderVO;
 import com.zanxiang.manage.domain.vo.UserOrderListVO;
-import com.zanxiang.manage.service.GameCategoryService;
-import com.zanxiang.manage.service.GameService;
-import com.zanxiang.manage.service.GameUserRoleService;
-import com.zanxiang.manage.service.OrderService;
+import com.zanxiang.manage.service.*;
 import com.zanxiang.mybatis.entity.Order;
 import com.zanxiang.mybatis.mapper.OrderMapper;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Objects;
+
 /**
  * @author : lingfeng
  * @time : 2022-07-05
@@ -37,6 +48,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     @Autowired
     private GameCategoryService gameCategoryService;
 
+    @Autowired
+    private PromoChannelService promoChannelService;
+
     /**
      * 获取用户下单记录
      *
@@ -81,4 +95,84 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         orderListVO.setGameName(gameDTO.getName());
         return orderListVO;
     }
+
+    /**
+     * 订单列表查询
+     *
+     * @param param : 查询参数
+     * @return : 返回订单列表
+     */
+    @Override
+    public OrderListVO orderList(OrderParam param) {
+        //渠道列表
+        List<Long> agentIdList;
+        if (param.getChannelId() == null) {
+            agentIdList = promoChannelService.listByAccountOrPitcherId(param.getAccountId(), param.getPitcherId());
+        } else {
+            agentIdList = Collections.singletonList(param.getChannelId());
+        }
+        //根据条件, 匹配渠道
+        if (agentIdList != null && agentIdList.isEmpty()) {
+            return new OrderListVO(param.toPage().getSize());
+        }
+        IPage<OrderVO> page = page(param.toPage(), getListWrapper(param, agentIdList, "*")).convert(this::orderToVo);
+        if (page.getTotal() == 0) {
+            return new OrderListVO(param.toPage().getSize());
+        }
+        //统计:订单金额与实付金额
+        Order total = super.getOne(getListWrapper(param, agentIdList, "IFNULL(SUM(order_amount),0) orderAmount, IFNULL(SUM(real_amount),0) realAmount"));
+        HashMap<String, BigDecimal> totalData = new HashMap<>();
+        if (total == null) {
+            totalData.put("totalOrderAmount", new BigDecimal("0.00"));
+            totalData.put("totalRealAmount", new BigDecimal("0.00"));
+        } else {
+            totalData.put("totalOrderAmount", total.getAmount());
+            totalData.put("totalRealAmount", total.getRealAmount());
+        }
+        OrderListVO orderListVO = new OrderListVO();
+        orderListVO.setTotal(page.getTotal());
+        orderListVO.setSize(page.getSize());
+        orderListVO.setCurrent(page.getCurrent());
+        orderListVO.setPages(page.getPages());
+        orderListVO.setData(page.getRecords());
+        orderListVO.setTotalData(totalData);
+        return orderListVO;
+
+    }
+
+    private LambdaQueryWrapper<Order> getListWrapper(OrderParam param, List<Long> agentIdList, String select) {
+        return new QueryWrapper<Order>().select(select).lambda()
+                .eq(Strings.isNotBlank(param.getOrderId()), Order::getId, param.getOrderId())
+                .eq(Strings.isNotBlank(param.getCpOrderId()), Order::getCpOrderId, param.getCpOrderId())
+                .eq(Strings.isNotBlank(param.getMerchantOrderNo()), Order::getMerchantOrderNo, param.getMerchantOrderNo())
+                .eq(Strings.isNotBlank(param.getUserId()), Order::getUserId, param.getUserId())
+                .eq(Strings.isNotBlank(param.getUsername()), Order::getUsername, param.getUsername())
+                .eq(Strings.isNotBlank(param.getRoleName()), Order::getRoleName, param.getRoleName())
+                .ge(param.getRegTimeStart() != null, Order::getRegTime, param.getRegTimeStart() == null ? null : LocalDateTime.of(param.getRegTimeStart(), LocalTime.MIN))
+                .le(param.getRegTimeEnd() != null, Order::getRegTime, param.getRegTimeEnd() == null ? null : LocalDateTime.of(param.getRegTimeEnd(), LocalTime.MAX))
+                .eq(param.getCpId() != null, Order::getCpId, param.getCpId())
+                .eq(param.getRegGameId() != null, Order::getRegGameId, param.getRegGameId())
+                .eq(param.getGameId() != null, Order::getGameId, param.getGameId())
+                .in(CollectionUtils.isNotEmpty(agentIdList), Order::getAgentId, agentIdList)
+                .eq(Strings.isNotBlank(param.getDeviceSystem()), Order::getDeviceSystem, param.getDeviceSystem())
+                .eq(param.getIsSwitch() != null, Order::getIsSwitch, param.getIsSwitch())
+                .eq(Strings.isNotBlank(param.getProductName()), Order::getProductName, param.getProductName())
+                .eq(Strings.isNotBlank(param.getPayWayId()), Order::getPayWayId, param.getPayWayId())
+                .eq(Strings.isNotBlank(param.getMerchantNo()), Order::getMerchantNo, param.getMerchantNo())
+                .eq(param.getStatus() != null, Order::getStatus, param.getStatus())
+                .eq(param.getCpStatus() != null, Order::getCpStatus, param.getCpStatus())
+                .eq(param.getIsFirstRecharge() != null, Order::getIsFirstRecharge, param.getIsFirstRecharge())
+                .eq(param.getCallBackStatus() != null, Order::getCallBackStatus, param.getCallBackStatus())
+                .ge(param.getBeginDate() != null, Order::getCreateTime, param.getBeginDate() == null ? null : LocalDateTime.of(param.getBeginDate(), LocalTime.MIN))
+                .le(param.getEndDate() != null, Order::getCreateTime, param.getEndDate() == null ? null : LocalDateTime.of(param.getEndDate(), LocalTime.MAX))
+                .orderByDesc(Order::getCreateTime);
+    }
+
+
+    private OrderVO orderToVo(Order order) {
+        if (Objects.isNull(order)) {
+            return null;
+        }
+        return BeanUtils.copy(order, OrderVO.class);
+    }
 }

+ 10 - 0
game-module/game-manage/src/main/java/com/zanxiang/manage/service/OrderService.java

@@ -2,7 +2,9 @@ package com.zanxiang.manage.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.manage.domain.params.OrderParam;
 import com.zanxiang.manage.domain.params.UserOrderListParam;
+import com.zanxiang.manage.domain.vo.OrderListVO;
 import com.zanxiang.manage.domain.vo.UserOrderListVO;
 import com.zanxiang.mybatis.entity.Order;
 
@@ -20,4 +22,12 @@ public interface OrderService extends IService<Order> {
      * @return : 返回单页数据
      */
     IPage<UserOrderListVO> orderList(UserOrderListParam param);
+
+    /**
+     * 订单列表查询
+     *
+     * @param param : 查询参数
+     * @return : 返回订单列表
+     */
+    OrderListVO orderList(OrderParam param);
 }

+ 24 - 13
game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/entity/GamePayWay.java

@@ -53,6 +53,26 @@ public class GamePayWay {
      */
     private Integer status;
 
+    /**
+     * 商户号主键id
+     */
+    private Long payMerchantId;
+
+    /**
+     * 商户号
+     */
+    private String merchantNo;
+
+    /**
+     * 商户名称
+     */
+    private String merchantName;
+
+    /**
+     * 支付盒子id
+     */
+    private Long payBoxId;
+
     /**
      * 支付配置json (存储根据payway设置后,配置的具体商户号信息)
      */
@@ -73,26 +93,16 @@ public class GamePayWay {
      */
     private BigDecimal currentPayAmount;
 
-    /**
-     * 是否已删除 1 已删除 0 正常
-     */
-    @TableLogic
-    private Integer isDelete;
-
     /**
      * 备注
      */
     private String remark;
 
     /**
-     * 支付盒子id
-     */
-    private Long payBoxId;
-
-    /**
-     * 支付商户号id
+     * 是否已删除 1 已删除 0 正常
      */
-    private Long payMerchantId;
+    @TableLogic
+    private Integer isDelete;
 
     /**
      * 删除时间
@@ -108,4 +118,5 @@ public class GamePayWay {
      * 更新时间
      */
     private LocalDateTime updateTime;
+
 }

+ 40 - 0
game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/entity/Order.java

@@ -239,4 +239,44 @@ public class Order {
      */
     private LocalDateTime updateTime;
 
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 用户注册时间
+     */
+    private LocalDateTime regTime;
+
+    /**
+     * 客户端操作系统, android, ios, windows, mac
+     */
+    private String deviceSystem;
+
+    /**
+     * 商户号
+     */
+    private String merchantNo;
+
+    /**
+     * 商户名称
+     */
+    private String merchantName;
+
+    /**
+     * 支付方式id
+     */
+    private Integer payWayId;
+
+    /**
+     * 注册游戏id
+     */
+    private Long regGameId;
+
+    /**
+     * 广告上报状态
+     */
+    private Integer callBackStatus;
+
 }