diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/VipOrderDto.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/VipOrderDto.java deleted file mode 100644 index e915529..0000000 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/VipOrderDto.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.bnyer.img.api.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.io.Serializable; - -/** - * @author :WXC - * @Date :2023/03/27 - * @description : - */ -@Getter -@Setter -@NoArgsConstructor -public class VipOrderDto implements Serializable { - - @NotBlank(message = "手机号不能为空!") - @ApiModelProperty(value="手机号") - private String phone; - - @NotNull(message = "vipId不能为空!") - @ApiModelProperty(value="vip表id") - private Long vipId; - -// @NotBlank(message = "用户客户端类型不能为空!") -// @Range(min = 10,max = 40,message = "用户客户端类型只能包含:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") -// @ApiModelProperty(value="用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") -// private Integer userClientType; - -} diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteVipOrderService.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteVipOrderService.java index 963ba58..f101f9a 100644 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteVipOrderService.java +++ b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteVipOrderService.java @@ -2,27 +2,11 @@ package com.bnyer.img.api.remote; import com.bnyer.common.core.constant.ServiceNameConstants; import com.bnyer.common.core.domain.R; -import com.bnyer.common.core.dto.CreatorLoginDto; -import com.bnyer.common.core.dto.FhLoginDto; -import com.bnyer.common.core.dto.TiktokLoginDto; -import com.bnyer.common.core.dto.WxLoginDto; import com.bnyer.img.api.dto.QueryVipOrderDto; -import com.bnyer.img.api.dto.TiktokImgMiniDto; -import com.bnyer.img.api.dto.VipOrderDto; -import com.bnyer.img.api.factory.RemoteImgFallbackFactory; import com.bnyer.img.api.factory.RemoteVipOrderFallbackFactory; -import com.bnyer.img.api.model.LoginCreator; -import com.bnyer.img.api.model.LoginFhUser; -import com.bnyer.img.api.model.LoginTiktokUser; -import com.bnyer.img.api.model.LoginWechatUser; import com.bnyer.img.api.vo.VipOrderVo; -import io.swagger.annotations.ApiParam; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import javax.validation.Valid; import java.util.List; diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java index 4d1ed18..5c9c0aa 100644 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java +++ b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java @@ -1,5 +1,6 @@ package com.bnyer.img.api.vo; +import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -60,4 +61,7 @@ public class VipOrderVo { @ApiModelProperty(value = "vip类型名称") private String vipTypeName; + @ApiModelProperty(value="支付状态:1000未支付;1001支付成功 ;1002支付失败") + private Integer payStatus; + } diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java index 934e239..6d5f8c7 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java @@ -171,4 +171,11 @@ public class VipOrder extends BaseDomain { @TableField(value = "remark") @ApiModelProperty(value="备注") private String remark; + + /** + * 支付状态:1000未支付;1001支付成功 ;1002支付失败 + */ + @TableField(value = "pay_status") + @ApiModelProperty(value="支付状态:1000未支付;1001支付成功 ;1002支付失败") + private Integer payStatus; } diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipCategory.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipCategory.java index 3a68afd..ac46d56 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipCategory.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipCategory.java @@ -3,6 +3,7 @@ package com.bnyer.common.core.enums; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Arrays; import java.util.Objects; /** @@ -16,6 +17,7 @@ public enum EnumVipCategory { IMG_VIP("img","下图会员"), VIDEO_VIP("video","视频会员"), AI_VIP("ai","ai会员"), + UNKNOWN("unknown","未知"), ; private final String code; @@ -30,4 +32,10 @@ public enum EnumVipCategory { } return null; } + + public static EnumVipCategory getVipCategoryByCode(String code) { + return Arrays.stream(values()) + .filter(vipCategory -> Objects.equals(vipCategory.getCode(), code)) + .findFirst().orElse(EnumVipCategory.UNKNOWN); + } } diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java index c213ba5..d423aff 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java @@ -231,6 +231,61 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils return DateUtils.parseDate(format); } + /** + * 根据时间类型+周期创建时间 + * @param type 时间类型 + * @param date 时间 + * @param num 周期数 + * @return + */ + public static Date getDateByType(int type,Date date,long num){ + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS); + Instant instant = date.toInstant(); + ZoneId zoneId = ZoneId.systemDefault(); + LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime(); + String format = ""; + switch (type){ + case 0: + //秒 + LocalDateTime secondsDateTime = localDateTime.plusSeconds(num); + format = secondsDateTime.format(formatter); + break; + case 1: + //分 + LocalDateTime minuteDateTime = localDateTime.plusMinutes(num); + format = minuteDateTime.format(formatter); + break; + case 2: + //时 + LocalDateTime hoursDateTime = localDateTime.plusHours(num); + format = hoursDateTime.format(formatter); + break; + case 3: + //日 + LocalDateTime daysDateTime = localDateTime.plusDays(num); + format = daysDateTime.format(formatter); + break; + case 4: + //月 + LocalDateTime monthsDateTime = localDateTime.plusMonths(num); + format = monthsDateTime.format(formatter); + break; + case 5: + //年 + LocalDateTime yearsDateTime = localDateTime.plusYears(num); + format = yearsDateTime.format(formatter); + break; + case 6: + //周 + LocalDateTime weeksDateTime = localDateTime.plusWeeks(num); + format = weeksDateTime.format(formatter); + break; + default: + throw new IllegalArgumentException("时间类型参数错误"); + } + return DateUtils.parseDate(format); + } + public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); diff --git a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java index 2fd082b..6b03f74 100644 --- a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java +++ b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java @@ -27,7 +27,7 @@ public class RocketMqAdapter { RocketMQTemplate mqTemplate = new RocketMQTemplate(); DefaultMQProducer producer = new DefaultMQProducer(topic); producer.setNamesrvAddr(nameServer); - producer.setRetryTimesWhenSendFailed(RocketMqConstant.RETRY_FAILED_COUNT); + producer.setRetryTimesWhenSendFailed(RocketMqConstant.SYNC_RETRY_FAILED_COUNT); producer.setRetryTimesWhenSendAsyncFailed(RocketMqConstant.ASYNC_RETRY_FAILED_COUNT); producer.setSendMsgTimeout((int) RocketMqConstant.TIMEOUT); mqTemplate.setProducer(producer); diff --git a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java index 6ca663d..d0d1a2a 100644 --- a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java +++ b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java @@ -18,9 +18,9 @@ public class RocketMqConstant { public static final int CANCEL_ORDER_DELAY_LEVEL = 16; /** - * 发送消息失败重试次数,默认2 + * 发送同步消息失败重试次数,默认2 */ - public static final int RETRY_FAILED_COUNT = 2; + public static final int SYNC_RETRY_FAILED_COUNT = 2; /** * 发送异步消息失败重试次数,默认2 diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java index e454287..a005e2e 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java @@ -1,13 +1,11 @@ package com.bnyer.order.controller; import com.bnyer.common.core.domain.R; -import com.bnyer.order.dto.QueryVipOrderDto; -import com.bnyer.order.dto.AddVipOrderDto; -import com.bnyer.order.vo.VipOrderVo; import com.bnyer.common.core.web.controller.BaseController; -import com.bnyer.common.redis.service.RedisCacheService; -import com.bnyer.common.redis.service.RedisService; +import com.bnyer.order.dto.AddVipOrderDto; +import com.bnyer.order.dto.QueryVipOrderDto; import com.bnyer.order.service.VipOrderService; +import com.bnyer.order.vo.VipOrderVo; import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Operation; import lombok.extern.slf4j.Slf4j; diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java index d37e071..3b90bf7 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java @@ -13,9 +13,16 @@ import lombok.Getter; @AllArgsConstructor public enum EnumVipType { + //========================下图会员=================== MONTH_CARD("0","月卡",EnumVipCategory.IMG_VIP), SEASON_CARD("1","季卡",EnumVipCategory.IMG_VIP), YEAR_CARD("2","年卡",EnumVipCategory.IMG_VIP), + + //========================视频会员(待扩展)=================== + + + + //========================AI会员(待扩展)==================== ; private final String typeCode; diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java index a0320fd..9f7bfce 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java @@ -2,6 +2,7 @@ package com.bnyer.order.listener.vip; import com.bnyer.common.rocketmq.config.RocketMqConstant; import com.bnyer.order.service.VipOrderService; +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; @@ -19,11 +20,12 @@ import org.springframework.stereotype.Component; public class VipOrderCancelConsumer implements RocketMQListener { @Autowired - VipOrderService vipOrderService; + private VipOrderService vipOrderService; @Override public void onMessage(String orderId) { log.info("收到消息:{}", orderId); - vipOrderService.cancelVipOrder(orderId,0); + // 如果订单未支付的话,将订单设为取消状态 + vipOrderService.cancelVipOrder(Lists.newArrayList(orderId),0); } } diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/VipOrderMapper.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/VipOrderMapper.java index 2dd23b7..d9835d6 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/VipOrderMapper.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/VipOrderMapper.java @@ -1,4 +1,5 @@ package com.bnyer.order.mapper; + import java.util.List; import com.bnyer.order.dto.QueryVipOrderDto; @@ -6,6 +7,7 @@ import com.bnyer.order.dto.QueryVipOrderDto; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.bnyer.common.core.domain.VipOrder; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * @author :WXC @@ -13,6 +15,16 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface VipOrderMapper extends BaseMapper { - List queryOrderList(QueryVipOrderDto dto); + /** + * 查询订单信息 + * @param dto + * @return + */ + List queryVipOrderList(QueryVipOrderDto dto); + /** + * 取消订单 + * @param orderIds + */ + void cancelVipOrder(@Param("orderIds") List orderIds, @Param("close_type") Integer close_type); } diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java index d163f61..c0cab2a 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java @@ -16,7 +16,7 @@ import java.util.List; public interface VipOrderService extends IService { /** - * 提交订单,返回支付流水号 + * 生成会员订单,返回订单号 * * @param addVipOrderDto 下单所需要的参数 * @return 支付流水号 @@ -25,9 +25,10 @@ public interface VipOrderService extends IService { /** * 取消订单 - * @param orderId + * @param orderIds 订单号 + * @param closeType 订单关闭原因类型 */ - void cancelVipOrder(String orderId,Integer closeType); + void cancelVipOrder(List orderIds,Integer closeType); /** * 查询会员订单列表信息 diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java index d2f1000..1a12077 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java @@ -1,6 +1,7 @@ package com.bnyer.order.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -36,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * @author :WXC @@ -62,12 +64,17 @@ public class VipOrderServiceImpl extends ServiceImpl i */ @Override public List getVipOrderList(QueryVipOrderDto dto) { - List vipOrderList = vipOrderMapper.queryOrderList(dto); + List vipOrderList = vipOrderMapper.queryVipOrderList(dto); List vipOrderVoList = EntityConvertUtil.copy(vipOrderList, VipOrderVo.class); return vipOrderVoList; } + /** + * 生成会员订单,返回订单号 + * @param addVipOrderDto 下单所需要的参数 + * @return + */ @Override @Transactional(rollbackFor = Exception.class) public String addVipOrder(AddVipOrderDto addVipOrderDto) { @@ -79,7 +86,7 @@ public class VipOrderServiceImpl extends ServiceImpl i SendStatus sendStatus = orderCancelMqTemplate.syncSend(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC, new GenericMessage<>(orderId), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus(); if (!Objects.equals(sendStatus,SendStatus.SEND_OK)) { // 消息发不出去就抛异常,发的出去无所谓 - throw new ServiceException("系统繁忙,请稍候重试!"); + throw new ServiceException(ResponseEnum.SERVER_ERROR.getCode()); }else { log.info("消息发送成功,topic:{}",RocketMqConstant.VIP_ORDER_CANCEL_TOPIC); } @@ -104,38 +111,68 @@ public class VipOrderServiceImpl extends ServiceImpl i if (CollUtil.isEmpty(userVipVoList)){ throw new ServiceException(ResponseEnum.NOT_EXIST.getCode(),"会员信息"); } - Long userId = SecurityUtils.getUserId(); UserVipVo userVipVo = userVipVoList.get(0); + VipOrder vipOrder = null; + EnumVipCategory enumVipCategory = EnumVipCategory.getVipCategoryByCode(userVipVo.getCategoryCode()); + switch (enumVipCategory){ + case IMG_VIP: + vipOrder = buildImgVipOrder(userVipVo,addVipOrderDto); + break; + case VIDEO_VIP: + break; + case AI_VIP: + break; + default: + throw new ServiceException("categoryCode未匹配上对应分类"); + } + return vipOrder; + } + + /** + * 构建下图会员订单 + * @param userVipVo + * @param addVipOrderDto + * @return + */ + private VipOrder buildImgVipOrder(UserVipVo userVipVo, AddVipOrderDto addVipOrderDto) { + Long userId = SecurityUtils.getUserId(); VipOrder vipOrder = EntityConvertUtil.copy(userVipVo, VipOrder.class); vipOrder.setPhone(addVipOrderDto.getPhone()); vipOrder.setVipId(addVipOrderDto.getVipId()); vipOrder.setPayAmount(userVipVo.getPrice()); vipOrder.setCategoryName(EnumVipCategory.getNameByCode(userVipVo.getCategoryCode())); + vipOrder.setVipTypeName(EnumVipType.getNameByTypeCode(userVipVo.getVipType())); vipOrder.setIsDelay("0"); - Date startTime = new Date(); - vipOrder.setStartTime(startTime); + Date nowDate = new Date(); + vipOrder.setStartTime(nowDate); //计算会员结束时间 - vipOrder.setEndTime(DateUtils.getNextDateByType(Integer.parseInt(EnumVipType.MONTH_CARD.getTypeCode()), new Date())); - vipOrder.setOrderStatus(EnumVipOrderStatus.NOT_PROCESS.getStatus()); - vipOrder.setOrderId(OrderUtil.getOrderId("RV",new Date(), EnumUserClientType.getCodeByType(userVipVo.getUserClientType()),String.valueOf(userId))); - vipOrder.setCreateTime(new Date()); - vipOrder.setUpdateTime(new Date()); + vipOrder.setEndTime(DateUtils.getNextDateByType(Integer.parseInt(userVipVo.getVipType()), nowDate)); + //开通的天数 + vipOrder.setDays((int) DateUtil.betweenDay(vipOrder.getStartTime(), vipOrder.getEndTime(), true)); + vipOrder.setOrderId(OrderUtil.getOrderId("RV",nowDate, EnumUserClientType.getCodeByType(userVipVo.getUserClientType()),String.valueOf(userId))); + vipOrder.setCreateTime(nowDate); return vipOrder; } + /** + * 取消订单 + * @param orderIds 订单id + * @param closeType 订单关闭原因类型 + */ @Transactional(rollbackFor = Exception.class) @Override - public void cancelVipOrder(String orderId,Integer closeType) { - VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper().eq(VipOrder::getOrderId,orderId) - .notIn(VipOrder::getOrderStatus,EnumVipOrderStatus.FAILS.getStatus(),EnumVipOrderStatus.SUCCESS.getStatus())); - if (Objects.nonNull(vipOrder)){ - vipOrder.setOrderStatus(EnumVipOrderStatus.FAILS.getStatus()); - vipOrder.setCloseType(closeType); - vipOrder.setCancelTime(new Date()); - vipOrder.setUpdateTime(new Date()); - vipOrderMapper.updateById(vipOrder); + public void cancelVipOrder(List orderIds,Integer closeType) { + List vipOrderList = vipOrderMapper.selectList(new LambdaQueryWrapper().in(VipOrder::getOrderId, orderIds)); + if (CollUtil.isEmpty(vipOrderList)){ + return; + } + List cancelOrderIds = vipOrderList.stream().filter(vipOrder -> Objects.nonNull(vipOrder.getOrderStatus()) && EnumVipOrderStatus.FAILS.getStatus() + != vipOrder.getOrderStatus()).map(VipOrder::getOrderId).collect(Collectors.toList()); + if (CollUtil.isEmpty(cancelOrderIds)){ + return; } + vipOrderMapper.cancelVipOrder(cancelOrderIds,closeType); } } diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java index f44ffee..d38e135 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java @@ -60,4 +60,7 @@ public class VipOrderVo { @ApiModelProperty(value = "vip类型名称") private String vipTypeName; + @ApiModelProperty(value="支付状态:1000未支付;1001支付成功 ;1002支付失败") + private Integer payStatus; + } diff --git a/bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml b/bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml index de7215d..47ed9fb 100644 --- a/bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml +++ b/bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml @@ -24,8 +24,11 @@ + + + @@ -49,10 +52,15 @@ o.cancel_time, o.user_client_type, o.remark, + o.pay_status, + o.sort, + o.is_show, o.create_time, o.update_time - select from order_vip_order o @@ -62,4 +70,18 @@ and o.order_id = #{orderId,jdbcType=VARCHAR} + + + + update order_vip_order + set + order_status = 2, + close_type = #{close_type,jdbcType=VARCHAR}, + cancel_time = now(), + update_time=now() + where pay_status = 1000 and order_id in + + #{orderId} + + diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/AliPayConstant.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/AliPayConstant.java index af42a12..6564ed2 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/AliPayConstant.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/AliPayConstant.java @@ -7,10 +7,10 @@ package com.bnyer.pay.constant; */ public class AliPayConstant { - /** - * 超时时间 - */ - public static final String timeoutExpress = "30m"; +// /** +// * 超时时间 +// */ +// public static final String timeoutExpress = "30m"; /*** * 接口地址 diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java index d61a8a6..da852ea 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java @@ -1,6 +1,7 @@ package com.bnyer.pay.design.strategy; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import com.alipay.api.AlipayClient; import com.alipay.api.AlipayConstants; import com.alipay.api.DefaultAlipayClient; @@ -11,6 +12,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.bnyer.common.core.domain.AlipayConfig; import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.exception.ServiceException; +import com.bnyer.common.core.utils.DateUtils; import com.bnyer.common.core.utils.SpringUtils; import com.bnyer.pay.constant.AliPayConstant; import com.bnyer.pay.dto.UnifiedOrderDto; @@ -53,7 +55,9 @@ public class AliPayStrategy implements PayStrategy{ model.setSubject(dto.getGoodsSubject()); model.setBody(dto.getGoodsDesc()); model.setOutTradeNo(dto.getOrderId()); - model.setTimeoutExpress(AliPayConstant.timeoutExpress); + //直接固定好过期时间比较好 + model.setTimeExpire(DateUtil.formatDateTime(DateUtils.getDateByType(1,dto.getCurrDate(),30))); +// model.setTimeoutExpress(AliPayConstant.timeoutExpress); //元 model.setTotalAmount(dto.getPayAmount()); request.setBizModel(model); @@ -64,6 +68,7 @@ public class AliPayStrategy implements PayStrategy{ if(response.isSuccess()){ PayInOrderVo vo = new PayInOrderVo(); vo.setOutStr(response.getBody()); + vo.setOrderId(dto.getOrderId()); vo.setAppid(appid); return vo; }else{ diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java index b144245..3bb18e9 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java @@ -69,6 +69,7 @@ public class WxPayStrategy implements PayStrategy { } //返回数据 PayInOrderVo payInOrderVo = new PayInOrderVo(); + payInOrderVo.setOrderId(dto.getOrderId()); payInOrderVo.setAppid(wxPayConfig.getAppid()); payInOrderVo.setMchid(wxPayConfig.getMchid()); payInOrderVo.setPrepayid(wxPayUnifiedOrderResult.getPrepayId()); diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayStatus.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayStatus.java new file mode 100644 index 0000000..cf3f9ec --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayStatus.java @@ -0,0 +1,23 @@ +package com.bnyer.pay.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author :WXC + * @description : + */ +@Getter +@AllArgsConstructor +public enum EnumPayStatus { + + NO_PAY(1000,"未支付"), + SUCCESS(1001,"已支付"), + FAILS(1002,"支付失败"), + ; + + private final int code; + + private final String name; + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumTradeType.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumTradeType.java index a8be75f..b9fa152 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumTradeType.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumTradeType.java @@ -1,11 +1,9 @@ package com.bnyer.pay.enums; -import com.bnyer.common.core.enums.EnumVipCategory; import lombok.AllArgsConstructor; import lombok.Getter; import java.util.Arrays; -import java.util.Objects; /** * @author :WXC @@ -21,7 +19,7 @@ public enum EnumTradeType { JSAPI_PUBLIC("4","JSAPI","JSAPI支付(公众号appId支付)"), H5("5","JSAPI","H5支付"), - UNKNOWN("-1", null, "未知支付"), + UNKNOWN("-1", "UNKNOWN", "未知支付"), ; private final String code; diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayInfoServiceImpl.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayInfoServiceImpl.java index 00384c9..6aef9d3 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayInfoServiceImpl.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayInfoServiceImpl.java @@ -8,12 +8,12 @@ import com.bnyer.common.core.enums.EnumSceneCode; import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.utils.bean.EntityConvertUtil; import com.bnyer.common.core.utils.ip.IpUtils; -import com.bnyer.common.security.utils.SecurityUtils; import com.bnyer.img.api.dto.QueryVipOrderDto; import com.bnyer.img.api.remote.RemoteVipOrderService; import com.bnyer.img.api.vo.VipOrderVo; import com.bnyer.pay.dto.AddPayInfoDto; import com.bnyer.pay.dto.UnifiedOrderDto; +import com.bnyer.pay.enums.EnumPayStatus; import com.bnyer.pay.mapper.PayInfoMapper; import com.bnyer.pay.service.PayInfoService; import com.bnyer.pay.design.factory.PayFactory; @@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -33,6 +34,9 @@ import java.util.List; @Service public class PayInfoServiceImpl extends ServiceImpl implements PayInfoService { + @Autowired + private PayInfoMapper payInfoMapper; + @Autowired private RemoteVipOrderService remoteVipOrderService; @@ -46,8 +50,8 @@ public class PayInfoServiceImpl extends ServiceImpl impl public PayInOrderVo addPayInOrder(AddPayInfoDto dto, HttpServletRequest request) { //支付金额 String payAmount = ""; - EnumSceneCode sceneCodeByCode = EnumSceneCode.getSceneCodeByCode(dto.getSceneCode()); - switch (sceneCodeByCode){ + EnumSceneCode enumSceneCode = EnumSceneCode.getSceneCodeByCode(dto.getSceneCode()); + switch (enumSceneCode){ //会员充值场景 case VIP_RECHARGE: QueryVipOrderDto queryVipOrderDto = new QueryVipOrderDto(); @@ -63,26 +67,56 @@ public class PayInfoServiceImpl extends ServiceImpl impl default: throw new ServiceException("sceneCode未匹配上对应支付场景"); } - //ip地址 - String ip = IpUtils.getIpAddr(request); - //当前时间 - Date currDate = new Date(); - UnifiedOrderDto unifiedOrderDto = buildUnifiedOrderDto(dto, payAmount, ip, currDate); //构建统一下单请求实体 + UnifiedOrderDto unifiedOrderDto = buildUnifiedOrderDto(dto, payAmount, request); + //下单,获取第三方返回信息 PayStrategy payStrategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType()); PayInOrderVo payInOrderVo = payStrategy.unifiedOrder(unifiedOrderDto); + //构建支付订单完成入库 + PayInfo payInfo = buildPayInfo(payInOrderVo,unifiedOrderDto,dto); + payInfoMapper.insert(payInfo); return payInOrderVo; } /** - * 构建统一下单请求实体 + * 构建支付订单 + * + * @param payInOrderVo + * @param unifiedOrderDto * @param dto - * @param payAmount - * @param ip - * @param currDate * @return */ - private UnifiedOrderDto buildUnifiedOrderDto(AddPayInfoDto dto, String payAmount, String ip, Date currDate) { + private PayInfo buildPayInfo(PayInOrderVo payInOrderVo, UnifiedOrderDto unifiedOrderDto, AddPayInfoDto dto) { + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payInOrderVo.getOrderId()); + payInfo.setOrderId(dto.getOrderId()); + payInfo.setSceneCode(dto.getSceneCode()); + payInfo.setRemark(dto.getRemark()); + payInfo.setPayType(dto.getPayType()); + payInfo.setPayId(unifiedOrderDto.getOrderId()); + payInfo.setPayAmount(new BigDecimal(unifiedOrderDto.getPayAmount())); + payInfo.setAppid(payInOrderVo.getAppid()); + payInfo.setGoodsSubject(unifiedOrderDto.getGoodsSubject()); + payInfo.setGoodsDesc(unifiedOrderDto.getGoodsDesc()); + payInfo.setThirdNo(payInOrderVo.getPrepayid()); + payInfo.setIp(unifiedOrderDto.getIp()); + payInfo.setCreateTime(new Date()); + payInfo.setIsShow("1"); + return payInfo; + } + + /** + * 构建统一下单请求实体 + * @param dto 入参 + * @param payAmount 不同支付场景下的支付金额 + * @param request 请求request用于获取ip地址 + * @return + */ + private UnifiedOrderDto buildUnifiedOrderDto(AddPayInfoDto dto, String payAmount, HttpServletRequest request) { + //当前时间 + Date currDate = new Date(); + //ip地址 + String ip = IpUtils.getIpAddr(request); String wxCode = SecurityContextHolder.get("wxCode"); UnifiedOrderDto unifiedOrderDto = EntityConvertUtil.copy(dto, UnifiedOrderDto.class); unifiedOrderDto.setIp(ip); diff --git a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml index 5907d50..e1276e3 100644 --- a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml @@ -21,13 +21,15 @@ + + id, pay_id, order_id, pay_status, pay_type, pay_no, appid, goods_subject, goods_desc, pay_amount, pay_time, scene_code, ip, third_code, third_msg, third_no, remark, create_time, - update_time + update_time,sort,is_show