cuilei
2025-06-11 cd00884c3db8fa6808b3b5949ab1a2b1459d6bdc
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java
@@ -1,6 +1,7 @@
package org.jeecg.modules.dncFlow.service.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -8,7 +9,6 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.flowable.engine.TaskService;
@@ -25,7 +25,6 @@
import org.jeecg.modules.dnc.utils.date.DateUtil;
import org.jeecg.modules.dnc.utils.file.FileUtilS;
import org.jeecg.modules.dncFlow.entity.AssignFileStream;
import org.jeecg.modules.dncFlow.entity.ToEquipmentTask;
import org.jeecg.modules.dncFlow.ext.AssignFileStreamExt;
import org.jeecg.modules.dncFlow.mapper.AssignFileStreamMapper;
import org.jeecg.modules.dncFlow.request.ApproveBatchRequest;
@@ -33,9 +32,9 @@
import org.jeecg.modules.dncFlow.request.AssignFileStreamQueryRequest;
import org.jeecg.modules.dncFlow.request.TaskRequest;
import org.jeecg.modules.dncFlow.service.IAssignFileStreamService;
import org.jeecg.modules.dncFlow.service.IToEquipmentTaskService;
import org.jeecg.modules.dncFlow.vo.AssignFlowTaskVo;
import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
@@ -43,7 +42,7 @@
import org.jeecg.modules.flowable.service.IFlowTaskService;
import org.jeecg.modules.mdc.entity.MdcEquipment;
import org.jeecg.modules.mdc.service.IMdcEquipmentService;
import org.jeecg.modules.system.entity.MdcProduction;
import org.jeecg.modules.message.enums.DeployEnum;
import org.jeecg.modules.system.service.IMdcProductionService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -72,17 +71,7 @@
    @Autowired
    private IDocInfoService docInfoService;
    @Autowired
    private IProcessStreamService processStreamService;
    @Autowired
    private IWorkStepService workStepService;
    @Autowired
    private IPermissionStreamNewService permissionStreamNewService;
    @Autowired
    private IDocClassificationService classificationService;
    @Autowired
    private IToEquipmentTaskService equipmentTaskService;
    @Autowired
    private IDeviceInfoService deviceInfoService;
    @Autowired
    private IDocFileService docFileService;
    @Autowired
@@ -104,12 +93,15 @@
    @Autowired
    private IFlowTaskService flowTaskService;
    @Autowired
    private IDeviceTypeService deviceTypeService;
    @Value("${securedoc.whether}")
    private String whether;
    @Value("${securedoc.localFilePath}")
    private String localFilePath;
    private IFlowMyBusinessService flowMyBusinessService;
    @Autowired
    private PermissionService permissionService;
    @Autowired
    private IDncPassLogService dncPassLogService;
    @Value("${deploy.deployType}")
    private String deployType;    //工控网/涉密网部署 0为工控网 1为涉密网
    @Value("${deploy.secretFolder}")
    private String secretFolder;    //涉密网传输nc文件夹
    @Override
    @Transactional(rollbackFor = {Exception.class})
@@ -136,7 +128,6 @@
     */
    public String getDeviceSpecialChar(String deviceId, String fileId){
        //替换为mdc设备表
//        DeviceInfo deviceInfo = deviceInfoService.getById(deviceId);
        MdcEquipment mdcEquipment = iMdcEquipmentService.getById(deviceId);
        if(mdcEquipment == null)
            ExceptionCast.cast(ActivitiCode.ACT_ASSIGN_DEVICE_NONE);
@@ -230,6 +221,9 @@
        //权限校验
        validateParams(stream);
        DocInfo docInfo = getDocInfo(stream);
        //修改原有状态
        docInfo.setDocDispatchStatus(4);
        docInfoService.updateById(docInfo);
        MdcEquipment mdcEquipment = getMdcEquipment(stream);
        DocFile docFile = getDocFile(stream);
        DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(stream.getDocId(), 7, stream.getDeviceId());
@@ -260,7 +254,10 @@
        }
        handleFileTransfer(mdcEquipment, docFile);
        handleFileProcessing(docFile, mdcEquipment, whether, localFilePath);
        //注意----区分工控网与涉密网!!!  涉密网进行NC文件的拷贝,工控网负责进行解析NC文件
        if (deployType.equals(DeployEnum.SMW.getCode())) {
            handleFileProcessing(docFile, mdcEquipment, secretFolder);
        }
        synchronizedFlagService.updateFlag(2);
        return Result.OK("操作成功");
    }
@@ -289,6 +286,34 @@
        //flowable处理
        FlowTaskVo flowTaskVo = new FlowTaskVo();
        BeanUtils.copyProperties(assignFlowTaskVo, flowTaskVo);
        List<FlowMyBusiness> businessList = flowMyBusinessService.list(
                new QueryWrapper<FlowMyBusiness>()
                        .eq("process_instance_id", assignFlowTaskVo.getInstanceId())
        );
        if (businessList.isEmpty()) {
            return false;
        }
        FlowMyBusiness flowMyBusiness = businessList.get(0);
        List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
        if (todoUsers == null || !todoUsers.contains(user.getUsername())) {
            return false;
        }
        // 4. 认领任务(处理已被认领的情况)
        String taskId = flowMyBusiness.getTaskId();
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        if (task == null) {
            return false;
        }
        if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
            return false;
        }
        taskService.claim(taskId, user.getUsername());
        Map<String, Object> values=new HashMap<>();
        values.put("dataId", assignFlowTaskVo.getDataId());
        flowTaskVo.setTaskId(assignFlowTaskVo.getTaskId());
        flowTaskVo.setValues(values);
        flowTaskService.complete(flowTaskVo);
        //更新对象封装
        AssignFileStream up = new AssignFileStream();
@@ -301,22 +326,19 @@
        if(!b)
            ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
        if(up.getStatus() == 2) {
            DocInfo docInfo;
            //同意操作
            if (StrUtil.isNotEmpty(en.getStepId())){
                //工步下设备类指派
                docInfo = docInfoService.getByDocAttrAndDocId(en.getDocId(), 6, en.getDeviceTypeId());
            }else {
                docInfo = docInfoService.getByDocAttrAndDocId(en.getDocId(), 5, en.getDeviceTypeId());
            }
            if(docInfo == null || docInfo.getDocStatus() == 3)
                               ExceptionCast.cast(ActivitiCode.ACT_DOC_ERROR);
            DocInfo docInfo = docInfoService.getByDocAttrAndDocId(en.getDocId(), Integer.valueOf(en.getAttributionType()), en.getAttributionId());
            if(docInfo == null )
               ExceptionCast.cast(ActivitiCode.ACT_DOC_ERROR);
            MdcEquipment mdcEquipment = iMdcEquipmentService.getById(en.getDeviceId());
            if(mdcEquipment == null)
                ExceptionCast.cast(ActivitiCode.ACT_ASSIGN_DEVICE_NONE);
            DocFile docFile = docFileService.getById(en.getFileId());
            if(docFile == null)
                ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
            //修改原有状态
            docInfo.setDocDispatchStatus(4);
            docInfoService.updateById(docInfo);
            DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(en.getDocId(),7, en.getDeviceId());
            if(deviceDoc != null) {
                // 删除 备份  覆盖 原有的
@@ -361,6 +383,10 @@
                    }
                }
            }
            //注意----区分工控网与涉密网!!!  涉密网进行NC文件的拷贝,工控网负责进行解析NC文件
            if (deployType.equals(DeployEnum.SMW.getCode())) {
                handleFileProcessing(docFile, mdcEquipment, secretFolder);
            }
            return synchronizedFlagService.updateFlag(1);
        }else if(up.getStatus() == 3) {
            //拒绝操作 什么也不做
@@ -403,14 +429,6 @@
        List<TaskRequest> list = approveBatchRequest.getTaskArr();
        if(list == null || list.isEmpty())
            ExceptionCast.cast(CommonCode.INVALID_PARAM);
//        list.forEach(item -> {
//            AssignFileStream stream = new AssignFileStream();
//            stream.setApproveContent(approveBatchRequest.getApproveContent());
//            stream.setStatus(approveBatchRequest.getStatus());
//            boolean b = approveAssignFile(item.getId(), item.getBusinessKey(), stream);
//            if(!b)
//                ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
//        });
        return synchronizedFlagService.updateFlag(1);
    }
@@ -464,64 +482,6 @@
        return false;
    }
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean transferDocFile(String pnCode, String deviceNo) {
        List<ProcessStream> streams = processStreamService.validateDeviceProcessInfo(pnCode, deviceNo);
        DeviceInfo deviceInfo = deviceInfoService.getByDeviceNo(deviceNo);
        if(deviceInfo == null)
            ExceptionCast.cast(DeviceCode.DEVICE_NOT_EXIST);
        //删除原来设备下的所有文档
        docRelativeService.deleteByDocAttr(7, deviceInfo.getDeviceId());
        List<DocInfo> docInfoList = docInfoService.getByProcessIds(streams);
        if(docInfoList == null || docInfoList.isEmpty())
            ExceptionCast.cast(DocumentCode.DOC_NOT_EXIST);
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        String userId = user.getId();
        if(!ValidateUtil.validateString(userId))
            ExceptionCast.cast(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST);
        for(DocInfo docInfo : docInfoList) {
            DocFile docFile = docFileService.getById(docInfo.getPublishFileId());
            if(docFile == null)
                ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
            //插入文档到设备发送文档
            DocClassification classification = classificationService.getByCode(SEND_CODE);
            if(classification == null)
                ExceptionCast.cast(DocumentCode.DOC_CLASS_ERROR);
            DocRelative docRelative = new DocRelative();
            docRelative.setDocId(docInfo.getDocId());
            docRelative.setClassificationId(classification.getClassificationId());
            docRelative.setAttributionType(7);
            docRelative.setAttributionId(deviceInfo.getDeviceId());
            boolean b = docRelativeService.save(docRelative);
            if(!b)
                ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
            //插入文件传输任务表
            ToEquipmentTask equipmentTask = new ToEquipmentTask();
            //不能直接从doc中拿fileId 和version  可能会存在斌更
            //equipmentTask.setFileId(docInfo.getPublishFileId());
            //equipmentTask.setDocVersion(docInfo.getPublishVersion());
            equipmentTask.setDocId(docInfo.getDocId());
            equipmentTask.setSyncFlag(1);
            equipmentTask.setDeviceNo(deviceInfo.getDeviceNo());
            equipmentTask.setDeviceId(deviceInfo.getDeviceId());
            equipmentTask.setDepartId(deviceInfo.getDepartId());
            //文件相关信息
            equipmentTask.setFileId(docFile.getFileId());
            equipmentTask.setDocVersion(docFile.getDocVersion());
            equipmentTask.setFileName(docInfo.getDocName());
            equipmentTask.setFileEncodeName(docFile.getFileEncodeName());
            equipmentTask.setFilePath(docFile.getFilePath());
            equipmentTask.setFileSuffix(docFile.getFileSuffix());
            equipmentTask.setFileSize(docFile.getFileSize());
            b = equipmentTaskService.save(equipmentTask);
            if(!b) {
                ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
            }
        }
        return synchronizedFlagService.updateFlag(1);
    }
    //传参验证
    private void validateParams(AssignFileStream stream) {
        if (stream == null) {
@@ -552,7 +512,7 @@
    //获取文件
    private void handleExistingDeviceDoc(DocFile docFile, MdcEquipment mdcEquipment, String deviceId) {
        List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getEquipmentId());
        List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getId());
        if (strings != null && !strings.isEmpty()) {
            String path = StringUtils.join(strings.toArray(), "/");
            boolean copyFileNc = FileUtilS.copyFileNcToBak(path + "/" + mdcEquipment.getEquipmentId(),
@@ -570,69 +530,12 @@
    }
    private PermissionStreamNew getPermissionStreams(AssignFileStream stream) {
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        DeviceType deviceType = deviceTypeService.getById(stream.getAttributionId());
        String attributionId = deviceType != null ? deviceType.getAttributionId() : stream.getAttributionId();
        PermissionStreamNew permissionStreams;
        if (stream.getAttributionType().equals("5")) {
            // 工序
            permissionStreams = handleProcess(stream, attributionId, user);
        } else {
            // 工步
            permissionStreams = handleWorkStep(stream, attributionId, user);
        }
        if (permissionStreams == null) {
        PermissionStreamNew permissionStreamNew = permissionService.getPermissionStreams(stream);
        if (permissionStreamNew  == null) {
            ExceptionCast.cast(ActivitiCode.ACT_NODE_DEPART_NONE);
        }
        return permissionStreams;
        return permissionStreamNew ;
    }
    private PermissionStreamNew handleProcess(AssignFileStream stream, String attributionId, LoginUser user) {
        ProcessStream processStream = processStreamService.getById(attributionId);
        if (processStream == null) {
            ExceptionCast.cast(CommonCode.INVALID_PARAM);
        }
        stream.setProductId(processStream.getProductId());
        stream.setComponentId(processStream.getComponentId());
        stream.setPartsId(processStream.getPartsId());
        stream.setProcessId(processStream.getProcessId());
        if (deviceTypeService.getById(stream.getAttributionId()) != null) {
            stream.setDeviceTypeId(deviceTypeService.getById(stream.getAttributionId()).getId());
        }
        return permissionStreamNewService.loadPermissionStreamNewByBusinessIdAndUserId(processStream.getProcessId(), user.getId(), "5");
    }
    private PermissionStreamNew handleWorkStep(AssignFileStream stream, String attributionId, LoginUser user) {
        WorkStep workStep = workStepService.getById(attributionId);
        if (workStep == null) {
            ExceptionCast.cast(CommonCode.INVALID_PARAM);
        }
        stream.setProductId(workStep.getProductId());
        stream.setComponentId(workStep.getComponentId());
        stream.setPartsId(workStep.getPartsId());
        stream.setProcessId(workStep.getProcessId());
        stream.setStepId(workStep.getId());
        if (deviceTypeService.getById(stream.getAttributionId()) != null) {
            stream.setDeviceTypeId(deviceTypeService.getById(stream.getAttributionId()).getId());
        }
        return permissionStreamNewService.loadPermissionStreamNewByBusinessIdAndUserId(workStep.getId(), user.getId(), "6");
    }
    //获取部门信息
    //todo 修改
    private List<String> getDepartIds(List<PermissionStream> permissionStreams, String userId) {
        Map<String, MdcProduction> map = iMdcProductionService.getUserAssignedDepart(userId);
        List<String> departIds = permissionStreams.stream()
                .filter(item -> map.containsKey(item.getDepartId()))
                .map(PermissionStream::getDepartId)
                .collect(Collectors.toList());
        if (departIds.isEmpty()) {
            ExceptionCast.cast(ActivitiCode.ACT_USER_NOT_PERM);
        }
        return departIds;
    }
    //封装数据
    private void saveBusinessObject(AssignFileStream stream, String userId) {
@@ -646,19 +549,6 @@
            ExceptionCast.cast(ActivitiCode.ACT_BUSINESS_SAVE_ERROR);
        }
    }
    //开始工作流
//    private ProcessInstance startProcessInstance(AssignFileStream stream, List<String> userIdList) {
//        String approveUsers = String.join(",", userIdList);
//        Map<String, Object> avariableMap = new HashMap<>();
//        avariableMap.put(APPLY_VARIABLE, stream.getApplyUserId());
//        avariableMap.put(APPROVE_VARIABLE, approveUsers);
//        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(PROCESS_KEY, stream.getStreamId(), avariableMap);
//        if (processInstance == null) {
//            ExceptionCast.cast(ActivitiCode.ACT_APPROVE_USERS_NONE);
//        }
//        return processInstance;
//    }
    //拾取任务
    private void completeTask(ProcessInstance processInstance, String userId) {
@@ -708,22 +598,61 @@
    }
    //封装处理文件
    private void handleFileProcessing(DocFile docFile, MdcEquipment mdcEquipment, String whether, String localFilePath) {
        if (whether.equals("true") && !docFile.getFileSuffix().equals("zip") && !docFile.getFileSuffix().equals("rar")) {
    private void handleFileProcessing(DocFile docFile, MdcEquipment mdcEquipment, String secretFolder) {
        if (!docFile.getFileSuffix().equals("zip") && !docFile.getFileSuffix().equals("rar")) {
            String size = FileUtilS.fileSizeNC(docFile.getFilePath(), docFile.getFileEncodeName());
            List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getId());
            if (strings != null && !strings.isEmpty()) {
                DncPassLog passInfoTxt = new DncPassLog();
                String path = StringUtils.join(strings.toArray(), "/");
                Date dateFirst = DateUtil.getNow();
                passInfoTxt.setDayTime(DateUtil.format(dateFirst,DateUtil.STR_YEARMONTHDAY));
                /*查询最后一条记录*/
                //休眠 500毫秒
                DncPassLog dncPassLog  = dncPassLogService.findDayTime(DateUtil.format(dateFirst,DateUtil.STR_YEARMONTHDAY));
                int fileTxt = 0, fileNc =0;
                if (dncPassLog !=null) {
                    fileTxt = dncPassLog.getSequenceNumber() + 1;
                } else {
                    fileTxt =  1;
                }
                fileNc = fileTxt + 1;
                //处理文件名称  文件路径
                String sequence = String.format("%06d",fileTxt);
                String sequenceNc = String.format("%06d",fileNc);
                passInfoTxt.setSequenceNumber(fileTxt);
                passInfoTxt.setSequenceOrder(sequence);
                passInfoTxt.setCreateTime(dateFirst);
                System.out.println(DateUtil.format(dateFirst,DateUtil.STR_DATE_TIME));
                passInfoTxt.setPassType("02");
                dncPassLogService.save(passInfoTxt);
                DncPassLog passInfoNc = new DncPassLog();
                passInfoNc.setSequenceNumber(fileNc);
                passInfoNc.setSequenceOrder(sequenceNc);
                passInfoNc.setDayTime(DateUtil.format(dateFirst,DateUtil.STR_YEARMONTHDAY));
                passInfoNc.setPassType("02");
                passInfoNc.setPassName(docFile.getFileName());
                try {
                    Thread.sleep(1000);
                    Date date = new Date();
                    passInfoNc.setCreateTime(date);
                    System.out.println(DateUtil.format(date,DateUtil.STR_DATE_TIME));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                dncPassLogService.save(passInfoNc);
                NcTxtFilePathInfo ncTxt = new NcTxtFilePathInfo();
                ncTxt.setEquipmentId(mdcEquipment.getEquipmentId());
                ncTxt.setFileNcName("02A" + DateUtil.format(dateFirst, DateUtil.STR_YEARMONTHDAY));
                ncTxt.setFileTxtName("02A" + DateUtil.format(dateFirst, DateUtil.STR_YEARMONTHDAY));
                ncTxt.setFileNcName("10A"+DateUtil.format(dateFirst,DateUtil.STR_YEARMONTHDAY)+sequenceNc);
                ncTxt.setFileTxtName("10A"+DateUtil.format(dateFirst,DateUtil.STR_YEARMONTHDAY)+sequence);
                ncTxt.setFilePath(path + "/" + mdcEquipment.getEquipmentId() + "/");
                ncTxt.setOrigFileName(docFile.getFileName());
                ncTxt.setOrigFileSuffix(docFile.getFileSuffix());
                ncTxt.setFileAddOrDelete(1);
                String loFilePath = localFilePath + ncTxt.getFileTxtName() + ".nc";
                String loFilePath = secretFolder +"/"+ ncTxt.getFileTxtName() + ".nc";
                try {
                    String allList = ncTxt.getFileTxtName() + "\n"
                            + ncTxt.getFileNcName() + "\n"
@@ -736,7 +665,7 @@
                    FileUtilS.fileWriterSql(loFilePath, allList);
                    boolean copyFileNc = FileUtilS.copyFileUpName(path + "/" + mdcEquipment.getEquipmentId() + "/send/" +
                                    docFile.getFileName(),
                            localFilePath + ncTxt.getFileNcName(),
                            secretFolder +"/"+ncTxt.getFileNcName(),
                            docFile.getFileSuffix(), "NC");
                    if (!copyFileNc) {
                        FileUtilS.deleteNcFile(loFilePath);
@@ -767,6 +696,6 @@
    @Override
    public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
        return Lists.newArrayList("jeecg");
        return null;
    }
}