package jnpf.base.service.impl; import cn.hutool.core.util.ObjectUtil; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import jnpf.base.ActionResult; import jnpf.base.entity.DictionaryDataEntity; import jnpf.base.entity.DictionaryTypeEntity; import jnpf.base.mapper.DictionaryDataMapper; import jnpf.base.mapper.DictionaryTypeMapper; import jnpf.base.model.dictionarydata.DictionaryDataExportModel; import jnpf.base.model.dictionarydata.DictionaryExportModel; import jnpf.base.service.DictionaryDataService; import jnpf.base.service.SuperServiceImpl; import jnpf.base.vo.DownloadVO; import jnpf.constant.FileTypeConstant; import jnpf.constant.MsgCode; import jnpf.emnus.ModuleTypeEnum; import jnpf.exception.DataException; import jnpf.file.FileApi; import jnpf.model.ExportModel; import jnpf.util.FileExport; import jnpf.util.JsonUtil; import jnpf.util.RandomUtil; import jnpf.util.UserProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.util.*; import java.util.stream.Collectors; /** * 字典数据 * * @author JNPF开发平台组 * @version V3.1.0 * @copyright 引迈信息技术有限公司 * @date 2019年9月27日 上午9:18 */ @Service public class DictionaryDataServiceImpl extends SuperServiceImpl implements DictionaryDataService { @Autowired private DictionaryTypeMapper dictionaryTypeMapper; @Autowired private FileApi fileApi; @Override public List getList(String dictionaryTypeId, Boolean enable) { return this.baseMapper.getList(dictionaryTypeId, enable); } @Override public List getList(String dictionaryTypeId) { return this.baseMapper.getList(dictionaryTypeId); } @Override public List getDicList(String dictionaryTypeId) { return this.baseMapper.getDicList(dictionaryTypeId); } @Override public Boolean isExistSubset(String parentId) { return this.baseMapper.isExistSubset(parentId); } @Override public DictionaryDataEntity getInfo(String id) { return this.baseMapper.getInfo(id); } @Override public DictionaryDataEntity getSwapInfo(String value, String dictionaryTypeId) { return this.baseMapper.getSwapInfo(value, dictionaryTypeId); } @Override public boolean isExistByFullName(String dictionaryTypeId, String fullName, String id) { return this.baseMapper.isExistByFullName(dictionaryTypeId, fullName, id); } @Override public boolean isExistByEnCode(String dictionaryTypeId, String enCode, String id) { return this.baseMapper.isExistByEnCode(dictionaryTypeId, enCode, id); } @Override public void delete(DictionaryDataEntity entity) { this.baseMapper.delete(entity); } @Override public void create(DictionaryDataEntity entity) { this.baseMapper.create(entity); } @Override public boolean update(String id, DictionaryDataEntity entity) { return this.baseMapper.update(id, entity); } @Override public boolean first(String id) { return this.baseMapper.first(id); } @Override public boolean next(String id) { return this.baseMapper.next(id); } @Override public List getDictionName(List id) { return this.baseMapper.getDictionName(id); } @Override public DownloadVO exportData(String id) { //获取数据分类字段详情 DictionaryTypeEntity typeEntity = dictionaryTypeMapper.getInfo(id); if (typeEntity == null) { throw new DataException(MsgCode.FA001.get()); } DictionaryExportModel exportModel = new DictionaryExportModel(); //递归子分类 List typeList = new ArrayList<>(); List typeEntityList = dictionaryTypeMapper.getList(); typeList.add(typeEntity); getDictionaryTypeEntitySet(typeEntity, typeList, typeEntityList); List collect = typeList.stream().distinct().collect(Collectors.toList()); //判断是否有子分类 if (collect.size() > 0) { exportModel.setList(collect); } //获取该类型下的数据 List modelList = new ArrayList<>(); for (DictionaryTypeEntity dictionaryTypeEntity : exportModel.getList()) { List entityList = getList(dictionaryTypeEntity.getId()); for (DictionaryDataEntity dictionaryDataEntity : entityList) { DictionaryDataExportModel dataExportModel = JsonUtil.getJsonToBean(dictionaryDataEntity, DictionaryDataExportModel.class); modelList.add(dataExportModel); } } exportModel.setModelList(modelList); //导出文件 DownloadVO downloadVO = fileApi.exportFile(new ExportModel(exportModel, FileTypeConstant.TEMPORARY, UserProvider.getUser() != null ? UserProvider.getUser().getId() : "", typeEntity.getFullName(), ModuleTypeEnum.SYSTEM_DICTIONARYDATA.getTableName())); return downloadVO; } /** * 递归字典分类 * * @param dictionaryTypeEntity 数据字典类型实体 */ private void getDictionaryTypeEntitySet(DictionaryTypeEntity dictionaryTypeEntity, List set, List typeEntityList) { //是否含有子分类 List collect = typeEntityList.stream().filter(t -> dictionaryTypeEntity.getId().equals(t.getParentId())).collect(Collectors.toList()); if (collect.size() > 0) { for (DictionaryTypeEntity typeEntity : collect) { set.add(typeEntity); getDictionaryTypeEntitySet(typeEntity, set, typeEntityList); } } } @Override @DSTransactional public ActionResult importData(DictionaryExportModel exportModel, Integer type) throws DataException { try { StringBuilder message = new StringBuilder(); StringJoiner exceptionMessage = new StringJoiner("、"); List list = JsonUtil.getJsonToList(exportModel.getList(), DictionaryTypeEntity.class); List entityList = JsonUtil.getJsonToList(exportModel.getModelList(), DictionaryDataEntity.class); //遍历插入分类 StringJoiner IDMessage = new StringJoiner("、"); StringJoiner fullNameMessage = new StringJoiner("、"); StringJoiner enCodeMessage = new StringJoiner("、"); Map idFor = new HashMap<>(); for (DictionaryTypeEntity entity : list) { String copyNum = UUID.randomUUID().toString().substring(0, 5); if (dictionaryTypeMapper.getInfo(entity.getId()) != null) { IDMessage.add(entity.getId()); } if (dictionaryTypeMapper.isExistByFullName(entity.getFullName(), null)) { fullNameMessage.add(entity.getFullName()); } if (dictionaryTypeMapper.isExistByEnCode(entity.getEnCode(), null)) { enCodeMessage.add(entity.getEnCode()); } if ((IDMessage.length() > 0 || fullNameMessage.length() > 0 || enCodeMessage.length() > 0)) { if (ObjectUtil.equal(type, 1)) { entity.setFullName(entity.getFullName() + ".副本" + copyNum); entity.setEnCode(entity.getEnCode() + copyNum); String oldId = entity.getId(); entity.setId(RandomUtil.uuId()); dictionaryTypeMapper.setIgnoreLogicDelete().deleteById(entity); if (Optional.ofNullable(idFor.get(entity.getParentId())).isPresent()) { entity.setParentId(idFor.get(entity.getParentId())); } dictionaryTypeMapper.setIgnoreLogicDelete().insertOrUpdate(entity); idFor.put(oldId, entity.getId()); } } else { dictionaryTypeMapper.setIgnoreLogicDelete().deleteById(entity); dictionaryTypeMapper.setIgnoreLogicDelete().insertOrUpdate(entity); } } if (IDMessage.length() > 0) { exceptionMessage.add("ID(" + IDMessage.toString() + ")重复"); } if (enCodeMessage.length() > 0) { exceptionMessage.add("编码(" + IDMessage.toString() + ")重复"); } if (fullNameMessage.length() > 0) { exceptionMessage.add("名称(" + IDMessage.toString() + ")重复"); } if (exceptionMessage.length() > 0) { message.append(exceptionMessage.toString()).append(";"); exceptionMessage = new StringJoiner("、"); IDMessage = new StringJoiner("、"); fullNameMessage = new StringJoiner("、"); enCodeMessage = new StringJoiner("、"); } for (DictionaryDataEntity entity1 : entityList) { String copyNum = UUID.randomUUID().toString().substring(0, 5); if (this.getInfo(entity1.getId()) != null) { IDMessage.add(entity1.getId()); } if (this.isExistByFullName(entity1.getDictionaryTypeId(), entity1.getFullName(), null)) { fullNameMessage.add(entity1.getFullName()); } if (this.isExistByEnCode(entity1.getDictionaryTypeId(), entity1.getEnCode(), null)) { enCodeMessage.add(entity1.getEnCode()); } if (ObjectUtil.equal(type, 1)) { entity1.setId(RandomUtil.uuId()); if (Optional.ofNullable(idFor.get(entity1.getDictionaryTypeId())).isPresent()) { entity1.setDictionaryTypeId(idFor.get(entity1.getDictionaryTypeId())); } if (this.isExistByFullName(entity1.getDictionaryTypeId(), entity1.getFullName(), null) || this.isExistByEnCode(entity1.getDictionaryTypeId(), entity1.getEnCode(), null)) { entity1.setFullName(entity1.getFullName() + ".副本" + copyNum); entity1.setEnCode(entity1.getEnCode() + copyNum); } this.setIgnoreLogicDelete().saveOrUpdate(entity1); } else if (IDMessage.length() == 0 && fullNameMessage.length() == 0 && enCodeMessage.length() == 0) { this.setIgnoreLogicDelete().removeById(entity1); this.setIgnoreLogicDelete().saveOrUpdate(entity1); } } if (IDMessage.length() > 0) { exceptionMessage.add("ID(" + IDMessage.toString() + ")重复"); } if (enCodeMessage.length() > 0) { exceptionMessage.add("编码(" + enCodeMessage.toString() + ")重复"); } if (fullNameMessage.length() > 0) { exceptionMessage.add("名称(" + fullNameMessage.toString() + ")重复"); } if (exceptionMessage.length() > 0) { message.append("modelList:" + exceptionMessage.toString() + ";"); } if (ObjectUtil.equal(type, 0) && message.length() > 0) { return ActionResult.fail(message.toString().substring(0, message.lastIndexOf(";"))); } return ActionResult.success(MsgCode.IMP001.get()); } catch (Exception e) { //手动回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); throw new DataException(e.getMessage()); } finally { this.clearIgnoreLogicDelete(); dictionaryTypeMapper.clearIgnoreLogicDelete(); this.clearIgnoreLogicDelete(); } } @Override public List getListByTypeDataCode(String typeCode) { return this.baseMapper.getListByTypeDataCode(typeCode); } @Override public List getByTypeCodeEnable(String typeCode) { return this.baseMapper.getByTypeCodeEnable(typeCode); } }