Explorar o código

拉黑用户支付账号

zoujiajian %!s(int64=2) %!d(string=hai) anos
pai
achega
760837b3ab

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/UserPayOrderBlockMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserPayOrderBlock;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserPayOrderBlockMapper
+ * 创建者: JavaZou
+ * 创建时间:2023/12/13 16:35
+ */
+public interface UserPayOrderBlockMapper extends BaseMapper<UserPayOrderBlock> {
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserPayOrderBlock.java

@@ -0,0 +1,13 @@
+package com.cyksj.model.entity;
+
+
+import lombok.Data;
+
+@Data
+public class UserPayOrderBlock extends BaseEntity{
+    private Long userId;
+
+    private String orderNo;
+
+    private String buyerId;
+}

+ 34 - 14
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -253,6 +253,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final OrderRefundService orderRefundService;
 
+	private final UserPayOrderBlockMapper userPayOrderBlockMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -1064,6 +1066,15 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDon.setType(OrderDon.Type.ALI_PAY);
 
 		orderDon.setBuyerId(buyerId);
+		//该支付账号id 是否被后台拉黑
+		Integer count1 = userPayOrderBlockMapper.selectCount(Wrappers.lambdaQuery(UserPayOrderBlock.class)
+				.eq(UserPayOrderBlock::getBuyerId, buyerId));
+		if (count1 > 0) {
+			log.info("该支付账号id:{} 已被后台拉黑", buyerId);
+			notifyRefundOrder(orderDon, goodsDon, sku);
+			return;
+		}
+
 		if (orderDon.getOrderType() == 1 && StrUtil.isNotEmpty(buyerId)) {
 			//近一个月同一买家id 只能购买一次 多人
 			if (orderDon.getGoodsId() == 26l && sku.getNum() != 1) {
@@ -1076,20 +1087,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				if (count > 1) {
 					//退款
 					log.info("一个月内同一买家id购买过Midjourney账号,对订单号:{}进行退款", orderDon.getOrderNo());
-					OrderRefundReq orderRefundReq = new OrderRefundReq();
-					orderRefundReq.setOrderId(orderDon.getId());
-					orderRefundReq.setRefundType("ALI_PAY");
-					orderRefundReq.setRefundMoney(orderDon.getMoney());
-					orderDon.setRefundDesc("近一个月内购买过Midjourney账号");
-					String outNo = orderRefundService.centerRefund(orderRefundReq, orderDon);
-
-					orderDon.setStatus(OrderDon.Status.refund);
-					orderDonMapper.updateById(orderDon);
-
-					clearUserLockingRelation(groupsRelationMapper.selectById(orderDon.getRelationId()), orderDon);
-
-					//记录退款
-					orderRefundService.refundRecord(orderDon, orderRefundReq.getRefundMoney(), goodsDon, sku, outNo, orderDon.getType().getType());
+					notifyRefundOrder(orderDon, goodsDon, sku);
 					return;
 				}
 			}
@@ -2683,4 +2681,26 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			orderCommonService.delRelation(groupsRelation);
 		}
 	}
+
+	/**
+	 * 回调后 直接退款
+	 */
+	public void notifyRefundOrder(OrderDon orderDon, GoodsDon goodsDon, GoodsDonSku sku) throws Exception {
+		//退款
+		OrderRefundReq orderRefundReq = new OrderRefundReq();
+		orderRefundReq.setOrderId(orderDon.getId());
+		orderRefundReq.setRefundType("ALI_PAY");
+		orderRefundReq.setRefundMoney(orderDon.getMoney());
+		orderDon.setRefundDesc("近一个月内购买过Midjourney账号");
+		String outNo = orderRefundService.centerRefund(orderRefundReq, orderDon);
+
+		orderDon.setStatus(OrderDon.Status.refund);
+		orderDonMapper.updateById(orderDon);
+
+		clearUserLockingRelation(groupsRelationMapper.selectById(orderDon.getRelationId()), orderDon);
+
+		//记录退款
+		orderRefundService.refundRecord(orderDon, orderRefundReq.getRefundMoney(), goodsDon, sku, outNo, orderDon.getType().getType());
+		return;
+	}
 }

+ 15 - 0
netflix-service/src/main/java/com/cyksj/service/user/UserPayOrderBlockService.java

@@ -0,0 +1,15 @@
+package com.cyksj.service.user;
+
+import com.alipay.api.AlipayApiException;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.UserPayOrderBlock;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserPayOrderBlockService
+ * 创建者: JavaZou
+ * 创建时间:2023/12/13 16:41
+ */
+public interface UserPayOrderBlockService extends IService<UserPayOrderBlock> {
+	void blockUserOrder(UserPayOrderBlock payOrderBlock) throws AlipayApiException;
+}

+ 81 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserPayOrderBlockServiceImpl.java

@@ -0,0 +1,81 @@
+package com.cyksj.service.user.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.response.AlipayTradeQueryResponse;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.UserPayOrderBlockMapper;
+import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.UserPayOrderBlock;
+import com.cyksj.service.order.OrderDonService;
+import com.cyksj.service.user.UserBindRelationService;
+import com.cyksj.service.user.UserPayOrderBlockService;
+import com.cyksj.service.wechat.WeChatService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserPayOrderBlockServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2023/12/13 16:41
+ */
+@Service
+@RequiredArgsConstructor
+public class UserPayOrderBlockServiceImpl extends ServiceImpl<UserPayOrderBlockMapper, UserPayOrderBlock> implements UserPayOrderBlockService {
+	private final OrderDonService orderDonService;
+
+	private final WeChatService weChatService;
+
+	private final UserBindRelationService userBindRelationService;
+
+	@Override
+	public void blockUserOrder(UserPayOrderBlock payOrderBlock) throws AlipayApiException {
+		String orderNo = payOrderBlock.getOrderNo();
+
+		OrderDon orderDon = orderDonService.getOne(Wrappers.lambdaQuery(OrderDon.class)
+				.eq(OrderDon::getOrderNo, orderNo).last("limit 1"));
+		if (orderDon == null) {
+			throw BusinessRuntimeException.getInstance("该订单号不存在");
+		}
+		String buyerId = orderDon.getBuyerId();
+		if (StrUtil.isEmpty(buyerId)) {
+			Long userId = orderDon.getUserId();
+			List<Long> relationUserIdList = userBindRelationService.getRelationUserIdList(userId, null);
+			orderDon = orderDonService.getOne(Wrappers.lambdaQuery(OrderDon.class)
+					.in(OrderDon::getUserId, relationUserIdList)
+					.ne(OrderDon::getBuyerId, StrUtil.EMPTY)
+					.last("limit 1"));
+			if (orderDon != null) {
+				buyerId = orderDon.getBuyerId();
+			}
+			if (StrUtil.isEmpty(buyerId)) {
+				if (orderDon.getType() == OrderDon.Type.ALI_PAY) {
+					AlipayTradeQueryResponse zfbOrderDetail = orderDonService.getZfbOrderDetail(orderDon.getShopId(), orderDon.getOrderNo());
+					if (zfbOrderDetail != null) {
+						buyerId = zfbOrderDetail.getBuyerUserId();
+					}
+				}
+			}
+		}
+		if (StrUtil.isEmpty(buyerId)) {
+			throw BusinessRuntimeException.getInstance("未找到对应订单号对应用户支付账号id");
+		}
+
+		int count = count(Wrappers.lambdaQuery(UserPayOrderBlock.class)
+				.eq(UserPayOrderBlock::getBuyerId, buyerId));
+		if (count > 0) {
+			throw BusinessRuntimeException.getInstance("已拉给该账号");
+		}
+
+		UserPayOrderBlock userPayOrderBlock = new UserPayOrderBlock();
+		userPayOrderBlock.setUserId(orderDon.getUserId());
+		userPayOrderBlock.setOrderNo(orderNo);
+		userPayOrderBlock.setBuyerId(buyerId);
+		save(userPayOrderBlock);
+	}
+}

+ 33 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java

@@ -3,6 +3,7 @@ package com.cyksj.web.controller.manage;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alipay.api.AlipayApiException;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.Log;
@@ -25,6 +26,7 @@ import com.cyksj.model.views.*;
 import com.cyksj.service.relation.GroupRelationClearService;
 import com.cyksj.service.user.UserBenefitsService;
 import com.cyksj.service.user.UserBindRelationService;
+import com.cyksj.service.user.UserPayOrderBlockService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
@@ -75,6 +77,8 @@ public class CmsUserController{
 
     private final UserBenefitsService UserBenefitsService;
 
+    private final UserPayOrderBlockService userPayOrderBlockService;
+
     @GetMapping("/get")
     public Result<SearchResult<UserView>> get(Long id, String otherPhone, Long sharedId, String userid, Long businessId, String sort, String order) {
         MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
@@ -333,4 +337,33 @@ public class CmsUserController{
         UserBenefitsService.recordBalanceBySource(userId, deductBalance.negate(), UserBalanceSourceRecord.Source.manual);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
+
+    /**
+     * 新增用户下单拉黑记录
+     */
+    @PostMapping("/userOrder/block")
+    public Result<String> blockUserOrder(@RequestBody UserPayOrderBlock payOrderBlock) throws AlipayApiException {
+        String orderNo = payOrderBlock.getOrderNo();
+        Assert.notEmpty(orderNo, "请输入订单号");
+        userPayOrderBlockService.blockUserOrder(payOrderBlock);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 删除用户下单拉黑记录
+     */
+    @DeleteMapping("/userOrder/{id}")
+    public Result<String> delBlockUserOrder(@PathVariable Long id) {
+        userPayOrderBlockService.removeById(id);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 用户下单拉黑 列表
+     */
+    @GetMapping("/userOrder")
+    public Result<SearchResult<UserPayOrderBlock>> getBlockUserOrder() {
+        SearchResult<UserPayOrderBlock> search = beanSearcher.search(UserPayOrderBlock.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
 }