package com.hugnew.sps.services.impls; import com.alibaba.fastjson.JSON; import com.google.gson.Gson; import com.hugnew.core.common.exception.BusinessException; import com.hugnew.core.dao.IBaseMapper; import com.hugnew.core.service.impl.BaseService; import com.hugnew.core.util.DateUtils; import com.hugnew.sps.dao.SysConfigMapper; import com.hugnew.sps.dao.domain.SysConfig; import com.hugnew.sps.dto.DDDetails; import com.hugnew.sps.services.ICacheService; import com.hugnew.sps.services.ISysConfigService; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.HashOperations; import org.springframework.stereotype.Service; import java.util.*; /** * 字典缓存业务 * Created by Martin on 2016/7/01. */ @Service public class SysConfigService extends BaseService<SysConfig> implements ISysConfigService { private static Logger logger = org.slf4j.LoggerFactory.getLogger(SysConfigService.class); @Autowired private SysConfigMapper sysConfigMapper; @Autowired private ICacheService iCacheService; @Override public IBaseMapper<SysConfig> getBaseMapper() { return sysConfigMapper; } @Override public List<DDDetails> getDictionary(String sysKey, String id) { List<DDDetails> list = new ArrayList<>(); if (id != null) { DDDetails ddDetails = new DDDetails(); String name = iCacheService.getDictEntryByKey(sysKey, id); if (name != null) { ddDetails.setId(id); ddDetails.setName(name); list.add(ddDetails); } } else { list = iCacheService.getDictEntriesByKey(sysKey); } return list; } @Override public void txaddDictionary(String sysKey, DDDetails ddDetails, Long accountId) { HashOperations<String, Object, Object> opsForHash = redisTemplate.opsForHash(); SysConfig sysConfig = sysConfigMapper.selectByPrimaryKey(sysKey); if (sysConfig != null) { List<DDDetails> list = JSON.parseArray(sysConfig.getSysValue(), DDDetails.class); if (list == null || list.isEmpty()) { list.add(ddDetails); String sysValue = JSON.toJSONString(list); sysConfig.setSysValue(sysValue); sysConfig.setAccountId(accountId); sysConfig.setModifyTime(DateUtils.getUnixTimestamp()); sysConfigMapper.updateByPrimaryKeySelective(sysConfig); //添加字典项缓存 opsForHash.put(sysKey, ddDetails.getId().toString(), ddDetails.getName()); } else { Map<String, DDDetails> idMap = new HashMap<String, DDDetails>(); Map<String, DDDetails> nameMap = new HashMap<String, DDDetails>(); for (DDDetails ddDetail : list) { idMap.put(ddDetail.getId(), ddDetail); nameMap.put(ddDetail.getName(), ddDetail); } if (!idMap.containsKey(ddDetails.getId())) { list.add(ddDetails); String sysValue = JSON.toJSONString(list); sysConfig.setSysValue(sysValue); sysConfig.setAccountId(accountId); sysConfig.setModifyTime(DateUtils.getUnixTimestamp()); sysConfigMapper.updateByPrimaryKeySelective(sysConfig); //添加字典项缓存 opsForHash.put(sysKey, ddDetails.getId().toString(), ddDetails.getName()); } else { throw new BusinessException("该字典id已存在"); } } } else { throw new BusinessException("该字典不存在"); } } @Override public void txupdateDictionary(String sysKey, DDDetails ddDetails, Long accountId) { HashOperations<String, Object, Object> opsForHash = redisTemplate.opsForHash(); SysConfig sysConfig = sysConfigMapper.selectByPrimaryKey(sysKey); List<DDDetails> list = JSON.parseArray(sysConfig.getSysValue(), DDDetails.class); Map<String, DDDetails> idMap = new HashMap<String, DDDetails>(); Map<String, DDDetails> nameMap = new HashMap<String, DDDetails>(); for (DDDetails ddDetail : list) { idMap.put(ddDetail.getId(), ddDetail); nameMap.put(ddDetail.getName(), ddDetail); } String id = ddDetails.getId(); if (!idMap.containsKey(id)) { throw new BusinessException("该字典id不存在"); } else { //从数据库中获取的DDDetails DDDetails details = idMap.get(id); int index = list.indexOf(details); //将前台传来的值赋到后台的DDDetails details.setName(ddDetails.getName()); list.set(index, details); String sysValue = new Gson().toJson(list); sysConfig.setSysValue(sysValue); sysConfig.setAccountId(accountId); sysConfig.setModifyTime(DateUtils.getUnixTimestamp()); sysConfigMapper.updateByPrimaryKeySelective(sysConfig); //更新字典缓存 opsForHash.put(sysKey, ddDetails.getId().toString(), ddDetails.getName()); } } @Override public void deleteDictionary(String sysKey, String id, Long accountId) { HashOperations<String, Object, Object> opsForHash = redisTemplate.opsForHash(); SysConfig sysConfig = sysConfigMapper.selectByPrimaryKey(sysKey); List<DDDetails> list = JSON.parseArray(sysConfig.getSysValue(), DDDetails.class); for (Iterator<DDDetails> it = list.iterator(); it.hasNext(); ) { if (it.next().getId().equals(id)) { it.remove(); } } String sysValue = new Gson().toJson(list); sysConfig.setSysValue(sysValue); sysConfig.setAccountId(accountId); sysConfig.setModifyTime(DateUtils.getUnixTimestamp()); sysConfigMapper.updateByPrimaryKeySelective(sysConfig); //删除字典项 opsForHash.delete(sysKey, id); } @Override public void flushDictCache() { List<SysConfig> sysConfigList = getSysConfigList(); if (sysConfigList != null && !sysConfigList.isEmpty()) { for (SysConfig sysConfig : sysConfigList) { String sysKey = sysConfig.getSysKey(); List<DDDetails> ddDetailsList = JSON.parseArray(sysConfig.getSysValue(), DDDetails.class); HashOperations<String, Object, Object> opsForHash = redisTemplate.opsForHash(); if (ddDetailsList != null && !ddDetailsList.isEmpty()) { for (DDDetails ddDetails : ddDetailsList) { opsForHash.put(sysKey, ddDetails.getId(), ddDetails.getName()); } } } } } @Override public String getValueByKey(String key) { SysConfig sysConfig = new SysConfig(); sysConfig.setSysKey(key); List<SysConfig> list = sysConfigMapper.select(sysConfig); if (list != null && !list.isEmpty()) { return list.get(0).getSysValue(); } return null; } @Override public List<SysConfig> getSysConfigList() { return sysConfigMapper.getAll(); } @Override public Integer updateSysConfig(String key, String value) { return sysConfigMapper.updateSysConfig(key, value); } }