MrShi
2025-08-19 ff087240b3dee29ce4e14ad0836e76b9fdf312cf
server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -1,6 +1,8 @@
package com.doumee.service.business.impl;
import com.doumee.core.constants.Constants;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.doumee.core.annotation.excel.ExcelImporter;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
@@ -10,14 +12,13 @@
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CategoryMapper;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.vo.CategoryDcaProblemDto;
import com.doumee.dao.business.vo.CompanyTree;
import com.doumee.dao.web.vo.CategoryMapTree;
import com.doumee.dao.web.vo.CategoryVO;
import com.doumee.dao.web.vo.CategoryVOTree;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.Managers;
import com.doumee.dao.business.vo.CategoryTree;
import com.doumee.dao.business.vo.CompanyTree;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.CategoryService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -25,17 +26,24 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.models.auth.In;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -46,6 +54,8 @@
@Service
public class CategoryServiceImpl implements CategoryService {
    @Resource(name="sessionRedisTemplate")
    private RedisTemplate<Object, Serializable> redisTemplate;
    @Autowired
    private CategoryMapper categoryMapper;
@@ -375,8 +385,492 @@
        }
        return categoryVOList;
    }
    public   List<Category>  findAllListForDca() {
        List<Category> categoryList = categoryMapper.selectList(new QueryWrapper<Category>().lambda()
                .eq(Category::getIsdeleted, Constants.ZERO)
                .in(Category::getType, Constants.FOUR, Constants.SIX)//主题和观察项
                .orderByAsc(Category::getSortnum)
        );
        return  categoryList;
    }
    public   List<Category>  findListForDcaTree(   List<Category> categoryList) {
        if (com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryList)) {
            long index = 1;
            List<Category> pList = new ArrayList<>();
            for (Category category : categoryList) {
                if (category.getParentId() == null) {
                    category.setChildList(new ArrayList<>());
                    for (Category cc : categoryList) {
                        if (Constants.equalsInteger(cc.getParentId(), category.getId())) {
                            cc.setChildList(new ArrayList<>());
                            for (Category ccc : categoryList) {
                                if (Constants.equalsInteger(ccc.getParentId(), cc.getId())) {
                                    cc.getChildList().add(ccc);
                                }
                            }
                            category.getChildList().add(cc);
                        }
                    }
                    pList.add(category);
                }
            }
            return pList;
        }
        return  null;
    }
    public   List<Category>  findImportTreeForDca (  List<CategoryDcaProblemDto> categoryList,LoginUserInfo user, Date date) {
        List<Category> pList = new ArrayList<>();
        if (com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryList)) {
            Integer index = 1;
            for (CategoryDcaProblemDto categoryDcaProblemDto : categoryList) {
                if(StringUtils.isBlank(categoryDcaProblemDto.getProblem())
                        &&StringUtils.isBlank(categoryDcaProblemDto.getParentName())
                        &&StringUtils.isBlank(categoryDcaProblemDto.getTypeName()) ){
                    //去空行
                    continue;
                }
                if(StringUtils.isBlank(categoryDcaProblemDto.getParentName())){
                    throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,表格第【"+(index + 1)+"】行一级主题信息不能为空,请返回检查表格信息!");
                }
                categoryDcaProblemDto.setProblem(StringUtils.defaultString(categoryDcaProblemDto.getProblem(),"").trim());
                categoryDcaProblemDto.setTypeName(StringUtils.defaultString(categoryDcaProblemDto.getTypeName(),"").trim());
                categoryDcaProblemDto.setParentName(StringUtils.defaultString(categoryDcaProblemDto.getParentName(),"").trim());
                Category first = getNewCateFromListByName(categoryDcaProblemDto.getParentName(), pList);
                if(first == null){
                    first = new Category();
                    first.setIsdeleted(Constants.ZERO);
                    first.setCreateDate(date);
                    first.setCreator(user.getId());
                    first.setIsdeleted(Constants.ZERO);
                    first.setStatus(Constants.ZERO);
                    first.setEditDate(date);
                    first.setEditor(user.getId());
                    first.setName(categoryDcaProblemDto.getParentName());
                    first.setType(Constants.FOUR);//主题
                    first.setSortnum(index++);
                    first.setChildList(new ArrayList<>());
                    pList.add(first);
                    List<Category> childList = getSecondListFromImport(first,0,categoryList);
                    first.setChildList(childList);
                }
            }
        }
        return  pList;
    }
    private List<Category> getSecondListFromImport(Category parent,int type,   List<CategoryDcaProblemDto> categoryList) {
        List<Category> pList = new ArrayList<>();
        Integer index = 1;
        for (CategoryDcaProblemDto categoryDcaProblemDto : categoryList) {
            if(type ==0 && (StringUtils.isBlank(categoryDcaProblemDto.getTypeName()) || StringUtils.isBlank(categoryDcaProblemDto.getProblem()))){
                //去空行
                continue;
            }
            if(type ==1 &&(StringUtils.isBlank(categoryDcaProblemDto.getProblem()))){
                //去空行
                continue;
            }
            if(type ==0 && StringUtils.isBlank(categoryDcaProblemDto.getTypeName())){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,表格第【"+(index + 1)+"】行二级主题信息不能为空,请返回检查表格信息!");
            }
            if(type == 0 && !StringUtils.equals(categoryDcaProblemDto.getParentName(),parent.getName())){
                //只处理子级
                continue;
            }
            if(type == 1 && !StringUtils.equals(categoryDcaProblemDto.getTypeName(),parent.getName())){
                //只处理子级
                continue;
            }
            Category model = getNewCateFromListByName(type == 0 ?categoryDcaProblemDto.getTypeName():categoryDcaProblemDto.getProblem(), pList);
            if(model == null){
                model = new Category();
                model.setIsdeleted(Constants.ZERO);
                model.setCreateDate(parent.getCreateDate());
                model.setCreator(parent.getCreator());
                model.setIsdeleted(Constants.ZERO);
                model.setStatus(Constants.ZERO);
                model.setEditDate(parent.getCreateDate());
                model.setEditor(parent.getCreator());
                model.setName(type == 0 ?categoryDcaProblemDto.getTypeName():categoryDcaProblemDto.getProblem());
                model.setType(type == 0 ? Constants.FOUR:Constants.SIX);//
                model.setSortnum(index++);
                model.setChildList(new ArrayList<>());
                pList.add(model);
            }
            if(type == 0){
                //如果是二级主题处理获取子集部门
                List<Category> childList = getSecondListFromImport(model,1,categoryList);
                model.setChildList(childList);
            }
        }
        return  pList;
    }
    private Category getNewCateFromListByName(String parentName, List<Category> pList) {
        if(pList ==null){
            return  null;
        }
        for(Category cate : pList){
            if(StringUtils.equals(parentName,cate.getName())){
                    return cate;
            }
        }
        return null;
    }
    private Category getNewCateFromListByNameAndParent(String parentName,int type,boolean isRoot, List<Category> pList) {
        for(Category cate : pList){
            if(StringUtils.equals(parentName,cate.getName()) && Constants.equalsInteger(cate.getType(),type)){
                if(isRoot && cate.getParentId()==null){
                    return cate;
                }else  if(isRoot && cate.getParentId()==null){
                    return cate;
                }
            }
        }
        return null;
    }
    @Override
    public   List<CategoryDcaProblemDto>  findListForDca(Category param){
        long index =1;
        List<CategoryDcaProblemDto>  categoryVOList = new ArrayList<>();
        List<Category> pList = findListForDcaTree( findAllListForDca());
        for (Category category:pList) {
            if(category.getChildList().size() ==0){
                CategoryDcaProblemDto categoryVO = new CategoryDcaProblemDto();
                categoryVO.setIndex(index);
                categoryVO.setParentName(category.getName());
                index++;
                categoryVOList.add(categoryVO);
            }else{
                for (Category cc:category.getChildList()) {
                    if(cc.getChildList().size() ==0){
                        CategoryDcaProblemDto categoryVO = new CategoryDcaProblemDto();
                        categoryVO.setIndex(index);
                        categoryVO.setParentName(category.getName());
                        categoryVO.setTypeName(cc.getName());
                        index++;
                        categoryVOList.add(categoryVO);
                    }else{
                        for (Category ccc:cc.getChildList()) {
                            CategoryDcaProblemDto categoryVO = new CategoryDcaProblemDto();
                            categoryVO.setIndex(index);
                            categoryVO.setParentName(category.getName());
                            categoryVO.setTypeName(cc.getName());
                            categoryVO.setProblem(ccc.getName());
                            index++;
                            categoryVOList.add(categoryVO);
                        }
                    }
                }
            }
        }
        return categoryVOList;
    }
    @Override
    @PostConstruct
    public String initRedis(){
        redisTemplate.delete(Constants.RedisKeys.IMPORTING_CATEGORY);
        return  "";
    }
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public String importDcaBatch(MultipartFile file){
        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_CATEGORY);
        if(importing!=null && importing){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,已存在员工导入任务正在执行中,请稍后再试!");
        }
        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_CATEGORY,true);
        try {
            ExcelImporter ie = null;
            List<CategoryDcaProblemDto> dataList =null;
            try {
                ie = new ExcelImporter(file,0,0, CellType.STRING); // 确保单元格类型为字符串);
                dataList = ie.getDataList(CategoryDcaProblemDto.class,null);
            }  catch (Exception e) {
                e.printStackTrace();
            }
            if(dataList == null || dataList.size() ==0){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入数据为空!");
            }
            Date date = new Date();
            LoginUserInfo user = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
            List<Category> treeImportList =   findImportTreeForDca(dataList,user,date);//查询现有的全部主题观察项数据
            if(treeImportList == null || treeImportList.size() ==0){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入的有效数据为空!");
            }
            //查询现有的全部主题观察项数据
            List<Category> list = categoryMapper.selectJoinList(Category.class,new MPJLambdaWrapper<Category>()
                             .selectAll(Category.class)
//                             .select("t1.name",Category::getParentName)
//                             .select("t2.name",Category::getRootName)
//                             .leftJoin(Category.class,Category::getId,Category::getParentId)
//                             .leftJoin( "category t2 on t1.parent_id=t2.id")
                            .eq(Category::getIsdeleted, Constants.ZERO)
                            .in(Category::getType, Constants.FOUR, Constants.SIX)//主题和观察项
                            .orderByAsc(Category::getSortnum)
            ) ;
            List<Category> treeList =   findListForDcaTree(list);//查询现有的全部主题观察项数据
            List<Integer> allUpdateIds = new ArrayList<>();
            dealImportNewOrUpdateBiz(treeList,treeImportList,allUpdateIds);
            dealDeletedList(list,allUpdateIds,user,date);//处理删除的数据信息
            dealTreePathInfo(treeImportList);
            return "导入成功";
        }catch (BusinessException e){
            throw e;
        }catch (Exception e){
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"员工信息导入失败,请稍后重试");
        }finally {
            redisTemplate.delete(Constants.RedisKeys.IMPORTING_CATEGORY);
        }
    }
    private void dealImportNewOrUpdateBiz(List<Category> treeList, List<Category> treeImportList, List<Integer> allUpdateIds) {
        List<Category> newList = new ArrayList<>();
        List<Category> updateList = new ArrayList<>();
        for(Category tmodel :treeImportList){
            //处理一级主题增改逻辑
            //查询是否存在名称相同的一级主题,存在则更新,不存在则新增
            Category first = getNewCateFromListByName(tmodel.getName(),treeList);
            if(first!=null){
                tmodel.setId(first.getId());
                tmodel.setChildMatchList(first.getChildList());
                allUpdateIds.add(first.getId());
                updateList.add(tmodel);
            }else{
                newList.add(tmodel);
            }
        }
        //先批量处理一级主题的增改数据,刷新一级主题对象的编码
        if(newList.size() >0){
            categoryMapper.insert(newList);
        }
        if( updateList.size() >0){
            for(Category update :updateList){
                categoryMapper.updateById(update);
            }
        }
        dealSecChildList(newList,updateList,allUpdateIds,1);//处理二级数据
    }
    private void dealDeletedList(List<Category> list, List<Integer> allUpdateIds, LoginUserInfo user, Date date) {
        List<Integer> deleteList = new ArrayList<>();
        for(Category cate : list){
            for(Integer nowId : allUpdateIds){
                if(Constants.equalsInteger(cate.getId(),nowId)){
                    continue;
                }
                deleteList.add(cate.getId());
            }
        }
        if(deleteList.size() >0){
            //删除不存在的
            categoryMapper.update(null,new UpdateWrapper<Category>().lambda()
                    .set(Category::getIsdeleted,Constants.ONE)
                    .set(Category::getEditor,user.getId())
                    .set(Category::getEditDate,date)
                    .in(Category::getId,deleteList));
        }
    }
    private void dealSecChildList(List<Category> newList, List<Category> updateList,List<Integer> allUpdateIds,int level) {
        List<Category> childNewList = new ArrayList<>();
        List<Category> childUpdateList = new ArrayList<>();
        if(newList.size() >0 || updateList.size()>0) {
            for(Category c : newList){
                if(c.getChildList()!=null && c.getChildList().size()>0){
                    for(Category sec : c.getChildList()){
                        sec.setParentId(c.getId());
                    }
                    childNewList.addAll(c.getChildList());
                }
            }
            for(Category c : updateList){
                if(c.getChildList()!=null && c.getChildList().size()>0){
                    List<Category> tList = c.getChildMatchList();
                    for(Category sec : c.getChildList()){
                        sec.setParentId(c.getId());
                        Category mmodel = getNewCateFromListByName(sec.getName(),tList);
                        if(mmodel!=null){
                            sec.setId(mmodel.getId());
                            sec.setChildMatchList(mmodel.getChildList());
                            allUpdateIds.add(mmodel.getId());
                            childUpdateList.add(sec);
                        }else{
                            childNewList.add(sec);
                        }
                    }
                }
            }
        }
        if(childNewList.size() >0){
            categoryMapper.insert(childNewList);
        }
        if( childUpdateList.size() >0){
            for(Category update :childUpdateList){
                categoryMapper.updateById(update);
            }
        }
        if(level == 1){
            dealSecChildList(childNewList,childUpdateList,allUpdateIds,2);//处理三级级数据
        }
    }
    private void dealTreePathInfo(List<Category> tree) {
        if(tree!=null || tree.size()>0){
            for(Category t : tree){
                t.setIdPath(t.getId()+"/");
                t.setNamePath(t.getName());
                categoryMapper.updateById(t);
                dealChildParentId(t,t.getChildList());
            }
        }
    }
    private void dealChildParentId(Category t, List<Category> childList) {
        if(childList ==null || childList.size()==0){
            return;
        }
        for(Category c : childList){
            c.setParentId(t.getId());
            c.setIdPath(t.getIdPath()+c.getId()+"/");
            c.setNamePath(t.getNamePath()+"/"+c.getName());
            categoryMapper.updateById(c);
            if(t.getChildList()!=null || t.getChildList().size()==0){
                //递归处理子集
                dealChildParentId(c,c.getChildList());
            }
        }
    }
    @Override
    public void dealjson(){
        String json = "";
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader("d://file.txt"));
            String line;
            while ((line = reader.readLine()) != null) {
                json = json + line;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null){
                    reader.close();
                };
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        JSONObject jsonObject = JSONObject.parseObject(json);
        JSONArray jsonArray = jsonObject.getJSONArray("data");
        List<Map<String,Object>> mapList = new ArrayList<>();
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsons = jsonArray.getJSONObject(i);
            Map<String,Object> map = new HashMap<>();
            map.put("id",jsons.getString("id"));
            map.put("level",jsons.getInteger("level"));
            map.put("name",jsons.getString("name"));
            map.put("parentId",jsons.getString("parentId"));
            mapList.add(map);
        }
        CategoryMapTree categoryMapTree = new CategoryMapTree(mapList);
        mapList = categoryMapTree.buildTree();
        for (Map<String,Object> map:mapList) {
            Category category = new Category();
            category.setCreateDate(new Date());
            category.setIsdeleted(Constants.ZERO);
            category.setStatus(Constants.ZERO);
            category.setType(Constants.SIX);
            category.setName(map.get("name").toString());
            category.setNamePath(map.get("name").toString());
            categoryMapper.insert(category);
            if(Objects.nonNull(map.get("childTree"))){
                List<Map<String,Object>> childOneMap = (List<Map<String, Object>>) map.get("childTree");
                for (Map<String,Object> oneMap:childOneMap) {
                    Category oneCategory = new Category();
                    oneCategory.setCreateDate(new Date());
                    oneCategory.setIsdeleted(Constants.ZERO);
                    oneCategory.setStatus(Constants.ZERO);
                    oneCategory.setType(Constants.SIX);
                    oneCategory.setName(oneMap.get("name").toString());
                    oneCategory.setNamePath(category.getNamePath()+"/"+oneCategory.getName());
                    oneCategory.setParentId(category.getId());
                    categoryMapper.insert(oneCategory);
                    if(Objects.nonNull(oneMap.get("childTree"))){
                        List<Map<String,Object>> childTwoMap = (List<Map<String, Object>>) oneMap.get("childTree");
                        for (Map<String,Object> twoMap:childTwoMap) {
                            Category twoCategory = new Category();
                            twoCategory.setCreateDate(new Date());
                            twoCategory.setIsdeleted(Constants.ZERO);
                            twoCategory.setStatus(Constants.ZERO);
                            twoCategory.setType(Constants.SIX);
                            twoCategory.setName(twoMap.get("name").toString());
                            twoCategory.setNamePath(oneCategory.getNamePath() + "/" + twoCategory.getName());
                            twoCategory.setParentId(oneCategory.getId());
                            categoryMapper.insert(twoCategory);
                        }
                    }
                }
            }
        }
//        for (int i = 0; i < jsonArray.size(); i++) {
//            JSONObject  jsonObject1 = jsonArray.getJSONObject(i);
//            if(Constants.equalsInteger(jsonObject1.getInteger("level"),Constants.ONE)){
//                Boolean iHavaChild = false;
//                for (int k = 0; i < jsonArray.size(); i++) {
//                    JSONObject  jsonObject2 = jsonArray.getJSONObject(k);
//
//                    Boolean kHavaChild = false;
//                    if(Constants.equalsInteger(jsonObject2.getInteger("level"),Constants.TWO)
//                            &&jsonObject2.getString("parentId").equals(jsonObject1.getString("id"))){
//                        iHavaChild = true;
//
//                        for (int g = 0; i < jsonArray.size(); i++) {
//                            JSONObject jsonObject3 = jsonArray.getJSONObject(g);
//                            if(Constants.equalsInteger(jsonObject3.getInteger("level"),Constants.THREE)
//                                    &&jsonObject3.getString("parentId").equals(jsonObject2.getString("id"))) {
//                                kHavaChild = true;
//
//                                System.out.println(j.getString("id")+"---"+j.getString("name").replace("\n","")+"---"+j.getInteger("level")+"---"+j.getString("parentId"));
//                            }
//                        }
//
//                    }
//                }
//                if(!iHavaChild){
//
//                }
//            }
//
//
////            System.out.println(j.getString("id")+"---"+j.getString("name").replace("\n","")+"---"+j.getInteger("level")+"---"+j.getString("parentId"));
//        }
    }
}