| | |
| | | package org.jeecg.modules.dnc.service.impl; |
| | | |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import cn.hutool.core.collection.CollectionUtil; |
| | | 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 liquibase.pro.packaged.S; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.shiro.SecurityUtils; |
| | | import org.jeecg.common.api.vo.Result; |
| | | import org.jeecg.common.system.vo.LoginUser; |
| | | import org.jeecg.modules.dnc.dto.ComponentExt; |
| | | import org.jeecg.modules.dnc.entity.*; |
| | | import org.jeecg.modules.dnc.exception.ExceptionCast; |
| | | import org.jeecg.modules.dnc.mapper.ProcessSpecVersionPermissionMapper; |
| | | import org.jeecg.modules.dnc.mapper.ProductInfoMapper; |
| | | import org.jeecg.modules.dnc.request.DocInfoQueryRequest; |
| | | import org.jeecg.modules.dnc.request.TreeInfoRequest; |
| | | import org.jeecg.modules.dnc.response.*; |
| | | import org.jeecg.modules.dnc.service.*; |
| | | import org.jeecg.modules.dnc.service.support.ProductTreeWrapper; |
| | | import org.jeecg.modules.dnc.ucenter.UserDepartExt; |
| | | import org.jeecg.modules.dnc.utils.ValidateUtil; |
| | | import org.jeecg.modules.dnc.entity.*; |
| | | import org.jeecg.modules.system.entity.MdcProduction; |
| | | import org.jeecg.modules.system.entity.SysUser; |
| | | import org.jeecg.modules.system.service.IMdcProductionService; |
| | | import org.jeecg.modules.system.service.ISysUserService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | 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 redis.clients.jedis.Jedis; |
| | | |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | |
| | | private IProcessStreamPermissionService iProcessStreamPermissionService; |
| | | @Autowired |
| | | private IWorkStepPermissionService iWorkStepPermissionService; |
| | | @Autowired |
| | | private IProductMixService productMixService; |
| | | @Autowired |
| | | private IDocInfoService docInfoService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = {Exception.class}) |
| | |
| | | if (!b) { |
| | | ExceptionCast.cast(ProductInfoCode.PRODUCT_SAVE_ERROR); |
| | | } |
| | | //添加结构树 |
| | | ProductMix productMix = new ProductMix(Long.parseLong(productInfo.getProductId()),0L, |
| | | productInfo.getProductName(),productInfo.getProductNo(),1,new Date()); |
| | | productMixService.save(productMix); |
| | | //添加用户部门 |
| | | if(StrUtil.isNotBlank(user.getProductionIds())){ |
| | | String[] split = user.getProductionIds().split(","); |
| | | String[] departIds = split; |
| | | for (String departId : departIds) { |
| | | ProductDepartment productDepartment = new ProductDepartment(); |
| | | productDepartment.setProductId(productInfo.getProductId()); |
| | | productDepartment.setDepartId(departId); |
| | | productDepartmentService.save(productDepartment); |
| | | PermissionStreamNew stream = new PermissionStreamNew(); |
| | | stream.setBusinessId(productInfo.getProductId()); |
| | | stream.setDepartId(departId); |
| | | stream.setBusinessType("1"); |
| | | permissionStreamNewService.save(stream); |
| | | } |
| | | } |
| | | //添加用户权限 |
| | | PermissionStreamNew stream = new PermissionStreamNew(); |
| | | stream.setBusinessId(productInfo.getProductId()); |
| | | stream.setUserId(userId); |
| | | stream.setBusinessType("1"); |
| | | return permissionStreamNewService.save(stream); |
| | | return permissionStreamNewService.addPermissionStreamNew(stream); |
| | | } |
| | | |
| | | @Override |
| | |
| | | productInfo.setProductId(id); |
| | | productInfo.setProductStatus(null); |
| | | boolean b = super.updateById(productInfo); |
| | | //同步修改结构树 |
| | | ProductMix productMix = productMixService.getById(Long.parseLong(id)); |
| | | productMix.setName(productInfo.getProductName()); |
| | | productMix.setCode(productInfo.getProductNo()); |
| | | productMixService.updateById(productMix); |
| | | if (!b) |
| | | return false; |
| | | ProductPermission permission = productPermissionService.getByProductIdAndUserId(id, userId); |
| | |
| | | if (!b) |
| | | ExceptionCast.cast(CommonCode.FAIL); |
| | | b = permissionStreamNewService.deletePermissionStreamNewByBusinessId(id, "1","1"); |
| | | if (!b) |
| | | ExceptionCast.cast(CommonCode.FAIL); |
| | | b = productMixService.removeById(id); |
| | | if (!b) |
| | | ExceptionCast.cast(CommonCode.FAIL); |
| | | return super.removeById(id); |
| | |
| | | return false; |
| | | } |
| | | |
| | | @Override |
| | | public Result<?> getTreeById(String id, Integer type){ |
| | | if (StrUtil.isNotEmpty(id)||type!=null){ |
| | | switch (type){ |
| | | case 1: |
| | | //产品 |
| | | QueryWrapper<ProductInfo> productInfoQueryWrapper = new QueryWrapper<>(); |
| | | productInfoQueryWrapper.eq("product_id",id); |
| | | List<ProductInfo> productInfos = this.list(productInfoQueryWrapper); |
| | | return Result.OK(productInfos); |
| | | case 2: |
| | | //组件 |
| | | QueryWrapper<ComponentInfo> componentInfoQueryWrapper = new QueryWrapper<>(); |
| | | componentInfoQueryWrapper.eq("component_id",id); |
| | | List<ComponentInfo> componentInfos = componentInfoService.list(componentInfoQueryWrapper); |
| | | return Result.OK(componentInfos); |
| | | case 3: |
| | | //零件 |
| | | QueryWrapper<PartsInfo> partsInfoQueryWrapper = new QueryWrapper<>(); |
| | | partsInfoQueryWrapper.eq("parts_id",id); |
| | | List<PartsInfo> partsInfos = partsInfoService.list(partsInfoQueryWrapper); |
| | | return Result.OK(partsInfos); |
| | | case 4: |
| | | //工艺规划版本 |
| | | QueryWrapper<ProcessSpecVersion> processSpecVersionQueryWrapper = new QueryWrapper<>(); |
| | | processSpecVersionQueryWrapper.eq("id",id); |
| | | List<ProcessSpecVersion> processSpecVersions = processSpecVersionService.list(processSpecVersionQueryWrapper); |
| | | return Result.OK(processSpecVersions); |
| | | case 5: |
| | | //工序 |
| | | QueryWrapper<ProcessStream> processStreamQueryWrapper = new QueryWrapper<>(); |
| | | processStreamQueryWrapper.eq("process_id",id); |
| | | List<ProcessStream> processStreams = processStreamService.list(processStreamQueryWrapper); |
| | | return Result.OK(processStreams); |
| | | case 6: |
| | | //工步 |
| | | QueryWrapper<WorkStep> workStepQueryWrapper = new QueryWrapper<>(); |
| | | workStepQueryWrapper.eq("id",id); |
| | | List<WorkStep> workSteps = workStepService.list(workStepQueryWrapper); |
| | | return Result.OK(workSteps); |
| | | } |
| | | } |
| | | return Result.error("参数错误"); |
| | | } |
| | | |
| | | /** |
| | | * 通过代号、名称、材质等查询对应电子样板 |
| | | * @param treeInfoRequest |
| | | * @return |
| | | */ |
| | | @Override |
| | | public List<DocInfo> getByTreeOtherFileInfo(TreeInfoRequest treeInfoRequest){ |
| | | switch (treeInfoRequest.getAttributionType()){ |
| | | case 1: |
| | | LambdaQueryWrapper<ProductInfo> queryWrapper = new LambdaQueryWrapper<>(); |
| | | // 明确条件:仅当attributionType为1且attributionId非空时添加条件 |
| | | if (treeInfoRequest.getAttributionType() == 1 && StrUtil.isNotBlank(treeInfoRequest.getAttributionId())) { |
| | | queryWrapper.eq(ProductInfo::getProductId, treeInfoRequest.getAttributionId()); |
| | | } |
| | | // 简化条件判断 |
| | | queryWrapper.like(StrUtil.isNotBlank(treeInfoRequest.getTreeCode()), ProductInfo::getProductNo, treeInfoRequest.getTreeCode()) |
| | | .like(StrUtil.isNotBlank(treeInfoRequest.getTreeName()), ProductInfo::getProductName, treeInfoRequest.getTreeName()); |
| | | |
| | | List<ProductInfo> productInfoList = super.list(queryWrapper); |
| | | List<DocInfo> docInfos = new ArrayList<>(); |
| | | if (CollectionUtil.isNotEmpty(productInfoList)) { |
| | | // 使用ID列表而非拼接字符串 |
| | | List<String> productIds = productInfoList.stream() |
| | | .map(ProductInfo::getProductId) |
| | | .collect(Collectors.toList()); |
| | | DocInfoQueryRequest docQuery = new DocInfoQueryRequest(); |
| | | BeanUtil.copyProperties(treeInfoRequest, docQuery); |
| | | docQuery.setAttributionIds(productIds.toString()); // 假设setAttributionIds接受List<String> |
| | | docQuery.setDocClassCode("OTHER"); |
| | | docQuery.setAttributionType(1); |
| | | docInfos = docInfoService.findListByDocQuery(docQuery); |
| | | } |
| | | // 创建新请求对象避免污染原参数 |
| | | TreeInfoRequest componentRequest = new TreeInfoRequest(); |
| | | BeanUtil.copyProperties(treeInfoRequest, componentRequest); |
| | | componentRequest.setProductIds(Collections.singletonList(treeInfoRequest.getAttributionId())); |
| | | // 合并查询结果 |
| | | docInfos.addAll(componentInfoService.getByComponentInfo(componentRequest)); |
| | | docInfos.addAll(partsInfoService.getByPartsInfo(componentRequest)); |
| | | docInfos.addAll(processSpecVersionService.getByProcessSpecVersion(componentRequest)); |
| | | return getByTreeOtherFileInfo(docInfos); |
| | | case 2: |
| | | return getByTreeOtherFileInfo(componentInfoService.getByComponentInfo(treeInfoRequest)); |
| | | case 3: |
| | | return getByTreeOtherFileInfo(partsInfoService.getByPartsInfo(treeInfoRequest)); |
| | | case 4: |
| | | return getByTreeOtherFileInfo(processSpecVersionService.getByProcessSpecVersion(treeInfoRequest)); |
| | | } |
| | | return new ArrayList<>(); |
| | | } |
| | | |
| | | private List<DocInfo> getByTreeOtherFileInfo(List<DocInfo> docInfos){ |
| | | //对所属id进行翻译 |
| | | if (docInfos != null && !docInfos.isEmpty()) { |
| | | docInfos.forEach(docInfo -> { |
| | | switch (docInfo.getAttributionType()){ |
| | | case 1: |
| | | ProductInfo productInfo=this.getById(docInfo.getAttributionId()); |
| | | docInfo.setNodeName(productInfo.getProductName()); |
| | | docInfo.setNodeCode(productInfo.getProductNo()); |
| | | break; |
| | | case 2: |
| | | ComponentInfo componentInfo=componentInfoService.getById(docInfo.getAttributionId()); |
| | | docInfo.setNodeName(componentInfo.getComponentName()); |
| | | docInfo.setNodeCode(componentInfo.getComponentCode()); |
| | | break; |
| | | case 3: |
| | | PartsInfo partsInfo=partsInfoService.getById(docInfo.getAttributionId()); |
| | | docInfo.setNodeCode(partsInfo.getPartsCode()); |
| | | docInfo.setNodeName(partsInfo.getPartsName()); |
| | | break; |
| | | case 4: |
| | | ProcessSpecVersion processSpecVersion=processSpecVersionService.getById(docInfo.getAttributionId()); |
| | | docInfo.setNodeName(processSpecVersion.getProcessSpecVersionName()); |
| | | docInfo.setNodeCode(processSpecVersion.getProcessSpecVersionCode()); |
| | | } |
| | | }); |
| | | } |
| | | return docInfos; |
| | | } |
| | | |
| | | /** |
| | | * 验证输入参数 |
| | | */ |
| | |
| | | .map(PartsInfo::getPartsId) |
| | | .collect(Collectors.toList()); |
| | | handlePartsPermissions(partsIds, userList, partsPermissionList, permissionStreamList); |
| | | List<String> psvIds = processSpecVersionService.getByPartsIds(partsIds).stream().map(ProcessSpecVersion::getId).collect(Collectors.toList()); |
| | | handlePsvPermissions(psvIds, userList, processSpecVersionPermissionList, permissionStreamList); |
| | | List<ProcessSpecVersion> processSpecVersionList = processSpecVersionService.getByPartsIds(partsIds); |
| | | if (processSpecVersionList!= null &&!processSpecVersionList.isEmpty()) { |
| | | List<String> psvIds = processSpecVersionList.stream().map(ProcessSpecVersion::getId).collect(Collectors.toList()); |
| | | handlePsvPermissions(psvIds, userList, processSpecVersionPermissionList, permissionStreamList); |
| | | } |
| | | List<ProcessStream> processStreamList = processStreamService.getByComponentIdList(productId, componentIds, partsIds); |
| | | processStreamApi(productId, userList, processionPermissionList, workStepPermissionList, permissionStreamList, processStreamList); |
| | | } |
| | |
| | | componentPermissionList.add(cp); |
| | | ComponentInfo cpInfo = componentInfoMap.get(cp.getComponentId()); |
| | | PermissionStreamNew s = new PermissionStreamNew(); |
| | | s.setBusinessId(cpInfo.getProductId()); |
| | | s.setBusinessType("1"); |
| | | s.setBusinessId(cpInfo.getComponentId()); |
| | | s.setBusinessType("2"); |
| | | s.setUserId(cp.getUserId()); |
| | | permissionStreamList.add(s); |
| | | } |
| | |
| | | .collect(Collectors.toList()); |
| | | } |
| | | componentIds.add(componentInfo.getComponentId()); |
| | | |
| | | |
| | | handleRelativePermissions(componentInfo.getProductId(), componentIds, null, null,null, userList); |
| | | } |
| | | }else { |
| | |
| | | |
| | | private void handlePartsRemovals(String productId, List<String> componentIds,Collection<SysUser> userList) { |
| | | List<PartsInfo> partsInfoList = partsInfoService.getByComponentIdList(productId, componentIds); |
| | | partsInfoList.forEach(item->{ |
| | | partsInfoService.assignRemoveUser(item,userList); |
| | | //删除 |
| | | handlePartRelatedRemovals(item, userList); |
| | | }); |
| | | if (partsInfoList!=null){ |
| | | partsInfoList.forEach(item->{ |
| | | partsInfoService.assignRemoveUser(item,userList); |
| | | //删除 |
| | | handlePartRelatedRemovals(item, userList); |
| | | }); |
| | | } |
| | | } |
| | | private void handlePartsDepartmentRemovals(String productId, List<String> componentIds, Collection<MdcProduction> mdcProductionList) { |
| | | List<PartsInfo> partsInfoList = partsInfoService.getByComponentIdList(productId, componentIds); |
| | | partsInfoList.forEach(item->{ |
| | | partsInfoService.assignRemoveDepart(item,mdcProductionList); |
| | | handlePartRelatedDepartmentRemovals(item, mdcProductionList); |
| | | }); |
| | | if (partsInfoList!=null) { |
| | | partsInfoList.forEach(item->{ |
| | | partsInfoService.assignRemoveDepart(item,mdcProductionList); |
| | | handlePartRelatedDepartmentRemovals(item, mdcProductionList); |
| | | }); |
| | | } |
| | | } |
| | | |
| | | private void handleComponentRelatedRemovals(ComponentInfo componentInfo, Collection<SysUser> userList, Collection<MdcProduction> mdcProductionList) { |