Explorar el Código

微信直播功能:直播间接口

ytf hace 2 años
padre
commit
f629f0e862
Se han modificado 22 ficheros con 1276 adiciones y 266 borrados
  1. 136 0
      b2b2c/b2b2c-core/src/main/java/com/slodon/b2b2c/core/util/FileUploadUtil.java
  2. 2 3
      b2b2c/b2b2c-core/src/main/java/com/slodon/b2b2c/core/util/HttpClientUtil.java
  3. 30 0
      b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/enums/WxLiveGoodsEnum.java
  4. 8 1
      b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/enums/WxLiveUrlEnum.java
  5. 128 0
      b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/errors/WxCodeError.java
  6. 17 2
      b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/live/dto/LiveBroadcastDto.java
  7. 0 50
      b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/live/dto/LiveBroadcastEditDto.java
  8. 31 0
      b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/live/dto/LiveGoodsInfoDto.java
  9. 8 0
      b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/live/example/LiveBroadcastExample.java
  10. 9 1
      b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/live/pojo/LiveBroadcast.java
  11. 48 0
      b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/live/vo/LivesVO.java
  12. 2 1
      b2b2c/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/common/UploadController.java
  13. 127 0
      b2b2c/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/live/LiveBroadAdminController.java
  14. 349 57
      b2b2c/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/live/LiveBroadController.java
  15. 103 0
      b2b2c/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/live/LiveGoodsController.java
  16. 4 1
      b2b2c/b2b2c-web/src/main/java/com/slodon/b2b2c/enums/UploadSourceEnum.java
  17. 8 0
      b2b2c/b2b2c-web/src/main/java/com/slodon/b2b2c/model/live/LiveBroadModel.java
  18. 121 64
      b2b2c/b2b2c-web/src/main/resources/mapper/read/Live/LiveBroadReadMapper.xml
  19. 121 64
      b2b2c/b2b2c-web/src/main/resources/mapper/write/Live/LiveBroadWriteMapper.xml
  20. 0 20
      b2b2c/b2b2c-web/src/test/com/slodon/b2b2c/controller/job/ScheduleTaskControllerTest.java
  21. 6 1
      b2b2c/sql/建表语句.sql
  22. 18 1
      b2b2c/sql/项目修改语句.sql

+ 136 - 0
b2b2c/b2b2c-core/src/main/java/com/slodon/b2b2c/core/util/FileUploadUtil.java

@@ -0,0 +1,136 @@
1
+package com.slodon.b2b2c.core.util;
2
+
3
+import org.slf4j.Logger;
4
+import org.slf4j.LoggerFactory;
5
+
6
+import javax.net.ssl.*;
7
+import java.io.*;
8
+import java.net.URL;
9
+import java.nio.charset.StandardCharsets;
10
+import java.security.cert.X509Certificate;
11
+import java.util.UUID;
12
+
13
+/**
14
+ * @Classname: FileUploadUtil
15
+ * @Description: 上传文件工具类:https请求使用postUploadSSL,http使用postUpload。主逻辑参照:https://www.cnblogs.com/yfrs/p/uploadbyjavacode.html
16
+ * @author: 流泪兔兔头
17
+ */
18
+public class FileUploadUtil {
19
+
20
+    private static final Logger log = LoggerFactory.getLogger(FileUploadUtil.class);
21
+
22
+    /**
23
+     * @Title: postUploadSSL
24
+     * @Description: https上传文件方法
25
+     * @param url      请求接口
26
+     * @param file     文件实体
27
+     * @param fileName 文件名
28
+     * @author: 流泪兔兔头
29
+     */
30
+    public static String postUploadSSL(String url, File file, String fileName) {
31
+        StringBuilder result = new StringBuilder();
32
+        try {
33
+            SSLContext sc = SSLContext.getInstance("SSL");
34
+            sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());
35
+            URL console = new URL(url);
36
+            HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
37
+            // 构建请求头
38
+            conn.setRequestMethod("POST");
39
+            conn.setRequestProperty("accept", "*/*");
40
+            conn.setRequestProperty("connection", "Keep-Alive");
41
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
42
+            conn.setRequestProperty("Charset", "UTF-8");
43
+            conn.setDoInput(true);
44
+            conn.setDoOutput(true);
45
+            conn.setUseCaches(false);
46
+
47
+            // 设置输出流
48
+            String newLine = "\r\n";
49
+            String boundaryPrefix = "--";
50
+            String boundary = "----" + UUID.randomUUID().toString();
51
+            conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
52
+            OutputStream out = conn.getOutputStream();
53
+            StringBuilder sb = new StringBuilder();
54
+
55
+            // 构建请求体
56
+            sb.append(newLine);
57
+            sb.append(boundaryPrefix);
58
+            sb.append(boundary);
59
+            sb.append(newLine);
60
+            String nameTmp = file.getName();
61
+            String typeName = nameTmp.substring(nameTmp.lastIndexOf("."));
62
+            sb.append("Content-Disposition: form-data; name=\"media\";filename=\"").append(fileName).append(typeName).append("\";filelength=").append(file.length());
63
+            sb.append("Content-Type: application/octet-stream");
64
+            sb.append(newLine);
65
+            sb.append(newLine);
66
+
67
+            out.write(sb.toString().getBytes());
68
+            FileInputStream in = new FileInputStream(file);
69
+            byte[] bufferOut = new byte[1024];
70
+            int bytes = 0;
71
+            while ((bytes = in.read(bufferOut)) != -1) {
72
+                out.write(bufferOut, 0, bytes);
73
+            }
74
+            in.close();
75
+            byte[] end_data = (newLine + boundaryPrefix + boundary + boundaryPrefix + newLine).getBytes();
76
+            out.write(end_data);
77
+            out.flush();
78
+            out.close();
79
+
80
+            // 配置SSL
81
+            conn.setSSLSocketFactory(sc.getSocketFactory());
82
+            conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
83
+            conn.connect();
84
+
85
+            // 读取请求返回信息
86
+            InputStream is = conn.getInputStream();
87
+            BufferedReader br = new BufferedReader(new InputStreamReader(is));
88
+            String ret = "";
89
+            while ((ret = br.readLine()) != null) {
90
+                if (!ret.trim().equals("")) {
91
+                    result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));
92
+                }
93
+            }
94
+            log.info("recv - {}", result);
95
+            conn.disconnect();
96
+            br.close();
97
+            is.close();
98
+        } catch (Exception e) {
99
+            e.printStackTrace();
100
+            log.error("文件上传失败{}", e.getMessage());
101
+        }
102
+        return result.toString();
103
+    }
104
+
105
+    /**
106
+     * @Title: TrustAnyTrustManager
107
+     * @Description: SSL用证书信任管理器
108
+     * @author: 流泪兔兔头
109
+     */
110
+    private static class TrustAnyTrustManager implements X509TrustManager {
111
+        @Override
112
+        public void checkClientTrusted(X509Certificate[] chain, String authType) {
113
+        }
114
+
115
+        @Override
116
+        public void checkServerTrusted(X509Certificate[] chain, String authType) {
117
+        }
118
+
119
+        @Override
120
+        public X509Certificate[] getAcceptedIssuers() {
121
+            return new X509Certificate[]{};
122
+        }
123
+    }
124
+
125
+    /**
126
+     * @Title: TrustAnyHostnameVerifier
127
+     * @Description: SSL用主机名验证
128
+     * @author: 流泪兔兔头
129
+     */
130
+    private static class TrustAnyHostnameVerifier implements HostnameVerifier {
131
+        @Override
132
+        public boolean verify(String hostname, SSLSession session) {
133
+            return true;
134
+        }
135
+    }
136
+}

+ 2 - 3
b2b2c/b2b2c-core/src/main/java/com/slodon/b2b2c/core/util/HttpClientUtil.java

@@ -132,7 +132,8 @@ public class HttpClientUtil {
132 132
 
133 133
     /**
134 134
      * post请求json 原本
135
-     *  提交类型是表单,由于是旧代码不敢修改 application/x-www-form-urlencoded
135
+     * 提交类型是表单,由于是旧代码不敢修改 application/x-www-form-urlencoded
136
+     *
136 137
      * @param url
137 138
      * @param json
138 139
      * @return
@@ -173,8 +174,6 @@ public class HttpClientUtil {
173 174
             }
174 175
         } catch (UnsupportedCharsetException e) {
175 176
             e.printStackTrace();
176
-        } catch (ClientProtocolException e) {
177
-            throw e;
178 177
         } catch (ParseException e) {
179 178
             e.printStackTrace();
180 179
         } catch (IOException e) {

+ 30 - 0
b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/enums/WxLiveGoodsEnum.java

@@ -0,0 +1,30 @@
1
+package com.slodon.b2b2c.enums;
2
+
3
+public enum WxLiveGoodsEnum {
4
+    ADD("商品添加并提审","https://api.weixin.qq.com/wxaapi/broadcast/goods/add?access_token="),
5
+    ;
6
+
7
+    private String explain;
8
+    private String url;
9
+
10
+    WxLiveGoodsEnum(String explain, String url) {
11
+        this.explain = explain;
12
+        this.url = url;
13
+    }
14
+
15
+    public String getExplain() {
16
+        return explain;
17
+    }
18
+
19
+    public void setExplain(String explain) {
20
+        this.explain = explain;
21
+    }
22
+
23
+    public String getUrl() {
24
+        return url;
25
+    }
26
+
27
+    public void setUrl(String url) {
28
+        this.url = url;
29
+    }
30
+}

+ 8 - 1
b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/enums/WxLiveUrlEnum.java

@@ -1,13 +1,20 @@
1 1
 package com.slodon.b2b2c.enums;
2 2
 
3 3
 public enum WxLiveUrlEnum {
4
+    ACCESS_TOKEN_URL("获取access_token地址","https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="),
5
+    TEMP_UPLOAD("上传临时文件","https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"),
4 6
     ADD_LIVE("创建直播间","https://api.weixin.qq.com/wxaapi/broadcast/room/create?access_token="),
5 7
     GET_LIVE_LIST("获取直播间列表","https://api.weixin.qq.com/wxa/business/getliveinfo?access_token="),
6 8
     GET_LIVE_PLAYBACK("获取直播间回放","https://api.weixin.qq.com/wxa/business/getliveinfo?access_token="),
7 9
     ADD_LIVE_GOODS("直播间导入商品","https://api.weixin.qq.com/wxaapi/broadcast/room/addgoods?access_token="),
8 10
     DEL_LIVE("删除直播间","https://api.weixin.qq.com/wxaapi/broadcast/room/deleteroom?access_token="),
9 11
     EDIT_LIVE("编辑直播间","https://api.weixin.qq.com/wxaapi/broadcast/room/editroom?access_token="),
10
-    GET_PUSH_LIVE("获取直播间推流地址","https://api.weixin.qq.com/wxaapi/broadcast/room/getpushurl?access_token=")
12
+    GET_PUSH_LIVE("获取直播间推流地址","https://api.weixin.qq.com/wxaapi/broadcast/room/getpushurl?access_token="),
13
+    GET_SHARED_CODE("获取直播间分享二维码","https://api.weixin.qq.com/wxaapi/broadcast/room/getsharedcode?access_token="),
14
+    UPDATE_FEED_PUBLIC("开启/关闭直播间官方收录","https://api.weixin.qq.com/wxaapi/broadcast/room/updatefeedpublic?access_token="),
15
+    UPDATE_REPLAY("开启/关闭回放功能","https://api.weixin.qq.com/wxaapi/broadcast/room/updatereplay?access_token="),
16
+    UPDATE_KF("开启/关闭客服功能","https://api.weixin.qq.com/wxaapi/broadcast/room/updatekf?access_token="),
17
+    UPDATE_COMMENT("开启/关闭直播间全局禁言","https://api.weixin.qq.com/wxaapi/broadcast/room/updatecomment?access_token="),
11 18
     ;
12 19
 
13 20
     private String explain;

+ 128 - 0
b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/errors/WxCodeError.java

@@ -0,0 +1,128 @@
1
+package com.slodon.b2b2c.errors;
2
+
3
+import java.util.HashMap;
4
+import java.util.Map;
5
+
6
+public class WxCodeError {
7
+    public static Map<String,String> WX_CODE = new HashMap<>();
8
+
9
+    public WxCodeError() {
10
+        initWxCode();
11
+        initWxLiveCode();//直播错误码添加
12
+    }
13
+
14
+    private void initWxLiveCode() {
15
+        WX_CODE.put("1","未创建直播间");
16
+        WX_CODE.put("1003","商品 id 不存在");
17
+        WX_CODE.put("47001","入参格式不符合规范");
18
+        WX_CODE.put("200002","入参错误");
19
+        WX_CODE.put("300001","禁止创建/更新商品 或 禁止编辑&更新房间");
20
+        WX_CODE.put("300002","名称长度不符合规则");
21
+        WX_CODE.put("300006","图片上传失败(如 mediaID过期)");
22
+        WX_CODE.put("300022","此房间号不存在");
23
+        WX_CODE.put("300023","房间状态 拦截(当前房间状态不允许此操作)");
24
+        WX_CODE.put("300024","商品不存在");
25
+        WX_CODE.put("300025","商品审核未通过");
26
+        WX_CODE.put("300026","房间商品数量已经满额");
27
+        WX_CODE.put("300027","导入商品失败");
28
+        WX_CODE.put("300028","房间名称违规");
29
+        WX_CODE.put("300029","主播昵称违规");
30
+        WX_CODE.put("300030","主播微信号不合法");
31
+        WX_CODE.put("300031","直播间封面图不合规");
32
+        WX_CODE.put("300032","直播间分享图违规");
33
+        WX_CODE.put("300033","添加商品超过直播间上限");
34
+        WX_CODE.put("300034","主播微信昵称长度不符合要求");
35
+        WX_CODE.put("300035","主播微信号不存在");
36
+        WX_CODE.put("300036","主播微信号未实名认证");
37
+        WX_CODE.put("300037","购物直播频道封面图不合规");
38
+        WX_CODE.put("300038","未在小程序管理后台配置客服");
39
+        WX_CODE.put("300039","主播副号微信号不合法");
40
+        WX_CODE.put("300040","名称含有非限定字符(含有特殊字符)");
41
+        WX_CODE.put("300041","创建者微信号不合法");
42
+        WX_CODE.put("300042","推流中禁止编辑房间");
43
+        WX_CODE.put("300043","每天只允许一场直播开启关注");
44
+        WX_CODE.put("300044","商品没有讲解视频");
45
+        WX_CODE.put("300045","讲解视频未生成");
46
+        WX_CODE.put("300046","讲解视频生成失败");
47
+        WX_CODE.put("300047","已有商品正在推送,请稍后再试");
48
+        WX_CODE.put("300048","拉取商品列表失败");
49
+        WX_CODE.put("300049","商品推送过程中不允许上下架");
50
+        WX_CODE.put("300050","排序商品列表为空");
51
+        WX_CODE.put("300051","解析 JSON 出错");
52
+        WX_CODE.put("300052","已下架的商品无法推送");
53
+        WX_CODE.put("300053","直播间未添加此商品");
54
+        WX_CODE.put("500001","副号不合规");
55
+        WX_CODE.put("500002","副号未实名");
56
+        WX_CODE.put("500003","已经设置过副号了,不能重复设置");
57
+        WX_CODE.put("500004","不能设置重复的副号");
58
+        WX_CODE.put("500005","副号不能和主号重复");
59
+        WX_CODE.put("600001","用户已被添加为小助手");
60
+        WX_CODE.put("600002","找不到用户");
61
+        WX_CODE.put("9410000","直播间列表为空");
62
+        WX_CODE.put("9410001","获取房间失败");
63
+        WX_CODE.put("9410002","获取商品失败");
64
+        WX_CODE.put("9410003","获取回放失败");
65
+    }
66
+
67
+    private void initWxCode(){
68
+        WX_CODE.put("-1","系统繁忙");
69
+        WX_CODE.put("0","请求成功");
70
+        WX_CODE.put("40001","验证失败");
71
+        WX_CODE.put("40002","不合法的凭证类型");
72
+        WX_CODE.put("40003","不合法的OpenID");
73
+        WX_CODE.put("40004","不合法的媒体文件类型");
74
+        WX_CODE.put("40005","不合法的文件类型");
75
+        WX_CODE.put("40006","不合法的文件大小");
76
+        WX_CODE.put("40007","不合法的媒体文件id");
77
+        WX_CODE.put("40008","不合法的消息类型");
78
+        WX_CODE.put("40009","不合法的图片文件大小");
79
+        WX_CODE.put("40010","不合法的语音文件大小");
80
+        WX_CODE.put("40011","不合法的视频文件大小");
81
+        WX_CODE.put("40012","不合法的缩略图文件大小");
82
+        WX_CODE.put("40013","不合法的APPID");
83
+        WX_CODE.put("40014","不合法的access_token");
84
+        WX_CODE.put("40015","不合法的菜单类型");
85
+        WX_CODE.put("40016","不合法的按钮个数");
86
+        WX_CODE.put("40017","不合法的按钮个数");
87
+        WX_CODE.put("40018","不合法的按钮名字长度");
88
+        WX_CODE.put("40019","不合法的按钮KEY长度");
89
+        WX_CODE.put("40020","不合法的按钮URL长度");
90
+        WX_CODE.put("40021","不合法的菜单版本号");
91
+        WX_CODE.put("40022","不合法的子菜单级数");
92
+        WX_CODE.put("40023","不合法的子菜单按钮个数");
93
+        WX_CODE.put("40024","不合法的子菜单按钮类型");
94
+        WX_CODE.put("40025","不合法的子菜单按钮名字长度");
95
+        WX_CODE.put("40026","不合法的子菜单按钮KEY长度");
96
+        WX_CODE.put("40027","不合法的子菜单按钮URL长度");
97
+        WX_CODE.put("40028","不合法的自定义菜单使用用户");
98
+        WX_CODE.put("41001","缺少access_token参数");
99
+        WX_CODE.put("41002","缺少appid参数");
100
+        WX_CODE.put("41003","缺少refresh_token参数");
101
+        WX_CODE.put("41004","缺少secret参数");
102
+        WX_CODE.put("41005","缺少多媒体文件数据");
103
+        WX_CODE.put("41006","缺少media_id参数");
104
+        WX_CODE.put("41007","缺少子菜单数据");
105
+        WX_CODE.put("42001","access_token超时");
106
+        WX_CODE.put("43001","需要GET请求");
107
+        WX_CODE.put("43002","需要POST请求");
108
+        WX_CODE.put("43003","需要HTTPS请求");
109
+        WX_CODE.put("44001","多媒体文件为空");
110
+        WX_CODE.put("44002","POST的数据包为空");
111
+        WX_CODE.put("44003","图文消息内容为空");
112
+        WX_CODE.put("45001","多媒体文件大小超过限制");
113
+        WX_CODE.put("45002","消息内容超过限制");
114
+        WX_CODE.put("45003","标题字段超过限制");
115
+        WX_CODE.put("45004","描述字段超过限制");
116
+        WX_CODE.put("45005","链接字段超过限制");
117
+        WX_CODE.put("45006","图片链接字段超过限制");
118
+        WX_CODE.put("45007","语音播放时间超过限制");
119
+        WX_CODE.put("45008","图文消息超过限制");
120
+        WX_CODE.put("45009","接口调用超过限制");
121
+        WX_CODE.put("45010","创建菜单个数超过限制");
122
+        WX_CODE.put("46001","不存在媒体数据");
123
+        WX_CODE.put("46002","不存在的菜单版本");
124
+        WX_CODE.put("46003","不存在的菜单数据");
125
+        WX_CODE.put("40029","登录多次导致code重复/appid和secret对应不上,不是同一个小程序");
126
+    }
127
+
128
+}

+ 17 - 2
b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/live/dto/LiveBroadcastDto.java

@@ -9,13 +9,21 @@ import java.io.Serializable;
9 9
 public class LiveBroadcastDto implements Serializable {
10 10
     @ApiModelProperty("直播间id")
11 11
     private String roomId;
12
+    @ApiModelProperty("商户ID")
13
+    private String vendorId;
12 14
     @ApiModelProperty(value = "直播间名字,最短3个汉字,最长17个汉字,1个汉字相当于2个字符",required = true)
13 15
     private String name;
14 16
     @ApiModelProperty(value = "背景图,填入mediaID(mediaID获取后,三天内有效)",required = true)
15 17
     private String coverImg;
18
+    @ApiModelProperty(value = "背景图 相对路径",required = true)
19
+    private String coverImgPath;
16 20
     @ApiModelProperty(value = "直播计划开始时间(开播时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后)",required = true)
17
-    private Long startTime;
21
+    private String startTimeStr;
18 22
     @ApiModelProperty(value = "直播计划结束时间(开播时间和结束时间间隔不得短于30分钟,不得超过24小时)",required = true)
23
+    private String endTimeStr;
24
+    @ApiModelProperty(value = "直播计划开始时间(开播时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后)")
25
+    private Long startTime;
26
+    @ApiModelProperty(value = "直播计划结束时间(开播时间和结束时间间隔不得短于30分钟,不得超过24小时)")
19 27
     private Long endTime;
20 28
     @ApiModelProperty(value = "主播昵称,最短2个汉字,最长15个汉字,1个汉字相当于2个字符",required = true)
21 29
     private String anchorName;
@@ -27,12 +35,16 @@ public class LiveBroadcastDto implements Serializable {
27 35
     private String createrWechat;
28 36
     @ApiModelProperty(value = "分享图,填入mediaID",required = true)
29 37
     private String shareImg;
38
+    @ApiModelProperty(value = "分享图 相对路径",required = true)
39
+    private String shareImgPath;
30 40
     @ApiModelProperty(value = "购物直播频道封面图,填入mediaID",required = true)
31 41
     private String feedsImg;
42
+    @ApiModelProperty(value = "购物直播频道封面图 相对路径",required = true)
43
+    private String feedsImgPath;
32 44
     @ApiModelProperty("是否开启官方收录 【1: 开启,0:关闭】,默认开启收录")
33 45
     private Integer isFeedsPublic;
34 46
     @ApiModelProperty(value = "直播间类型 【1: 推流,0:手机直播】",required = true)
35
-    private Integer type;
47
+    private Integer type = 0;
36 48
     @ApiModelProperty(value = "是否关闭点赞 【0:开启,1:关闭】(若关闭,观众端将隐藏点赞按钮,直播开始后不允许开启)",required = true)
37 49
     private Integer closeLike;
38 50
     @ApiModelProperty(value = "是否关闭货架 【0:开启,1:关闭】(若关闭,观众端将隐藏商品货架,直播开始后不允许开启)",required = true)
@@ -47,4 +59,7 @@ public class LiveBroadcastDto implements Serializable {
47 59
     private Integer closeKf;
48 60
 
49 61
 
62
+    //==========================微信接口需要装换的参数==============================
63
+    @ApiModelProperty("id")
64
+    private Integer id;
50 65
 }

+ 0 - 50
b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/live/dto/LiveBroadcastEditDto.java

@@ -1,50 +0,0 @@
1
-package com.slodon.b2b2c.live.dto;
2
-
3
-import io.swagger.annotations.ApiModelProperty;
4
-import lombok.Data;
5
-
6
-import java.io.Serializable;
7
-
8
-@Data
9
-public class LiveBroadcastEditDto implements Serializable {
10
-    @ApiModelProperty("直播间id")
11
-    private Integer id;
12
-    @ApiModelProperty(value = "直播间名字,最短3个汉字,最长17个汉字,1个汉字相当于2个字符",required = true)
13
-    private String name;
14
-    @ApiModelProperty(value = "背景图,填入mediaID(mediaID获取后,三天内有效)",required = true)
15
-    private String coverImg;
16
-    @ApiModelProperty(value = "直播计划开始时间(开播时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后)",required = true)
17
-    private Long startTime;
18
-    @ApiModelProperty(value = "直播计划结束时间(开播时间和结束时间间隔不得短于30分钟,不得超过24小时)",required = true)
19
-    private Long endTime;
20
-    @ApiModelProperty(value = "主播昵称,最短2个汉字,最长15个汉字,1个汉字相当于2个字符",required = true)
21
-    private String anchorName;
22
-    @ApiModelProperty(value = "主播微信号,如果未实名认证,需要先前往“小程序直播”小程序进行实名验证,",required = true)
23
-    private String anchorWechat;
24
-    @ApiModelProperty("主播副号微信号,如果未实名认证,需要先前往“小程序直播”小程序进行实名验证 ")
25
-    private String subAnchorWechat;
26
-    @ApiModelProperty("创建者微信号,不传入则此直播间所有成员可见。传入则此房间仅创建者、管理员、超管、直播间主播可见")
27
-    private String createrWechat;
28
-    @ApiModelProperty(value = "分享图,填入mediaID",required = true)
29
-    private String shareImg;
30
-    @ApiModelProperty(value = "购物直播频道封面图,填入mediaID",required = true)
31
-    private String feedsImg;
32
-    @ApiModelProperty("是否开启官方收录 【1: 开启,0:关闭】,默认开启收录")
33
-    private Integer isFeedsPublic;
34
-    @ApiModelProperty(value = "直播间类型 【1: 推流,0:手机直播】",required = true)
35
-    private Integer type;
36
-    @ApiModelProperty(value = "是否关闭点赞 【0:开启,1:关闭】(若关闭,观众端将隐藏点赞按钮,直播开始后不允许开启)",required = true)
37
-    private Integer closeLike;
38
-    @ApiModelProperty(value = "是否关闭货架 【0:开启,1:关闭】(若关闭,观众端将隐藏商品货架,直播开始后不允许开启)",required = true)
39
-    private Integer closeGoods;
40
-    @ApiModelProperty(value = "是否关闭评论 【0:开启,1:关闭】(若关闭,观众端将隐藏评论入口,直播开始后不允许开启)",required = true)
41
-    private Integer closeComment;
42
-    @ApiModelProperty("是否关闭回放 【0:开启,1:关闭】默认关闭回放(直播开始后允许开启)")
43
-    private Integer closeReplay;
44
-    @ApiModelProperty("是否关闭分享 【0:开启,1:关闭】默认开启分享(直播开始后不允许修改)")
45
-    private Integer closeShare;
46
-    @ApiModelProperty("是否关闭客服 【0:开启,1:关闭】 默认关闭客服(直播开始后允许开启)")
47
-    private Integer closeKf;
48
-
49
-
50
-}

+ 31 - 0
b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/live/dto/LiveGoodsInfoDto.java

@@ -0,0 +1,31 @@
1
+package com.slodon.b2b2c.live.dto;
2
+
3
+import io.swagger.annotations.ApiModelProperty;
4
+import lombok.Data;
5
+
6
+import java.io.Serializable;
7
+
8
+@Data
9
+public class LiveGoodsInfoDto implements Serializable {
10
+    @ApiModelProperty(value = "填入mediaID 图片 mediaID 的获取,https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html",required = true)
11
+    private String coverImgUrl;
12
+    @ApiModelProperty(value = "商品名称,最长14个汉字,1个汉字相当于2个字符",required = true)
13
+    private String name;
14
+    @ApiModelProperty(value = "价格类型,1:一口价(只需要传入price,price2不传) 2:价格区间(price字段为左边界,price2字段为右边界,price和price2必传) 3:显示折扣价(price字段为原价,price2字段为现价, price和price2必传)",required = true)
15
+    private Number priceType;
16
+    @ApiModelProperty(value = "数字,最多保留两位小数,单位元",required = true)
17
+    private Number price;
18
+    @ApiModelProperty("数字,最多保留两位小数,单位元")
19
+    private Number price2;
20
+    @ApiModelProperty(value = "商品详情页的小程序路径,路径参数存在 url 的,该参数的值需要进行 encode 处理再填入",required = true)
21
+    private String url;
22
+    @ApiModelProperty("当商品为第三方小程序的商品则填写为对应第三方小程序的appid,自身小程序商品则为")
23
+    private String thirdPartyAppid;
24
+
25
+
26
+    //==========================微信接口需要装换的参数==============================
27
+    @ApiModelProperty("商品ID")
28
+    private Integer goodsId;
29
+    @ApiModelProperty("审核单ID")
30
+    private Integer auditId;
31
+}

+ 8 - 0
b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/live/example/LiveBroadcastExample.java

@@ -10,10 +10,14 @@ import java.io.Serializable;
10 10
 public class LiveBroadcastExample implements Serializable {
11 11
     @ApiModelProperty("直播间id")
12 12
     private String roomId;
13
+    @ApiModelProperty("商户ID")
14
+    private String vendorId;
13 15
     @ApiModelProperty(value = "直播间名字,最短3个汉字,最长17个汉字,1个汉字相当于2个字符",required = true)
14 16
     private String name;
15 17
     @ApiModelProperty(value = "背景图,填入mediaID(mediaID获取后,三天内有效)",required = true)
16 18
     private String coverImg;
19
+    @ApiModelProperty(value = "背景图 相对路径",required = true)
20
+    private String coverImgPath;
17 21
     @ApiModelProperty(value = "直播计划开始时间(开播时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后)",required = true)
18 22
     private Long startTime;
19 23
     @ApiModelProperty(value = "直播计划结束时间(开播时间和结束时间间隔不得短于30分钟,不得超过24小时)",required = true)
@@ -28,8 +32,12 @@ public class LiveBroadcastExample implements Serializable {
28 32
     private String createrWechat;
29 33
     @ApiModelProperty(value = "分享图,填入mediaID",required = true)
30 34
     private String shareImg;
35
+    @ApiModelProperty(value = "分享图 相对路径",required = true)
36
+    private String shareImgPath;
31 37
     @ApiModelProperty(value = "购物直播频道封面图,填入mediaID",required = true)
32 38
     private String feedsImg;
39
+    @ApiModelProperty(value = "购物直播频道封面图 相对路径",required = true)
40
+    private String feedsImgPath;
33 41
     @ApiModelProperty("是否开启官方收录 【1: 开启,0:关闭】,默认开启收录")
34 42
     private Integer isFeedsPublic;
35 43
     @ApiModelProperty(value = "直播间类型 【1: 推流,0:手机直播】",required = true)

+ 9 - 1
b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/live/pojo/LiveBroadcast.java

@@ -9,10 +9,14 @@ import java.io.Serializable;
9 9
 public class LiveBroadcast implements Serializable {
10 10
     @ApiModelProperty("直播间id")
11 11
     private String roomId;
12
+    @ApiModelProperty("商户ID")
13
+    private String vendorId;
12 14
     @ApiModelProperty(value = "直播间名字,最短3个汉字,最长17个汉字,1个汉字相当于2个字符",required = true)
13 15
     private String name;
14 16
     @ApiModelProperty(value = "背景图,填入mediaID(mediaID获取后,三天内有效)",required = true)
15 17
     private String coverImg;
18
+    @ApiModelProperty(value = "背景图 相对路径",required = true)
19
+    private String coverImgPath;
16 20
     @ApiModelProperty(value = "直播计划开始时间(开播时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后)",required = true)
17 21
     private Long startTime;
18 22
     @ApiModelProperty(value = "直播计划结束时间(开播时间和结束时间间隔不得短于30分钟,不得超过24小时)",required = true)
@@ -27,12 +31,16 @@ public class LiveBroadcast implements Serializable {
27 31
     private String createrWechat;
28 32
     @ApiModelProperty(value = "分享图,填入mediaID",required = true)
29 33
     private String shareImg;
34
+    @ApiModelProperty(value = "分享图 相对路径",required = true)
35
+    private String shareImgPath;
30 36
     @ApiModelProperty(value = "购物直播频道封面图,填入mediaID",required = true)
31 37
     private String feedsImg;
38
+    @ApiModelProperty(value = "购物直播频道封面图 相对路径",required = true)
39
+    private String feedsImgPath;
32 40
     @ApiModelProperty("是否开启官方收录 【1: 开启,0:关闭】,默认开启收录")
33 41
     private Integer isFeedsPublic = 1;
34 42
     @ApiModelProperty(value = "直播间类型 【1: 推流,0:手机直播】",required = true)
35
-    private Integer type;
43
+    private Integer type = 0;
36 44
     @ApiModelProperty(value = "是否关闭点赞 【0:开启,1:关闭】(若关闭,观众端将隐藏点赞按钮,直播开始后不允许开启)",required = true)
37 45
     private Integer closeLike;
38 46
     @ApiModelProperty(value = "是否关闭货架 【0:开启,1:关闭】(若关闭,观众端将隐藏商品货架,直播开始后不允许开启)",required = true)

+ 48 - 0
b2b2c/b2b2c-entity/src/main/java/com/slodon/b2b2c/live/vo/LivesVO.java

@@ -11,6 +11,54 @@ public class LivesVO {
11 11
     private String roomId;
12 12
     @ApiModelProperty(value = "直播间名字,最短3个汉字,最长17个汉字,1个汉字相当于2个字符",required = true)
13 13
     private String name;
14
+    @ApiModelProperty(value = "背景图,填入mediaID(mediaID获取后,三天内有效)",required = true)
15
+    private String coverImg;
16
+    @ApiModelProperty(value = "背景图 相对路径",required = true)
17
+    private String coverImgPath;
18
+    @ApiModelProperty(value = "背景图 绝对路径")
19
+    private String coverImgUrl;
20
+    @ApiModelProperty(value = "直播计划开始时间(开播时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后)",required = true)
21
+    private String startTimeStr;
22
+    @ApiModelProperty(value = "直播计划结束时间(开播时间和结束时间间隔不得短于30分钟,不得超过24小时)",required = true)
23
+    private String endTimeStr;
24
+    @ApiModelProperty(value = "直播计划开始时间(开播时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后)",hidden = true)
25
+    private Long startTime;
26
+    @ApiModelProperty(value = "直播计划结束时间(开播时间和结束时间间隔不得短于30分钟,不得超过24小时)",hidden = true)
27
+    private Long endTime;
14 28
     @ApiModelProperty(value = "主播昵称,最短2个汉字,最长15个汉字,1个汉字相当于2个字符",required = true)
15 29
     private String anchorName;
30
+    @ApiModelProperty(value = "主播微信号,如果未实名认证,需要先前往“小程序直播”小程序进行实名验证,",required = true)
31
+    private String anchorWechat;
32
+    @ApiModelProperty("主播副号微信号,如果未实名认证,需要先前往“小程序直播”小程序进行实名验证 ")
33
+    private String subAnchorWechat;
34
+    @ApiModelProperty("创建者微信号,不传入则此直播间所有成员可见。传入则此房间仅创建者、管理员、超管、直播间主播可见")
35
+    private String createrWechat;
36
+    @ApiModelProperty(value = "分享图,填入mediaID",required = true)
37
+    private String shareImg;
38
+    @ApiModelProperty(value = "分享图 相对路径",required = true)
39
+    private String shareImgPath;
40
+    @ApiModelProperty(value = "分享图 绝对路径")
41
+    private String shareImgUrl;
42
+    @ApiModelProperty(value = "购物直播频道封面图,填入mediaID",required = true)
43
+    private String feedsImg;
44
+    @ApiModelProperty(value = "购物直播频道封面图 相对路径",required = true)
45
+    private String feedsImgPath;
46
+    @ApiModelProperty(value = "购物直播频道封面图 绝对路径")
47
+    private String feedsImgUrl;
48
+    @ApiModelProperty("是否开启官方收录 【1: 开启,0:关闭】,默认开启收录")
49
+    private Integer isFeedsPublic = 1;
50
+    @ApiModelProperty(value = "直播间类型 【1: 推流,0:手机直播】",required = true)
51
+    private Integer type;
52
+    @ApiModelProperty(value = "是否关闭点赞 【0:开启,1:关闭】(若关闭,观众端将隐藏点赞按钮,直播开始后不允许开启)",required = true)
53
+    private Integer closeLike;
54
+    @ApiModelProperty(value = "是否关闭货架 【0:开启,1:关闭】(若关闭,观众端将隐藏商品货架,直播开始后不允许开启)",required = true)
55
+    private Integer closeGoods;
56
+    @ApiModelProperty(value = "是否关闭评论 【0:开启,1:关闭】(若关闭,观众端将隐藏评论入口,直播开始后不允许开启)",required = true)
57
+    private Integer closeComment;
58
+    @ApiModelProperty("是否关闭回放 【0:开启,1:关闭】默认关闭回放(直播开始后允许开启)")
59
+    private Integer closeReplay = 1;
60
+    @ApiModelProperty("是否关闭分享 【0:开启,1:关闭】默认开启分享(直播开始后不允许修改)")
61
+    private Integer closeShare = 0;
62
+    @ApiModelProperty("是否关闭客服 【0:开启,1:关闭】 默认关闭客服(直播开始后允许开启)")
63
+    private Integer closeKf = 1;
16 64
 }

+ 2 - 1
b2b2c/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/common/UploadController.java

@@ -51,7 +51,8 @@ public class UploadController {
51 51
                             "goods==商品图片;video==商品视频;appeal==申诉图片;complain==投诉图片;" +
52 52
                             "setting==系统设置图片;sellerDeco==商户装修图片;adminBrand==品牌图片;" +
53 53
                             "sellerApply==入驻图片;logo==商家logo;adminDeco==装修图片;afterSale==售后申请图片;" +
54
-                            "evaluate==评价图片", paramType = "formData", required = true)
54
+                            "evaluate==评价图片;tempImg==wx临时图片"
55
+                            , paramType = "formData", required = true)
55 56
     })
56 57
     @PostMapping(value = "upload", consumes = "multipart/*", headers = "content-type=multipart/form-data")
57 58
     public JsonResult uploadImg(MultipartFile file, String source) throws Exception {

+ 127 - 0
b2b2c/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/live/LiveBroadAdminController.java

@@ -0,0 +1,127 @@
1
+package com.slodon.b2b2c.controller.live;
2
+
3
+
4
+import com.alibaba.fastjson.JSON;
5
+import com.alibaba.fastjson.JSONObject;
6
+import com.slodon.b2b2c.controller.common.UploadController;
7
+import com.slodon.b2b2c.core.constant.ResponseConst;
8
+import com.slodon.b2b2c.core.controller.BaseController;
9
+import com.slodon.b2b2c.core.response.JsonResult;
10
+import com.slodon.b2b2c.core.response.PageVO;
11
+import com.slodon.b2b2c.core.response.PagerInfo;
12
+import com.slodon.b2b2c.core.response.SldResponse;
13
+import com.slodon.b2b2c.core.util.*;
14
+import com.slodon.b2b2c.enums.WxLiveUrlEnum;
15
+import com.slodon.b2b2c.live.dto.LiveBroadcastDto;
16
+import com.slodon.b2b2c.live.example.LiveBroadcastExample;
17
+import com.slodon.b2b2c.live.pojo.LiveBroadcast;
18
+import com.slodon.b2b2c.live.vo.LivesVO;
19
+import com.slodon.b2b2c.model.live.LiveBroadModel;
20
+import com.slodon.b2b2c.seller.pojo.Vendor;
21
+import io.swagger.annotations.Api;
22
+import io.swagger.annotations.ApiImplicitParam;
23
+import io.swagger.annotations.ApiImplicitParams;
24
+import io.swagger.annotations.ApiOperation;
25
+import lombok.extern.slf4j.Slf4j;
26
+import org.apache.commons.beanutils.PropertyUtils;
27
+import org.springframework.data.redis.core.StringRedisTemplate;
28
+import org.springframework.util.CollectionUtils;
29
+import org.springframework.util.StringUtils;
30
+import org.springframework.web.bind.annotation.GetMapping;
31
+import org.springframework.web.bind.annotation.PostMapping;
32
+import org.springframework.web.bind.annotation.RequestMapping;
33
+import org.springframework.web.bind.annotation.RestController;
34
+import org.springframework.web.multipart.MultipartFile;
35
+
36
+import javax.annotation.Resource;
37
+import javax.servlet.http.HttpServletRequest;
38
+import java.io.File;
39
+import java.text.ParseException;
40
+import java.text.SimpleDateFormat;
41
+import java.util.*;
42
+
43
+@Api(tags = "admin-微信直播管理")
44
+@RestController
45
+@Slf4j
46
+@RequestMapping("v3/live/admin/broad")
47
+public class LiveBroadAdminController extends BaseController {
48
+
49
+    private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
50
+
51
+    @Resource
52
+    private StringRedisTemplate stringRedisTemplate;
53
+    @Resource
54
+    private LiveBroadModel liveBroadModel;
55
+
56
+    private String getToken() throws Exception {
57
+        String appId = stringRedisTemplate.opsForValue().get("login_wx_mini_appid");
58
+        String secret = stringRedisTemplate.opsForValue().get("login_wx_mini_appsecret");
59
+        String access_token_resp = HttpClientUtil.httpGet(WxLiveUrlEnum.ACCESS_TOKEN_URL.getUrl() + appId + "&secret=" + secret);
60
+        String access_token = JSON.parseObject(access_token_resp).getString("access_token");
61
+        AssertUtil.notEmpty(access_token, "微信认证失败");
62
+        System.out.println("结果access_token: "+access_token);
63
+        return access_token;
64
+    }
65
+
66
+    @ApiOperation("获取直播列表")
67
+    @ApiImplicitParams({
68
+            @ApiImplicitParam(name = "name", value = "直播名称", paramType = "query"),
69
+            @ApiImplicitParam(name = "pageSize", value = "分页大小", defaultValue = "20", paramType = "query"),
70
+            @ApiImplicitParam(name = "current", value = "当前页面位置", defaultValue = "1", paramType = "query")
71
+    })
72
+    @GetMapping("/list")
73
+    public JsonResult<PageVO<LivesVO>> getList(HttpServletRequest request, String name) {
74
+
75
+        PagerInfo pager = WebUtil.handlerPagerInfo(request);
76
+        LiveBroadcastExample example = new LiveBroadcastExample();
77
+        example.setName(name);
78
+        List<LiveBroadcast> livesList = liveBroadModel.getLivesList(example, pager);
79
+        List<LivesVO> livesVOS = new ArrayList<>();
80
+        if (!CollectionUtils.isEmpty(livesList)) {
81
+            livesList.forEach(node->{
82
+                LivesVO vo = new LivesVO();
83
+                try {
84
+                    PropertyUtils.copyProperties(vo,node);
85
+                    vo.setStartTimeStr(sdf.format(node.getStartTime()*1000));
86
+                    vo.setEndTimeStr(sdf.format(node.getEndTime()*1000));
87
+                    vo.setCoverImgUrl(FileUrlUtil.getFileUrl(vo.getCoverImgPath(), null));
88
+                    vo.setFeedsImgUrl(FileUrlUtil.getFileUrl(vo.getFeedsImgPath(), null));
89
+                    vo.setShareImgUrl(FileUrlUtil.getFileUrl(vo.getShareImgPath(), null));
90
+                } catch (Exception e) {
91
+                    e.printStackTrace();
92
+                }
93
+                livesVOS.add(vo);
94
+            });
95
+        }
96
+        return SldResponse.success(new PageVO<>(livesVOS, pager));
97
+    }
98
+
99
+    @ApiOperation("获取直播间列表及直播间信息")
100
+    @ApiImplicitParams({
101
+            @ApiImplicitParam(name = "start", value = "起始房间,0表示从第1个房间开始拉取", paramType = "query"),
102
+            @ApiImplicitParam(name = "limit", value = "每次拉取的房间数量,建议100以内", paramType = "query")
103
+    })
104
+    @GetMapping("/wxGetLiveInfoList")
105
+    public JsonResult wxGetLiveInfoList(HttpServletRequest request, Integer start,Integer limit) {
106
+        try {
107
+            String access_token = getToken();
108
+            //校验
109
+            String url = WxLiveUrlEnum.GET_LIVE_LIST.getUrl()+access_token;
110
+            Map map = new HashMap();
111
+            map.put("start",start);
112
+            map.put("limit",limit);
113
+            String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(map));
114
+            JSONObject jsonObject = JSONObject.parseObject(reStr);
115
+            String errCode = jsonObject.getString("errcode");
116
+            if (!"0".equals(errCode)){
117
+                log.warn("获取直播间列表及直播间信息:"+reStr);
118
+                return SldResponse.fail(jsonObject.getString("errmsg"));
119
+            }
120
+            return SldResponse.success(reStr);
121
+        } catch (Exception e) {
122
+            e.printStackTrace();
123
+        }
124
+        return SldResponse.success("查询失败");
125
+    }
126
+
127
+}

+ 349 - 57
b2b2c/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/live/LiveBroadController.java

@@ -3,21 +3,22 @@ package com.slodon.b2b2c.controller.live;
3 3
 
4 4
 import com.alibaba.fastjson.JSON;
5 5
 import com.alibaba.fastjson.JSONObject;
6
+import com.slodon.b2b2c.controller.common.UploadController;
7
+import com.slodon.b2b2c.core.constant.ResponseConst;
6 8
 import com.slodon.b2b2c.core.controller.BaseController;
7 9
 import com.slodon.b2b2c.core.response.JsonResult;
8 10
 import com.slodon.b2b2c.core.response.PageVO;
9 11
 import com.slodon.b2b2c.core.response.PagerInfo;
10 12
 import com.slodon.b2b2c.core.response.SldResponse;
11
-import com.slodon.b2b2c.core.util.AssertUtil;
12
-import com.slodon.b2b2c.core.util.HttpClientUtil;
13
-import com.slodon.b2b2c.core.util.WebUtil;
13
+import com.slodon.b2b2c.core.util.*;
14 14
 import com.slodon.b2b2c.enums.WxLiveUrlEnum;
15
+import com.slodon.b2b2c.errors.WxCodeError;
15 16
 import com.slodon.b2b2c.live.dto.LiveBroadcastDto;
16
-import com.slodon.b2b2c.live.dto.LiveBroadcastEditDto;
17 17
 import com.slodon.b2b2c.live.example.LiveBroadcastExample;
18 18
 import com.slodon.b2b2c.live.pojo.LiveBroadcast;
19 19
 import com.slodon.b2b2c.live.vo.LivesVO;
20 20
 import com.slodon.b2b2c.model.live.LiveBroadModel;
21
+import com.slodon.b2b2c.seller.pojo.Vendor;
21 22
 import io.swagger.annotations.Api;
22 23
 import io.swagger.annotations.ApiImplicitParam;
23 24
 import io.swagger.annotations.ApiImplicitParams;
@@ -26,79 +27,199 @@ import lombok.extern.slf4j.Slf4j;
26 27
 import org.apache.commons.beanutils.PropertyUtils;
27 28
 import org.springframework.data.redis.core.StringRedisTemplate;
28 29
 import org.springframework.util.CollectionUtils;
29
-import org.springframework.web.bind.annotation.*;
30
+import org.springframework.util.StringUtils;
31
+import org.springframework.web.bind.annotation.GetMapping;
32
+import org.springframework.web.bind.annotation.PostMapping;
33
+import org.springframework.web.bind.annotation.RequestMapping;
34
+import org.springframework.web.bind.annotation.RestController;
35
+import org.springframework.web.multipart.MultipartFile;
30 36
 
31 37
 import javax.annotation.Resource;
32 38
 import javax.servlet.http.HttpServletRequest;
33
-import java.util.ArrayList;
34
-import java.util.HashMap;
35
-import java.util.List;
36
-import java.util.Map;
39
+import java.io.File;
40
+import java.text.ParseException;
41
+import java.text.SimpleDateFormat;
42
+import java.util.*;
37 43
 
38 44
 @Api(tags = "admin-微信直播管理")
39 45
 @RestController
40 46
 @Slf4j
41
-@RequestMapping("v3/live/broad")
47
+@RequestMapping("v3/live/seller/broad")
42 48
 public class LiveBroadController extends BaseController {
43
-    private final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=";//获取access_token地址
49
+
50
+    private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
44 51
 
45 52
     @Resource
46 53
     private StringRedisTemplate stringRedisTemplate;
47 54
     @Resource
48 55
     private LiveBroadModel liveBroadModel;
56
+    @Resource
57
+    private UploadController uploadController;
49 58
 
50 59
     private String getToken() throws Exception {
51 60
         String appId = stringRedisTemplate.opsForValue().get("login_wx_mini_appid");
52 61
         String secret = stringRedisTemplate.opsForValue().get("login_wx_mini_appsecret");
53
-        String access_token_resp = HttpClientUtil.httpGet(ACCESS_TOKEN_URL + appId + "&secret=" + secret);
62
+        String access_token_resp = HttpClientUtil.httpGet(WxLiveUrlEnum.ACCESS_TOKEN_URL.getUrl() + appId + "&secret=" + secret);
54 63
         String access_token = JSON.parseObject(access_token_resp).getString("access_token");
55 64
         AssertUtil.notEmpty(access_token, "微信认证失败");
56 65
         System.out.println("结果access_token: "+access_token);
57 66
         return access_token;
58 67
     }
68
+    @ApiOperation("添加临时素材")
69
+    @ApiImplicitParams({
70
+            @ApiImplicitParam(name = "multipartFile", value = "文件", paramType = "formData", required = true)
71
+    })
72
+    @PostMapping(value = "upload", consumes = "multipart/*", headers = "content-type=multipart/form-data")
73
+    public JsonResult mediaUpload(HttpServletRequest request,MultipartFile multipartFile) {
74
+        HashMap<String, Object> resultMap = new HashMap<>();
75
+        try {
76
+            //先保存到本地
77
+            JsonResult uploadImg = uploadController.uploadImg(multipartFile, "tempImg");
78
+            resultMap = (HashMap<String, Object>) uploadImg.getData();
79
+            String access_token = getToken();
80
+            //校验
81
+            String url = WxLiveUrlEnum.TEMP_UPLOAD.getUrl();
82
+            url = url.replace("ACCESS_TOKEN",access_token).replace("TYPE","image");
83
+            File file = MultipartFileToFile(multipartFile);
84
+            String result = FileUploadUtil.postUploadSSL(url, file, file.getName());
85
+            JSONObject jsonObject = JSONObject.parseObject(result);
86
+            resultMap.put("mediaId",jsonObject.getString("media_id"));
87
+//            resultMap.put("url",jsonObject.getString("media_id"));
88
+//            resultMap.put("path",jsonObject.getString("media_id"));
89
+        } catch (Exception e) {
90
+            e.printStackTrace();
91
+        }
92
+
93
+        return SldResponse.success(resultMap);
94
+    }
95
+    /**
96
+     * 将MultipartFile转换为File
97
+     * @param multiFile
98
+     * @return
99
+     */
100
+    public static File MultipartFileToFile(MultipartFile multiFile) {
101
+        // 获取文件名
102
+        String fileName = multiFile.getOriginalFilename();
103
+        // 获取文件后缀
104
+        String prefix = fileName.substring(fileName.lastIndexOf("."));
105
+        // 若须要防止生成的临时文件重复,能够在文件名后添加随机码
106
+        try {
107
+            File file = File.createTempFile(fileName, prefix);
108
+            multiFile.transferTo(file);
109
+            return file;
110
+        } catch (Exception e) {
111
+            e.printStackTrace();
112
+        }
113
+        return null;
114
+    }
59 115
 
60
-//    @ApiOperation("添加临时素材")
61
-//    @PostMapping("/mediaUpload")
62
-//    public JsonResult mediaUpload(HttpServletRequest request, @RequestBody LiveBroadcastDto liveBroadcastDto) {
63
-//        try {
64
-//            String access_token = getToken();
65
-//            //校验
66
-//            String url = "https://api.weixin.qq.com/wxaapi/broadcast/room/create?access_token="+access_token;
67
-//            String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(liveBroadcastDto));
68
-//            JSONObject jsonObject = JSONObject.parseObject(reStr);
69
-//            String errCode = jsonObject.getString("errcode");
70
-//            if (!"0".equals(errCode)){
71
-//                log.warn("直播间添加失败原因:"+reStr);
72
-//                return SldResponse.success("添加失败");
73
-//            }
74
-//            liveBroadcastDto.setRoomId(String.valueOf(jsonObject.get("roomId")));
75
-//            liveBroadModel.broadcastRoomCreate(liveBroadcastDto);
76
-//        } catch (Exception e) {
77
-//            e.printStackTrace();
78
-//        }
79
-//        return SldResponse.success("添加成功");
80
-//    }
81 116
 
82 117
     @ApiOperation("添加直播间")
83 118
     @PostMapping("/wxBroadcastRoomCreate")
84
-    public JsonResult wxBroadcastRoomCreate(HttpServletRequest request, @RequestBody LiveBroadcastDto liveBroadcastDto) {
119
+    public JsonResult wxBroadcastRoomCreate(HttpServletRequest request,LiveBroadcastDto liveBroadcastDto) {
120
+        HashMap<String, String> resultMap = new HashMap<>();
85 121
         try {
86
-            String access_token = getToken();
122
+            Vendor vendor = UserUtil.getUser(request, Vendor.class);
123
+            if (vendor == null || vendor.getVendorId() == null){
124
+                return SldResponse.fail("获取商户id失败");
125
+            }
126
+            liveBroadcastDto.setVendorId(String.valueOf(vendor.getVendorId()));
87 127
             //校验
128
+            checkParam(liveBroadcastDto,resultMap);
129
+            if (String.valueOf(ResponseConst.STATE_FAIL).equals(resultMap.get("state").toString())){
130
+                return SldResponse.fail(resultMap.get("msg"));
131
+            }
132
+            //获取token
133
+            String access_token = getToken();
88 134
             String url = WxLiveUrlEnum.ADD_LIVE.getUrl()+access_token;
89 135
             String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(liveBroadcastDto));
90 136
             JSONObject jsonObject = JSONObject.parseObject(reStr);
91 137
             String errCode = jsonObject.getString("errcode");
92 138
             if (!"0".equals(errCode)){
93 139
                 log.warn("直播间添加失败原因:"+reStr);
94
-                return SldResponse.success("添加失败");
140
+                return jsonObject.getString("qrcode_url") != null
141
+                        ? SldResponse.fail("qrcode_url")
142
+                        : SldResponse.fail( WxCodeError.WX_CODE.get(errCode));
95 143
             }
96 144
             liveBroadcastDto.setRoomId(String.valueOf(jsonObject.get("roomId")));
97 145
             liveBroadModel.broadcastRoomCreate(liveBroadcastDto);
98 146
         } catch (Exception e) {
99 147
             e.printStackTrace();
100 148
         }
101
-        return SldResponse.success("添加成功");
149
+        return SldResponse.success(resultMap);
150
+    }
151
+
152
+    private void checkParam(LiveBroadcastDto liveBroadcastDto, HashMap<String, String> resultMap) throws ParseException {
153
+        resultMap.put("state","255");
154
+        if(liveBroadcastDto==null){
155
+            resultMap.put("msg","请填写参数");
156
+            return;
157
+        }
158
+        if(liveBroadcastDto.getName() == null || liveBroadcastDto.getName().length() < 3 || liveBroadcastDto.getName().length() > 17){
159
+            resultMap.put("msg","直播间名字,最短3个汉字,最长17个汉字");
160
+            return;
161
+        }
162
+        if(liveBroadcastDto.getCoverImg() == null){
163
+            resultMap.put("msg","背景图必填");
164
+            return;
165
+        }
166
+        if(liveBroadcastDto.getStartTimeStr() == null || liveBroadcastDto.getEndTimeStr() == null){
167
+            resultMap.put("msg","开始和结束时间必填");
168
+            return;
169
+        }
170
+        if(liveBroadcastDto.getAnchorName() == null || liveBroadcastDto.getAnchorName().length() < 2 || liveBroadcastDto.getAnchorName().length() > 15){
171
+            resultMap.put("msg","主播昵称,最短2个汉字,最长15个汉字");
172
+            return;
173
+        }
174
+        if(liveBroadcastDto.getAnchorWechat() == null){
175
+            resultMap.put("msg","主播微信号不能为空");
176
+            return;
177
+        }
178
+        if(liveBroadcastDto.getShareImg() == null){
179
+            resultMap.put("msg","分享图必填");
180
+            return;
181
+        }
182
+        if(liveBroadcastDto.getFeedsImg() == null){
183
+            resultMap.put("msg","购物直播频道封面图必填");
184
+            return;
185
+        }
186
+        if(liveBroadcastDto.getType() == null){
187
+            liveBroadcastDto.setType(0);
188
+        }
189
+        if(liveBroadcastDto.getCloseLike() == null){
190
+            resultMap.put("msg","是否关闭点赞必填");
191
+            return;
192
+        }
193
+        if(liveBroadcastDto.getCloseGoods() == null){
194
+            resultMap.put("msg","是否关闭货架必填");
195
+            return;
196
+        }
197
+        if(liveBroadcastDto.getCloseComment() == null){
198
+            resultMap.put("msg","是否关闭评论必填");
199
+            return;
200
+        }
201
+        if(liveBroadcastDto.getCloseKf() == null){
202
+            resultMap.put("msg","是否关闭客服必填");
203
+            return;
204
+        }
205
+        Date startTimeDate = sdf.parse(liveBroadcastDto.getStartTimeStr());
206
+        Date endTimeDate = sdf.parse(liveBroadcastDto.getEndTimeStr());
207
+        Long startTime = startTimeDate.getTime() / 1000;
208
+        Long endTime = endTimeDate.getTime() / 1000;
209
+
210
+        if (startTime-System.currentTimeMillis()/1000<600){
211
+            resultMap.put("msg","开始时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后");
212
+            return;
213
+        }
214
+        if (endTime-startTime<1800 || endTime-startTime>86400  ){
215
+            resultMap.put("msg","开播时间和结束时间间隔不得短于30分钟,不得超过24小时");
216
+            return;
217
+        }
218
+        liveBroadcastDto.setStartTime(startTimeDate.getTime() / 1000);
219
+        liveBroadcastDto.setEndTime(endTimeDate.getTime() / 1000);
220
+
221
+
222
+        resultMap.put("state","200");
102 223
     }
103 224
 
104 225
     @ApiOperation("获取直播列表")
@@ -109,17 +230,28 @@ public class LiveBroadController extends BaseController {
109 230
     })
110 231
     @GetMapping("/list")
111 232
     public JsonResult<PageVO<LivesVO>> getList(HttpServletRequest request, String name) {
233
+        Vendor vendor = UserUtil.getUser(request, Vendor.class);
112 234
         PagerInfo pager = WebUtil.handlerPagerInfo(request);
113 235
         LiveBroadcastExample example = new LiveBroadcastExample();
114 236
         example.setName(name);
237
+        if (vendor != null && vendor.getVendorId() != null){
238
+            example.setVendorId(String.valueOf(vendor.getVendorId()));
239
+        }
115 240
         List<LiveBroadcast> livesList = liveBroadModel.getLivesList(example, pager);
116 241
         List<LivesVO> livesVOS = new ArrayList<>();
117 242
         if (!CollectionUtils.isEmpty(livesList)) {
118 243
             livesList.forEach(node->{
119 244
                 LivesVO vo = new LivesVO();
120
-                vo.setName(node.getName());
121
-                vo.setAnchorName(node.getAnchorName());
122
-                vo.setRoomId(node.getRoomId());
245
+                try {
246
+                    PropertyUtils.copyProperties(vo,node);
247
+                    vo.setStartTimeStr(sdf.format(node.getStartTime()*1000));
248
+                    vo.setEndTimeStr(sdf.format(node.getEndTime()*1000));
249
+                    vo.setCoverImgUrl(FileUrlUtil.getFileUrl(vo.getCoverImgPath(), null));
250
+                    vo.setFeedsImgUrl(FileUrlUtil.getFileUrl(vo.getFeedsImgPath(), null));
251
+                    vo.setShareImgUrl(FileUrlUtil.getFileUrl(vo.getShareImgPath(), null));
252
+                } catch (Exception e) {
253
+                    e.printStackTrace();
254
+                }
123 255
                 livesVOS.add(vo);
124 256
             });
125 257
         }
@@ -141,6 +273,12 @@ public class LiveBroadController extends BaseController {
141 273
             map.put("start",start);
142 274
             map.put("limit",limit);
143 275
             String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(map));
276
+            JSONObject jsonObject = JSONObject.parseObject(reStr);
277
+            String errCode = jsonObject.getString("errcode");
278
+            if (!"0".equals(errCode)){
279
+                log.warn("获取直播间列表及直播间信息:"+reStr);
280
+                return SldResponse.fail(WxCodeError.WX_CODE.get(errCode));
281
+            }
144 282
             return SldResponse.success(reStr);
145 283
         } catch (Exception e) {
146 284
             e.printStackTrace();
@@ -188,7 +326,11 @@ public class LiveBroadController extends BaseController {
188 326
             map.put("ids",ids);
189 327
             map.put("roomId",roomId);
190 328
             String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(map));
191
-            return SldResponse.success(reStr);
329
+            JSONObject jsonObject = JSONObject.parseObject(reStr);
330
+            String errCode = jsonObject.getString("errcode");
331
+            if (!"0".equals(errCode)){
332
+                return SldResponse.fail(WxCodeError.WX_CODE.get(errCode));
333
+            }
192 334
         } catch (Exception e) {
193 335
             e.printStackTrace();
194 336
         }
@@ -206,30 +348,48 @@ public class LiveBroadController extends BaseController {
206 348
             //校验
207 349
             String url = WxLiveUrlEnum.DEL_LIVE.getUrl()+access_token;
208 350
             String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(new HashMap<>().put("id",roomId)));
209
-            return SldResponse.success(reStr);
351
+            JSONObject jsonObject = JSONObject.parseObject(reStr);
352
+            String errCode = jsonObject.getString("errcode");
353
+            if (!"0".equals(errCode)){
354
+                return SldResponse.fail(WxCodeError.WX_CODE.get(errCode));
355
+            }
356
+            liveBroadModel.wxDelLive(roomId);
357
+            return SldResponse.success("删除成功");
210 358
         } catch (Exception e) {
211 359
             e.printStackTrace();
212 360
         }
213
-        return SldResponse.success("查询失败");
361
+        return SldResponse.success("删除失败");
214 362
     }
215 363
 
216 364
     @ApiOperation("编辑直播间")
217 365
     @PostMapping("/wxBroadcastRoomEdit")
218
-    public JsonResult wxBroadcastRoomEdit(HttpServletRequest request, @RequestBody LiveBroadcastEditDto liveBroadcastEditDto) {
366
+    public JsonResult wxBroadcastRoomEdit(HttpServletRequest request, LiveBroadcastDto liveBroadcastDto) {
219 367
         try {
220
-            String access_token = getToken();
221 368
             //校验
369
+            HashMap<String, String> resultMap = new HashMap<>();
370
+            checkParam(liveBroadcastDto,resultMap);
371
+            if ("255".equals(resultMap.get("state"))){
372
+                return SldResponse.fail(resultMap.get("msg"));
373
+            }
374
+            if (StringUtils.isEmpty(liveBroadcastDto.getRoomId())){
375
+                return SldResponse.fail("直播间id不能为空");
376
+            }
377
+            String access_token = getToken();
222 378
             String url = WxLiveUrlEnum.EDIT_LIVE.getUrl()+access_token;
223
-            String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(liveBroadcastEditDto));
379
+            liveBroadcastDto.setId(Integer.valueOf(liveBroadcastDto.getRoomId()));
380
+            String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(liveBroadcastDto));
224 381
             JSONObject jsonObject = JSONObject.parseObject(reStr);
225 382
             String errCode = jsonObject.getString("errcode");
383
+
226 384
             if (!"0".equals(errCode)){
227 385
                 log.warn("直播间编辑失败原因:"+reStr);
228
-                return SldResponse.success("编辑失败");
386
+                return jsonObject.getString("qrcode_url") != null
387
+                        ? SldResponse.fail("qrcode_url")
388
+                        : SldResponse.fail( WxCodeError.WX_CODE.get(errCode));
229 389
             }
390
+
230 391
             LiveBroadcast live_broadcast = new LiveBroadcast();
231
-            PropertyUtils.copyProperties(live_broadcast,liveBroadcastEditDto);
232
-            live_broadcast.setRoomId(String.valueOf(liveBroadcastEditDto.getId()));
392
+            PropertyUtils.copyProperties(live_broadcast,liveBroadcastDto);
233 393
             liveBroadModel.broadcastRoomEdit(live_broadcast);
234 394
         } catch (Exception e) {
235 395
             e.printStackTrace();
@@ -246,20 +406,152 @@ public class LiveBroadController extends BaseController {
246 406
         try {
247 407
             String access_token = getToken();
248 408
             //校验
249
-            String url = WxLiveUrlEnum.GET_PUSH_LIVE.getUrl()+access_token;
250
-            String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(new HashMap<>().put("id",roomId)));
409
+            String url = WxLiveUrlEnum.GET_PUSH_LIVE.getUrl()+access_token+"&roomId"+roomId;
410
+            String reStr = HttpClientUtil.sendGet(url);
411
+            JSONObject jsonObject = JSONObject.parseObject(reStr);
412
+            String errCode = jsonObject.getString("errcode");
413
+            if (!"0".equals(errCode)){
414
+                return SldResponse.fail(WxCodeError.WX_CODE.get(errCode));
415
+            }
251 416
             return SldResponse.success(reStr);
252 417
         } catch (Exception e) {
253 418
             e.printStackTrace();
254 419
         }
255
-        return SldResponse.success("查询失败");
420
+        return SldResponse.success("查询成功");
421
+    }
422
+
423
+    @ApiOperation("获取直播间分享二维码")
424
+    @ApiImplicitParams({
425
+            @ApiImplicitParam(name = "roomId", value = "房间ID", paramType = "query"),
426
+    })
427
+    @GetMapping("/getSharedCode")
428
+    public JsonResult getSharedCode(HttpServletRequest request,Integer roomId) {
429
+        try {
430
+            String access_token = getToken();
431
+            //校验
432
+            String url = WxLiveUrlEnum.GET_SHARED_CODE.getUrl()+access_token+"&roomId"+roomId;
433
+            String reStr = HttpClientUtil.sendGet(url);
434
+            JSONObject jsonObject = JSONObject.parseObject(reStr);
435
+            String errCode = jsonObject.getString("errcode");
436
+            if (!"0".equals(errCode)){
437
+                return SldResponse.fail(WxCodeError.WX_CODE.get(errCode));
438
+            }
439
+            return SldResponse.success(reStr);
440
+        } catch (Exception e) {
441
+            e.printStackTrace();
442
+        }
443
+        return SldResponse.success("查询成功");
444
+    }
445
+
446
+    @ApiOperation("开启/关闭直播间官方收录")
447
+    @ApiImplicitParams({
448
+            @ApiImplicitParam(name = "roomId", value = "房间ID", paramType = "query"),
449
+            @ApiImplicitParam(name = "isFeedsPublic", value = "是否开启官方收录 【1: 开启,0:关闭】", paramType = "query"),
450
+    })
451
+    @GetMapping("/updateFeedPublic")
452
+    public JsonResult updateFeedPublic(HttpServletRequest request,Integer roomId,Integer isFeedsPublic) {
453
+        try {
454
+            String access_token = getToken();
455
+            //校验
456
+            String url = WxLiveUrlEnum.UPDATE_FEED_PUBLIC.getUrl()+access_token;
457
+            HashMap<Object, Object> hashMap = new HashMap<>();
458
+            hashMap.put("roomId",roomId);
459
+            hashMap.put("isFeedsPublic",isFeedsPublic);
460
+            String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(hashMap));
461
+            JSONObject jsonObject = JSONObject.parseObject(reStr);
462
+            String errCode = jsonObject.getString("errcode");
463
+            if (!"0".equals(errCode)){
464
+                return SldResponse.fail(WxCodeError.WX_CODE.get(errCode));
465
+            }
466
+        } catch (Exception e) {
467
+            e.printStackTrace();
468
+        }
469
+        return SldResponse.success("成功");
470
+    }
471
+
472
+    @ApiOperation("开启/关闭回放功能")
473
+    @ApiImplicitParams({
474
+            @ApiImplicitParam(name = "roomId", value = "房间ID", paramType = "query"),
475
+            @ApiImplicitParam(name = "closeReplay", value = "是否关闭回放 【0:开启,1:关闭】", paramType = "query"),
476
+    })
477
+    @GetMapping("/updateReplay")
478
+    public JsonResult updateReplay(HttpServletRequest request,Integer roomId,Integer closeReplay) {
479
+        try {
480
+            String access_token = getToken();
481
+            //校验
482
+            String url = WxLiveUrlEnum.UPDATE_REPLAY.getUrl()+access_token;
483
+            HashMap<Object, Object> hashMap = new HashMap<>();
484
+            hashMap.put("roomId",roomId);
485
+            hashMap.put("closeReplay",closeReplay);
486
+            String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(hashMap));
487
+            JSONObject jsonObject = JSONObject.parseObject(reStr);
488
+            String errCode = jsonObject.getString("errcode");
489
+            if (!"0".equals(errCode)){
490
+                return SldResponse.fail(WxCodeError.WX_CODE.get(errCode));
491
+            }
492
+        } catch (Exception e) {
493
+            e.printStackTrace();
494
+        }
495
+        return SldResponse.success("成功");
496
+    }
497
+
498
+    @ApiOperation("开启/关闭客服功能")
499
+    @ApiImplicitParams({
500
+            @ApiImplicitParam(name = "roomId", value = "房间ID", paramType = "query"),
501
+            @ApiImplicitParam(name = "closeKf", value = "是否关闭客服 【0:开启,1:关闭】", paramType = "query"),
502
+    })
503
+    @GetMapping("/updateKf")
504
+    public JsonResult updateKf(HttpServletRequest request,Integer roomId,Integer closeKf) {
505
+        try {
506
+            String access_token = getToken();
507
+            //校验
508
+            String url = WxLiveUrlEnum.UPDATE_KF.getUrl()+access_token;
509
+            HashMap<Object, Object> hashMap = new HashMap<>();
510
+            hashMap.put("roomId",roomId);
511
+            hashMap.put("closeKf",closeKf);
512
+            String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(hashMap));
513
+            JSONObject jsonObject = JSONObject.parseObject(reStr);
514
+            String errCode = jsonObject.getString("errcode");
515
+            if (!"0".equals(errCode)){
516
+                return SldResponse.fail(WxCodeError.WX_CODE.get(errCode));
517
+            }
518
+        } catch (Exception e) {
519
+            e.printStackTrace();
520
+        }
521
+        return SldResponse.success("成功");
522
+    }
523
+
524
+    @ApiOperation("开启/关闭直播间全局禁言")
525
+    @ApiImplicitParams({
526
+            @ApiImplicitParam(name = "roomId", value = "房间ID", paramType = "query"),
527
+            @ApiImplicitParam(name = "banComment", value = "1-禁言,0-取消禁言", paramType = "query"),
528
+    })
529
+    @GetMapping("/updateComment")
530
+    public JsonResult updateComment(HttpServletRequest request,Integer roomId,Integer banComment) {
531
+        try {
532
+            String access_token = getToken();
533
+            //校验
534
+            String url = WxLiveUrlEnum.UPDATE_COMMENT.getUrl()+access_token;
535
+            HashMap<Object, Object> hashMap = new HashMap<>();
536
+            hashMap.put("roomId",roomId);
537
+            hashMap.put("banComment",banComment);
538
+            String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(hashMap));
539
+            JSONObject jsonObject = JSONObject.parseObject(reStr);
540
+            String errCode = jsonObject.getString("errcode");
541
+            if (!"0".equals(errCode)){
542
+                return SldResponse.fail(WxCodeError.WX_CODE.get(errCode));
543
+            }
544
+        } catch (Exception e) {
545
+            e.printStackTrace();
546
+        }
547
+        return SldResponse.success("成功");
256 548
     }
257 549
 
258
-    public static void main(String[] args) {
259
-        Map map = new HashMap();
260
-        map.put("start",1);
261
-        map.put("limit",10);
262
-        System.out.println(JSON.toJSONString(map));
550
+    public static void main(String[] args) throws Exception {
551
+        String a = "s";
552
+        System.out.println(a.length());
553
+        String b = "是";
554
+        System.out.println(b.length());
263 555
     }
264 556
 
265 557
 }

+ 103 - 0
b2b2c/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/live/LiveGoodsController.java

@@ -0,0 +1,103 @@
1
+package com.slodon.b2b2c.controller.live;
2
+
3
+
4
+import com.alibaba.fastjson.JSON;
5
+import com.alibaba.fastjson.JSONObject;
6
+import com.slodon.b2b2c.controller.common.UploadController;
7
+import com.slodon.b2b2c.core.constant.ResponseConst;
8
+import com.slodon.b2b2c.core.controller.BaseController;
9
+import com.slodon.b2b2c.core.response.JsonResult;
10
+import com.slodon.b2b2c.core.response.PageVO;
11
+import com.slodon.b2b2c.core.response.PagerInfo;
12
+import com.slodon.b2b2c.core.response.SldResponse;
13
+import com.slodon.b2b2c.core.util.*;
14
+import com.slodon.b2b2c.enums.WxLiveGoodsEnum;
15
+import com.slodon.b2b2c.enums.WxLiveUrlEnum;
16
+import com.slodon.b2b2c.errors.WxCodeError;
17
+import com.slodon.b2b2c.live.dto.LiveBroadcastDto;
18
+import com.slodon.b2b2c.live.example.LiveBroadcastExample;
19
+import com.slodon.b2b2c.live.pojo.LiveBroadcast;
20
+import com.slodon.b2b2c.live.vo.LivesVO;
21
+import com.slodon.b2b2c.model.live.LiveBroadModel;
22
+import com.slodon.b2b2c.seller.pojo.Vendor;
23
+import io.swagger.annotations.Api;
24
+import io.swagger.annotations.ApiImplicitParam;
25
+import io.swagger.annotations.ApiImplicitParams;
26
+import io.swagger.annotations.ApiOperation;
27
+import lombok.extern.slf4j.Slf4j;
28
+import org.apache.commons.beanutils.PropertyUtils;
29
+import org.springframework.data.redis.core.StringRedisTemplate;
30
+import org.springframework.util.CollectionUtils;
31
+import org.springframework.util.StringUtils;
32
+import org.springframework.web.bind.annotation.GetMapping;
33
+import org.springframework.web.bind.annotation.PostMapping;
34
+import org.springframework.web.bind.annotation.RequestMapping;
35
+import org.springframework.web.bind.annotation.RestController;
36
+import org.springframework.web.multipart.MultipartFile;
37
+
38
+import javax.annotation.Resource;
39
+import javax.servlet.http.HttpServletRequest;
40
+import java.io.File;
41
+import java.text.ParseException;
42
+import java.text.SimpleDateFormat;
43
+import java.util.*;
44
+
45
+@Api(tags = "admin-微信商品管理")
46
+@RestController
47
+@Slf4j
48
+@RequestMapping("v3/live/seller/goods")
49
+public class LiveGoodsController extends BaseController {
50
+
51
+    private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
52
+
53
+    @Resource
54
+    private StringRedisTemplate stringRedisTemplate;
55
+    @Resource
56
+    private LiveBroadModel liveBroadModel;
57
+    @Resource
58
+    private UploadController uploadController;
59
+
60
+    private String getToken() throws Exception {
61
+        String appId = stringRedisTemplate.opsForValue().get("login_wx_mini_appid");
62
+        String secret = stringRedisTemplate.opsForValue().get("login_wx_mini_appsecret");
63
+        String access_token_resp = HttpClientUtil.httpGet(WxLiveUrlEnum.ACCESS_TOKEN_URL.getUrl() + appId + "&secret=" + secret);
64
+        String access_token = JSON.parseObject(access_token_resp).getString("access_token");
65
+        AssertUtil.notEmpty(access_token, "微信认证失败");
66
+        System.out.println("结果access_token: "+access_token);
67
+        return access_token;
68
+    }
69
+
70
+    @ApiOperation("商品添加并提审")
71
+    @PostMapping("/add")
72
+    public JsonResult wxBroadcastRoomCreate(HttpServletRequest request,LiveBroadcastDto liveBroadcastDto) {
73
+        HashMap<String, String> resultMap = new HashMap<>();
74
+        try {
75
+            Vendor vendor = UserUtil.getUser(request, Vendor.class);
76
+            if (vendor == null || vendor.getVendorId() == null){
77
+                return SldResponse.fail("获取商户id失败");
78
+            }
79
+            liveBroadcastDto.setVendorId(String.valueOf(vendor.getVendorId()));
80
+            if (String.valueOf(ResponseConst.STATE_FAIL).equals(resultMap.get("state").toString())){
81
+                return SldResponse.fail(resultMap.get("msg"));
82
+            }
83
+            //获取token
84
+            String access_token = getToken();
85
+            String url = WxLiveGoodsEnum.ADD.getUrl()+access_token;
86
+            String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(liveBroadcastDto));
87
+            JSONObject jsonObject = JSONObject.parseObject(reStr);
88
+            String errCode = jsonObject.getString("errcode");
89
+            if (!"0".equals(errCode)){
90
+                log.warn("直播间添加失败原因:"+reStr);
91
+                return jsonObject.getString("qrcode_url") != null
92
+                        ? SldResponse.fail("qrcode_url")
93
+                        : SldResponse.fail( WxCodeError.WX_CODE.get(errCode));
94
+            }
95
+            liveBroadcastDto.setRoomId(String.valueOf(jsonObject.get("roomId")));
96
+            liveBroadModel.broadcastRoomCreate(liveBroadcastDto);
97
+        } catch (Exception e) {
98
+            e.printStackTrace();
99
+        }
100
+        return SldResponse.success(resultMap);
101
+    }
102
+
103
+}

+ 4 - 1
b2b2c/b2b2c-web/src/main/java/com/slodon/b2b2c/enums/UploadSourceEnum.java

@@ -28,8 +28,11 @@ public enum UploadSourceEnum {
28 28
     ADMIN_BRAND("adminBrand", "admin/brand", UploadConst.BUCKET_NAME_IMAGE, "品牌图片"),//品牌图片
29 29
     SETTING("setting", "admin/setting", UploadConst.BUCKET_NAME_IMAGE, "系统设置图片"),//系统设置图片
30 30
     ADMIN_DECO("adminDeco", "admin/deco", UploadConst.BUCKET_NAME_IMAGE, "装修图片"),//装修图片
31
-    FRIEND_PARTNER("friendPartner", "admin/friend", UploadConst.BUCKET_NAME_IMAGE, "合作伙伴图片");//合作伙伴图片
31
+    FRIEND_PARTNER("friendPartner", "admin/friend", UploadConst.BUCKET_NAME_IMAGE, "合作伙伴图片"),//合作伙伴图片
32 32
 
33
+    //wx直播相关
34
+    TEMP_IMG("tempImg", "member/tempImg", UploadConst.BUCKET_NAME_IMAGE, "wx临时图片"),//wx临时图片
35
+    ;
33 36
     /**
34 37
      * source-enum
35 38
      */

+ 8 - 0
b2b2c/b2b2c-web/src/main/java/com/slodon/b2b2c/model/live/LiveBroadModel.java

@@ -51,4 +51,12 @@ public class LiveBroadModel {
51 51
         }
52 52
         return goodsList;
53 53
     }
54
+
55
+    public void wxDelLive(Integer roomId) {
56
+        liveBroadWriteMapper.deleteByPrimaryKey(roomId);
57
+    }
58
+
59
+    public LiveBroadcast getLiveInfo(String roomId) {
60
+        return liveBroadWriteMapper.getByPrimaryKey(roomId);
61
+    }
54 62
 }

+ 121 - 64
b2b2c/b2b2c-web/src/main/resources/mapper/read/Live/LiveBroadReadMapper.xml

@@ -3,9 +3,10 @@
3 3
 <mapper namespace="com.slodon.b2b2c.dao.write.live.LiveBroadWriteMapper">
4 4
   <resultMap id="resultMap" type="com.slodon.b2b2c.live.pojo.LiveBroadcast">
5 5
     <id column="roomId" property="roomId" />
6
-    <result column="name" property="name" />
6
+    <result column="vendorId" property="vendorId" />
7 7
     <result column="name" property="name" />
8 8
     <result column="coverImg" property="coverImg" />
9
+    <result column="coverImgPath" property="coverImgPath" />
9 10
     <result column="startTime" property="startTime" />
10 11
     <result column="endTime" property="endTime" />
11 12
     <result column="anchorName" property="anchorName" />
@@ -13,7 +14,9 @@
13 14
     <result column="subAnchorWechat" property="subAnchorWechat" />
14 15
     <result column="createrWechat" property="createrWechat" />
15 16
     <result column="shareImg" property="shareImg" />
17
+    <result column="shareImgPath" property="shareImgPath" />
16 18
     <result column="feedsImg" property="feedsImg" />
19
+    <result column="feedsImgPath" property="feedsImgPath" />
17 20
     <result column="isFeedsPublic" property="isFeedsPublic" />
18 21
     <result column="type" property="type" />
19 22
     <result column="closeLike" property="closeLike" />
@@ -30,12 +33,18 @@
30 33
       <if test="roomId != null">
31 34
         roomId,
32 35
       </if>
36
+      <if test="vendorId != null">
37
+        vendorId,
38
+      </if>
33 39
       <if test="name != null">
34 40
         name,
35 41
       </if>
36 42
       <if test="coverImg != null">
37 43
         coverImg,
38 44
       </if>
45
+      <if test="coverImgPath != null">
46
+        coverImgPath,
47
+      </if>
39 48
       <if test="startTime != null">
40 49
         startTime,
41 50
       </if>
@@ -57,9 +66,15 @@
57 66
       <if test="shareImg != null">
58 67
         shareImg,
59 68
       </if>
69
+      <if test="shareImgPath != null">
70
+        shareImgPath,
71
+      </if>
60 72
       <if test="feedsImg != null">
61 73
         feedsImg,
62 74
       </if>
75
+      <if test="feedsImgPath != null">
76
+        feedsImgPath,
77
+      </if>
63 78
       <if test="isFeedsPublic != null">
64 79
         isFeedsPublic,
65 80
       </if>
@@ -95,61 +110,73 @@
95 110
     <if test="example != null">
96 111
       <trim prefix="WHERE" prefixOverrides="AND|OR">
97 112
         <if test="example.roomId != null">
98
-          AND roomId = ${example.roomId}
113
+          AND roomId = #{example.roomId}
114
+        </if>
115
+        <if test="example.vendorId != null">
116
+          AND vendorId = #{example.vendorId}
99 117
         </if>
100 118
         <if test="example.name != null">
101 119
           AND name like concat('%',#{example.name},'%')
102 120
         </if>
103 121
         <if test="example.coverImg != null">
104
-          AND coverImg = ${example.coverImg}
122
+          AND coverImg = #{example.coverImg}
123
+        </if>
124
+        <if test="example.coverImgPath != null">
125
+          AND coverImgPath = #{example.coverImgPath}
105 126
         </if>
106 127
         <if test="example.startTime != null">
107
-          AND startTime = ${example.startTime}
128
+          AND startTime = #{example.startTime}
108 129
         </if>
109 130
         <if test="example.endTime != null">
110
-          AND endTime = ${example.endTime}
131
+          AND endTime = #{example.endTime}
111 132
         </if>
112 133
         <if test="example.anchorName != null">
113
-          AND anchorName = ${example.anchorName}
134
+          AND anchorName = #{example.anchorName}
114 135
         </if>
115 136
         <if test="example.anchorWechat != null">
116
-          AND anchorWechat = ${example.anchorWechat}
137
+          AND anchorWechat = #{example.anchorWechat}
117 138
         </if>
118 139
         <if test="example.subAnchorWechat != null">
119
-          AND subAnchorWechat = ${example.subAnchorWechat}
140
+          AND subAnchorWechat = #{example.subAnchorWechat}
120 141
         </if>
121 142
         <if test="example.createrWechat != null">
122
-          AND createrWechat = ${example.createrWechat}
143
+          AND createrWechat = #{example.createrWechat}
123 144
         </if>
124 145
         <if test="example.shareImg != null">
125
-          AND shareImg = ${example.shareImg}
146
+          AND shareImg = #{example.shareImg}
147
+        </if>
148
+        <if test="example.shareImgPath != null">
149
+          AND shareImgPath = #{example.shareImgPath}
126 150
         </if>
127 151
         <if test="example.feedsImg != null">
128
-          AND feedsImg = ${example.feedsImg}
152
+          AND feedsImg = #{example.feedsImg}
153
+        </if>
154
+        <if test="example.feedsImgPath != null">
155
+          AND feedsImgPath = #{example.feedsImgPath}
129 156
         </if>
130 157
         <if test="example.isFeedsPublic != null">
131
-          AND isFeedsPublic = ${example.isFeedsPublic}
158
+          AND isFeedsPublic = #{example.isFeedsPublic}
132 159
         </if>
133 160
         <if test="example.type != null">
134
-          AND type = ${example.type}
161
+          AND type = #{example.type}
135 162
         </if>
136 163
         <if test="example.closeLike != null">
137
-          AND closeLike = ${example.closeLike}
164
+          AND closeLike = #{example.closeLike}
138 165
         </if>
139 166
         <if test="example.closeGoods != null">
140
-          AND closeGoods = ${example.closeGoods}
167
+          AND closeGoods = #{example.closeGoods}
141 168
         </if>
142 169
         <if test="example.closeComment != null">
143
-          AND closeComment = ${example.closeComment}
170
+          AND closeComment = #{example.closeComment}
144 171
         </if>
145 172
         <if test="example.closeReplay != null">
146
-          AND closeReplay = ${example.closeReplay}
173
+          AND closeReplay = #{example.closeReplay}
147 174
         </if>
148 175
         <if test="example.closeShare != null">
149
-          AND closeShare = ${example.closeShare}
176
+          AND closeShare = #{example.closeShare}
150 177
         </if>
151 178
         <if test="example.closeKf != null">
152
-          AND closeKf = ${example.closeKf}
179
+          AND closeKf = #{example.closeKf}
153 180
         </if>
154 181
 
155 182
       </trim>
@@ -160,11 +187,11 @@
160 187
     ORDER BY roomId DESC
161 188
   </sql>
162 189
   <sql id="orderByOther">
163
-    order by ${example.orderBy}
190
+    order by #{example.orderBy}
164 191
   </sql>
165 192
   <!--分组条件-->
166 193
   <sql id="groupBy">
167
-    group by ${example.groupBy}
194
+    group by #{example.groupBy}
168 195
   </sql>
169 196
   <!--分页条件-->
170 197
   <sql id="limit">
@@ -226,7 +253,7 @@
226 253
   <!--查询符合条件的记录(指定字段)-->
227 254
   <select id="listFieldsByExample" resultMap="resultMap">
228 255
     SELECT
229
-      ${fields}
256
+      #{fields}
230 257
     FROM live_broadcast
231 258
     <include refid="whereCondition" />
232 259
     <if test="example.groupBy != null">
@@ -244,7 +271,7 @@
244 271
   <!--分页查询符合条件的记录(指定字段)-->
245 272
   <select id="listFieldsPageByExample" resultMap="resultMap">
246 273
     SELECT
247
-      ${fields}
274
+      #{fields}
248 275
     FROM live_broadcast
249 276
     <include refid="whereCondition" />
250 277
     <if test="example.groupBy != null">
@@ -271,68 +298,80 @@
271 298
     <include refid="pkWhere" />
272 299
   </delete>
273 300
   <!--插入一条记录-->
274
-  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.slodon.b2b2c.live.pojo.LiveBroadcast" useGeneratedKeys="true">
301
+  <insert id="insert" keyColumn="roomId" keyProperty="roomId" parameterType="com.slodon.b2b2c.live.pojo.LiveBroadcast" useGeneratedKeys="true">
275 302
     INSERT INTO live_broadcast(
276 303
     <include refid="columns" />
277 304
     )
278 305
     VALUES(
279 306
     <trim suffixOverrides=",">
280 307
       <if test="roomId != null">
281
-        ${roomId},
308
+        #{roomId},
309
+      </if>
310
+      <if test="vendorId != null">
311
+        #{vendorId},
282 312
       </if>
283 313
       <if test="name != null">
284
-        ${name},
314
+        #{name},
285 315
       </if>
286 316
       <if test="coverImg != null">
287
-        ${coverImg},
317
+        #{coverImg},
318
+      </if>
319
+      <if test="coverImgPath != null">
320
+        #{coverImgPath},
288 321
       </if>
289 322
       <if test="startTime != null">
290
-        ${startTime},
323
+        #{startTime},
291 324
       </if>
292 325
       <if test="endTime != null">
293
-        ${endTime},
326
+        #{endTime},
294 327
       </if>
295 328
       <if test="anchorName != null">
296
-        ${anchorName},
329
+        #{anchorName},
297 330
       </if>
298 331
       <if test="anchorWechat != null">
299
-        ${anchorWechat},
332
+        #{anchorWechat},
300 333
       </if>
301 334
       <if test="subAnchorWechat != null">
302
-        ${subAnchorWechat},
335
+        #{subAnchorWechat},
303 336
       </if>
304 337
       <if test="createrWechat != null">
305
-        ${createrWechat},
338
+        #{createrWechat},
306 339
       </if>
307 340
       <if test="shareImg != null">
308
-        ${shareImg},
341
+        #{shareImg},
342
+      </if>
343
+      <if test="shareImgPath != null">
344
+        #{shareImgPath},
309 345
       </if>
310 346
       <if test="feedsImg != null">
311
-        ${feedsImg},
347
+        #{feedsImg},
348
+      </if>
349
+      <if test="feedsImgPath != null">
350
+        #{feedsImgPath},
312 351
       </if>
313 352
       <if test="isFeedsPublic != null">
314
-        ${isFeedsPublic},
353
+        #{isFeedsPublic},
315 354
       </if>
316 355
       <if test="type != null">
317
-        ${type},
356
+        #{type},
318 357
       </if>
319 358
       <if test="closeLike != null">
320
-        ${closeLike},
359
+        #{closeLike},
321 360
       </if>
322 361
       <if test="closeGoods != null">
323
-        ${closeGoods},
362
+        #{closeGoods},
324 363
       </if>
325 364
       <if test="closeComment != null">
326
-        ${closeComment},
365
+        #{closeComment},
327 366
       </if>
328 367
       <if test="closeReplay != null">
329
-        ${closeReplay},
368
+        #{closeReplay},
330 369
       </if>
331 370
       <if test="closeShare != null">
332
-        ${closeShare},
371
+        #{closeShare},
333 372
       </if>
334 373
       <if test="closeKf != null">
335
-        ${closeKf},
374
+        #{closeKf},
336 375
       </if>
337 376
 
338 377
     </trim>
@@ -345,12 +384,18 @@
345 384
       <if test="record.roomId != null">
346 385
         AND roomId = #{record.roomId},
347 386
       </if>
387
+      <if test="record.vendorId != null">
388
+        AND vendorId = #{record.vendorId},
389
+      </if>
348 390
       <if test="record.name != null">
349 391
         AND name = #{record.name},
350 392
       </if>
351 393
       <if test="record.coverImg != null">
352 394
         AND coverImg = #{record.coverImg},
353 395
       </if>
396
+      <if test="record.coverImgPath != null">
397
+        AND coverImgPath = #{record.coverImgPath},
398
+      </if>
354 399
       <if test="record.startTime != null">
355 400
         AND startTime = #{record.startTime},
356 401
       </if>
@@ -372,9 +417,15 @@
372 417
       <if test="record.shareImg != null">
373 418
         AND shareImg = #{record.shareImg},
374 419
       </if>
420
+      <if test="record.shareImgPath != null">
421
+        AND shareImgPath = #{record.shareImgPath},
422
+      </if>
375 423
       <if test="record.feedsImg != null">
376 424
         AND feedsImg = #{record.feedsImg},
377 425
       </if>
426
+      <if test="record.feedsImgPath != null">
427
+        AND feedsImgPath = #{record.feedsImgPath},
428
+      </if>
378 429
       <if test="record.isFeedsPublic != null">
379 430
         AND isFeedsPublic = #{record.isFeedsPublic},
380 431
       </if>
@@ -407,62 +458,68 @@
407 458
   <update id="updateByPrimaryKeySelective">
408 459
     UPDATE live_broadcast
409 460
     <trim prefix="SET" suffixOverrides=",">
410
-      <if test="roomId != null">
411
-        roomId = #{roomId}
412
-      </if>
413 461
       <if test="name != null">
414
-        name = #{name}
462
+        name = #{name},
415 463
       </if>
416 464
       <if test="coverImg != null">
417
-        coverImg = #{coverImg}
465
+        coverImg = #{coverImg},
466
+      </if>
467
+      <if test="coverImgPath != null">
468
+        coverImgPath = #{coverImgPath},
418 469
       </if>
419 470
       <if test="startTime != null">
420
-        startTime = #{startTime}
471
+        startTime = #{startTime},
421 472
       </if>
422 473
       <if test="endTime != null">
423
-        endTime = #{endTime}
474
+        endTime = #{endTime},
424 475
       </if>
425 476
       <if test="anchorName != null">
426
-        anchorName = #{anchorName}
477
+        anchorName = #{anchorName},
427 478
       </if>
428 479
       <if test="anchorWechat != null">
429
-        anchorWechat = #{anchorWechat}
480
+        anchorWechat = #{anchorWechat},
430 481
       </if>
431 482
       <if test="subAnchorWechat != null">
432
-        subAnchorWechat = #{subAnchorWechat}
483
+        subAnchorWechat = #{subAnchorWechat},
433 484
       </if>
434 485
       <if test="createrWechat != null">
435
-        createrWechat = #{createrWechat}
486
+        createrWechat = #{createrWechat},
436 487
       </if>
437 488
       <if test="shareImg != null">
438
-        shareImg = #{shareImg}
489
+        shareImg = #{shareImg},
490
+      </if>
491
+      <if test="shareImgPath != null">
492
+        shareImgPath = #{shareImgPath},
439 493
       </if>
440 494
       <if test="feedsImg != null">
441
-        feedsImg = #{feedsImg}
495
+        feedsImg = #{feedsImg},
496
+      </if>
497
+      <if test="feedsImgPath != null">
498
+        feedsImgPath = #{feedsImgPath},
442 499
       </if>
443 500
       <if test="isFeedsPublic != null">
444
-        isFeedsPublic = #{isFeedsPublic}
501
+        isFeedsPublic = #{isFeedsPublic},
445 502
       </if>
446 503
       <if test="type != null">
447
-        type = #{type}
504
+        type = #{type},
448 505
       </if>
449 506
       <if test="closeLike != null">
450
-        closeLike = #{closeLike}
507
+        closeLike = #{closeLike},
451 508
       </if>
452 509
       <if test="closeGoods != null">
453
-        closeGoods = #{closeGoods}
510
+        closeGoods = #{closeGoods},
454 511
       </if>
455 512
       <if test="closeComment != null">
456
-        closeComment = #{closeComment}
513
+        closeComment = #{closeComment},
457 514
       </if>
458 515
       <if test="closeReplay != null">
459
-        closeReplay = #{closeReplay}
516
+        closeReplay = #{closeReplay},
460 517
       </if>
461 518
       <if test="closeShare != null">
462
-        closeShare = #{closeShare}
519
+        closeShare = #{closeShare},
463 520
       </if>
464 521
       <if test="closeKf != null">
465
-        closeKf = #{closeKf}
522
+        closeKf = #{closeKf},
466 523
       </if>
467 524
     </trim>
468 525
     WHERE roomId = #{roomId}

+ 121 - 64
b2b2c/b2b2c-web/src/main/resources/mapper/write/Live/LiveBroadWriteMapper.xml

@@ -3,9 +3,10 @@
3 3
 <mapper namespace="com.slodon.b2b2c.dao.write.live.LiveBroadWriteMapper">
4 4
   <resultMap id="resultMap" type="com.slodon.b2b2c.live.pojo.LiveBroadcast">
5 5
     <id column="roomId" property="roomId" />
6
-    <result column="name" property="name" />
6
+    <result column="vendorId" property="vendorId" />
7 7
     <result column="name" property="name" />
8 8
     <result column="coverImg" property="coverImg" />
9
+    <result column="coverImgPath" property="coverImgPath" />
9 10
     <result column="startTime" property="startTime" />
10 11
     <result column="endTime" property="endTime" />
11 12
     <result column="anchorName" property="anchorName" />
@@ -13,7 +14,9 @@
13 14
     <result column="subAnchorWechat" property="subAnchorWechat" />
14 15
     <result column="createrWechat" property="createrWechat" />
15 16
     <result column="shareImg" property="shareImg" />
17
+    <result column="shareImgPath" property="shareImgPath" />
16 18
     <result column="feedsImg" property="feedsImg" />
19
+    <result column="feedsImgPath" property="feedsImgPath" />
17 20
     <result column="isFeedsPublic" property="isFeedsPublic" />
18 21
     <result column="type" property="type" />
19 22
     <result column="closeLike" property="closeLike" />
@@ -30,12 +33,18 @@
30 33
       <if test="roomId != null">
31 34
         roomId,
32 35
       </if>
36
+      <if test="vendorId != null">
37
+        vendorId,
38
+      </if>
33 39
       <if test="name != null">
34 40
         name,
35 41
       </if>
36 42
       <if test="coverImg != null">
37 43
         coverImg,
38 44
       </if>
45
+      <if test="coverImgPath != null">
46
+        coverImgPath,
47
+      </if>
39 48
       <if test="startTime != null">
40 49
         startTime,
41 50
       </if>
@@ -57,9 +66,15 @@
57 66
       <if test="shareImg != null">
58 67
         shareImg,
59 68
       </if>
69
+      <if test="shareImgPath != null">
70
+        shareImgPath,
71
+      </if>
60 72
       <if test="feedsImg != null">
61 73
         feedsImg,
62 74
       </if>
75
+      <if test="feedsImgPath != null">
76
+        feedsImgPath,
77
+      </if>
63 78
       <if test="isFeedsPublic != null">
64 79
         isFeedsPublic,
65 80
       </if>
@@ -95,61 +110,73 @@
95 110
     <if test="example != null">
96 111
       <trim prefix="WHERE" prefixOverrides="AND|OR">
97 112
         <if test="example.roomId != null">
98
-          AND roomId = ${example.roomId}
113
+          AND roomId = #{example.roomId}
114
+        </if>
115
+        <if test="example.vendorId != null">
116
+          AND vendorId = #{example.vendorId}
99 117
         </if>
100 118
         <if test="example.name != null">
101 119
           AND name like concat('%',#{example.name},'%')
102 120
         </if>
103 121
         <if test="example.coverImg != null">
104
-          AND coverImg = ${example.coverImg}
122
+          AND coverImg = #{example.coverImg}
123
+        </if>
124
+        <if test="example.coverImgPath != null">
125
+          AND coverImgPath = #{example.coverImgPath}
105 126
         </if>
106 127
         <if test="example.startTime != null">
107
-          AND startTime = ${example.startTime}
128
+          AND startTime = #{example.startTime}
108 129
         </if>
109 130
         <if test="example.endTime != null">
110
-          AND endTime = ${example.endTime}
131
+          AND endTime = #{example.endTime}
111 132
         </if>
112 133
         <if test="example.anchorName != null">
113
-          AND anchorName = ${example.anchorName}
134
+          AND anchorName = #{example.anchorName}
114 135
         </if>
115 136
         <if test="example.anchorWechat != null">
116
-          AND anchorWechat = ${example.anchorWechat}
137
+          AND anchorWechat = #{example.anchorWechat}
117 138
         </if>
118 139
         <if test="example.subAnchorWechat != null">
119
-          AND subAnchorWechat = ${example.subAnchorWechat}
140
+          AND subAnchorWechat = #{example.subAnchorWechat}
120 141
         </if>
121 142
         <if test="example.createrWechat != null">
122
-          AND createrWechat = ${example.createrWechat}
143
+          AND createrWechat = #{example.createrWechat}
123 144
         </if>
124 145
         <if test="example.shareImg != null">
125
-          AND shareImg = ${example.shareImg}
146
+          AND shareImg = #{example.shareImg}
147
+        </if>
148
+        <if test="example.shareImgPath != null">
149
+          AND shareImgPath = #{example.shareImgPath}
126 150
         </if>
127 151
         <if test="example.feedsImg != null">
128
-          AND feedsImg = ${example.feedsImg}
152
+          AND feedsImg = #{example.feedsImg}
153
+        </if>
154
+        <if test="example.feedsImgPath != null">
155
+          AND feedsImgPath = #{example.feedsImgPath}
129 156
         </if>
130 157
         <if test="example.isFeedsPublic != null">
131
-          AND isFeedsPublic = ${example.isFeedsPublic}
158
+          AND isFeedsPublic = #{example.isFeedsPublic}
132 159
         </if>
133 160
         <if test="example.type != null">
134
-          AND type = ${example.type}
161
+          AND type = #{example.type}
135 162
         </if>
136 163
         <if test="example.closeLike != null">
137
-          AND closeLike = ${example.closeLike}
164
+          AND closeLike = #{example.closeLike}
138 165
         </if>
139 166
         <if test="example.closeGoods != null">
140
-          AND closeGoods = ${example.closeGoods}
167
+          AND closeGoods = #{example.closeGoods}
141 168
         </if>
142 169
         <if test="example.closeComment != null">
143
-          AND closeComment = ${example.closeComment}
170
+          AND closeComment = #{example.closeComment}
144 171
         </if>
145 172
         <if test="example.closeReplay != null">
146
-          AND closeReplay = ${example.closeReplay}
173
+          AND closeReplay = #{example.closeReplay}
147 174
         </if>
148 175
         <if test="example.closeShare != null">
149
-          AND closeShare = ${example.closeShare}
176
+          AND closeShare = #{example.closeShare}
150 177
         </if>
151 178
         <if test="example.closeKf != null">
152
-          AND closeKf = ${example.closeKf}
179
+          AND closeKf = #{example.closeKf}
153 180
         </if>
154 181
 
155 182
       </trim>
@@ -160,11 +187,11 @@
160 187
     ORDER BY roomId DESC
161 188
   </sql>
162 189
   <sql id="orderByOther">
163
-    order by ${example.orderBy}
190
+    order by #{example.orderBy}
164 191
   </sql>
165 192
   <!--分组条件-->
166 193
   <sql id="groupBy">
167
-    group by ${example.groupBy}
194
+    group by #{example.groupBy}
168 195
   </sql>
169 196
   <!--分页条件-->
170 197
   <sql id="limit">
@@ -226,7 +253,7 @@
226 253
   <!--查询符合条件的记录(指定字段)-->
227 254
   <select id="listFieldsByExample" resultMap="resultMap">
228 255
     SELECT
229
-    ${fields}
256
+    #{fields}
230 257
     FROM live_broadcast
231 258
     <include refid="whereCondition" />
232 259
     <if test="example.groupBy != null">
@@ -244,7 +271,7 @@
244 271
   <!--分页查询符合条件的记录(指定字段)-->
245 272
   <select id="listFieldsPageByExample" resultMap="resultMap">
246 273
     SELECT
247
-    ${fields}
274
+    #{fields}
248 275
     FROM live_broadcast
249 276
     <include refid="whereCondition" />
250 277
     <if test="example.groupBy != null">
@@ -271,68 +298,80 @@
271 298
     <include refid="pkWhere" />
272 299
   </delete>
273 300
   <!--插入一条记录-->
274
-  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.slodon.b2b2c.live.pojo.LiveBroadcast" useGeneratedKeys="true">
301
+  <insert id="insert" keyColumn="roomId" keyProperty="roomId" parameterType="com.slodon.b2b2c.live.pojo.LiveBroadcast" useGeneratedKeys="true">
275 302
     INSERT INTO live_broadcast(
276 303
     <include refid="columns" />
277 304
     )
278 305
     VALUES(
279 306
     <trim suffixOverrides=",">
280 307
       <if test="roomId != null">
281
-        ${roomId},
308
+        #{roomId},
309
+      </if>
310
+      <if test="vendorId != null">
311
+        #{vendorId},
282 312
       </if>
283 313
       <if test="name != null">
284
-        ${name},
314
+        #{name},
285 315
       </if>
286 316
       <if test="coverImg != null">
287
-        ${coverImg},
317
+        #{coverImg},
318
+      </if>
319
+      <if test="coverImgPath != null">
320
+        #{coverImgPath},
288 321
       </if>
289 322
       <if test="startTime != null">
290
-        ${startTime},
323
+        #{startTime},
291 324
       </if>
292 325
       <if test="endTime != null">
293
-        ${endTime},
326
+        #{endTime},
294 327
       </if>
295 328
       <if test="anchorName != null">
296
-        ${anchorName},
329
+        #{anchorName},
297 330
       </if>
298 331
       <if test="anchorWechat != null">
299
-        ${anchorWechat},
332
+        #{anchorWechat},
300 333
       </if>
301 334
       <if test="subAnchorWechat != null">
302
-        ${subAnchorWechat},
335
+        #{subAnchorWechat},
303 336
       </if>
304 337
       <if test="createrWechat != null">
305
-        ${createrWechat},
338
+        #{createrWechat},
306 339
       </if>
307 340
       <if test="shareImg != null">
308
-        ${shareImg},
341
+        #{shareImg},
342
+      </if>
343
+      <if test="shareImgPath != null">
344
+        #{shareImgPath},
309 345
       </if>
310 346
       <if test="feedsImg != null">
311
-        ${feedsImg},
347
+        #{feedsImg},
348
+      </if>
349
+      <if test="feedsImgPath != null">
350
+        #{feedsImgPath},
312 351
       </if>
313 352
       <if test="isFeedsPublic != null">
314
-        ${isFeedsPublic},
353
+        #{isFeedsPublic},
315 354
       </if>
316 355
       <if test="type != null">
317
-        ${type},
356
+        #{type},
318 357
       </if>
319 358
       <if test="closeLike != null">
320
-        ${closeLike},
359
+        #{closeLike},
321 360
       </if>
322 361
       <if test="closeGoods != null">
323
-        ${closeGoods},
362
+        #{closeGoods},
324 363
       </if>
325 364
       <if test="closeComment != null">
326
-        ${closeComment},
365
+        #{closeComment},
327 366
       </if>
328 367
       <if test="closeReplay != null">
329
-        ${closeReplay},
368
+        #{closeReplay},
330 369
       </if>
331 370
       <if test="closeShare != null">
332
-        ${closeShare},
371
+        #{closeShare},
333 372
       </if>
334 373
       <if test="closeKf != null">
335
-        ${closeKf},
374
+        #{closeKf},
336 375
       </if>
337 376
 
338 377
     </trim>
@@ -345,12 +384,18 @@
345 384
       <if test="record.roomId != null">
346 385
         AND roomId = #{record.roomId},
347 386
       </if>
387
+      <if test="record.vendorId != null">
388
+        AND vendorId = #{record.vendorId},
389
+      </if>
348 390
       <if test="record.name != null">
349 391
         AND name = #{record.name},
350 392
       </if>
351 393
       <if test="record.coverImg != null">
352 394
         AND coverImg = #{record.coverImg},
353 395
       </if>
396
+      <if test="record.coverImgPath != null">
397
+        AND coverImgPath = #{record.coverImgPath},
398
+      </if>
354 399
       <if test="record.startTime != null">
355 400
         AND startTime = #{record.startTime},
356 401
       </if>
@@ -372,9 +417,15 @@
372 417
       <if test="record.shareImg != null">
373 418
         AND shareImg = #{record.shareImg},
374 419
       </if>
420
+      <if test="record.shareImgPath != null">
421
+        AND shareImgPath = #{record.shareImgPath},
422
+      </if>
375 423
       <if test="record.feedsImg != null">
376 424
         AND feedsImg = #{record.feedsImg},
377 425
       </if>
426
+      <if test="record.feedsImgPath != null">
427
+        AND feedsImgPath = #{record.feedsImgPath},
428
+      </if>
378 429
       <if test="record.isFeedsPublic != null">
379 430
         AND isFeedsPublic = #{record.isFeedsPublic},
380 431
       </if>
@@ -407,62 +458,68 @@
407 458
   <update id="updateByPrimaryKeySelective">
408 459
     UPDATE live_broadcast
409 460
     <trim prefix="SET" suffixOverrides=",">
410
-      <if test="roomId != null">
411
-        roomId = #{roomId}
412
-      </if>
413 461
       <if test="name != null">
414
-        name = #{name}
462
+        name = #{name},
415 463
       </if>
416 464
       <if test="coverImg != null">
417
-        coverImg = #{coverImg}
465
+        coverImg = #{coverImg},
466
+      </if>
467
+      <if test="coverImgPath != null">
468
+        coverImgPath = #{coverImgPath},
418 469
       </if>
419 470
       <if test="startTime != null">
420
-        startTime = #{startTime}
471
+        startTime = #{startTime},
421 472
       </if>
422 473
       <if test="endTime != null">
423
-        endTime = #{endTime}
474
+        endTime = #{endTime},
424 475
       </if>
425 476
       <if test="anchorName != null">
426
-        anchorName = #{anchorName}
477
+        anchorName = #{anchorName},
427 478
       </if>
428 479
       <if test="anchorWechat != null">
429
-        anchorWechat = #{anchorWechat}
480
+        anchorWechat = #{anchorWechat},
430 481
       </if>
431 482
       <if test="subAnchorWechat != null">
432
-        subAnchorWechat = #{subAnchorWechat}
483
+        subAnchorWechat = #{subAnchorWechat},
433 484
       </if>
434 485
       <if test="createrWechat != null">
435
-        createrWechat = #{createrWechat}
486
+        createrWechat = #{createrWechat},
436 487
       </if>
437 488
       <if test="shareImg != null">
438
-        shareImg = #{shareImg}
489
+        shareImg = #{shareImg},
490
+      </if>
491
+      <if test="shareImgPath != null">
492
+        shareImgPath = #{shareImgPath},
439 493
       </if>
440 494
       <if test="feedsImg != null">
441
-        feedsImg = #{feedsImg}
495
+        feedsImg = #{feedsImg},
496
+      </if>
497
+      <if test="feedsImgPath != null">
498
+        feedsImgPath = #{feedsImgPath},
442 499
       </if>
443 500
       <if test="isFeedsPublic != null">
444
-        isFeedsPublic = #{isFeedsPublic}
501
+        isFeedsPublic = #{isFeedsPublic},
445 502
       </if>
446 503
       <if test="type != null">
447
-        type = #{type}
504
+        type = #{type},
448 505
       </if>
449 506
       <if test="closeLike != null">
450
-        closeLike = #{closeLike}
507
+        closeLike = #{closeLike},
451 508
       </if>
452 509
       <if test="closeGoods != null">
453
-        closeGoods = #{closeGoods}
510
+        closeGoods = #{closeGoods},
454 511
       </if>
455 512
       <if test="closeComment != null">
456
-        closeComment = #{closeComment}
513
+        closeComment = #{closeComment},
457 514
       </if>
458 515
       <if test="closeReplay != null">
459
-        closeReplay = #{closeReplay}
516
+        closeReplay = #{closeReplay},
460 517
       </if>
461 518
       <if test="closeShare != null">
462
-        closeShare = #{closeShare}
519
+        closeShare = #{closeShare},
463 520
       </if>
464 521
       <if test="closeKf != null">
465
-        closeKf = #{closeKf}
522
+        closeKf = #{closeKf},
466 523
       </if>
467 524
     </trim>
468 525
     WHERE roomId = #{roomId}

+ 0 - 20
b2b2c/b2b2c-web/src/test/com/slodon/b2b2c/controller/job/ScheduleTaskControllerTest.java

@@ -1,20 +0,0 @@
1
-package com.slodon.b2b2c.controller.job;
2
-
3
-import org.junit.Test;
4
-import org.junit.runner.RunWith;
5
-import org.springframework.beans.factory.annotation.Autowired;
6
-import org.springframework.boot.test.context.SpringBootTest;
7
-import org.springframework.test.context.junit4.SpringRunner;
8
-
9
-@RunWith(SpringRunner.class)
10
-@SpringBootTest
11
-public class ScheduleTaskControllerTest {
12
-
13
-    @Autowired
14
-    private ScheduleTaskController taskController;
15
-
16
-    @Test
17
-    public void getJobSystemSendStockWarnRemind(){
18
-        taskController.jobSystemSendStockWarnRemind();
19
-    }
20
-}

+ 6 - 1
b2b2c/sql/建表语句.sql

@@ -2,7 +2,9 @@ DROP TABLE IF EXISTS live_broadcast;
2 2
 CREATE TABLE live_broadcast  (
3 3
   roomId varchar(50) NOT NULL COMMENT '房间ID' ,
4 4
   name varchar(50) NOT NULL COMMENT '直播间名字,最短3个汉字,最长17个汉字,1个汉字相当于2个字符',
5
-  coverImg varchar(50) NOT NULL COMMENT '背景图,填入mediaID(mediaID获取后,三天内有效);图片 mediaID 的获取,请参考以下文档: https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html;直播间背景图,图片规则:建议像素1080*1920,大小不超过2M',
5
+  coverImg varchar(50) NOT NULL COMMENT '背景图,填入mediaID(mediaID获取后,三天内有效);图片 mediaID 的获取,请参考以下文档: https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/
6
+  New_temporary_materials.html;直播间背景图,图片规则:建议像素1080*1920,大小不超过2M',
7
+  coverImgPath varchar(50) NOT NULL COMMENT '背景图 本地相对路径',
6 8
   startTime bigint(20) NOT NULL COMMENT '直播计划开始时间(开播时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后)',
7 9
   endTime bigint(20) NOT NULL COMMENT '直播计划结束时间(开播时间和结束时间间隔不得短于30分钟,不得超过24小时)',
8 10
   anchorName varchar(50) NOT NULL COMMENT '主播昵称,最短2个汉字,最长15个汉字,1个汉字相当于2个字符',
@@ -10,7 +12,9 @@ CREATE TABLE live_broadcast  (
10 12
   subAnchorWechat varchar(50)  COMMENT '主播副号微信号,如果未实名认证,需要先前往“小程序直播”小程序进行实名验证, 小程序二维码链接:https://res.wx.qq.com/op_res/9rSix1dhHfK4rR049JL0PHJ7TpOvkuZ3mE0z7Ou_Etvjf-w1J_jVX0rZqeStLfwh',
11 13
   createrWechat varchar(50)  COMMENT '创建者微信号,不传入则此直播间所有成员可见。传入则此房间仅创建者、管理员、超管、直播间主播可见',
12 14
   shareImg varchar(50) NOT NULL COMMENT '分享图,填入mediaID(mediaID获取后,三天内有效);图片 mediaID 的获取,请参考以下文档: https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html;直播间分享图,图片规则:建议像素800*640,大小不超过1M;',
15
+  shareImgPath varchar(50) NOT NULL COMMENT '分享图 本地相对路径',
13 16
   feedsImg varchar(50) NOT NULL COMMENT '购物直播频道封面图,填入mediaID(mediaID获取后,三天内有效);图片 mediaID 的获取,请参考以下文档: https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html; 购物直播频道封面图,图片规则:建议像素800*800,大小不超过100KB;',
17
+  feedsImgPath varchar(50) NOT NULL COMMENT '购物直播频道封面图 本地相对路径',
14 18
   isFeedsPublic int(11) NOT NULL DEFAULT 1 COMMENT '是否开启官方收录 【1: 开启,0:关闭】,默认开启收录',
15 19
   type  int(11) NOT NULL  COMMENT '直播间类型 【1: 推流,0:手机直播】',
16 20
   closeLike int(11) NOT NULL  COMMENT '是否关闭点赞 【0:开启,1:关闭】(若关闭,观众端将隐藏点赞按钮,直播开始后不允许开启)',
@@ -19,5 +23,6 @@ CREATE TABLE live_broadcast  (
19 23
   closeReplay int(11) NOT NULL DEFAULT 1 COMMENT '是否关闭回放 【0:开启,1:关闭】默认关闭回放(直播开始后允许开启)',
20 24
   closeShare  int(11) NOT NULL DEFAULT 0 COMMENT '是否关闭分享 【0:开启,1:关闭】默认开启分享(直播开始后不允许修改)',
21 25
   closeKf int(11) NOT NULL DEFAULT 1 COMMENT '是否关闭客服 【0:开启,1:关闭】 默认关闭客服(直播开始后允许开启)',
26
+  liveStatus int(11) NOT NULL DEFAULT 0 COMMENT '直播间状态。101:直播中,102:未开始,103已结束,104禁播,105:暂停,106:异常,107:已过期',
22 27
   PRIMARY KEY (roomId) USING BTREE
23 28
 ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '直播信息表' ROW_FORMAT = Dynamic;

+ 18 - 1
b2b2c/sql/项目修改语句.sql

@@ -18,4 +18,21 @@ update sys_setting set value = '647d35cc24fc7996003168d44ea91a43' where name = '
18 18
 update sys_setting set value='acAcsnklknskfnslalcn134643sljlda' where title='微信apikey';
19 19
 update sys_setting set value='wx43aba958092afe0c' where title='微信appid';
20 20
 update sys_setting set value='647d35cc24fc7996003168d44ea91a43' where title='微信appSecret';
21
-update sys_setting set value='1489871402' where title='微信商户号';
21
+update sys_setting set value='1489871402' where title='微信商户号';
22
+
23
+--添加直播
24
+update vendor_resources set state = 2 where resources_id in(471,472,473);
25
+INSERT INTO `vendor_resources`
26
+select max(resources_id)+1 resources_id,0, '/', '直播', '2020-12-30 17:31:52', 1, 1, '/' from vendor_resources;
27
+INSERT INTO `vendor_resources`
28
+select max(resources_id)+1 resources_id,max(resources_id), '/', '直播', '2020-12-30 17:32:45', 1, 2, '/live' from vendor_resources;
29
+INSERT INTO `vendor_resources`
30
+select max(resources_id)+1 resources_id,max(resources_id), '/', '直播列表', '2020-12-30 17:33:30', 1, 3, '/live/decorate_live' from vendor_resources;
31
+
32
+-- 根据vendor_resources 配置
33
+-- INSERT INTO `b2b2c`.`vendor_resources_roles`
34
+-- select max(resources_roles_id)+1 resources_roles_id,680, 2,'2021-04-22 15:25:28' from vendor_resources_roles ;
35
+-- INSERT INTO `b2b2c`.`vendor_resources_roles`
36
+-- select max(resources_roles_id)+1 resources_roles_id,681, 2,'2021-04-22 15:25:28' from vendor_resources_roles ;
37
+-- INSERT INTO `b2b2c`.`vendor_resources_roles`
38
+-- select max(resources_roles_id)+1 resources_roles_id,682, 2,'2021-04-22 15:25:28' from vendor_resources_roles ;