|
@@ -2,45 +2,50 @@ package com.slodon.b2b2c.controller.live;
|
2
|
2
|
|
3
|
3
|
|
4
|
4
|
import com.alibaba.fastjson.JSON;
|
|
5
|
+import com.alibaba.fastjson.JSONArray;
|
5
|
6
|
import com.alibaba.fastjson.JSONObject;
|
6
|
|
-import com.slodon.b2b2c.controller.common.UploadController;
|
7
|
|
-import com.slodon.b2b2c.core.constant.ResponseConst;
|
8
|
7
|
import com.slodon.b2b2c.core.controller.BaseController;
|
|
8
|
+import com.slodon.b2b2c.core.exception.MallException;
|
9
|
9
|
import com.slodon.b2b2c.core.response.JsonResult;
|
10
|
10
|
import com.slodon.b2b2c.core.response.PageVO;
|
11
|
11
|
import com.slodon.b2b2c.core.response.PagerInfo;
|
12
|
12
|
import com.slodon.b2b2c.core.response.SldResponse;
|
13
|
13
|
import com.slodon.b2b2c.core.util.*;
|
|
14
|
+import com.slodon.b2b2c.dao.read.goods.GoodsReadMapper;
|
14
|
15
|
import com.slodon.b2b2c.enums.WxLiveGoodsEnum;
|
15
|
16
|
import com.slodon.b2b2c.enums.WxLiveUrlEnum;
|
16
|
17
|
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;
|
|
18
|
+import com.slodon.b2b2c.goods.example.GoodsExample;
|
|
19
|
+import com.slodon.b2b2c.goods.pojo.Goods;
|
|
20
|
+import com.slodon.b2b2c.live.dto.LiveGoodsInfoDto;
|
|
21
|
+import com.slodon.b2b2c.live.example.LiveGoodsExample;
|
|
22
|
+import com.slodon.b2b2c.live.pojo.LiveGoods;
|
20
|
23
|
import com.slodon.b2b2c.live.vo.LivesVO;
|
21
|
|
-import com.slodon.b2b2c.model.live.LiveBroadModel;
|
|
24
|
+import com.slodon.b2b2c.model.live.LiveGoodsModel;
|
22
|
25
|
import com.slodon.b2b2c.seller.pojo.Vendor;
|
|
26
|
+import com.slodon.b2b2c.util.ThumbnailsUtils;
|
23
|
27
|
import io.swagger.annotations.Api;
|
24
|
28
|
import io.swagger.annotations.ApiImplicitParam;
|
25
|
29
|
import io.swagger.annotations.ApiImplicitParams;
|
26
|
30
|
import io.swagger.annotations.ApiOperation;
|
27
|
31
|
import lombok.extern.slf4j.Slf4j;
|
28
|
|
-import org.apache.commons.beanutils.PropertyUtils;
|
29
|
32
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
30
|
|
-import org.springframework.util.CollectionUtils;
|
31
|
|
-import org.springframework.util.StringUtils;
|
32
|
33
|
import org.springframework.web.bind.annotation.GetMapping;
|
33
|
34
|
import org.springframework.web.bind.annotation.PostMapping;
|
34
|
35
|
import org.springframework.web.bind.annotation.RequestMapping;
|
35
|
36
|
import org.springframework.web.bind.annotation.RestController;
|
36
|
|
-import org.springframework.web.multipart.MultipartFile;
|
37
|
37
|
|
38
|
38
|
import javax.annotation.Resource;
|
|
39
|
+import javax.imageio.ImageIO;
|
39
|
40
|
import javax.servlet.http.HttpServletRequest;
|
|
41
|
+import java.awt.image.BufferedImage;
|
40
|
42
|
import java.io.File;
|
41
|
|
-import java.text.ParseException;
|
42
|
43
|
import java.text.SimpleDateFormat;
|
43
|
|
-import java.util.*;
|
|
44
|
+import java.util.ArrayList;
|
|
45
|
+import java.util.HashMap;
|
|
46
|
+import java.util.List;
|
|
47
|
+import java.util.Map;
|
|
48
|
+import java.util.stream.Collectors;
|
44
|
49
|
|
45
|
50
|
@Api(tags = "admin-微信商品管理")
|
46
|
51
|
@RestController
|
|
@@ -53,9 +58,9 @@ public class LiveGoodsController extends BaseController {
|
53
|
58
|
@Resource
|
54
|
59
|
private StringRedisTemplate stringRedisTemplate;
|
55
|
60
|
@Resource
|
56
|
|
- private LiveBroadModel liveBroadModel;
|
|
61
|
+ private LiveGoodsModel liveGoodsModel;
|
57
|
62
|
@Resource
|
58
|
|
- private UploadController uploadController;
|
|
63
|
+ private GoodsReadMapper goodsReadMapper;
|
59
|
64
|
|
60
|
65
|
private String getToken() throws Exception {
|
61
|
66
|
String appId = stringRedisTemplate.opsForValue().get("login_wx_mini_appid");
|
|
@@ -68,36 +73,195 @@ public class LiveGoodsController extends BaseController {
|
68
|
73
|
}
|
69
|
74
|
|
70
|
75
|
@ApiOperation("商品添加并提审")
|
|
76
|
+ @ApiImplicitParams({
|
|
77
|
+ @ApiImplicitParam(name = "goodsIds", value = "商品Id集合,用逗号隔开", required = true, paramType = "query")
|
|
78
|
+ })
|
71
|
79
|
@PostMapping("/add")
|
72
|
|
- public JsonResult wxBroadcastRoomCreate(HttpServletRequest request,LiveBroadcastDto liveBroadcastDto) {
|
|
80
|
+ public JsonResult addGoodsCreate(HttpServletRequest request, String goodsIds) throws Exception {
|
73
|
81
|
HashMap<String, String> resultMap = new HashMap<>();
|
|
82
|
+ //获取token
|
|
83
|
+ String access_token = getToken();
|
|
84
|
+ Vendor vendor = UserUtil.getUser(request, Vendor.class);
|
|
85
|
+ if (vendor == null || vendor.getVendorId() == null){
|
|
86
|
+ return SldResponse.fail("获取商户id失败");
|
|
87
|
+ }
|
|
88
|
+ AssertUtil.notEmpty(goodsIds, "添加商品ID不能为空,请重试");
|
|
89
|
+ GoodsExample goodsExample = new GoodsExample();
|
|
90
|
+ goodsExample.setGoodsIdIn(goodsIds);
|
|
91
|
+ List<Goods> goods = goodsReadMapper.listByExample(goodsExample);
|
|
92
|
+ for (Goods good:goods) {
|
|
93
|
+ addLiveGood(access_token, vendor, good);
|
|
94
|
+ }
|
|
95
|
+ return SldResponse.success(resultMap);
|
|
96
|
+ }
|
|
97
|
+
|
|
98
|
+ private void addLiveGood(String access_token, Vendor vendor, Goods good) throws Exception {
|
|
99
|
+ LiveGoodsInfoDto liveGoodsInfoDto = new LiveGoodsInfoDto();
|
|
100
|
+ liveGoodsInfoDto.setVendorId(String.valueOf(vendor.getVendorId()));
|
|
101
|
+ String url = WxLiveUrlEnum.TEMP_UPLOAD.getUrl();
|
|
102
|
+ url = url.replace("ACCESS_TOKEN", access_token).replace("TYPE","image");
|
|
103
|
+ String mainImage = good.getMainImage();
|
|
104
|
+ BufferedImage image = ImageIO.read(new File(mainImage));
|
|
105
|
+// BufferedImage image = ImageIO.read(new File("D:\\ytf\\coverImg.jpg"));
|
|
106
|
+ BufferedImage bufferedImage = ThumbnailsUtils.resizeImageOne(image, 300, 300);
|
|
107
|
+ String goodName = good.getGoodsName().length()>14?good.getGoodsName().substring(0,13):good.getGoodsName();
|
|
108
|
+ File file = File.createTempFile(goodName, ".jpg");
|
|
109
|
+ ImageIO.write(bufferedImage, "jpg", file);
|
|
110
|
+ String result = FileUploadUtil.postUploadSSL(url, file, file.getName());
|
|
111
|
+ JSONObject jsonObject = JSONObject.parseObject(result);
|
|
112
|
+ liveGoodsInfoDto.setCoverImgUrl(jsonObject.getString("media_id"));
|
|
113
|
+ liveGoodsInfoDto.setLocalGoodsId(String.valueOf(good.getGoodsId()));
|
|
114
|
+ liveGoodsInfoDto.setName(goodName);
|
|
115
|
+ liveGoodsInfoDto.setPrice(String.valueOf(good.getGoodsPrice()));
|
|
116
|
+ liveGoodsInfoDto.setUrl("pages/index/index");
|
|
117
|
+ Map map = new HashMap();
|
|
118
|
+ map.put("goodsInfo",liveGoodsInfoDto);
|
|
119
|
+ url = WxLiveGoodsEnum.ADD.getUrl()+ access_token;
|
|
120
|
+ log.info("json: "+JSON.toJSONString(map));
|
|
121
|
+ String reStr = null;
|
|
122
|
+ reStr = HttpClientUtil.sendJsonPostNew(url, JSON.toJSONString(map));
|
|
123
|
+ jsonObject = JSONObject.parseObject(reStr);
|
|
124
|
+ String errCode = jsonObject.getString("errcode");
|
|
125
|
+ if (!"0".equals(errCode)){
|
|
126
|
+ log.warn("直播间商品添加失败原因:"+reStr);
|
|
127
|
+ throw new MallException("商品名称:"+good.getGoodsName()+", 失败原因:"+WxCodeError.WX_CODE.get(errCode));
|
|
128
|
+ }
|
|
129
|
+ liveGoodsInfoDto.setGoodsId(jsonObject.getInteger("goodsId"));
|
|
130
|
+ liveGoodsInfoDto.setAuditId(jsonObject.getInteger("auditId"));
|
|
131
|
+
|
|
132
|
+ liveGoodsModel.addGoodsCreate(liveGoodsInfoDto);
|
|
133
|
+ }
|
|
134
|
+
|
|
135
|
+ @ApiOperation("获取直播商品列表")
|
|
136
|
+ @ApiImplicitParams({
|
|
137
|
+ @ApiImplicitParam(name = "name", value = "直播商品名称", paramType = "query"),
|
|
138
|
+ @ApiImplicitParam(name = "auditStatus", value = "直播商品状态", paramType = "query"),
|
|
139
|
+ @ApiImplicitParam(name = "pageSize", value = "分页大小", defaultValue = "20", paramType = "query"),
|
|
140
|
+ @ApiImplicitParam(name = "current", value = "当前页面位置", defaultValue = "1", paramType = "query")
|
|
141
|
+ })
|
|
142
|
+ @GetMapping("/list")
|
|
143
|
+ public JsonResult<PageVO<LiveGoods>> getList(HttpServletRequest request, String name,Integer auditStatus) {
|
|
144
|
+ Vendor vendor = UserUtil.getUser(request, Vendor.class);
|
|
145
|
+ PagerInfo pager = WebUtil.handlerPagerInfo(request);
|
|
146
|
+ LiveGoodsExample example = new LiveGoodsExample();
|
|
147
|
+ example.setName(name);
|
|
148
|
+ //获取审核通过商品
|
|
149
|
+ if (auditStatus != null && auditStatus == 2){
|
|
150
|
+ example.setAuditStatus(2);
|
|
151
|
+ }
|
|
152
|
+ if (vendor != null && vendor.getVendorId() != null){
|
|
153
|
+ example.setVendorId(String.valueOf(vendor.getVendorId()));
|
|
154
|
+ }
|
|
155
|
+ List<LiveGoods> livesList = liveGoodsModel.getLivesList(example, pager);
|
|
156
|
+ livesList.stream().map(item->{
|
|
157
|
+ item.setAuditStatusName(getLiveGoodsStatusName(item.getAuditStatus()));
|
|
158
|
+ return item;
|
|
159
|
+ }).collect(Collectors.toList());
|
|
160
|
+
|
|
161
|
+ return SldResponse.success(new PageVO<>(livesList, pager));
|
|
162
|
+ }
|
|
163
|
+
|
|
164
|
+ @ApiOperation("获取绑定直播商品列表")
|
|
165
|
+ @ApiImplicitParams({
|
|
166
|
+ @ApiImplicitParam(name = "name", value = "直播商品名称", paramType = "query"),
|
|
167
|
+ @ApiImplicitParam(name = "roomId", value = "直播间id", paramType = "query")
|
|
168
|
+ })
|
|
169
|
+ @GetMapping("/list/relation")
|
|
170
|
+ public JsonResult<PageVO<LiveGoods>> getListRelation(HttpServletRequest request, String name, Integer roomId) {
|
|
171
|
+ PagerInfo pager = WebUtil.handlerPagerInfo(request);
|
|
172
|
+ if (roomId == null || roomId == 0){
|
|
173
|
+ return SldResponse.fail("直播间获取失败");
|
|
174
|
+ }
|
|
175
|
+ List<LiveGoods> livesList = liveGoodsModel.getListRelation(name,roomId);
|
|
176
|
+
|
|
177
|
+ return SldResponse.success(new PageVO<>(livesList, pager));
|
|
178
|
+ }
|
|
179
|
+ private String getLiveGoodsStatusName(Integer liveStatus){
|
|
180
|
+ switch (liveStatus){
|
|
181
|
+ case 0: return "未审核";
|
|
182
|
+ case 1: return "审核中";
|
|
183
|
+ case 2: return "审核通过";
|
|
184
|
+ case 3: return "审核失败";
|
|
185
|
+ default:return "状态异常";
|
|
186
|
+ }
|
|
187
|
+ };
|
|
188
|
+
|
|
189
|
+ @ApiOperation("删除直播间商品")
|
|
190
|
+ @ApiImplicitParams({
|
|
191
|
+ @ApiImplicitParam(name = "goodsId", value = "商品ID", paramType = "query"),
|
|
192
|
+ })
|
|
193
|
+ @GetMapping("/wxDelLive")
|
|
194
|
+ public JsonResult wxDelLiveGood(HttpServletRequest request,Integer goodsId) {
|
74
|
195
|
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
|
196
|
String access_token = getToken();
|
85
|
|
- String url = WxLiveGoodsEnum.ADD.getUrl()+access_token;
|
86
|
|
- String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(liveBroadcastDto));
|
|
197
|
+ //校验
|
|
198
|
+ String url = WxLiveGoodsEnum.DEL.getUrl()+access_token;
|
|
199
|
+ String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(new HashMap<>().put("goodsId",goodsId)));
|
87
|
200
|
JSONObject jsonObject = JSONObject.parseObject(reStr);
|
88
|
201
|
String errCode = jsonObject.getString("errcode");
|
89
|
202
|
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));
|
|
203
|
+ return SldResponse.fail(WxCodeError.WX_CODE.get(errCode));
|
94
|
204
|
}
|
95
|
|
- liveBroadcastDto.setRoomId(String.valueOf(jsonObject.get("roomId")));
|
96
|
|
- liveBroadModel.broadcastRoomCreate(liveBroadcastDto);
|
|
205
|
+ liveGoodsModel.wxDelLiveGood(goodsId);
|
|
206
|
+ return SldResponse.success("删除成功");
|
97
|
207
|
} catch (Exception e) {
|
98
|
208
|
e.printStackTrace();
|
99
|
209
|
}
|
100
|
|
- return SldResponse.success(resultMap);
|
|
210
|
+ return SldResponse.success("删除失败");
|
101
|
211
|
}
|
102
|
212
|
|
|
213
|
+ /**
|
|
214
|
+ * 获取直播商品状态进行更新
|
|
215
|
+ * @return
|
|
216
|
+ */
|
|
217
|
+ public boolean jobUpdateLiveGoodsType() {
|
|
218
|
+ //获取需要修改的ids
|
|
219
|
+ List<Integer> ids = liveGoodsModel.getLivesGoodsIds();
|
|
220
|
+ //每次最多20个所以需要拆分
|
|
221
|
+ List<List<Integer>> lists = new ArrayList<>();
|
|
222
|
+ List<Integer> updateIds = new ArrayList<>();
|
|
223
|
+ for (int i = 0; i <ids.size() ; i++) {
|
|
224
|
+ updateIds.add(ids.get(i));
|
|
225
|
+ //20个插入一组 或 最后一组不满20也插入
|
|
226
|
+ if((i+1)%20==0 || i == ids.size()-1){
|
|
227
|
+ lists.add(updateIds);
|
|
228
|
+ updateIds = new ArrayList<>();
|
|
229
|
+ }
|
|
230
|
+ }
|
|
231
|
+
|
|
232
|
+ try {
|
|
233
|
+ String access_token = getToken();
|
|
234
|
+ //校验
|
|
235
|
+ String url = WxLiveGoodsEnum.GET_GOODS_WARE_HOUSE.getUrl()+access_token;
|
|
236
|
+ for (List<Integer> i:lists) {
|
|
237
|
+ Map m = new HashMap<>();
|
|
238
|
+ m.put("goods_ids",i);
|
|
239
|
+ String reStr = HttpClientUtil.sendJsonPostNew(url,JSON.toJSONString(m));
|
|
240
|
+ JSONObject jsonObject = JSONObject.parseObject(reStr);
|
|
241
|
+ String errCode = jsonObject.getString("errcode");
|
|
242
|
+ if (!"0".equals(errCode)){
|
|
243
|
+ log.warn("直播商品状态更新错误日志:"+WxCodeError.WX_CODE.get(errCode));
|
|
244
|
+ continue;
|
|
245
|
+ }
|
|
246
|
+ //修改商品状态
|
|
247
|
+ updateGoodsType(jsonObject);
|
|
248
|
+ }
|
|
249
|
+ } catch (Exception e) {
|
|
250
|
+ e.printStackTrace();
|
|
251
|
+ }
|
|
252
|
+ return true;
|
|
253
|
+ }
|
|
254
|
+
|
|
255
|
+ private void updateGoodsType(JSONObject jsonObject) {
|
|
256
|
+ JSONArray roomInfos = jsonObject.getJSONArray("goods");
|
|
257
|
+ List<LiveGoods> liveGoodsList = new ArrayList<>();
|
|
258
|
+ for (int i = 0; i < roomInfos.size(); i++) {
|
|
259
|
+ JSONObject infosJSONObject = roomInfos.getJSONObject(i);
|
|
260
|
+ LiveGoods liveGoods = new LiveGoods();
|
|
261
|
+ liveGoods.setGoodsId(infosJSONObject.getInteger("goods_id"));
|
|
262
|
+ liveGoods.setAuditStatus(infosJSONObject.getInteger("audit_status"));
|
|
263
|
+ liveGoodsList.add(liveGoods);
|
|
264
|
+ }
|
|
265
|
+ liveGoodsModel.updateLivesGoodsType(liveGoodsList);
|
|
266
|
+ }
|
103
|
267
|
}
|