订单改改改

This commit is contained in:
Jerry Yan 2025-01-05 16:18:35 +08:00
parent 3b65094c2d
commit 294f9b6690
11 changed files with 147 additions and 135 deletions

View File

@ -30,14 +30,14 @@ public class OrderBiz {
public PriceObj queryPrice(int goodsType, Long goodsId) {
PriceObj priceObj = new PriceObj();
priceObj.setGoodsType(goodsType);
priceObj.setGoodsId(goodsId);
switch (goodsType) {
case 0: // video
VideoRespVO video = videoMapper.getById(goodsId);
if (video == null) {
return null;
}
priceObj.setGoodsId(goodsId);
priceObj.setGoodsType(goodsType);
TemplateRespVO template = templateRepository.getTemplate(video.getTemplateId());
if (template == null) {
return priceObj;
@ -85,6 +85,8 @@ public class OrderBiz {
if (priceObj == null) {
return respVO;
}
respVO.setGoodsType(goodsType);
respVO.setGoodsId(goodsId);
respVO.setPrice(priceObj.getPrice());
respVO.setSlashPrice(priceObj.getSlashPrice());
}

View File

@ -3,10 +3,12 @@ package com.ycwl.basic.controller.mobile;
import com.github.pagehelper.PageInfo;
import com.ycwl.basic.biz.OrderBiz;
import com.ycwl.basic.constant.BaseContextHandler;
import com.ycwl.basic.model.jwt.JwtInfo;
import com.ycwl.basic.model.mobile.goods.GoodsPriceQueryReq;
import com.ycwl.basic.model.mobile.order.IsBuyRespVO;
import com.ycwl.basic.model.mobile.order.OrderAppPageReq;
import com.ycwl.basic.model.mobile.order.RefundOrderReq;
import com.ycwl.basic.model.pc.order.req.CreateOrderReqVO;
import com.ycwl.basic.model.pc.order.req.OrderAddReq;
import com.ycwl.basic.model.pc.order.resp.OrderAppRespVO;
import com.ycwl.basic.model.wx.WxPayRespVO;
@ -14,6 +16,7 @@ import com.ycwl.basic.repository.OrderRepository;
import com.ycwl.basic.service.mobile.GoodsService;
import com.ycwl.basic.service.pc.OrderService;
import com.ycwl.basic.utils.ApiResponse;
import com.ycwl.basic.utils.JwtTokenUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@ -51,8 +54,9 @@ public class AppOrderController {
@ApiOperation("用户端订单新增")
@PostMapping("/addOrder")
public ApiResponse<WxPayRespVO> addOrder(@RequestBody OrderAddReq orderAddReq) throws Exception {
return orderService.add(orderAddReq);
public ApiResponse<WxPayRespVO> addOrder(@RequestBody CreateOrderReqVO orderAddReq) throws Exception {
JwtInfo worker = JwtTokenUtil.getWorker();
return orderService.createOrder(worker.getUserId(), orderAddReq);
}

View File

@ -21,7 +21,7 @@ import java.util.List;
public interface OrderMapper {
List<OrderRespVO> list(OrderReqQuery orderReqQuery);
OrderRespVO getById(Long id);
int add(OrderAddReq order);
int add(OrderEntity order);
// int deleteById(Long id);
int update(OrderUpdateReq order);

View File

@ -16,6 +16,7 @@ import java.util.Date;
public class OrderEntity {
@TableId
private Long id;
private Long scenicId;
/**
* 用户id
*/

View File

@ -0,0 +1,12 @@
package com.ycwl.basic.model.pc.order.req;
import lombok.Data;
@Data
public class CreateOrderReqVO {
private Long scenicId;
private Integer goodsType;
private Long goodsId;
private String brokerCode;
private Long couponId;
}

View File

@ -18,6 +18,7 @@ import java.io.Serializable;
public class WxPayRespVO implements Serializable {
private static final long serialVersionUID = 1L;
private boolean needPay = true;
/**
* 预支付交易会话标识小程序下单接口返回的prepay_id参数值
*/

View File

@ -6,7 +6,6 @@ import com.aliyuncs.utils.StringUtils;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.exception.ServiceException;
import com.wechat.pay.java.core.http.HttpMethod;
import com.wechat.pay.java.core.notification.NotificationConfig;
import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.core.notification.RequestParam;
@ -46,7 +45,6 @@ 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;
@ -204,8 +202,18 @@ public class WxPayServiceImpl implements WxPayService {
}
if (Objects.nonNull(OrderStateEnum)) {
long orderId = Long.parseLong(parse.getOutTradeNo());
notifyOrderSuccess(orderId);
}
}).start();
} catch (Exception e) {
throw new AppException(BizCodeEnum.ADVANCE_PAYMENT_CALLBACK_FAILED, e.toString());
}
}
@Override
public void notifyOrderSuccess(Long orderId) {
try {
orderService.updateOrderState(orderId, OrderStateEnum, null);
orderService.updateOrderState(orderId, OrderStateEnum.PAID, null);
// 添加统计数据
statisticsHandler(orderId);
}catch (Exception e) {
@ -239,12 +247,6 @@ public class WxPayServiceImpl implements WxPayService {
break;
}
});
}
}).start();
} catch (Exception e) {
throw new AppException(BizCodeEnum.ADVANCE_PAYMENT_CALLBACK_FAILED, e.toString());
}
}
//

View File

@ -2,6 +2,7 @@ package com.ycwl.basic.service.impl.pc;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ycwl.basic.biz.OrderBiz;
import com.ycwl.basic.constant.BaseContextHandler;
import com.ycwl.basic.constant.NumberConstant;
import com.ycwl.basic.enums.*;
@ -11,11 +12,13 @@ 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.PriceObj;
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;
import com.ycwl.basic.model.pc.order.req.CreateOrderReqVO;
import com.ycwl.basic.model.pc.order.req.OrderUpdateReq;
import com.ycwl.basic.model.pc.order.req.OrderAddReq;
import com.ycwl.basic.model.pc.order.req.OrderReqQuery;
@ -70,6 +73,8 @@ public class OrderServiceImpl implements OrderService {
private OrderOperationMapper orderOperationMapper;
@Autowired
private StatisticsMapper statisticsMapper;
@Autowired
private OrderBiz orderBiz;
@Override
public ApiResponse<PageInfo<OrderRespVO>> pageQuery(OrderReqQuery query) {
@ -89,92 +94,39 @@ public class OrderServiceImpl implements OrderService {
return ApiResponse.success(orderMapper.getById(orderId));
}
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResponse<WxPayRespVO> add(OrderAddReq order) throws Exception {
Long orderId = SnowFlakeUtil.getLongId();
order.setId(orderId);
JwtInfo worker = JwtTokenUtil.getWorker();
Long userId = worker.getUserId();
MemberRespVO memberRespVO = memberMapper.getById(userId);
order.setMemberId(userId);
order.setOpenid(memberRespVO.getOpenId());
/* 成片的时候子订单只会有一个,素材的时候 子订单多个且价格与子订单数量无关,只与子订单商品对应景区定义的价格相同*/
List<GoodsDetailVO> goodsItemList = order.getGoodsItemList();
GoodsDetailVO goodsDetailVO = goodsItemList.get(NumberConstant.ZERO);
if (order.getGoodsType() == null) {
order.setGoodsType(goodsDetailVO.getGoodsType());
}
GoodsPriceQueryReq goodsPriceQueryReq = new GoodsPriceQueryReq();
goodsPriceQueryReq.setGoodsId(goodsDetailVO.getGoodsId());
goodsPriceQueryReq.setGoodsType(order.getGoodsType());
goodsPriceQueryReq.setScenicId(order.getScenicId());
BigDecimal price = goodsService.queryPrice(goodsPriceQueryReq).getData();
order.setPrice(price);
order.setPayPrice(price);
int add = orderMapper.add(order);
if (add == NumberConstant.ZERO) {
return ApiResponse.fail("订单添加失败");
} else {
Integer goodsType = order.getGoodsType();
List<OrderItemEntity> orderItems = new ArrayList<>();
goodsItemList.forEach(goodsDto -> {
Long goodsId = goodsDto.getGoodsId();
OrderItemEntity orderItemEntity = new OrderItemEntity();
orderItemEntity.setId(SnowFlakeUtil.getLongId());
orderItemEntity.setOrderId(orderId);
orderItemEntity.setGoodsType(goodsType);
orderItemEntity.setGoodsId(goodsId);
orderItems.add(orderItemEntity);
});
int addOrderItems = orderMapper.addOrderItems(orderItems);
if (addOrderItems == NumberConstant.ZERO) {
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);
WxPayRespVO wxPayRespVO = initiatePayment(order, goodsDetailVO);
return ApiResponse.success(wxPayRespVO);
}
}
/**
* 发起支付
* @param order 订单
* @param goodsDetailVO 商品详情
* @param orderItems 商品详情
* @return 支付请求结果
*/
private WxPayRespVO initiatePayment(OrderAddReq order,GoodsDetailVO goodsDetailVO) throws Exception {
private WxPayRespVO initiatePayment(OrderEntity order, List<OrderItemEntity> orderItems) throws Exception {
WXPayOrderReqVO wxPayOrderReqVO = new WXPayOrderReqVO();
Integer goodsType = order.getGoodsType();
String goodsName = null;
if (goodsType == NumberConstant.ONE) {
goodsName = goodsDetailVO.getGoodsName();
} else if (goodsType == NumberConstant.TWO) {
Integer sourceType = goodsDetailVO.getSourceType();
goodsName = SourceTypeNameEnum.getRemark(sourceType);
if (orderItems.size() > 1) {
goodsName = "多项景区VLOG商品";
} else {
int type = orderItems.get(NumberConstant.ZERO).getGoodsType();
if (type == NumberConstant.ZERO) {
goodsName = "景区VLog视频";
} else if (type == NumberConstant.ONE) {
goodsName = "景区原片包";
} else if (type == NumberConstant.TWO) {
goodsName = "景区照片包";
}
wxPayOrderReqVO.setOpenId(order.getOpenid())
}
if (order.getPayPrice().equals(BigDecimal.ZERO)) {
// 0元支付
WxPayRespVO wxPayRespVO = new WxPayRespVO();
wxPayRespVO.setNeedPay(false);
return wxPayRespVO;
}
wxPayOrderReqVO.setOpenId(order.getOpenId())
.setMemberId(order.getMemberId())
.setOrderSn(order.getId())
.setTotalPrice(BigDecimalUtil.convertToCents(order.getPrice()))
.setGoodsName(goodsName)
.setDescription("VLOG视频支付");
.setDescription(goodsName);
return wxPayService.createOrder(wxPayOrderReqVO);
}
@ -319,4 +271,46 @@ public class OrderServiceImpl implements OrderService {
return ApiResponse.success(pageInfo);
}
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResponse<WxPayRespVO> createOrder(Long userId, CreateOrderReqVO createOrderReqVO) throws Exception {
OrderEntity order = new OrderEntity();
Long orderId = SnowFlakeUtil.getLongId();
order.setId(orderId);
order.setMemberId(userId);
MemberRespVO member = memberMapper.getById(userId);
order.setOpenId(member.getOpenId());
order.setScenicId(createOrderReqVO.getScenicId());
List<OrderItemEntity> orderItems = new ArrayList<>();
OrderItemEntity orderItem = new OrderItemEntity();
orderItem.setGoodsId(createOrderReqVO.getGoodsId());
orderItem.setGoodsType(createOrderReqVO.getGoodsType());
orderItem.setOrderId(orderId);
orderItems.add(orderItem);
PriceObj priceObj = orderBiz.queryPrice(createOrderReqVO.getGoodsType(), createOrderReqVO.getGoodsId());
order.setPrice(priceObj.getPrice());
// promo code
// coupon
order.setPayPrice(priceObj.getPrice());
order.setStatus(OrderStateEnum.UNPAID.getState());
orderMapper.add(order);
int addOrderItems = orderMapper.addOrderItems(orderItems);
if (addOrderItems == NumberConstant.ZERO) {
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);
WxPayRespVO wxPayRespVO = initiatePayment(order, orderItems);
return ApiResponse.success(wxPayRespVO);
}
}

View File

@ -20,6 +20,8 @@ public interface WxPayService {
*/
void payNotify(HttpServletRequest xml);
void notifyOrderSuccess(Long orderId);
/**
* 微信支付结果查询
*/

View File

@ -5,6 +5,7 @@ import com.ycwl.basic.enums.OrderStateEnum;
import com.ycwl.basic.model.mobile.order.OrderAppPageReq;
import com.ycwl.basic.model.mobile.order.RefundOrderReq;
import com.ycwl.basic.model.pc.order.entity.OrderEntity;
import com.ycwl.basic.model.pc.order.req.CreateOrderReqVO;
import com.ycwl.basic.model.pc.order.req.OrderUpdateReq;
import com.ycwl.basic.model.pc.order.req.OrderAddReq;
import com.ycwl.basic.model.pc.order.req.OrderReqQuery;
@ -26,7 +27,7 @@ public interface OrderService {
ApiResponse<OrderRespVO> detail(Long orderId);
ApiResponse<WxPayRespVO> add(OrderAddReq query) throws Exception;
// ApiResponse<WxPayRespVO> add(OrderAddReq query) throws Exception;
ApiResponse<Integer> update(OrderUpdateReq query);
@ -59,4 +60,6 @@ public interface OrderService {
void remarkOrder(Long orderId, OrderEntity query);
ApiResponse<PageInfo<OrderRespVO>> refundPageQuery(OrderReqQuery query);
ApiResponse<WxPayRespVO> createOrder(Long userId, CreateOrderReqVO orderAddReq) throws Exception;
}

View File

@ -14,7 +14,6 @@
<result column="remark" property="remark"/>
<result column="broker_id" property="brokerId"/>
<result column="promo_code" property="promoCode"/>
<result column="goods_type" property="goodsType"/>
<result column="refund_reason" property="refundReason"/>
<result column="refund_status" property="refundStatus"/>
<result column="status" property="status"/>
@ -40,7 +39,6 @@
<result column="price" property="price"/>
<result column="pay_price" property="payPrice"/>
<result column="remark" property="remark"/>
<result column="goods_type" property="goodsType"/>
<result column="refund_reason" property="refundReason"/>
<result column="refund_status" property="refundStatus"/>
<result column="status" property="status"/>
@ -113,13 +111,13 @@
</select>
<insert id="add">
insert into `order`(id, member_id, openid,price, pay_price, remark, broker_id, promo_code,goods_type,scenic_id)
VALUES (#{id}, #{memberId}, #{openid},#{price}, #{payPrice}, #{remark}, #{brokerId}, #{promoCode},#{goodsType},#{scenicId})
insert into `order`(id, member_id, openid, price, pay_price, remark, broker_id, promo_code, scenic_id)
VALUES (#{id}, #{memberId}, #{openId}, #{price}, #{payPrice}, #{remark}, #{brokerId}, #{promoCode}, #{scenicId})
</insert>
<insert id="addOrderItems">
insert into order_item(id, order_id,goods_type, goods_id) VALUES
insert into order_item(order_id,goods_type, goods_id) VALUES
<foreach collection="orderItems" item="item" index="index" separator=",">
(#{item.id}, #{item.orderId}, #{item.goodsType},#{item.goodsId})
(#{item.orderId}, #{item.goodsType},#{item.goodsId})
</foreach>
</insert>
<update id="update">
@ -160,13 +158,11 @@
</delete>
<select id="list" resultMap="PCBaseResultMap">
select distinct o.id, o.scenic_id, s.name as scenic_name, o.member_id,m.nickname ,m.real_name , o.openid, o.price, pay_price, remark, o.broker_id, o.promo_code,
refund_reason, refund_status, o.`status`, refund_at, pay_at, cancel_at,oi.id oiId, o.goods_type, oi.goods_id, o.create_at
refund_reason, refund_status, o.`status`, refund_at, pay_at, cancel_at,oi.id oiId, oi.goods_id, o.create_at
from `order` AS o
left join member m on o.member_id = m.id
left join scenic s on o.scenic_id = s.id
left join order_item oi on o.id = oi.order_id
left join source sr on o.goods_type='2' and oi.goods_id = sr.id
left join video vd on o.goods_type='1' and oi.goods_id = vd.id
<where>
<if test="id!= null ">
and o.id = #{id}
@ -247,7 +243,7 @@
</select>
<select id="appList" resultMap="AppBaseResultMap">
select DISTINCT o.id, o.member_id,o.openid, o.price, pay_price, remark, o.broker_id, o.promo_code,
refund_reason, refund_status, o.`status`, o.create_at, refund_at, pay_at, cancel_at, o.goods_type,
refund_reason, refund_status, o.`status`, o.create_at, refund_at, pay_at, cancel_at,
sc.name scenicName
from `order` AS o
left join scenic sc on o.scenic_id = sc.id
@ -255,15 +251,12 @@
<if test="memberId!=null">
and o.member_id=#{memberId}
</if>
<if test="type!= null ">
and o.goods_type = #{type}
</if>
</where>
order by o.create_at desc
</select>
<select id="appDetail" resultMap="AppBaseResultMap">
select distinct o.id, o.member_id,o.openid, o.price, pay_price, remark, o.broker_id, o.promo_code,
refund_reason, refund_status, o.`status`, o.create_at, refund_at, pay_at, cancel_at, o.goods_type,
refund_reason, refund_status, o.`status`, o.create_at, refund_at, pay_at, cancel_at,
o.scenic_id, sc.name scenicName
from `order` AS o
left join member m on o.member_id = m.id
@ -272,13 +265,11 @@
</select>
<select id="refundList" resultType="com.ycwl.basic.model.pc.order.resp.OrderRespVO">
select distinct o.id, o.scenic_id, s.name as scenic_name, o.member_id,m.nickname ,m.real_name , o.openid, o.price, pay_price, remark, o.broker_id, o.promo_code,
refund_reason, refund_status, o.`status`, refund_at, pay_at, cancel_at,oi.id oiId, o.goods_type, oi.goods_id, o.create_at
refund_reason, refund_status, o.`status`, refund_at, pay_at, cancel_at,oi.id oiId, oi.goods_id, o.create_at
from `order` AS o
left join member m on o.member_id = m.id
left join scenic s on o.scenic_id = s.id
left join order_item oi on o.id = oi.order_id
left join source sr on o.goods_type='2' and oi.goods_id = sr.id
left join video vd on o.goods_type='1' and oi.goods_id = vd.id
<where>
o.refund_status != 0
<if test="id!= null ">