添加景区账号的登陆功能

添加“上传人脸、现场支付、事后支付、退款、点击购买”操作的数据记录
This commit is contained in:
longbinbin 2024-12-13 11:25:02 +08:00
parent 715c351f5f
commit 6fca6df89f
29 changed files with 344 additions and 45 deletions

View File

@ -57,7 +57,7 @@ public class AppWxPayController {
BizCodeEnum.ADVANCE_PAYMENT_REFUND_FAILED); BizCodeEnum.ADVANCE_PAYMENT_REFUND_FAILED);
} }
@ApiOperation(value = "微信支付回调", notes = "微信支付回调") @ApiOperation(value = "微信支付退款回调", notes = "微信支付退款回调")
@PostMapping("/refundNotify") @PostMapping("/refundNotify")
@IgnoreToken @IgnoreToken
public ApiResponse<?> refundNotify(@RequestBody String refundResult) throws GeneralSecurityException, IOException { public ApiResponse<?> refundNotify(@RequestBody String refundResult) throws GeneralSecurityException, IOException {

View File

@ -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;
/**
* @Authorlongbinbin
* @Date2024/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<ScenicLoginRespVO> login(@RequestBody ScenicLoginReq scenicLoginReq) throws Exception {
return scenicService.login(scenicLoginReq);
}
}

View File

@ -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.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.service.mobile.AppStatisticsService;
import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ApiResponse;
import com.ycwl.basic.utils.JwtTokenUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; 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.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -14,6 +21,7 @@ import org.springframework.web.bind.annotation.*;
* @Authorlongbinbin * @Authorlongbinbin
* @Date2024/12/11 18:08 * @Date2024/12/11 18:08
*/ */
@Slf4j
@RestController @RestController
@RequestMapping("/api/mobile/statistics/v1") @RequestMapping("/api/mobile/statistics/v1")
@Api(tags = "数据统计相关接口") @Api(tags = "数据统计相关接口")
@ -24,15 +32,17 @@ public class AppStatisticsController {
@ApiOperation("支付订单金额、预览_支付转化率、扫码_付费用户转化率") @ApiOperation("支付订单金额、预览_支付转化率、扫码_付费用户转化率")
@PostMapping("/one") @PostMapping("/one")
@IgnoreToken
public ApiResponse<AppSta1VO> oneStatistics(@RequestBody CommonQueryReq query) { public ApiResponse<AppSta1VO> oneStatistics(@RequestBody CommonQueryReq query) {
JwtInfo worker = JwtTokenUtil.getWorker();
log.info("oneStatistics 当前用户信息:{}", worker);
Long scenicId = worker.getScenicId();
query.setScenicId(scenicId);
return statisticsService.oneStatistics(query); return statisticsService.oneStatistics(query);
} }
@ApiOperation("支付订单数、现场订单数、推送订单数统计") @ApiOperation("支付订单数、现场订单数、推送订单数统计")
@PostMapping("/two") @PostMapping("/two")
@IgnoreToken
public ApiResponse<AppSta2VO> twoStatistics(@RequestBody CommonQueryReq query) { public ApiResponse<AppSta2VO> twoStatistics(@RequestBody CommonQueryReq query) {
return statisticsService.twoStatistics(query); return statisticsService.twoStatistics(query);
@ -40,7 +50,6 @@ public class AppStatisticsController {
@ApiOperation("扫码访问人数、推送订阅人数、预览视频人数统计") @ApiOperation("扫码访问人数、推送订阅人数、预览视频人数统计")
@PostMapping("/free") @PostMapping("/free")
@IgnoreToken
public ApiResponse<AppSta3VO> freeStatistics(@RequestBody CommonQueryReq query) { public ApiResponse<AppSta3VO> freeStatistics(@RequestBody CommonQueryReq query) {
return statisticsService.freeStatistics(query); return statisticsService.freeStatistics(query);
@ -48,16 +57,16 @@ public class AppStatisticsController {
@ApiOperation("用户转化漏斗") @ApiOperation("用户转化漏斗")
@PostMapping("/userConversionFunnel") @PostMapping("/userConversionFunnel")
@IgnoreToken
public ApiResponse<AppStatisticsFunnelVO> userConversionFunnel(@RequestBody CommonQueryReq query) { public ApiResponse<AppStatisticsFunnelVO> userConversionFunnel(@RequestBody CommonQueryReq query) {
return statisticsService.userConversionFunnel(query); return statisticsService.userConversionFunnel(query);
} }
@ApiOperation("统计数据记录") @ApiOperation("统计数据记录")
@PostMapping("/statistics") @PostMapping("/addStatistics")
public ApiResponse statistics() { public ApiResponse addStatistics(@RequestBody StatisticsRecordAddReq req) {
return null;
return statisticsService.addStatistics(req);
} }
} }

View File

@ -11,7 +11,6 @@ public enum StatisticEnum {
POST_PAYMENT(4,"事后支付"), POST_PAYMENT(4,"事后支付"),
REFUND(5,"退款"), REFUND(5,"退款"),
AGREE_TO_PUSH(6,"同意推送"), AGREE_TO_PUSH(6,"同意推送"),
REFUSE_PUSH_NOTIFICATIONS(7,"拒绝推送"),
DOWNLOAD(8,"下载"), DOWNLOAD(8,"下载"),
CLICK_ON_PAYMENT(9,"点击支付、购买"), CLICK_ON_PAYMENT(9,"点击支付、购买"),

View File

@ -1,6 +1,7 @@
package com.ycwl.basic.mapper; 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 org.apache.ibatis.annotations.Mapper;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -84,4 +85,6 @@ public interface StatisticsMapper {
Integer countRefundOfOrder(CommonQueryReq query); Integer countRefundOfOrder(CommonQueryReq query);
BigDecimal countRefundAmount(CommonQueryReq query); BigDecimal countRefundAmount(CommonQueryReq query);
int addStatisticsRecord(StatisticsRecordAddReq req);
} }

View File

@ -42,6 +42,11 @@ public class JwtInfo implements Serializable {
private String phone; private String phone;
/**
* 景区id
*/
private Long scenicId;
/** /**
* 生成 token 的时间 * 生成 token 的时间

View File

@ -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;
/**
* @Authorlongbinbin
* @Date2024/12/13 9:44
*/
@Data
@ApiModel("景区账号登录请求类")
public class ScenicLoginReq {
@ApiModelProperty("账号")
private String account;
@ApiModelProperty("密码")
private String password;
}

View File

@ -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;
/**
* @Authorlongbinbin
* @Date2024/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;
}

View File

@ -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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;

View File

@ -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;
/**
* @Authorlongbinbin
* @Date2024/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;
}

View File

@ -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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;

View File

@ -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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;

View File

@ -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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;

View File

@ -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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;

View File

@ -1,10 +1,13 @@
package com.ycwl.basic.model.pc.order.resp; package com.ycwl.basic.model.pc.order.resp;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.util.Date;
/** /**
* @Authorlongbinbin * @Authorlongbinbin
* @Date2024/12/3 14:07 * @Date2024/12/3 14:07
@ -36,4 +39,6 @@ public class OrderItemVO {
private String imgUrl; private String imgUrl;
@ApiModelProperty("原素材类型1视频2图像") @ApiModelProperty("原素材类型1视频2图像")
private Integer sourceType; private Integer sourceType;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
} }

View File

@ -14,6 +14,7 @@ public class ScenicAccountEntity {
private String name; private String name;
private String account; private String account;
private String password; private String password;
private Integer status;
private Date createTime; private Date createTime;
private Date updateTime; private Date updateTime;
} }

View File

@ -1,5 +1,6 @@
package com.ycwl.basic.service.impl.mobile; package com.ycwl.basic.service.impl.mobile;
import cn.hutool.core.bean.BeanUtil;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.ycwl.basic.constant.BaseContextHandler; 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.ScenicAppVO;
import com.ycwl.basic.model.mobile.scenic.ScenicDeviceCountVO; import com.ycwl.basic.model.mobile.scenic.ScenicDeviceCountVO;
import com.ycwl.basic.model.mobile.scenic.ScenicIndexVO; 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.mobile.scenic.content.ContentPageVO;
import com.ycwl.basic.model.pc.face.req.FaceReqQuery; import com.ycwl.basic.model.pc.face.req.FaceReqQuery;
import com.ycwl.basic.model.pc.face.resp.FaceRespVO; 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.req.ScenicReqQuery;
import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO;
import com.ycwl.basic.model.pc.source.req.SourceReqQuery; import com.ycwl.basic.model.pc.source.req.SourceReqQuery;
@ -58,6 +62,10 @@ public class AppScenicServiceImpl implements AppScenicService {
private VideoMapper videoMapper; private VideoMapper videoMapper;
@Autowired @Autowired
private TemplateMapper templateMapper; private TemplateMapper templateMapper;
@Autowired
private ScenicAccountMapper scenicAccountMapper;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Value("${face.score}") @Value("${face.score}")
private BigDecimal faceScore; private BigDecimal faceScore;
@ -182,4 +190,31 @@ public class AppScenicServiceImpl implements AppScenicService {
return ApiResponse.success(contentList); return ApiResponse.success(contentList);
} }
@Override
public ApiResponse<ScenicLoginRespVO> 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);
}
} }

View File

@ -1,10 +1,18 @@
package com.ycwl.basic.service.impl.mobile; package com.ycwl.basic.service.impl.mobile;
import com.ycwl.basic.enums.StatisticEnum;
import com.ycwl.basic.mapper.StatisticsMapper; 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.service.mobile.AppStatisticsService;
import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ApiResponse;
import com.ycwl.basic.utils.DateUtils; import com.ycwl.basic.utils.DateUtils;
import com.ycwl.basic.utils.JwtTokenUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -12,6 +20,7 @@ import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.Date; import java.util.Date;
import java.util.Map;
/** /**
* @Authorlongbinbin * @Authorlongbinbin
@ -196,6 +205,27 @@ public class AppStatisticsServiceImpl implements AppStatisticsService {
return ApiResponse.success(vo); 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<Integer, StatisticEnum> 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 * @param num1

View File

@ -21,7 +21,10 @@ import com.ycwl.basic.constant.NumberConstant;
import com.ycwl.basic.constant.WeiXinConstant; import com.ycwl.basic.constant.WeiXinConstant;
import com.ycwl.basic.enums.BizCodeEnum; import com.ycwl.basic.enums.BizCodeEnum;
import com.ycwl.basic.enums.OrderStateEnum; import com.ycwl.basic.enums.OrderStateEnum;
import com.ycwl.basic.enums.StatisticEnum;
import com.ycwl.basic.exception.AppException; 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.pc.order.resp.OrderRespVO;
import com.ycwl.basic.model.wx.WXPayOrderReqVO; import com.ycwl.basic.model.wx.WXPayOrderReqVO;
import com.ycwl.basic.model.wx.WxPayRespVO; 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.HttpService;
import com.ycwl.basic.service.mobile.WxPayService; import com.ycwl.basic.service.mobile.WxPayService;
import com.ycwl.basic.service.pc.OrderService; 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.SnowFlakeUtil;
import com.ycwl.basic.utils.WXPayUtil; import com.ycwl.basic.utils.WXPayUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -71,6 +76,8 @@ public class WxPayServiceImpl implements WxPayService {
private HttpService httpService; private HttpService httpService;
@Autowired @Autowired
private OrderService orderService; private OrderService orderService;
@Autowired
private StatisticsMapper statisticsMapper;
@Override @Override
public WxPayRespVO createOrder(WXPayOrderReqVO req) { public WxPayRespVO createOrder(WXPayOrderReqVO req) {
@ -164,7 +171,16 @@ public class WxPayServiceImpl implements WxPayService {
OrderStateEnum = OrderStateEnum.PAID; OrderStateEnum = OrderStateEnum.PAID;
} }
if (Objects.nonNull(OrderStateEnum)) { 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(); }).start();
} catch (Exception e) { } catch (Exception e) {
@ -172,6 +188,28 @@ public class WxPayServiceImpl implements WxPayService {
} }
} }
//
private void statisticsHandler(Long orderId) {
ApiResponse<OrderRespVO> 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 @Override
public WxchatCallbackSuccessData queryPay(Long orderId) { public WxchatCallbackSuccessData queryPay(Long orderId) {
WxchatCallbackSuccessData wxchatCallbackSuccessData = new WxchatCallbackSuccessData(); WxchatCallbackSuccessData wxchatCallbackSuccessData = new WxchatCallbackSuccessData();
@ -253,7 +291,18 @@ public class WxPayServiceImpl implements WxPayService {
String out_trade_no = reqInfo.get(WECHATPAY_OUT_TRADE_NO); // 订单号 String out_trade_no = reqInfo.get(WECHATPAY_OUT_TRADE_NO); // 订单号
if (!StringUtils.isEmpty(refund_status) && WECHATPAY_SUCCESS.equals(refund_status)) { 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<OrderRespVO> 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("[微信退款回调]退款成功"); log.info("[微信退款回调]退款成功");
return true; return true;
} else { } else {

View File

@ -130,7 +130,7 @@ public class AdminUserServiceImpl implements AdminUserService {
} }
} }
LoginRespVO loginRespVO = new LoginRespVO(); 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.setToken(token);
loginRespVO.setName(login.getStaffName()); loginRespVO.setName(login.getStaffName());
loginRespVO.setTypeName(login.getTypeName()); loginRespVO.setTypeName(login.getTypeName());

View File

@ -4,9 +4,12 @@ import cn.hutool.core.bean.BeanUtil;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.ycwl.basic.constant.BaseContextHandler; import com.ycwl.basic.constant.BaseContextHandler;
import com.ycwl.basic.enums.StatisticEnum;
import com.ycwl.basic.exception.BaseException; import com.ycwl.basic.exception.BaseException;
import com.ycwl.basic.mapper.StatisticsMapper;
import com.ycwl.basic.mapper.pc.FaceMapper; import com.ycwl.basic.mapper.pc.FaceMapper;
import com.ycwl.basic.model.jwt.JwtInfo; 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.entity.FaceEntity;
import com.ycwl.basic.model.pc.face.req.FaceReqQuery; import com.ycwl.basic.model.pc.face.req.FaceReqQuery;
import com.ycwl.basic.model.pc.face.resp.FaceRespVO; import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
@ -40,6 +43,8 @@ public class FaceServiceImpl implements FaceService {
private OssUtil ossUtil; private OssUtil ossUtil;
@Autowired @Autowired
private TaskFaceService faceService; private TaskFaceService faceService;
@Autowired
private StatisticsMapper statisticsMapper;
@Value("${face.score}") @Value("${face.score}")
private float faceScore; private float faceScore;
@ -103,20 +108,20 @@ public class FaceServiceImpl implements FaceService {
// @Transactional(rollbackFor = Exception.class) // @Transactional(rollbackFor = Exception.class)
public ApiResponse faceUPload(MultipartFile file,Long scenicId) { public ApiResponse faceUPload(MultipartFile file,Long scenicId) {
//获取用户id //获取用户id
String userId = BaseContextHandler.getUserId();
JwtInfo worker = JwtTokenUtil.getWorker(); JwtInfo worker = JwtTokenUtil.getWorker();
Long userId = worker.getUserId();
log.info("当前登录用户信息:{}",worker); log.info("当前登录用户信息:{}",worker);
//1上传人脸照片 //1上传人脸照片
String facaeUrl = uploadFileALiOss(file, userId); String facaeUrl = uploadFileALiOss(file, userId);
// 2查看人脸是否已上传 // 2查看人脸是否已上传
FaceRespVO faceRespVO=faceMapper.getByMemberId(Long.parseLong(userId)); FaceRespVO faceRespVO=faceMapper.getByMemberId(userId);
FaceEntity faceEntity = new FaceEntity(); FaceEntity faceEntity = new FaceEntity();
if (faceRespVO==null) { if (faceRespVO==null) {
//新增人脸 //新增人脸
faceEntity.setId(SnowFlakeUtil.getLongId()); faceEntity.setId(SnowFlakeUtil.getLongId());
faceEntity.setMemberId(Long.parseLong(userId)); faceEntity.setMemberId(userId);
faceEntity.setFaceUrl(facaeUrl); faceEntity.setFaceUrl(facaeUrl);
// faceEntity.setScore(); // faceEntity.setScore();
// faceEntity.setMatchSampleIds(); // faceEntity.setMatchSampleIds();
@ -138,6 +143,12 @@ public class FaceServiceImpl implements FaceService {
throw new BaseException("人脸照片校验失败,请重新上传"); throw new BaseException("人脸照片校验失败,请重新上传");
}else { }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); return ApiResponse.success(facaeUrl);
} }
@ -158,7 +169,7 @@ public class FaceServiceImpl implements FaceService {
* @param userId 用户id * @param userId 用户id
* @return 地址 * @return 地址
*/ */
private String uploadFileALiOss(MultipartFile file,String userId) { private String uploadFileALiOss(MultipartFile file,Long userId) {
if (file.isEmpty()) { if (file.isEmpty()) {
throw new RuntimeException("文件不存在!"); throw new RuntimeException("文件不存在!");
} }

View File

@ -4,17 +4,16 @@ import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.ycwl.basic.constant.BaseContextHandler; import com.ycwl.basic.constant.BaseContextHandler;
import com.ycwl.basic.constant.NumberConstant; import com.ycwl.basic.constant.NumberConstant;
import com.ycwl.basic.enums.BizCodeEnum; import com.ycwl.basic.enums.*;
import com.ycwl.basic.enums.GoodsTypeEnum;
import com.ycwl.basic.enums.OrderStateEnum;
import com.ycwl.basic.enums.SourceTypeNameEnum;
import com.ycwl.basic.exception.AppException; import com.ycwl.basic.exception.AppException;
import com.ycwl.basic.mapper.StatisticsMapper;
import com.ycwl.basic.mapper.pc.*; import com.ycwl.basic.mapper.pc.*;
import com.ycwl.basic.model.jwt.JwtInfo; import com.ycwl.basic.model.jwt.JwtInfo;
import com.ycwl.basic.model.mobile.goods.GoodsDetailVO; import com.ycwl.basic.model.mobile.goods.GoodsDetailVO;
import com.ycwl.basic.model.mobile.goods.GoodsPriceQueryReq; import com.ycwl.basic.model.mobile.goods.GoodsPriceQueryReq;
import com.ycwl.basic.model.mobile.order.OrderAppPageReq; import com.ycwl.basic.model.mobile.order.OrderAppPageReq;
import com.ycwl.basic.model.mobile.order.RefundOrderReq; 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.member.resp.MemberRespVO;
import com.ycwl.basic.model.pc.order.entity.OrderEntity; import com.ycwl.basic.model.pc.order.entity.OrderEntity;
import com.ycwl.basic.model.pc.order.entity.OrderItemEntity; import com.ycwl.basic.model.pc.order.entity.OrderItemEntity;
@ -70,6 +69,8 @@ public class OrderServiceImpl implements OrderService {
private GoodsService goodsService; private GoodsService goodsService;
@Autowired @Autowired
private OrderOperationMapper orderOperationMapper; private OrderOperationMapper orderOperationMapper;
@Autowired
private StatisticsMapper statisticsMapper;
@Override @Override
public ApiResponse<PageInfo<OrderRespVO>> pageQuery(OrderReqQuery query) { public ApiResponse<PageInfo<OrderRespVO>> pageQuery(OrderReqQuery query) {
@ -144,10 +145,21 @@ public class OrderServiceImpl implements OrderService {
log.error("订单明细添加失败"); log.error("订单明细添加失败");
return ApiResponse.fail("订单添加失败"); 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 封装微信支付请求 //TODO 封装微信支付请求
// WxPayRespVO wxPayRespVO = initiatePayment(order, goodsDetailVO); // WxPayRespVO wxPayRespVO = initiatePayment(order, goodsDetailVO);
// return ApiResponse.success(wxPayRespVO); // return ApiResponse.success(wxPayRespVO);
return ApiResponse.success(null); return ApiResponse.success(null);
} }
} }
@ -196,7 +208,7 @@ public class OrderServiceImpl implements OrderService {
public void updateOrderState(Long orderSn, OrderStateEnum orderStateEnum, String reason) { public void updateOrderState(Long orderSn, OrderStateEnum orderStateEnum, String reason) {
OrderUpdateReq orderUpdateReq = new OrderUpdateReq(); OrderUpdateReq orderUpdateReq = new OrderUpdateReq();
orderUpdateReq.setId(orderSn); orderUpdateReq.setId(orderSn);
if (orderStateEnum.getType() == NumberConstant.ONE) { if (orderStateEnum.getType() == NumberConstant.ONE) {//退款状态 0未提出1已通过2待审核
orderUpdateReq.setRefundStatus(orderStateEnum.getState()); orderUpdateReq.setRefundStatus(orderStateEnum.getState());
orderUpdateReq.setRefundAt(new Date()); orderUpdateReq.setRefundAt(new Date());
if (orderStateEnum.getState() == OrderStateEnum.PASSED.getState()) { if (orderStateEnum.getState() == OrderStateEnum.PASSED.getState()) {
@ -204,15 +216,14 @@ public class OrderServiceImpl implements OrderService {
} else if (Objects.nonNull(reason)) { } else if (Objects.nonNull(reason)) {
orderUpdateReq.setRefundReason(reason); orderUpdateReq.setRefundReason(reason);
} }
} else if (orderStateEnum.getType() == NumberConstant.TWO) { } else if (orderStateEnum.getType() == NumberConstant.TWO) {//订单状态 0未支付1已支付2已退款9已取消
int state = orderStateEnum.getState(); int state = orderStateEnum.getState();
orderUpdateReq.setPayAt(new Date()); orderUpdateReq.setPayAt(new Date());
orderUpdateReq.setStatus(orderStateEnum.getState()); orderUpdateReq.setStatus(orderStateEnum.getState());
if (state == OrderStateEnum.CANCELED.getState()) { if (state == OrderStateEnum.CANCELED.getState()) {//取消支付
orderUpdateReq.setCancelAt(new Date()); orderUpdateReq.setCancelAt(new Date());
}
//如果订单未支付就把商品状态更改成未购买 //如果订单未支付就把商品状态更改成未购买
if (state != OrderStateEnum.PAID.getState()) {
OrderRespVO orderRespVO = orderMapper.getById(orderSn); OrderRespVO orderRespVO = orderMapper.getById(orderSn);
Integer goodsType = orderRespVO.getGoodsType(); Integer goodsType = orderRespVO.getGoodsType();
List<OrderItemVO> orderItemList = orderRespVO.getOrderItemList(); List<OrderItemVO> orderItemList = orderRespVO.getOrderItemList();
@ -230,7 +241,13 @@ public class OrderServiceImpl implements OrderService {
sourceMapper.update(sourceEntity); 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); OrderRespVO orderRespVO = orderMapper.getById(orderSn);
Integer goodsType = orderRespVO.getGoodsType(); Integer goodsType = orderRespVO.getGoodsType();
List<OrderItemVO> orderItemList = orderRespVO.getOrderItemList(); List<OrderItemVO> orderItemList = orderRespVO.getOrderItemList();

View File

@ -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.ScenicAppVO;
import com.ycwl.basic.model.mobile.scenic.ScenicDeviceCountVO; import com.ycwl.basic.model.mobile.scenic.ScenicDeviceCountVO;
import com.ycwl.basic.model.mobile.scenic.ScenicIndexVO; 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.mobile.scenic.content.ContentPageVO;
import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery;
import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO;
@ -39,4 +41,6 @@ public interface AppScenicService {
ApiResponse<TopStateResp> topState(); ApiResponse<TopStateResp> topState();
ApiResponse<List<ContentPageVO>> contentList(Long scenicId); ApiResponse<List<ContentPageVO>> contentList(Long scenicId);
ApiResponse<ScenicLoginRespVO> login(ScenicLoginReq scenicLoginReq) throws Exception;
} }

View File

@ -1,6 +1,11 @@
package com.ycwl.basic.service.mobile; 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; import com.ycwl.basic.utils.ApiResponse;
/** /**
@ -16,4 +21,6 @@ public interface AppStatisticsService {
ApiResponse<AppSta3VO> freeStatistics(CommonQueryReq query); ApiResponse<AppSta3VO> freeStatistics(CommonQueryReq query);
ApiResponse<AppStatisticsFunnelVO> userConversionFunnel(CommonQueryReq query); ApiResponse<AppStatisticsFunnelVO> userConversionFunnel(CommonQueryReq query);
ApiResponse addStatistics(StatisticsRecordAddReq req);
} }

View File

@ -485,14 +485,27 @@ public class DateUtils {
calendar.add(Calendar.DAY_OF_YEAR, i); calendar.add(Calendar.DAY_OF_YEAR, i);
return calendar.getTime(); 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) { public static void main(String[] args) {
Date date = new Date(); Date date = new Date();
Date yesterday = DateUtils.addDateDays(date, -1); Date yesterday = DateUtils.addDateMinute(date, 10);
Date startDate = DateUtils.getStartOfDay(yesterday); System.out.println(format(yesterday, "yyyy-MM-dd HH:mm:ss"));
Date endDate = DateUtils.getEndOfDay(yesterday); // Date startDate = DateUtils.getStartOfDay(yesterday);
System.out.println(format(startDate, "yyyy-MM-dd HH:mm:ss")); // Date endDate = DateUtils.getEndOfDay(yesterday);
System.out.println(format(endDate, "yyyy-MM-dd HH:mm:ss")); // System.out.println(format(startDate, "yyyy-MM-dd HH:mm:ss"));
// System.out.println(format(endDate, "yyyy-MM-dd HH:mm:ss"));
} }
} }

View File

@ -58,6 +58,7 @@ public class JwtAnalysisUtil {
&& !"account".equals(entry.getKey()) && !"account".equals(entry.getKey())
&& !"name".equals(entry.getKey()) && !"name".equals(entry.getKey())
&& !"roleName".equals(entry.getKey()) && !"roleName".equals(entry.getKey())
&& !"scenicId".equals(entry.getKey())
&& !"expire".equals(entry.getKey())); && !"expire".equals(entry.getKey()));
} }
@ -82,6 +83,7 @@ public class JwtAnalysisUtil {
StringUtil.a(body.get("roleId")), StringUtil.a(body.get("roleId")),
body.getSubject(), body.getSubject(),
StringUtil.a(body.get("phone")), StringUtil.a(body.get("phone")),
body.get("scenicId") == null ? null : Long.valueOf(body.get("scenicId").toString()),
expireTime); expireTime);
} }
} }

View File

@ -32,6 +32,7 @@
<result column="videoUrl" property="videoUrl"/> <result column="videoUrl" property="videoUrl"/>
<result column="imgUrl" property="imgUrl"/> <result column="imgUrl" property="imgUrl"/>
<result column="sourceType" property="sourceType"/> <result column="sourceType" property="sourceType"/>
<result column="createTime" property="createTime"/>
</collection> </collection>
</resultMap> </resultMap>
<resultMap id="AppBaseResultMap" type="com.ycwl.basic.model.pc.order.resp.OrderAppRespVO"> <resultMap id="AppBaseResultMap" type="com.ycwl.basic.model.pc.order.resp.OrderAppRespVO">
@ -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',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='1',vd.video_url,sr.video_url) videoUrl,
if(oi.goods_type='2',sr.url,null) imgUrl, 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 from order_item oi
left join source sr on oi.goods_type='2' and oi.goods_id = sr.id 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 left join video vd on oi.goods_type='1' and oi.goods_id = vd.id

View File

@ -45,7 +45,7 @@
where scenic_id = #{scenicId} and is_super = 1 where scenic_id = #{scenicId} and is_super = 1
</select> </select>
<select id="getByAccount" resultType="com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity"> <select id="getByAccount" resultType="com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity">
select id, scenic_id, is_super, name, account, password, create_time, update_time select id, scenic_id, is_super, name, account, password, status,create_time, update_time
from scenic_account from scenic_account
where account = #{account} where account = #{account}
</select> </select>

View File

@ -1,6 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?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"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ycwl.basic.mapper.StatisticsMapper"> <mapper namespace="com.ycwl.basic.mapper.StatisticsMapper">
<insert id="addStatisticsRecord">
insert into statistics(id,member_id,type,create_time,morph_id,scenic_id)
value (#{id},#{memberId},#{type},#{createTime},#{morphId},#{scenicId})
</insert>
<select id="countOrderAmount" resultType="java.math.BigDecimal"> <select id="countOrderAmount" resultType="java.math.BigDecimal">
select ifnull(sum(pay_price),0) as payPrice select ifnull(sum(pay_price),0) as payPrice
from `order` from `order`