package org.jeecg.modules.dnc.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.collections4.ListUtils; import org.apache.shiro.SecurityUtils; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.dnc.constant.DocAttributionTypeEnum; import org.jeecg.modules.dnc.entity.*; import org.jeecg.modules.dnc.exception.ExceptionCast; import org.jeecg.modules.dnc.mapper.WorkStepMapper; import org.jeecg.modules.dnc.request.DocInfoQueryRequest; import org.jeecg.modules.dnc.request.TreeInfoRequest; import org.jeecg.modules.dnc.response.CommonCode; import org.jeecg.modules.dnc.response.ProcessInfoCode; import org.jeecg.modules.dnc.response.ProductInfoCode; import org.jeecg.modules.dnc.response.UcenterCode; import org.jeecg.modules.dnc.service.*; import org.jeecg.modules.dnc.utils.ValidateUtil; import org.jeecg.modules.system.entity.MdcProduction; import org.jeecg.modules.system.entity.SysUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; /** * @Description: TODO * @Author: zhangherong * @Date: Created in 2020/9/20 9:19 * @Version: 1.0 * @Modified By: */ @Service public class WorkStepServiceImpl extends ServiceImpl implements IWorkStepService { @Autowired private IPermissionStreamNewService permissionStreamNewService; @Autowired private IWorkStepDepartmentService workStepDepartmentService; @Autowired private IWorkStepPermissionService workStepPermissionService; @Autowired private IDocRelativeService iDocRelativeService; @Autowired private IProductPermissionService productPermissionService; @Autowired private IProductMixService productMixService; @Autowired @Lazy private IDocInfoService docInfoService; @Autowired private IDeviceTypeService deviceTypeService; @Override public List getByUserPerms(String userId) { if(!ValidateUtil.validateString(userId)) return Collections.emptyList(); return super.getBaseMapper().getByUserPerms(userId); } /** * 根据用户id获取授权的工步信息 * @param userId * @param queryParam 查询条件 * @return */ @Override public List getByUserPerms(String userId,String queryParam){ if(!ValidateUtil.validateString(userId)) return Collections.emptyList(); if(!ValidateUtil.validateString(queryParam)) return Collections.emptyList(); LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); if(ValidateUtil.validateString(queryParam)) { queryWrapper.and(wrapper->wrapper.like(WorkStep::getStepName, queryParam) .or() .like(WorkStep::getStepName, queryParam)); } queryWrapper.orderByAsc(WorkStep::getCreateTime); return super.list(queryWrapper); } /** * 新增产品信息 * @param workStep * @return */ @Override public boolean addWorkStep(WorkStep workStep){ if(workStep == null) ExceptionCast.cast(CommonCode.INVALID_PARAM); if(!ValidateUtil.validateString(workStep.getProductId())) ExceptionCast.cast(ProcessInfoCode.PROCESS_PRODUCT_NONE); if(!ValidateUtil.validateString(workStep.getComponentId())) ExceptionCast.cast(ProcessInfoCode.PROCESS_COMPONENT_NONE); if(!ValidateUtil.validateString(workStep.getStepName())) ExceptionCast.cast(ProcessInfoCode.PROCESS_NAME_NONE); if(!ValidateUtil.validateString(workStep.getStepCode())) ExceptionCast.cast(ProcessInfoCode.PROCESS_CODE_NONE); LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = user.getId(); if(!ValidateUtil.validateString(userId)) ExceptionCast.cast(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST); WorkStep en =getByWorkStepNo(workStep.getProcessId(), workStep.getCraftNo()); if(en != null) { ExceptionCast.cast(ProcessInfoCode.WORKSTEP_NOT_EXIST); } boolean b =super.save(workStep); if(!b) ExceptionCast.cast(CommonCode.FAIL); //添加部门权限 List oldDepartPermList = permissionStreamNewService.loadPermissionStreamNewByBusinessId(workStep.getProcessId(), DocAttributionTypeEnum.PROCESS.getCode().toString(),"1"); if(oldDepartPermList != null && !oldDepartPermList.isEmpty()) { List workStepDepartmentList = new ArrayList<>(); List permissionStreamList = new ArrayList<>(); oldDepartPermList.forEach(item -> { WorkStepDepartment pd = new WorkStepDepartment(); pd.setDepartId(item.getDepartId()); pd.setStepId(workStep.getId()); workStepDepartmentList.add(pd); PermissionStreamNew perm = new PermissionStreamNew(); perm.setDepartId(item.getDepartId()); perm.setBusinessId(workStep.getId()); perm.setBusinessType(DocAttributionTypeEnum.WORKSITE.getCode().toString()); permissionStreamList.add(perm); }); if(!workStepDepartmentList.isEmpty()) { b = workStepDepartmentService.saveBatch(workStepDepartmentList); if(!b) ExceptionCast.cast(CommonCode.FAIL); } if(!permissionStreamList.isEmpty()) { b = permissionStreamNewService.saveBatch(permissionStreamList); if(!b) ExceptionCast.cast(CommonCode.FAIL); } } //添加用户权限 b = productPermissionService.add(workStep.getId(), userId,DocAttributionTypeEnum.WORKSITE.getCode().toString()); if (!b) { ExceptionCast.cast(ProductInfoCode.PRODUCT_SAVE_ERROR); } //添加结构树 ProductMix productMix = new ProductMix(Long.parseLong(workStep.getId()),Long.parseLong(workStep.getProcessId()) ,workStep.getStepName(),workStep.getStepCode(),DocAttributionTypeEnum.WORKSITE.getCode(),new Date()); productMixService.save(productMix); //添加权限验证 PermissionStreamNew permissionStream = new PermissionStreamNew(); permissionStream.setUserId(userId); permissionStream.setBusinessId(workStep.getId()); permissionStream.setBusinessType(DocAttributionTypeEnum.WORKSITE.getCode().toString()); return permissionStreamNewService.addPermissionStreamNew(permissionStream); } /** * 编辑产品信息 * @param id * @param workStep * @return */ @Override public boolean editWorkStep(String id ,WorkStep workStep){ if(!ValidateUtil.validateString(id) || workStep == null) ExceptionCast.cast(CommonCode.INVALID_PARAM); if(!ValidateUtil.validateString(workStep.getStepName())) ExceptionCast.cast(ProcessInfoCode.PROCESS_NAME_NONE); WorkStep en = super.getById(id); if(en == null) ExceptionCast.cast(ProcessInfoCode.WORKSTEP_NOT_EXIST); //同步修改结构树 ProductMix productMix = productMixService.getById(Long.parseLong(id)); productMix.setName(workStep.getStepName()); productMix.setCode(workStep.getStepCode()); productMixService.updateById(productMix); return super.updateById(workStep); } @Override public WorkStep getByWorkStepNo(String processId,String craftNo){ if(ValidateUtil.validateString(processId)) { List list = super.lambdaQuery().eq(WorkStep::getProcessId, processId).eq(WorkStep::getCraftNo,craftNo).list(); if(list == null || list.isEmpty()) return null; return list.get(0); } return null; } @Override @Transactional(rollbackFor = {Exception.class}) public boolean assignAddDepart(WorkStep workStep, Collection departmentList) { if(workStep == null || departmentList == null || departmentList.isEmpty()) ExceptionCast.cast(CommonCode.INVALID_PARAM); List workStepDepartmentList = new ArrayList<>(); List permissionStreamList = new ArrayList<>(); departmentList.forEach(item -> { WorkStepDepartment en = workStepDepartmentService.getByStepIdAndDepartId(workStep.getId(), item.getId()); if(en == null) { en = new WorkStepDepartment(); en.setDepartId(item.getId()); en.setStepId(workStep.getId()); workStepDepartmentList.add(en); } PermissionStreamNew stream = permissionStreamNewService.loadPermissionStreamNewByBusinessIdAndDepartId(workStep.getId(),item.getId(),DocAttributionTypeEnum.WORKSITE.getCode().toString()); if(stream == null) { stream = new PermissionStreamNew(); stream.setDepartId(item.getId()); stream.setBusinessId(workStep.getId()); stream.setBusinessType(DocAttributionTypeEnum.WORKSITE.getCode().toString()); permissionStreamList.add(stream); } }); if(!workStepDepartmentList.isEmpty()) { boolean b = workStepDepartmentService.saveBatch(workStepDepartmentList); if(!b) { ExceptionCast.cast(ProductInfoCode.PRODUCT_USER_PERM_ERROR); } } if(!permissionStreamList.isEmpty()) { boolean b = permissionStreamNewService.saveBatch(permissionStreamList); if(!b) { ExceptionCast.cast(ProductInfoCode.PRODUCT_USER_PERM_ERROR); } } return true; } @Override public List getByProcessIds(String productId,List processIds) { if(!ValidateUtil.validateString(productId) || processIds == null || processIds.isEmpty()) return null; List list = new ArrayList<>(); if(processIds.size() > 1000){ List> processListArr = ListUtils.partition(processIds, 100); for(List processList : processListArr){ List workStepList = super.lambdaQuery().eq(WorkStep::getProductId, productId).in(WorkStep::getProcessId, processList).list(); if(workStepList != null && !workStepList.isEmpty()){ list.addAll(workStepList); } } }else { list = super.lambdaQuery().eq(WorkStep::getProductId, productId).in(WorkStep::getProcessId, processIds).list(); } if(list == null || list.isEmpty()) return null; return list; } /** * 分配部门权限 * @param workStep * @param departmentList * @return */ @Override public boolean assignRemoveDepart(WorkStep workStep, Collection departmentList){ if(workStep == null || departmentList == null || departmentList.isEmpty()) ExceptionCast.cast(CommonCode.INVALID_PARAM); List workStepDepartmentList = new ArrayList<>(); List permissionStreamList = new ArrayList<>(); departmentList.forEach(item -> { WorkStepDepartment en = workStepDepartmentService.getByStepIdAndDepartId(workStep.getId(), item.getId()); if(en != null) { workStepDepartmentList.add(en); } PermissionStreamNew stream = permissionStreamNewService.loadPermissionStreamNewByBusinessIdAndDepartId(workStep.getId(),item.getId(),DocAttributionTypeEnum.WORKSITE.getCode().toString()); if(stream != null) { permissionStreamList.add(stream); } }); if(!workStepDepartmentList.isEmpty()) { boolean b = workStepDepartmentService.removeByCollection(workStepDepartmentList); if(!b) { ExceptionCast.cast(ProductInfoCode.PRODUCT_USER_PERM_ERROR); } } if(!permissionStreamList.isEmpty()) { boolean b = permissionStreamNewService.deletePermissionStreamNewByList(permissionStreamList); if(!b) { ExceptionCast.cast(ProductInfoCode.PRODUCT_USER_PERM_ERROR); } } return true; } /** * 删除工步信息 逻辑删除 * @param id * @return */ public boolean deleteWorkStep(String id){ if(!ValidateUtil.validateString(id)) ExceptionCast.cast(CommonCode.INVALID_PARAM); WorkStep en = super.getById(id); if(en == null) ExceptionCast.cast(ProcessInfoCode.PROCESS_NOT_EXIST); //验证是否存在文档 List docRelativeList=iDocRelativeService.list(new QueryWrapper().eq("attribution_type",DocAttributionTypeEnum.WORKSITE.getCode().toString()).eq("attribution_id",id)); if (!docRelativeList.isEmpty()){ ExceptionCast.cast(ProcessInfoCode.WORKSTEP_HAS_DOC); } boolean b=productMixService.removeById(id); if(!b) { ExceptionCast.cast(CommonCode.FAIL); } return super.removeById(id); } @Override @Transactional(rollbackFor = {Exception.class}) public boolean assignAddUser(WorkStep workStep, Collection userList) { if(workStep == null || userList == null || userList.isEmpty()) ExceptionCast.cast(CommonCode.INVALID_PARAM); List permissionList = new ArrayList<>(); List permissionStreamList = new ArrayList<>(); userList.forEach(item -> { WorkStepPermission en = workStepPermissionService.getByStepIdAndUserId(workStep.getId(), item.getId()); if(en == null) { en = new WorkStepPermission(); en.setUserId(item.getId()); en.setStepId(workStep.getId()); permissionList.add(en); } PermissionStreamNew stream = permissionStreamNewService.loadPermissionStreamNewByBusinessIdAndUserId(workStep.getId(),item.getId(),DocAttributionTypeEnum.WORKSITE.getCode().toString()); if(stream == null) { stream = new PermissionStreamNew(); stream.setUserId(item.getId()); stream.setBusinessId(workStep.getId()); stream.setBusinessType(DocAttributionTypeEnum.WORKSITE.getCode().toString()); permissionStreamList.add(stream); } }); if(!permissionList.isEmpty()) { boolean b = workStepPermissionService.saveBatch(permissionList); if(!b) { ExceptionCast.cast(ProductInfoCode.PRODUCT_USER_PERM_ERROR); } } if(!permissionStreamList.isEmpty()) { boolean b = permissionStreamNewService.saveBatch(permissionStreamList); if(!b) { ExceptionCast.cast(ProductInfoCode.PRODUCT_USER_PERM_ERROR); } } return true; } @Override @Transactional(rollbackFor = {Exception.class}) public boolean assignRemoveUser(WorkStep workStep, Collection userList) { if(workStep == null || userList == null || userList.isEmpty()) ExceptionCast.cast(CommonCode.INVALID_PARAM); List permissionList = new ArrayList<>(); List permissionStreamList = new ArrayList<>(); userList.forEach(item -> { WorkStepPermission en = workStepPermissionService.getByStepIdAndUserId(workStep.getId(), item.getId()); if(en != null) { permissionList.add(en); } PermissionStreamNew stream = permissionStreamNewService.loadPermissionStreamNewByBusinessIdAndUserId(workStep.getId(),item.getId(),DocAttributionTypeEnum.WORKSITE.getCode().toString()); if(stream != null) { permissionStreamList.add(stream); } }); //清空用户权限校验 if(!permissionList.isEmpty()) { boolean b = workStepPermissionService.removeByCollection(permissionList); if(!b) { ExceptionCast.cast(ProductInfoCode.PRODUCT_USER_PERM_ERROR); } } if(!permissionStreamList.isEmpty()) { boolean b = permissionStreamNewService.deletePermissionStreamNewByList(permissionStreamList); if(!b) { ExceptionCast.cast(ProductInfoCode.PRODUCT_USER_PERM_ERROR); } } return true; } /** * 通过工步号、工步名称等查询对应NC文件 * NC文件存在设备类下面 * @param treeInfoRequest * @return */ @Override public List getByWorkStepOtherFile(TreeInfoRequest treeInfoRequest){ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); if (treeInfoRequest.getProductIds() != null && !treeInfoRequest.getProductIds().isEmpty()) { queryWrapper.in(WorkStep::getProductId, treeInfoRequest.getProductIds()); } if (treeInfoRequest.getComponentIds() != null && !treeInfoRequest.getComponentIds().isEmpty()) { queryWrapper.in(WorkStep::getComponentId, treeInfoRequest.getComponentIds()); } if (treeInfoRequest.getPartsIds() != null && !treeInfoRequest.getPartsIds().isEmpty()) { queryWrapper.in(WorkStep::getPartsId, treeInfoRequest.getPartsIds()); } if (treeInfoRequest.getPsvIds() != null && !treeInfoRequest.getPsvIds().isEmpty()) { queryWrapper.in(WorkStep::getPsvId, treeInfoRequest.getPsvIds()); } if (treeInfoRequest.getProcessIds() != null && !treeInfoRequest.getProcessIds().isEmpty()) { queryWrapper.in(WorkStep::getProcessId, treeInfoRequest.getProcessIds()); } if (Objects.equals(treeInfoRequest.getAttributionType(), DocAttributionTypeEnum.WORKSITE.getCode())){ queryWrapper.eq(StrUtil.isNotEmpty(treeInfoRequest.getAttributionId()),WorkStep::getId,treeInfoRequest.getAttributionId()); } queryWrapper.like(StrUtil.isNotEmpty(treeInfoRequest.getTreeName()),WorkStep::getStepName, treeInfoRequest.getTreeName()); queryWrapper.like(StrUtil.isNotEmpty(treeInfoRequest.getTreeCode()),WorkStep::getStepCode, treeInfoRequest.getTreeName()); queryWrapper.orderByDesc(WorkStep::getCreateTime); List list = super.list(queryWrapper); List docInfos; if (list == null || list.isEmpty() || StrUtil.isNotBlank(treeInfoRequest.getStructureType())){ return new ArrayList<>(); }else { String ids=list.stream().map(WorkStep::getId).collect(Collectors.joining(",")); DocInfoQueryRequest docQuery = new DocInfoQueryRequest(); BeanUtil.copyProperties(treeInfoRequest,docQuery); docQuery.setAttributionIds(ids); docQuery.setDocClassCode("OTHER"); docQuery.setAttributionType(DocAttributionTypeEnum.WORKSITE.getCode()); docInfos=docInfoService.findListByDocQuery(docQuery); } return docInfos; } /** * 通过工步号、工步名称等查询对应NC文件 * NC文件存在设备类下面 * @param treeInfoRequest * @return */ @Override public List getByWorkStepNCFile(TreeInfoRequest treeInfoRequest){ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); if (treeInfoRequest.getProductIds() != null && !treeInfoRequest.getProductIds().isEmpty()) { queryWrapper.in(WorkStep::getProductId, treeInfoRequest.getProductIds()); } if (treeInfoRequest.getComponentIds() != null && !treeInfoRequest.getComponentIds().isEmpty()) { queryWrapper.in(WorkStep::getComponentId, treeInfoRequest.getComponentIds()); } if (treeInfoRequest.getPartsIds() != null && !treeInfoRequest.getPartsIds().isEmpty()) { queryWrapper.in(WorkStep::getPartsId, treeInfoRequest.getPartsIds()); } if (treeInfoRequest.getPsvIds() != null && !treeInfoRequest.getPsvIds().isEmpty()) { queryWrapper.in(WorkStep::getPsvId, treeInfoRequest.getPsvIds()); } if (treeInfoRequest.getProcessIds() != null && !treeInfoRequest.getProcessIds().isEmpty()) { queryWrapper.in(WorkStep::getProcessId, treeInfoRequest.getProcessIds()); } if (Objects.equals(treeInfoRequest.getAttributionType(), DocAttributionTypeEnum.WORKSITE.getCode())){ queryWrapper.eq(StrUtil.isNotEmpty(treeInfoRequest.getAttributionId()),WorkStep::getProcessId,treeInfoRequest.getAttributionId()); } queryWrapper.like(StrUtil.isNotEmpty(treeInfoRequest.getTreeName()),WorkStep::getStepName, treeInfoRequest.getTreeName()); queryWrapper.like(StrUtil.isNotEmpty(treeInfoRequest.getTreeCode()),WorkStep::getStepCode, treeInfoRequest.getTreeName()); queryWrapper.orderByDesc(WorkStep::getCreateTime); List list = super.list(queryWrapper); List docInfos = new ArrayList<>(); //NC文件存在对应的设备类下,所以需要过滤 if (!list.isEmpty()) { List workStepIds = list.stream().map(WorkStep::getId).collect(Collectors.toList()); List deviceTypeList = deviceTypeService.getDeviceTypeByAttribution(workStepIds, DocAttributionTypeEnum.WORKSITE.getCode(),treeInfoRequest.getDeviceManagementName(),treeInfoRequest.getDeviceManagementCode()); if (deviceTypeList != null && !deviceTypeList.isEmpty()) { List deviceManagementIds=deviceTypeList.stream().map(DeviceType::getDeviceManagementId).collect(Collectors.toList()); DocInfoQueryRequest docQuery = new DocInfoQueryRequest(); BeanUtil.copyProperties(treeInfoRequest,docQuery); docQuery.setAttributionIds(String.join(",",deviceManagementIds)); docQuery.setDocClassCode("NC"); docQuery.setAttributionType(DocAttributionTypeEnum.WORKSITE.getCode()); docInfos=docInfoService.findListByDocQuery(docQuery); } return docInfos; } return new ArrayList<>(); } }