package com.fdkankan.scene.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.fdkankan.common.constant.CommonStatus; import com.fdkankan.common.constant.UploadFilePath; import com.fdkankan.redis.constant.RedisKey; import com.fdkankan.redis.util.RedisClient; import com.fdkankan.scene.bean.ResultData; import com.fdkankan.scene.bean.TagBean; import com.fdkankan.scene.entity.Scene; import com.fdkankan.scene.entity.SceneEditInfoExt; import com.fdkankan.scene.service.*; import com.fdkankan.scene.vo.BaseJsonArrayParamVO; import com.fdkankan.scene.vo.BaseSceneParamVO; import com.fdkankan.scene.vo.DeleteSidListParamVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @Service public class CutModelServiceImpl implements ICutModelService { private final String CUT_MODEL_JSON_NAME = "cutModel.json"; private final static String CREATE_TIME = "createTime"; @Autowired private SceneService scenePlusService; @Autowired private SceneEditInfoExtService sceneEditInfoExtService; @Autowired private SceneEditInfoService sceneEditInfoService; @Resource private RedisClient redisClient; @Autowired private FYunFileService fYunFileService; @Autowired private ISceneUploadService sceneUploadService; @Override public ResultData saveCutModel(BaseJsonArrayParamVO param) throws Exception { Scene scenePlus = scenePlusService.getByNum(param.getNum(), param.getSubgroup(), param.getUpTimeKey()); //更新缓存 this.addOrUpdate(param.getNum() ,param.getSubgroup(), param.getUpTimeKey(), param.getData()); //保存数据库 SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId()); this.updateDb(param.getNum() ,param.getSubgroup(), param.getUpTimeKey(), scenePlus.getId()); sceneEditInfoService.upgradeVersionById(sceneEditInfoExt.getEditInfoId()); //发布 this.publicCutModel(param.getNum() ,param.getSubgroup(), param.getUpTimeKey()); return ResultData.ok(); } @Override public List listCutModel(BaseSceneParamVO param) throws Exception { List tags = new ArrayList<>(); Scene scenePlus = scenePlusService.getByNum(param.getNum(), param.getSubgroup(), param.getUpTimeKey()); //获取裁剪模型数据 String numStr = RedisKey.getNumStr(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), 1); String key = String.format(RedisKey.SCENE_CUT_MODEL, numStr); List list = redisClient.hgetValues(key); if(CollUtil.isNotEmpty(list)){ List sortList = list.stream().map(str -> { JSONObject jsonObject = JSON.parseObject(str); TagBean tagBean = new TagBean(); tagBean.setCreateTime(jsonObject.getLong(CREATE_TIME)); jsonObject.remove(CREATE_TIME); tagBean.setTag(jsonObject); return tagBean; }).collect(Collectors.toList()); sortList.sort(Comparator.comparingLong(TagBean::getCreateTime).reversed()); tags = sortList.stream().map(item -> item.getTag()).collect(Collectors.toList()); } return tags; } @Override public ResultData deleteCutModel(DeleteSidListParamVO param) throws Exception { Scene scenePlus = scenePlusService.getByNum(param.getNum(), param.getSubgroup(), param.getUpTimeKey()); List deleteSidList = param.getSidList(); //处理删除状态数据 List deleteList = this.deleteCutModel(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), deleteSidList); //保存数据库 SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId()); this.updateDb(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), scenePlus.getId()); sceneEditInfoService.upgradeVersionById(sceneEditInfoExt.getEditInfoId()); //发布 this.publicCutModel(param.getNum(), param.getSubgroup(), param.getUpTimeKey()); return ResultData.ok(); } @Override public void publicCutModel(String sceneNum, Integer subgroup, String upTimeKey) throws IOException { String numStr = RedisKey.getNumStr(sceneNum, subgroup, upTimeKey, 1); String Key = String.format(RedisKey.SCENE_CUT_MODEL, numStr); String userEditPath = String.format(UploadFilePath.USER_VIEW_PATH, sceneNum) + "cutModel.json"; List list = redisClient.hgetValues(Key); List collect = list.stream().map(str -> JSON.parseObject(str)).collect(Collectors.toList()); fYunFileService.uploadFile(sceneNum, subgroup, upTimeKey, JSON.toJSONString(collect).getBytes(), userEditPath); } private List deleteCutModel(String num, Integer subgroup, String upTimeKey, List deleteSidList) throws Exception { if(CollUtil.isEmpty(deleteSidList)){ return null; } //从redis中加载热点数据 String numStr = RedisKey.getNumStr(num, subgroup, upTimeKey, 1); String key = String.format(RedisKey.SCENE_CUT_MODEL, numStr); List deletDataList = redisClient.hMultiGet(key, deleteSidList); if(CollUtil.isNotEmpty(deletDataList)){ redisClient.hdel(key, deleteSidList); } return deletDataList; } private void updateDb(String num, Integer subgroup, String upTime, Long scenePlusId){ //查询缓存是否包含热点数据 String numStr = RedisKey.getNumStr(num, subgroup, upTime, 1); String key = String.format(RedisKey.SCENE_CUT_MODEL, numStr); Map cutModelMap = redisClient.hmget(key); boolean hasCutModel= false; for (Map.Entry tagMap : cutModelMap.entrySet()) { if(StrUtil.isEmpty(tagMap.getValue())){ continue; } hasCutModel = true; break; } //更改热点状态 sceneEditInfoExtService.update( new LambdaUpdateWrapper() .set(SceneEditInfoExt::getCutModel, hasCutModel ? CommonStatus.YES.code().intValue() : CommonStatus.NO.code().intValue()) .eq(SceneEditInfoExt::getScenePlusId,scenePlusId)); } private void addOrUpdate(String num, Integer subgroup, String upTimeKey, List data) throws Exception{ Map addOrUpdateMap = new HashMap<>(); int i = 0; for (JSONObject jsonObject : data) { jsonObject.put(CREATE_TIME, Calendar.getInstance().getTimeInMillis() + i++); addOrUpdateMap.put(jsonObject.getString("sid"), JSON.toJSONString(jsonObject)); } //处理新增和修改数据 this.addOrUpdateHandler(num, subgroup, upTimeKey, addOrUpdateMap); } private void addOrUpdateHandler(String num, Integer subgroup, String upTimeKey, Map addOrUpdateMap) { if (CollUtil.isEmpty(addOrUpdateMap)) return; //批量写入缓存 String key = String.format(RedisKey.SCENE_CUT_MODEL, RedisKey.getNumStr(num, subgroup, upTimeKey, 1)); redisClient.hmset(key, addOrUpdateMap); } }