Преглед на файлове

add
解析chatGPT无会员规格账号导入;midjourney课程私域购买

zoujiajian преди 3 години
родител
ревизия
9a2ffa45e1

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/Account.java

@@ -49,5 +49,10 @@ public class Account extends BaseEntity {
      */
     private Long customerServiceId;
 
+    /**
+     * chatGpt apiKey
+     */
+    private String apiKey;
+
     private String remark;
 }

+ 5 - 1
netflix-dao/src/main/java/com/cyksj/model/excel/ExcelManageAccountData.java

@@ -22,7 +22,7 @@ import java.util.Date;
 		"left join groups_trips gt on gt.account_id = a.id " +
 		"left join groups_relation gr on gr.groups_id = gt.id " +
 		"left join goods_don_sku gdk on gdk.id = gt.sku_id",
-		groupBy = "a.id,g.id,a.bank_card,g.title,a.account,a.password,a.start_time,a.expiry_time,a.amount,a.cn_account,a.us_account,gt.id,a.remark,gdk.id,gdk.spec_val")
+		groupBy = "a.id,g.id,a.bank_card,g.title,a.account,a.password,a.api_key,a.start_time,a.expiry_time,a.amount,a.cn_account,a.us_account,gt.id,a.remark,gdk.id,gdk.spec_val")
 public class ExcelManageAccountData {
 
 	@ExcelIgnore
@@ -45,6 +45,10 @@ public class ExcelManageAccountData {
 	@DbField("a.password")
 	private String password;
 
+	@ExcelProperty("APIkey")
+	@DbField("a.api_key")
+	private String apiKey;
+
 	@ExcelProperty("银行卡号")
 	@DbField("a.bank_card")
 	private String bankCard;

+ 4 - 1
netflix-dao/src/main/java/com/cyksj/model/manage/views/AccountView.java

@@ -19,7 +19,7 @@ import java.util.Date;
         "left join groups_trips gt on gt.account_id = a.id " +
         "left join groups_relation gr on gr.groups_id = gt.id " +
         "left join goods_don_sku gdk on gdk.id = gt.sku_id",
-        groupBy = "a.id,g.id,a.bank_card,g.title,a.account,a.password,a.start_time,a.expiry_time,a.amount,a.cn_account,a.us_account,gt.id,a.remark,gdk.id,gdk.spec_val,a.customer_service_id")
+        groupBy = "a.id,g.id,a.bank_card,g.title,a.account,a.password,a.api_key,a.start_time,a.expiry_time,a.amount,a.cn_account,a.us_account,gt.id,a.remark,gdk.id,gdk.spec_val,a.customer_service_id")
 public class AccountView {
 
     @DbField("a.id")
@@ -40,6 +40,9 @@ public class AccountView {
     @DbField("a.password")
     private String password;
 
+    @DbField("a.api_key")
+    private String apiKey;
+
     @DbField("a.start_time")
     private Date startTime;
 

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonView.java

@@ -73,6 +73,9 @@ public class OrderDonView {
     @DbField("g.title")
     private String title;
 
+    @DbField("g.id")
+    private Long goodsId;
+
     @DbField("sku.is_benefits")
     private Boolean isBenefits;
 

+ 2 - 2
netflix-dao/src/main/java/com/cyksj/model/request/AccountGroupsReq.java

@@ -28,6 +28,8 @@ public class AccountGroupsReq {
 	@NotEmpty
 	private String password;
 
+	private String apiKey;
+
 	@NotNull
 	private Long goodsId;
 
@@ -35,10 +37,8 @@ public class AccountGroupsReq {
 
 	private Long skuId;
 
-	@NotNull
 	private Date startTime;
 
-	@NotNull
 	private Date expiryTime;
 
 	private BigDecimal amount;

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java

@@ -70,6 +70,9 @@ public class RenewalView {
     @DbField("a.password")
     private String password;
 
+    @DbField("a.api_key")
+    private String apiKey;
+
     @DbIgnore
     private GoodsDonViews goodsDonViews;
 }

+ 5 - 0
netflix-service/src/main/java/com/cyksj/service/mange/CmsAccountService.java

@@ -40,4 +40,9 @@ public interface CmsAccountService extends IService<Account> {
 	void assignDeleteCustomerAccount(Long customerServiceId);
 
 	void assignCustomerAccount(List<CmsUserVO> customers, List<AccountView> accountViews);
+
+	/**
+	 * 解析ChatGPT独立账号
+	 */
+	void analysisChatGPTAccount(Long goodsId, Long skuId, List<Object> accountList);
 }

+ 44 - 4
netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cyksj.service.mange.account;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
@@ -9,19 +10,19 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.mapper.AccountMapper;
 import com.cyksj.mapper.AccountUpdatePasswordRecordMapper;
 import com.cyksj.mapper.manage.AutoUpdateAccountPwdLogMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
-import com.cyksj.model.entity.Account;
-import com.cyksj.model.entity.AccountUpdatePasswordRecord;
-import com.cyksj.model.entity.AutoUpdateAccountPwdLog;
-import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelAccountData;
 import com.cyksj.model.manage.views.AccountView;
 import com.cyksj.model.views.CmsUserVO;
 import com.cyksj.model.views.ExpiredAccountDataView;
 import com.cyksj.service.mange.CmsAccountService;
+import com.cyksj.service.mange.CmsGroupService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapUtils;
@@ -29,9 +30,11 @@ import com.google.common.collect.Lists;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 
 /**
@@ -52,6 +55,8 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 
 	private final BeanSearcher beanSearcher;
 
+	private final CmsGroupService cmsGroupService;
+
 	@Override
 	public IPage<ExpiredAccountDataView> getExpiredAccountView(Boolean isCorpWx, String customerService, Long goodsId, Long skuId, String account, Boolean renewStatus, Boolean handleStatus, String cnAccount, String usAccount, Integer userId, String startTime, String endTime, String now, Long offset, Long limit) {
 		return accountMapper.getExpiredAccountView(isCorpWx, customerService, goodsId, skuId, account, renewStatus, handleStatus, cnAccount, usAccount, userId, startTime, endTime, now, new Page<>(offset, limit));
@@ -157,6 +162,41 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 		}
 	}
 
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void analysisChatGPTAccount(Long goodsId, Long skuId, List<Object> accountList) {
+		if (CollUtil.isEmpty(accountList)) {
+			throw BusinessRuntimeException.getInstance("文件数据为空");
+		}
+		accountList.forEach(accountData -> {
+			Map<String, Object> map = Jsons.toMap(accountData);
+			String[] part = map.get("0").toString().split("----");
+			if (part.length > 2) {
+				String account = part[0];
+				String password = part[1];
+				String apiKey = part[2];
+				int count = this.count(Wrappers.lambdaQuery(Account.class)
+						.eq(Account::getAccount, account)
+						.eq(Account::getGoodsId, goodsId));
+				if (count > 0) {
+					return;
+				}
+				Account insert = new Account();
+				insert.setAccount(account);
+				insert.setPassword(password);
+				insert.setApiKey(apiKey);
+				insert.setGoodsId(goodsId);
+				this.save(insert);
+
+				//自动配置车队
+				GroupsTrips groupsTrips = new GroupsTrips();
+				groupsTrips.setSkuId(skuId);
+				groupsTrips.setAccountId(insert.getId());
+				cmsGroupService.issuance(groupsTrips);
+			}
+		});
+	}
+
 	public String getRealAddressByIP(String ip) {
 		if (StrUtil.isBlank(ip)) {
 			return "unknown";

+ 30 - 4
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -356,7 +356,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		this.saveOrUpdate(orderDon);
 
-		if (Constant.realGoodsType.contains(goodsDon.getType())) {
+		if (Constant.realGoodsType.contains(goodsDon.getType()) && !goodsDon.getId().equals(27l)) {
 			saveTransport(payRequest.getAddressId(), orderDon.getId());
 		}
 		if (isNew) {
@@ -504,9 +504,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 		order.setPayTime(DateUtil.parse(map.get("time_end"), "yyyyMMddHHmmss"));
 		order.setShopId(appId);
-
+		Long goodsId = order.getGoodsId();
 		if (order.getIsNoLogin()) {
-			order.setExCode(exchangeCodeService.getExCode(order.getGoodsId(), order.getSkuId(), 1));
+			order.setExCode(exchangeCodeService.getExCode(goodsId, order.getSkuId(), 1));
 		}
 		if (StringUtils.isBlank(order.getOpenId())) {
 			order.setOpenId(map.get("openid"));
@@ -550,6 +550,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		this.updateById(order);
 
+		//购买Midjourney课程 赠送Midjourney车票
+		if (goodsId != null && goodsId.equals(27l)) {
+			TASK_POOL.execute(()->sendMidjourneyTicketIfCourse(order.getUserId()));
+		}
 		//配置了特定奖池,增加抽奖机会
 		TASK_POOL.execute(() -> {
 			try {
@@ -836,8 +840,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			log.info("支付宝已回调,重复修改状态 id:{}", orderDon.getId());
 			return;
 		}
+		Long goodsId = orderDon.getGoodsId();
 		if (orderDon.getIsNoLogin()) {
-			orderDon.setExCode(exchangeCodeService.getExCode(orderDon.getGoodsId(), orderDon.getSkuId(), 1));
+			orderDon.setExCode(exchangeCodeService.getExCode(goodsId, orderDon.getSkuId(), 1));
 		}
 		GoodsDonSku sku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
 		GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
@@ -888,6 +893,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		this.updateById(orderDon);
 
+		//购买Midjourney课程 赠送Midjourney车票
+		if (goodsId != null && goodsId.equals(27l)) {
+			TASK_POOL.execute(()->sendMidjourneyTicketIfCourse(orderDon.getUserId()));
+		}
+
 		//配置了特定奖池,增加抽奖机会
 		TASK_POOL.execute(() -> {
 			try {
@@ -2144,4 +2154,20 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		}
 	}
+
+	/**
+	 * 购买Midjourney课程 赠送Midjourney车票
+	 */
+	private void sendMidjourneyTicketIfCourse(Long userId) {
+		Optional.ofNullable(goodsDonSkuMapper.selectById(185))
+				.ifPresent(sku -> {
+					GroupsRelation relation = exchangeCodeService.getRelationNoOrder(sku, userId);
+					if (relation.getExpiryTime() == null || relation.getStartTime() == null) {
+						DateTime now = DateTime.now();
+						relation.setStartTime(now);
+						relation.setExpiryTime(DateUtil.offsetMonth(now, sku.getMonths() * 1));
+						groupsRelationMapper.updateById(relation);
+					}
+				});
+	}
 }

+ 6 - 4
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -61,10 +61,12 @@ public class GoodsDonController {
                     .orderByAsc(GoodsDonSku::getPrice)
                     .last("limit 1")
                     .select(GoodsDonSku::getPrice));
-            goods.setPrice(goodsDonSku.getPrice());
-            goods.setSoldNum(goods.getVirtualSold() + orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
-                    .eq(OrderDon::getGoodsId, goods.getId())
-                    .notIn(OrderDon::getStatus, Constant.noOrderStatus)));
+            Optional.ofNullable(goodsDonSku).ifPresent(sku->{
+                goods.setPrice(goodsDonSku.getPrice());
+                goods.setSoldNum(goods.getVirtualSold() + orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+                        .eq(OrderDon::getGoodsId, goods.getId())
+                        .notIn(OrderDon::getStatus, Constant.noOrderStatus)));
+            });
         });
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }

+ 11 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java

@@ -53,6 +53,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
@@ -231,6 +232,16 @@ public class CmsAccountController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult("导入成功");
 	}
 
+	/**
+	 * 解析chatGpt独立账号excel
+	 */
+	@PostMapping("/analysis/chatGPT/account")
+	public Result<String> analysisChatGPTAccount(@RequestParam(required = false, defaultValue = "18") Long goodsId, @RequestParam(required = false, defaultValue = "176") Long skuId, MultipartFile file) throws IOException {
+		List<Object> accountList = EasyExcel.read(file.getInputStream()).sheet().headRowNumber(0).doReadSync();
+		accountService.analysisChatGPTAccount(goodsId, skuId, accountList);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
     @PostMapping("/post")
     @NoSubmit
     @Transactional(rollbackFor = Throwable.class)

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -382,7 +382,7 @@ public class OrderController {
                     .eq(UserPayEquipmentAvailableBenefits::getRealOrderId, data.getId())
                     .eq(UserPayEquipmentAvailableBenefits::getDeleted, true));
             data.setIsHasBenefits(count > 0 ? true : false);
-            if (data.getIsBenefits()) {
+            if (data.getIsBenefits() != null && data.getIsBenefits()) {
                 String benefitsList = data.getBenefitsList();
                 if (StrUtil.isNotBlank(benefitsList)) {
                     try {