yujian
2020-01-18 f4a0f2acc63d7785eab108419a4e16f5f688cb95
fanli/src/main/java/com/yeshi/fanli/service/impl/homemodule/SpecialServiceImpl.java
@@ -1,54 +1,73 @@
package com.yeshi.fanli.service.impl.homemodule;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import javax.annotation.Resource;
import javax.transaction.Transactional;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.tencentcloud.COSManager;
import com.yeshi.fanli.dao.mybatis.homemodule.SpecialMapper;
import com.yeshi.fanli.dto.common.CommonContentTypeEnum;
import com.yeshi.fanli.entity.AppVersionInfo;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.bus.homemodule.AdActivityVersionControl;
import com.yeshi.fanli.entity.bus.homemodule.AdActivityVersionControl.AdActivityType;
import com.yeshi.fanli.entity.bus.homemodule.Special;
import com.yeshi.fanli.entity.bus.homemodule.SpecialPlace;
import com.yeshi.fanli.entity.common.JumpDetailV2;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.exception.banner.SwiperPictureException;
import com.yeshi.fanli.exception.homemodule.HomeNavbarException;
import com.yeshi.fanli.exception.homemodule.SpecialException;
import com.yeshi.fanli.service.inter.common.JumpDetailV2Service;
import com.yeshi.fanli.service.inter.config.AppVersionService;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.homemodule.AdActivityVersionControlService;
import com.yeshi.fanli.service.inter.homemodule.SpecialCardService;
import com.yeshi.fanli.service.inter.homemodule.SpecialPlaceService;
import com.yeshi.fanli.service.inter.homemodule.SpecialService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.FilePathEnum;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.VersionUtil;
import net.sf.json.JSONObject;
@Service
public class SpecialServiceImpl implements SpecialService {
   @Resource
   private SpecialMapper specialMapper;
   @Resource
   private SpecialPlaceService specialPlaceService;
   @Override
   public int deleteByPrimaryKey(Long id) {
      return specialMapper.deleteByPrimaryKey(id);
   }
   @Resource
   private SpecialCardService specialCardService;
   @Override
   public int insert(Special record) {
      return specialMapper.insert(record);
   }
   @Resource
   private JumpDetailV2Service jumpDetailV2Service;
   @Override
   public int insertSelective(Special record) {
      return specialMapper.insertSelective(record);
   }
   @Resource
   private ConfigService configService;
   @Resource
   private AppVersionService appVersionService;
   @Resource
   private AdActivityVersionControlService adActivityVersionControlService;
   @Override
   public Special selectByPrimaryKey(Long id) {
@@ -56,183 +75,645 @@
   }
   @Override
   public int updateByPrimaryKeySelective(Special record) {
      return specialMapper.updateByPrimaryKeySelective(record);
   public void saveObject(MultipartFile file, MultipartFile file2, MultipartFile file3, Special record,
         String jumpType) throws SpecialException, Exception {
      Long cardId = record.getCardId();
      if (cardId == null) {
         throw new SpecialException(1, "管理ID不能为空");
      }
      String name = record.getName();
      if (name == null || name.trim().length() == 0) {
         throw new SpecialException(1, "专题名称不能为空");
      }
      Integer sex = record.getSex();
      if (sex == null) {
         throw new SpecialException(1, "性别不能为空");
      }
      String params = record.getParams();
      if (params == null || params.trim().length() == 0 || "null".equalsIgnoreCase(params)) {
         record.setParams(null);
      } else if (!StringUtil.isJson(params)) {
         throw new SpecialException(1, "跳转参数非JSON格式");
      } else {
         record.setParams(params.trim());
      }
      String startTime_str = record.getStartTime_str();
      if (record.isTimeTask() && (startTime_str == null || startTime_str.length() == 0)) {
         throw new SpecialException(1, "控制时间不能为空");
      }
      if (!StringUtil.isNullOrEmpty(jumpType)) {
         List<JumpDetailV2> listByType = jumpDetailV2Service.listByType(jumpType);
         if (listByType != null && listByType.size() > 0) {
            record.setJumpDetail(listByType.get(0));
         }
      }
      // 时间转换
      conversionTime(record);
      Long state = record.getState();
      if (state == null) {
         record.setState(0L);
      }
      // 图片上传
      String picture = null;
      if (file != null) {
         picture = uploadPicture(file);
      }
      // 图片上传
      String subPicture = null;
      if (file2 != null) {
         subPicture = uploadPicture(file2);
      }
      // 图片上传
      String icon = null;
      if (file3 != null) {
         icon = uploadPicture(file3);
      }
      Long id = record.getId();
      if (id == null) {
         record.setIcon(icon);
         record.setPicture(picture);
         record.setSubPicture(subPicture);
         // 排序
         record.setOrderby(specialMapper.getDefaultMaxOrder(cardId) + 1);
         record.setOrderMan(specialMapper.getManMaxOrder(cardId) + 1);
         record.setOrderWoman(specialMapper.getWomanMaxOrder(cardId) + 1);
         record.setCreatetime(new Date());
         record.setUpdatetime(new Date());
         specialMapper.insert(record);
         Special s = new Special();
         s.setId(record.getId());
         s.setOrderby(Integer.parseInt(s.getId() + ""));
         s.setOrderMan(Integer.parseInt(s.getId() + ""));
         s.setOrderWoman(Integer.parseInt(s.getId() + ""));
         specialMapper.updateByPrimaryKeySelective(s);
      } else {
         // 修改
         Special resultObj = specialMapper.selectByPrimaryKey(id);
         if (resultObj == null) {
            throw new SpecialException(1, "修改内容已不存在");
         }
         // 删除图片
         Boolean delIcon = record.getDelIcon();
         if (delIcon != null && delIcon) {
            removePicture(resultObj.getIcon());
            resultObj.setIcon(null);
         }
         Boolean delPicture = record.getDelPicture();
         if (delPicture != null && delPicture) {
            removePicture(resultObj.getPicture());
            resultObj.setPicture(null);
         }
         Boolean delSubPicture = record.getDelSubPicture();
         if (delSubPicture != null && delSubPicture) {
            removePicture(resultObj.getSubPicture());
            resultObj.setSubPicture(null);
         }
         if (picture != null && picture.trim().length() > 0) {
            // 删除老图
            removePicture(resultObj.getPicture());
            // 存储新图
            record.setPicture(picture);
         } else {
            record.setPicture(resultObj.getPicture());
         }
         if (subPicture != null && subPicture.trim().length() > 0) {
            // 删除老图
            removePicture(resultObj.getSubPicture());
            // 存储新图
            record.setSubPicture(subPicture);
         } else {
            record.setSubPicture(resultObj.getSubPicture());
         }
         if (icon != null && icon.trim().length() > 0) {
            // 删除老图
            removePicture(resultObj.getIcon());
            // 存储新图
            record.setIcon(icon);
         } else {
            record.setIcon(resultObj.getIcon());
         }
         record.setOrderby(resultObj.getOrderby());
         record.setOrderMan(resultObj.getOrderMan());
         record.setOrderWoman(resultObj.getOrderWoman());
         record.setCreatetime(resultObj.getCreatetime());
         record.setUpdatetime(new Date());
         specialMapper.updateByPrimaryKey(record);
      }
   }
   /**
    * web段时间转换
    *
    * @param record
    */
   public void conversionTime(Special record) throws SpecialException, Exception {
      // 是否时间控制
      if (!record.isTimeTask()) {
         record.setStartTime(null);
         record.setEndTime(null);
      } else {
         String startTime_str = record.getStartTime_str();
         String endTime_str = record.getEndTime_str();
         if ((startTime_str == null || startTime_str.trim().length() == 0)
               && (endTime_str == null || endTime_str.trim().length() == 0)) {
            throw new HomeNavbarException(1, "请输入控制时间");
         } else {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            if (startTime_str != null && startTime_str.trim().length() > 0) {
               startTime_str = startTime_str.replaceAll("T", " ");
               record.setStartTime(format.parse(startTime_str));
            }
            if (endTime_str != null && endTime_str.trim().length() > 0) {
               endTime_str = endTime_str.replaceAll("T", " ");
               record.setEndTime(format.parse(endTime_str));
            }
         }
      }
   }
   /**
    * 上传图片
    *
    * @param file
    * @return
    * @throws Exception
    */
   public String uploadPicture(MultipartFile file) throws Exception {
      // 文件解析
      InputStream inputStream = file.getInputStream();
      String contentType = file.getContentType();
      String type = contentType.substring(contentType.indexOf("/") + 1);
      // 文件路径
      String filePath =FilePathEnum.special.getPath() + UUID.randomUUID().toString().replace("-", "") + "." + type;
      // 执行上传
      String fileLink = COSManager.getInstance().uploadFile(inputStream, filePath).getUrl();
      return fileLink;
   }
   /**
    * 删除图片-不更新数据库
    *
    * @param record
    * @throws Exception
    */
   public void removePicture(String picture) throws Exception {
      if (picture != null && picture.trim().length() > 0) {
         COSManager.getInstance().deleteFile(picture);
      }
   }
   @Override
   public int updateByPrimaryKey(Special record) {
      return specialMapper.updateByPrimaryKey(record);
   @Transactional(rollbackFor=Exception.class)
   public void updateOrder(Long id, Integer moveType, Integer sex) throws SpecialException {
      if (id == null || moveType == null || (!moveType.equals(1) && !moveType.equals(-1)) || sex == null) {
         throw new SpecialException(1, "请传递正确参数");
      }
      Special resultObj = specialMapper.selectByPrimaryKey(id);
      if (resultObj == null) {
         throw new SpecialException(1, "此内容已不存在");
      }
      Long cardId = resultObj.getCardId();
      // 获取交换对象
      Special exchangeObject = null;
      if (Special.SEX_ALL == sex || Special.SEX_DEFAULT == sex) {
         Integer orderby = resultObj.getOrderby();
         exchangeObject = specialMapper.getOrderByCardID(cardId, moveType, orderby, sex);
         if (exchangeObject == null) {
            throw new SpecialException(1, "没有找到可交换的位置");
         }
         resultObj.setOrderby(exchangeObject.getOrderby());
         exchangeObject.setOrderby(orderby);
      } else if (Special.SEX_MAN == sex) {
         Integer orderMan = resultObj.getOrderMan();
         exchangeObject = specialMapper.getOrderByCardID(cardId, moveType, orderMan, sex);
         if (exchangeObject == null) {
            throw new SpecialException(1, "没有找到可交换的位置");
         }
         resultObj.setOrderMan(exchangeObject.getOrderMan());
         exchangeObject.setOrderMan(orderMan);
      } else if (Special.SEX_WOMAN == sex) {
         Integer orderWoman = resultObj.getOrderWoman();
         exchangeObject = specialMapper.getOrderByCardID(cardId, moveType, orderWoman, sex);
         if (exchangeObject == null) {
            throw new SpecialException(1, "没有找到可交换的位置");
         }
         resultObj.setOrderWoman(exchangeObject.getOrderWoman());
         exchangeObject.setOrderWoman(orderWoman);
      } else {
         throw new SpecialException(1, "sex参数不正确");
      }
      specialMapper.updateByPrimaryKey(resultObj);
      specialMapper.updateByPrimaryKey(exchangeObject);
   }
   @Override
   @Transactional
   public int deleteBatchByPrimaryKey(List<Long> list) throws Exception{
   @Transactional(rollbackFor = Exception.class)
   public int deleteBatchByPrimaryKey(List<Long> list) throws Exception {
      List<Special> listSpecial = specialMapper.queryByListPrimaryKey(list);
      for (Special special: listSpecial) {
      for (Special special : listSpecial) {
         String src = special.getPicture();
         if (!StringUtil.isNullOrEmpty(src)) {
            COSManager.getInstance().deleteFile(src);
         }
         String subPicture = special.getSubPicture();
         if (!StringUtil.isNullOrEmpty(subPicture)) {
            COSManager.getInstance().deleteFile(subPicture);
         }
      }
      
      if (listSpecial != null)
         for (Special special : listSpecial) {
            List<AdActivityVersionControl> versionList = adActivityVersionControlService
                  .listByTypeAndSourceId(AdActivityType.special, special.getId());
            if (versionList != null)
               for (AdActivityVersionControl control : versionList)
                  adActivityVersionControlService.deleteByPrimaryKey(control.getId());
         }
      return specialMapper.deleteBatchByPrimaryKey(list);
   }
   @Override
   public int deleteBatchByCardID(List<Long> list) throws Exception{
   public int deleteBatchByCardID(List<Long> list) throws Exception {
      List<Special> listSpecial = specialMapper.queryByListCardID(list);
      for (Special special: listSpecial) {
      for (Special special : listSpecial) {
         String src = special.getPicture();
         if (!StringUtil.isNullOrEmpty(src)) {
            COSManager.getInstance().deleteFile(src);
         }
         String subPicture = special.getSubPicture();
         if (!StringUtil.isNullOrEmpty(subPicture)) {
            COSManager.getInstance().deleteFile(subPicture);
         }
      }
      return specialMapper.deleteBatchByCardID(list);
   }
   @Override
   public List<Special> listQueryByCard(long start, int count, Long card, String key){
      return specialMapper.listQueryByCard(start, count, card, key);
   }
   @Override
   public long countlistQueryByCard(Long card, String key) {
      return specialMapper.countlistQueryByCard(card, key);
   }
   @Override
   public List<Special> getOrderByCardID(Long cardId, Integer type, Integer order) {
      return specialMapper.getOrderByCardID(cardId, type, order);
   }
   @Override
   public int getMaxOrderByCard(Long card) {
      return specialMapper.getMaxOrderByCard(card);
   }
   @Override
   @Cacheable(value = "configCache", key = "'listBySystemAndCard-'+#card+'-'+#systemId")
   public List<Special> listQueryByCard(long start, int count, Long card, String key, Integer sex) {
      List<Special> list = specialMapper.listQueryByCard(start, count, card, key, sex);
      if (list == null || list.size() == 0) {
         return list;
      }
      // 跳转链接
      for (Special special : list) {
         Date startTime = special.getStartTime();
         Date endTime = special.getEndTime();
         if (startTime == null && endTime == null) {
            special.setTimeTask(false);
            special.setStartTime_str("");
            special.setEndTime_str("");
         } else {
            special.setTimeTask(true);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
            if (startTime == null) {
               special.setStartTime_str("");
            } else {
               special.setStartTime_str(sdf.format(startTime));
            }
            if (endTime == null) {
               special.setEndTime_str("");
            } else {
               special.setEndTime_str(sdf.format(endTime));
            }
         }
         String params = special.getParams();
         if (StringUtil.isNullOrEmpty(params)) {
            special.setParams("");
         }
         String remark = special.getRemark();
         if (StringUtil.isNullOrEmpty(remark)) {
            special.setRemark("");
         }
         JumpDetailV2 jumpDetail = special.getJumpDetail();
         if (jumpDetail == null) {
            // 默认未选择
            JumpDetailV2 jumpDetailV2 = new JumpDetailV2();
            jumpDetailV2.setName("-未选择-");
            jumpDetailV2.setType("default");
            special.setJumpDetail(jumpDetailV2);
         }
      }
      return list;
   }
   @Override
   public long countlistQueryByCard(Long card, String key, Integer sex) {
      return specialMapper.countlistQueryByCard(card, key, sex);
   }
   @Override
   @Cacheable(value = "specialCache", key = "'listBySystemAndCard-'+#card+'-'+#systemId")
   public List<Special> listBySystemAndCard(String card, Long systemId) {
      return specialMapper.listBySystemAndCard(card, systemId);
   }
   @Override
   @Cacheable(value = "configCache", key = "'listPageBySystemAndCard-'+#start+'-'+#count+'-'+#card+'-'+#systemId")
   @Cacheable(value = "specialCache", key = "'listPageBySystemAndCard-'+#start+'-'+#count+'-'+#card+'-'+#systemId")
   public List<Special> listPageBySystemAndCard(long start, int count, String card, Long systemId) {
      return specialMapper.listPageBySystemAndCard(start, count, card, systemId);
   }
   @Override
   @Cacheable(value = "configCache", key = "'getSpecialListCache-'+#card+'-'+#systemId")
   public JSONObject getSpecialListCache(String card, Long systemId) throws Exception{
      // 两行圆形专题
      List<Special> arcList = new ArrayList<Special>();
      // 活动列表
      List<Special> activityList = new ArrayList<Special>();
      // 方块部分
      List<Special> blockList = new ArrayList<Special>();
      List<Special> list = specialMapper.listBySystemAndCard(card, systemId);
      if (list != null && list.size() > 0) {
         for (Special special : list) {
            if (Special.SHOWTYPE_ARC.equals(special.getShowType())) {
               // 两行圆形专题
               arcList.add(special);
            } else if (Special.SHOWTYPE_BLOCK.equals(special.getShowType())) {
               // 方块部分
               blockList.add(special);
            } else if (Special.SHOWTYPE_ACTIVITY.equals(special.getShowType())) {
               // 动态
               activityList.add(special);
            }
         }
      }
      JSONObject arcMap = new JSONObject();
      arcMap.put("list", JsonUtil.getApiCommonGson().toJson(arcList));
      JSONObject activityMap = new JSONObject();
      activityMap.put("list", JsonUtil.getApiCommonGson().toJson(activityList));
      JSONObject blockJsonMap = new JSONObject();
      blockJsonMap.put("list", JsonUtil.getApiCommonGson().toJson(blockList));
      // 背景图片
      List<SpecialPlace> listPlace = specialPlaceService.getList();
      if (listPlace != null && listPlace.size() > 0) {
         for (SpecialPlace specialPlace: listPlace) {
            String bottomPicture = specialPlace.getBottomPicture();
            if (bottomPicture != null && bottomPicture.trim().length() > 0) {
               if (Special.SHOWTYPE_ARC.equals(specialPlace.getKey())) {
                  arcMap.put("bottomPicture", bottomPicture);
               } else if (Special.SHOWTYPE_BLOCK.equals(specialPlace.getKey())) {
                  blockJsonMap.put("bottomPicture", bottomPicture);
               } else if (Special.SHOWTYPE_ACTIVITY.equals(specialPlace.getKey())) {
                  activityMap.put("bottomPicture", bottomPicture);
               }
            }
         }
      }
      JSONObject rootMap = new JSONObject();
      rootMap.put("arcArea", arcMap);
      rootMap.put("activityArea", activityMap);
      rootMap.put("blockArea", blockJsonMap);
      return rootMap;
   @Cacheable(value = "specialCache", key = "'listByVersion-'+#start+'-'+#count+'-'+#card+'-'+#platform+'-'+#versionCode")
   public List<Special> listByVersion(long start, int count, String card, String platform, Integer versionCode) {
      List<Special> specialList = specialMapper.listByPlaceKey(card, null, null, null);
      filterSpecial(specialList, platform, versionCode);
      return specialList;
   }
   @Override
   public void uploadPicture(MultipartFile file, Special record, Long cardId) throws Exception {
      InputStream inputStream = file.getInputStream();
      String contentType = file.getContentType();
      String type = contentType.substring(contentType.indexOf("/") + 1);
      // 上传文件相对位置
      String fileUrl="SpecialPic/"+UUID.randomUUID().toString().replace("-", "") + "." + type;
      /*  修改图片时,先删除已存在图片  */
      if (record != null) {
         String src = record.getPicture();
         if (!StringUtil.isNullOrEmpty(src)) {
            COSManager.getInstance().deleteFile(src);
         }
   /**
    * 专题版本过滤
    *
    * @param list
    * @param platform
    * @param versionCode
    */
   private void filterSpecial(List<Special> list, String platform, int versionCode) {
      if (list == null || list.size() == 0)
         return;
      AppVersionInfo app = appVersionService.getClientVersion(platform, versionCode);
      if (app == null) {
         list.clear();
         return;
      }
      String uploadFilePath = COSManager.getInstance().uploadFile(inputStream, fileUrl).getUrl();
      /*  更新数据库信息  */
      if (!StringUtil.isNullOrEmpty(uploadFilePath)) {
         if (record != null) {
            record.setUpdatetime(new Date());
            record.setPicture(uploadFilePath);
            updateByPrimaryKeySelective(record);
         } else {
            record = new Special();
            record.setPicture(uploadFilePath);
            record.setCreatetime(new Date());
            record.setUpdatetime(new Date());
            record.setCardId(cardId);
            record.setState(0L);
            int maxOrder = getMaxOrderByCard(cardId);
            record.setOrderby(maxOrder + 1);
            record.setShowType("default");
            insertSelective(record);
      List<Long> versionIdList = new ArrayList<>();
      versionIdList.add(app.getId());
      List<Long> sourceIdList = new ArrayList<>();
      for (Special special : list) {
         sourceIdList.add(special.getId());
      }
      Set<Long> sourceIds = adActivityVersionControlService.filterSourceIdByVersion(sourceIdList,
            AdActivityType.special, versionIdList);
      for (int i = 0; i < list.size(); i++) {
         if (!sourceIds.contains(list.get(i).getId())) {
            list.remove(i--);
         }
      }
   }
   @Override
   @Cacheable(value = "specialCache", key = "'listCacheSpecialToIndex'+#acceptData.platform+'-'+#acceptData.version+'-'+#sex")
   public JSONObject listCacheSpecialToIndex(AcceptData acceptData, Integer sex) throws Exception {
      // 首页-5圆形2排区域
      JSONObject arcMap = new JSONObject();
      String indexArc = "index_arc";
      if (VersionUtil.greaterThan_1_6_5(acceptData.getPlatform(), acceptData.getVersion()))
         indexArc = "index_arc_1.6.5";
      else if (VersionUtil.greaterThan_1_6_0(acceptData.getPlatform(), acceptData.getVersion()))
         indexArc = "index_arc_1.6.0";
      else if (VersionUtil.greaterThan_1_5_70(acceptData.getPlatform(), acceptData.getVersion()))
         indexArc = "index_arc_1.5.7";
      else if (VersionUtil.greaterThan_1_5_60(acceptData.getPlatform(), acceptData.getVersion()))
         indexArc = "index_arc_1.5.6";
      String platform = acceptData.getPlatform();
      int platformCode = Constant.getPlatformCode(platform);
      int version = Integer.parseInt(acceptData.getVersion());
      List<Special> listArc = specialMapper.listByPlaceKey(indexArc, sex, platformCode, version);
      filterSpecial(listArc, platform, version);
      if (listArc == null) {
         listArc = new ArrayList<Special>();
      } else if (listArc.size() > 0) {
         Special special = listArc.get(0);
         if (special != null) {
            // 背景图片
            arcMap.put("bottomPicture", special.getBottomPicture());
         }
      }
      int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
      // 处理9.9包邮
      if (listArc != null && VersionUtil.greaterThan_1_5_50(acceptData.getPlatform(), acceptData.getVersion()))
         for (Special s : listArc) {
            if (s.getName().contains("9.9")) {// 9块9
               s.setJumpDetail(jumpDetailV2Service.getByTypeCache("common_template"));
               JSONObject params = new JSONObject();
               params.put("key", CommonContentTypeEnum._9k9.name());
               params.put("title", CommonContentTypeEnum._9k9.getDesc());
               s.setParams(params.toString());
            } else if (s.getName().contains("自购立减")) {
               if (hour < 6) {// 0-6点之间不进入自购立减的页面
                  s.setJumpDetail(jumpDetailV2Service.getByTypeCache("web"));
                  JSONObject params = new JSONObject();
                  params.put("url", configService.get(ConfigKeyEnum.tljOwnBuyNogoods.getKey()));
                  s.setParams(params.toString());
               } else {
                  // 查询专题详情
                  Special special = specialMapper.selectByPrimaryKey(s.getId());
                  s.setJumpDetail(special.getJumpDetail());
                  s.setParams(special.getParams());
               }
            }
         }
      // 数据处理
      handlelist(listArc);
      arcMap.put("list", JsonUtil.getApiCommonGson().toJson(listArc));
      // 首页-活动区域(女王节)
      JSONObject activityMap = new JSONObject();
      List<Special> listActivity = null;
      if ("ios".equalsIgnoreCase(acceptData.getPlatform())
            && configService.iosOnLining(Integer.parseInt(acceptData.getVersion()))) {
         // 如果IOS当前版本处于审核状态就不返回
      } else {
         listActivity = specialMapper.listByPlaceKey("index_activity", null, platformCode, version);
      }
      filterSpecial(listActivity, platform, version);
      if (listActivity == null) {
         listActivity = new ArrayList<Special>();
      } else if (listActivity.size() > 0) {
         Special special = listActivity.get(0);
         if (special != null) {
            // 背景图片
            activityMap.put("bottomPicture", special.getBottomPicture());
         }
      }
      handlelist(listActivity);
      activityMap.put("list", JsonUtil.getApiCommonGson().toJson(listActivity));
      // 首页-方形专题(品牌券、母婴...)
      String indexBlock = "index_block";
      if (VersionUtil.greaterThan_1_5_60(acceptData.getPlatform(), acceptData.getVersion()))
         indexBlock = "index_block_1.5.6";
      JSONObject blockJsonMap = new JSONObject();
      List<Special> listBlock = specialMapper.listByPlaceKey(indexBlock, sex, platformCode, version);
      filterSpecial(listBlock, platform, version);
      if (listBlock == null) {
         listBlock = new ArrayList<Special>();
      } else if (listBlock.size() > 0) {
         Special special = listBlock.get(0);
         if (special != null) {
            // 背景图片
            blockJsonMap.put("bottomPicture", special.getBottomPicture());
         }
      }
      // 品牌券
      // >=1.5.40后的版本可以用
      if (("android".equalsIgnoreCase(acceptData.getPlatform()) && Integer.parseInt(acceptData.getVersion()) > 39)
            || "ios".equalsIgnoreCase(acceptData.getPlatform()) && Integer.parseInt(acceptData.getVersion()) > 48)
         if (listBlock != null)
            for (int i = 0; i < listBlock.size(); i++) {
               if ("品牌券".equalsIgnoreCase(listBlock.get(i).getName())) {
                  listBlock.get(i).setJumpDetail(jumpDetailV2Service.getByTypeCache("hot_cakes"));
               }
            }
      // 数据处理
      handlelist(listBlock);
      blockJsonMap.put("list", JsonUtil.getApiCommonGson().toJson(listBlock));
      JSONObject root = new JSONObject();
      root.put("arcArea", arcMap);
      root.put("activityArea", activityMap);
      root.put("blockArea", blockJsonMap);
      return root;
   }
   @Override
   public List<Special> listByPlaceKey(String placeKey, Integer platform, Integer versionCode) {
      return specialMapper.listByPlaceKey(placeKey, null, platform, versionCode);
   }
   @Override
   public List<Special> listByPlaceKeyList(long start, int count, List<String> list, Integer platform,
         Integer versionCode) {
      return specialMapper.listByPlaceKeyList(start, count, list, null, platform, versionCode);
   }
   @Override
   public long countByPlaceKeyList(List<String> list, Integer platform, Integer versionCode) {
      return specialMapper.countByPlaceKeyList(list, null, platform, versionCode);
   }
   @Override
   @Cacheable(value = "specialCache", key = "'listByPlaceKeyHasLabel'+#start+'-'+#platform+'-'+#versionCode+'-'+#list")
   public List<Special> listByPlaceKeyHasLabel(long start, int count, List<String> list, Integer platform,
         Integer versionCode) {
      return specialMapper.listByPlaceKeyHasLabel(start, count, list, null, platform, versionCode);
   }
   /**
    * 处理 数据
    *
    * @param list
    */
   public void handlelist(List<Special> list) {
      if (list != null && list.size() > 0) {
         for (Special special : list) {
            boolean needLogin = special.isJumpLogin();
            JumpDetailV2 jumpDetail = special.getJumpDetail();
            if (jumpDetail != null) {
               jumpDetail.setNeedLogin(needLogin);
               special.setJumpDetail(jumpDetail);
            }
         }
      }
   }
   @Transactional(rollbackFor = Exception.class)
   @Override
   public void setVersions(Long specialId, List<Long> versions) throws Exception {
      Special special = selectByPrimaryKey(specialId);
      if (special == null) {
         throw new Exception("专题不存在");
      }
      Set<Long> oldSet = new HashSet<>();
      List<AdActivityVersionControl> versionList = adActivityVersionControlService
            .listByTypeAndSourceId(AdActivityType.special, specialId);
      if (versionList != null) {
         for (AdActivityVersionControl control : versionList)
            oldSet.add(control.getVersion().getId());
      }
      Set<Long> newSet = new HashSet<>();
      for (Long version : versions) {
         newSet.add(version);
      }
      Set<Long> delSet = new HashSet<>();
      delSet.addAll(oldSet);
      delSet.removeAll(newSet);
      for (Long versionId : delSet) {
         adActivityVersionControlService.deleteBySourceAndVersion(specialId, AdActivityType.special, versionId);
      }
      Set<Long> addSet = new HashSet<>();
      addSet.addAll(newSet);
      addSet.removeAll(oldSet);
      // 添加映射
      for (Long versionId : addSet) {
         AdActivityVersionControl control = new AdActivityVersionControl();
         control.setCreateTime(new Date());
         control.setSourceId(special.getId());
         control.setType(AdActivityType.special);
         control.setVersion(new AppVersionInfo(versionId));
         try {
            adActivityVersionControlService.addVersionControl(control);
         } catch (Exception e) {
            throw new SwiperPictureException(2, e.getMessage());
         }
      }
   }
}