Pārlūkot izejas kodu

Merge branch 'xk_func' into pre

# Conflicts:
#	netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java
#	netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
zoujiajian 2 gadi atpakaļ
vecāks
revīzija
eff49d2464
20 mainītis faili ar 112 papildinājumiem un 18 dzēšanām
  1. 2 0
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java
  2. 2 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ExchangeCode.java
  3. 2 0
      netflix-dao/src/main/java/com/cyksj/model/request/ExchangeCodeReq.java
  4. 1 0
      netflix-dao/src/main/java/com/cyksj/model/request/LoginReq.java
  5. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/ExchangeCodeView.java
  6. 7 0
      netflix-dao/src/main/java/com/cyksj/model/views/RefundOrderDonServiceDataView.java
  7. 21 4
      netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
  8. 3 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  9. 1 0
      netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java
  10. 4 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  11. 4 0
      netflix-service/src/main/java/com/cyksj/service/user/BadIntentionOpService.java
  12. 2 1
      netflix-service/src/main/java/com/cyksj/service/user/UserService.java
  13. 28 0
      netflix-service/src/main/java/com/cyksj/service/user/impl/BadIntentionOpServiceImpl.java
  14. 8 5
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java
  15. 4 2
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  16. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java
  17. 6 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java
  18. 8 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/exchange/ExchangeCodeController.java
  19. 3 3
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java
  20. 2 2
      netflix-web/src/main/java/com/cyksj/web/controller/user/AuthorizationController.java

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java

@@ -72,4 +72,6 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 	Page<CorpTagUserOrderDataView> getTagUserTimeOrderData(@Param("page") Page<Object> objectPage, @Param("tagIdStr") String tagIdStr, @Param("toDate") String toDate, @Param("startTime") String startTime, @Param("endTime") String endTime);
 
 	List<RealGoodsSourceData> getRealGoodsSourceData(@Param("isGeneral") Boolean isGeneral, @Param("startDate") String startDate, @Param("endDate") String endDate);
+
+	String selectMaxRefundGoodsName(@Param("operator") String operator, @Param("startTime") String startTime, @Param("endTime") String endTime);
 }

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ExchangeCode.java

@@ -45,4 +45,6 @@ public class ExchangeCode extends BaseEntity{
 	 * 0平台 1抽奖
 	 */
 	private Integer type;
+
+	private String operator;
 }

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

@@ -31,4 +31,6 @@ public class ExchangeCodeReq {
 	 * 0平台 1抽奖
 	 */
 	private Integer type;
+
+	private String operator;
 }

+ 1 - 0
netflix-dao/src/main/java/com/cyksj/model/request/LoginReq.java

@@ -1,5 +1,6 @@
 package com.cyksj.model.request;
 
+import cn.hutool.http.server.HttpServerRequest;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;

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

@@ -62,6 +62,9 @@ public class ExchangeCodeView {
 	@DbField("ec.user_id")
 	private Long userId;
 
+	@DbField("ec.operator")
+	private String operator;
+
 	/**
 	 * 用户昵称
 	 */

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RefundOrderDonServiceDataView.java

@@ -1,6 +1,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 lombok.Getter;
 import lombok.Setter;
@@ -27,4 +28,10 @@ public class RefundOrderDonServiceDataView {
 
 	@DbField("sum(rd.refund_fee)/100")
 	private BigDecimal refundMoney;
+
+	/**
+	 * 退款最多的产品
+	 */
+	@DbIgnore
+	private String goodsName;
 }

+ 21 - 4
netflix-dao/src/main/resources/mapper/OrderDonMapper.xml

@@ -411,15 +411,32 @@
         where goods_id = 15
         and status not in ('close', 'noPayment', 'refund')
         <if test="startDate != null">
-            and created_time >= #{startDate}
+            and o.created_time >= #{startDate}
         </if>
         <if test="endDate != null">
-            and created_time &lt; #{endDate}
+            and o.created_time &lt; #{endDate}
         </if>
         <if test="isGeneral != null and isGeneral">
             and us.id is null
         </if>
-        and label_source != ''
-        group by label_source
+        and o.label_source != ''
+        group by o.label_source
+    </select>
+
+    <select id="selectMaxRefundGoodsName" resultType="java.lang.String">
+        select (select title from goods_don where id = o.goods_id limit 1)
+        from refund_order_don rd inner join order_don o
+        on o.id = rd.order_id
+        where rd.operator = #{operator}
+        and rd.refund_method not in ('EX_CODE'
+        , 'balance')
+        <if test="startTime != null">
+            and rd.created_time >= #{startTime}
+        </if>
+        <if test="endTime != null">
+            and rd.created_time &lt; #{endTime}
+        </if>
+        group by o.goods_id
+        order by count(*) desc limit 1
     </select>
 </mapper>

+ 3 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -611,6 +611,8 @@ public class RedisService {
         PHONE_CODE_KEY("phone_code_key:", "短信验证码", 60 * 3),
         PHONE_CODE_USER_NUM_KEY_DAY("phone_code_user_num_key:", "近一天获取验证码次数", 60 * 60 * 24l),
         PHONE_CODE_BALCK_KEY("phone_code_balck_key:", "手机黑名单", -1l),
+        PHONE_CODE_RETRY_TIME_KEY("phone_code_retry_time_key:", "手机登录重试key", 60 * 3),
+        BALCK_USER_IP_KEY("balck_user_ip_key:", "拉黑用户ip", 60 * 60 * 24),
         LOTTERY_KEY("lottery_key:%s", "抽奖key", 60 * 60 * 24l),
         TASK_TIME_LIMIT_KEY("task_time_limit:%s", "一次性任务key", 30),
         WX_GZH_QRCODE_LOGIN("wx_gzh_qrcode_login:%s", "微信公众号扫码登录key", 60),
@@ -671,6 +673,7 @@ public class RedisService {
         WX_INDENT_BIND_KEY("wx_indent_bind:key:", "微信身份授权绑定key", 60 * 60 * 24),
         EQUIPMENT_USER_SERVICE_RECORD("equipment_user_service_record:", "用户设备客服获取记录key", 60 * 60 * 24),
         INFORMATION_KEY("information_key:", "文章", 30 * 60L),
+        CLOSE_ORDER_TIME_KEY("close_order_time_key:", "关闭订单key", 3 * 60),
         ;
 
         private String name;

+ 1 - 0
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -114,6 +114,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			exchangeCode.setCode(sb.toString());
 			exchangeCode.setUseStatus(false);
 			exchangeCode.setType(exchangeCodeReq.getType());
+			exchangeCode.setOperator(exchangeCodeReq.getOperator());
 			exchangeCodeMapper.insert(exchangeCode);
 			ExcelExchangeCodeData excelExchangeCodeData = new ExcelExchangeCodeData();
 			BeanUtils.copyProperties(exchangeCode, excelExchangeCodeData);

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

@@ -806,6 +806,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	@Transactional(rollbackFor = Throwable.class)
 	@Override
 	public void closeOrder(Long orderId, Long userId) {
+		String orderCloseKey = RedisService.key.CLOSE_ORDER_TIME_KEY.getName() + orderId;
+		if (!redisService.setNx(orderCloseKey, orderId, RedisService.key.CLOSE_ORDER_TIME_KEY.getTimeout())) {
+			throw BusinessRuntimeException.getInstance("订单正在关闭中..");
+		}
 		//关闭订单逻辑
 		OrderDon orderDon = getById(orderId);
 		if (orderDon == null) {

+ 4 - 0
netflix-service/src/main/java/com/cyksj/service/user/BadIntentionOpService.java

@@ -1,5 +1,9 @@
 package com.cyksj.service.user;
 
+import javax.servlet.http.HttpServletRequest;
+
 public interface BadIntentionOpService {
     void checkHandleBadUserOp(String phone);
+
+    void isBadOpLoginPhone(HttpServletRequest request, String phone);
 }

+ 2 - 1
netflix-service/src/main/java/com/cyksj/service/user/UserService.java

@@ -8,6 +8,7 @@ import com.cyksj.model.entity.User;
 import com.cyksj.model.entity.WxSyncLog;
 import com.cyksj.model.request.LoginReq;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 
 /**
@@ -44,7 +45,7 @@ public interface UserService extends IService<User> {
 	/**
 	 * 验证码登录
 	 */
-	User webLogin(LoginReq loginReq) throws Exception;
+	User webLogin(LoginReq loginReq, HttpServletRequest request) throws Exception;
 
 	String bindWxAccountRedirect(String code, String state) throws Exception;
 

+ 28 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/BadIntentionOpServiceImpl.java

@@ -1,12 +1,16 @@
 package com.cyksj.service.user.impl;
 
+import cn.hutool.extra.servlet.ServletUtil;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.StringUtil;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.user.BadIntentionOpService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import javax.servlet.http.HttpServletRequest;
+
 @Service
 @RequiredArgsConstructor
 @Slf4j
@@ -16,6 +20,8 @@ public class BadIntentionOpServiceImpl implements BadIntentionOpService {
     private static final int PHONE_CODE_GET_NUM_DAY_LIMIT = 30;
     private static final int PHONE_CODE_GET_NUM_DAY_MAX_BLACK = 50;
 
+    private static final int PHONE_LOGIN_CODE_RETRY = 10;
+
     @Override
     public void checkHandleBadUserOp(String phone) {
         if ("13662979985".equals(phone)) {
@@ -40,4 +46,26 @@ public class BadIntentionOpServiceImpl implements BadIntentionOpService {
         }
         redisService.set(dayKey, 1, RedisService.key.PHONE_CODE_USER_NUM_KEY_DAY.getTimeout());
     }
+
+    @Override
+    public void isBadOpLoginPhone(HttpServletRequest request, String phone) {
+        String ip = StringUtil.getInternalAddressByIP(ServletUtil.getClientIP(request));
+        String blackIpKey = RedisService.key.BALCK_USER_IP_KEY + ip;
+        if (redisService.hasKey(blackIpKey)) {
+            throw BusinessRuntimeException.getInstance("检测到您操作异常,请联系客服");
+        }
+        String RetryTimeKey = RedisService.key.PHONE_CODE_RETRY_TIME_KEY.getName() + phone;
+        if (redisService.hasKey(RetryTimeKey)) {
+            int i = Integer.parseInt(redisService.get(RetryTimeKey).toString());
+            if (i >= PHONE_LOGIN_CODE_RETRY) {
+                //锁住他的ip
+                redisService.setNx(blackIpKey, ip, RedisService.key.BALCK_USER_IP_KEY.getTimeout());
+                throw BusinessRuntimeException.getInstance("检测到您操作异常,请联系客服");
+            } else {
+                redisService.incr(RetryTimeKey, 1l);
+            }
+        } else {
+            redisService.setNx(RetryTimeKey, 1, RedisService.key.PHONE_CODE_RETRY_TIME_KEY.getTimeout());
+        }
+    }
 }

+ 8 - 5
netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java

@@ -36,6 +36,7 @@ import com.cyksj.service.mange.coupon.CouponCommonService;
 import com.cyksj.service.market.task.BindTaskService;
 import com.cyksj.service.shop.YhShopDistributeService;
 import com.cyksj.service.sys.SysConfigService;
+import com.cyksj.service.user.BadIntentionOpService;
 import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.service.user.UserLoginRecordService;
 import com.cyksj.service.user.UserService;
@@ -50,6 +51,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -117,8 +119,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
 	private final UserDistributeSharedMapper userDistributeSharedMapper;
 
-	private final UserCertRecordMapper userCertRecordMapper;
-
+	private final BadIntentionOpService badIntentionOpService;
 	private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
 	@Override
@@ -370,9 +371,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 	}
 
 	@Override
-	public User webLogin(LoginReq loginReq) throws Exception {
+	public User webLogin(LoginReq loginReq, HttpServletRequest request) throws Exception {
 		LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class).last("limit 1");
-		if (loginReq.getType() == null || loginReq.getType() < 1 && loginReq.getType() > 2) {
+		if (loginReq.getType() == null || loginReq.getType() < 1 || loginReq.getType() > 3) {
 			throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新操作");
 		}
 		if (loginReq.getType() == 1) {
@@ -391,6 +392,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 				throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
 			}
 			if (!StrUtil.equals(loginReq.getCode(), phoneCode.getCode())) {
+				//是否是恶意用户
+				badIntentionOpService.isBadOpLoginPhone(request, loginReq.getPhone());
 				throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
 			}
 			wrapper.eq(User::getLoginPhone, loginReq.getPhone());
@@ -409,7 +412,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 			redisService.del(RedisService.key.EMAIL_CODE_KEY.getNameFormat(loginReq.getEmail()));
 			wrapper.eq(User::getEmail, loginReq.getEmail());
 		}
-		if (loginReq.getType() == 3){
+		if (loginReq.getType() == 3) {
 			wrapper.eq(User::getEmail, loginReq.getEmail());
 		}
 		//保存用户信息

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

@@ -224,7 +224,8 @@ public class GoodsDonController {
 		    Result<List<YhShopGoodsFrontView>> shopGoods = getShopGoods(yhShopFrontService.getYhsIdByCustomId(customId));
 		    return shopGoods;
 	    }
-	    List<Long> filter_goodsIds = getFilterGoodsIds();
+	    //List<Long> filter_goodsIds = getFilterGoodsIds();
+	    List<Long> filter_goodsIds = null;
 	    String pcCacheKey = RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "PC";
 	    if (CollUtil.isNotEmpty(filter_goodsIds)) {
 		    pcCacheKey += ":hz-ip";
@@ -268,7 +269,8 @@ public class GoodsDonController {
 		    Result<List<YhShopGoodsFrontView>> shopGoods = getShopGoods(yhShopFrontService.getYhsIdByCustomId(customId));
 		    return shopGoods;
 	    }
-	    List<Long> filter_goodsIds = getFilterGoodsIds();
+	    //List<Long> filter_goodsIds = getFilterGoodsIds();
+		List<Long> filter_goodsIds = null;
 	    String h5CacheKey = RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "H5";
 	    if (CollUtil.isNotEmpty(filter_goodsIds)) {
 		    h5CacheKey += ":hz-ip";

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

@@ -214,7 +214,7 @@ public class GroupRelationController {
         viewRecord.setUserId(userId);
         viewRecord.setRelationId(relationId);
         viewRecord.setSkuId(groupsRelationView.getSkuId());
-        viewRecord.setOperateLocation(StringUtil.getRealAddressByIP(ServletUtil.getClientIP(request)));
+        viewRecord.setOperateLocation(ServletUtil.getClientIP(request));
         viewRecord.setAccount(groupsRelationView.getTripsAccount());
         viewRecord.setPassword(groupsRelationView.getTripsPassword());
         ticketPwdViewRecordMapper.insert(viewRecord);

+ 6 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -103,6 +103,8 @@ public class CmsOrderController {
 
 	private final UserMapper userMapper;
 
+	private final OrderDonMapper orderDonMapper;
+
 
 	@GetMapping("/get")
 	@SaCheckPermission("order:view")
@@ -766,6 +768,10 @@ public class CmsOrderController {
 			}
 		}
 		SearchResult<RefundOrderDonServiceDataView> search = beanSearcher.search(RefundOrderDonServiceDataView.class, builder.build());
+		search.getDataList().forEach(e->{
+			String goodsName = orderDonMapper.selectMaxRefundGoodsName(e.getOperator(), startTime, endTime);
+			e.setGoodsName(goodsName);
+		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 

+ 8 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/exchange/ExchangeCodeController.java

@@ -1,6 +1,7 @@
 package com.cyksj.web.controller.manage.exchange;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.cyksj.common.annotation.Log;
@@ -8,6 +9,8 @@ import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.model.entity.CmsUser;
 import com.cyksj.model.excel.ExcelExchangeCodeData;
 import com.cyksj.model.request.ExchangeCodeReq;
 import com.cyksj.model.views.ExchangeCodeView;
@@ -42,6 +45,8 @@ public class ExchangeCodeController {
 
 	private final ExchangeCodeService exchangeCodeService;
 
+	private final CmsUserMapper cmsUserMapper;
+
 	/**
 	 * 生成兑换码 并导出
 	 */
@@ -52,6 +57,9 @@ public class ExchangeCodeController {
 		if (ObjectUtil.hasEmpty(exchangeCodeReq.getGoodsId(), exchangeCodeReq.getSkuId(), exchangeCodeReq.getNumber())) {
 			throw BusinessRuntimeException.getInstance("必填项为空");
 		}
+		long adminId = StpUtil.getLoginIdAsLong();
+		CmsUser cmsUser = cmsUserMapper.selectById(adminId);
+		exchangeCodeReq.setOperator(cmsUser.getNickname());
 		List<ExcelExchangeCodeData> data =  exchangeCodeService.createExchangeCode(exchangeCodeReq);
 		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, ExcelExchangeCodeData.class, data, "银河兑换码","银河兑换码", ExcelTypeEnum.XLSX, null);
 	}

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

@@ -136,9 +136,9 @@ public class OrderController {
         log.info("{}[start] params:{}", methodName, payRequest);
 
         String ip = ServletUtil.getClientIP(request);
-        if (StringUtil.getInternalAddressByIP(ip).contains("柬埔寨")) {
-            throw BusinessRuntimeException.getInstance("系统异常");
-        }
+//        if (StringUtil.getInternalAddressByIP(ip).contains("柬埔寨")) {
+//            throw BusinessRuntimeException.getInstance("系统异常");
+//        }
         payRequest.setIp(ip);
 
         OrderDon orderDon = orderDonService.submit(payRequest);

+ 2 - 2
netflix-web/src/main/java/com/cyksj/web/controller/user/AuthorizationController.java

@@ -442,7 +442,7 @@ public class AuthorizationController {
     @PostMapping("/login/phone")
     @NoSubmit
     public Result<UserAuthLoginResp> loginByPhone(@RequestBody LoginReq loginReq) throws Exception {
-        User user = userService.webLogin(loginReq);
+        User user = userService.webLogin(loginReq, request);
         Optional.ofNullable(user.getIsBlack())
                 .ifPresent(black -> {
                     if (black) {
@@ -517,7 +517,7 @@ public class AuthorizationController {
         loginReq.setType(3);
         loginReq.setEmail(googleLoginRep.getEmail());
         loginReq.setSubject(googleLoginRep.getSubject());
-        User user = userService.webLogin(loginReq);
+        User user = userService.webLogin(loginReq, request);
 
         Optional.ofNullable(user.getIsBlack())
                 .ifPresent(black -> {