浏览代码

渠道管理

chenbiao 3 年之前
父节点
当前提交
2028394d4c
共有 32 个文件被更改,包括 975 次插入43 次删除
  1. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/channel/ChannelMapper.java
  2. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/channel/ChannelPopularizeMapper.java
  3. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/channel/ChannelPopularizeVisitMapper.java
  4. 16 0
      netflix-dao/src/main/java/com/cyksj/mapper/channel/ShopConfigMapper.java
  5. 38 0
      netflix-dao/src/main/java/com/cyksj/model/entity/Channel.java
  6. 39 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ChannelPopularize.java
  7. 16 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ChannelPopularizeVisit.java
  8. 10 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  9. 58 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ShopConfig.java
  10. 12 1
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonView.java
  11. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java
  12. 62 0
      netflix-dao/src/main/java/com/cyksj/model/views/ChannelPopularizeDetailView.java
  13. 103 0
      netflix-dao/src/main/java/com/cyksj/model/views/ChannelPopularizeView.java
  14. 91 0
      netflix-dao/src/main/java/com/cyksj/model/views/ChannelView.java
  15. 18 0
      netflix-dao/src/main/resources/mapper/ShopConfigMapper.xml
  16. 5 7
      netflix-service/src/main/java/com/cyksj/common/AliPayCommon.java
  17. 11 0
      netflix-service/src/main/java/com/cyksj/service/mange/channel/ChannelPopularizeService.java
  18. 11 0
      netflix-service/src/main/java/com/cyksj/service/mange/channel/ChannelService.java
  19. 22 0
      netflix-service/src/main/java/com/cyksj/service/mange/channel/impl/ChannelPopularizeServiceImpl.java
  20. 19 0
      netflix-service/src/main/java/com/cyksj/service/mange/channel/impl/ChannelServiceImpl.java
  21. 11 0
      netflix-service/src/main/java/com/cyksj/service/mange/shop/ShopConfigService.java
  22. 19 0
      netflix-service/src/main/java/com/cyksj/service/mange/shop/impl/ShopConfigServiceImpl.java
  23. 52 12
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  24. 2 0
      netflix-service/src/main/java/com/cyksj/service/register/impl/RegisterOrderDonServiceImpl.java
  25. 2 2
      netflix-service/src/main/java/com/cyksj/service/wechat/WeChatService.java
  26. 43 21
      netflix-service/src/main/java/com/cyksj/service/wechat/impl/WeChatServiceImpl.java
  27. 40 0
      netflix-web/src/main/java/com/cyksj/web/controller/channel/ChannelController.java
  28. 74 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/channel/CmsChannelController.java
  29. 92 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/channel/CmsChannelPopularizeController.java
  30. 66 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/shop/ShopConfigController.java
  31. 0 0
      netflix-web/src/main/resources/application-dev.yml
  32. 5 0
      netflix-web/src/main/resources/config/logback-debug.xml

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/channel/ChannelMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper.channel;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.Channel;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:28 PM
+ */
+public interface ChannelMapper extends BaseMapper<Channel> {
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/channel/ChannelPopularizeMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper.channel;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.ChannelPopularize;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:29 PM
+ */
+public interface ChannelPopularizeMapper extends BaseMapper<ChannelPopularize> {
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/channel/ChannelPopularizeVisitMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper.channel;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.ChannelPopularizeVisit;
+
+/**
+ * @author chan
+ * @date 2022/12/13 5:28 PM
+ */
+public interface ChannelPopularizeVisitMapper extends BaseMapper<ChannelPopularizeVisit> {
+}

+ 16 - 0
netflix-dao/src/main/java/com/cyksj/mapper/channel/ShopConfigMapper.java

@@ -0,0 +1,16 @@
+package com.cyksj.mapper.channel;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.ShopConfig;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:25 PM
+ */
+public interface ShopConfigMapper extends BaseMapper<ShopConfig> {
+
+   ShopConfig getByChannelPopularizeId(@Param("popularizeId") Long popularizeId, @Param("type") String type);
+
+   ShopConfig getByAppId(String appId);
+}

+ 38 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/Channel.java

@@ -0,0 +1,38 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:26 PM
+ */
+@Getter
+@Setter
+public class Channel extends BaseEntity{
+
+    /**
+     * 渠道名称
+     */
+    private String name;
+
+    /**
+     * 微信商户
+     */
+    private String wxShopId;
+
+    /**
+     * 支付宝商户
+     */
+    private String zfbShopId;
+
+    /**
+     * 域名
+     */
+    private String host;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 39 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ChannelPopularize.java

@@ -0,0 +1,39 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:27 PM
+ */
+@Getter
+@Setter
+public class ChannelPopularize extends BaseEntity{
+
+    /**
+     * 渠道id
+     */
+    private Long channelId;
+
+    /**
+     * 链接名称
+     */
+    private String name;
+
+    /**
+     * url
+     */
+    private String url;
+
+    /**
+     * 样式
+     */
+    private String modality;
+
+    /**
+     * 支付方式
+     */
+    private String payMethod;
+
+}

+ 16 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ChannelPopularizeVisit.java

@@ -0,0 +1,16 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author chan
+ * @date 2022/12/13 5:26 PM
+ */
+@Getter
+@Setter
+public class ChannelPopularizeVisit extends BaseEntity{
+
+    private Long popularizeId;
+
+}

+ 10 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -101,6 +101,16 @@ public class OrderDon extends BaseEntity implements Serializable {
      */
     private Boolean isFixedDistribute;
 
+    /**
+     * 商户id
+     */
+    private String shopId;
+
+    /**
+     * 渠道链接id
+     */
+    private Long popularizeId;
+
     public enum Status {
         /**
          * 订单状态

+ 58 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ShopConfig.java

@@ -0,0 +1,58 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:07 PM
+ */
+@Getter
+@Setter
+public class ShopConfig extends BaseEntity{
+
+    public static final String ZFB_DEFAULT_APP_ID = "2021003159660212";
+
+    public static final String WX_DEFAULT_APP_ID = "1634772026";
+
+    /**
+     * shopid,appid
+     */
+    private String appId;
+
+    /**
+     * 商户类型 wx zfb
+     */
+    private String type;
+
+    /**
+     * 密钥
+     */
+    private String secret;
+
+    /**
+     * 应用私钥
+     */
+    private String appPrivateKey;
+
+    /**
+     * 应用公钥
+     */
+    private String appPublicKey;
+
+    /**
+     * 支付宝公钥
+     */
+    private String publicKey;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    @DbIgnore
+    @TableField(exist = false)
+    private Integer channelCount;
+}

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

@@ -21,13 +21,21 @@ import java.util.Date;
 @SearchBean(tables = "order_don o left join goods_don_sku sku on o.sku_id = sku.id " +
         "left join goods_don g on g.id = sku.goods_id " +
         "left join user u on o.user_id = u.id " +
-        "left join groups_relation gr on gr.id = o.relation_id "
+        "left join groups_relation gr on gr.id = o.relation_id " +
+        "left join channel_popularize cp on o.popularize_id = cp.id " +
+        "left join channel c on c.id = cp.channel_id "
 )
 public class OrderDonView {
 
     @DbField("o.id")
     private Long id;
 
+    @DbField("c.id")
+    private Long channelId;
+
+    @DbField("c.name")
+    private String channel;
+
     @DbField("o.relation_id")
     private Long relationId;
 
@@ -85,6 +93,9 @@ public class OrderDonView {
     @DbField("o.coupon_money")
     private BigDecimal couponMoney;
 
+    @DbField("cp.id")
+    private Long popularizeId;
+
     @DbIgnore
     private OrderDonWaybill waybill;
 

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java

@@ -66,4 +66,9 @@ public class OrderPayRequest {
      * 优惠券兑换码
      */
     private String couponExCode;
+
+    /**
+     * 渠道链接id
+     */
+    private Long popularizeId;
 }

+ 62 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ChannelPopularizeDetailView.java

@@ -0,0 +1,62 @@
+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;
+import java.util.List;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:54 PM
+ */
+@Getter
+@Setter
+@SearchBean(tables = "order_don o " +
+        " left join goods_don g on g.id = o.goods_id " +
+        " left join order_don o1 on o1.`status` != 'close' and o.id = o1.id " +
+        " left join order_don o2 on o2.`status` = 'refund' and o.id = o2.id "
+        ,where = ":time: "
+        ,distinct = true
+        ,groupBy = "o.goods_id,o.popularize_id"
+)
+public class ChannelPopularizeDetailView {
+
+    @DbField("o.popularize_id")
+    private Long popularizeId;
+    /**
+     * 平台名称
+     */
+    @DbField("g.title")
+    private String goodsName;
+
+    /**
+     * 订单数
+     */
+    @DbField("count(o1.id)")
+    private Integer orderCount;
+
+    /**
+     * 订单金额
+     */
+    @DbField("IFNULL(sum(o1.money),0)")
+    private BigDecimal orderMoney;
+
+    /**
+     * 退款数
+     */
+    @DbField("count(o2.id)")
+    private Integer refundCount;
+
+    /**
+     * 退款金额
+     */
+    @DbField("IFNULL(sum(o2.money),0)")
+    private BigDecimal refundMoney;
+
+
+}

+ 103 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ChannelPopularizeView.java

@@ -0,0 +1,103 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:54 PM
+ */
+@Getter
+@Setter
+@SearchBean(tables = "channel_popularize cp " +
+        " LEFT JOIN order_don o on cp.id = o.popularize_id :time: " +
+        " LEFT JOIN order_don o1 on o.id = o1.id and o1.`status` != 'close' " +
+        " LEFT JOIN order_don o2 on o.id = o2.id and o2.`status` = 'refund' " +
+        " LEFT JOIN channel c on c.id = cp.channel_id "
+        ,distinct = true
+        ,groupBy = "cp.id,cp.name,cp.url,cp.modality,cp.pay_method,cp.created_time,cp.update_time"
+)
+public class ChannelPopularizeView {
+
+    @DbField("cp.id")
+    private Long id;
+
+    /**
+     * 渠道id
+     */
+    @DbField("cp.channel_id")
+    private Long channelId;
+
+    /**
+     * 渠道名称
+     */
+    @DbField("c.name")
+    private String channelName;
+
+    /**
+     * 链接名称
+     */
+    @DbField("cp.name")
+    private String name;
+
+    /**
+     * url
+     */
+    @DbField("cp.url")
+    private String url;
+
+    /**
+     * 样式
+     */
+    @DbField("cp.modality")
+    private String modality;
+
+    /**
+     * 支付方式
+     */
+    @DbField("cp.pay_method")
+    private String payMethod;
+
+    /**
+     * 浏览数
+     */
+    @DbField("select count(v.id) from channel_popularize_visit v where v.popularize_id = cp.id ")
+    private Integer visit;
+
+    /**
+     * 订单数
+     */
+    @DbField("count(o1.id)")
+    private Integer orderCount;
+
+    /**
+     * 订单金额
+     */
+    @DbField("IFNULL(sum(o1.money),0)")
+    private BigDecimal orderMoney;
+
+    /**
+     * 退款订单数
+     */
+    @DbField("count(o2.id)")
+    private Integer refundCount;
+
+    /**
+     * 退款金额
+     */
+    @DbField("IFNULL(sum(o2.money),0)")
+    private BigDecimal refundMoney;
+
+    @DbField("cp.created_time")
+    private Date createdTime;
+
+    @DbField("cp.update_time")
+    private Date updateTime;
+
+
+}

+ 91 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ChannelView.java

@@ -0,0 +1,91 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:54 PM
+ */
+@Getter
+@Setter
+@SearchBean(tables = "channel c " +
+        " LEFT JOIN channel_popularize cp on c.id = cp.channel_id " +
+        " LEFT JOIN order_don o on cp.id = o.popularize_id :time: " +
+        " LEFT JOIN order_don o1 on o.id = o1.id and o1.`status` != 'close' " +
+        " LEFT JOIN order_don o2 on o.id = o2.id and o2.`status` = 'refund' "
+        ,groupBy = " c.id,c.`name`,c.wx_shop_id,c.host,c.zfb_shop_id,c.created_time,c.update_time"
+        ,distinct = true
+)
+public class ChannelView {
+
+    @DbField("c.id")
+    private Long id;
+
+    @DbField("c.name")
+    private String name;
+
+    /**
+     * 域名
+     */
+    @DbField("c.host")
+    private String host;
+
+    /**
+     * 链接数
+     */
+    @DbField("count(DISTINCT(cp.id))")
+    private Integer popularizeCount;
+
+    @DbField("c.wx_shop_id")
+    private String wxShopId;
+
+    @DbField("c.zfb_shop_id")
+    private String zfbShopId;
+
+    /**
+     * 浏览数
+     */
+    @DbField("select count(v.id) from channel_popularize_visit v,channel_popularize cp  where v.popularize_id = cp.id and cp.id = c.id ")
+    private Integer visit;
+
+    /**
+     * 订单数
+     */
+    @DbField("count(o1.id)")
+    private Integer orderCount;
+
+    /**
+     * 订单金额
+     */
+    @DbField("IFNULL(sum(o1.money),0)")
+    private BigDecimal orderMoney;
+
+    /**
+     * 退款订单数
+     */
+    @DbField("count(o2.id)")
+    private Integer refundCount;
+
+    /**
+     * 退款金额
+     */
+    @DbField("IFNULL(sum(o2.money),0)")
+    private BigDecimal refundMoney;
+
+    @DbField("c.remark")
+    private String remark;
+
+
+    @DbField("c.created_time")
+    private Date createdTime;
+
+    @DbField("c.update_time")
+    private Date updateTime;
+
+}

+ 18 - 0
netflix-dao/src/main/resources/mapper/ShopConfigMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cyksj.mapper.channel.ShopConfigMapper">
+    <select id="getByChannelPopularizeId" resultType="com.cyksj.model.entity.ShopConfig">
+        select sc.*
+        from shop_config sc,
+             channel c,
+             channel_popularize cp
+        where (sc.app_id = c.wx_shop_id or sc.app_id = c.zfb_shop_id)
+          and c.id = cp.channel_id
+          and cp.id = #{popularizeId,jdbcType=BIGINT}
+          and sc.type = #{type,jdbcType=VARCHAR}
+    </select>
+    <select id="getByAppId" resultType="com.cyksj.model.entity.ShopConfig">
+        select * from shop_config where app_id = #{appId}
+    </select>
+</mapper>

+ 5 - 7
netflix-service/src/main/java/com/cyksj/common/AliPayCommon.java

@@ -6,6 +6,7 @@ import com.alipay.api.AlipayConfig;
 import com.alipay.api.DefaultAlipayClient;
 import com.cyksj.config.zfb.BaseZfbConfig;
 import com.cyksj.config.zfb.ZfbConfig;
+import com.cyksj.model.entity.ShopConfig;
 
 /*
  *项目名: netflix
@@ -17,20 +18,17 @@ public class AliPayCommon {
 
 	/**
 	 * 获取ALI支付客户端
-	 * @param zfbConfig
-	 * @return
-	 * @throws AlipayApiException
 	 */
-	public static AlipayClient getAlipayClient(ZfbConfig zfbConfig) throws AlipayApiException {
+	public static AlipayClient getAlipayClient(ShopConfig config) throws AlipayApiException {
 		AlipayConfig alipayConfig = new AlipayConfig();
 		//网关地址
 		alipayConfig.setServerUrl(BaseZfbConfig.url);
-		alipayConfig.setAppId(zfbConfig.getAppId());
-		alipayConfig.setPrivateKey(zfbConfig.getPrivateKey());
+		alipayConfig.setAppId(config.getAppId());
+		alipayConfig.setPrivateKey(config.getAppPrivateKey());
 		alipayConfig.setFormat(BaseZfbConfig.format);
 		alipayConfig.setCharset(BaseZfbConfig.charset);
 		alipayConfig.setSignType(BaseZfbConfig.signType);
-		alipayConfig.setAlipayPublicKey(zfbConfig.getAlipayPublicKey());
+		alipayConfig.setAlipayPublicKey(config.getPublicKey());
 		AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
 		return alipayClient;
 	}

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/mange/channel/ChannelPopularizeService.java

@@ -0,0 +1,11 @@
+package com.cyksj.service.mange.channel;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.ChannelPopularize;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:30 PM
+ */
+public interface ChannelPopularizeService extends IService<ChannelPopularize> {
+}

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/mange/channel/ChannelService.java

@@ -0,0 +1,11 @@
+package com.cyksj.service.mange.channel;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.Channel;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:30 PM
+ */
+public interface ChannelService extends IService<Channel> {
+}

+ 22 - 0
netflix-service/src/main/java/com/cyksj/service/mange/channel/impl/ChannelPopularizeServiceImpl.java

@@ -0,0 +1,22 @@
+package com.cyksj.service.mange.channel.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.channel.ChannelMapper;
+import com.cyksj.mapper.channel.ChannelPopularizeMapper;
+import com.cyksj.model.entity.Channel;
+import com.cyksj.model.entity.ChannelPopularize;
+import com.cyksj.service.mange.channel.ChannelPopularizeService;
+import com.cyksj.service.mange.channel.ChannelService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:31 PM
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class ChannelPopularizeServiceImpl extends ServiceImpl<ChannelPopularizeMapper, ChannelPopularize> implements ChannelPopularizeService {
+}

+ 19 - 0
netflix-service/src/main/java/com/cyksj/service/mange/channel/impl/ChannelServiceImpl.java

@@ -0,0 +1,19 @@
+package com.cyksj.service.mange.channel.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.channel.ChannelMapper;
+import com.cyksj.model.entity.Channel;
+import com.cyksj.service.mange.channel.ChannelService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:31 PM
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> implements ChannelService  {
+}

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/mange/shop/ShopConfigService.java

@@ -0,0 +1,11 @@
+package com.cyksj.service.mange.shop;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.ShopConfig;
+
+/**
+ * @author chan
+ * @date 2022/12/13 4:54 PM
+ */
+public interface ShopConfigService extends IService<ShopConfig> {
+}

+ 19 - 0
netflix-service/src/main/java/com/cyksj/service/mange/shop/impl/ShopConfigServiceImpl.java

@@ -0,0 +1,19 @@
+package com.cyksj.service.mange.shop.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.channel.ShopConfigMapper;
+import com.cyksj.model.entity.ShopConfig;
+import com.cyksj.service.mange.shop.ShopConfigService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author chan
+ * @date 2022/12/13 4:55 PM
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class ShopConfigServiceImpl extends ServiceImpl<ShopConfigMapper, ShopConfig> implements ShopConfigService {
+}

+ 52 - 12
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -34,6 +34,7 @@ import com.cyksj.dto.RedisKey;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.*;
+import com.cyksj.mapper.channel.ShopConfigMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
 import com.cyksj.mapper.manage.coupon.CouponUserMapper;
@@ -144,6 +145,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final CouponSkuMapper couponSkuMapper;
 
+	private final ShopConfigMapper shopConfigMapper;
+
 	@Transactional(rollbackFor = Throwable.class)
 	@Override
 	public OrderDon submit(OrderPayRequest payRequest) throws Exception {
@@ -217,6 +220,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		orderDon.setMoney(payRequest.getDonMoney());
 		orderDon.setRealMoney(payRequest.getDonMoney());
+
+		//渠道链接id
+		if(payRequest.getPopularizeId() != null){
+			orderDon.setPopularizeId(payRequest.getPopularizeId());
+		}
 		//存在优惠券
 		if (couponUser != null) {
 			Long couponId = couponUser.getCouponId();
@@ -294,9 +302,17 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 		String toWechatAttach = Codec.DoBase64.custom()
 				.setData(Jsons.toJson(attach)).encodeAsText();
+		String shopId = ShopConfig.WX_DEFAULT_APP_ID;
 
+		ShopConfig shopConfig = shopConfigMapper.getByChannelPopularizeId(orderDon.getPopularizeId(),"wx");
+		if (shopConfig != null) {
+			shopId = shopConfig.getAppId();
+		}
+		orderDon.setShopId(shopId);
+		this.updateById(orderDon);
 		H5JsPayParams params = weChatService.getJsPayParams(
 				weChatConfig.getAppid(),
+				shopId,
 				orderDon.getOpenId(),
 				orderDon.getMoney().intValue(),
 				orderDon.getOrderNo(),
@@ -322,8 +338,18 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		String toWechatAttach = Codec.DoBase64.custom()
 				.setData(Jsons.toJson(attach)).encodeAsText();
 
+		String shopId = ShopConfig.WX_DEFAULT_APP_ID;
+
+		ShopConfig shopConfig = shopConfigMapper.getByChannelPopularizeId(orderDon.getPopularizeId(),"wx");
+		if (shopConfig != null) {
+			shopId = shopConfig.getAppId();
+		}
+		orderDon.setShopId(shopId);
+		this.updateById(orderDon);
+
 		H5JsPayParams params = weChatService.getJsPayParams(
 				weChatConfig.getAppid(),
+				shopId,
 				orderDon.getOpenId(),
 				orderDon.getMoney().intValue(),
 				orderDon.getOrderNo(),
@@ -360,7 +386,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 
 		// 校验签名
-		boolean f = weChatService.checkSignWithMd5(map, weChatConfig.getShopKey());
+		boolean f = weChatService.checkSignWithMd5(map, shopConfigMapper.getByAppId(order.getShopId()).getSecret());
 		if (!f) {
 			log.error("回调数据:{}", map);
 			throw BusinessRuntimeException.getInstance("支付成功回调, 校验签名失败.");
@@ -621,20 +647,23 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	@Override
 	public AliPayParams aliPay(Long orderId, String productCode) throws Exception {
-		return commonAliPay(orderId, productCode, ZfbConfig.YHLX_ZfB);
+		OrderDon orderDon = getById(orderId);
+		String appId = null;
+		if (orderDon.getPopularizeId() != null) {
+			ShopConfig shopConfig = shopConfigMapper.getByChannelPopularizeId(orderDon.getPopularizeId(),"zfb");
+			if (shopConfig != null) {
+				appId = shopConfig.getAppId();
+			}
+		}
+		orderDon.setShopId(appId);
+		this.updateById(orderDon);
+		return commonAliPay(orderId, productCode, appId);
 	}
 
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void aliPayNotify(Map<String, String> params) throws Exception {
 		//调用SDK验证签名
-		boolean signVerified = AlipaySignature.rsaCheckV1(params, ZfbConfig.YHLX_ZfB.getAlipayPublicKey(), BaseZfbConfig.charset, BaseZfbConfig.signType);
-		if (!signVerified) {
-			log.error("支付宝回调校验签名错误,自定义入参:{}", params.get("body"));
-			throw BusinessRuntimeException.getInstance("支付宝回调校验签名错误");
-		}
-		String transactionId = params.get("trade_no");
-		String payTimeStr = params.get("gmt_payment");
 		String body = Codec.DoBase64.custom().setData(params.get("body")).decodeAsText();
 		OrderAttach orderAttach = Jsons.parseObject(body, OrderAttach.class);
 		Long oderId = orderAttach.getO();
@@ -642,6 +671,14 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (null == orderDon) {
 			throw BusinessRuntimeException.getInstance("订单不存在.");
 		}
+		boolean signVerified = AlipaySignature.rsaCheckV1(params,shopConfigMapper.getByAppId((orderDon.getShopId())).getPublicKey(), BaseZfbConfig.charset, BaseZfbConfig.signType);
+		if (!signVerified) {
+			log.error("支付宝回调校验签名错误,自定义入参:{}", params.get("body"));
+			throw BusinessRuntimeException.getInstance("支付宝回调校验签名错误");
+		}
+		String transactionId = params.get("trade_no");
+		String payTimeStr = params.get("gmt_payment");
+
 		if (orderDon.getStatus().equals(OrderDon.Status.hasPayment)) {
 			log.info("支付宝已回调,重复修改状态 id:{}", orderDon.getId());
 			return;
@@ -698,6 +735,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					.setStringData(time + String.valueOf(orderDon.getId()))
 					.toHexString();
 			weChatService.refundWxOrder(weChatConfig.getAppid(),
+					Optional.ofNullable(orderDon.getShopId()).orElse(ShopConfig.WX_DEFAULT_APP_ID),
 					orderDon.getTransactionId(),
 					outRefundNo,
 					orderDon.getMoney(),
@@ -753,7 +791,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		String outRefundNo = "";
 		if (OrderDon.Type.EX_CODE != orderDon.getType()) {
 			//支付宝退款
-			AlipayClient alipayClient = AliPayCommon.getAlipayClient(ZfbConfig.YHLX_ZfB);
+			AlipayClient alipayClient = AliPayCommon.getAlipayClient(shopConfigMapper.getByAppId(Optional.ofNullable(orderDon.getShopId()).orElse(ShopConfig.ZFB_DEFAULT_APP_ID)));
 			AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
 			AlipayTradeRefundModel model = new AlipayTradeRefundModel();
 			//支付宝交易号
@@ -968,8 +1006,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDonTransportMapper.insert(transport);
 	}
 
-	public AliPayParams commonAliPay(Long orderId, String productCode, ZfbConfig zfbConfig) throws Exception {
-		AlipayClient alipayClient = AliPayCommon.getAlipayClient(zfbConfig);
+	public AliPayParams commonAliPay(Long orderId, String productCode, String appId) throws Exception {
+		ShopConfig shopConfig = shopConfigMapper.getByAppId(Optional.ofNullable(appId).orElse(ShopConfig.ZFB_DEFAULT_APP_ID));
+
+		AlipayClient alipayClient = AliPayCommon.getAlipayClient(shopConfig);
 		// 创建API对应的request
 		AlipayRequest alipayRequest = getAliAayRequest(orderId, productCode);
 		if (alipayRequest == null) {

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/register/impl/RegisterOrderDonServiceImpl.java

@@ -183,6 +183,7 @@ public class RegisterOrderDonServiceImpl extends ServiceImpl<RegisterOrderDonMap
 
         H5JsPayParams params = weChatService.getJsPayParams(
                 weChatConfig.getAppid(),
+                ShopConfig.WX_DEFAULT_APP_ID,
                 orderDon.getOpenId(),
                 orderDon.getMoney().intValue(),
                 orderDon.getOrderNo(),
@@ -275,6 +276,7 @@ public class RegisterOrderDonServiceImpl extends ServiceImpl<RegisterOrderDonMap
                 .toHexString();
         wxOrderRefundReq.setRefundMoney(registerOrderDon.getMoney());
         weChatService.refundWxOrder(weChatConfig.getAppid(),
+                ShopConfig.WX_DEFAULT_APP_ID,
                 registerOrderDon.getTransactionId(),
                 outRefundNo,
                 registerOrderDon.getMoney(),

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/wechat/WeChatService.java

@@ -43,7 +43,7 @@ public interface WeChatService {
      * /@param attach     传入订单id 在查询API和支付通知中原样返回 用于处理订单
      * @return h5调用微信js-sdk必要的参数
      */
-    H5JsPayParams getJsPayParams(String appid, String openid, Integer totalFee, String outTradeNo, String notifyUrl, String attach, String body, String tradeType, Date ExpiryTime) throws Exception;
+    H5JsPayParams getJsPayParams(String appid, String shopId,String openid, Integer totalFee, String outTradeNo, String notifyUrl, String attach, String body, String tradeType, Date ExpiryTime) throws Exception;
 
 
     /* 微信签名算法 */
@@ -70,5 +70,5 @@ public interface WeChatService {
      * @param totalFee  订单金额 单位为分,只能为整数
      * @param refundMoney  退款金额
      */
-    void refundWxOrder(String appId, String transactionId, String outRefundNo, BigDecimal totalFee, BigDecimal refundMoney, String notifyUrl) throws Exception;
+    void refundWxOrder(String appId, String shopId, String transactionId, String outRefundNo, BigDecimal totalFee, BigDecimal refundMoney, String notifyUrl) throws Exception;
 }

+ 43 - 21
netflix-service/src/main/java/com/cyksj/service/wechat/impl/WeChatServiceImpl.java

@@ -1,7 +1,10 @@
 package com.cyksj.service.wechat.impl;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.http.ssl.SSLSocketFactoryBuilder;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.*;
 import com.cyksj.config.BaseWeChatConfig;
@@ -9,7 +12,9 @@ import com.cyksj.config.WeChatConfig;
 import com.cyksj.config.WeChatFactory;
 import com.cyksj.enums.WeChatAuthRedirectUrl;
 import com.cyksj.mapper.WxAppMapper;
+import com.cyksj.mapper.channel.ShopConfigMapper;
 import com.cyksj.model.dto.*;
+import com.cyksj.model.entity.ShopConfig;
 import com.cyksj.model.entity.WxApp;
 import com.cyksj.service.wechat.WeChatService;
 import com.cyksj.service.wechat.WxMpAccountOps;
@@ -21,10 +26,15 @@ import org.springframework.stereotype.Service;
 
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
+import javax.net.ssl.KeyManagerFactory;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.net.http.HttpRequest;
 import java.net.http.HttpResponse;
+import java.security.KeyStore;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.Map;
@@ -48,6 +58,7 @@ public class WeChatServiceImpl implements WeChatService {
 
     private final WxAppMapper wxAppMapper;
 
+    private final ShopConfigMapper shopConfigMapper;
 
     @Override
     public String createUrl(String state, String redirectUrl) {
@@ -184,16 +195,16 @@ public class WeChatServiceImpl implements WeChatService {
 
 
     @Override
-    public H5JsPayParams getJsPayParams(String appid, String openid, Integer totalFee, String outTradeNo, String notifyUrl, String attach, String body, String tradeType, Date expireTime) throws Exception {
+    public H5JsPayParams getJsPayParams(String appid, String shopId, String openid, Integer totalFee, String outTradeNo, String notifyUrl, String attach, String body, String tradeType, Date expireTime) throws Exception {
         log.info("------------------- 调用微信h5支付 开始 -------------------");
-        BaseWeChatConfig weChatConfigStrategy = WeChatFactory.getWeChatConfigStrategy(appid);
+        ShopConfig shopConfig = shopConfigMapper.selectOne(Wrappers.lambdaQuery(ShopConfig.class).eq(ShopConfig::getAppId, shopId).last(" limit 1"));
 
         // 拼接统一下单实体类
         UnifiedOrder order = new UnifiedOrder()
                 .setAppid(appid)
                 .setAttach(attach)
                 .setBody(body)
-                .setMchId(weChatConfigStrategy.getShopid())
+                .setMchId(shopConfig.getAppId())
                 .setNonceStr("chan.123")
                 .setNotifyUrl(notifyUrl)
                 .setOutTradeNo(outTradeNo)
@@ -209,7 +220,7 @@ public class WeChatServiceImpl implements WeChatService {
         }
         String sign = Codec.DoDigest.custom()
                 .setAlgorithm(Codec.DoDigest.Algorithm.MD5)
-                .setStringData(order.getPrintln(tradeType, weChatConfigStrategy.getShopKey()))
+                .setStringData(order.getPrintln(tradeType, shopConfig.getSecret()))
                 .toHexString()
                 .toUpperCase();
         order.setSign(sign);
@@ -244,7 +255,7 @@ public class WeChatServiceImpl implements WeChatService {
         }
 
         // 校验签名
-        boolean f = this.checkSignWithMd5(wxResult,weChatConfigStrategy.getShopKey());
+        boolean f = this.checkSignWithMd5(wxResult,shopConfig.getSecret());
 
         if (!f) {
             throw BusinessRuntimeException.getInstance("调用微信h5支付, 微信返回值的签名验证失败.");
@@ -259,7 +270,7 @@ public class WeChatServiceImpl implements WeChatService {
 
         sign = Codec.DoDigest.custom()
                 .setAlgorithm(Codec.DoDigest.Algorithm.MD5)
-                .setStringData(params.println(weChatConfigStrategy.getShopKey()))
+                .setStringData(params.println(shopConfig.getSecret()))
                 .toHexString()
                 .toUpperCase();
         params.setPaySign(sign);
@@ -394,13 +405,15 @@ public class WeChatServiceImpl implements WeChatService {
         log.info("发送模板消息结束,返回值:{}", send != null ? send.body() : null);
     }
 
+
     @Override
-    public void refundWxOrder(String appId, String transactionId, String outRefundNo, BigDecimal totalFee, BigDecimal refundMoney, String notifyUrl) throws Exception {
-        BaseWeChatConfig weChatConfigStrategy = WeChatFactory.getWeChatConfigStrategy(appId);
+    public void refundWxOrder(String appId,String shopId, String transactionId, String outRefundNo, BigDecimal totalFee, BigDecimal refundMoney, String notifyUrl) throws Exception {
+        ShopConfig shopConfig = shopConfigMapper.selectOne(Wrappers.lambdaQuery(ShopConfig.class).eq(ShopConfig::getAppId, shopId).last(" limit 1"));
+
         WxRefundOrder wxRefundOrder = new WxRefundOrder();
         wxRefundOrder.setAppid(appId);
         //商户号
-        wxRefundOrder.setMchId(weChatConfigStrategy.getShopid());
+        wxRefundOrder.setMchId(shopConfig.getAppId());
         wxRefundOrder.setOutRefundNo(outRefundNo);
         wxRefundOrder.setNonceStr("chan123");
         wxRefundOrder.setTotalFee(totalFee.intValue());
@@ -411,23 +424,32 @@ public class WeChatServiceImpl implements WeChatService {
         wxRefundOrder.setNotifyUrl(notifyUrl);
         String sign = Codec.DoDigest.custom()
                 .setAlgorithm(Codec.DoDigest.Algorithm.MD5)
-                .setStringData(wxRefundOrder.println(weChatConfigStrategy.getShopKey()))
+                .setStringData(wxRefundOrder.println(shopConfig.getSecret()))
                 .toHexString()
                 .toUpperCase();
         wxRefundOrder.setSign(sign);
 
         String xml = Xmls.toXml(wxRefundOrder);
-        HttpResponse<byte[]> res = J11HttpC.custom()
-                .ofPost()
-                .url("https://api.mch.weixin.qq.com/secapi/pay/refund")
-                .headers(J11HttpC.ReqType.raw_xml)
-                .cacheURI()
-                .body(HttpRequest.BodyPublishers.ofString(xml, IoKit.Charsets.UTF_8.getCharset()))
-                // 指定携带ssl证书的httpClient 进行请求
-                .send(J11HttpC.Client.WX_REFUND, HttpResponse.BodyHandlers.ofByteArray());
 
-        if (200 != res.statusCode()) {
-            throw BusinessRuntimeException.getInstance("请求wx_refund失败: " + IoKit.toString(res.body()));
+        KeyStore keyStore = KeyStore.getInstance("PKCS12");
+        File file = new File("cert/" + shopId + ".p12");
+        InputStream inputStream = new FileInputStream(file);
+        keyStore.load(inputStream, shopId.toCharArray());
+        // 初始化密钥库
+        KeyManagerFactory factory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+        factory.init(keyStore, shopId.toCharArray());
+        cn.hutool.http.HttpRequest request = cn.hutool.http.HttpRequest.post("https://api.mch.weixin.qq.com/secapi/pay/refund")
+                // 自定义返回编码
+                .charset(CharsetUtil.CHARSET_UTF_8)
+                // 禁用缓存
+                .disableCache()
+                .setSSLSocketFactory(SSLSocketFactoryBuilder.create()
+                        .setKeyManagers(factory.getKeyManagers())
+                        .setProtocol(SSLSocketFactoryBuilder.TLSv1).build());
+        cn.hutool.http.HttpResponse res = request.body(xml).execute();
+
+        if (200 != res.getStatus()) {
+            throw BusinessRuntimeException.getInstance("请求wx_refund失败: " + res.body());
         }
 
         Map<String, String> wxRefund = Xmls.toMap(res.body());
@@ -441,7 +463,7 @@ public class WeChatServiceImpl implements WeChatService {
         }
 
         // 校验签名
-        boolean f = this.checkSignWithMd5(wxRefund, weChatConfigStrategy.getShopKey());
+        boolean f = this.checkSignWithMd5(wxRefund, shopConfig.getSecret());
         if (!f) {
             throw BusinessRuntimeException.getInstance("调用微信h5申请退款, 微信返回值的签名验证失败.");
         }

+ 40 - 0
netflix-web/src/main/java/com/cyksj/web/controller/channel/ChannelController.java

@@ -0,0 +1,40 @@
+package com.cyksj.web.controller.channel;
+
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.channel.ChannelPopularizeMapper;
+import com.cyksj.mapper.channel.ChannelPopularizeVisitMapper;
+import com.cyksj.model.entity.ChannelPopularize;
+import com.cyksj.model.entity.ChannelPopularizeVisit;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:36 PM
+ */
+@RequestMapping("/applets/channel")
+@RestController
+@RequiredArgsConstructor
+public class ChannelController {
+
+    private final ChannelPopularizeVisitMapper channelPopularizeVisitMapper;
+
+    private final ChannelPopularizeMapper popularizeMapper;
+
+    @GetMapping("/get/{id}")
+    public Result<ChannelPopularize> getById(@PathVariable Long id){
+        ChannelPopularize channelPopularize = popularizeMapper.selectById(id);
+        if(channelPopularize == null){
+            throw BusinessRuntimeException.getInstance("该链接不存在!");
+        }
+        ChannelPopularizeVisit channelPopularizeVisit = new ChannelPopularizeVisit();
+        channelPopularizeVisit.setPopularizeId(id);
+        channelPopularizeVisitMapper.insert(channelPopularizeVisit);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(channelPopularize);
+    }
+}

+ 74 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/channel/CmsChannelController.java

@@ -0,0 +1,74 @@
+package com.cyksj.web.controller.manage.channel;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.Channel;
+import com.cyksj.model.entity.ChannelPopularize;
+import com.cyksj.model.views.ChannelView;
+import com.cyksj.service.mange.channel.ChannelPopularizeService;
+import com.cyksj.service.mange.channel.ChannelService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:29 PM
+ */
+@RequestMapping("/manage/channel")
+@Slf4j
+@RestController
+@RequiredArgsConstructor
+public class CmsChannelController {
+
+    private final ChannelService channelService;
+
+    private final ChannelPopularizeService channelPopularizeService;
+
+    private final BeanSearcher beanSearcher;
+
+    private final HttpServletRequest request;
+
+    @GetMapping
+    public Result<SearchResult<ChannelView>> get(String startTime, String endTime){
+        String timeSql = StringUtils.EMPTY;
+        if(StringUtils.isNotBlank(startTime)){
+            timeSql += String.format(" and o.created_time >= '%s'",startTime);
+        }
+        if(StringUtils.isNotBlank(endTime)){
+            timeSql += String.format(" and o.created_time <= '%s'" , endTime);
+        }
+        SearchResult<ChannelView> searchResult = beanSearcher.search(ChannelView.class,
+                MapUtils.flatBuilder(request.getParameterMap())
+                        .put("time",timeSql)
+                        .build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(searchResult);
+    }
+
+    @PostMapping
+    public Result<String> post(@RequestBody Channel channel){
+        channelService.save(channel);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    @PutMapping
+    public Result<String> put(@RequestBody Channel channel){
+        channelService.updateById(channel);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    @DeleteMapping("/{id}")
+    public Result<String> del(@PathVariable Long id){
+        channelService.removeById(id);
+        channelPopularizeService.remove(Wrappers.lambdaQuery(ChannelPopularize.class).eq(ChannelPopularize::getChannelId,id));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+}

+ 92 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/channel/CmsChannelPopularizeController.java

@@ -0,0 +1,92 @@
+package com.cyksj.web.controller.manage.channel;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.Channel;
+import com.cyksj.model.entity.ChannelPopularize;
+import com.cyksj.model.views.ChannelPopularizeDetailView;
+import com.cyksj.model.views.ChannelPopularizeView;
+import com.cyksj.model.views.ChannelView;
+import com.cyksj.service.mange.channel.ChannelPopularizeService;
+import com.cyksj.service.mange.channel.ChannelService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:29 PM
+ */
+@RequestMapping("/manage/channel/popularize")
+@Slf4j
+@RestController
+@RequiredArgsConstructor
+public class CmsChannelPopularizeController {
+
+    private final ChannelPopularizeService channelPopularizeService;
+
+    private final BeanSearcher beanSearcher;
+
+    private final HttpServletRequest request;
+
+    @GetMapping
+    public Result<SearchResult<ChannelPopularizeView>> get(String startTime, String endTime){
+        String timeSql = StringUtils.EMPTY;
+        if(StringUtils.isNotBlank(startTime)){
+            timeSql += String.format(" and o.created_time >= '%s'",startTime);
+        }
+        if(StringUtils.isNotBlank(endTime)){
+            timeSql += String.format(" and o.created_time <= '%s'" , endTime);
+        }
+        SearchResult<ChannelPopularizeView> searchResult = beanSearcher.search(ChannelPopularizeView.class,
+                MapUtils.flatBuilder(request.getParameterMap())
+                        .put("time",timeSql)
+                        .build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(searchResult);
+    }
+
+    @GetMapping("/{id}")
+    public Result<List<ChannelPopularizeDetailView>> getById(@PathVariable Long id, String startTime, String endTime){
+        String timeSql = StringUtils.EMPTY;
+        if(StringUtils.isNotBlank(startTime)){
+            timeSql += " and o.created_time >= " + startTime;
+        }
+        if(StringUtils.isNotBlank(endTime)){
+            timeSql += " and o.created_time <= " + endTime;
+        }
+        List<ChannelPopularizeDetailView> result = beanSearcher.searchAll(ChannelPopularizeDetailView.class,
+                MapUtils.flatBuilder(request.getParameterMap())
+                        .field(ChannelPopularizeDetailView::getPopularizeId,id)
+                        .field("time",timeSql)
+                        .build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(result);
+    }
+
+    @PostMapping
+    public Result<ChannelPopularize> post(@RequestBody ChannelPopularize popularize){
+        channelPopularizeService.save(popularize);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(channelPopularizeService.getById(popularize.getId()));
+    }
+
+    @PutMapping
+    public Result<String> put(@RequestBody ChannelPopularize popularize){
+        channelPopularizeService.updateById(popularize);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    @DeleteMapping("/{id}")
+    public Result<String> del(@PathVariable Long id){
+        channelPopularizeService.removeById(id);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+
+}

+ 66 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/shop/ShopConfigController.java

@@ -0,0 +1,66 @@
+package com.cyksj.web.controller.manage.shop;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.channel.ShopConfigMapper;
+import com.cyksj.model.entity.Channel;
+import com.cyksj.model.entity.ChannelPopularize;
+import com.cyksj.model.entity.ShopConfig;
+import com.cyksj.model.views.ChannelView;
+import com.cyksj.service.mange.channel.ChannelService;
+import com.cyksj.service.mange.shop.ShopConfigService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author chan
+ * @date 2022/12/13 4:53 PM
+ */
+@RestController
+@RequestMapping("/manage/shop")
+@RequiredArgsConstructor
+@Slf4j
+public class ShopConfigController {
+
+    private final BeanSearcher beanSearcher;
+
+    private final ShopConfigService shopConfigService;
+
+    private final HttpServletRequest request;
+
+    private final ChannelService channelService;
+
+    @GetMapping
+    public Result<SearchResult<ShopConfig>> get(){
+        SearchResult<ShopConfig> searchResult = beanSearcher.search(ShopConfig.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+        searchResult.getDataList().forEach((shopConfig)->{
+            shopConfig.setChannelCount(channelService.count(Wrappers.lambdaQuery(Channel.class).eq(Channel::getWxShopId,shopConfig.getAppId()).or().eq(Channel::getZfbShopId,shopConfig.getAppId())));
+        });
+        return GatewayResponse.SUCCESS.newBuilder().toResult(searchResult);
+    }
+
+    @PostMapping
+    public Result<String> post(@RequestBody ShopConfig shopConfig){
+        shopConfigService.save(shopConfig);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    @PutMapping
+    public Result<String> put(@RequestBody ShopConfig shopConfig){
+        shopConfigService.updateById(shopConfig);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    @DeleteMapping("/{id}")
+    public Result<String> del(@PathVariable Long id){
+        shopConfigService.removeById(id);
+       return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+}

文件差异内容过多而无法显示
+ 0 - 0
netflix-web/src/main/resources/application-dev.yml


+ 5 - 0
netflix-web/src/main/resources/config/logback-debug.xml

@@ -95,6 +95,11 @@
 		<appender-ref ref="ROOT-APPENDER" />
 	</appender>
 
+		<!-- 打开 Bean Searcher 的 SQL 日志 -->
+		<logger name="com.ejlchina.searcher.implement.DefaultSqlExecutor" level="DEBUG" additivity="false">
+			<appender-ref ref="STDOUT" />
+		</logger>
+
     <logger name="jdbc.audit" level="WARN" />
     <logger name="jdbc.resultset" level="WARN" />
     <logger name="jdbc.sqlonly" level="WARN" />

部分文件因为文件数量过多而无法显示