123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368 |
- package cn.cslg.pas.service.impl;
- import cn.cslg.pas.common.model.dto.*;
- import cn.cslg.pas.common.model.vo.PathStructureNameVO;
- import cn.cslg.pas.common.model.vo.StructurePictureVO;
- import cn.cslg.pas.common.model.vo.StructureVO;
- import cn.cslg.pas.common.utils.FileUtils;
- import cn.cslg.pas.domain.Structure;
- import cn.cslg.pas.domain.asso.AssoStructurePicture;
- import cn.cslg.pas.exception.XiaoShiException;
- import cn.cslg.pas.mapper.AssoStructurePictureMapper;
- import cn.cslg.pas.mapper.StructureMapper;
- import cn.cslg.pas.service.IStructureService;
- import lombok.RequiredArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.BeanUtils;
- import org.springframework.stereotype.Service;
- import org.springframework.web.multipart.MultipartFile;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- /**
- * 架构的Service层接口实现类
- *
- * @Author chenyu
- * @Date 2023/3/10
- */
- @RequiredArgsConstructor
- @Slf4j
- @Service
- public class StructureServiceImpl implements IStructureService {
- private final StructureMapper structureMapper;
- private final AssoStructurePictureMapper assoStructurePictureMapper;
- private final FileUtils fileUtils;
- /**
- * 新增架构
- *
- * @param structureAddNewDTO 新增架构DTO对象
- * @param files 架构图片
- */
- @Override
- public void addNew(StructureAddNewDTO structureAddNewDTO, List<MultipartFile> files) {
- log.info("开始处理【新增架构】的业务,参数为:{}, {}", structureAddNewDTO, files);
- //取出DTO中父级id,若父级id为null则表示该架构为第1级架构,手动给其父级id设为0
- if (structureAddNewDTO.getParentId() == null) {
- structureAddNewDTO.setParentId(0);
- }
- Integer parentId = structureAddNewDTO.getParentId();
- String structureName = structureAddNewDTO.getStructureName();
- //检查名称是否被占用(检查当前架构父级下是否有同名架构)
- log.info("检查名称是否被占用(检查当前父级下是否有同名架构)");
- int count = structureMapper.countByparentIdAndStructureName(parentId, structureName, null);
- if (count > 0) {
- String message = "新增架构失败,当前父级下已存在【" + structureName + "】,请尝试更换名称";
- log.info("{}", message);
- throw new XiaoShiException(message);
- }
- //DTO对象赋值给实体类
- Structure structure = new Structure();
- BeanUtils.copyProperties(structureAddNewDTO, structure);
- //数据入架构表(此时数据暂不含路径path)
- log.info("数据入架构表");
- int rows = structureMapper.insert(structure);
- if (rows != 1) {
- String message = "新增架构失败,服务器忙请稍后再次尝试!";
- log.info("{}", message);
- throw new XiaoShiException(message);
- }
- //数据入架构表后,取出id
- Integer structureId = structure.getId();
- String parentPath = structureAddNewDTO.getParentPath();
- String path;
- if (parentPath != null) {
- path = parentPath + "," + structureId;
- } else {
- path = "0," + structureId;
- }
- structure.setPath(path);
- log.info("更新架构表");
- rows = structureMapper.update(structure);
- if (rows != 1) {
- String message = "新增架构失败,服务器忙请稍后再次尝试!";
- log.info("{}", message);
- throw new XiaoShiException(message);
- }
- //如果前端有传来架构图片,则图片上传服务器并获取图片信息,将图片信息入架构图片关联表
- if (files != null && files.size() > 0) {
- ArrayList<AssoStructurePicture> assoStructurePictures = new ArrayList<>();
- for (MultipartFile file : files) {
- UploadFileDTO fileDTO = fileUtils.uploadFile(file);
- AssoStructurePicture assoStructurePicture = new AssoStructurePicture()
- .setStructureId(structureId)
- .setName(fileDTO.getName())
- .setSuffix(fileDTO.getExtName())
- .setUrl(fileDTO.getPath());
- assoStructurePictures.add(assoStructurePicture);
- }
- rows = assoStructurePictureMapper.insertBatch(assoStructurePictures);
- if (rows != assoStructurePictures.size()) {
- String message = "新增架构失败,数据入架构图片关联表失败,服务器忙请稍后再次尝试!";
- log.info("{}", message);
- throw new XiaoShiException(message);
- }
- }
- log.info("新增架构完成");
- }
- /**
- * 修改架构
- *
- * @param structureUpdateDTO 修改架构DTO对象
- * @param files 架构图片
- */
- @Override
- public void update(StructureUpdateDTO structureUpdateDTO, List<MultipartFile> files) {
- log.info("开始处理【修改架构】的业务,参数为:{}, {}", structureUpdateDTO, files);
- //检查尝试修改的数据是否存在
- Integer structureId = structureUpdateDTO.getId();
- log.info("检查尝试修改的数据是否存在");
- Structure queryResult = structureMapper.getStandardById(structureId);
- if (queryResult == null) {
- String message = "修改架构失败,尝试访问的数据已不存在";
- log.info("{}", message);
- throw new XiaoShiException(message);
- }
- Integer newParentId = structureUpdateDTO.getParentId();
- String newStructureName = structureUpdateDTO.getStructureName();
- //检查名称是否被占用(检查当前尝试修改的架构父级下是否有同名架构)
- log.info("检查名称是否被占用(检查当前尝试修改的架构父级下是否有同名架构)");
- int count = structureMapper.countByparentIdAndStructureName(newParentId, newStructureName, structureId);
- if (count > 0) {
- String message = "修改架构失败,当前尝试修改的架构父级下已存在【" + newStructureName + "】,请尝试更换名称";
- log.info("{}", message);
- throw new XiaoShiException(message);
- }
- //DTO对象赋值给实体类
- Structure structure = new Structure();
- BeanUtils.copyProperties(structureUpdateDTO, structure);
- String parentPath = structureUpdateDTO.getParentPath();
- if (parentPath == null) {
- parentPath = "0";
- }
- String oldPath = queryResult.getPath();
- String newPath = parentPath + "," + structureId;
- if (!newPath.equals(oldPath)) {
- structure.setPath(newPath);
- }
- //架构表修改数据
- log.info("架构表修改数据");
- int rows = structureMapper.update(structure);
- if (rows != 1) {
- String message = "修改架构失败,服务器忙请稍后再次尝试!";
- log.info("{}", message);
- throw new XiaoShiException(message);
- }
- //如果当前修改的架构更换了父级,则要将当前架构下所有子级架构的路径也都更新
- Integer oldParentId = queryResult.getParentId();
- if (!oldParentId.equals(newParentId)) {
- //根据当前架构原来的路径查询所有子级架构
- List<StructureVO> structures = structureMapper.selectByFindInSetPath(oldPath);
- for (StructureVO n : structures) {
- String path = n.getPath();
- //从当前架构(即它们的父级架构)的原来的路径的长度的位置处截取后面路径
- String behindString = path.substring(oldPath.length());
- path = newPath + behindString;
- n.setPath(path);
- Structure structure2 = new Structure();
- BeanUtils.copyProperties(n, structure2);
- log.info("修改当前已更换父级的架构的子级架构路径path");
- rows = structureMapper.update(structure2);
- if (rows != 1) {
- String message = "修改架构失败,修改当前已更换父级的架构的子级架构路径path失败,服务器忙请稍后再次尝试!";
- log.info("{}", message);
- throw new XiaoShiException(message);
- }
- }
- }
- //架构图片关联表删除数据(若有原有图片被删除)
- //根据架构id查询出所有原有图片
- log.info("根据架构id查询出所有原有图片");
- List<StructurePictureVO> structurePictures = assoStructurePictureMapper.selectByStructureId(structureId);
- ArrayList<Integer> oldPictureIds = new ArrayList<>();
- for (StructurePictureVO structurePicture : structurePictures) {
- Integer oldPictureId = structurePicture.getId();
- oldPictureIds.add(oldPictureId);
- }
- //从DTO中获取传过来的原有图片
- List<StructurePictureUpdateDTO> pictures = structureUpdateDTO.getPictures();
- ArrayList<Integer> newOldPictureIds = new ArrayList<>();
- for (StructurePictureUpdateDTO picture : pictures) {
- Integer newOldPictureId = picture.getId();
- newOldPictureIds.add(newOldPictureId);
- }
- //图片id集合去重,保留下来的即被删除的图片id
- oldPictureIds.removeAll(newOldPictureIds);
- if (oldPictureIds.size() > 0) {
- log.info("架构图片关联表删除数据");
- rows = assoStructurePictureMapper.deleteByIds(oldPictureIds);
- if (rows != oldPictureIds.size()) {
- String message = "修改架构失败,架构图片关联表删除数据失败,服务器忙请稍后再次尝试!";
- log.info("{}", message);
- throw new XiaoShiException(message);
- }
- }
- //数据入架构图片关联表(若有新增新图片)
- if (files != null && files.size() != 0) {
- ArrayList<AssoStructurePicture> assoStructurePictures = new ArrayList<>();
- for (MultipartFile file : files) {
- UploadFileDTO fileDTO = fileUtils.uploadFile(file);
- AssoStructurePicture assoStructurePicture = new AssoStructurePicture()
- .setStructureId(structureId)
- .setName(fileDTO.getName())
- .setSuffix(fileDTO.getExtName())
- .setUrl(fileDTO.getPath());
- assoStructurePictures.add(assoStructurePicture);
- }
- log.info("数据入架构图片关联表");
- rows = assoStructurePictureMapper.insertBatch(assoStructurePictures);
- if (rows != files.size()) {
- String message = "修改架构失败,数据入架构图片关联表失败,服务器忙请稍后再次尝试!";
- log.info("{}", message);
- throw new XiaoShiException(message);
- }
- }
- log.info("修改架构完成");
- }
- /**
- * 分页查询架构树
- *
- * @param structureQueryPageDTO 分页信息
- * @return 返回查询到的数据
- */
- @Override
- public StructureVO query(StructureQueryPageDTO structureQueryPageDTO) {
- log.info("开始处理【查询架构树】的业务,参数为:{}", structureQueryPageDTO);
- //从DTO中取出产品id、架构id、架构名称
- Integer productId = structureQueryPageDTO.getProductId();
- Integer structureId = structureQueryPageDTO.getStructureId();
- StructureVO structureVO = new StructureVO();
- diGui(structureVO, structureId, productId);
- return structureVO;
- }
- /**
- * 查询架构路径和路径架构名称
- *
- * @return 返回查询到的数据
- */
- @Override
- public List<PathStructureNameVO> queryPathStructureName(Integer productId) {
- log.info("开始处理【查询所有架构路径和路径架构名称】的业务");
- List<StructureVO> structures = structureMapper.selectAllByProductId(productId);
- HashMap<String, String> map = new HashMap<>();
- for (StructureVO structure : structures) {
- Integer structureId = structure.getId();
- String structureStrId = structureId + "";
- String structureName = structure.getStructureName();
- map.put(structureStrId, structureName);
- }
- for (StructureVO structure : structures) {
- String path = structure.getPath();
- path = path.substring(path.indexOf(",") + 1);
- String[] split = path.split(",");
- for (String id : split) {
- map.get(id)
- }
- }
- return null;
- }
- /**
- * 删除架构
- *
- * @param id 架构id
- */
- @Override
- public void delete(Integer id) {
- log.info("开始处理【删除架构】的业务,参数为:{}", id);
- //检查尝试删除的数据是否存在
- Structure queryResult = structureMapper.getStandardById(id);
- if (queryResult == null) {
- String message = "删除架构失败,尝试访问的数据已不存在";
- log.info("{}", message);
- throw new XiaoShiException(message);
- }
- //根据架构id查询其所有子级架构
- ArrayList<Integer> structureIds = new ArrayList<>();
- structureIds.add(id);
- String path = queryResult.getPath();
- log.info("根据架构id查询其所有子级架构");
- List<StructureVO> structures = structureMapper.selectByFindInSetPath(path);
- for (StructureVO structure : structures) {
- Integer childStructureId = structure.getId();
- structureIds.add(childStructureId);
- }
- //架构和专利关联表删除数据
- log.info("架构和专利关联表删除数据");
- assoStructurePictureMapper.deleteByIds(structureIds);
- // if (rows != structureIds.size()) {
- // String message = "删除架构失败,架构和专利关联表删除数据失败,服务器忙请稍后再次尝试";
- // log.info("{}", message);
- // throw new XiaoShiException(message);
- // }
- //架构和图片关联表删除数据
- log.info("架构和图片关联表删除数据");
- assoStructurePictureMapper.deleteByStructureIds(structureIds);
- // if (rows != structureIds.size()) {
- // String message = "删除架构失败,架构和图片关联表删除数据失败,服务器忙请稍后再次尝试";
- // log.info("{}", message);
- // throw new XiaoShiException(message);
- // }
- //架构表删除数据
- log.info("架构表删除数据");
- int rows = structureMapper.deleteByIds(structureIds);
- if (rows != structureIds.size()) {
- String message = "删除架构失败,架构表删除数据失败,服务器忙请稍后再次尝试";
- log.info("{}", message);
- throw new XiaoShiException(message);
- }
- log.info("删除架构完成");
- }
- //递归组装架构树集合
- private void diGui(StructureVO structureVO, Integer structureId, Integer productId) {
- List<StructureVO> structureVOs = structureMapper.selectByParentIdAndProductId(structureId, productId);
- if (structureVOs != null) {
- structureVO.setChildren(structureVOs);
- for (StructureVO n : structureVOs) {
- structureId = n.getId();
- diGui(n, structureId, productId);
- }
- }
- }
- }
|