Просмотр исходного кода

Merge branch 'ticket_notify' into pre

# Conflicts:
#	netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
zoujiajian 2 лет назад
Родитель
Сommit
39236318b1
19 измененных файлов с 180 добавлено и 22 удалено
  1. 2 0
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/corp/CorpUserPayIntentionMapper.java
  3. 21 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CorpUserPayIntention.java
  4. 0 6
      netflix-dao/src/main/java/com/cyksj/model/entity/YhShopDistributeWaitingSendPoints.java
  5. 1 1
      netflix-dao/src/main/java/com/cyksj/model/manage/views/CorpMsgAuditUserView.java
  6. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/CorpUserIntentionView.java
  7. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/YhShopUserDistributeOrdersDetailView.java
  8. 12 0
      netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
  9. 2 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  10. 6 0
      netflix-service/src/main/java/com/cyksj/service/corp/CorpService.java
  11. 18 4
      netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpServiceImpl.java
  12. 4 0
      netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java
  13. 1 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  14. 2 0
      netflix-service/src/main/java/com/cyksj/service/relation/GroupRelationFrontService.java
  15. 48 2
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  16. 10 0
      netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java
  17. 4 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgAuditController.java
  18. 33 4
      netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/WxCorpController.java
  19. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/shop/YhShopGoodsController.java

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

@@ -87,4 +87,6 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 	UserOrderDetailView getFansToDayOrdersView(@Param("tagIdStr") String tagIdStr, @Param("date") String date);
 
 	List<Long> getPayGoodsIds(@Param("userIds") List<Long> relationUserIdList);
+
+	BigDecimal getTotalRefundAmountTime(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
 }

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.corp;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CorpUserPayIntention;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: CorpUserPayIntentionMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/5/7 17:04
+ */
+public interface CorpUserPayIntentionMapper extends BaseMapper<CorpUserPayIntention> {
+}

+ 21 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CorpUserPayIntention.java

@@ -0,0 +1,21 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: CorpUserPayIntention
+ * 创建者: JavaZou
+ * 创建时间:2024/5/7 17:01
+ */
+@Getter
+@Setter
+public class CorpUserPayIntention extends BaseEntity {
+	private String unionId;
+
+	/**
+	 * 意向 0无回复 1无意向 2.问相关问题 3有意向 4很有意向
+	 */
+	private Integer intention;
+}

+ 0 - 6
netflix-dao/src/main/java/com/cyksj/model/entity/YhShopDistributeWaitingSendPoints.java

@@ -49,12 +49,6 @@ public class YhShopDistributeWaitingSendPoints extends BaseEntity {
 
 	private Status sendStatus;
 
-	/**
-	 * 是否是特殊设备分销订单
-	 * false
-	 */
-	private Boolean isSpecialEp;
-
 	public enum Status{
 		close("店铺分销订单关闭,积分奖励不分发"),
 		success("积分发送成功"),

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

@@ -16,7 +16,7 @@ import java.util.Date;
         where = " c.id = cu.corp_user_id " +
                 "and cu.external_userid = cr.corp_user_id " +
                 "and f.userid = cr.follow_id " +
-                ":tag:",
+                ":tag: :intention:",
         groupBy = "c.name,cu.external_userid,c.avatar,c.type,c.gender,f.name,f.userid,cr.agree_status,cr.add_created_time"
 )
 public class CorpMsgAuditUserView {

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/model/views/CorpUserIntentionView.java

@@ -22,7 +22,7 @@ public class CorpUserIntentionView {
 	private String nickname;
 
 	/**
-	 * 意向 0无意向 1有意向 2很有意向
+	 * 意向 0无回复 1无意向 2.问相关问题 3有意向 4很有意向
 	 */
 	private Integer intention;
 

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/model/views/YhShopUserDistributeOrdersDetailView.java

@@ -43,7 +43,7 @@ public class YhShopUserDistributeOrdersDetailView {
 	@DbField("TRUNCATE(dp.money/100,2)")
 	private BigDecimal reMoney = BigDecimal.ZERO;
 
-	@DbField("if(send_status = 'success',TRUNCATE(dp.money/100,2),0)")
+	@DbField("if(send_status = 'success',TRUNCATE(dp.refund_money/100,2),0)")
 	private BigDecimal rdMoney;
 
 	@DbField("dp.send_status")

+ 12 - 0
netflix-dao/src/main/resources/mapper/OrderDonMapper.xml

@@ -495,4 +495,16 @@
             #{item}
         </foreach>
     </select>
+
+    <select id="getTotalRefundAmountTime" resultType="java.math.BigDecimal">
+        select cast(ifnull(sum(refund_fee),0)/100 as decimal(11,2))
+        from refund_order_don
+        where (refund_method != 'balance' or is_clear_balance = 1)
+        <if test="startDate != null">
+            and created_time >= #{startDate}
+        </if>
+        <if test="endDate != null">
+            and created_time &lt; #{endDate}
+        </if>
+    </select>
 </mapper>

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

@@ -831,6 +831,8 @@ public class RedisService {
         CHATGPT_CAR_SCORES("chatgpt:car:scores","chatGpt 车队分数", 48 * 60 * 60L),
         CHATGPT_CAR_HIGH_CHAT("chatgpt:car:high:chat:","chatGpt gpt4 对话次数", 48 * 60 * 60L),
         CHATGPT_CAR_LOW_CHAT("chatgpt:car:low:chat:","chatGpt 3.5 对话次数", 48 * 60 * 60L),
+        //车票到期前每日通知key
+        TICKET_EXPIRY_NOTIFY_DAY("ticket_expiry_notify_day:%s:%s", "车票到期前每日通知key", 60 * 60 * 24L),
         ;
 
         private String name;

+ 6 - 0
netflix-service/src/main/java/com/cyksj/service/corp/CorpService.java

@@ -3,6 +3,7 @@ package com.cyksj.service.corp;
 import com.cyksj.dto.CorpOauth2UserInfo;
 import com.cyksj.model.entity.CorpCustomerAcquistionCallback;
 import com.cyksj.model.entity.CorpFollow;
+import com.cyksj.model.entity.CorpUserPayIntention;
 import com.cyksj.model.request.corp.Attachments;
 
 /*
@@ -50,4 +51,9 @@ public interface CorpService {
 	 */
 	void upCallbackIntention(CorpCustomerAcquistionCallback corpCustomerAcquistionCallback);
 
+	/**
+	 * 修改用户购买意愿
+	 * @param corpUserPayIntention
+	 */
+	void updateUserIntention(CorpUserPayIntention corpUserPayIntention);
 }

+ 18 - 4
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpServiceImpl.java

@@ -15,11 +15,9 @@ import com.cyksj.config.corp.YHLXWxCorpConfig;
 import com.cyksj.dto.CorpOauth2UserInfo;
 import com.cyksj.mapper.corp.CorpCustomerAcquistionCallbackMapper;
 import com.cyksj.mapper.corp.CorpFollowMapper;
+import com.cyksj.mapper.corp.CorpUserPayIntentionMapper;
 import com.cyksj.model.dto.WxCorpEncryptDto;
-import com.cyksj.model.entity.CorpCustomerAcquistionCallback;
-import com.cyksj.model.entity.CorpFollow;
-import com.cyksj.model.entity.OrderDonPost;
-import com.cyksj.model.entity.WxCorpApp;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.request.corp.Attachments;
 import com.cyksj.model.request.corp.CorpXmlMessage;
 import com.cyksj.model.request.corp.CorpXmlOutMessage;
@@ -36,6 +34,7 @@ import com.cyksj.util.WxCorpUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -80,6 +79,9 @@ public class CorpServiceImpl implements CorpService {
 	@Autowired
 	private CorpCustomerAcquistionCallbackMapper corpCustomerAcquistionCallbackMapper;
 
+	@Autowired
+	private CorpUserPayIntentionMapper corpUserPayIntentionMapper;
+
 	@PostConstruct
 	private void init() {
 		corpMessageRouter = new CorpMessageRouter(this)
@@ -372,4 +374,16 @@ public class CorpServiceImpl implements CorpService {
 	public void upCallbackIntention(CorpCustomerAcquistionCallback corpCustomerAcquistionCallback) {
 		corpCustomerAcquistionCallbackMapper.update(null, Wrappers.lambdaUpdate(CorpCustomerAcquistionCallback.class).eq(CorpCustomerAcquistionCallback::getId, corpCustomerAcquistionCallback.getId()).set(CorpCustomerAcquistionCallback::getIntention, corpCustomerAcquistionCallback.getIntention()));
 	}
+
+	@Override
+	public void updateUserIntention(CorpUserPayIntention corpUserPayIntention) {
+		if (corpUserPayIntention.getId() == null) {
+			try {
+				corpUserPayIntentionMapper.insert(corpUserPayIntention);
+			} catch (DuplicateKeyException e) {
+			}
+			return;
+		}
+		corpUserPayIntentionMapper.updateById(corpUserPayIntention);
+	}
 }

+ 4 - 0
netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java

@@ -1013,6 +1013,10 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 
 	private BackgroundDataView getHeaderData(Date startDate, Date endDate) {
 		BackgroundDataView backgroundDataView = orderDonMapper.getBackgroundDataView(startDate, endDate, Constant.noOrderStatus);
+		if (startDate != null || endDate != null) {
+			BigDecimal totalRefundMoney = orderDonMapper.getTotalRefundAmountTime(startDate, endDate);
+			backgroundDataView.setTotalRefundAmount(totalRefundMoney);
+		}
 		//近5天将要到期的主账号总数
 		DateTime now = DateTime.now();
 		DateTime zero = DateUtil.beginOfDay(now);

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

@@ -2769,6 +2769,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		String outNo = orderRefundService.centerRefund(orderRefundReq, orderDon);
 
 		orderDon.setStatus(OrderDon.Status.refund);
+		orderDon.setRefundMoney(orderRefundReq.getRefundMoney());
 		orderDonMapper.updateById(orderDon);
 
 		clearUserLockingRelation(groupsRelationMapper.selectById(orderDon.getRelationId()), orderDon);

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/relation/GroupRelationFrontService.java

@@ -53,4 +53,6 @@ public interface GroupRelationFrontService {
 	Integer getUserCodeNumBySkuId(Long userId, Long skuId, Boolean isHasVerifyCode);
 
 	List<RenewalView>  getHasPayGoods(long userId);
+
+	List<RenewalView> getExpiryRenewalNotify(Long userId);
 }

+ 48 - 2
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -44,8 +44,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_ALREADY_BE_USER;
 import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_NOT_FIND;
@@ -610,6 +610,52 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		return list;
 	}
 
+	@Override
+	public List<RenewalView> getExpiryRenewalNotify(Long userId) {
+		DateTime now = DateTime.now();
+		DateTime thisZero = DateUtil.beginOfDay(now);
+		String thisDate = thisZero.toDateStr();
+		Object exists = redisService.get(RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getNameFormat(thisDate, userId));
+		if (exists != null) {
+			return null;
+		}
+		User u = userMapper.selectById(userId);
+		if (u == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
+		if (u.getIsBlack()) {
+			redisService.setNx(RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getNameFormat(thisDate, userId), userId, RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getTimeout());
+			return null;
+		}
+		List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, u);
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		SearchResult<RenewalView> list = beanSearcher.search(RenewalView.class, builder
+				.field(RenewalView::getUserId, 0).op(Operator.GreaterThan)
+				.field(RenewalView::getUserId, userIds).op(Operator.InList)
+				.field("condition", String.format("(gr.expiry_time is null or gr.expiry_time > '%s')", now))
+				.field(RenewalView::getStatus, List.of("validity", "overdue", "outside")).op(Operator.InList)
+				.orderBy(RenewalView::getExpiryTime).asc()
+				.build());
+		if (list.getDataList().size() > 5) {
+			redisService.setNx(RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getNameFormat(thisDate, userId), userId, RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getTimeout());
+			return null;
+		}
+		//提前7天
+		AtomicInteger day = new AtomicInteger(7);
+		List<RenewalView> expiryTickets = list.getDataList().stream().filter(ticket -> {
+			Long skuNum = ticket.getSkuNum();
+			Date expiryTime = ticket.getExpiryTime();
+			//年付 提前一个月
+			if (skuNum >= 12) {
+				day.set(30);
+			}
+			if (DateUtil.beginOfDay(expiryTime).compareTo(DateUtil.offsetDay(thisZero, day.get())) <= 0) {
+				return true;
+			}
+			return false;
+		}).collect(Collectors.toList());
+		redisService.setNx(RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getNameFormat(thisDate, userId), userId, RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getTimeout());
+		return expiryTickets;
+	}
+
 	public String getDifferentGoodsCode(Long goodsId, String body, Integer type) {
 		String code = null;
 		//奈飞

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

@@ -753,4 +753,14 @@ public class GroupRelationController {
         cmsOrderDonService.unifiedRefund(refundReq);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
+
+    /**
+     * 每日车票到期弹窗
+     */
+    @GetMapping("/get/expiry/notify")
+    public Result<List<RenewalView>> getExpiryRenewalNotify() {
+        Long userId = StpUserUtil.getLoginIdAsLong();
+        List<RenewalView> expiryRenewals = groupRelationFrontService.getExpiryRenewalNotify(userId);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(expiryRenewals);
+    }
 }

+ 4 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgAuditController.java

@@ -12,7 +12,6 @@ import com.cyksj.service.corp.CorpQyMsgContentService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.operator.InList;
-import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
@@ -54,7 +53,7 @@ public class CorpMsgAuditController {
      * @return
      */
     @GetMapping
-    public Result<SearchResult<CorpMsgAuditUserView>> get(String textKey, String tagId) {
+    public Result<SearchResult<CorpMsgAuditUserView>> get(String textKey, String tagId, Integer intention) {
         Set<String> userIds = new HashSet<>();
         if(StringUtils.isNotBlank(textKey)){
             List<QyMsgContent> text = corpQyMsgContentService.list(Wrappers.lambdaQuery(QyMsgContent.class).select(QyMsgContent::getFrom, QyMsgContent::getExternalUserid,QyMsgContent::getTolist).like(QyMsgContent::getText, textKey).eq(QyMsgContent::getRoomid,"").eq(QyMsgContent::getMsgtype, "text"));
@@ -68,6 +67,9 @@ public class CorpMsgAuditController {
             builder.put("tag", String.format( "and cr.id = t.relation_id and t.tag_id = '%s'", tagId));
             builder.put("tagTable", ",corp_user_tag t");
         }
+        if (intention != null) {
+            builder.put("intention", String.format("and exists (select 1 from corp_user_pay_intention cup where cup.union_id = c.unionid and intention = %s limit 1)", intention));
+        }
         SearchResult<CorpMsgAuditUserView> search = beanSearcher.search(CorpMsgAuditUserView.class, builder.build());
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 

+ 33 - 4
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/WxCorpController.java

@@ -21,10 +21,7 @@ import com.cyksj.mapper.GroupsRelationExpiryRecordMapper;
 import com.cyksj.mapper.corp.CorpUserAuthMapper;
 import com.cyksj.mapper.corp.CorpUserTagMapper;
 import com.cyksj.model.dto.AuthRedirect;
-import com.cyksj.model.entity.CorpCustomerAcquistionCallback;
-import com.cyksj.model.entity.CorpFollow;
-import com.cyksj.model.entity.CorpMsgFollowAssociation;
-import com.cyksj.model.entity.QyMsgContent;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.CorpQyMsgAuditChatView;
 import com.cyksj.model.request.corp.CorpCommonReq;
 import com.cyksj.model.views.CorpUserIntentionView;
@@ -339,6 +336,38 @@ public class WxCorpController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(corpCustomerAcquistionCallback);
 	}
 
+	/**
+	 * 查询用户 购买意愿
+	 */
+	@GetMapping("/get/user/intention")
+	public Result<CorpUserPayIntention> getUserIntention(String externalUserId) {
+		if (StrUtil.isEmpty(externalUserId)) {
+			return GatewayResponse.SUCCESS.newBuilder().toResult();
+		}
+		String unionId = corpUserAuthMapper.getUnionIdByExternalUserId(externalUserId);
+		if (StrUtil.isEmpty(unionId)) {
+			return GatewayResponse.SUCCESS.newBuilder().toResult();
+		}
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap()).field(CorpUserPayIntention::getUnionId, unionId);
+		CorpUserPayIntention corpUserPayIntention = Optional.ofNullable(beanSearcher.searchFirst(CorpUserPayIntention.class, builder.build()))
+				.orElseGet(() -> {
+					CorpUserPayIntention corpUserPayIntention1 = new CorpUserPayIntention();
+					corpUserPayIntention1.setUnionId(unionId);
+					corpUserPayIntention1.setIntention(0);
+					return corpUserPayIntention1;
+				});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(corpUserPayIntention);
+	}
+
+	@PutMapping("/update/user/intention")
+	public Result<CorpUserPayIntention> updateUserIntention(@RequestBody CorpUserPayIntention corpUserPayIntention) {
+		if (corpUserPayIntention.getUnionId() == null || corpUserPayIntention.getIntention() == null) {
+			throw BusinessRuntimeException.getInstance("缺少必填参数.");
+		}
+		corpService.updateUserIntention(corpUserPayIntention);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(corpUserPayIntention);
+	}
+
 	/**
 	 * 主动回传
 	 *

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/shop/YhShopGoodsController.java

@@ -91,7 +91,7 @@ public class YhShopGoodsController {
 				.field(YhShopGoodsView.YhShopGoodsSkuView::getGoodsId, goodsId).build());
 		list.forEach(sku -> {
 			YhShopGoodsRateView.YhShopGoodsSkuRateView yhShopGoodsSkuRateView = beanSearcher.searchFirst(YhShopGoodsRateView.YhShopGoodsSkuRateView.class, MapUtils.builder().field(YhShopGoodsRateView.YhShopGoodsSkuRateView::getSkuId, sku.getSkuId()).build());
-			if (sku.getPrice().compareTo(yhShopGoodsSkuRateView.getMaxPrice()) > 0 || sku.getPrice().compareTo(yhShopGoodsSkuRateView.getMinPrice()) < 0) {
+			if (sku.getShopSkuPrice().compareTo(yhShopGoodsSkuRateView.getMaxPrice()) > 0 || sku.getShopSkuPrice().compareTo(yhShopGoodsSkuRateView.getMinPrice()) < 0) {
 				throw BusinessRuntimeException.getInstance("价格不能超出区间范围");
 			}
 		});