Helius
2022-05-27 4351e71d782741143a98f86f6648acd16689165f
zq-erp/src/main/java/com/matrix/system/common/service/impl/SysCompanyServiceImpl.java
@@ -1,32 +1,43 @@
package com.matrix.system.common.service.impl;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONUtil;
import com.matrix.core.constance.MatrixConstance;
import com.matrix.core.constance.SystemErrorCode;
import com.matrix.core.exception.GlobleException;
import com.matrix.core.pojo.PaginationVO;
import com.matrix.core.tools.LogUtil;
import com.matrix.core.tools.ModelUtils;
import com.matrix.core.tools.StringUtils;
import com.matrix.core.tools.WebUtil;
import com.matrix.system.common.bean.*;
import com.matrix.system.app.authority.AppAuthorityManager;
import com.matrix.system.common.authority.DefaultAuthorityManager;
import com.matrix.system.common.bean.SysCompany;
import com.matrix.system.common.bean.SysRole;
import com.matrix.system.common.bean.SysRolePwoerFn;
import com.matrix.system.common.bean.SysUsers;
import com.matrix.system.common.constance.AppConstance;
import com.matrix.system.common.dao.SysCompanyDao;
import com.matrix.system.common.dao.SysRoleDao;
import com.matrix.system.common.dao.SysRolePwoerFnDao;
import com.matrix.system.common.init.LocalCache;
import com.matrix.system.common.service.SysCompanyService;
import com.matrix.system.common.service.SysUsersService;
import com.matrix.system.hive.bean.SysShopInfo;
import com.matrix.system.hive.bean.Warehouse;
import com.matrix.system.hive.dao.SysShopInfoDao;
import com.matrix.system.hive.dao.WarehouseDao;
import com.matrix.system.hive.plugin.util.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 公司管理
 *
 *
 * @author JIANGYOUYAO
 * @email 935090232@qq.com
 * @date Dec 11, 2017
@@ -34,212 +45,256 @@
@Service
public class SysCompanyServiceImpl implements SysCompanyService {
   @Autowired
   private SysCompanyDao sysCompanyDao;
   @Autowired
   private SysRoleDao sysRoleDao;
   @Autowired
   private SysRolePwoerFnDao rolePwoerFnDao;
    @Autowired
    private SysCompanyDao sysCompanyDao;
    @Autowired
    private SysRoleDao sysRoleDao;
    @Autowired
    private SysRolePwoerFnDao rolePwoerFnDao;
   @Autowired
   private SysShopInfoDao shopInfoDao;
    @Autowired
    private SysShopInfoDao shopInfoDao;
   @Autowired
   private InitCustomerDataDictionaryService initCustomerDataDictionaryService;
    @Autowired
    private InitCustomerDataDictionaryService initCustomerDataDictionaryService;
   @Autowired
   private InitShoppingGoodsCategoryService initShoppingGoodsCategoryService;
    @Autowired
    private InitShoppingGoodsCategoryService initShoppingGoodsCategoryService;
   @Autowired
   private InitRolePowerService initRolePowerService;
    @Autowired
    private InitRolePowerService initRolePowerService;
   @Autowired
   private InitGoodsTypeService initGoodsTypeService;
    @Autowired
    private InitGoodsTypeService initGoodsTypeService;
   @Autowired
   private InitShopProductCateService initShopProductCateService;
    @Autowired
    private InitShopProductCateService initShopProductCateService;
    @Autowired
    private InitBusParameterSettingService initBusParameterSettingService;
   @Transactional
   @Override
   public int add(SysCompany sysCompany) {
      SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
      sysCompany.setCreateBy(user.getSuName());
      sysCompany.setUpdateBy(user.getSuName());
      int i= sysCompanyDao.insert(sysCompany);
      SysShopInfo zbShop=   addZbShop(sysCompany);
      initCustomerDataDictionaryService.initCustomerDataDictionary(sysCompany);
      initShoppingGoodsCategoryService.initShoppingGoodsCategory(sysCompany,zbShop);
      initRolePowerService.initRolePower(sysCompany);
      initGoodsTypeService.initRolePower(sysCompany);
      initShopProductCateService.initShopProductCate(sysCompany);
    @Transactional
    @Override
    public int add(SysCompany sysCompany) {
        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        sysCompany.setCreateBy(user.getSuName());
        sysCompany.setUpdateBy(user.getSuName());
        int i = sysCompanyDao.insert(sysCompany);
        SysShopInfo zbShop = addZbShop(sysCompany);
        initCustomerDataDictionaryService.initCustomerDataDictionary(sysCompany);
        initShoppingGoodsCategoryService.initShoppingGoodsCategory(sysCompany, zbShop);
        initRolePowerService.initRolePower(sysCompany);
        initGoodsTypeService.initRolePower(sysCompany);
        initShopProductCateService.initShopProductCate(sysCompany);
        initBusParameterSettingService.initBusParameterSetting(sysCompany);
        initBusParameterSettingService.initBusParameterFenxiaoSetting(sysCompany);
      return i;
        return i;
   }
    }
   @Autowired
   private WarehouseDao warehouseDao;
   /**
    * 为新公司创建一个总部
    * @param sysCompany
    */
   private SysShopInfo addZbShop(SysCompany sysCompany) {
      SysShopInfo zbShopInfo=new SysShopInfo();
      zbShopInfo.setShopType(SysShopInfo.SHOP_TYPE_ZONGBU);
      zbShopInfo.setShopName(sysCompany.getComName()+"(总部)");
      zbShopInfo.setCompanyId(sysCompany.getComId());
      zbShopInfo.setShopTel(sysCompany.getComTel());
      zbShopInfo.setShopShortName("总部");
      zbShopInfo.setIsOpenNet(SysShopInfo.CLOSE_NET);
      zbShopInfo.setShopNo(StringUtils.getRandomString(10));
      shopInfoDao.insert(zbShopInfo);
    @Autowired
    private WarehouseDao warehouseDao;
      //新增一个总部仓库
      Warehouse warehouse=new Warehouse();
      warehouse.setCompanyId(sysCompany.getComId());
      warehouse.setName("总部仓库");
      warehouse.setShopId(zbShopInfo.getId());
      warehouse.setSort("1");
      warehouseDao.insert(warehouse);
      return  zbShopInfo;
   }
    /**
     * 为新公司创建一个总部
     *
     * @param sysCompany
     */
    private SysShopInfo addZbShop(SysCompany sysCompany) {
        SysShopInfo zbShopInfo = new SysShopInfo();
        zbShopInfo.setShopType(SysShopInfo.SHOP_TYPE_ZONGBU);
        zbShopInfo.setShopName(sysCompany.getComName() + "(总部)");
        zbShopInfo.setCompanyId(sysCompany.getComId());
        zbShopInfo.setShopTel(sysCompany.getComTel());
        zbShopInfo.setShopShortName("总部");
        zbShopInfo.setIsOpenNet(SysShopInfo.CLOSE_NET);
        zbShopInfo.setShopNo(StringUtils.getRandomString(10));
        shopInfoDao.insert(zbShopInfo);
   @Transactional(rollbackFor = Exception.class)
   @Override
   public int modifyByMap(SysCompany oldSysCompany, SysCompany newSysCompany) {
      SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
      newSysCompany.setUpdateBy(user.getSuName());
        //新增一个总部仓库
        Warehouse warehouse = new Warehouse();
        warehouse.setCompanyId(sysCompany.getComId());
        warehouse.setName("总部仓库");
        warehouse.setShopId(zbShopInfo.getId());
        warehouse.setSort("1");
        warehouseDao.insert(warehouse);
        return zbShopInfo;
    }
      updatePower(newSysCompany);
      Map<String, Object> modifyMap = null;
      try {
         if (!ModelUtils.isModified(oldSysCompany, newSysCompany)) {
            return MatrixConstance.DML_SUCCESSS;
         }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int modifyByMap(SysCompany oldSysCompany, SysCompany newSysCompany) {
        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        newSysCompany.setUpdateBy(user.getSuName());
         modifyMap = ModelUtils.comparePojo2Map(oldSysCompany, newSysCompany);
      } catch (Exception e) {
         throw new GlobleException(SystemErrorCode.DATA_UPDATE_FAIL, e, newSysCompany.getComName());
      }
      if (modifyMap.size() > 0) {
         modifyMap.put("comId", oldSysCompany.getComId());
         return sysCompanyDao.updateByMap(modifyMap);
      }
      return MatrixConstance.DML_SUCCESSS;
   }
        updatePower(newSysCompany);
        Map<String, Object> modifyMap = null;
        try {
            if (!ModelUtils.isModified(oldSysCompany, newSysCompany)) {
                return MatrixConstance.DML_SUCCESSS;
            }
   /**
    * 更新公司员工权限
    *
    * @author JIANGYOUYAO
    * @email 935090232@qq.com
    * @date 2017年12月5日
    * @param newSysCompany
    */
   private void updatePower(SysCompany newSysCompany) {
      List<String> oldFunctions = null;
      String functions = sysCompanyDao.selectById(newSysCompany.getComId()).getComFunctions();
      if (functions == null || functions.equals("")) {
         oldFunctions = new ArrayList<>();
      } else {
         oldFunctions = StringUtils
               .strToCollToString(sysCompanyDao.selectById(newSysCompany.getComId()).getComFunctions(), ",");
      }
      List<String> newFunctions = new ArrayList<>();
      if (StringUtils.isNotBlank(newSysCompany.getComFunctions())) {
         newFunctions = StringUtils.strToCollToString(newSysCompany.getComFunctions(), ",");
      }
            modifyMap = ModelUtils.comparePojo2Map(oldSysCompany, newSysCompany);
        } catch (Exception e) {
            throw new GlobleException(SystemErrorCode.DATA_UPDATE_FAIL, e, newSysCompany.getComName());
        }
        if (modifyMap.size() > 0) {
            modifyMap.put("comId", oldSysCompany.getComId());
            return sysCompanyDao.updateByMap(modifyMap);
        }
        return MatrixConstance.DML_SUCCESSS;
    }
      for (String old : oldFunctions) {
         // 如果新权限中不包含这个老的功能,则要更新改企业下所有的角色权限
         if (!newFunctions.contains(old)) {
            SysRole role = new SysRole();
            role.setCompanyId(newSysCompany.getComId());
            List<SysRole> roles = sysRoleDao.selectByModel(role);
            // 获取该公司下所有的权限信息
            List<SysRolePwoerFn> compalyRolePwoer = new ArrayList<>();
            for (SysRole tempRole : roles) {
               SysRolePwoerFn r = new SysRolePwoerFn();
               r.setRoleId(tempRole.getRoleId());
               compalyRolePwoer.addAll(rolePwoerFnDao.selectByModel(r));
            }
            // 记录要删除的id
            List<String> delRolePwoer = new ArrayList<>();
            for (SysRolePwoerFn rolePwoer : compalyRolePwoer) {
               // 如果有一个老权限则删除这个权限
               if (rolePwoer.getFnId() != null && rolePwoer.getFnId().equals(old)) {
                  delRolePwoer.add(rolePwoer.getRpfId()+"");
               }
            }
            // 如果获取到了就删除
            if (!delRolePwoer.isEmpty()) {
               rolePwoerFnDao.deleteByIds(delRolePwoer);
            }
         }
      }
   }
    /**
     * 更新公司员工权限
     *
     * @param newSysCompany
     * @author JIANGYOUYAO
     * @email 935090232@qq.com
     * @date 2017年12月5日
     */
    private void updatePower(SysCompany newSysCompany) {
        List<String> oldFunctions = null;
        String functions = sysCompanyDao.selectById(newSysCompany.getComId()).getComFunctions();
        if (functions == null || functions.equals("")) {
            oldFunctions = new ArrayList<>();
        } else {
            oldFunctions = StringUtils
                    .strToCollToString(sysCompanyDao.selectById(newSysCompany.getComId()).getComFunctions(), ",");
        }
        List<String> newFunctions = new ArrayList<>();
        if (StringUtils.isNotBlank(newSysCompany.getComFunctions())) {
            newFunctions = StringUtils.strToCollToString(newSysCompany.getComFunctions(), ",");
        }
   @Override
   public int modifyByModel(SysCompany sysCompany) {
        Collections.sort(newFunctions);
        Collections.sort(oldFunctions);
        if (Objects.equals(JSONUtil.toJsonStr(newFunctions), JSONUtil.toJsonStr(oldFunctions))) {
            //没有更新的权限
            return;
        }
      return sysCompanyDao.updateByModel(sysCompany);
        List<String> finalNewFunctions = newFunctions;
        List<String> deletedFn = oldFunctions.stream().map(old -> {
            if (finalNewFunctions.stream().noneMatch(newFn -> Objects.equals(newFn, old))) {
                return old;
            } else {
                return "";
            }
        }).filter(item->StringUtils.isNotBlank(item)).collect(Collectors.toList());
   }
        if(CollectionUtils.isNotEmpty(deletedFn)){
            rolePwoerFnDao.deleteByFns(newSysCompany.getComId(),deletedFn);
            //有更新权限清空缓存
            SysUsers sysUsers = new SysUsers();
            sysUsers.setCompanyId(newSysCompany.getComId());
            sysUsers.setSuValid(AppConstance.RECORD_VALID);
            List<SysUsers> users = sysUsersService.findByModel(sysUsers);
            users.forEach(user -> {
                String userKey = SecureUtil.md5(user.getSuId() + "");
                LocalCache.remove(DefaultAuthorityManager.USER_POWER_REDISKEY_PC + userKey);
                LocalCache.remove(AppAuthorityManager.USER_POWER_REDISKEY_APP + userKey);
            });
        }
   @Override
   public int remove(List<String> list) {
      return sysCompanyDao.deleteByIds(list);
   }
/*        for (String old : oldFunctions) {
            // 如果新权限中不包含这个老的功能,则要更新改企业下所有的角色权限
            if (!newFunctions.contains(old)) {
                SysRole role = new SysRole();
                role.setCompanyId(newSysCompany.getComId());
                List<SysRole> roles = sysRoleDao.selectByModel(role);
                // 获取该公司下所有的权限信息
                List<SysRolePwoerFn> compalyRolePwoer = new ArrayList<>();
                for (SysRole tempRole : roles) {
                    SysRolePwoerFn r = new SysRolePwoerFn();
                    r.setRoleId(tempRole.getRoleId());
                    compalyRolePwoer.addAll(rolePwoerFnDao.selectByModel(r));
                }
                // 记录要删除的id
                List<String> delRolePwoer = new ArrayList<>();
                for (SysRolePwoerFn rolePwoer : compalyRolePwoer) {
                    // 如果有一个老权限则删除这个权限
                    if (rolePwoer.getFnId() != null && rolePwoer.getFnId().equals(old)) {
                        delRolePwoer.add(rolePwoer.getRpfId() + "");
                    }
                }
                // 如果获取到了就删除
                if (!delRolePwoer.isEmpty()) {
                    rolePwoerFnDao.deleteByIds(delRolePwoer);
                }
            }
        }*/
   @Override
   public int removeById(String comId) {
      return sysCompanyDao.deleteById(Long.parseLong(comId));
   }
    }
   @Override
   public int removeByModel(SysCompany sysCompany) {
    @Autowired
    SysUsersService sysUsersService;
      return sysCompanyDao.deleteByModel(sysCompany);
    @Override
    public int modifyByModel(SysCompany sysCompany) {
   }
        return sysCompanyDao.updateByModel(sysCompany);
   @Override
   public List<SysCompany> findInPage(SysCompany sysCompany, PaginationVO pageVo) {
    }
      return sysCompanyDao.selectInPage(sysCompany, pageVo);
    @Override
    public int remove(List<String> list) {
   }
        return sysCompanyDao.deleteByIds(list);
   @Override
   public List<SysCompany> findByModel(SysCompany sysCompany) {
    }
      return sysCompanyDao.selectByModel(sysCompany);
    @Override
    public int removeById(String comId) {
   }
        return sysCompanyDao.deleteById(Long.parseLong(comId));
   @Override
   public int findTotal(SysCompany sysCompany) {
    }
      return sysCompanyDao.selectTotalRecord(sysCompany);
    @Override
    public int removeByModel(SysCompany sysCompany) {
   }
        return sysCompanyDao.deleteByModel(sysCompany);
   @Override
   public SysCompany findById(String comId) {
    }
      return sysCompanyDao.selectById(Long.parseLong(comId));
    @Override
    public List<SysCompany> findInPage(SysCompany sysCompany, PaginationVO pageVo) {
   }
        return sysCompanyDao.selectInPage(sysCompany, pageVo);
    }
    @Override
    public List<SysCompany> findByModel(SysCompany sysCompany) {
        return sysCompanyDao.selectByModel(sysCompany);
    }
    @Override
    public int findTotal(SysCompany sysCompany) {
        return sysCompanyDao.selectTotalRecord(sysCompany);
    }
    @Override
    public SysCompany findById(String comId) {
        return sysCompanyDao.selectById(Long.parseLong(comId));
    }
}