添加景区账号的登陆功能
添加“上传人脸、现场支付、事后支付、退款、点击购买”操作的数据记录
This commit is contained in:
parent
715c351f5f
commit
6fca6df89f
@ -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 {
|
||||
|
@ -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<ScenicLoginRespVO> login(@RequestBody ScenicLoginReq scenicLoginReq) throws Exception {
|
||||
return scenicService.login(scenicLoginReq);
|
||||
}
|
||||
}
|
@ -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<AppSta1VO> 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<AppSta2VO> twoStatistics(@RequestBody CommonQueryReq query) {
|
||||
|
||||
return statisticsService.twoStatistics(query);
|
||||
@ -40,7 +50,6 @@ public class AppStatisticsController {
|
||||
|
||||
@ApiOperation("扫码访问人数、推送订阅人数、预览视频人数统计")
|
||||
@PostMapping("/free")
|
||||
@IgnoreToken
|
||||
public ApiResponse<AppSta3VO> freeStatistics(@RequestBody CommonQueryReq query) {
|
||||
|
||||
return statisticsService.freeStatistics(query);
|
||||
@ -48,16 +57,16 @@ public class AppStatisticsController {
|
||||
|
||||
@ApiOperation("用户转化漏斗")
|
||||
@PostMapping("/userConversionFunnel")
|
||||
@IgnoreToken
|
||||
public ApiResponse<AppStatisticsFunnelVO> 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);
|
||||
}
|
||||
|
||||
}
|
@ -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,"点击支付、购买"),
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -42,6 +42,11 @@ public class JwtInfo implements Serializable {
|
||||
|
||||
private String phone;
|
||||
|
||||
/**
|
||||
* 景区id
|
||||
*/
|
||||
private Long scenicId;
|
||||
|
||||
|
||||
/**
|
||||
* 生成 token 的时间
|
||||
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
@ -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;
|
||||
}
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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<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);
|
||||
}
|
||||
}
|
||||
|
@ -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<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
|
||||
|
@ -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<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
|
||||
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<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("[微信退款回调]退款成功");
|
||||
return true;
|
||||
} else {
|
||||
|
@ -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());
|
||||
|
@ -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("文件不存在!");
|
||||
}
|
||||
|
@ -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<PageInfo<OrderRespVO>> 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<OrderItemVO> 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<OrderItemVO> orderItemList = orderRespVO.getOrderItemList();
|
||||
|
@ -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<TopStateResp> topState();
|
||||
|
||||
ApiResponse<List<ContentPageVO>> contentList(Long scenicId);
|
||||
|
||||
ApiResponse<ScenicLoginRespVO> login(ScenicLoginReq scenicLoginReq) throws Exception;
|
||||
}
|
||||
|
@ -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<AppSta3VO> freeStatistics(CommonQueryReq query);
|
||||
|
||||
ApiResponse<AppStatisticsFunnelVO> userConversionFunnel(CommonQueryReq query);
|
||||
|
||||
ApiResponse addStatistics(StatisticsRecordAddReq req);
|
||||
}
|
||||
|
@ -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"));
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -32,6 +32,7 @@
|
||||
<result column="videoUrl" property="videoUrl"/>
|
||||
<result column="imgUrl" property="imgUrl"/>
|
||||
<result column="sourceType" property="sourceType"/>
|
||||
<result column="createTime" property="createTime"/>
|
||||
</collection>
|
||||
</resultMap>
|
||||
<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',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
|
||||
|
@ -45,7 +45,7 @@
|
||||
where scenic_id = #{scenicId} and is_super = 1
|
||||
</select>
|
||||
<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
|
||||
where account = #{account}
|
||||
</select>
|
||||
|
@ -1,6 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.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 ifnull(sum(pay_price),0) as payPrice
|
||||
from `order`
|
||||
|
Loading…
x
Reference in New Issue
Block a user