dengsixing пре 3 година
родитељ
комит
5b50fc2560

+ 4 - 0
4dkankan-center-auth/src/main/resources/bootstrap.yml

@@ -19,6 +19,10 @@ spring:
           - data-id: common-redis-config.yaml
             group: DEFAULT_GROUP
             refresh: true
+
+          - data-id: other-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
       discovery:
         server-addr: 192.168.0.47:8848
         namespace: 4dkankan-dev

+ 5 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/bean/SceneJsonBean.java

@@ -112,4 +112,9 @@ public class SceneJsonBean {
 
     private String cadInfo;
 
+    /**
+     * 是否有热点
+     */
+    private Byte hots;
+
 }

+ 2 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/FolderController.java

@@ -17,5 +17,7 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/scene/folder")
 public class FolderController {
 
+
+
 }
 

+ 1 - 1
4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/SceneEditController.java

@@ -221,7 +221,7 @@ public class SceneEditController extends BaseController {
      * @return com.fdkankan.common.response.ResultData
      **/
     @PostMapping(value = "/saveHot")
-    public ResultData saveHot(@RequestBody SceneEditParamVO param) throws Exception {
+    public ResultData saveHot(@RequestBody @Validated SaveHotParamVO param) throws Exception {
         return sceneProService.saveHot(param);
     }
 

+ 7 - 3
4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/TestController.java

@@ -5,6 +5,7 @@ import com.alibaba.csp.sentinel.annotation.SentinelResource;
 import com.alibaba.druid.pool.DruidDataSource;
 import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.common.constant.ConstantFilePath;
+import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.response.ResultData;
 import com.fdkankan.common.util.MatrixToImageWriterUtil;
 import com.fdkankan.common.util.StrExtUtil;
@@ -75,12 +76,15 @@ public class TestController {
 //        for (int i = 0; i< 10; i++){
 //            rocketMQProducer.syncSend("qwe",i+"",  "消息体"+i);
 //        }
-//        String test = null;
-//        test.equals("123");
+        String test = "123";
+//        if(test.equals("123")){
+//            throw new BusinessException(-1, "dsfasdfsdf");
+//
+//        }
 //        String ruleDir = System.getProperty("user.dir");
 //        ResultData<String> test = platformGoodsClient.test();
 
-        System.out.println("gghhjjkkllll");
+//        System.out.println("gghhjjkkllll");
         return "123";
 
     }

+ 2 - 1
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/ISceneProService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.common.response.ResultData;
 import com.fdkankan.scene.entity.ScenePro;
 import com.fdkankan.scene.entity.SceneProPO;
+import com.fdkankan.scene.vo.SaveHotParamVO;
 import com.fdkankan.scene.vo.SceneEditParamVO;
 import com.fdkankan.scene.vo.SceneParamVO;
 import com.fdkankan.scene.vo.SceneVO;
@@ -81,7 +82,7 @@ public interface ISceneProService extends IService<ScenePro> {
 
     ResultData uploadHotMedia(FileParamVO param, MultipartFile file) throws Exception;
 
-    ResultData saveHot(SceneEditParamVO base) throws Exception;
+    ResultData saveHot(SaveHotParamVO param) throws Exception;
 
     ResultData saveShopHot(SceneEditParamVO base) throws Exception;
 

+ 15 - 1
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java

@@ -24,6 +24,8 @@ import com.fdkankan.scene.service.ISceneEditControlsService;
 import com.fdkankan.scene.service.ISceneEditInfoService;
 import com.fdkankan.scene.service.ISceneProService;
 import com.fdkankan.scene.vo.*;
+import com.google.errorprone.annotations.Var;
+import java.util.Map;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -129,6 +131,18 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             sceneJson.setFloorPlanStatus(CommonStatus.YES.code());
         }
 
+        //标识是否有热点
+        sceneJson.setHots(CommonStatus.NO.code());
+        String hotDataKey = String.format(RedisKey.SCENE_HOT_DATA, param.getNum());
+        Map<String, String> hmget = redisUtil.hmget(hotDataKey);
+        for (String key : hmget.keySet()) {
+            if(StrUtil.isEmpty(hmget.get(key))){
+                continue;
+            }
+            sceneJson.setHots(CommonStatus.YES.code());
+            break;
+        }
+
         //上传sceneJson文件
         String sceneJsonPath = String.format(ConstantFilePath.SCENE_VIEW_DATA_DATA_SCENEJSON, sceneNum);
         uploadToOssUtil.upload(JSON.toJSONBytes(sceneJson), sceneJsonPath);
@@ -149,7 +163,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
     }
 
     @Override
-    public SceneInfoVO getSceneInfo(SceneInfoParamVO param) {
+    public SceneInfoVO getSceneInfo(@Var SceneInfoParamVO param) {
         SceneInfoReqType sceneInfoReqType = SceneInfoReqType.get(param.getReqType());
         switch (sceneInfoReqType){
             //如果是编辑页面请求,查数据库

+ 88 - 141
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -21,15 +22,18 @@ import com.fdkankan.common.constant.*;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.response.ResultData;
 import com.fdkankan.common.util.*;
+import com.fdkankan.fyun.constant.StorageType;
 import com.fdkankan.fyun.oss.UploadToOssUtil;
 import com.fdkankan.platform.api.feign.PlatformGoodsClient;
 import com.fdkankan.redis.constant.RedisKey;
 import com.fdkankan.redis.constant.RedisLockKey;
 import com.fdkankan.redis.util.RedisLockUtil;
+import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.scene.entity.*;
 import com.fdkankan.scene.mapper.ISceneProMapper;
 import com.fdkankan.scene.service.*;
 import com.fdkankan.scene.vo.*;
+import com.google.common.collect.Lists;
 import lombok.extern.slf4j.Slf4j;
 import net.coobird.thumbnailator.Thumbnails;
 import org.apache.commons.lang3.StringUtils;
@@ -101,6 +105,8 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     @Autowired
     RedisLockUtil redisLockUtil;
     @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
     ISceneDataDownloadService sceneDataDownloadService;
     @Autowired
     PlatformGoodsClient platformGoodsClient;
@@ -2173,170 +2179,111 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         return ResultData.ok(fileName);
     }
 
+
     @Override
 //    @SystemServiceLog(description = "保存场景热点")
-    public ResultData saveHot(SceneEditParamVO base) throws Exception {
-        if(StrUtil.isEmpty(base.getType())){
-            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
-        }
+    public ResultData saveHot(SaveHotParamVO param) throws Exception {
 
-        String sid = base.getSid();
-
-        ScenePro scenePro = findBySceneNum(base.getNum());
-        if (scenePro == null ) {
+        ScenePro scenePro = this.findBySceneNum(param.getNum());
+        if (scenePro == null)
             return ResultData.error(ErrorCode.FAILURE_CODE_5005);
-        }
 
-        JSONObject jsonhot = JSONObject.parseObject(base.getHotData());
+        List<HotParamVO> hotDataList = param.getHotDataList();
+        Map<String, String> addOrUpdateMap = new HashMap<>();
+        List<String> deleteSidList = Lists.newArrayList();
+        hotDataList.stream().forEach(hotData -> {
+            if(hotData.getType().equals(OperationType.DELETE.code()))
+                deleteSidList.add(hotData.getSid());
+            else
+                addOrUpdateMap.put(hotData.getSid(), hotData.getHotData());
 
-        StringBuffer dataBuf = new StringBuffer()
-                .append("data").append(File.separator)
-                .append("data").append(scenePro.getNum())
-                .append(File.separator);
-        StringBuffer imagesBuf = new StringBuffer()
-                .append("images").append(File.separator)
-                .append("images").append(scenePro.getNum())
-                .append(File.separator);
+        });
 
-        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());
-        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());
+        //处理删除状态数据
+        this.deleteHotData(param.getNum(), deleteSidList);
 
-        String str = FileUtils.readFile(dataBuffer.toString() + "hot.json");
-        JSONArray jsonhots = null;
-        if (StrUtil.isNotEmpty(str)) {
-            jsonhots = JSONArray.parseArray(str);
-        }else {
-            File file = new File(dataBuffer.toString() + "hot.json");
-            if(!file.getParentFile().exists()){
-                file.getParentFile().mkdirs();
-            }
-            if(!file.exists()){
-                file.createNewFile();
-            }
-            jsonhots = new JSONArray();
-        }
+        //处理新增和修改数据
+        this.addOrUpdateHotData(param.getNum(), addOrUpdateMap);
 
-        //添加或者修改
-        if("1".equals(base.getType())){
-            sid = jsonhot.getString("sid");
-            if(StrUtil.isEmpty(sid)){
-                throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
-            }
-            jsonhots.add(jsonhot);
-        }
-        else if("0".equals(base.getType())){
-            sid = jsonhot.getString("sid");
-            if(StrUtil.isEmpty(sid)){
-                throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
-            }
-        }
-        else if("-1".equals(base.getType())){
-            if(StrUtil.isEmpty(sid)){
-                throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
-            }
-        }
-        //判断是否需要删除自定义热点样式
-        String[] styles = null;
-        if(StrUtil.isNotEmpty(base.getStyleName())){
-            styles = base.getStyleName().split(",");
-        }
 
-        for(int i=0;i<jsonhots.size();++i){
-            JSONObject ele = jsonhots.getJSONObject(i);
-            //名字对应上就删除
-            if(styles != null){
-                for(String style : styles){
-                    if(style.equals(ele.getString("styleId"))){
-                        jsonhots.getJSONObject(i).put("styleId", null);
-                        jsonhots.getJSONObject(i).put("style", "default");
-                        jsonhots.getJSONObject(i).put("styleImageURL", null);
-                    }
-                }
-            }
-            if(ele.getString("sid").equals(sid)){
-                if("-1".equals(base.getType())){
-                    jsonhots.remove(i);
-                    if(ele.containsKey("media")){
-                        String fileType = ele.getString("media");
-                        if(fileType.contains("photo"))
-                        {
-                            FileUtils.deleteFile(imagesBuffer.toString() + "hot"+sid+".jpg");
-                        }
-                        if(fileType.contains("audio") || fileType.contains("voice"))
-                        {
-                            FileUtils.deleteFile(imagesBuffer.toString() + "hot"+sid+".mp3");
-                        }
-                        if(fileType.contains("video"))
-                        {
-                            FileUtils.deleteFile(imagesBuffer.toString() + "hot"+sid+".mp4");
-                        }
-                    }
+        //更改场景编辑版本
+        sceneEditInfoService.update(
+            new LambdaUpdateWrapper<SceneEditInfo>()
+                .setSql("version=version+"+1)
+                .eq(SceneEditInfo::getSceneProId, scenePro.getId()));
 
-                    if(!"aws".equals(this.type)){
-                        JSONObject paramData = new JSONObject();
-                        paramData.put("hotId", sid);
-                        JSONObject hotListJson = JSONObject.parseObject(OkHttpUtils.httpGet(hotDomainList));
-                        if(hotListJson != null){
-                            JSONArray hotListArray = hotListJson.getJSONArray("data");
-                            if(hotListArray != null){
-                                for(int l = 0, len = hotListArray.size(); l < len; l++){
-                                    OkHttpUtils.httpPostJson(hotListArray.getString(l) + hotDelete + "?hotId=" + sid
-                                            , paramData.toJSONString());
-                                }
 
-                            }
-                        }
-                    }
+        return ResultData.ok();
+    }
 
-                }
-                else if("0".equals(base.getType())){
-                    jsonhots.set(i, jsonhot);
-                }
+    private void addOrUpdateHotData(String num, Map<String, String> addOrUpdateMap){
+        if(CollUtil.isEmpty(addOrUpdateMap))
+            return;
+
+        //数据验证,新增、修改状态,hotdata不能为空
+        for (String sid : addOrUpdateMap.keySet()) {
+            String hotData = addOrUpdateMap.get(sid);
+            if(StrUtil.isEmpty(hotData)){
+                throw new BusinessException(ErrorCode.FAILURE_CODE_7004);
             }
         }
 
-        FileUtils.deleteFile(dataBuffer.toString() + "hot.json");
-        File dataPath = new File(dataBuffer.toString());
-        if(!dataPath.exists()){
-            dataPath.mkdirs();
-        }
-        FileUtils.writeFile(dataBuffer.toString() + "hot.json", jsonhots.toString());
+        //批量写入缓存
+        String key = String.format(RedisKey.SCENE_HOT_DATA, num);
+        redisUtil.hmset(key, addOrUpdateMap);
+    }
 
-        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
-        JSONObject scenejson = new JSONObject();
-        if(strsceneInfos!=null){
-            scenejson = JSONObject.parseObject(strsceneInfos);
-        }
-        if(jsonhots.size()>0){
-            scenejson.put("hots", 1);
-        }
-        else{
-            scenejson.put("hots", 0);
-        }
 
-        if(!StrUtil.isEmpty(base.getCapData())){
-            FileUtils.writeFile(dataBuffer.toString() + "capData.json", new String(base.getCapData().getBytes(), "UTF-8"));
-            scenejson.put("capData", dataBuf.toString() + "capData.json");
-        }
+    private void deleteHotData(String num, List<String> deleteSidList) throws IOException {
+        //从redis中加载热点数据
+        String key = String.format(RedisKey.SCENE_HOT_DATA, num);
+        List<String> deletDataList = redisUtil.hMultiGet(key, deleteSidList);
+        if(CollUtil.isEmpty(deletDataList))
+            return;
+        String userDataPath = String.format(UploadFilePath.USER_EDIT_PATH, num);
 
-        if(!StrUtil.isEmpty(base.getFrameData())){
-            FileUtils.writeFile(dataBuffer.toString() + "frameData.json", new String(base.getFrameData().getBytes(), "UTF-8"));
-            scenejson.put("frameData", dataBuf.toString() + "frameData.json");
-        }
+        //删除图片音频视频等资源文件
+        for (String data : deletDataList) {
+            if(StrUtil.isBlank(data)){
+                continue;
+            }
+            JSONObject jsonObject = JSON.parseObject(data);
+            String sid = jsonObject.getString("sid");
+            if(jsonObject.containsKey("media")){
+                String fileType = jsonObject.getString("media");
+                if(fileType.contains("photo"))
+                {
+                    uploadToOssUtil.delete(userDataPath + "hot"+sid+".jpg");
+                }
+                if(fileType.contains("audio") || fileType.contains("voice"))
+                {
+                    uploadToOssUtil.delete(userDataPath + "hot"+sid+".mp3");
+                }
+                if(fileType.contains("video"))
+                {
+                    uploadToOssUtil.delete(userDataPath + "hot"+sid+".mp4");
+                }
+            }
+            if(!StorageType.AWS.code().equals(this.type)){
+                JSONObject paramData = new JSONObject();
+                paramData.put("hotId", sid);
+                JSONObject hotListJson = JSONObject.parseObject(OkHttpUtils.httpGet(hotDomainList));
+                if(hotListJson != null){
+                    JSONArray hotListArray = hotListJson.getJSONArray("data");
+                    if(hotListArray != null){
+                        for(int l = 0, len = hotListArray.size(); l < len; l++){
+                            OkHttpUtils.httpPostJson(hotListArray.getString(l) + hotDelete + "?hotId=" + sid
+                                , paramData.toJSONString());
+                        }
 
-        if(!StrUtil.isEmpty(base.getPlayData())){
-            FileUtils.writeFile(dataBuffer.toString() + "playData.json", new String(base.getPlayData().getBytes(), "UTF-8"));
-            scenejson.put("playData", dataBuf.toString() + "playData.json");
+                    }
+                }
+            }
         }
 
-        if(!StrUtil.isEmpty(base.getScreencapThumb())){
-            FileUtils.writeFile(dataBuffer.toString() + "screencapThumb.json", new String(base.getScreencapThumb().getBytes(), "UTF-8"));
-            scenejson.put("screencapThumb", dataBuf.toString() + "screencapThumb.json");
-        }
 
-        scenejson.put("version", scenejson.getIntValue("version") + 1);
-        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());
-        return ResultData.ok();
+        //从redis中移除热点数据
+        redisUtil.hdel(key, deleteSidList.toArray());
     }
 
 

+ 29 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/vo/HotParamVO.java

@@ -0,0 +1,29 @@
+package com.fdkankan.scene.vo;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/2/8
+ **/
+@Data
+public class HotParamVO {
+
+    @NotNull(message = "操作类型不能为空")
+    private Integer type;
+
+    @NotBlank(message = "sid不能为空")
+    private String sid;
+
+    private String hotData;
+
+
+
+}

+ 29 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/vo/SaveHotParamVO.java

@@ -0,0 +1,29 @@
+package com.fdkankan.scene.vo;
+
+import java.util.List;
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * <p>
+ * 保存热点数据参数类
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/2/8
+ **/
+@Data
+public class SaveHotParamVO {
+
+    @NotBlank(message = "场景码不能为空")
+    private String num;
+
+    @Valid
+    @NotNull(message = "热点数据不能为空")
+    private List<HotParamVO> hotDataList;
+
+
+
+}

+ 2 - 35
4dkankan-common/src/main/java/com/fdkankan/common/exception/GlobalExceptionHandler.java

@@ -37,7 +37,7 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(value = Exception.class)
     public void exceptionHandler(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Exception e) throws Exception {
         try{
-            log.error("服务错误:", e);
+//            log.error("服务错误:", e);
 //            return ResultData.error(ServerCode.SYSTEM_ERROR.code(), ExceptionUtil.stacktraceToString(e, 3000));
             // http状态码
             httpServletResponse.setStatus(500);
@@ -56,39 +56,6 @@ public class GlobalExceptionHandler {
         }
     }
 
-    /**
-     * 限流熔断异常处理
-     */
-    @ResponseBody
-    @ExceptionHandler({FlowException.class, DegradeException.class})
-    public ResultData flowExceptionHandler(HttpServletRequest httpServletRequest, Exception e) {
-        String requestURI = httpServletRequest.getRequestURI();
-        String resource = null;
-        if(e instanceof FlowException){
-            resource = ((FlowException) e).getRule().getResource();
-        }
-        if(e instanceof DegradeException){
-            resource = ((DegradeException) e).getRule().getResource();
-        }
-
-        log.error("请求限流:requestURI{},resource:{}", requestURI, resource);
-        return ResultData.error(ServerCode.SYSTEM_ERROR.code(), "系统繁忙,请稍后重试");
-    }
-
-//    /**
-//     * 限流熔断异常处理
-//     */
-//    @ResponseBody
-//    @ExceptionHandler(value = FlowException.class)
-//    public ResultData flowExceptionHandler(HttpServletRequest httpServletRequest, FlowException e) {
-//        String requestURI = httpServletRequest.getRequestURI();
-//        String resource = e.getRule().getResource();;
-//        log.error("请求限流:requestURI{},resource:{}", requestURI, resource);
-//        return ResultData.error(ServerCode.SYSTEM_ERROR.code(), "系统繁忙,请稍后重试");
-//    }
-
-
-
 
     /**
      * 校验错误拦截处理
@@ -127,7 +94,7 @@ public class GlobalExceptionHandler {
     @ResponseBody
     @ExceptionHandler(value = BusinessException.class)
     public ResultData businessExceptionHandler(HttpServletRequest httpServletRequest, BusinessException e) {
-        log.info("业务异常code:" + e.getCode() + "msg:" + e.getMessage());
+        log.info("业务异常code:{},message:{}", e.getCode(), e.getMessage());
         return ResultData.error(e.getCode(), e.getMessage());
     }
 }

+ 7 - 1
4dkankan-common/src/main/java/com/fdkankan/common/response/BaseResponseAdvice.java

@@ -3,6 +3,8 @@ package com.fdkankan.common.response;
 
 import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.common.response.ResultData;
+import java.util.List;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.core.MethodParameter;
 import org.springframework.http.MediaType;
 import org.springframework.http.converter.HttpMessageConverter;
@@ -14,6 +16,7 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
 import java.util.Objects;
 
 @RestControllerAdvice
+@Slf4j
 public class BaseResponseAdvice implements ResponseBodyAdvice<Object> {
     @Override
     public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
@@ -25,7 +28,10 @@ public class BaseResponseAdvice implements ResponseBodyAdvice<Object> {
 //        if(serverHttpRequest.getURI().getPath().contains("feign")){
 //            return body;
 //        }
-        System.out.println("响应拦截成功");
+        log.info("响应拦截成功。。。");
+//        List<String> strings = serverHttpRequest.getHeaders().get("Accept-Language");
+//        System.out.println(strings.get(0));
+
         if(body instanceof String){
             return JSONObject.toJSONString(ResultData.ok(body));
         }

BIN
document/后端开发指南.docx