添加景区账号的登陆功能

添加“上传人脸、现场支付、事后支付、退款、点击购买”操作的数据记录
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

@ -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);
}
}

View File

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

View File

@ -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 {

View File

@ -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());

View File

@ -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("文件不存在!");
}

View File

@ -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();

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.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;
}

View File

@ -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);
}