Переглянути джерело

fix
chatGPT多人座位不展示密码;5天内过期不推送密码更新消息

zoujiajian 3 роки тому
батько
коміт
1d27769a0c

+ 14 - 0
netflix-common/src/main/java/com/cyksj/common/util/SmsUtil.java

@@ -13,6 +13,9 @@ import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * @author chan
  * @date 2022/10/13 11:29 AM
@@ -21,6 +24,8 @@ public class SmsUtil {
 
     private static final String URL = "http://sms-api.luosimao.com/v1/send.json";
 
+    private static final String BATCH_URL = "http://sms-api.luosimao.com/v1/send_batch.json";
+
     private static final String PASSWORD = "key-1bf2a2f243e18be640b2428ddf03ded9";
 
     private static final String LVSINCO_PASSWORD = "key-246cd85eb5603c3d4924531e5d5c4edc";
@@ -61,6 +66,15 @@ public class SmsUtil {
         System.out.println(execute.body());
     }
 
+    public static void batchSendLuoKey2Msg(List<String> mobile, String msg) {
+        HttpRequest request = new HttpRequest(BATCH_URL);
+        request.setMethod(Method.POST);
+        request.basicAuth("api", LVSINCO_PASSWORD);
+        request.form("mobile_list", mobile.stream().collect(Collectors.joining(",")));
+        request.form("message", msg);
+        HttpResponse execute = request.execute();
+    }
+
     public static void sendTencent(String mobile, String msg) {
         try {
             /* 必要步骤:

+ 23 - 0
netflix-common/src/main/java/com/cyksj/common/util/StringUtil.java

@@ -1,6 +1,10 @@
 package com.cyksj.common.util;
 
 import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 
 import java.io.PrintWriter;
 import java.io.StringWriter;
@@ -445,4 +449,23 @@ public final class StringUtil {
 		}
 		return new String(chars);
 	}
+
+	public static String getRealAddressByIP(String ip) {
+		if (StrUtil.isBlank(ip)) {
+			return "unknown";
+		}
+		try {
+			String rspStr = HttpUtil.get("http://whois.pconline.com.cn/ipJson.jsp?ip=" + ip + "&json=true");
+			if (StrUtil.isEmpty(rspStr)) {
+				return "unknown";
+			}
+			JSONObject obj = JSONUtil.parseObj(rspStr);
+			String region = obj.getStr("pro");
+			String city = obj.getStr("city");
+			return String.format("%s %s", region, city);
+		} catch (Exception e) {
+		}
+
+		return "unknown";
+	}
 }

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.ChatGptPwdViewRecord;
+
+/*
+ *项目名: netflix
+ *文件名: ChatGptPwdViewRecordMapper
+ *创建者: JavaZou
+ *创建时间:2023/5/17 16:15
+ */
+public interface ChatGptPwdViewRecordMapper extends BaseMapper<ChatGptPwdViewRecord> {
+}

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ChatGptPwdViewRecord.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: ChatGptPwdViewRecord
+ *创建者: JavaZou
+ *创建时间:2023/5/17 16:07
+ */
+@Getter
+@Setter
+public class ChatGptPwdViewRecord extends BaseEntity{
+	private Long userId;
+
+	private Long relationId;
+
+	private Long skuId;
+
+	private String operateLocation;
+}

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

@@ -113,6 +113,9 @@ public class OrderDonView {
     @DbField("o.money")
     private BigDecimal money;
 
+    @DbField("o.coupon_money")
+    private BigDecimal couponMoney;
+
     @DbField("o.refund_money")
     private BigDecimal refundMoney;
 

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

@@ -3,6 +3,7 @@ package com.cyksj.model.views;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -30,6 +31,10 @@ public class RenewalView {
     @DbField("sku.months")
     private Integer months;
 
+    @JsonIgnore
+    @DbField("sku.num")
+    private Long skuNum;
+
     @DbField("sku.price")
     private BigDecimal price;
 

+ 4 - 0
netflix-service/src/main/java/com/cyksj/common/EnvCommonService.java

@@ -33,4 +33,8 @@ public class EnvCommonService {
 	public String getDomain() {
 		return this.getHost().substring(0, this.getHost().indexOf("8081"));
 	}
+
+	public Boolean isPrdEnv() {
+		return EnvCommonService.active_prd.equals(getEnv());
+	}
 }

+ 2 - 26
netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java

@@ -2,16 +2,13 @@ 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;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
 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.common.util.StringUtil;
 import com.cyksj.mapper.AccountMapper;
 import com.cyksj.mapper.AccountUpdatePasswordRecordMapper;
 import com.cyksj.mapper.manage.AutoUpdateAccountPwdLogMapper;
@@ -102,7 +99,7 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 		log.setAccount(account);
 		log.setOldPwd(oldPwd);
 		log.setNewPwd(newPwd);
-		log.setOperateLocation(getRealAddressByIP(operateIp));
+		log.setOperateLocation(StringUtil.getRealAddressByIP(operateIp));
 		log.setOperateIp(operateIp);
 
 		autoUpdateAccountPwdLogMapper.insert(log);
@@ -207,25 +204,4 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 			}
 		});
 	}
-
-	public String getRealAddressByIP(String ip) {
-		if (StrUtil.isBlank(ip)) {
-			return "unknown";
-		}
-		try {
-			String rspStr = HttpUtil.get("http://whois.pconline.com.cn/ipJson.jsp?ip=" + ip + "&json=true");
-			if (StrUtil.isEmpty(rspStr)) {
-				log.error("获取地理位置异常 {}", ip);
-				return "unknown";
-			}
-			JSONObject obj = JSONUtil.parseObj(rspStr);
-			String region = obj.getStr("pro");
-			String city = obj.getStr("city");
-			return String.format("%s %s", region, city);
-		} catch (Exception e) {
-			log.error("获取地理位置异常 {}", ip);
-		}
-
-		return "unknown";
-	}
 }

+ 23 - 5
netflix-service/src/main/java/com/cyksj/service/mange/group/CmsGroupServiceImpl.java

@@ -1,10 +1,12 @@
 package com.cyksj.service.mange.group;
 
 import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
@@ -54,6 +56,8 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
 
     private final SmsService smsService;
 
+    private final EnvCommonService envCommonService;
+
     private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
 
@@ -125,6 +129,7 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
         if (StrUtil.isNotBlank(verifyCodes)) {
             verifyCodeArray = verifyCodes.split(",");
         }
+        Boolean isPrdEnv = envCommonService.isPrdEnv();
         for (int i = 0; i < groupsRelations.size(); i++) {
             GroupsRelation relation = groupsRelations.get(i);
             if (relation.getExpiryTime() == null) {
@@ -144,8 +149,10 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
                     orderDonMapper.updateById(orderDon);
                 });
             }
-            //发送短信
-            smsService.sendSmsToRelationUser(relation.getUserId(), msg);
+            if (relation.getUserId() != 0 && isPrdEnv) {
+                //发送短信
+                smsService.sendSmsToRelationUser(relation.getUserId(), msg);
+            }
             if (verifyCodeArray != null && verifyCodeArray.length > 0 && i < verifyCodeArray.length) {
                 relation.setVerifyCode(verifyCodeArray[i]);
                 relationMapper.updateById(relation);
@@ -226,11 +233,22 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
 
     private void sendChangeAccountMsg(Long groupsId, Long goodsId) {
         GoodsDon goodsDon = goodsDonMapper.selectById(goodsId);
+        String title = goodsDon != null ? goodsDon.getTitle() : "车票";
+        DateTime now = DateTime.now();
+        Boolean isPrd = envCommonService.isPrdEnv();
         List<GroupsRelation> groupsRelations = beanSearcher.searchAll(GroupsRelation.class, MapUtils.builder().field(GroupsRelation::getGroupsId, groupsId).build());
         groupsRelations.forEach(relation -> {
-            String title = goodsDon != null ? goodsDon.getTitle() : "车票";
-            String msg = String.format(Constant.CHANGE_GROUPS_TRIPS_ACCOUNT, title);
-            smsService.sendSmsToRelationUser(relation.getUserId(), msg);
+            if (relation.getExpiryTime() == null) {
+                return;
+            }
+            //账号有效期小于5天的人,不发账号替换/改密码短信提醒
+            if (now.after(DateUtil.offsetDay(relation.getExpiryTime(), -5))) {
+                return;
+            }
+            if (relation.getUserId() != 0 && isPrd) {
+                String msg = String.format(Constant.CHANGE_GROUPS_TRIPS_ACCOUNT, title);
+                smsService.sendSmsToRelationUser(relation.getUserId(), msg);
+            }
         });
     }
 }

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -69,6 +69,9 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 			if (ticket.getExpiryTime() != null && ticket.getExpiryTime().before(now)) {
 				return false;
 			}
+			if (ticket.getGoodsId() == 18 && ticket.getSkuNum() > 1) {
+				ticket.setPassword(null);
+			}
 			if (ticket.getSecondType() == 1) {
 				ticket.setAccount(null);
 				ticket.setPassword(null);

+ 19 - 1
netflix-service/src/main/java/com/cyksj/service/template/impl/TemplateCommonServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.EnvCommonService;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.constant.TemplateEnum;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
@@ -20,6 +21,7 @@ import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.request.ReqSetLogisticsPost;
 import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.views.WxAppTemplateView;
+import com.cyksj.service.sms.SmsService;
 import com.cyksj.service.template.TemplateCommonService;
 import com.cyksj.service.wechat.WeChatService;
 import com.ejlchina.searcher.BeanSearcher;
@@ -61,6 +63,8 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 
 	private final GoodsDonSkuMapper goodsDonSkuMapper;
 
+	private final SmsService smsService;
+
 	public void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, User user, String toPeople, Boolean isCustomer) throws Exception {
 		if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
 			String openId = toPeople;
@@ -210,9 +214,23 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 					.field(GroupsRelationView::getAccountId, account.getId()).op(Operator.Equal)
 					.field(GroupsRelationView::getStatus, "validity").op(Operator.Equal)
 					.build());
+			Boolean isPrdEnv = envCommonService.isPrdEnv();
+			GoodsDon goodsDon = goodsDonMapper.selectById(account.getGoodsId());
+			String title = goodsDon != null ? goodsDon.getTitle() : "车票";
+			DateTime now = DateTime.now();
 			log.info("开始发送账号修改密码模板消息,大小:{}", relations.size());
 			for (GroupsRelationView relation : relations) {
-				sendUpdateAccountMsg(relation);
+				if (relation.getExpiryTime() == null) {
+					return;
+				}
+				//账号有效期小于5天的人,不发账号替换/改密码短信提醒
+				if (now.after(DateUtil.offsetDay(relation.getExpiryTime(), -5))) {
+					return;
+				}
+				if (relation.getUserId() != 0 && isPrdEnv) {
+					String msg = String.format(Constant.CHANGE_GROUPS_TRIPS_ACCOUNT, title);
+					smsService.sendSmsToRelationUser(relation.getUserId(), msg);
+				}
 			}
 		}
 	}

+ 19 - 19
netflix-service/src/main/java/com/cyksj/task/Scheduler.java

@@ -114,14 +114,15 @@ public class Scheduler {
         expiryList.forEach(relation -> groupRelationClearService.clearTicket(relation, UserTicketClearedRecord.Source.self));
     }
 
-    @Scheduled(cron = "0 0 9 * * ?")
-    public void expiryWxMsg() throws Exception {
-        DateTime now = new DateTime();
-        DateTime zero = DateUtil.offset(now, DateField.HOUR, -9);
-        DateTime time = DateUtil.offset(zero, DateField.DAY_OF_MONTH, 3);
-	    List<GroupsRelationView> groupsRelations = beanSearcher.searchAll(GroupsRelationView.class, MapUtils.builder().field(GroupsRelationView::getExpiryTime, time).op(Operator.LessEqual).build());
-        //String url = String.format("%sauth/weChat?url=%syinhe/web/ticket", envCommonService.getHost(), envCommonService.getDomain());
-        for (GroupsRelationView relation : groupsRelations) {
+	@Scheduled(cron = "0 0 9 * * ?")
+	public void expiryWxMsg() throws Exception {
+		if (envCommonService.isPrdEnv()) {
+			DateTime now = new DateTime();
+			DateTime zero = DateUtil.offset(now, DateField.HOUR, -9);
+			DateTime time = DateUtil.offset(zero, DateField.DAY_OF_MONTH, 3);
+			List<GroupsRelationView> groupsRelations = beanSearcher.searchAll(GroupsRelationView.class, MapUtils.builder().field(GroupsRelationView::getExpiryTime, time).op(Operator.LessEqual).build());
+			//String url = String.format("%sauth/weChat?url=%syinhe/web/ticket", envCommonService.getHost(), envCommonService.getDomain());
+			for (GroupsRelationView relation : groupsRelations) {
 //            User user = userMapper.selectById(relation.getUserId());
 //            if (user != null && StrUtil.isNotBlank(user.getOpenId())) {
 //                String openId = user.getOpenId();
@@ -173,17 +174,16 @@ public class Scheduler {
 //                    }
 //                }
 //            }
-	        //短信通知过期账号 用户
-	        try {
-		        String day = DateUtil.formatBetween(zero, relation.getExpiryTime(), BetweenFormater.Level.DAY);
-		        smsService.sendSmsToRelationUser(relation.getUserId(), String.format(Constant.ACCOUNT_EXPIRY_MSG_TEMPLATE, relation.getTitle(), day));
-	        } catch (Exception e) {
-		        log.error("过期账号用户:{}发送短信错误:{}", relation.getUserId(), StringUtil.getErrorText(e));
-	        }
-        }
-
-
-    }
+				//短信通知过期账号 用户
+				try {
+					String day = DateUtil.formatBetween(zero, relation.getExpiryTime(), BetweenFormater.Level.DAY);
+					smsService.sendSmsToRelationUser(relation.getUserId(), String.format(Constant.ACCOUNT_EXPIRY_MSG_TEMPLATE, relation.getTitle(), day));
+				} catch (Exception e) {
+					log.error("过期账号用户:{}发送短信错误:{}", relation.getUserId(), StringUtil.getErrorText(e));
+				}
+			}
+		}
+	}
 
     /**
      * 定时关闭订单

+ 2 - 25
netflix-web/src/main/java/com/cyksj/aspect/LogAspect.java

@@ -4,11 +4,9 @@ import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.servlet.ServletUtil;
-import cn.hutool.http.HttpUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
 import com.cyksj.common.annotation.Log;
 import com.cyksj.common.util.Jsons;
+import com.cyksj.common.util.StringUtil;
 import com.cyksj.enums.BusinessStatus;
 import com.cyksj.mapper.manage.cms.SysLogMapper;
 import com.cyksj.model.entity.CmsUser;
@@ -93,7 +91,7 @@ public class LogAspect {
 			getControllerMethodDescription(joinPoint, controllerLog, sysLog, jsonResult);
 			//请求方式
 			sysLog.setRequestMethod(request.getMethod());
-			sysLog.setOperateLocation(getRealAddressByIP(sysLog.getOperateIp()));
+			sysLog.setOperateLocation(StringUtil.getRealAddressByIP(sysLog.getOperateIp()));
 			sysLogManager.insert(sysLog);
 		} catch (Exception exp) {
 			// 记录本地异常日志
@@ -183,25 +181,4 @@ public class LogAspect {
 		return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse
 				|| o instanceof BindingResult;
 	}
-
-	public String getRealAddressByIP(String ip) {
-		if (StrUtil.isBlank(ip)) {
-			return "unknown";
-		}
-		try {
-			String rspStr = HttpUtil.get("http://whois.pconline.com.cn/ipJson.jsp?ip=" + ip + "&json=true");
-			if (StrUtil.isEmpty(rspStr)) {
-				log.error("获取地理位置异常 {}", ip);
-				return "unknown";
-			}
-			JSONObject obj = JSONUtil.parseObj(rspStr);
-			String region = obj.getStr("pro");
-			String city = obj.getStr("city");
-			return String.format("%s %s", region, city);
-		} catch (Exception e) {
-			log.error("获取地理位置异常 {}", ip);
-		}
-
-		return "unknown";
-	}
 }

+ 30 - 0
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -1,12 +1,17 @@
 package com.cyksj.web.controller.group;
 
+import cn.hutool.extra.servlet.ServletUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.StringUtil;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.ChatGptPwdViewRecordMapper;
 import com.cyksj.mapper.GroupsRelationMapper;
+import com.cyksj.model.entity.ChatGptPwdViewRecord;
 import com.cyksj.model.entity.GroupsRelation;
 import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.request.OrderPayRequest;
 import com.cyksj.model.views.RenewalView;
 import com.cyksj.model.views.UserTicketView;
@@ -21,6 +26,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 
 /**
@@ -43,6 +49,10 @@ public class GroupRelationController {
 
     private final UserService userService;
 
+    private final ChatGptPwdViewRecordMapper chatGptPwdViewRecordMapper;
+
+    private final HttpServletRequest request;
+
     @RequestMapping("/get/renewal")
     public Result<List<RenewalView>> get(Boolean isLoginPopularize) {
         long userId = StpUserUtil.getLoginIdAsLong();
@@ -93,4 +103,24 @@ public class GroupRelationController {
                 .build());
         return GatewayResponse.SUCCESS.newBuilder().toResult(ticketViews);
     }
+
+    /**
+     * 记录查看ChatGPT车票密码
+     */
+    @GetMapping("/recordView/{relationId}")
+    public Result<String> recordGPTPwdView(@PathVariable Long relationId) {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        List<Long> userIds = userService.getRelationUserIdList(userId, null);
+        GroupsRelationView groupsRelationView = beanSearcher.searchFirst(GroupsRelationView.class, MapUtils.builder()
+                .field(GroupsRelationView::getUserId, userIds).op(Operator.InList)
+                .field(GroupsRelationView::getId, relationId).build());
+        if (groupRelationFrontService == null) throw BusinessRuntimeException.getInstance("车票已不存在");
+        ChatGptPwdViewRecord viewRecord = new ChatGptPwdViewRecord();
+        viewRecord.setUserId(userId);
+        viewRecord.setRelationId(relationId);
+        viewRecord.setSkuId(groupsRelationView.getSkuId());
+        viewRecord.setOperateLocation(StringUtil.getRealAddressByIP(ServletUtil.getClientIP(request)));
+        chatGptPwdViewRecordMapper.insert(viewRecord);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(groupsRelationView.getTripsPassword());
+    }
 }