package org.jeecg.modules.base.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; 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.base.entity.Factory; import org.jeecg.modules.base.entity.UserFactory; import org.jeecg.modules.base.mapper.FactoryMapper; import org.jeecg.modules.base.mapper.UserFactoryMapper; import org.jeecg.modules.base.model.FactoryIdModel; import org.jeecg.modules.base.model.FactoryTreeModel; import org.jeecg.modules.base.service.IFactoryService; import org.jeecg.modules.system.mapper.SysUserMapper; import org.jeecg.modules.system.util.FindsProductionsChildrenUtil; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; /** * @Description: 工厂/车间/产线 * @Author: jeecg-boot * @Date: 2025-06-24 * @Version: V1.0 */ @Service public class FactoryServiceImpl extends ServiceImpl implements IFactoryService { @Resource private SysUserMapper sysUserMapper; @Resource private UserFactoryMapper userFactoryMapper; /** * saveFactoryData 对应 add 保存用户在页面添加的新的产线对象数据 */ @Override @Transactional(rollbackFor = Exception.class) public void saveFactoryData(Factory factory) { if (factory != null) { if (factory.getParentId() == null) { factory.setParentId(""); } factory.setId(IdWorker.getIdStr(factory)); // 先判断该对象有无父级ID,有则意味着不是最高级,否则意味着是最高级 // 获取父级ID String parentId = factory.getParentId(); JSONObject formData = new JSONObject(); formData.put("parentId",parentId); String factoryCategory = ""; if(StringUtils.isBlank(parentId)){ factoryCategory = "1"; }else { // 查询出父级产线 Factory parentFactory = super.getById(parentId); // 根据父级产线类型算出当前产线的类型 factoryCategory = String.valueOf(Integer.valueOf(parentFactory.getFactoryCategory()) + 1); } factory.setFactoryCategory(factoryCategory); factory.setDelFlag(CommonConstant.DEL_FLAG_0); this.save(factory); //处理存在父子关系 mdc标记统一的问题 //1.mdc标记 为 1 开启 父级节点要统一开启 //2.mdc标记 为 0 关闭 子级节点要统一关闭 新增操作 不存在此情况 if(StringUtils.isNotBlank(parentId) && CommonConstant.DEFAULT_1.equals(factory.getMdcFlag())){ openParentMdcFlag(parentId); } } } /** * queryTreeList 对应 queryTreeList 查询所有的产线数据,以树结构形式响应给前端 */ @Override //@Cacheable(value = "mdc:cache:production:alldata") public List queryTreeList() { LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(Factory::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); query.orderByAsc(Factory::getSorter); List list = this.list(query); //调用wrapTreeDataToTreeList方法生成树状数据 return FindsProductionsChildrenUtil.wrapTreeDataToTreeList(list); } /** * queryTreeList 根据产线id查询,前端回显调用 */ @Override public List queryTreeList(String ids) { List listResult = new ArrayList<>(); LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(Factory::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); if (oConvertUtils.isNotEmpty(ids)) { query.in(true, Factory::getId, ids.split(",")); } query.orderByAsc(Factory::getSorter); List list = this.list(query); for (Factory factory : list) { if (factory.getRemark().isEmpty()){ factory.setRemark(""); } listResult.add(new FactoryTreeModel(factory)); } return listResult; } /** * 根据产线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删除用户与产线关系 userFactoryMapper.delete(new LambdaQueryWrapper().in(UserFactory::getFactoryId, idList)); //根据产线id删除产线与设备关系 //productionEquipmentMapper.delete(new LambdaQueryWrapper().in(MdcProductionEquipment::getProductionId, idList)); return result; } /** * delete 方法调用 递归查找子集id */ private void checkChildrenExists(String id, List idList) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(Factory::getParentId, id); List factoryList = this.list(query); if (factoryList != null && !factoryList.isEmpty()) { for (Factory factory : factoryList) { idList.add(factory.getId()); this.checkChildrenExists(factory.getId(), idList); } } } @Override //@Cacheable(value = "mdc:cache:production:allids") public List queryFactoryIdTreeList() { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(Factory::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); query.orderByAsc(Factory::getSorter); List list = this.list(query); //调用wrapTreeDataToTreeList方法生成树状数据 return FindsProductionsChildrenUtil.wrapTreeDataToProductionIdTreeList(list); } /** * 打开 父节点 及 以上的mdc标记 * @param parentId */ private void openParentMdcFlag(String parentId) { List listParentTree = findParentIdsForFactory(parentId, new ArrayList<>()); if (!CollectionUtil.isEmpty(listParentTree)) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.in("id", listParentTree); updateWrapper.set("mdc_flag", "1"); super.update(updateWrapper); } } public List findParentIdsForFactory(String parentId, List idList) { if (StringUtils.isEmpty(parentId)) { return null; } if (idList == null || idList.isEmpty()) { idList = new ArrayList<>(); } boolean p = true; if (p) { Factory en = super.getById(parentId); if (en != null) { idList.add(0, en.getId()); } if (StringUtils.isNotBlank(en.getParentId())) { parentId = en.getParentId(); findParentIdsForFactory(parentId, idList); } else { p = false; return idList; } } return idList; } }