Преглед изворни кода

add 用户退款历史记录;被拉黑信息提示
; ChatGPT Plus账号限购校验动态化

zoujiajian пре 3 година
родитељ
комит
23b9e495cc

+ 5 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -83,4 +83,9 @@ public interface Constant {
 	List<Long> CHAT_GPT_SKU_IDS = List.of(161l, 178l);
 
 	List<Long> MIDJOURNEY_SKU_IDS = List.of(175l, 185l, 186l);
+
+	/**
+	 * chatGPT Plus指定规格限购
+	 */
+	String CHAT_GPT_PLUS_SKU_PURCHASE_LIMIT = "chat_gpt_plus_sku_purchase_limit";
 }

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/ChatGPTPlusPurchaseLimitDto.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: ChatGPTPlusPurchaseLimitDto
+ *创建者: JavaZou
+ *创建时间:2023/4/21 17:19
+ */
+@Getter
+@Setter
+public class ChatGPTPlusPurchaseLimitDto {
+	private Long skuId;
+
+	private Integer time = 1;
+
+	private Integer days = 15;
+}

+ 63 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RefundOrderDonView.java

@@ -0,0 +1,63 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: RefundOrderDonView
+ *创建者: JavaZou
+ *创建时间:2023/4/17 15:49
+ */
+@Getter
+@Setter
+@SearchBean(tables = "refund_order_don rd")
+public class RefundOrderDonView {
+	@DbField("rd.order_id")
+	private Long orderId;
+
+	@DbField("rd.user_id")
+	private Long userId;
+
+	@DbIgnore
+	private String nickname;
+
+	/**
+	 * 退款单号
+	 */
+	@DbField("rd.out_refund_no")
+	private String outRefundNo;
+
+	/**
+	 * 退款金额
+	 */
+	@DbField("rd.refund_fee")
+	private BigDecimal refundMoney;
+
+	@DbField("rd.goods_id")
+	private Long goodsId;
+
+	@DbField("rd.goods_title")
+	private String title;
+
+	@DbField("rd.sku_id")
+	private Long skuId;
+
+	@DbField("rd.spec_val")
+	private String specVal;
+
+	/**
+	 * 退款方式
+	 */
+	@DbField("rd.refund_method")
+	private String refundMethod;
+
+	@DbField("rd.created_time")
+	private Date createTime;
+}

+ 46 - 2
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cyksj.service.order.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -48,6 +49,7 @@ import com.cyksj.mapper.manage.distribute.*;
 import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.mapper.market.task.UserBindDetailMapper;
 import com.cyksj.model.dto.AliPayParams;
+import com.cyksj.model.dto.ChatGPTPlusPurchaseLimitDto;
 import com.cyksj.model.dto.CouponPopularizeDto;
 import com.cyksj.model.dto.H5JsPayParams;
 import com.cyksj.model.entity.Address;
@@ -229,7 +231,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		} else {
 			user = userMapper.selectById(payRequest.getUserId());
 			if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
-			if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("您的账号操作异常,已被拉黑");
+			if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("系统检测操作异常,请稍后再试");
+			//ChatGPT Plus账号限购校验
+			checkChatGPTPlusPurchaseLimit(user.getId(), goodsDon.getId(), sku.getId(), sku.getSpecVal());
 			payOpenId = user.getOpenId();
 			if (goodsDon.getType() == 1) {
 				GroupsRelation relation = null;
@@ -641,7 +645,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		Long userId = payRequest.getUserId();
 		User user = userMapper.selectById(userId);
 		if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
-		if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("您的账号操作异常,已被拉黑");
+		if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("系统检测操作异常,请稍后再试");
 		Long renewSkuId = payRequest.getSkuId();
 		CouponUser couponUser = null;
 		if (StrUtil.isNotBlank(payRequest.getCouponExCode()) || payRequest.getCouponId() != null) {
@@ -2144,4 +2148,44 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		}
 	}
+
+	/**
+	 * chatGPT Plus账号购买限购校验
+	 */
+	public void checkChatGPTPlusPurchaseLimit(Long userId, Long goodsId, Long skuId, String specVal) {
+		if (goodsId == 18) {
+			SysConfig sysConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+					.eq(SysConfig::getSysKey, Constant.CHAT_GPT_PLUS_SKU_PURCHASE_LIMIT).last("limit 1"));
+			if (sysConfig != null) {
+				String sysValue = sysConfig.getSysValue();
+				if (StrUtil.isNotBlank(sysValue)) {
+					List<ChatGPTPlusPurchaseLimitDto> chatGPTPlusPurchaseLimitDtos = null;
+					try {
+						chatGPTPlusPurchaseLimitDtos = Jsons.parseList(sysValue, ChatGPTPlusPurchaseLimitDto.class);
+					} catch (Exception e) {
+						log.info("ChatGPT Plus限购配置错误");
+						return;
+					}
+					if (CollUtil.isNotEmpty(chatGPTPlusPurchaseLimitDtos)) {
+						for (ChatGPTPlusPurchaseLimitDto chatGPTPlusPurchaseLimitDto : chatGPTPlusPurchaseLimitDtos) {
+							Long limitSkuId = chatGPTPlusPurchaseLimitDto.getSkuId();
+							Integer time = chatGPTPlusPurchaseLimitDto.getTime();
+							Integer days = chatGPTPlusPurchaseLimitDto.getDays();
+							if (limitSkuId != null && skuId.equals(limitSkuId)) {
+								//半个月内是否购买过1单 chatGPT Plus
+								Integer count = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+										.eq(OrderDon::getUserId, userId)
+										.eq(OrderDon::getSkuId, skuId)
+										.gt(OrderDon::getCreatedTime, DateUtil.offsetDay(DateTime.now(), -days))
+										.notIn(OrderDon::getStatus, Constant.noOrderAllStatus));
+								if (count > time - 1)
+									throw BusinessRuntimeException.getInstance(String.format("%s天内只能购买%s次ChatGPT Plus %s规格账号", days, time, specVal.replaceAll(";", "")));
+								break;
+							}
+						}
+					}
+				}
+			}
+		}
+	}
 }

+ 15 - 4
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -26,10 +26,7 @@ import com.cyksj.model.manage.views.AccountView;
 import com.cyksj.model.manage.views.OrderDonView;
 import com.cyksj.model.request.RealGoodsServiceReq;
 import com.cyksj.model.request.UserRealGoodsInterestReq;
-import com.cyksj.model.views.OrderCommentView;
-import com.cyksj.model.views.OrderDonTransportView;
-import com.cyksj.model.views.RealGoodsInterestUserHasPaymentView;
-import com.cyksj.model.views.RealGoodsInterestUserView;
+import com.cyksj.model.views.*;
 import com.cyksj.service.mange.CmsOrderDonService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.EasyExcelUtils;
@@ -102,6 +99,20 @@ public class CmsOrderController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
 
+	/**
+	 * 用户退款订单列表
+	 */
+	@GetMapping("/get/refund/list")
+	public Result<SearchResult<RefundOrderDonView>> getRefundOrderDonView() {
+		SearchResult<RefundOrderDonView> search = beanSearcher.search(RefundOrderDonView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.build());
+		search.getDataList().forEach(data -> {
+			Optional.ofNullable(userService.getById(data.getUserId()))
+					.ifPresent(user -> data.setNickname(user.getNickname()));
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
 	/**
 	 * 订单导出
 	 */

+ 11 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsAdminUserController.java

@@ -30,6 +30,7 @@ import com.cyksj.service.mange.cms.CmsUserManager;
 import com.cyksj.service.mange.cms.manager.service.CacheService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
@@ -300,8 +301,16 @@ public class CmsAdminUserController {
 	}
 
 	@GetMapping("/get/list")
-	public Result<SearchResult<CmsUserVO>> list() {
-		SearchResult<CmsUserVO> search = beanSearcher.search(CmsUserVO.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+	public Result<SearchResult<CmsUserVO>> list(String roleNames) {
+		long userId = StpUtil.getLoginIdAsLong();
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (StrUtil.isNotEmpty(roleNames) && roleNames.contains("客服")) {
+			CmsUser user = cmsUserManager.getUser(userId);
+			if (user != null && user.getRoleNames() != null && user.getRoleNames().contains("客服")) {
+				builder.field(CmsUserVO::getId, userId);
+			}
+		}
+		SearchResult<CmsUserVO> search = beanSearcher.search(CmsUserVO.class, builder.build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 }