diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppWxPayController.java b/src/main/java/com/ycwl/basic/controller/mobile/AppWxPayController.java index 5a8b1b2..0432f8d 100644 --- a/src/main/java/com/ycwl/basic/controller/mobile/AppWxPayController.java +++ b/src/main/java/com/ycwl/basic/controller/mobile/AppWxPayController.java @@ -57,7 +57,7 @@ public class AppWxPayController { BizCodeEnum.ADVANCE_PAYMENT_REFUND_FAILED); } - @ApiOperation(value = "微信支付回调", notes = "微信支付回调") + @ApiOperation(value = "微信支付退款回调", notes = "微信支付退款回调") @PostMapping("/refundNotify") @IgnoreToken public ApiResponse refundNotify(@RequestBody String refundResult) throws GeneralSecurityException, IOException { diff --git a/src/main/java/com/ycwl/basic/controller/mobile/manage/AppScenicAccountController.java b/src/main/java/com/ycwl/basic/controller/mobile/manage/AppScenicAccountController.java new file mode 100644 index 0000000..028cc19 --- /dev/null +++ b/src/main/java/com/ycwl/basic/controller/mobile/manage/AppScenicAccountController.java @@ -0,0 +1,36 @@ +package com.ycwl.basic.controller.mobile.manage; + +import com.ycwl.basic.annotation.IgnoreToken; +import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginReq; +import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginRespVO; +import com.ycwl.basic.model.mobile.weChat.DTO.WeChatUserInfoDTO; +import com.ycwl.basic.service.mobile.AppScenicService; +import com.ycwl.basic.utils.ApiResponse; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +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:longbinbin + * @Date:2024/12/12 18:28 + */ +@RestController +@RequestMapping("/api/mobile/scenicAccount/v1") +@Api(tags = "景区账号相关接口") +public class AppScenicAccountController { + + @Autowired + private AppScenicService scenicService; + + @ApiOperation("登录") + @PostMapping("/login") + @IgnoreToken + public ApiResponse login(@RequestBody ScenicLoginReq scenicLoginReq) throws Exception { + return scenicService.login(scenicLoginReq); + } +} diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppStatisticsController.java b/src/main/java/com/ycwl/basic/controller/mobile/manage/AppStatisticsController.java similarity index 64% rename from src/main/java/com/ycwl/basic/controller/mobile/AppStatisticsController.java rename to src/main/java/com/ycwl/basic/controller/mobile/manage/AppStatisticsController.java index af5980e..2edc1e0 100644 --- a/src/main/java/com/ycwl/basic/controller/mobile/AppStatisticsController.java +++ b/src/main/java/com/ycwl/basic/controller/mobile/manage/AppStatisticsController.java @@ -1,12 +1,19 @@ -package com.ycwl.basic.controller.mobile; +package com.ycwl.basic.controller.mobile.manage; import com.ycwl.basic.annotation.IgnoreToken; -import com.ycwl.basic.model.mobile.statistic.*; +import com.ycwl.basic.model.jwt.JwtInfo; +import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq; +import com.ycwl.basic.model.mobile.statistic.req.StatisticsRecordAddReq; +import com.ycwl.basic.model.mobile.statistic.resp.AppSta1VO; +import com.ycwl.basic.model.mobile.statistic.resp.AppSta2VO; +import com.ycwl.basic.model.mobile.statistic.resp.AppSta3VO; +import com.ycwl.basic.model.mobile.statistic.resp.AppStatisticsFunnelVO; import com.ycwl.basic.service.mobile.AppStatisticsService; import com.ycwl.basic.utils.ApiResponse; +import com.ycwl.basic.utils.JwtTokenUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -14,6 +21,7 @@ import org.springframework.web.bind.annotation.*; * @Author:longbinbin * @Date:2024/12/11 18:08 */ +@Slf4j @RestController @RequestMapping("/api/mobile/statistics/v1") @Api(tags = "数据统计相关接口") @@ -24,15 +32,17 @@ public class AppStatisticsController { @ApiOperation("支付订单金额、预览_支付转化率、扫码_付费用户转化率") @PostMapping("/one") - @IgnoreToken public ApiResponse oneStatistics(@RequestBody CommonQueryReq query) { + JwtInfo worker = JwtTokenUtil.getWorker(); + log.info("oneStatistics 当前用户信息:{}", worker); + Long scenicId = worker.getScenicId(); + query.setScenicId(scenicId); return statisticsService.oneStatistics(query); } @ApiOperation("支付订单数、现场订单数、推送订单数统计") @PostMapping("/two") - @IgnoreToken public ApiResponse twoStatistics(@RequestBody CommonQueryReq query) { return statisticsService.twoStatistics(query); @@ -40,7 +50,6 @@ public class AppStatisticsController { @ApiOperation("扫码访问人数、推送订阅人数、预览视频人数统计") @PostMapping("/free") - @IgnoreToken public ApiResponse freeStatistics(@RequestBody CommonQueryReq query) { return statisticsService.freeStatistics(query); @@ -48,16 +57,16 @@ public class AppStatisticsController { @ApiOperation("用户转化漏斗") @PostMapping("/userConversionFunnel") - @IgnoreToken public ApiResponse userConversionFunnel(@RequestBody CommonQueryReq query) { return statisticsService.userConversionFunnel(query); } @ApiOperation("统计数据记录") - @PostMapping("/statistics") - public ApiResponse statistics() { - return null; + @PostMapping("/addStatistics") + public ApiResponse addStatistics(@RequestBody StatisticsRecordAddReq req) { + + return statisticsService.addStatistics(req); } } diff --git a/src/main/java/com/ycwl/basic/enums/StatisticEnum.java b/src/main/java/com/ycwl/basic/enums/StatisticEnum.java index 03f5089..22bf2cc 100644 --- a/src/main/java/com/ycwl/basic/enums/StatisticEnum.java +++ b/src/main/java/com/ycwl/basic/enums/StatisticEnum.java @@ -11,7 +11,6 @@ public enum StatisticEnum { POST_PAYMENT(4,"事后支付"), REFUND(5,"退款"), AGREE_TO_PUSH(6,"同意推送"), - REFUSE_PUSH_NOTIFICATIONS(7,"拒绝推送"), DOWNLOAD(8,"下载"), CLICK_ON_PAYMENT(9,"点击支付、购买"), diff --git a/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java b/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java index 52dbb9f..9bb571c 100644 --- a/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java @@ -1,6 +1,7 @@ package com.ycwl.basic.mapper; -import com.ycwl.basic.model.mobile.statistic.CommonQueryReq; +import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq; +import com.ycwl.basic.model.mobile.statistic.req.StatisticsRecordAddReq; import org.apache.ibatis.annotations.Mapper; import java.math.BigDecimal; @@ -84,4 +85,6 @@ public interface StatisticsMapper { Integer countRefundOfOrder(CommonQueryReq query); BigDecimal countRefundAmount(CommonQueryReq query); + + int addStatisticsRecord(StatisticsRecordAddReq req); } diff --git a/src/main/java/com/ycwl/basic/model/jwt/JwtInfo.java b/src/main/java/com/ycwl/basic/model/jwt/JwtInfo.java index 436292d..7178b52 100644 --- a/src/main/java/com/ycwl/basic/model/jwt/JwtInfo.java +++ b/src/main/java/com/ycwl/basic/model/jwt/JwtInfo.java @@ -42,6 +42,11 @@ public class JwtInfo implements Serializable { private String phone; + /** + * 景区id + */ + private Long scenicId; + /** * 生成 token 的时间 diff --git a/src/main/java/com/ycwl/basic/model/mobile/scenic/account/ScenicLoginReq.java b/src/main/java/com/ycwl/basic/model/mobile/scenic/account/ScenicLoginReq.java new file mode 100644 index 0000000..4ee4674 --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/mobile/scenic/account/ScenicLoginReq.java @@ -0,0 +1,18 @@ +package com.ycwl.basic.model.mobile.scenic.account; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author:longbinbin + * @Date:2024/12/13 9:44 + */ +@Data +@ApiModel("景区账号登录请求类") +public class ScenicLoginReq { + @ApiModelProperty("账号") + private String account; + @ApiModelProperty("密码") + private String password; +} diff --git a/src/main/java/com/ycwl/basic/model/mobile/scenic/account/ScenicLoginRespVO.java b/src/main/java/com/ycwl/basic/model/mobile/scenic/account/ScenicLoginRespVO.java new file mode 100644 index 0000000..8e8e8fb --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/mobile/scenic/account/ScenicLoginRespVO.java @@ -0,0 +1,26 @@ +package com.ycwl.basic.model.mobile.scenic.account; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author:longbinbin + * @Date:2024/12/13 9:44 + */ +@Data +@ApiModel("景区账号登录响应类") +public class ScenicLoginRespVO { + private Long id; + @ApiModelProperty("景区id") + private Long scenicId; + @ApiModelProperty("是否是超级管理员") + private Integer isSuper; + @ApiModelProperty("账号名称") + private String name; + @ApiModelProperty("账号") + private String account; + @ApiModelProperty("1启用 0禁用") + private Integer status; + private String token; +} diff --git a/src/main/java/com/ycwl/basic/model/mobile/statistic/CommonQueryReq.java b/src/main/java/com/ycwl/basic/model/mobile/statistic/req/CommonQueryReq.java similarity index 91% rename from src/main/java/com/ycwl/basic/model/mobile/statistic/CommonQueryReq.java rename to src/main/java/com/ycwl/basic/model/mobile/statistic/req/CommonQueryReq.java index 4622697..7e90a02 100644 --- a/src/main/java/com/ycwl/basic/model/mobile/statistic/CommonQueryReq.java +++ b/src/main/java/com/ycwl/basic/model/mobile/statistic/req/CommonQueryReq.java @@ -1,4 +1,4 @@ -package com.ycwl.basic.model.mobile.statistic; +package com.ycwl.basic.model.mobile.statistic.req; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/com/ycwl/basic/model/mobile/statistic/req/StatisticsRecordAddReq.java b/src/main/java/com/ycwl/basic/model/mobile/statistic/req/StatisticsRecordAddReq.java new file mode 100644 index 0000000..6117b00 --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/mobile/statistic/req/StatisticsRecordAddReq.java @@ -0,0 +1,22 @@ +package com.ycwl.basic.model.mobile.statistic.req; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author:longbinbin + * @Date:2024/12/12 18:31 + */ +@Data +@ApiModel("移动端用户操作统计记录添加类") +public class StatisticsRecordAddReq { + @ApiModelProperty("统计数据类型,0扫码访问,1上传人脸,2预览视频,3现场支付,4事后支付,5退款,6消息推送,8下载,9点击购买") + private Integer type; + @ApiModelProperty(value = "景区id") + private Long scenicId; + @ApiModelProperty(value = "触发用户id",hidden = true) + private Long memberId; + @ApiModelProperty("关联数据ID 例如:预览视频就是视频id") + private Long morphId; +} diff --git a/src/main/java/com/ycwl/basic/model/mobile/statistic/AppSta1VO.java b/src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppSta1VO.java similarity index 94% rename from src/main/java/com/ycwl/basic/model/mobile/statistic/AppSta1VO.java rename to src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppSta1VO.java index e66ebf7..6610e9a 100644 --- a/src/main/java/com/ycwl/basic/model/mobile/statistic/AppSta1VO.java +++ b/src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppSta1VO.java @@ -1,4 +1,4 @@ -package com.ycwl.basic.model.mobile.statistic; +package com.ycwl.basic.model.mobile.statistic.resp; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/com/ycwl/basic/model/mobile/statistic/AppSta2VO.java b/src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppSta2VO.java similarity index 94% rename from src/main/java/com/ycwl/basic/model/mobile/statistic/AppSta2VO.java rename to src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppSta2VO.java index 5c2a978..b889438 100644 --- a/src/main/java/com/ycwl/basic/model/mobile/statistic/AppSta2VO.java +++ b/src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppSta2VO.java @@ -1,4 +1,4 @@ -package com.ycwl.basic.model.mobile.statistic; +package com.ycwl.basic.model.mobile.statistic.resp; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/com/ycwl/basic/model/mobile/statistic/AppSta3VO.java b/src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppSta3VO.java similarity index 94% rename from src/main/java/com/ycwl/basic/model/mobile/statistic/AppSta3VO.java rename to src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppSta3VO.java index 48ad471..bf6560e 100644 --- a/src/main/java/com/ycwl/basic/model/mobile/statistic/AppSta3VO.java +++ b/src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppSta3VO.java @@ -1,4 +1,4 @@ -package com.ycwl.basic.model.mobile.statistic; +package com.ycwl.basic.model.mobile.statistic.resp; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/com/ycwl/basic/model/mobile/statistic/AppStatisticsFunnelVO.java b/src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppStatisticsFunnelVO.java similarity index 97% rename from src/main/java/com/ycwl/basic/model/mobile/statistic/AppStatisticsFunnelVO.java rename to src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppStatisticsFunnelVO.java index 32a866f..7df85da 100644 --- a/src/main/java/com/ycwl/basic/model/mobile/statistic/AppStatisticsFunnelVO.java +++ b/src/main/java/com/ycwl/basic/model/mobile/statistic/resp/AppStatisticsFunnelVO.java @@ -1,4 +1,4 @@ -package com.ycwl.basic.model.mobile.statistic; +package com.ycwl.basic.model.mobile.statistic.resp; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/com/ycwl/basic/model/pc/order/resp/OrderItemVO.java b/src/main/java/com/ycwl/basic/model/pc/order/resp/OrderItemVO.java index 1e790a6..84027fd 100644 --- a/src/main/java/com/ycwl/basic/model/pc/order/resp/OrderItemVO.java +++ b/src/main/java/com/ycwl/basic/model/pc/order/resp/OrderItemVO.java @@ -1,10 +1,13 @@ package com.ycwl.basic.model.pc.order.resp; import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.Date; + /** * @Author:longbinbin * @Date:2024/12/3 14:07 @@ -36,4 +39,6 @@ public class OrderItemVO { private String imgUrl; @ApiModelProperty("原素材类型:1视频,2图像") private Integer sourceType; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; } diff --git a/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicAccountEntity.java b/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicAccountEntity.java index 8c8c3ee..8eea117 100644 --- a/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicAccountEntity.java +++ b/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicAccountEntity.java @@ -14,6 +14,7 @@ public class ScenicAccountEntity { private String name; private String account; private String password; + private Integer status; private Date createTime; private Date updateTime; } diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/AppScenicServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/AppScenicServiceImpl.java index f788d23..a95b3b0 100644 --- a/src/main/java/com/ycwl/basic/service/impl/mobile/AppScenicServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/mobile/AppScenicServiceImpl.java @@ -1,5 +1,6 @@ package com.ycwl.basic.service.impl.mobile; +import cn.hutool.core.bean.BeanUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.ycwl.basic.constant.BaseContextHandler; @@ -11,9 +12,12 @@ import com.ycwl.basic.model.mobile.index.TopStateResp; import com.ycwl.basic.model.mobile.scenic.ScenicAppVO; import com.ycwl.basic.model.mobile.scenic.ScenicDeviceCountVO; import com.ycwl.basic.model.mobile.scenic.ScenicIndexVO; +import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginReq; +import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginRespVO; import com.ycwl.basic.model.mobile.scenic.content.ContentPageVO; import com.ycwl.basic.model.pc.face.req.FaceReqQuery; import com.ycwl.basic.model.pc.face.resp.FaceRespVO; +import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; import com.ycwl.basic.model.pc.source.req.SourceReqQuery; @@ -58,6 +62,10 @@ public class AppScenicServiceImpl implements AppScenicService { private VideoMapper videoMapper; @Autowired private TemplateMapper templateMapper; + @Autowired + private ScenicAccountMapper scenicAccountMapper; + @Autowired + private JwtTokenUtil jwtTokenUtil; @Value("${face.score}") private BigDecimal faceScore; @@ -182,4 +190,31 @@ public class AppScenicServiceImpl implements AppScenicService { return ApiResponse.success(contentList); } + + @Override + public ApiResponse login(ScenicLoginReq scenicLoginReq) throws Exception { + + ScenicAccountEntity scenicAccount = scenicAccountMapper.getByAccount(scenicLoginReq.getAccount()); + if (scenicAccount == null) { + return ApiResponse.fail("账号不存在"); + } + if (scenicAccount.getStatus() == 0) { + return ApiResponse.fail("账号已被禁用"); + } + if (!scenicAccount.getPassword().equals(scenicLoginReq.getPassword())) { + return ApiResponse.fail("密码错误"); + } + + JwtInfo jwtInfo = new JwtInfo(); + jwtInfo.setName(scenicAccount.getName()); + jwtInfo.setAccount(scenicAccount.getAccount()); + jwtInfo.setUserId(scenicAccount.getId()); + jwtInfo.setScenicId(scenicAccount.getScenicId()); + String token = jwtTokenUtil.generateToken(jwtInfo); + + ScenicLoginRespVO scenicLoginRespVO = new ScenicLoginRespVO(); + BeanUtil.copyProperties(scenicAccount,scenicLoginRespVO); + scenicLoginRespVO.setToken(token); + return ApiResponse.success(scenicLoginRespVO); + } } diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/AppStatisticsServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/AppStatisticsServiceImpl.java index 1b1bdf3..312c555 100644 --- a/src/main/java/com/ycwl/basic/service/impl/mobile/AppStatisticsServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/mobile/AppStatisticsServiceImpl.java @@ -1,10 +1,18 @@ package com.ycwl.basic.service.impl.mobile; +import com.ycwl.basic.enums.StatisticEnum; import com.ycwl.basic.mapper.StatisticsMapper; -import com.ycwl.basic.model.mobile.statistic.*; +import com.ycwl.basic.model.jwt.JwtInfo; +import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq; +import com.ycwl.basic.model.mobile.statistic.req.StatisticsRecordAddReq; +import com.ycwl.basic.model.mobile.statistic.resp.AppSta1VO; +import com.ycwl.basic.model.mobile.statistic.resp.AppSta2VO; +import com.ycwl.basic.model.mobile.statistic.resp.AppSta3VO; +import com.ycwl.basic.model.mobile.statistic.resp.AppStatisticsFunnelVO; import com.ycwl.basic.service.mobile.AppStatisticsService; import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.DateUtils; +import com.ycwl.basic.utils.JwtTokenUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -12,6 +20,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; import java.util.Date; +import java.util.Map; /** * @Author:longbinbin @@ -196,6 +205,27 @@ public class AppStatisticsServiceImpl implements AppStatisticsService { return ApiResponse.success(vo); } + @Override + public ApiResponse addStatistics(StatisticsRecordAddReq req) { + JwtInfo worker = JwtTokenUtil.getWorker(); + Long userId = worker.getUserId(); + req.setMemberId(userId); + Integer type = req.getType(); + if(type==null){ + return ApiResponse.fail("类型不能为空"); + } + Map valueMap = StatisticEnum.cacheMap; + if(!valueMap.containsKey(type)){ + return ApiResponse.fail("添加失败,类型不存在"); + } + int i=statisticsMapper.addStatisticsRecord(req); + if(i==0){ + return ApiResponse.fail("添加失败"); + }else{ + return ApiResponse.success("添加成功"); + } + } + /** * * @param num1 diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java index 375e23c..928035f 100644 --- a/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java @@ -21,7 +21,10 @@ import com.ycwl.basic.constant.NumberConstant; import com.ycwl.basic.constant.WeiXinConstant; import com.ycwl.basic.enums.BizCodeEnum; import com.ycwl.basic.enums.OrderStateEnum; +import com.ycwl.basic.enums.StatisticEnum; import com.ycwl.basic.exception.AppException; +import com.ycwl.basic.mapper.StatisticsMapper; +import com.ycwl.basic.model.mobile.statistic.req.StatisticsRecordAddReq; import com.ycwl.basic.model.pc.order.resp.OrderRespVO; import com.ycwl.basic.model.wx.WXPayOrderReqVO; import com.ycwl.basic.model.wx.WxPayRespVO; @@ -29,6 +32,8 @@ import com.ycwl.basic.model.wx.WxchatCallbackSuccessData; import com.ycwl.basic.service.HttpService; import com.ycwl.basic.service.mobile.WxPayService; import com.ycwl.basic.service.pc.OrderService; +import com.ycwl.basic.utils.ApiResponse; +import com.ycwl.basic.utils.DateUtils; import com.ycwl.basic.utils.SnowFlakeUtil; import com.ycwl.basic.utils.WXPayUtil; import lombok.extern.slf4j.Slf4j; @@ -71,6 +76,8 @@ public class WxPayServiceImpl implements WxPayService { private HttpService httpService; @Autowired private OrderService orderService; + @Autowired + private StatisticsMapper statisticsMapper; @Override public WxPayRespVO createOrder(WXPayOrderReqVO req) { @@ -164,7 +171,16 @@ public class WxPayServiceImpl implements WxPayService { OrderStateEnum = OrderStateEnum.PAID; } if (Objects.nonNull(OrderStateEnum)) { - orderService.updateOrderState(Long.parseLong(parse.getOutTradeNo()), OrderStateEnum, null); + long orderId = Long.parseLong(parse.getOutTradeNo()); + try { + orderService.updateOrderState(orderId, OrderStateEnum, null); + // 添加统计数据 + statisticsHandler(orderId); + }catch (Exception e) { + log.error("[微信支付回调]更新订单状态失败", e); + } + + } }).start(); } catch (Exception e) { @@ -172,6 +188,28 @@ public class WxPayServiceImpl implements WxPayService { } } + // + private void statisticsHandler(Long orderId) { + ApiResponse orderDetail = orderService.detail(orderId); + OrderRespVO orderData = orderDetail.getData(); + //支付时间 + Date payAt = orderData.getPayAt(); + //商品创建时间 + Date createTime = orderData.getOrderItemList().get(0).getCreateTime(); + + StatisticsRecordAddReq statisticsRecordAddReq = new StatisticsRecordAddReq(); + statisticsRecordAddReq.setMemberId(orderData.getMemberId()); + //如果订单在商品创建后30分钟内支付,则为现场支付,否则为事后支付 + if(DateUtils.addDateMinute(createTime,30).compareTo(payAt)>0){// + statisticsRecordAddReq.setType(StatisticEnum.ON_SITE_PAYMENT.code); + }else { + statisticsRecordAddReq.setType(StatisticEnum.POST_PAYMENT.code); + } + statisticsRecordAddReq.setScenicId(orderData.getScenicId()); + statisticsRecordAddReq.setMorphId(orderId); + statisticsMapper.addStatisticsRecord(statisticsRecordAddReq); + } + @Override public WxchatCallbackSuccessData queryPay(Long orderId) { WxchatCallbackSuccessData wxchatCallbackSuccessData = new WxchatCallbackSuccessData(); @@ -253,7 +291,18 @@ public class WxPayServiceImpl implements WxPayService { String out_trade_no = reqInfo.get(WECHATPAY_OUT_TRADE_NO); // 订单号 if (!StringUtils.isEmpty(refund_status) && WECHATPAY_SUCCESS.equals(refund_status)) { - orderService.updateOrderState(Long.parseLong(out_trade_no), OrderStateEnum.REFUNDED, null); + long orderId = Long.parseLong(out_trade_no); + orderService.updateOrderState(orderId, OrderStateEnum.REFUNDED, null); + + ApiResponse detail = orderService.detail(orderId); + OrderRespVO orderData = detail.getData(); + StatisticsRecordAddReq statisticsRecordAddReq = new StatisticsRecordAddReq(); + statisticsRecordAddReq.setMemberId(orderData.getMemberId()); + statisticsRecordAddReq.setType(StatisticEnum.REFUND.code); + statisticsRecordAddReq.setScenicId(orderData.getScenicId()); + statisticsRecordAddReq.setMorphId(orderId); + statisticsMapper.addStatisticsRecord(statisticsRecordAddReq); + log.info("[微信退款回调]退款成功"); return true; } else { diff --git a/src/main/java/com/ycwl/basic/service/impl/pc/AdminUserServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/pc/AdminUserServiceImpl.java index 5e35588..40bbc91 100644 --- a/src/main/java/com/ycwl/basic/service/impl/pc/AdminUserServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/pc/AdminUserServiceImpl.java @@ -130,7 +130,7 @@ public class AdminUserServiceImpl implements AdminUserService { } } LoginRespVO loginRespVO = new LoginRespVO(); - String token = jwtTokenUtil.generateToken(new JwtInfo(login.getStaffName(), login.getStaffId(), roleId, login.getAccount(), login.getAccount(), null)); + String token = jwtTokenUtil.generateToken(new JwtInfo(login.getStaffName(), login.getStaffId(), roleId, login.getAccount(), login.getAccount(), null,null)); loginRespVO.setToken(token); loginRespVO.setName(login.getStaffName()); loginRespVO.setTypeName(login.getTypeName()); diff --git a/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java index 32bf13c..cc4727b 100644 --- a/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java @@ -4,9 +4,12 @@ import cn.hutool.core.bean.BeanUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.ycwl.basic.constant.BaseContextHandler; +import com.ycwl.basic.enums.StatisticEnum; import com.ycwl.basic.exception.BaseException; +import com.ycwl.basic.mapper.StatisticsMapper; import com.ycwl.basic.mapper.pc.FaceMapper; import com.ycwl.basic.model.jwt.JwtInfo; +import com.ycwl.basic.model.mobile.statistic.req.StatisticsRecordAddReq; import com.ycwl.basic.model.pc.face.entity.FaceEntity; import com.ycwl.basic.model.pc.face.req.FaceReqQuery; import com.ycwl.basic.model.pc.face.resp.FaceRespVO; @@ -40,6 +43,8 @@ public class FaceServiceImpl implements FaceService { private OssUtil ossUtil; @Autowired private TaskFaceService faceService; + @Autowired + private StatisticsMapper statisticsMapper; @Value("${face.score}") private float faceScore; @@ -103,20 +108,20 @@ public class FaceServiceImpl implements FaceService { // @Transactional(rollbackFor = Exception.class) public ApiResponse faceUPload(MultipartFile file,Long scenicId) { //获取用户id - String userId = BaseContextHandler.getUserId(); JwtInfo worker = JwtTokenUtil.getWorker(); + Long userId = worker.getUserId(); log.info("当前登录用户信息:{}",worker); //1、上传人脸照片 String facaeUrl = uploadFileALiOss(file, userId); // 2、查看人脸是否已上传 - FaceRespVO faceRespVO=faceMapper.getByMemberId(Long.parseLong(userId)); + FaceRespVO faceRespVO=faceMapper.getByMemberId(userId); FaceEntity faceEntity = new FaceEntity(); if (faceRespVO==null) { //新增人脸 faceEntity.setId(SnowFlakeUtil.getLongId()); - faceEntity.setMemberId(Long.parseLong(userId)); + faceEntity.setMemberId(userId); faceEntity.setFaceUrl(facaeUrl); // faceEntity.setScore(); // faceEntity.setMatchSampleIds(); @@ -138,6 +143,12 @@ public class FaceServiceImpl implements FaceService { throw new BaseException("人脸照片校验失败,请重新上传"); }else { + StatisticsRecordAddReq statisticsRecordAddReq = new StatisticsRecordAddReq(); + statisticsRecordAddReq.setMemberId(userId); + statisticsRecordAddReq.setType(StatisticEnum.UPLOAD_FACE.code); + statisticsRecordAddReq.setScenicId(scenicId); + statisticsRecordAddReq.setMorphId(faceEntity.getId()); + statisticsMapper.addStatisticsRecord(statisticsRecordAddReq); //校验成功,保存用户人脸信息,将访问人脸照片访问地址响应给前端 return ApiResponse.success(facaeUrl); } @@ -158,7 +169,7 @@ public class FaceServiceImpl implements FaceService { * @param userId 用户id * @return 地址 */ - private String uploadFileALiOss(MultipartFile file,String userId) { + private String uploadFileALiOss(MultipartFile file,Long userId) { if (file.isEmpty()) { throw new RuntimeException("文件不存在!"); } diff --git a/src/main/java/com/ycwl/basic/service/impl/pc/OrderServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/pc/OrderServiceImpl.java index ec71e4a..edda5f6 100644 --- a/src/main/java/com/ycwl/basic/service/impl/pc/OrderServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/pc/OrderServiceImpl.java @@ -4,17 +4,16 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.ycwl.basic.constant.BaseContextHandler; import com.ycwl.basic.constant.NumberConstant; -import com.ycwl.basic.enums.BizCodeEnum; -import com.ycwl.basic.enums.GoodsTypeEnum; -import com.ycwl.basic.enums.OrderStateEnum; -import com.ycwl.basic.enums.SourceTypeNameEnum; +import com.ycwl.basic.enums.*; import com.ycwl.basic.exception.AppException; +import com.ycwl.basic.mapper.StatisticsMapper; import com.ycwl.basic.mapper.pc.*; import com.ycwl.basic.model.jwt.JwtInfo; import com.ycwl.basic.model.mobile.goods.GoodsDetailVO; import com.ycwl.basic.model.mobile.goods.GoodsPriceQueryReq; import com.ycwl.basic.model.mobile.order.OrderAppPageReq; import com.ycwl.basic.model.mobile.order.RefundOrderReq; +import com.ycwl.basic.model.mobile.statistic.req.StatisticsRecordAddReq; import com.ycwl.basic.model.pc.member.resp.MemberRespVO; import com.ycwl.basic.model.pc.order.entity.OrderEntity; import com.ycwl.basic.model.pc.order.entity.OrderItemEntity; @@ -70,6 +69,8 @@ public class OrderServiceImpl implements OrderService { private GoodsService goodsService; @Autowired private OrderOperationMapper orderOperationMapper; + @Autowired + private StatisticsMapper statisticsMapper; @Override public ApiResponse> pageQuery(OrderReqQuery query) { @@ -144,10 +145,21 @@ public class OrderServiceImpl implements OrderService { log.error("订单明细添加失败"); return ApiResponse.fail("订单添加失败"); } + //点击支付按钮统计 + OrderRespVO orderRespVO = orderMapper.getById(orderId); + StatisticsRecordAddReq statisticsRecordAddReq = new StatisticsRecordAddReq(); + statisticsRecordAddReq.setMemberId(orderRespVO.getMemberId()); + statisticsRecordAddReq.setType(StatisticEnum.CLICK_ON_PAYMENT.code); + statisticsRecordAddReq.setScenicId(orderRespVO.getScenicId()); + statisticsRecordAddReq.setMorphId(orderId); + statisticsMapper.addStatisticsRecord(statisticsRecordAddReq); + //TODO 封装微信支付请求 // WxPayRespVO wxPayRespVO = initiatePayment(order, goodsDetailVO); // return ApiResponse.success(wxPayRespVO); + + return ApiResponse.success(null); } } @@ -196,7 +208,7 @@ public class OrderServiceImpl implements OrderService { public void updateOrderState(Long orderSn, OrderStateEnum orderStateEnum, String reason) { OrderUpdateReq orderUpdateReq = new OrderUpdateReq(); orderUpdateReq.setId(orderSn); - if (orderStateEnum.getType() == NumberConstant.ONE) { + if (orderStateEnum.getType() == NumberConstant.ONE) {//退款状态 0未提出,1已通过,2待审核 orderUpdateReq.setRefundStatus(orderStateEnum.getState()); orderUpdateReq.setRefundAt(new Date()); if (orderStateEnum.getState() == OrderStateEnum.PASSED.getState()) { @@ -204,15 +216,14 @@ public class OrderServiceImpl implements OrderService { } else if (Objects.nonNull(reason)) { orderUpdateReq.setRefundReason(reason); } - } else if (orderStateEnum.getType() == NumberConstant.TWO) { + } else if (orderStateEnum.getType() == NumberConstant.TWO) {//订单状态 0未支付,1已支付,2已退款,9已取消 int state = orderStateEnum.getState(); orderUpdateReq.setPayAt(new Date()); orderUpdateReq.setStatus(orderStateEnum.getState()); - if (state == OrderStateEnum.CANCELED.getState()) { + if (state == OrderStateEnum.CANCELED.getState()) {//取消支付 orderUpdateReq.setCancelAt(new Date()); - } - //如果订单未支付就把商品状态更改成未购买 - if (state != OrderStateEnum.PAID.getState()) { + + //如果订单未支付就把商品状态更改成未购买 OrderRespVO orderRespVO = orderMapper.getById(orderSn); Integer goodsType = orderRespVO.getGoodsType(); List orderItemList = orderRespVO.getOrderItemList(); @@ -230,7 +241,13 @@ public class OrderServiceImpl implements OrderService { sourceMapper.update(sourceEntity); } }); - } else if (state == OrderStateEnum.REFUNDED.getState()) {//订单退款成功就把商品状态更改成未购买 + } else if (state== OrderStateEnum.PAID.getState()) {//支付成功 + orderUpdateReq.setPayAt(new Date()); + + }else if (state == OrderStateEnum.REFUNDED.getState()) {//退款成功 + orderUpdateReq.setRefundAt(new Date()); + + //订单退款成功就把商品状态更改成未购买 OrderRespVO orderRespVO = orderMapper.getById(orderSn); Integer goodsType = orderRespVO.getGoodsType(); List orderItemList = orderRespVO.getOrderItemList(); diff --git a/src/main/java/com/ycwl/basic/service/mobile/AppScenicService.java b/src/main/java/com/ycwl/basic/service/mobile/AppScenicService.java index 14208a6..d129eeb 100644 --- a/src/main/java/com/ycwl/basic/service/mobile/AppScenicService.java +++ b/src/main/java/com/ycwl/basic/service/mobile/AppScenicService.java @@ -5,6 +5,8 @@ import com.ycwl.basic.model.mobile.index.TopStateResp; import com.ycwl.basic.model.mobile.scenic.ScenicAppVO; import com.ycwl.basic.model.mobile.scenic.ScenicDeviceCountVO; import com.ycwl.basic.model.mobile.scenic.ScenicIndexVO; +import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginReq; +import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginRespVO; import com.ycwl.basic.model.mobile.scenic.content.ContentPageVO; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; @@ -39,4 +41,6 @@ public interface AppScenicService { ApiResponse topState(); ApiResponse> contentList(Long scenicId); + + ApiResponse login(ScenicLoginReq scenicLoginReq) throws Exception; } diff --git a/src/main/java/com/ycwl/basic/service/mobile/AppStatisticsService.java b/src/main/java/com/ycwl/basic/service/mobile/AppStatisticsService.java index 4695771..b663e79 100644 --- a/src/main/java/com/ycwl/basic/service/mobile/AppStatisticsService.java +++ b/src/main/java/com/ycwl/basic/service/mobile/AppStatisticsService.java @@ -1,6 +1,11 @@ package com.ycwl.basic.service.mobile; -import com.ycwl.basic.model.mobile.statistic.*; +import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq; +import com.ycwl.basic.model.mobile.statistic.req.StatisticsRecordAddReq; +import com.ycwl.basic.model.mobile.statistic.resp.AppSta1VO; +import com.ycwl.basic.model.mobile.statistic.resp.AppSta2VO; +import com.ycwl.basic.model.mobile.statistic.resp.AppSta3VO; +import com.ycwl.basic.model.mobile.statistic.resp.AppStatisticsFunnelVO; import com.ycwl.basic.utils.ApiResponse; /** @@ -16,4 +21,6 @@ public interface AppStatisticsService { ApiResponse freeStatistics(CommonQueryReq query); ApiResponse userConversionFunnel(CommonQueryReq query); + + ApiResponse addStatistics(StatisticsRecordAddReq req); } diff --git a/src/main/java/com/ycwl/basic/utils/DateUtils.java b/src/main/java/com/ycwl/basic/utils/DateUtils.java index 69e1af8..e9fa83c 100644 --- a/src/main/java/com/ycwl/basic/utils/DateUtils.java +++ b/src/main/java/com/ycwl/basic/utils/DateUtils.java @@ -485,14 +485,27 @@ public class DateUtils { calendar.add(Calendar.DAY_OF_YEAR, i); return calendar.getTime(); } + /** + * 在指定日期上增加i分钟,负数为减少i分钟 + * @param date + * @param i + * @return + */ + public static Date addDateMinute(Date date, int i) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.MINUTE, i); + return calendar.getTime(); + } public static void main(String[] args) { Date date = new Date(); - Date yesterday = DateUtils.addDateDays(date, -1); - Date startDate = DateUtils.getStartOfDay(yesterday); - Date endDate = DateUtils.getEndOfDay(yesterday); - System.out.println(format(startDate, "yyyy-MM-dd HH:mm:ss")); - System.out.println(format(endDate, "yyyy-MM-dd HH:mm:ss")); + Date yesterday = DateUtils.addDateMinute(date, 10); + System.out.println(format(yesterday, "yyyy-MM-dd HH:mm:ss")); +// Date startDate = DateUtils.getStartOfDay(yesterday); +// Date endDate = DateUtils.getEndOfDay(yesterday); +// System.out.println(format(startDate, "yyyy-MM-dd HH:mm:ss")); +// System.out.println(format(endDate, "yyyy-MM-dd HH:mm:ss")); } } diff --git a/src/main/java/com/ycwl/basic/utils/JwtAnalysisUtil.java b/src/main/java/com/ycwl/basic/utils/JwtAnalysisUtil.java index 26685bb..9dcc59d 100644 --- a/src/main/java/com/ycwl/basic/utils/JwtAnalysisUtil.java +++ b/src/main/java/com/ycwl/basic/utils/JwtAnalysisUtil.java @@ -58,6 +58,7 @@ public class JwtAnalysisUtil { && !"account".equals(entry.getKey()) && !"name".equals(entry.getKey()) && !"roleName".equals(entry.getKey()) + && !"scenicId".equals(entry.getKey()) && !"expire".equals(entry.getKey())); } @@ -82,6 +83,7 @@ public class JwtAnalysisUtil { StringUtil.a(body.get("roleId")), body.getSubject(), StringUtil.a(body.get("phone")), + body.get("scenicId") == null ? null : Long.valueOf(body.get("scenicId").toString()), expireTime); } } diff --git a/src/main/resources/mapper/pc/OrderMapper.xml b/src/main/resources/mapper/pc/OrderMapper.xml index 4c0695c..28e643e 100644 --- a/src/main/resources/mapper/pc/OrderMapper.xml +++ b/src/main/resources/mapper/pc/OrderMapper.xml @@ -32,6 +32,7 @@ + @@ -66,7 +67,8 @@ if(oi.goods_type='1',t.name,(select count(1) from order_item oi2 where oi2.order_id=oi.order_id)) as goodsName, if(oi.goods_type='1',vd.video_url,sr.video_url) videoUrl, if(oi.goods_type='2',sr.url,null) imgUrl, - if(oi.goods_type='2',sr.type,null) sourceType + if(oi.goods_type='2',sr.type,null) sourceType, + if(oi.goods_type='1',vd.create_time,sr.create_time) createTime from order_item oi left join source sr on oi.goods_type='2' and oi.goods_id = sr.id left join video vd on oi.goods_type='1' and oi.goods_id = vd.id diff --git a/src/main/resources/mapper/pc/ScenicAccountMapper.xml b/src/main/resources/mapper/pc/ScenicAccountMapper.xml index 8dd25d7..1cbb251 100644 --- a/src/main/resources/mapper/pc/ScenicAccountMapper.xml +++ b/src/main/resources/mapper/pc/ScenicAccountMapper.xml @@ -45,7 +45,7 @@ where scenic_id = #{scenicId} and is_super = 1 diff --git a/src/main/resources/mapper/pc/StatisticsMapper.xml b/src/main/resources/mapper/pc/StatisticsMapper.xml index 0a52c10..3dceabe 100644 --- a/src/main/resources/mapper/pc/StatisticsMapper.xml +++ b/src/main/resources/mapper/pc/StatisticsMapper.xml @@ -1,6 +1,11 @@ + + insert into statistics(id,member_id,type,create_time,morph_id,scenic_id) + value (#{id},#{memberId},#{type},#{createTime},#{morphId},#{scenicId}) + +