From 44abacfc0c743eb95b9ea620f1634dd07890426b Mon Sep 17 00:00:00 2001 From: liujiming <liujm@wealthgrow.cn> Date: Mon, 9 Aug 2021 15:10:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=B8=93=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/beans/req/theme/CreateThemeReq.java | 2 +- .../FeignBackClientForCommunity.java | 25 ++++ .../community/FeignClientForCommunity.java | 18 +++ .../tanpu/community/manager/ThemeManager.java | 114 ++++++++++++++---- 4 files changed, 134 insertions(+), 25 deletions(-) create mode 100644 community-service/src/main/java/com/tanpu/community/feign/community/FeignBackClientForCommunity.java create mode 100644 community-service/src/main/java/com/tanpu/community/feign/community/FeignClientForCommunity.java diff --git a/community-api/src/main/java/com/tanpu/community/api/beans/req/theme/CreateThemeReq.java b/community-api/src/main/java/com/tanpu/community/api/beans/req/theme/CreateThemeReq.java index 71ab8cf..68ac77b 100644 --- a/community-api/src/main/java/com/tanpu/community/api/beans/req/theme/CreateThemeReq.java +++ b/community-api/src/main/java/com/tanpu/community/api/beans/req/theme/CreateThemeReq.java @@ -30,7 +30,7 @@ public class CreateThemeReq { @ApiModelProperty(value = "ä¿®æ”¹ï¼Œåˆ™ä¼ å…¥æ£åœ¨ç¼–辑的ThemeId") private String editThemeId = ""; - @ApiModelProperty("是å¦åŒæ¥åˆ°ç¤¾åŒº 0为ä¸åŒæ¥ 1ä¸ºåŒæ¥ 默认ä¸åŒæ¥") + @ApiModelProperty("是å¦åŒæ¥åˆ°ç¤¾åŒº 0ä¸ºåŒæ¥ 1为ä¸åŒæ¥ ä¸ä¼ ä¹Ÿä¸ºåŒæ¥") private Integer syncToNewComm = 0; } diff --git a/community-service/src/main/java/com/tanpu/community/feign/community/FeignBackClientForCommunity.java b/community-service/src/main/java/com/tanpu/community/feign/community/FeignBackClientForCommunity.java new file mode 100644 index 0000000..95b993f --- /dev/null +++ b/community-service/src/main/java/com/tanpu/community/feign/community/FeignBackClientForCommunity.java @@ -0,0 +1,25 @@ +package com.tanpu.community.feign.community; + +import com.tanpu.common.api.CommonResp; +import com.tanpu.community.api.beans.vo.feign.newsfeed.NewsFeedSave4NewCommReq; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class FeignBackClientForCommunity implements FallbackFactory<FeignClientForCommunity> { + + @Override + public FeignClientForCommunity create(Throwable throwable) { + return new FeignClientForCommunity() { + @Override + public CommonResp saveNewsFeed4NewComm(NewsFeedSave4NewCommReq req) { + log.error("请求信æ¯", throwable); + log.error("FeignBackClientForCommunity.saveNewsFeed4NewComm-åŒæ¥ä¸“æ 频ids:{}", req.getNewsFeedId()); + return null; + } + + }; + } +} diff --git a/community-service/src/main/java/com/tanpu/community/feign/community/FeignClientForCommunity.java b/community-service/src/main/java/com/tanpu/community/feign/community/FeignClientForCommunity.java new file mode 100644 index 0000000..b32ce1b --- /dev/null +++ b/community-service/src/main/java/com/tanpu/community/feign/community/FeignClientForCommunity.java @@ -0,0 +1,18 @@ +package com.tanpu.community.feign.community; + +import com.tanpu.common.api.CommonResp; +import com.tanpu.community.api.beans.vo.feign.newsfeed.NewsFeedSave4NewCommReq; +import io.swagger.annotations.ApiOperation; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; + +@FeignClient(value = "service-community", contextId = "community", fallbackFactory = FeignBackClientForCommunity.class, url = "http://tp-community-svc", path = "/community") +// @FeignClient(value = "service-community", contextId = "community", fallbackFactory = FeignBackClientForCommunity.class, url = "http://127.0.0.1:8202/community") +public interface FeignClientForCommunity { + + + @ApiOperation("å‘布专æ 圈å用feign") + @PostMapping("/newsFeed/save4NewComm") + CommonResp saveNewsFeed4NewComm(NewsFeedSave4NewCommReq req); + +} diff --git a/community-service/src/main/java/com/tanpu/community/manager/ThemeManager.java b/community-service/src/main/java/com/tanpu/community/manager/ThemeManager.java index 48b4c2a..75b78a3 100644 --- a/community-service/src/main/java/com/tanpu/community/manager/ThemeManager.java +++ b/community-service/src/main/java/com/tanpu/community/manager/ThemeManager.java @@ -1,5 +1,7 @@ package com.tanpu.community.manager; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.type.TypeReference; import com.google.common.collect.Sets; import com.tanpu.biz.common.enums.RelTypeEnum; @@ -47,14 +49,26 @@ import com.tanpu.community.util.TimeUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.FileSystemResource; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; +import java.io.File; import java.util.*; import java.util.stream.Collectors; @@ -63,6 +77,10 @@ import static com.tanpu.community.api.constants.RedisKeyConstant.*; @Slf4j @Service public class ThemeManager { + + @Value("${tmpfile.dir:/data/tmp/}") + private String tmpDir; + @Resource private ThemeService themeService; @@ -105,6 +123,9 @@ public class ThemeManager { @Autowired private RecommendService recommendService; + @Resource + private RestTemplate restTemplate; + public ThemeFullSearchResp themeFullSearch(String keyword, Integer pageNo, Integer pageSize, String ident, String userId) { List<String> excludeIds; if (pageNo > 1) { @@ -150,7 +171,6 @@ public class ThemeManager { } - /** * å‘表主题(修改) */ @@ -160,7 +180,7 @@ public class ThemeManager { // æ ¡éªŒå‚æ•° checkAttachment(req.getContent()); // è½¬æ’æƒé™æ ¡éªŒ - liveRelayCheck(userId,req.getContent()); + liveRelayCheck(userId, req.getContent()); // ä¿å˜ä¸»é¢˜è¡¨ ThemeEntity themeEntity = new ThemeEntity(); @@ -175,7 +195,10 @@ public class ThemeManager { // 新建 themeService.insertTheme(themeEntity); // åŒæ¥åˆ°ä¸“æ - convertToNewsFeed(req, themeEntity.getThemeId()); + if (0 == req.getSyncToNewComm()) { + convertToNewsFeed(req, themeEntity.getThemeId(), userId); + } + } else { // 修改 themeService.update(themeEntity, req.getEditThemeId()); @@ -201,27 +224,25 @@ public class ThemeManager { return CreateThemeResp.builder().themeId(themeEntity.getThemeId()).build(); } - private void convertToNewsFeed(CreateThemeReq req, String themeId) { - if (!ThemeTypeEnum.DISCUSSION.getCode().equals(req.getThemeType())){ + private void convertToNewsFeed(CreateThemeReq req, String themeId, String userId) { + if (!ThemeTypeEnum.DISCUSSION.getCode().equals(req.getThemeType())) { // åªæœ‰è®¨è®ºç±»åž‹æ‰èƒ½åŒæ¥ä¸“æ throw new BizException("é•¿æ–‡ç±»åž‹æ— æ³•åŒæ¥ä¸“æ "); } NewsFeedSave4NewCommReq convertReq = new NewsFeedSave4NewCommReq(); - convertReq.setNewsFeedId(CommunityConstant.THEME_PREFIX+themeId); + convertReq.setNewsFeedId(CommunityConstant.THEME_PREFIX + themeId); ArrayList<NewsFeedResReq> feedList = new ArrayList<>(); for (ThemeContentReq themeContentReq : req.getContent()) { // æ–‡å—å†…å®¹æ·»åŠ åˆ°content - if (RelTypeEnum.TEXT.type.equals(themeContentReq.getType())){ + if (RelTypeEnum.TEXT.type.equals(themeContentReq.getType())) { convertReq.setContent(themeContentReq.getValue()); - }else if (RelTypeEnum.MULTIPLE_IMAGE.type.equals(themeContentReq.getType())){ + } else if (RelTypeEnum.MULTIPLE_IMAGE.type.equals(themeContentReq.getType())) { List<ImagesDTO> imgList = themeContentReq.getImgList(); - imgList.forEach(img->feedList.add(NewsFeedResReq.builder() - .remark(img.getRemark()) - .relType(Integer.parseInt(RelTypeEnum.IMAGE_FILE.type)) - .relId(img.getRelId()) //todo ä¸Šä¼ æ–‡ä»¶å¹¶æ›¿æ¢id - .build())); - }else { + imgList.forEach(img -> { + feedList.add(convertImg(img, userId)); + }); + } else { //其他类型的附件 feedList.add(NewsFeedResReq.builder().relType(Integer.parseInt(themeContentReq.getType())) .relId(themeContentReq.getValue()) @@ -235,19 +256,64 @@ public class ThemeManager { } + private NewsFeedResReq convertImg(ImagesDTO img, String userId) { - private void convertImg(ImagesDTO img,String userId){ - HashMap map = new HashMap<>(); - // todo 图片类型 - map.put("filetype","jpg"); - map.put("refid",img.getRelId()); - map.put("mode",0); - map.put("userId",userId); - } + ResponseEntity<byte[]> resp = restTemplate.getForEntity(img.getRemark(), byte[].class); + byte[] rst = resp.getBody(); + String fileName = tmpDir + System.currentTimeMillis() + ".tmp"; + File f = new File(fileName); + try { + FileUtils.writeByteArrayToFile(f, rst); + + // è°ƒç”¨å¯¹æ–¹æŽ¥å£ + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + headers.set("uid", userId); + MultiValueMap<String, Object> params = new LinkedMultiValueMap<String, Object>(); + HashMap<String, Object> item = new HashMap<>(); + // todo 图片类型 + item.put("filetype", "jpg"); + item.put("refid", img.getRelId()); + item.put("mode", 0); + item.put("userId", userId); + FileSystemResource br = new FileSystemResource(f); + + params.add("file", br); + params.add("item", item); + HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(params, headers); + // tp-community-svc + ResponseEntity<String> response = restTemplate.exchange("http://127.0.0.1:8090/fatools/h5/rest/common/uploadSingleFile", HttpMethod.POST, requestEntity, String.class); + log.info("new-community uploadThemePic returns {}", JSON.toJSONString(response)); + if (StringUtils.isBlank(response.getBody())) { + throw new RuntimeException("response body is blank"); + } + CommonResp<JSONObject> ret = JSON.parseObject(response.getBody(), CommonResp.class); + if (!ret.isSuccess()) { + throw new RuntimeException("reponse is not success"); + } + JSONObject commonResult = ret.getData(); + NewsFeedResReq newsFeedResReq = new NewsFeedResReq(); + newsFeedResReq.setRelId(commonResult.getString("fileId")); + newsFeedResReq.setRelType(Integer.parseInt(RelTypeEnum.IMAGE_FILE.type)); + newsFeedResReq.setRemark(commonResult.getString("fileurl")); + return newsFeedResReq; + + } catch (Exception e) { + log.error("error in handleSyncImg for imgUrl: {}", img.getRemark(), e); + throw new RuntimeException(e); + } finally { + try { + FileUtils.forceDelete(f); + } catch (Exception e) { + // do nothing + } + } + + } /** @@ -604,14 +670,14 @@ public class ThemeManager { // æ ¡éªŒå‚æ•° checkAttachment(req.getContent()); // è½¬æ’æƒé™æ ¡éªŒ - liveRelayCheck(userId,req.getContent()); + liveRelayCheck(userId, req.getContent()); // ä¿å˜ä¸»é¢˜è¡¨ ThemeEntity themeEntity = new ThemeEntity(); BeanUtils.copyProperties(req, themeEntity); themeEntity.setAuthorId(userId); themeEntity.setContent(JsonUtil.toJson(req.getContent())); - themeEntity.setThemeId(CommunityConstant.THEME_PREFIX+req.getEditThemeId()); + themeEntity.setThemeId(CommunityConstant.THEME_PREFIX + req.getEditThemeId()); themeService.insertTheme(themeEntity); // ä¿å˜é™„件表 -- 2.18.1