Kaynağa Gözat

修改扫码行为、交易行为、订单添加逻辑

云殇忆 1 yıl önce
ebeveyn
işleme
d04766f3d7
20 değiştirilmiş dosya ile 292 ekleme ve 130 silme
  1. 3 0
      ruoyi-demo/src/main/java/com/ruoyi/demo/controller/DlUserController.java
  2. 3 0
      ruoyi-demo/src/main/java/com/ruoyi/demo/controller/GoodsController.java
  3. 4 0
      ruoyi-demo/src/main/java/com/ruoyi/demo/controller/OrderController.java
  4. 24 0
      ruoyi-demo/src/main/java/com/ruoyi/demo/controller/PlanController.java
  5. 4 1
      ruoyi-demo/src/main/java/com/ruoyi/demo/controller/StatisticsController.java
  6. 8 8
      ruoyi-demo/src/main/java/com/ruoyi/demo/entity/DlUser.java
  7. 5 12
      ruoyi-demo/src/main/java/com/ruoyi/demo/entity/Order.java
  8. 32 10
      ruoyi-demo/src/main/java/com/ruoyi/demo/entity/Statistics.java
  9. 7 28
      ruoyi-demo/src/main/java/com/ruoyi/demo/entity/bo/OrderAddBo.java
  10. 1 22
      ruoyi-demo/src/main/java/com/ruoyi/demo/entity/bo/StatisticsAddBo.java
  11. 5 0
      ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/ExposureMapper.java
  12. 5 0
      ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/PlanItemMapper.java
  13. 11 0
      ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/StatisticsMapper.java
  14. 2 0
      ruoyi-demo/src/main/java/com/ruoyi/demo/service/PlanService.java
  15. 45 15
      ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/OrderServiceImpl.java
  16. 46 4
      ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/PlanServiceImpl.java
  17. 22 30
      ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/StatisticsServiceImpl.java
  18. 18 0
      ruoyi-demo/src/main/resources/mapper/demo/ExposureMapper.xml
  19. 7 0
      ruoyi-demo/src/main/resources/mapper/demo/PlanItemMapper.xml
  20. 40 0
      ruoyi-demo/src/main/resources/mapper/demo/StatisticsMapper.xml

+ 3 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/DlUserController.java

@@ -14,6 +14,9 @@ public class DlUserController {
 
     @PostMapping("/list")
     public R list(@RequestBody PlanBo bo){
+        if (bo.getStartTime() != null && bo.getEndTime() != null)
+            if (bo.getStartTime().compareTo(bo.getEndTime()) > 0)
+                return R.fail("起始时间不能大于结束时间");
         return R.ok(dlUserService.getList(bo));
     }
 }

+ 3 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/GoodsController.java

@@ -35,6 +35,9 @@ public class GoodsController {
 
     @PostMapping("/list")
     public R goodsList(@RequestBody PlanBo bo){
+        if (bo.getStartTime() != null && bo.getEndTime() != null)
+            if (bo.getStartTime().compareTo(bo.getEndTime()) > 0)
+                return R.fail("起始时间不能大于结束时间");
         return R.ok(goodsService.getGoodsList(bo));
     }
 

+ 4 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/OrderController.java

@@ -38,8 +38,12 @@ public class OrderController {
         return R.fail("添加失败");
     }
 
+    // 查询订单列表
     @PostMapping("/list")
     public R orderList(@RequestBody PlanBo bo){
+        if (bo.getStartTime() != null && bo.getEndTime() != null)
+            if (bo.getStartTime().compareTo(bo.getEndTime()) > 0)
+                return R.fail("起始时间不能大于结束时间");
         return R.ok(orderService.getOrderList(bo));
     }
 }

+ 24 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/PlanController.java

@@ -42,6 +42,9 @@ public class PlanController {
     // 查询广告计划列表
     @PostMapping("/list")
     public R planList(@RequestBody PlanBo bo){
+        if (bo.getStartTime() != null && bo.getEndTime() != null)
+            if (bo.getStartTime().compareTo(bo.getEndTime()) > 0)
+                return R.fail("起始时间不能大于结束时间");
         PageInfo<List<PlanListVo>> planList = planService.getPlanList(bo);
         return R.ok(planList);
     }
@@ -86,6 +89,9 @@ public class PlanController {
     // 查询广告计划管理列表
     @PostMapping("/audit/list")
     public R auditList(@RequestBody PlanBo bo){
+        if (bo.getStartTime() != null && bo.getEndTime() != null)
+            if (bo.getStartTime().compareTo(bo.getEndTime()) > 0)
+                return R.fail("起始时间不能大于结束时间");
         PageInfo<List<PlanManageListVo>> list = planService.getPlanManageList(bo);
         return R.ok(list);
     }
@@ -99,6 +105,9 @@ public class PlanController {
     // 获取sign——用于测试
     @PostMapping("/getSign")
     public R getSign(@RequestBody PlanAddBo bo){
+        if (bo.getPlanStartTime() != null && bo.getPlanEndTime() != null)
+            if (bo.getPlanStartTime().compareTo(bo.getPlanEndTime()) > 0)
+                return R.fail("起始时间不能大于结束时间");
         String sign = planService.getSign(bo);
         if (sign.equals("error"))
             return R.fail("无效的appkey");
@@ -107,6 +116,9 @@ public class PlanController {
     // 添加广告推送计划
     @PostMapping()
     public R addPlan(@RequestBody @Validated(value = {AddGroup.class}) PlanAddBo bo){
+        if (bo.getPlanStartTime() != null && bo.getPlanEndTime() != null)
+            if (bo.getPlanStartTime().compareTo(bo.getPlanEndTime()) > 0)
+                return R.fail("起始时间不能大于结束时间");
         int i = planService.addPlan(bo);
         if (i == 1)
             return R.ok("广告添加成功");
@@ -127,6 +139,9 @@ public class PlanController {
     // 查询广告计划推送计划列表
     @PostMapping("/push/list")
     public R pushList(@RequestBody PlanBo bo){
+        if (bo.getStartTime() != null && bo.getEndTime() != null)
+            if (bo.getStartTime().compareTo(bo.getEndTime()) > 0)
+                return R.fail("起始时间不能大于结束时间");
         PageInfo<List<PlanPushListVo>> list = planService.getPlanPushList(bo);
         return R.ok(list);
     }
@@ -136,9 +151,18 @@ public class PlanController {
     // 广告投放列表
     @PostMapping("/statistics/list")
     public R statisticsList(@RequestBody PlanBo bo){
+        if (bo.getStartTime() != null && bo.getEndTime() != null)
+            if (bo.getStartTime().compareTo(bo.getEndTime()) > 0)
+                return R.fail("起始时间不能大于结束时间");
         PageInfo<List<PlanPushStatisticsListVo>> list = planService.getPlanPushStatisticsList(bo);
         return R.ok(list);
     }
+    // 立刻进行一次统计——用于测试
+    @GetMapping("/statistics/start")
+    public R statisticsStart(){
+        planService.planPushStatisticsStart();
+        return R.ok("更新完成");
+    }
 
     // 首页
     // 获取总广告数

+ 4 - 1
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/StatisticsController.java

@@ -19,6 +19,9 @@ public class StatisticsController {
     // 获取扫描日志
     @PostMapping("/scanList")
     public R scanList(@RequestBody PlanBo bo){
+        if (bo.getStartTime() != null && bo.getEndTime() != null)
+            if (bo.getStartTime().compareTo(bo.getEndTime()) > 0)
+                return R.fail("起始时间不能大于结束时间");
         return R.ok(statisticsService.getScanList(bo));
     }
 
@@ -37,7 +40,7 @@ public class StatisticsController {
         return R.ok(sign);
     }
 
-    // 添加行为记录
+    // 添加扫码行为记录
     @PostMapping()
     public R add(@RequestBody @Validated(value = {AddGroup.class}) StatisticsAddBo bo){
         int i = statisticsService.add(bo);

+ 8 - 8
ruoyi-demo/src/main/java/com/ruoyi/demo/entity/DlUser.java

@@ -54,18 +54,18 @@ public class DlUser {
     private int deleted;
 
     public DlUser(){}
-    public DlUser(StatisticsAddBo s){
+    public DlUser(StatisticsAddBo s,Equipment equipment){
         this.userId = s.getUserId();
         this.userName = s.getUserName();
         this.userTelephone = s.getUserTelephone();
-        this.startEquipmentId = s.getEquipmentId();
-        this.startEquipmentName = s.getEquipmentName();
-        this.startEquipmentCode = s.getEquipmentCode();
+        this.startEquipmentId = equipment.getEquipmentId();
+        this.startEquipmentName = equipment.getEquipmentName();
+        this.startEquipmentCode = equipment.getEquipmentCode();
         this.startTime = s.getTime();
-        this.endEquipmentId = s.getEquipmentId();
-        this.endEquipmentName = s.getEquipmentName();
-        this.endEquipmentCode = s.getEquipmentCode();
+        this.endEquipmentId = equipment.getEquipmentId();
+        this.endEquipmentName = equipment.getEquipmentName();
+        this.endEquipmentCode = equipment.getEquipmentCode();
         this.endTime = s.getTime();
-        this.totalPrice = s.getDealToolPrice();
+        this.totalPrice = Float.valueOf(0);
     }
 }

+ 5 - 12
ruoyi-demo/src/main/java/com/ruoyi/demo/entity/Order.java

@@ -43,10 +43,6 @@ public class Order {
     private String userName;
     @TableField("user_telephone")
     private String userTelephone;
-//    @TableField("commercial_id")
-//    private String commercialId;
-//    @TableField("commercial_name")
-//    private String commercialName;
     @TableField("appkey")
     private String appkey;
     @TableField("app_name")
@@ -60,7 +56,8 @@ public class Order {
     @TableField("deleted")
     private int deleted;
 
-    public Order (OrderAddBo bo){
+    public Order() {}
+    public Order (OrderAddBo bo, App app){
         this.orderId = bo.getOrderId();
         this.vendorId = bo.getVendorId();
         this.vendorName = bo.getVendorName();
@@ -68,18 +65,14 @@ public class Order {
         this.goodsName = bo.getGoodsName();
         this.goodsPrice = bo.getGoodsPrice();
         this.specs = bo.getSpecs();
-        this.totalPrice = bo.getTotalPrice();
+        this.totalPrice = bo.getDealCount() * bo.getGoodsPrice();
         this.state = bo.getState();
         this.userId = bo.getUserId();
         this.userName = bo.getUserName();
         this.userTelephone = bo.getUserTelephone();
-//        this.commercialId = bo.getCommercialId();
-//        this.commercialName = bo.getCommercialName();
         this.appkey = bo.getAppkey();
-        this.appName = bo.getAppName();
-        this.createTime = bo.getCreateTime();
+        this.appName = app.getAppName();
+        this.createTime = bo.getTime();
     }
 
-    public Order() {
-    }
 }

+ 32 - 10
ruoyi-demo/src/main/java/com/ruoyi/demo/entity/Statistics.java

@@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import com.ruoyi.demo.entity.bo.OrderAddBo;
 import com.ruoyi.demo.entity.bo.StatisticsAddBo;
 import lombok.Data;
 
@@ -64,22 +65,43 @@ public class Statistics {
     @TableField("deleted")
     private int deleted;
 
-    public Statistics (StatisticsAddBo bo){
+    public Statistics (){}
+    // 客户扫码时调用
+    public Statistics (StatisticsAddBo bo, Plan plan, Equipment equipment){
         this.planId = bo.getPlanId();
-        this.planName = bo.getPlanName();
+        this.planName = plan.getPlanName();
         this.appkey = bo.getAppkey();
-        this.equipmentId = bo.getEquipmentId();
+        this.equipmentId = equipment.getEquipmentId();
         this.equipmentCode = bo.getEquipmentCode();
-        this.equipmentName = bo.getEquipmentName();
-        this.addrInfo = bo.getAddrInfo();
-        this.goodsId = bo.getGoodsId();
-        this.goodsName = bo.getGoodsName();
-        this.dealToolCount = bo.getDealToolCount();
-        this.dealToolPrice = bo.getDealToolPrice();
+        this.equipmentName = equipment.getEquipmentName();
+        this.addrInfo = equipment.getAddrInfo();
+        this.goodsId = plan.getGoodsId();
+        this.goodsName = plan.getGoodsName();
+        this.dealToolCount = 0;
+        this.dealToolPrice = Float.valueOf(0);
         this.userId = bo.getUserId();
         this.userName = bo.getUserName();
         this.userTelephone = bo.getUserTelephone();
-        this.behavior = bo.getBehavior();
+        this.behavior = 0;
+        this.time = bo.getTime();
+    }
+    // 客户交易时调用
+    public Statistics (OrderAddBo bo, Plan plan, Equipment equipment){
+        this.planId = bo.getPlanId();
+        this.planName = plan.getPlanName();
+        this.appkey = bo.getAppkey();
+        this.equipmentId = equipment.getEquipmentId();
+        this.equipmentCode = bo.getEquipmentCode();
+        this.equipmentName = equipment.getEquipmentName();
+        this.addrInfo = equipment.getAddrInfo();
+        this.goodsId = plan.getGoodsId();
+        this.goodsName = plan.getGoodsName();
+        this.dealToolCount = bo.getDealCount();
+        this.dealToolPrice = bo.getGoodsPrice()*bo.getDealCount();
+        this.userId = bo.getUserId();
+        this.userName = bo.getUserName();
+        this.userTelephone = bo.getUserTelephone();
+        this.behavior = 1;
         this.time = bo.getTime();
     }
 }

+ 7 - 28
ruoyi-demo/src/main/java/com/ruoyi/demo/entity/bo/OrderAddBo.java

@@ -5,46 +5,25 @@ import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
-import java.time.LocalDateTime;
 
 @Data
-public class OrderAddBo {
+public class OrderAddBo extends StatisticsAddBo {
     @NotBlank(groups = {AddGroup.class},message = "订单编号不能为空")
     private String orderId;
-
-    @NotBlank(groups = {AddGroup.class},message = "供应商Id不能为空")
-    private String vendorId;
-    @NotBlank(groups = {AddGroup.class},message = "供应商名称不能为空")
-    private String vendorName;
-
     @NotBlank(groups = {AddGroup.class},message = "商品Id不能为空")
     private String goodsId;
     @NotBlank(groups = {AddGroup.class},message = "商品名称不能为空")
     private String goodsName;
+    @NotBlank(groups = {AddGroup.class},message = "供应商Id不能为空")
+    private String vendorId;
+    @NotBlank(groups = {AddGroup.class},message = "供应商名称不能为空")
+    private String vendorName;
     @NotBlank(groups = {AddGroup.class},message = "规格不能为空")
     private String specs;
     @NotNull(groups = {AddGroup.class},message = "商品价格不能为空")
     private Float goodsPrice;
-    @NotNull(groups = {AddGroup.class},message = "订单总金额不能为空")
-    private Float totalPrice;
+    @NotNull(groups = {AddGroup.class},message = "交易数量不能为空")
+    private Integer dealCount;
     @NotBlank(groups = {AddGroup.class},message = "交易状态不能为空")
     private String state;
-    @NotBlank(groups = {AddGroup.class},message = "客户Id不能为空")
-    private String userId;
-    @NotBlank(groups = {AddGroup.class},message = "客户姓名不能为空")
-    private String userName;
-    @NotBlank(groups = {AddGroup.class},message = "客户联系方式不能为空")
-    private String userTelephone;
-//    @NotBlank(groups = {AddGroup.class},message = "商户Id不能为空")
-//    private String commercialId;
-//    @NotBlank(groups = {AddGroup.class},message = "商户名称不能为空")
-//    private String commercialName;
-    @NotBlank(groups = {AddGroup.class},message = "appkey不能为空")
-    private String appkey;
-    @NotBlank(groups = {AddGroup.class},message = "小程序名称不能为空")
-    private String appName;
-    @NotNull(groups = {AddGroup.class},message = "订单成交时间不能为空")
-    private LocalDateTime createTime;
-    @NotBlank(groups = {AddGroup.class},message = "签名不能为空")
-    private String sign;
 }

+ 1 - 22
ruoyi-demo/src/main/java/com/ruoyi/demo/entity/bo/StatisticsAddBo.java

@@ -11,38 +11,17 @@ import java.time.LocalDateTime;
 public class StatisticsAddBo {
     @NotBlank(groups = {AddGroup.class},message = "计划Id不能为空")
     private String planId;
-    @NotBlank(groups = {AddGroup.class},message = "计划名称不能为空")
-    private String planName;
-
     @NotBlank(groups = {AddGroup.class},message = "appkey不能为空")
     private String appkey;
-    @NotBlank(groups = {AddGroup.class},message = "设备Id不能为空")
-    private String equipmentId;
-    @NotBlank(groups = {AddGroup.class},message = "设备名称不能为空")
-    private String equipmentName;
     @NotBlank(groups = {AddGroup.class},message = "设备编号不能为空")
     private String equipmentCode;
-
-    @NotBlank(groups = {AddGroup.class},message = "地址信息不能为空")
-    private String addrInfo;
-
-//    @NotBlank(groups = {AddGroup.class},message = "商品Id不能为空")
-    private String goodsId;
-//    @NotBlank(groups = {AddGroup.class},message = "商品名称不能为空")
-    private String goodsName;
-    @NotNull(groups = {AddGroup.class},message = "交易总数不能为空")
-    private Integer dealToolCount;
-    @NotNull(groups = {AddGroup.class},message = "交易总金额不能为空")
-    private Float dealToolPrice;
     @NotBlank(groups = {AddGroup.class},message = "客户Id不能为空")
     private String userId;
     @NotBlank(groups = {AddGroup.class},message = "客户姓名不能为空")
     private String userName;
     @NotBlank(groups = {AddGroup.class},message = "客户联系方式不能为空")
     private String userTelephone;
-    @NotNull(groups = {AddGroup.class},message = "行为不能为空")
-    private Integer behavior;
-    @NotNull(groups = {AddGroup.class},message = "交易时间不能为空")
+    @NotNull(groups = {AddGroup.class},message = "时间不能为空")
     private LocalDateTime time;
     @NotBlank(groups = {AddGroup.class},message = "签名不能为空")
     private String sign;

+ 5 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/ExposureMapper.java

@@ -3,7 +3,12 @@ package com.ruoyi.demo.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.demo.entity.Exposure;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 @Mapper
 public interface ExposureMapper extends BaseMapper<Exposure> {
+    // 根据itemId求和曝光次数
+    Integer selectTotalCountByItemIds(@Param("itemIds") List<String> itemIds);
 }

+ 5 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/PlanItemMapper.java

@@ -10,6 +10,8 @@ import com.ruoyi.demo.entity.bo.PlanItemBo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 @Mapper
 public interface PlanItemMapper extends BaseMapper<PlanItem> {
     Integer selectEquipmentCountByPlanId(@Param("planId") String planId);
@@ -17,4 +19,7 @@ public interface PlanItemMapper extends BaseMapper<PlanItem> {
     IPage<PlanItemBo> getEuipmentPlanList(IPage<?> pag, @Param(Constants.WRAPPER) Wrapper<PlanItemBo> queryWrapper);
 
     Integer getEuipmentPlanCont(@Param(Constants.WRAPPER) QueryWrapper<PlanItemBo> queryWrapper);
+
+    //根据设备编号获取所有相关itemId
+    List<String> getItemIdsByCode(@Param("equipmentCode") String equipmentCode);
 }

+ 11 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/StatisticsMapper.java

@@ -3,8 +3,19 @@ package com.ruoyi.demo.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.demo.entity.Statistics;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 @Mapper
 public interface StatisticsMapper extends BaseMapper<Statistics> {
     Integer selectTotal();
+    // 累计用户
+    List<String> selectUserIdsByEquipmentCode(@Param("equipmentCode") String equipmentCode);
+    // 累计扫码
+    Integer selectScanByEquipmentCode(@Param("equipmentCode") String equipmentCode);
+    // 累计交易
+    Integer selectDealCountByEquipmentCode(@Param("equipmentCode") String equipmentCode);
+    // 累计收入
+    Float selectTotalPriceByEquipmentCode(@Param("equipmentCode") String equipmentCode);
 }

+ 2 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/service/PlanService.java

@@ -26,6 +26,8 @@ public interface PlanService {
     PlanManageDetailVo getPlanManageDetail(String planId);
     PageInfo<List<PlanPushListVo>> getPlanPushList(PlanBo bo);
     PageInfo<List<PlanPushStatisticsListVo>> getPlanPushStatisticsList(PlanBo bo);
+    void planPushStatisticsStart();
+
     PlanHomeVo getPlanTotal();
     List<AddrCategory> getAddrCategoryLevel(String code,String level);
     List<AddrCategory> getAddrCategory();

+ 45 - 15
ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/OrderServiceImpl.java

@@ -4,12 +4,10 @@ import cn.hutool.core.lang.Dict;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.ruoyi.demo.entity.App;
-import com.ruoyi.demo.entity.Order;
+import com.ruoyi.demo.entity.*;
 import com.ruoyi.demo.entity.bo.OrderAddBo;
 import com.ruoyi.demo.entity.bo.PlanBo;
-import com.ruoyi.demo.mapper.AppMapper;
-import com.ruoyi.demo.mapper.OrderMapper;
+import com.ruoyi.demo.mapper.*;
 import com.ruoyi.demo.service.OrderService;
 import com.ruoyi.demo.utils.SignUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,7 +24,16 @@ public class OrderServiceImpl implements OrderService {
     OrderMapper orderMapper;
     @Autowired
     AppMapper appMapper;
+    @Autowired
+    StatisticsMapper statisticsMapper;
+    @Autowired
+    PlanMapper planMapper;
+    @Autowired
+    EquipmentMapper equipmentMapper;
+    @Autowired
+    DlUserMapper dlUserMapper;
 
+    // 获取sign——用于测试
     @Override
     public String getSign(OrderAddBo bo) {
         QueryWrapper<App> appQueryWrapper = new QueryWrapper<>();
@@ -35,16 +42,14 @@ public class OrderServiceImpl implements OrderService {
         if (app == null)
             return "error";
         Map<String,Object> params = Dict.create()
-            .set("appName",bo.getAppName())
             .set("appkey",bo.getAppkey())
-//            .set("commercialId",bo.getCommercialId())
-//            .set("commercialName",bo.getCommercialName())
-            .set("createTime",bo.getCreateTime())
+            .set("createTime",bo.getTime())
+            .set("dealCount",bo.getDealCount())
+            .set("equipmentCode",bo.getEquipmentCode())
             .set("goodsId",bo.getGoodsId())
             .set("goodsName",bo.getGoodsName())
             .set("goodsPrice",bo.getGoodsPrice())
             .set("orderId",bo.getOrderId())
-            .set("totalPrice",bo.getTotalPrice())
             .set("userId",bo.getUserId())
             .set("userName",bo.getUserName())
             .set("userTelephone",bo.getUserTelephone())
@@ -56,6 +61,7 @@ public class OrderServiceImpl implements OrderService {
         return SignUtil.sign(params,app.getAppSecret());
     }
 
+    // 添加订单
     @Override
     public int addOrder(OrderAddBo bo) {
         QueryWrapper<App> appQueryWrapper = new QueryWrapper<>();
@@ -64,16 +70,14 @@ public class OrderServiceImpl implements OrderService {
         if (app == null)
             return -1;
         Map<String,Object> params = Dict.create()
-            .set("appName",bo.getAppName())
             .set("appkey",bo.getAppkey())
-//            .set("commercialId",bo.getCommercialId())
-//            .set("commercialName",bo.getCommercialName())
-            .set("createTime",bo.getCreateTime())
+            .set("createTime",bo.getTime())
+            .set("dealCount",bo.getDealCount())
+            .set("equipmentCode",bo.getEquipmentCode())
             .set("goodsId",bo.getGoodsId())
             .set("goodsName",bo.getGoodsName())
             .set("goodsPrice",bo.getGoodsPrice())
             .set("orderId",bo.getOrderId())
-            .set("totalPrice",bo.getTotalPrice())
             .set("userId",bo.getUserId())
             .set("userName",bo.getUserName())
             .set("userTelephone",bo.getUserTelephone())
@@ -84,9 +88,35 @@ public class OrderServiceImpl implements OrderService {
             .set("state",bo.getState());
         if (!SignUtil.verify(params,app.getAppSecret()))
             return -3;
-        return orderMapper.insert(new Order(bo));
+        // 验证通过后,如果用户不存在,则添加用户;否则更新用户信息
+        QueryWrapper<Plan> planQueryWrapper = new QueryWrapper<>();
+        planQueryWrapper.eq("plan_id",bo.getPlanId());
+        Plan plan = planMapper.selectOne(planQueryWrapper);
+
+        QueryWrapper<Equipment> equipmentQueryWrapper = new QueryWrapper<>();
+        equipmentQueryWrapper.eq("equipment_code",bo.getEquipmentCode());
+        Equipment equipment = equipmentMapper.selectOne(equipmentQueryWrapper);
+
+        QueryWrapper<DlUser> userQueryWrapper = new QueryWrapper<>();
+        userQueryWrapper.eq("user_id",bo.getUserId());
+        DlUser user = dlUserMapper.selectOne(userQueryWrapper);
+
+        if (user == null)
+            dlUserMapper.insert(new DlUser(bo,equipment));
+        else{
+            user.setEndEquipmentId(equipment.getEquipmentId());
+            user.setEndEquipmentName(equipment.getEquipmentName());
+            user.setEndEquipmentCode(equipment.getEquipmentCode());
+            user.setEndTime(bo.getTime());
+            dlUserMapper.update(user,userQueryWrapper);
+        }
+        // 添加交易行为记录
+        statisticsMapper.insert(new Statistics(bo,plan,equipment));
+        // 添加订单
+        return orderMapper.insert(new Order(bo,app));
     }
 
+    // 查询订单列表
     @Override
     public PageInfo<List<Order>> getOrderList(PlanBo bo) {
         PageHelper.startPage(bo.getPageNum(),bo.getPageSize(),true);

+ 46 - 4
ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/PlanServiceImpl.java

@@ -12,8 +12,10 @@ import com.ruoyi.demo.entity.bo.PlanItemAddBo;
 import com.ruoyi.demo.entity.vo.*;
 import com.ruoyi.demo.mapper.*;
 import com.ruoyi.demo.service.PlanService;
+import com.ruoyi.demo.utils.OnStateUtil;
 import com.ruoyi.demo.utils.SendCallBackUtil;
 import com.ruoyi.demo.utils.SignUtil;
+import com.ruoyi.demo.utils.StateUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -49,6 +51,10 @@ public class PlanServiceImpl implements PlanService {
     EquipmentMapper equipmentMapper;
     @Autowired
     GoodsMapper goodsMapper;
+    @Autowired
+    StatisticsMapper statisticsMapper;
+    @Autowired
+    ExposureMapper exposureMapper;
 //    @Autowired
 //    SysUserMapper sysUserMapper;
 
@@ -182,7 +188,7 @@ public class PlanServiceImpl implements PlanService {
                 .or()
                 .like("goods_name",bo.getText());
         }
-        planQueryWrapper.eq("state",1);
+        planQueryWrapper.eq("state", StateUtil.APPROVED);
         planQueryWrapper.eq("deleted","0");
         List<Plan> plans = planMapper.selectList(planQueryWrapper);
         List<PlanListVo> vos = new ArrayList<>();
@@ -226,7 +232,7 @@ public class PlanServiceImpl implements PlanService {
             planQueryWrapper.apply("plan_start_time <= STR_TO_DATE({0},'%Y-%m-%d %H:%i:%s')",LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
             planQueryWrapper.apply("plan_end_time > STR_TO_DATE({0},'%Y-%m-%d %H:%i:%s')",LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
             planQueryWrapper.eq("plan_id",item.getPlanId());
-            planQueryWrapper.eq("state",1);
+            planQueryWrapper.eq("state",StateUtil.APPROVED);
             planQueryWrapper.eq("deleted","0");
             Plan plan = planMapper.selectOne(planQueryWrapper);
             if (plan != null)
@@ -247,8 +253,8 @@ public class PlanServiceImpl implements PlanService {
             planQueryWrapper.eq("plan_id",item.getPlanId());
             planQueryWrapper.apply("plan_start_time <= STR_TO_DATE({0},'%Y-%m-%d %H:%i:%s')",LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
             planQueryWrapper.apply("plan_end_time > STR_TO_DATE({0},'%Y-%m-%d %H:%i:%s')",LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
-            planQueryWrapper.eq("state",1);
-            planQueryWrapper.eq("on_state",0);
+            planQueryWrapper.eq("state",StateUtil.APPROVED);
+            planQueryWrapper.eq("on_state", OnStateUtil.UP);
             planQueryWrapper.eq("deleted","0");
             Plan plan = planMapper.selectOne(planQueryWrapper);
             if (plan != null)
@@ -375,6 +381,42 @@ public class PlanServiceImpl implements PlanService {
         return new PageInfo(vos);
     }
 
+    @Override
+    public void planPushStatisticsStart() {
+        // 清除当前月的统计记录
+        QueryWrapper<PlanPushStatistics> planPushStatisticsQueryWrapper = new QueryWrapper<>();
+        planPushStatisticsQueryWrapper.apply("STR_TO_DATE(laster_time,'%Y-%m') = STR_TO_DATE({0},'%Y-%m')",LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
+        planPushStatisticsMapper.delete(planPushStatisticsQueryWrapper);
+        // 获取所有设备,遍历
+        for (Equipment equipment : equipmentMapper.selectList(null)) {
+            // 先查询设备下所有plan_item,再根据item_id统计查询曝光记录表获取曝光次数
+            List<String> ids = planItemMapper.getItemIdsByCode(equipment.getEquipmentCode());
+            Integer carousalCount = exposureMapper.selectTotalCountByItemIds(ids);
+            // 统计查询统计信息表获取累计扫码量、累计交易数、累计用户数、累计收入
+            Integer scanCount = statisticsMapper.selectScanByEquipmentCode(equipment.getEquipmentCode());
+            Integer tradeCount = statisticsMapper.selectDealCountByEquipmentCode(equipment.getEquipmentCode());
+            List<String> users = statisticsMapper.selectUserIdsByEquipmentCode(equipment.getEquipmentCode());
+            Float totalPrice = statisticsMapper.selectTotalPriceByEquipmentCode(equipment.getEquipmentCode());
+            // 插入记录
+            PlanPushStatistics planPushStatistics = new PlanPushStatistics();
+            planPushStatistics.setEquipmentId(equipment.getEquipmentId());
+            planPushStatistics.setEquipmentName(equipment.getEquipmentName());
+            planPushStatistics.setEquipmentCode(equipment.getEquipmentCode());
+            planPushStatistics.setCarouselCount(carousalCount);
+            planPushStatistics.setScanCodeCount(scanCount);
+            planPushStatistics.setTradeCount(tradeCount);
+            if (users == null)
+                planPushStatistics.setTotalUserCount(0);
+            else
+                planPushStatistics.setTotalUserCount(users.size());
+            if (totalPrice == null)
+                planPushStatistics.setTotalPrice(Float.valueOf(0));
+            else
+                planPushStatistics.setTotalPrice(totalPrice);
+            planPushStatistics.setLasterTime(LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
+        }
+    }
+
     @Override
     public PlanHomeVo getPlanTotal() {
         PlanHomeVo vo = new PlanHomeVo();

+ 22 - 30
ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/StatisticsServiceImpl.java

@@ -4,16 +4,12 @@ import cn.hutool.core.lang.Dict;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.ruoyi.demo.entity.App;
-import com.ruoyi.demo.entity.DlUser;
-import com.ruoyi.demo.entity.Statistics;
+import com.ruoyi.demo.entity.*;
 import com.ruoyi.demo.entity.bo.PlanBo;
 import com.ruoyi.demo.entity.bo.StatisticsAddBo;
 import com.ruoyi.demo.entity.vo.PlanHomeVo;
 import com.ruoyi.demo.entity.vo.ScanListVo;
-import com.ruoyi.demo.mapper.AppMapper;
-import com.ruoyi.demo.mapper.DlUserMapper;
-import com.ruoyi.demo.mapper.StatisticsMapper;
+import com.ruoyi.demo.mapper.*;
 import com.ruoyi.demo.service.StatisticsService;
 import com.ruoyi.demo.utils.SignUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +32,10 @@ public class StatisticsServiceImpl implements StatisticsService {
     DlUserMapper dlUserMapper;
     @Autowired
     AppMapper appMapper;
+    @Autowired
+    EquipmentMapper equipmentMapper;
+    @Autowired
+    PlanMapper planMapper;
 
     @Override
     public PageInfo<List<ScanListVo>> getScanList(PlanBo bo) {
@@ -69,18 +69,9 @@ public class StatisticsServiceImpl implements StatisticsService {
         if (app == null)
             return "error";
         Map<String,Object> params = Dict.create()
-            .set("addrInfo",bo.getAddrInfo())
             .set("appkey",bo.getAppkey())
-            .set("behavior",bo.getBehavior())
-            .set("dealToolCount",bo.getDealToolCount())
-            .set("dealToolPrice",bo.getDealToolPrice())
             .set("equipmentCode",bo.getEquipmentCode())
-            .set("equipmentId",bo.getEquipmentId())
-            .set("equipmentName",bo.getEquipmentName())
-            .set("goodsId",bo.getGoodsId())
-            .set("goodsName",bo.getGoodsName())
             .set("planId",bo.getPlanId())
-            .set("planName",bo.getPlanName())
             .set("time",bo.getTime())
             .set("userId",bo.getUserId())
             .set("userName",bo.getUserName())
@@ -89,6 +80,7 @@ public class StatisticsServiceImpl implements StatisticsService {
         return SignUtil.sign(params,app.getAppSecret());
     }
 
+    // 添加扫码行为记录
     @Override
     public int add(StatisticsAddBo bo) {
         QueryWrapper<App> appQueryWrapper = new QueryWrapper<>();
@@ -97,18 +89,9 @@ public class StatisticsServiceImpl implements StatisticsService {
         if (app == null)
             return -1;
         Map<String,Object> params = Dict.create()
-            .set("addrInfo",bo.getAddrInfo())
             .set("appkey",bo.getAppkey())
-            .set("behavior",bo.getBehavior())
-            .set("dealToolCount",bo.getDealToolCount())
-            .set("dealToolPrice",bo.getDealToolPrice())
             .set("equipmentCode",bo.getEquipmentCode())
-            .set("equipmentId",bo.getEquipmentId())
-            .set("equipmentName",bo.getEquipmentName())
-            .set("goodsId",bo.getGoodsId())
-            .set("goodsName",bo.getGoodsName())
             .set("planId",bo.getPlanId())
-            .set("planName",bo.getPlanName())
             .set("time",bo.getTime())
             .set("userId",bo.getUserId())
             .set("userName",bo.getUserName())
@@ -116,20 +99,29 @@ public class StatisticsServiceImpl implements StatisticsService {
             .set("sign",bo.getSign());
         if (!SignUtil.verify(params,app.getAppSecret()))
             return -3;
+        // 验证通过后,如果用户不存在,则添加用户;否则更新用户信息
+        QueryWrapper<Plan> planQueryWrapper = new QueryWrapper<>();
+        planQueryWrapper.eq("plan_id",bo.getPlanId());
+        Plan plan = planMapper.selectOne(planQueryWrapper);
+
+        QueryWrapper<Equipment> equipmentQueryWrapper = new QueryWrapper<>();
+        equipmentQueryWrapper.eq("equipment_code",bo.getEquipmentCode());
+        Equipment equipment = equipmentMapper.selectOne(equipmentQueryWrapper);
 
         QueryWrapper<DlUser> userQueryWrapper = new QueryWrapper<>();
         userQueryWrapper.eq("user_id",bo.getUserId());
         DlUser user = dlUserMapper.selectOne(userQueryWrapper);
+
         if (user == null)
-            dlUserMapper.insert(new DlUser(bo));
+            dlUserMapper.insert(new DlUser(bo,equipment));
         else{
-            user.setEndEquipmentId(bo.getEquipmentId());
-            user.setEndEquipmentName(bo.getEquipmentName());
-            user.setEndEquipmentCode(bo.getEquipmentCode());
+            user.setEndEquipmentId(equipment.getEquipmentId());
+            user.setEndEquipmentName(equipment.getEquipmentName());
+            user.setEndEquipmentCode(equipment.getEquipmentCode());
             user.setEndTime(bo.getTime());
-            user.setTotalPrice(user.getTotalPrice() + bo.getDealToolPrice());
             dlUserMapper.update(user,userQueryWrapper);
         }
-        return statisticsMapper.insert(new Statistics(bo));
+        // 添加扫码行为记录
+        return statisticsMapper.insert(new Statistics(bo,plan,equipment));
     }
 }

+ 18 - 0
ruoyi-demo/src/main/resources/mapper/demo/ExposureMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.demo.mapper.ExposureMapper">
+
+    <select id="selectTotalCountByItemIds" resultType="java.lang.Integer">
+        SELECT
+            SUM(exposure_count)
+        FROM
+            `dl_exposure`
+        <where>
+            <foreach collection="itemIds" item="id" open="WHERE item_id in (" separator="," close=")">
+                #{id,jdbcType=VARCHAR}
+            </foreach>
+        </where>
+    </select>
+</mapper>

+ 7 - 0
ruoyi-demo/src/main/resources/mapper/demo/PlanItemMapper.xml

@@ -26,4 +26,11 @@
         from dl_plan,dl_plan_item
             ${ew.customSqlSegment}
     </select>
+    <select id="getItemIdsByCode" resultType="java.lang.String">
+        SELECT DISTINCT
+            item_id
+        FROM
+            `dl_plan_item`
+        WHERE equipment_code = #{equipmentCode};
+    </select>
 </mapper>

+ 40 - 0
ruoyi-demo/src/main/resources/mapper/demo/StatisticsMapper.xml

@@ -10,4 +10,44 @@
             `dl_statistics`
         WHERE behavior = 0;
     </select>
+    <select id="selectUserIdsByEquipmentCode" resultType="java.lang.String">
+        SELECT DISTINCT
+            user_id
+        FROM
+            `dl_statistics`
+        WHERE
+            equipment_code = #{equipmentCode};
+    </select>
+    <select id="selectScanByEquipmentCode" resultType="java.lang.Integer">
+        SELECT
+            COUNT(*)
+        FROM
+            `dl_statistics`
+        WHERE
+            equipment_code = #{equipmentCode}
+          AND behavior = 0;
+    </select>
+    <select id="selectDealCountByEquipmentCode" resultType="java.lang.Integer">
+        SELECT
+            SUM(deal_tool_count)
+        FROM
+            `dl_statistics`
+        WHERE
+            equipment_code = #{equipmentCode}
+          AND behavior = 1;
+    </select>
+    <select id="selectTotalPriceByEquipmentCode" resultType="java.lang.Float">
+        SELECT
+            SUM(
+                CONVERT (
+                    deal_tool_price,
+                    DECIMAL (16, 2)
+                    )
+                )
+        FROM
+            `dl_statistics`
+        WHERE
+            equipment_code = #{equipmentCode}
+          AND behavior = 1;
+    </select>
 </mapper>