Procházet zdrojové kódy

新增活码数据导出,修复个微站点删除后redis不同步问题

leon před 5 roky
rodič
revize
8adc2aa066

+ 2 - 0
src/main/java/com/mokamrp/privates/config/OSSConfiguration.java

@@ -16,6 +16,8 @@ public class OSSConfiguration {
 
     public static final String UPLOAD_DIR = "hera/upload/";
 
+    public static final String PAN_DIR = "pangu/down/";
+
     private volatile static OSS ossClient;
 
     private volatile static OSSClientBuilder ossClientBuilder;

+ 19 - 0
src/main/java/com/mokamrp/privates/controller/pangu/FosterwxStationController.java

@@ -8,6 +8,7 @@ import com.mokamrp.privates.constant.HttpStatus;
 import com.mokamrp.privates.constant.RedisKey;
 import com.mokamrp.privates.controller.BaseController;
 import com.mokamrp.privates.entity.AddHandle;
+import com.mokamrp.privates.entity.DelHandle;
 import com.mokamrp.privates.entity.EditHandle;
 import com.mokamrp.privates.entity.PostBasePageHandle;
 import com.mokamrp.privates.entity.pangu.LoginStationHandle;
@@ -144,6 +145,24 @@ public class FosterwxStationController extends BaseController<FosterwxStation> {
         return AjaxResult.success(res.get("msg").toString(), res);
     }
 
+    @PostMapping("/del")
+    public Object delete(@Valid @RequestBody DelHandle<FosterwxStation> delHandle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        QueryWrapper<FosterwxStation> QueryWrapper = new QueryWrapper<>();
+        String[] ids = delHandle.getIds().split(",");
+        QueryWrapper.in("id", ids);
+        boolean res = service.remove(QueryWrapper);
+        if (!res) {
+            for (String id : ids){
+                stringRedisTemplate.opsForHash().delete(RedisKey.PanCustServiceInfo,id);
+            }
+            return AjaxResult.error("删除失败");
+        }
+        return AjaxResult.success(Constants.SUCCESS, res);
+    }
+
     @GetMapping("/test")
     public Object test() {
         String res = coralApiService.getBoxToken("gh_e529abe24cce");

+ 3 - 0
src/main/java/com/mokamrp/privates/controller/pangu/PromoteCodeController.java

@@ -7,6 +7,7 @@ import com.mokamrp.privates.constant.HttpStatus;
 import com.mokamrp.privates.constant.RedisKey;
 import com.mokamrp.privates.controller.BaseController;
 import com.mokamrp.privates.entity.AddHandle;
+import com.mokamrp.privates.entity.DateHandle;
 import com.mokamrp.privates.entity.DelHandle;
 import com.mokamrp.privates.entity.EditHandle;
 import com.mokamrp.privates.entity.pangu.PromoteCodeListHandle;
@@ -124,6 +125,8 @@ public class PromoteCodeController extends BaseController<PromoteCode> {
         return AjaxResult.success(res);
     }
 
+
+
     public Boolean delRedis(String[] ids){
         for (String id : ids){
             stringRedisTemplate.opsForHash().delete(RedisKey.PanPromoteCodeInfo,id);

+ 148 - 9
src/main/java/com/mokamrp/privates/controller/pangu/PromoteCodeDataController.java

@@ -1,32 +1,34 @@
 package com.mokamrp.privates.controller.pangu;
 
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.model.PutObjectRequest;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.mokamrp.privates.config.OSSConfiguration;
 import com.mokamrp.privates.constant.HttpStatus;
 import com.mokamrp.privates.entity.DateHandle;
 import com.mokamrp.privates.help.AjaxResult;
-import com.mokamrp.privates.mapper.data.PanCSTQRecordMapper;
 import com.mokamrp.privates.mapper.data.pojo.PanCSLTRecord;
 import com.mokamrp.privates.mapper.data.pojo.PanCSLTRecordTotal;
+import com.mokamrp.privates.mapper.data.pojo.PanCSTQRecord;
 import com.mokamrp.privates.mapper.data.pojo.PanCSTQRecordTotal;
-import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePool;
-import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePoolRecord;
+import com.mokamrp.privates.mapper.pangu.pojo.*;
 import com.mokamrp.privates.service.data.PanCSLTRecordService;
 import com.mokamrp.privates.service.data.PanCSTQRecordService;
+import com.mokamrp.privates.service.pangu.CustserviceService;
 import com.mokamrp.privates.service.pangu.PromoteQrcodePoolRecordService;
 import com.mokamrp.privates.service.pangu.PromoteQrcodePoolService;
+import com.mokamrp.privates.utils.OssFile;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 import com.mokamrp.privates.service.pangu.PromoteCodeService;
-import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
 
 import javax.validation.Valid;
-import java.time.Duration;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.io.ByteArrayInputStream;
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.util.*;
 
 /**
  * <p>
@@ -44,6 +46,9 @@ public class PromoteCodeDataController{
     public PromoteCodeService promoteCodeService;
 
     @Autowired
+    public CustserviceService custserviceService;
+
+    @Autowired
     public PromoteQrcodePoolService promoteQrcodePoolService;
 
     @Autowired
@@ -58,6 +63,11 @@ public class PromoteCodeDataController{
     @Autowired
     public PanCSTQRecordService panCSTQRecordService;
 
+    @Autowired
+    private OSSConfiguration ossConfiguration;
+
+    @Autowired
+    private OSS ossClient;
 
     @PostMapping("/getDataTrend")
     public Object getDataTrend(@Valid @RequestBody DateHandle dateHandle, BindingResult bindingResult){
@@ -119,5 +129,134 @@ public class PromoteCodeDataController{
         res.put("takeQrcodeUv",total.getTakeQrcodePv());
         return AjaxResult.success(res);
     }
+
+    @PostMapping("/export")
+    public Object export(@RequestBody DateHandle dateHandle, BindingResult bindingResult){
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        Long startDate = dateHandle.startDate.toEpochSecond(ZoneOffset.of("+8"));
+        Long endDate = dateHandle.endDate.toEpochSecond(ZoneOffset.of("+8"));
+        List<PromoteCode> promoteCodeList = promoteCodeService.list();
+        List<Custservice> custserviceList = custserviceService.list();
+        List<PanCSLTRecord> ltpv = panCSLTRecordService.getCustserviceLongTouchPvByDateGroupDs(startDate,endDate);
+        List<PanCSLTRecord> ltuv = panCSLTRecordService.getCustserviceLongTouchUvByDateGroupDs(startDate,endDate);
+        List<PanCSTQRecord> tqpv = panCSTQRecordService.getCustserviceTakeQrcodePvByDateGroupDs(startDate,endDate);
+        List<PanCSTQRecord> tquv = panCSTQRecordService.getCustserviceTakeQrcodeUvByDateGroupDs(startDate,endDate);
+        List<PromoteDataGroup> res = new ArrayList<>();
+        for (PanCSLTRecord panCSLTRecord : ltpv) {
+            Integer index = this.hasData(res,panCSLTRecord.getPromoteId(),panCSLTRecord.getCustserviceId(),panCSLTRecord.getDs());
+            if (index > -1){
+                res.get(index).setLongTouchPv(res.get(index).getLongTouchPv()+panCSLTRecord.getLongTouchCnt());
+            }else{
+                PromoteDataGroup promoteDataGroup = new PromoteDataGroup();
+                promoteDataGroup.setPromoteId(panCSLTRecord.getPromoteId());
+                promoteDataGroup.setCustserviceId(panCSLTRecord.getCustserviceId());
+                promoteDataGroup.setDs(panCSLTRecord.getDs());
+                promoteDataGroup.setLongTouchPv(panCSLTRecord.getLongTouchCnt());
+                res.add(promoteDataGroup);
+            }
+        }
+        for (PanCSLTRecord panCSLTRecord : ltuv) {
+            Integer index = this.hasData(res,panCSLTRecord.getPromoteId(),panCSLTRecord.getCustserviceId(),panCSLTRecord.getDs());
+            if (index > -1){
+                res.get(index).setLongTouchUv(res.get(index).getLongTouchUv()+panCSLTRecord.getLongTouchCnt());
+            }else{
+                PromoteDataGroup promoteDataGroup = new PromoteDataGroup();
+                promoteDataGroup.setPromoteId(panCSLTRecord.getPromoteId());
+                promoteDataGroup.setCustserviceId(panCSLTRecord.getCustserviceId());
+                promoteDataGroup.setDs(panCSLTRecord.getDs());
+                promoteDataGroup.setLongTouchUv(panCSLTRecord.getLongTouchCnt());
+                res.add(promoteDataGroup);
+            }
+        }
+        for (PanCSTQRecord panCSTQRecord : tqpv) {
+            Integer index = this.hasData(res,panCSTQRecord.getPromoteId(),panCSTQRecord.getCustserviceId(),panCSTQRecord.getDs());
+            if (index > -1){
+                res.get(index).setTakeQrcodePv(res.get(index).getLongTouchPv()+panCSTQRecord.getTakeQrcodeCnt());
+            }else{
+                PromoteDataGroup promoteDataGroup = new PromoteDataGroup();
+                promoteDataGroup.setPromoteId(panCSTQRecord.getPromoteId());
+                promoteDataGroup.setCustserviceId(panCSTQRecord.getCustserviceId());
+                promoteDataGroup.setDs(panCSTQRecord.getDs());
+                promoteDataGroup.setTakeQrcodePv(panCSTQRecord.getTakeQrcodeCnt());
+                res.add(promoteDataGroup);
+            }
+        }
+        for (PanCSTQRecord panCSTQRecord : tquv) {
+            Integer index = this.hasData(res,panCSTQRecord.getPromoteId(),panCSTQRecord.getCustserviceId(),panCSTQRecord.getDs());
+            if (index > -1){
+                res.get(index).setTakeQrcodeUv(res.get(index).getLongTouchUv()+panCSTQRecord.getTakeQrcodeCnt());
+            }else{
+                PromoteDataGroup promoteDataGroup = new PromoteDataGroup();
+                promoteDataGroup.setPromoteId(panCSTQRecord.getPromoteId());
+                promoteDataGroup.setCustserviceId(panCSTQRecord.getCustserviceId());
+                promoteDataGroup.setDs(panCSTQRecord.getDs());
+                promoteDataGroup.setTakeQrcodeUv(panCSTQRecord.getTakeQrcodeCnt());
+                res.add(promoteDataGroup);
+            }
+        }
+        List<Object> tempObj;
+        List<List<Object>> resList = new ArrayList<List<Object>>();
+        Object[] head = {"日期", "活码ID", "活码名称", "二维码ID", "二维码名称", "扫码次数", "扫码人数", "长按次数", "长按人数"};
+        List<Object> headList = Arrays.asList(head);
+        Date currentTime = new Date();
+        String fileName = "活码数据.csv";
+        resList.add(headList);
+        for (PromoteDataGroup promoteDataGroup : res){
+            promoteDataGroup.setPromoteName(this.getPromoteCodeName(promoteCodeList,promoteDataGroup.getPromoteId()));
+            promoteDataGroup.setCustserviceName(this.getCustserviceName(custserviceList,promoteDataGroup.getCustserviceId()));
+            tempObj = new ArrayList<Object>() {
+                {
+                    this.add(promoteDataGroup.getDs());
+                    this.add(promoteDataGroup.getPromoteId());
+                    this.add(promoteDataGroup.getPromoteName());
+                    this.add(promoteDataGroup.getCustserviceId());
+                    this.add(promoteDataGroup.getCustserviceName());
+                    this.add(promoteDataGroup.getTakeQrcodePv());
+                    this.add(promoteDataGroup.getTakeQrcodeUv());
+                    this.add(promoteDataGroup.getLongTouchPv());
+                    this.add(promoteDataGroup.getLongTouchUv());
+                }
+            };
+            resList.add(tempObj);
+        }
+        StringBuffer content = OssFile.createCSV(resList);
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        String dateString = formatter.format(currentTime);
+        String randNum = Integer.toString((int)(10000+Math.random()*(99999-10000+1)));
+        String filePath = OSSConfiguration.PAN_DIR + dateString + "/" + randNum + "_" + fileName;
+        PutObjectRequest putObjectRequest = new PutObjectRequest(ossConfiguration.getBucketName(), filePath,
+                new ByteArrayInputStream(content.toString().getBytes()));
+        ossClient.putObject(putObjectRequest);
+        return AjaxResult.success(ossConfiguration.getHost() + filePath);
+    }
+
+    private String getPromoteCodeName(List<PromoteCode> row,Integer promoteId){
+        for (PromoteCode promoteCode:row){
+            if (promoteCode.getId().equals(promoteId)){
+                return promoteCode.getName();
+            }
+        }
+        return null;
+    }
+
+    private String getCustserviceName(List<Custservice> row,Integer custserviceId){
+        for (Custservice custservice:row){
+            if (custservice.getId().equals(custserviceId)){
+                return custservice.getName();
+            }
+        }
+        return null;
+    }
+
+    private Integer hasData(List<PromoteDataGroup> row,Integer promoteId,Integer custserviceId,String ds){
+        for (Integer i = 0;i<row.size();i++){
+            if (row.get(i).getPromoteId().equals(promoteId) && row.get(i).getCustserviceId().equals(custserviceId) && row.get(i).getDs().equals(ds)){
+                return i;
+            }
+        }
+        return -1;
+    }
 }
 

+ 2 - 0
src/main/java/com/mokamrp/privates/mapper/data/pojo/PanCSLTRecord.java

@@ -24,4 +24,6 @@ public class PanCSLTRecord extends Model<PanCSLTRecord>{
 
     private Integer promoteId = 0;
 
+    private String ds = "";
+
 }

+ 2 - 0
src/main/java/com/mokamrp/privates/mapper/data/pojo/PanCSTQRecord.java

@@ -23,4 +23,6 @@ public class PanCSTQRecord extends Model<PanCSTQRecord>{
     private Integer custserviceId;
 
     private Integer promoteId;
+
+    private String ds = "";
 }

+ 7 - 1
src/main/java/com/mokamrp/privates/mapper/pangu/PromoteQrcodePoolRecordMapper.java

@@ -1,7 +1,13 @@
 package com.mokamrp.privates.mapper.pangu;
 
+import com.mokamrp.privates.mapper.data.pojo.PanCSLTRecord;
+import com.mokamrp.privates.mapper.data.pojo.PanCSTQRecord;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteDataGroup;
 import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePoolRecord;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -12,5 +18,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @since 2021-06-29
  */
 public interface PromoteQrcodePoolRecordMapper extends BaseMapper<PromoteQrcodePoolRecord> {
-
+    public void createPromoteDataTable();
 }

+ 14 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/PromoteQrcodePoolRecordMapper.xml

@@ -17,5 +17,19 @@
     <sql id="Base_Column_List">
         id, promote_id, custservice_id, long_touch_pv, take_qrcode_pv, create_at, update_at
     </sql>
+    <select id="createPromoteDataTable">
+        DROP temporary table if exists pan_promote_data;
+        CREATE TEMPORARY TABLE `pan_promote_data` (
+            `id` BIGINT(21) NOT NULL AUTO_INCREMENT,
+            `promote_id` INT(11) NOT NULL NOT NULL COLLATE 'utf8_general_ci' COMMENT '活码ID',
+            `cusetservice_id`INT(11) NOT NULL NOT NULL COLLATE 'utf8_general_ci' COMMENT '客服ID',
+            `ds` varchar(35) NOT NULL DEFAULT ''  COMMENT '时间',
+            `long_touch_pv` INT(11) NOT NULL DEFAULT '0'  COMMENT '长按pv',
+            `long_touch_uv` INT(11) NOT NULL DEFAULT '0'  COMMENT '长按uv',
+            `take_qrcode_pv` INT(11) NOT NULL DEFAULT '0'  COMMENT '扫码pv',
+            `take_qrcode_uv` INT(11) NOT NULL DEFAULT '0'  COMMENT '扫码uv',
+            PRIMARY KEY (`id`) USING BTREE
+        )Engine=InnoDB default charset utf8;
+    </select>
 
 </mapper>

+ 53 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/PromoteDataGroup.java

@@ -0,0 +1,53 @@
+package com.mokamrp.privates.mapper.pangu.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 盘古活码内个微码访问数据
+ * </p>
+ *
+ * @author leon
+ * @since 2021-06-29
+ */
+@Data
+public class PromoteDataGroup extends Model<PromoteDataGroup> {
+
+    /**
+     * 活码Id
+     */
+    private Integer promoteId;
+
+    private String promoteName;
+
+    /**
+     * 客服个微二维码Id
+     */
+    private Integer custserviceId;
+
+    private String custserviceName;
+
+    private String ds;
+
+    /**
+     * 二维码长按pv
+     */
+    private Integer longTouchPv = 0;
+
+    /**
+     * 扫码pv
+     */
+    private Integer takeQrcodePv = 0;
+
+    private Integer longTouchUv = 0;
+
+    private Integer takeQrcodeUv = 0;
+
+}

+ 4 - 1
src/main/java/com/mokamrp/privates/service/data/PanCSLTRecordService.java

@@ -17,7 +17,10 @@ public interface PanCSLTRecordService extends IService<PanCSLTRecord> {
     public List<PanCSLTRecord> getCustserviceLongTouchPvByDate(Long startDate, Long endDate);
     //.获取客服码指定日器长按人数
     public List<PanCSLTRecord> getCustserviceLongTouchUvByDate(Long startDate, Long endDate);
-
+    //.获取客服码指定日期长按次数 按DS聚合
+    public List<PanCSLTRecord> getCustserviceLongTouchPvByDateGroupDs(Long startDate, Long endDate);
+    //.获取客服码指定日器长按人数 按DS聚合
+    public List<PanCSLTRecord> getCustserviceLongTouchUvByDateGroupDs(Long startDate, Long endDate);
     //.获取长按识别指定范围的PV数据(天)
     public List<PanCSLTRecordTotal> getLongTouchPvByDay(LocalDateTime startDate, LocalDateTime endDate, Integer gapDay);
     //.获取长按识别指定范围的UV数据(天)

+ 8 - 0
src/main/java/com/mokamrp/privates/service/data/PanCSTQRecordService.java

@@ -16,9 +16,17 @@ public interface PanCSTQRecordService extends IService<PanCSTQRecord> {
     public List<PanCSTQRecord> getCustserviceTakeQrcodePvByDate(Long startDate, Long endDate);
     //.获取客服码指定日器扫码人数
     public List<PanCSTQRecord> getCustserviceTakeQrcodeUvByDate(Long startDate, Long endDate);
+    //.获取客服码指定日期扫码次数 按DS聚合
+    public List<PanCSTQRecord> getCustserviceTakeQrcodePvByDateGroupDs(Long startDate, Long endDate);
+    //.获取客服码指定日器扫码人数 按DS聚合
+    public List<PanCSTQRecord> getCustserviceTakeQrcodeUvByDateGroupDs(Long startDate, Long endDate);
+    //.获取扫码指定范围的PV数据(天)
     public List<PanCSTQRecordTotal> getTakeQRPvByDay(LocalDateTime startDate, LocalDateTime endDate, Integer gapDay);
+    //.获取扫码指定范围的UV数据(天)
     public List<PanCSTQRecordTotal> getTakeQRUvByDay(LocalDateTime startDate, LocalDateTime endDate, Integer gapDay);
+    //.获取扫码指定范围的PV数据(小时)
     public List<PanCSTQRecordTotal> getTakeQrPvByHour(LocalDateTime startDate, LocalDateTime endDate, Integer gapHour);
+    //.获取扫码指定范围的PV数据(小时)
     public List<PanCSTQRecordTotal> getTakeQrUvByHour(LocalDateTime startDate, LocalDateTime endDate, Integer gapHour);
 
 }

+ 25 - 0
src/main/java/com/mokamrp/privates/service/data/impl/PanCSLTRecordServiceImpl.java

@@ -58,6 +58,7 @@ public class PanCSLTRecordServiceImpl extends ServiceImpl<PanCSLTRecordMapper, P
                 .groupBy("custservice_id","promote_id"));
         return res;
     }
+
     //.获取客服码指定日器长按人数
     public List<PanCSLTRecord> getCustserviceLongTouchUvByDate(Long startDate, Long endDate){
         List<PanCSLTRecord> res = this.list(new QueryWrapper<PanCSLTRecord>()
@@ -69,6 +70,30 @@ public class PanCSLTRecordServiceImpl extends ServiceImpl<PanCSLTRecordMapper, P
         return res;
     }
 
+    //.获取客服码指定日期长按次数 按DS聚合
+    public List<PanCSLTRecord> getCustserviceLongTouchPvByDateGroupDs(Long startDate, Long endDate){
+        List<PanCSLTRecord> res = this.list(new QueryWrapper<PanCSLTRecord>()
+                .select("count(event) as long_touch_cnt,custservice_id,promote_id,ds")
+                .isNotNull("custservice_id")
+                .ne("custservice_id","0")
+                .between("timestamp",startDate,endDate)
+                .groupBy("custservice_id","promote_id","ds")
+                .orderByAsc("ds"));
+        return res;
+    }
+
+    //.获取客服码指定日器长按人数 按DS聚合
+    public List<PanCSLTRecord> getCustserviceLongTouchUvByDateGroupDs(Long startDate, Long endDate){
+        List<PanCSLTRecord> res = this.list(new QueryWrapper<PanCSLTRecord>()
+                .select("count(DISTINCT uuid) as long_touch_cnt,custservice_id,promote_id,ds")
+                .isNotNull("custservice_id")
+                .ne("custservice_id","0")
+                .between("timestamp",startDate,endDate)
+                .groupBy("custservice_id","promote_id","ds")
+                .orderByAsc("ds"));
+        return res;
+    }
+
     /**
      * 指定时间范围内,天为单位的长按数据PV
      * @param startDate

+ 31 - 0
src/main/java/com/mokamrp/privates/service/data/impl/PanCSTQRecordServiceImpl.java

@@ -81,6 +81,36 @@ public class PanCSTQRecordServiceImpl  extends ServiceImpl<PanCSTQRecordMapper,P
         return res;
     }
 
+    /**
+     * 获取指定日期客服码扫码次数 按DS聚合
+     * @return
+     */
+    public List<PanCSTQRecord> getCustserviceTakeQrcodePvByDateGroupDs(Long startDate, Long endDate){
+        List<PanCSTQRecord> res = this.list(new QueryWrapper<PanCSTQRecord>()
+                .select("count(event) as take_qrcode_cnt,custservice_id,promote_id,ds")
+                .isNotNull("custservice_id")
+                .ne("custservice_id","0")
+                .between("timestamp",startDate,endDate)
+                .groupBy("custservice_id","promote_id,ds")
+                .orderByAsc("ds"));
+        return res;
+    }
+
+    /**
+     * 获取指定日期客服码扫码人数 按DS聚合
+     * @return
+     */
+    public List<PanCSTQRecord> getCustserviceTakeQrcodeUvByDateGroupDs(Long startDate, Long endDate){
+        List<PanCSTQRecord> res = this.list(new QueryWrapper<PanCSTQRecord>()
+                .select("count(DISTINCT uuid) as take_qrcode_cnt,custservice_id,promote_id,ds")
+                .isNotNull("custservice_id")
+                .ne("custservice_id","0")
+                .between("timestamp",startDate,endDate)
+                .groupBy("custservice_id","promote_id,ds")
+                .orderByAsc("ds"));
+        return res;
+    }
+
 
     /**
      * 获取指定范围日期内 每一天的活码扫码数据PV记录
@@ -214,4 +244,5 @@ public class PanCSTQRecordServiceImpl  extends ServiceImpl<PanCSTQRecordMapper,P
         }
         return dataList;
     }
+
 }

+ 8 - 1
src/main/java/com/mokamrp/privates/service/pangu/impl/PromoteQrcodePoolRecordServiceImpl.java

@@ -1,11 +1,17 @@
 package com.mokamrp.privates.service.pangu.impl;
 
+import com.mokamrp.privates.mapper.data.pojo.PanCSLTRecord;
+import com.mokamrp.privates.mapper.data.pojo.PanCSTQRecord;
+import com.mokamrp.privates.mapper.pangu.PromoteQrcodePoolMapper;
 import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePoolRecord;
 import com.mokamrp.privates.mapper.pangu.PromoteQrcodePoolRecordMapper;
 import com.mokamrp.privates.service.pangu.PromoteQrcodePoolRecordService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * <p>
  * 盘古活码内个微码访问数据 服务实现类
@@ -16,5 +22,6 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class PromoteQrcodePoolRecordServiceImpl extends ServiceImpl<PromoteQrcodePoolRecordMapper, PromoteQrcodePoolRecord> implements PromoteQrcodePoolRecordService {
-
+    @Autowired
+    public PromoteQrcodePoolRecordMapper promoteQrcodePoolRecordMapper;
 }