package org.jeecg.modules.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.FillRuleConstant; import org.jeecg.common.util.FillRuleUtil; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.mapper.MdcProductionEquipmentMapper; import org.jeecg.modules.system.mapper.MdcProductionMapper; import org.jeecg.modules.system.mapper.MdcUserProductionMapper; import org.jeecg.modules.system.mapper.SysUserMapper; import org.jeecg.modules.system.model.MdcProductionTreeModel; import org.jeecg.modules.system.model.ProductionIdModel; import org.jeecg.modules.system.service.IMdcProductionService; import org.jeecg.modules.system.service.ISysParamsService; import org.jeecg.modules.system.util.FindsProductionsChildrenUtil; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; /** * @Description: 产线表 * @Author: liuS * @Date: 2023-03-23 * @Version: V1.0 */ @Service public class MdcProductionServiceImpl extends ServiceImpl implements IMdcProductionService { @Resource private SysUserMapper sysUserMapper; @Resource private MdcUserProductionMapper userProductionMapper; @Resource private MdcProductionEquipmentMapper productionEquipmentMapper; @Resource private ISysParamsService sysParamsService; /** * queryTreeList 对应 queryTreeList 查询所有的产线数据,以树结构形式响应给前端 */ @Override @Cacheable(value = "mdc:cache:production:alldata") public List queryTreeList() { LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); query.orderByAsc(MdcProduction::getProductionOrder); List list = this.list(query); //设置用户id,让前台显示 this.setUserIdsByProList(list); //调用wrapTreeDataToTreeList方法生成树状数据 return FindsProductionsChildrenUtil.wrapTreeDataToTreeList(list); } /** * 查询所有产线信息,并分节点进行显示(添加系统配置) */ @Override public List queryTreeListByConfig(){ SysParams sysParams = sysParamsService.getSysPramBySettingKey("dnc_production"); LambdaQueryWrapper query = new LambdaQueryWrapper(); if (sysParams == null) { return null; }else { if (("0").equals(sysParams.getSettingValue())){ query.eq(MdcProduction::getOrgType,"2"); query.eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); query.orderByAsc(MdcProduction::getProductionOrder); List list = this.list(query); //设置用户id,让前台显示 this.setUserIdsByProList(list); //封装一级树 List listResult = new ArrayList<>(); for (MdcProduction production : list) { if (production.getDescription().isEmpty()){ production.setDescription(""); } listResult.add(new MdcProductionTreeModel(production)); } //调用wrapTreeDataToTreeList方法生成树状数据 return listResult; }else { query.eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); query.orderByAsc(MdcProduction::getProductionOrder); List list = this.list(query); //设置用户id,让前台显示 this.setUserIdsByProList(list); //调用wrapTreeDataToTreeList方法生成树状数据 return FindsProductionsChildrenUtil.wrapTreeDataToTreeList(list); } } } /** * queryTreeList 根据产线id查询,前端回显调用 */ @Override public List queryTreeList(String ids) { List listResult = new ArrayList<>(); LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); if (oConvertUtils.isNotEmpty(ids)) { query.in(true, MdcProduction::getId, ids.split(",")); } query.orderByAsc(MdcProduction::getProductionOrder); List list = this.list(query); for (MdcProduction production : list) { if (production.getDescription().isEmpty()){ production.setDescription(""); } listResult.add(new MdcProductionTreeModel(production)); } return listResult; } @Override @Cacheable(value = "mdc:cache:production:allids") public List queryProductionIdTreeList() { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); query.orderByAsc(MdcProduction::getProductionOrder); List list = this.list(query); //调用wrapTreeDataToTreeList方法生成树状数据 return FindsProductionsChildrenUtil.wrapTreeDataToProductionIdTreeList(list); } /** * 根据关键字搜索相关的部门数据 */ @Override public List searchByKeyWord(String keyWord) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); List newList = new ArrayList<>(); query.like(MdcProduction::getProductionName, keyWord); MdcProductionTreeModel model = new MdcProductionTreeModel(); List productionList = this.list(query); if (!productionList.isEmpty()) { for (MdcProduction mdcProduction : productionList) { model = new MdcProductionTreeModel(mdcProduction); model.setChildren(null); newList.add(model); } return newList; } return Collections.emptyList(); } /** * saveProductionData 对应 add 保存用户在页面添加的新的产线对象数据 */ @Override @Transactional(rollbackFor = Exception.class) public void saveProductionData(MdcProduction mdcProduction) { if (mdcProduction != null) { if (mdcProduction.getParentId() == null) { mdcProduction.setParentId(""); } mdcProduction.setId(IdWorker.getIdStr(mdcProduction)); // 先判断该对象有无父级ID,有则意味着不是最高级,否则意味着是最高级 // 获取父级ID String parentId = mdcProduction.getParentId(); JSONObject formData = new JSONObject(); formData.put("parentId",parentId); String[] codeArray = (String[]) FillRuleUtil.executeRule(FillRuleConstant.PRODUCTION,formData); mdcProduction.setOrgCode(codeArray[0]); String orgType = codeArray[1]; mdcProduction.setOrgType(String.valueOf(orgType)); mdcProduction.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); this.save(mdcProduction); //处理存在父子关系 mdc标记统一的问题 //1.mdc标记 为 1 开启 父级节点要统一开启 //2.mdc标记 为 0 关闭 子级节点要统一关闭 新增操作 不存在此情况 if(StringUtils.isNotBlank(parentId) && CommonConstant.DEFAULT_1.equals(mdcProduction.getMdcFlag())){ openParentMdcFlag(parentId); } } } /** * updateProductionDataById 对应 edit 根据产线主键来更新对应的产线数据 */ @Override @Transactional(rollbackFor = Exception.class) public boolean updateProductionDataById(MdcProduction mdcProduction) { if (mdcProduction != null) { this.updateById(mdcProduction); //处理存在父子关系 mdc标记统一的问题 //1.mdc标记 为 1 开启 父级节点要统一开启 //2.mdc标记 为 0 关闭 子级节点要统一关闭 String parentId = mdcProduction.getParentId(); if(StringUtils.isNotBlank(parentId) && CommonConstant.DEFAULT_1.equals(mdcProduction.getMdcFlag())){ openParentMdcFlag(parentId); } if(CommonConstant.DEFAULT_0.equals(mdcProduction.getMdcFlag())){ //关闭 closeChildrenMdcFlag(mdcProduction.getId()); } return true; } return false; } /** * 根据产线id删除并删除其可能存在的子级产线 */ @Override @Transactional(rollbackFor = Exception.class) public boolean delete(String id) { List idList = new ArrayList<>(); idList.add(id); this.checkChildrenExists(id, idList); boolean result = this.removeByIds(idList); //根据产线id删除用户与产线关系 userProductionMapper.delete(new LambdaQueryWrapper().in(MdcUserProduction::getProId, idList)); //根据产线id删除产线与设备关系 productionEquipmentMapper.delete(new LambdaQueryWrapper().in(MdcProductionEquipment::getProductionId, idList)); return result; } /** * 根据产线id批量删除并删除其可能存在的子级产线 */ @Override @Transactional(rollbackFor = Exception.class) public void deleteBatchWithChildren(List ids) { List idList = new ArrayList<>(); for (String id : ids) { idList.add(id); this.checkChildrenExists(id, idList); } this.removeByIds(idList); //根据产线id删除用户与产线关系 userProductionMapper.delete(new LambdaQueryWrapper().in(MdcUserProduction::getProId, idList)); //根据产线id删除产线与设备关系 productionEquipmentMapper.delete(new LambdaQueryWrapper().in(MdcProductionEquipment::getProductionId, idList)); } /** * 根据id查询下级产线 */ @Override public List queryProdByPid(String pid) { return this.baseMapper.queryProdByPid(pid); } /** * 递归查询所有子节点 */ @Override public List recursionChildrenByPid(String pid){ List ids=this.recursionChildren(pid); return super.list(new LambdaQueryWrapper().eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()).in(MdcProduction::getId, ids)); } /** * 根据用户id获取产线下拉树选项 */ @Override public List loadProductionTreeOptions(String userId) { //获取所有产线数据 List productionList = this.baseMapper.selectList(new LambdaQueryWrapper().eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()).orderByAsc(MdcProduction::getProductionOrder)); //根据用户id获取拥有的产线信息集合 List productionIds = userProductionMapper.queryProductionIdsByUserId(userId); List allProductionIds = new ArrayList<>(); //找到所有产线id的上级id if (productionIds != null && !productionIds.isEmpty()) { for (String productionId : productionIds) { this.getAllProductionIds(productionList, productionId, allProductionIds); } } //过滤产线数据 List list = productionList.stream().filter((MdcProduction mdcProduction) -> allProductionIds.contains(mdcProduction.getId())).collect(Collectors.toList()); return FindsProductionsChildrenUtil.wrapTreeDataToProductionIdTreeList(list); } /** * 递归查询所有子节点id */ @Override public List recursionChildren(String productionId) { return this.baseMapper.recursionChildren(productionId); } /** * 根据用户id和车间id获取用户拥有的车间id * @param userId * @param productionId * @return */ @Override public String findFirstProduction(String userId, String productionId) { return this.baseMapper.findFirstProduction(userId, productionId); } /** * 根据用户id查询用户工段权限 */ @Override public String findThreeProductionId(String userId) { return this.baseMapper.findThreeProductionId(userId); } /** * delete 方法调用 递归查找子集id */ private void checkChildrenExists(String id, List idList) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(MdcProduction::getParentId, id); List productionList = this.list(query); if (productionList != null && !productionList.isEmpty()) { for (MdcProduction production : productionList) { idList.add(production.getId()); this.checkChildrenExists(production.getId(), idList); } } } /** * 获取所有的产线id(包含所有上级) */ private void getAllProductionIds(List productionList, String productionId, List allProductionIds) { if (!allProductionIds.contains(productionId)) { allProductionIds.add(productionId); } for (MdcProduction mdcProduction : productionList) { if (StringUtils.isEmpty(mdcProduction.getParentId())) { continue; } if (productionId.equals(mdcProduction.getId())) { if (!allProductionIds.contains(mdcProduction.getParentId())) { allProductionIds.add(mdcProduction.getParentId()); getAllProductionIds(productionList, mdcProduction.getParentId(), allProductionIds); } } } } /** * 通过产线集合为产线设置用户id,用于前台展示 */ private void setUserIdsByProList(List productionList) { //查询负责部门不为空的情况 LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.isNotNull(SysUser::getDepartIds); List users = sysUserMapper.selectList(query); Map map = new HashMap(5); //先循环一遍找到不同的负责产线id for (SysUser user : users) { String productionIds = user.getProductionIds(); if (StringUtils.isNotBlank(productionIds)) { String[] productionIdArray = productionIds.split(","); for (String productionId : productionIdArray) { if (map.containsKey(productionId)) { String userIds = map.get(productionId) + "," + user.getId(); map.put(productionId, userIds); } else { map.put(productionId, user.getId()); } } } } //循环产线集合找到产线id对应的负责用户 for (MdcProduction mdcProduction : productionList) { if (map.containsKey(mdcProduction.getId())) { mdcProduction.setDirectorUserIds(map.get(mdcProduction.getId()).toString()); } } } /** * 查询所有父节点和本节点名称 * @param id * @return */ @Override public List findListParentTreeAll(String id){ MdcProductionEquipment mdcProductionEquipment=productionEquipmentMapper.selectOne(new QueryWrapper().eq("equipment_id",id)); if (mdcProductionEquipment==null) { return null; } List strings = new ArrayList<>(); MdcProduction en=super.getById(mdcProductionEquipment.getProductionId()); if (en == null) { return null; } strings.add(en.getProductionName()); if (StringUtils.isEmpty(en.getParentId())) { return strings; } else { return findListParentTree(en.getParentId(),strings); } } // 查询所以父节点 @Override public List findListParentTree(String parentId,List stringList){ if (StringUtils.isEmpty(parentId)) { return null; } if (stringList == null || stringList.isEmpty()) { stringList = new ArrayList<>(); } boolean p = true; if (p) { MdcProduction en = super.getById(parentId); if (en != null) { stringList.add(0,en.getProductionName()); } if (StringUtils.isNotBlank(en.getParentId())) { parentId = en.getParentId(); findListParentTree(parentId,stringList); } else { p = false; return stringList; } } return stringList; } /** * 获取用户已分配的部门列表 * @param userId * @return */ @Override public Map getUserAssignedDepart(String userId){ if(StrUtil.isEmpty(userId)) return null; List userPermDepart = this.baseMapper.findAllProductionId(userId); if(userPermDepart == null || userPermDepart.isEmpty()) return null; Map map = new HashMap<>(); userPermDepart.forEach(item -> { map.put(item.getId(), item); }); return map; } /** * 通过一组id获取部门 * @param ids * @return */ @Override public List findAllProductionIds(List ids){ return this.baseMapper.recursionChildrenByList(ids); } @Override public List findParentIdsForProduction(String parentId, List idList) { if (StringUtils.isEmpty(parentId)) { return null; } if (idList == null || idList.isEmpty()) { idList = new ArrayList<>(); } boolean p = true; if (p) { MdcProduction en = super.getById(parentId); if (en != null) { idList.add(0, en.getId()); } if (StringUtils.isNotBlank(en.getParentId())) { parentId = en.getParentId(); findParentIdsForProduction(parentId, idList); } else { p = false; return idList; } } return idList; } @Override public List queryTreeListByMdc(String ids) { List listResult = new ArrayList<>(); LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); query.eq(MdcProduction::getMdcFlag, CommonConstant.DEFAULT_1); if (oConvertUtils.isNotEmpty(ids)) { query.in(true, MdcProduction::getId, ids.split(",")); } query.orderByAsc(MdcProduction::getProductionOrder); List list = this.list(query); for (MdcProduction production : list) { if (production.getDescription().isEmpty()){ production.setDescription(""); } listResult.add(new MdcProductionTreeModel(production)); } return listResult; } @Override public List queryTreeListByMdc() { LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); query.eq(MdcProduction::getMdcFlag, CommonConstant.DEFAULT_1); query.orderByAsc(MdcProduction::getProductionOrder); List list = this.list(query); //设置用户id,让前台显示 this.setUserIdsByProList(list); //调用wrapTreeDataToTreeList方法生成树状数据 return FindsProductionsChildrenUtil.wrapTreeDataToTreeList(list); } /** * 打开 父节点 及 以上的mdc标记 * @param parentId */ private void openParentMdcFlag(String parentId) { List listParentTree = findParentIdsForProduction(parentId, new ArrayList<>()); if (!CollectionUtil.isEmpty(listParentTree)) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.in("id", listParentTree); updateWrapper.set("mdc_flag", "1"); super.update(updateWrapper); } } /** * 关闭所有子节点的mdc标记 * @param productionId */ private void closeChildrenMdcFlag(String productionId) { List childrenList = recursionChildren(productionId); if (!CollectionUtil.isEmpty(childrenList)) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.in("id", childrenList); updateWrapper.set("mdc_flag", "0"); super.update(updateWrapper); } } }