package org.jeecg.modules.activiti.service.impl; 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.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.activiti.engine.HistoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.activiti.entity.AssignFileStream; import org.jeecg.modules.activiti.entity.ToEquipmentTask; import org.jeecg.modules.activiti.ext.ActTaskExt; import org.jeecg.modules.activiti.ext.AssignFileStreamExt; import org.jeecg.modules.activiti.mapper.AssignFileStreamMapper; import org.jeecg.modules.activiti.request.ApproveBatchRequest; import org.jeecg.modules.activiti.request.AssignFileRequest; import org.jeecg.modules.activiti.request.AssignFileStreamQueryRequest; import org.jeecg.modules.activiti.request.TaskRequest; import org.jeecg.modules.activiti.service.IActivitiDefinitionService; import org.jeecg.modules.activiti.service.IAssignFileStreamService; import org.jeecg.modules.activiti.service.IToEquipmentTaskService; import org.jeecg.modules.dnc.entity.*; import org.jeecg.modules.dnc.exception.ExceptionCast; import org.jeecg.modules.dnc.ext.NcTxtFilePathInfo; import org.jeecg.modules.dnc.response.*; import org.jeecg.modules.dnc.service.*; import org.jeecg.modules.dnc.ucenter.Department; import org.jeecg.modules.dnc.utils.ValidateUtil; import org.jeecg.modules.dnc.utils.date.DateUtil; import org.jeecg.modules.dnc.utils.file.FileUtilS; import org.jeecg.modules.mdc.entity.MdcEquipment; import org.jeecg.modules.mdc.service.IMdcEquipmentService; import org.jeecg.modules.system.service.IMdcProductionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @Service public class AssignFileStreamServiceImpl extends ServiceImpl implements IAssignFileStreamService { private static final String PROCESS_KEY = "assign_nc_to_device"; private static final String APPLY_VARIABLE = "apply_user"; private static final String APPROVE_VARIABLE = "approve_users"; private static final String SEND_CODE = "SEND"; @Value("${activiti.enable}") private Boolean activeEnable; @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Autowired private IDocInfoService docInfoService; @Autowired private IProcessStreamService processStreamService; @Autowired private IWorkStepService workStepService; @Autowired private IPermissionStreamService permissionStreamService; @Autowired private IDepartmentService departmentService; @Autowired private HistoryService historyService; @Autowired private IDocClassificationService classificationService; @Autowired private IToEquipmentTaskService equipmentTaskService; @Autowired private IDeviceInfoService deviceInfoService; @Autowired private IDocFileService docFileService; @Autowired private IActivitiDefinitionService definitionService; @Autowired private IDocRelativeService docRelativeService; @Autowired private ISynchronizedFlagService synchronizedFlagService; @Autowired private IDeviceGroupService deviceGroupService; @Autowired private IDncPassLogService dncPassLogService; @Autowired private IDeviceCharactersService iDeviceCharactersService; @Autowired private IMdcEquipmentService iMdcEquipmentService; @Autowired private IMdcProductionService iMdcProductionService; @Autowired private StringRedisTemplate redisTemplate; @Value("${securedoc.serverIp}") private String serverIp; @Value("${securedoc.serverPort}") private int serverPort; @Value("${securedoc.whether}") private String whether; @Value("${securedoc.localFilePath}") private String localFilePath; @Override @Transactional(rollbackFor = {Exception.class}) public ResponseResult applyAssignFile(AssignFileStream stream) { synchronized (this){ //判断设备特殊字符 String specialChar = getDeviceSpecialChar(stream.getDeviceId(),stream.getFileId()); if (StrUtil.isNotEmpty(specialChar)){ //抛出特殊字符异常 return createSpecialCharErrorResponse(specialChar); } if(activeEnable) { boolean b = applyAssignFileActive(stream); if (b) { return ResponseResult.SUCCESS(); } else { return ResponseResult.SUCCESS(); } }else { return applyAssignFileNonActive(stream); } } } /** * 判断设备特殊字符 * @param deviceId,fileId * 设备ID,文件ID */ 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); // DocFile docFile = docFileService.getById(fileId); DocInfo docInfo = docInfoService.getOne(new QueryWrapper().eq("publish_file_id",fileId)); if(docInfo == null) ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR); List deviceCharactersList=iDeviceCharactersService.list( new LambdaQueryWrapper().eq(DeviceCharacters::getDeviceNo,mdcEquipment.getEquipmentId())); if (deviceCharactersList.isEmpty()){ return ""; }else { List specialCharList=deviceCharactersList.stream().map(DeviceCharacters::getCharacters).collect(Collectors.toList()); if(!specialCharList.isEmpty()){ //对比文件名是否包含特殊字符 String fileName=docInfo.getDocName(); for(String specialChar:specialCharList){ if (fileName.contains(specialChar)){ return specialChar; } } }else { return ""; } } return ""; } private ResponseResult createSpecialCharErrorResponse(String specialChar) { return new ResponseResult(new ResultCode() { @Override public boolean success() { return false; } @Override public int code() { return 88881; } @Override public String message() { return "文件名称存在设备特殊字符" + specialChar; } }); } @Override @Transactional(rollbackFor = {Exception.class}) public boolean applyAssignFileActive(AssignFileStream stream) { validateParams(stream); DocInfo docInfo = getDocInfo(stream); MdcEquipment mdcEquipment = getMdcEquipment(stream); DocFile docFile = docFileService.getById(stream.getFileId()); DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(stream.getDocId(), 4, stream.getDeviceId()); if (deviceDoc != null) { handleExistingDeviceDoc(docFile, mdcEquipment, stream.getDeviceId()); } deviceDoc = docInfoService.findByAttrAndDocName(docInfo.getDocName(), 4, stream.getDeviceId()); if (deviceDoc != null) { handleExistingDeviceDoc(docFile, mdcEquipment, stream.getDeviceId()); } List permissionStreams = getPermissionStreams(stream); LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = user.getId(); List departIds = getDepartIds(permissionStreams, userId); List userIdList = getUserIdList(departIds); saveBusinessObject(stream, userId); ProcessInstance processInstance = startProcessInstance(stream, userIdList); completeTask(processInstance, userId); return true; } @Override @Transactional(rollbackFor = {Exception.class}) public ResponseResult applyAssignFileNonActive(AssignFileStream stream) { //权限校验 validateParams(stream); DocInfo docInfo = getDocInfo(stream); MdcEquipment mdcEquipment = getMdcEquipment(stream); DocFile docFile = getDocFile(stream); DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(stream.getDocId(), 4, stream.getDeviceId()); if(deviceDoc != null) { // 删除 备份 覆盖 原有的 List strings=iMdcProductionService.findListParentTreeAll(mdcEquipment.getId()); if (strings != null && !strings.isEmpty()) { String path = StringUtils.join(strings.toArray(), "/"); boolean copyFileNc = FileUtilS.copyFileNcToBak(path + "/"+ mdcEquipment.getEquipmentId(), docFile.getFileName(), docFile.getFileSuffix()); } } /*deviceDoc = docInfoService.findByAttrAndDocName(docInfo.getDocName(), 4, stream.getDeviceId()); if(deviceDoc != null) { // 删除 备份 覆盖 原有的 List strings = deviceGroupService.findListParentTreeAll(deviceInfo.getGroupId()); if (strings != null && !strings.isEmpty()) { String path = StringUtils.join(strings.toArray(), "/"); boolean copyFileNc = FileUtilS.copyFileNcToBak(path + "/"+ deviceInfo.getDeviceNo(), docFile.getFileName(), docFile.getFileSuffix()); } }*/ getPermissionStreams(stream); //插入文档到设备发送文档 if(deviceDoc == null) { 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(4); docRelative.setAttributionId(stream.getDeviceId()); boolean b = docRelativeService.save(docRelative); if(!b) { ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR); } } handleFileTransfer(mdcEquipment, docFile); handleFileProcessing(docFile, mdcEquipment, whether, localFilePath); synchronizedFlagService.updateFlag(2); return new ResponseResult(CommonCode.SUCCESS); } @Override public IPage getUndoTaskList(Integer pageNo,Integer pageSize) { LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = user.getId(); if(!ValidateUtil.validateString(userId)) return null; List list = taskService.createTaskQuery().taskCandidateOrAssigned(userId).list(); if(list == null || list.isEmpty()) return null; List extList = new ArrayList<>(); list.forEach(item -> { ActTaskExt ext = new ActTaskExt(); ext.instanceOfTask(item); HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId( item.getProcessInstanceId()).singleResult(); if(historicProcessInstance == null || !ValidateUtil.validateString(historicProcessInstance.getBusinessKey())) { ExceptionCast.cast(ActivitiCode.ACT_PROC_INST_ERROR); } ext.setBusinessKey(historicProcessInstance.getBusinessKey()); AssignFileStreamExt streamDetail = getAssignFileStreamDetail(historicProcessInstance.getBusinessKey()); if(streamDetail == null) ExceptionCast.cast(ActivitiCode.ACT_BUSINESS_DETAIL_ERROR); ext.setAssignFileStream(streamDetail); extList.add(ext); }); //封装Page IPage page = new Page<>(pageNo,pageSize); page.setRecords(extList); return page; } @Override public AssignFileStreamExt getAssignFileStreamDetail(String streamId) { if(!ValidateUtil.validateString(streamId)) return null; return super.getBaseMapper().getAssignFileStreamDetail(streamId); } @Override @Transactional(rollbackFor = {Exception.class}) public boolean approveAssignFile(String taskId, String streamId, AssignFileStream stream) { if(!ValidateUtil.validateString(taskId) || !ValidateUtil.validateString(streamId) || stream == null) ExceptionCast.cast(CommonCode.INVALID_PARAM); LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = user.getId(); if(!ValidateUtil.validateString(userId)) ExceptionCast.cast(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST); if(!ValidateUtil.validateInteger(stream.getStatus())) ExceptionCast.cast(ActivitiCode.ACT_STATUS_ERROR); AssignFileStream en = super.getById(streamId); if(en == null) ExceptionCast.cast(ActivitiCode.ACT_BUSINESS_DETAIL_ERROR); Task task = taskService.createTaskQuery().taskId(taskId).taskCandidateOrAssigned(userId).singleResult(); if(task == null) ExceptionCast.cast(ActivitiCode.ACT_TASK_ERROR); if(!ValidateUtil.validateString(task.getAssignee())) { //拾取任务 taskService.claim(task.getId(), userId); //完成任务 taskService.complete(task.getId()); }else { //完成任务 taskService.complete(task.getId()); } //更新对象封装 AssignFileStream up = new AssignFileStream(); up.setApproveContent(stream.getApproveContent()); up.setStatus(stream.getStatus()); up.setApproveUserId(userId); up.setApproveTime(DateUtil.getNow()); up.setStreamId(streamId); boolean b = super.updateById(up); if(!b) ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR); if(up.getStatus() == 2) { //同意操作 DocInfo docInfo = docInfoService.getByDocAttrAndDocId(en.getDocId(), 5, en.getProcessId()); if(docInfo == null || docInfo.getDocStatus() == 3) ExceptionCast.cast(ActivitiCode.ACT_DOC_ERROR); DeviceInfo deviceInfo = deviceInfoService.getById(en.getDeviceId()); if(deviceInfo == null) ExceptionCast.cast(ActivitiCode.ACT_ASSIGN_DEVICE_NONE); DocFile docFile = docFileService.getById(en.getFileId()); if(docFile == null) ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR); DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(en.getDocId(),4, en.getDeviceId()); if(deviceDoc != null) { // 删除 备份 覆盖 原有的 List strings = deviceGroupService.findListParentTreeAll(deviceInfo.getGroupId()); if (strings != null && !strings.isEmpty()) { String path = StringUtils.join(strings.toArray(), "/"); boolean copyFileNc = FileUtilS.copyFileNcToBak(path + "/"+ deviceInfo.getDeviceNo(), docFile.getFileName(), docFile.getFileSuffix()); /* //docInfoService.getBaseMapper().deleteById(deviceDoc.getDocId()); boolean doc = docRelativeService.deleteCopyDocByAttrNext(deviceDoc.getDocId(),4,stream.getDeviceId()); if (!doc) { ExceptionCast.cast(ActivitiCode.ACT_DOC_ERROR_DELEVE); }*/ } } else { //插入文档到设备发送文档 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(4); docRelative.setAttributionId(en.getDeviceId()); b = docRelativeService.save(docRelative); } if(!b) ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR); if (deviceInfo != null) { List strings = deviceGroupService.findListParentTreeAll(deviceInfo.getGroupId()); if (strings != null && !strings.isEmpty()) { String path = StringUtils.join(strings.toArray(), "/"); boolean copyFileNc = FileUtilS.copyFileNc(docFile.getFilePath(),path + "/"+ deviceInfo.getDeviceNo(), docFile.getFileEncodeName(), docFile.getFileName(),docFile.getFileSuffix()); if (!copyFileNc) { ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR); } else { FileUtilS.deleteZipFromToSend(path + "/"+ deviceInfo.getDeviceNo(), docFile.getFileName(),docFile.getFileSuffix()); } } } return synchronizedFlagService.updateFlag(1); }else if(up.getStatus() == 3) { //拒绝操作 什么也不做 return true; }else { ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR); } return false; } @Override @Transactional(rollbackFor = {Exception.class}) public boolean applyBatchAssignFile(AssignFileRequest assignFileRequest) { if(assignFileRequest == null) ExceptionCast.cast(CommonCode.INVALID_PARAM); String[] deviceIds = assignFileRequest.getDeviceIds(); if(deviceIds == null || deviceIds.length < 1) ExceptionCast.cast(ActivitiCode.ACT_ASSIGN_DEVICE_NONE); AssignFileStream stream; for(String id : deviceIds) { stream = new AssignFileStream(); stream.setProcessId(assignFileRequest.getProcessId()); stream.setDocId(assignFileRequest.getDocId()); stream.setFileId(assignFileRequest.getFileId()); stream.setApplyReason(assignFileRequest.getApplyReason()); stream.setDeviceId(id); ResponseResult b = applyAssignFile(stream); if(!b.isSuccess()) ExceptionCast.cast(ActivitiCode.ACT_APPLY_ERROR); } return true; } @Override @Transactional(rollbackFor = {Exception.class}) public boolean approveBatchAssignFile(ApproveBatchRequest approveBatchRequest) { if(approveBatchRequest == null) ExceptionCast.cast(CommonCode.INVALID_PARAM); List 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); } @Override public Result findPageList(int page, int size, AssignFileStreamQueryRequest request) { if(page < 1 || size < 1) { ExceptionCast.cast(CommonCode.INVALID_PAGE); } LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = user.getId(); if(!ValidateUtil.validateString(userId)) ExceptionCast.cast(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST); LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(AssignFileStreamExt::getApproveUserId, userId); lambdaQueryWrapper.orderByDesc(AssignFileStreamExt::getApproveTime); IPage pageData = new Page<>(page, size); if(request != null) { if(ValidateUtil.validateString(request.getAscStr())) { String[] ascArr = request.getAscStr().split(","); // ((Page) pageData).setAsc(ascArr); } if(ValidateUtil.validateString(request.getDescStr())) { String[] descStr = request.getDescStr().split(","); // ((Page) pageData).setDesc(descStr); } } IPage streamExtIPage = super.getBaseMapper().findByPage(pageData, lambdaQueryWrapper); return Result.ok(streamExtIPage); } @Override public QueryPageResponseResult findPageListByDocId(int page, int size, String docId) { if(page < 1 || size < 1) { ExceptionCast.cast(CommonCode.INVALID_PAGE); } if(!ValidateUtil.validateString(docId)) ExceptionCast.cast(ActivitiCode.ACT_DOC_ID_NONE); QueryWrapper queryWrapper = Wrappers.query(); queryWrapper.eq("a.doc_id", docId); queryWrapper.orderByDesc("approve_time"); IPage pageData = new Page<>(page, size); IPage streamExtIPage = super.getBaseMapper().findByPage(pageData, queryWrapper); return new QueryPageResponseResult<>(CommonCode.SUCCESS, streamExtIPage); } @Override public Boolean getActiveEnable() { if(activeEnable != null) { return activeEnable; } return false; } @Override @Transactional(rollbackFor = {Exception.class}) public boolean transferDocFile(String pnCode, String deviceNo) { List streams = processStreamService.validateDeviceProcessInfo(pnCode, deviceNo); DeviceInfo deviceInfo = deviceInfoService.getByDeviceNo(deviceNo); if(deviceInfo == null) ExceptionCast.cast(DeviceCode.DEVICE_NOT_EXIST); //删除原来设备下的所有文档 docRelativeService.deleteByDocAttr(4, deviceInfo.getDeviceId()); List 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(4); 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) { ExceptionCast.cast(CommonCode.INVALID_PARAM); } if (!ValidateUtil.validateString(stream.getAttributionId()) || !ValidateUtil.validateString(stream.getDocId()) || !ValidateUtil.validateString(stream.getFileId()) || !ValidateUtil.validateString(stream.getAttributionType())) { ExceptionCast.cast(CommonCode.INVALID_PARAM); } if (!ValidateUtil.validateString(stream.getDeviceId())) { ExceptionCast.cast(ActivitiCode.ACT_ASSIGN_DEVICE_NONE); } LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = user.getId(); if (!ValidateUtil.validateString(userId)) { ExceptionCast.cast(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST); } } //获取文件信息 private DocInfo getDocInfo(AssignFileStream stream) { DocInfo docInfo = docInfoService.getByDocAttrAndDocId(stream.getDocId(), Integer.parseInt(stream.getAttributionType()), stream.getAttributionId()); if (docInfo == null || docInfo.getDocStatus() == 3) { ExceptionCast.cast(ActivitiCode.ACT_DOC_ERROR); } return docInfo; } //获取文件 private void handleExistingDeviceDoc(DocFile docFile, MdcEquipment mdcEquipment, String deviceId) { List strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getEquipmentId()); if (strings != null && !strings.isEmpty()) { String path = StringUtils.join(strings.toArray(), "/"); boolean copyFileNc = FileUtilS.copyFileNcToBak(path + "/" + mdcEquipment.getEquipmentId(), docFile.getFileName(), docFile.getFileSuffix()); if (!copyFileNc) { ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR); } else { DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(deviceId, 4, deviceId); boolean doc = docRelativeService.deleteDocByAttr(deviceDoc.getDocId(), 4, deviceId); if (!doc) { ExceptionCast.cast(ActivitiCode.ACT_DOC_ERROR_DELEVE); } } } } //权限校验 private List getPermissionStreams(AssignFileStream stream) { List permissionStreams = new ArrayList<>(); if (stream.getAttributionType().equals("5")) { // 工序 ProcessStream processStream = processStreamService.getById(stream.getAttributionId()); if (processStream == null) { ExceptionCast.cast(CommonCode.INVALID_PARAM); } stream.setProductId(processStream.getProductId()); stream.setComponentId(processStream.getComponentId()); stream.setPartsId(processStream.getPartsId()); stream.setProcessId(processStream.getProcessId()); permissionStreams = permissionStreamService .getByProcessId(processStream.getProductId(), processStream.getComponentId(), processStream.getPartsId(), processStream.getProcessId()); } else { // 工步 WorkStep workStep = workStepService.getById(stream.getAttributionId()); 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()); permissionStreams = permissionStreamService .getByStepId(workStep.getProductId(), workStep.getComponentId(), workStep.getPartsId(), workStep.getProcessId(), workStep.getId()); } if (permissionStreams == null || permissionStreams.isEmpty()) { ExceptionCast.cast(ActivitiCode.ACT_NODE_DEPART_NONE); } return permissionStreams; } //获取部门信息 //todo 修改 private List getDepartIds(List permissionStreams, String userId) { Map map = departmentService.getMapByUserId(userId); List 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 List getUserIdList(List departIds) { List userIdList = definitionService.getByDepartIds(departIds); if (userIdList == null || userIdList.isEmpty()) { ExceptionCast.cast(ActivitiCode.ACT_APPROVE_USERS_NONE); } return userIdList; } //封装数据 private void saveBusinessObject(AssignFileStream stream, String userId) { String streamId = IdWorker.getIdStr(); stream.setStreamId(streamId); stream.setApplyUserId(userId); stream.setApplyTime(DateUtil.getNow()); stream.setStatus(1); boolean b = super.save(stream); if (!b) { ExceptionCast.cast(ActivitiCode.ACT_BUSINESS_SAVE_ERROR); } } //开始工作流 private ProcessInstance startProcessInstance(AssignFileStream stream, List userIdList) { String approveUsers = String.join(",", userIdList); Map 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) { Task task = taskService.createTaskQuery().processDefinitionKey(PROCESS_KEY).taskAssignee(userId) .processInstanceId(processInstance.getId()).singleResult(); if (task == null) { ExceptionCast.cast(ActivitiCode.ACT_APPROVE_USERS_NONE); } taskService.complete(task.getId()); } //获取设备 private MdcEquipment getMdcEquipment(AssignFileStream stream) { MdcEquipment mdcEquipment = iMdcEquipmentService.getById(stream.getDeviceId()); if (mdcEquipment == null) { ExceptionCast.cast(ActivitiCode.ACT_ASSIGN_DEVICE_NONE); } return mdcEquipment; } //获取文件 private DocFile getDocFile(AssignFileStream stream) { DocFile docFile = docFileService.getById(stream.getFileId()); if (docFile == null) { ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR); } return docFile; } //插入文件传输任务表 private void handleFileTransfer(MdcEquipment mdcEquipment, DocFile docFile) { List strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getId()); if (strings != null && !strings.isEmpty()) { String path = StringUtils.join(strings.toArray(), "/"); boolean copyFileNc = FileUtilS.copyFileNc(docFile.getFilePath(), path + "/" + mdcEquipment.getEquipmentId(), docFile.getFileEncodeName(), docFile.getFileName(), docFile.getFileSuffix()); if (!copyFileNc) { ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR); } else { FileUtilS.deleteZipFromToSend(path + "/" + mdcEquipment.getEquipmentId(), docFile.getFileName(), docFile.getFileSuffix()); } } else { throw new RuntimeException("文件传输路径获取失败"); } } //封装处理文件 private void handleFileProcessing(DocFile docFile, MdcEquipment mdcEquipment, String whether, String localFilePath) { if (whether.equals("true") && !docFile.getFileSuffix().equals("zip") && !docFile.getFileSuffix().equals("rar")) { String size = FileUtilS.fileSizeNC(docFile.getFilePath(), docFile.getFileEncodeName()); List strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getId()); if (strings != null && !strings.isEmpty()) { String path = StringUtils.join(strings.toArray(), "/"); Date dateFirst = DateUtil.getNow(); DncPassLog passInfoTxt = new DncPassLog(); passInfoTxt.setDayTime(DateUtil.format(dateFirst, DateUtil.STR_YEARMONTHDAY)); DncPassLog dncPassLog = dncPassLogService.findDayTime(DateUtil.format(dateFirst, DateUtil.STR_YEARMONTHDAY)); Integer fileTxt = 0, fileNc = 0; if (dncPassLog != null) { fileTxt = dncPassLog.getSequenceNumber() + 1; fileNc = fileTxt + 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); 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); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } dncPassLogService.save(passInfoNc); NcTxtFilePathInfo ncTxt = new NcTxtFilePathInfo(); ncTxt.setEquipmentId(mdcEquipment.getEquipmentId()); ncTxt.setFileNcName("02A" + DateUtil.format(dateFirst, DateUtil.STR_YEARMONTHDAY) + sequenceNc); ncTxt.setFileTxtName("02A" + 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"; try { String allList = ncTxt.getFileTxtName() + "\n" + ncTxt.getFileNcName() + "\n" + ncTxt.getOrigFileName() + "\n" + ncTxt.getOrigFileSuffix() + "\n" + ncTxt.getFilePath() + "\n" + ncTxt.getEquipmentId() + "\n" + ncTxt.getFileAddOrDelete().toString() + "\n" + size + "\n"; FileUtilS.fileWriterSql(loFilePath, allList); boolean copyFileNc = FileUtilS.copyFileUpName(path + "/" + mdcEquipment.getEquipmentId() + "/send/" + docFile.getFileName(), localFilePath + ncTxt.getFileNcName(), docFile.getFileSuffix(), "NC"); if (!copyFileNc) { FileUtilS.deleteNcFile(loFilePath); } } catch (IOException e) { throw new RuntimeException("文件处理失败", e); } } } } }