已修改31个文件
已添加2个文件
891 ■■■■ 文件已修改
blade-service/blade-mdm/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/entity/ProduceDivision.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/vo/ProduceDivisionVO.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/AutoAssignUsersService.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/StartDispatcher.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/TaskAssignVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/MdmParamController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/MdmProgramImportController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/ProcessProgRef.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramApprovedMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java 178 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProcessProgRefService.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/MdmProgramImportVO.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcProgramExportDncPageVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcProgramUploadVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcProgramVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/resources/processesbpmn/program-cure.bpmn20.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/pom.xml
@@ -44,6 +44,10 @@
        </dependency>
        <dependency>
            <groupId>org.springblade</groupId>
            <artifactId>blade-system-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springblade</groupId>
            <artifactId>blade-flow-api</artifactId>
        </dependency>
        <!-- å·¥ä½œæµ -->
blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/entity/ProduceDivision.java
@@ -13,6 +13,10 @@
@TableName("mdm_produce_division")
public class ProduceDivision extends BizEntity {
    /**
     * é›¶ç»„件编号
     */
    private String drawingNo;
    /**
     * ä¸“业组长id
     */
    private Long teamLeaderId;
blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/vo/ProduceDivisionVO.java
@@ -1,29 +1,27 @@
package org.springblade.mdm.basesetting.producedivision.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import org.springblade.mdm.commons.vo.BaseVO;
/**
 * ä¸»åˆ¶è®¡åˆ’表
 */
@Schema(description = "主制分工表")
@Setter
@Getter
public class ProduceDivisionVO extends BaseVO {
    /**
     * ä¸“业组长id
     */
    @Schema(description = "零组件号/图号")
    private String drawingNo;
    @Schema(description = "专业组长id")
    private Long teamLeaderId;
    /**
     * ç¼–制工艺员id
     */
    @Schema(description = "编制工艺员id")
    private Long programmerId;
    /**
     * æ ¡å¯¹å·¥è‰ºå‘˜id
     */
    @Schema(description = "校对工艺员id")
    private Long checkerId;
    /**
     * é«˜å¸ˆid
     */
    @Schema(description = "审批高师id")
    private Long seniorId;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
@@ -1,8 +1,10 @@
package org.springblade.mdm.flow.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.flowable.engine.TaskService;
@@ -16,7 +18,9 @@
import org.springblade.mdm.flow.entity.ApproveRecord;
import org.springblade.mdm.flow.excution.StartDispatcher;
import org.springblade.mdm.flow.service.ApproveRecordService;
import org.springblade.mdm.flow.service.FlowCommonService;
import org.springblade.mdm.flow.vo.TaskAssignVO;
import org.springblade.mdm.program.entity.ProcessProgRef;
import org.springblade.mdm.program.service.ProcessProgRefService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
@@ -30,19 +34,19 @@
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("/flow/dispatch")
@Tag(name = "派工流程", description = "派工流程")
public class DispatchController {
    @Autowired
    private StartDispatcher dispatcher;
    @Autowired
    private TaskService taskService;
    @Autowired
    private ProcessProgRefService processProgRefService;
    private final StartDispatcher dispatcher;
    @Autowired
    private final TaskService taskService;
    private final ProcessProgRefService processProgRefService;
    private ApproveRecordService approveRecordService;
    private final FlowCommonService flowCommonService;
    /**
     * æ–°å¢ž
     */
@@ -77,7 +81,7 @@
        if(variables.containsKey("assignee")){
            addApproveRecord(taskId,processInstanceId,comment,programIds,variables);
            addApproveRecord(taskId,processInstanceId,comment,variables);
            //指定了下一步执行人
            taskService.complete(taskId, variables);
@@ -89,29 +93,13 @@
    }
    void addApproveRecord(String taskId, String processInstanceId, String comment,String programIds,Map<String, Object> variables){
        List<Long> programIdList = new ArrayList<>();
        if(programIds != null){
            programIdList = Func.toLongList(programIds);
        }else{
            programIdList.add(null);
        }
    void addApproveRecord(String taskId, String processInstanceId, String comment,Map<String, Object> variables){
        String operateResult = variables.get("approve")+"";
        Task task = taskService.createTaskQuery()
            .taskId(taskId)
            .singleResult();
        for(Long programId : programIdList){
            ApproveRecord rec = new ApproveRecord();
            rec.setTaskName(task.getName());
            rec.setComment(comment);
            rec.setNcProgramId(programId);
            rec.setOperateResult(variables.get("approve")+"");//审批结果
            rec.setOperateTime(DateUtil.now());
            rec.setProcessInstanceId(processInstanceId);
            rec.setUserId(AuthUtil.getUserId());
            rec.setUserNickname(AuthUtil.getNickName());
            approveRecordService.save(rec);
        }
        approveRecordService.saveApproveRecords(task,processInstanceId,operateResult,comment);
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java
@@ -19,6 +19,11 @@
    private String processInstanceId;
    /**
     * æµç¨‹å®šä¹‰key
     */
    private String processDefinitionKey;
    /**
     * ä»»åŠ¡åç§°
     */
    private String taskName;
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/AutoAssignUsersService.java
@@ -1,28 +1,43 @@
package org.springblade.mdm.flow.excution;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.AllArgsConstructor;
import org.springblade.mdm.basesetting.producedivision.entity.ProduceDivision;
import org.springblade.mdm.basesetting.producedivision.mapper.ProduceDivisionMapper;
import org.springblade.mdm.basesetting.producedivision.service.ProduceDivisionService;
import org.springblade.mdm.flow.vo.TaskAssignVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
/**
 * èŽ·å–è‡ªåŠ¨åŒ¹é…çš„ä¸“ä¸šç»„é•¿ï¼Œç¼–åˆ¶äººå‘˜ï¼Œæ•™ç ”å‘˜ï¼Œå’Œé«˜å¸ˆ
 */
@AllArgsConstructor
@Service
public class AutoAssignUsersService {
    @Autowired
    private ProduceDivisionMapper divMapper;
    public Map<String,Object> autoAssignUsers(long producePlanId){
        ProduceDivision pplan = divMapper.selectById(producePlanId);
    //private final ProduceDivisionMapper divMapper;
    private final ProduceDivisionService divService;
    public Map<String,Object> autoAssignUsers(TaskAssignVO startVO){
        LambdaQueryWrapper<ProduceDivision> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ProduceDivision::getDrawingNo,startVO.getDrawingNo());
        Optional<ProduceDivision> optDiv = divService.getOneOpt(queryWrapper);
        if(!optDiv.isPresent()){
            throw new RuntimeException("未找到主制分工表数据");
        }
        ProduceDivision division = optDiv.get();
        Map<String,Object> result = new HashMap<String,Object>();
        result.put("teamLeader",pplan.getTeamLeaderId());
        result.put("programmer",pplan.getProgrammerId());
        result.put("checker",pplan.getCheckerId());
        result.put("senior",pplan.getSeniorId());
        result.put("teamLeader",division.getTeamLeaderId());
        result.put("programmer",division.getProgrammerId());
        result.put("checker",division.getCheckerId());
        result.put("senior",division.getSeniorId());
        return result;
    }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/StartDispatcher.java
@@ -1,6 +1,7 @@
package org.springblade.mdm.flow.excution;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.engine.IdentityService;
import org.flowable.engine.runtime.ProcessInstance;
@@ -11,7 +12,9 @@
import org.springblade.flow.core.utils.TaskUtil;
import org.springblade.mdm.flow.vo.TaskAssignVO;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.entity.ProcessProgRef;
import org.springblade.mdm.program.service.NcProgramService;
import org.springblade.mdm.program.service.ProcessProgRefService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.flowable.engine.RuntimeService;
@@ -19,23 +22,26 @@
import java.util.List;
import java.util.Map;
@AllArgsConstructor
@Service("startDispatcher")
public class StartDispatcher  {
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private AutoAssignUsersService autoAssignUsersService;
    @Autowired
    private IdentityService identityService;
    private final RuntimeService runtimeService;
    private final AutoAssignUsersService autoAssignUsersService;
    @Autowired
    private NcProgramService ncProgramService;
    private static final String PROCESS_KEY = "dispatch";
    private final IdentityService identityService;
    private final ProcessProgRefService processProgRefService;
    private final NcProgramService ncProgramService;
    public static final String PROCESS_KEY = "dispatch";
    /**
     * å¯åŠ¨æ´¾å·¥æµç¨‹
     * @param startVO
     */
    public void start(TaskAssignVO startVO){
        Map<String,Object> preAssignee = autoAssignUsersService.autoAssignUsers(startVO.getProducePlanId());
        Map<String,Object> preAssignee = autoAssignUsersService.autoAssignUsers(startVO);
        Map<String, Object> vars = new HashMap<>(preAssignee);
        vars.put("machineCode",startVO.getMachineCode());
@@ -47,26 +53,31 @@
        vars.put("craftEdition",startVO.getCraftEdition());
        vars.put("planStartTime",startVO.getPlanStartTime());
        vars.put("partNo",startVO.getPartNo());
        vars.put("partNoEdition",startVO.getPartNoEdition());
        vars.put("drawingNo",startVO.getDrawingNo());
        vars.put("drawingNoEdition",startVO.getDrawingNoEdition());
        vars.put("planLockDays",startVO.getPlanLockDays());
        vars.put("productModel",startVO.getProductModel());
        //零组件代码
        String partNo = generatePartNo(startVO);
        vars.put("partNo",partNo);
        List<NcProgram> curedNcProgram = ncProgramService.getCuredNcProgram(partNo,startVO.getMachineCode());
        //vars.put("curedNcProgram",curedNcProgram);
        List<NcProgram> curedNcPrograms = ncProgramService.getCuredNcProgram(startVO.getDrawingNo(),startVO.getMachineCode());
        //设置是否有固化程序标记
        vars.put("hasCuredProgram",!curedNcProgram.isEmpty() ? "Y":"N");
        vars.put("hasCuredProgram",!curedNcPrograms.isEmpty() ? "Y":"N");
        String businessKey = "0";//业务表key
        identityService.setAuthenticatedUserId(String.valueOf(AuthUtil.getUserId()));//设置流程发起人
        ProcessInstance pinst = runtimeService.startProcessInstanceByKey(PROCESS_KEY,businessKey,vars);
        int a=1;
        //如果有已固化程序,则将程序id插入流畅关联表
        for(NcProgram ncProgram : curedNcPrograms){
            ProcessProgRef ref = new ProcessProgRef();
            ref.setProcessInstanceId(pinst.getId());
            ref.setNcProgramId(ncProgram.getId());
            ref.setProcessDefinitionKey(pinst.getProcessDefinitionKey());
            processProgRefService.save(ref);
        }
        //log.info()
    }
@@ -76,6 +87,7 @@
     * @param startVO
     * @return
     */
    /*
    String generatePartNo(TaskAssignVO startVO){
        //TODO è¿™ä¸ªæ ¼å¼æœªç¡®å®šï¼Œéœ€è¦ç¡®è®¤
        return String.format("%s-%s-%s-%s-%s-%s",
@@ -85,5 +97,5 @@
            startVO.getProcessName(),
            startVO.getCraftEdition(),
            startVO.getProcessEdition());
    }
    }*/
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java
@@ -1,12 +1,20 @@
package org.springblade.mdm.flow.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.flowable.task.api.Task;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.mdm.flow.entity.ApproveRecord;
import org.springblade.mdm.flow.mapper.ApproveRecordMapper;
import org.springblade.mdm.flow.vo.ApproveRecordVO;
import org.springblade.mdm.program.entity.ProcessProgRef;
import org.springblade.mdm.program.service.ProcessProgRefService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -20,8 +28,86 @@
@Service
@AllArgsConstructor
public class ApproveRecordService extends BizServiceImpl<ApproveRecordMapper, ApproveRecord> {
    private final ProcessProgRefService processProgRefService;
    private final FlowCommonService flowCommonService;
    public List<ApproveRecordVO> listByNcProgramId(Long ncProgramId) {
        return this.getBaseMapper().listByNcProgramId(ncProgramId);
    }
    public void saveApproveRecords(Task task, String processInstanceId, String operateResult, String comment) {
        String processDefinitionKey = flowCommonService.getDefinitionKey(processInstanceId);
        LambdaQueryWrapper<ProcessProgRef> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ProcessProgRef::getProcessInstanceId, processInstanceId);
        List<ProcessProgRef> refList =  processProgRefService.list(queryWrapper);
        if(!refList.isEmpty()) {
            for (ProcessProgRef refObj : refList) {
                ApproveRecord rec = new ApproveRecord();
                rec.setTaskName(task.getName());
                rec.setComment(comment==null? StringUtils.EMPTY:comment);
                rec.setNcProgramId(refObj.getNcProgramId());
                rec.setOperateResult(operateResult);//审批结果
                rec.setOperateTime(DateUtil.now());
                rec.setProcessInstanceId(processInstanceId);
                rec.setProcessDefinitionKey(processDefinitionKey);
                rec.setUserId(AuthUtil.getUserId());
                rec.setUserNickname(AuthUtil.getNickName());
                save(rec);
            }
            //检查ncprogram为null的数据
            updateApproveRecords(processInstanceId,refList);
        }else{
            //如果还没有关联的程序数据,则插入一个programId为null的
            ApproveRecord rec = new ApproveRecord();
            rec.setTaskName(task.getName());
            rec.setComment(comment==null? StringUtils.EMPTY:comment);
            rec.setProcessInstanceId(processInstanceId);
            rec.setProcessDefinitionKey(processDefinitionKey);
            rec.setOperateResult(operateResult);
            rec.setOperateTime(DateUtil.now());
            rec.setNcProgramId(null);//空的程序id
            rec.setUserId(AuthUtil.getUserId());
            rec.setUserNickname(AuthUtil.getNickName());
            save(rec);
        }
    }
    /**
     * æ›´æ–°ä»¥å‰æ— æ–‡ä»¶æ—¶å€™çš„æ•°æ®ã€‚
     * @param processInstanceId
     */
    void updateApproveRecords(String processInstanceId,List<ProcessProgRef> refList) {
        if(refList.isEmpty()) {
            return;
        }
        List<ApproveRecord> records = this.lambdaQuery().isNull(ApproveRecord::getNcProgramId).eq(ApproveRecord::getProcessInstanceId, processInstanceId).list();
        if(records.isEmpty()) {
            return;
        }
        for(ApproveRecord record:records) {
            for(int j=0;j< refList.size();j++) {
                ProcessProgRef refObj = refList.get(j);
                ApproveRecord record2 = new ApproveRecord();
                BeanUtils.copyProperties(record, record2);
                record2.setNcProgramId(refObj.getNcProgramId());
                if(j>0){//后续数据需要新增数据
                    record2.setId(null);
                    save(record2);
                }else{//第一条是更新原纪录
                    updateById(record2);
                }
            }
        }
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package org.springblade.mdm.flow.service;
import lombok.AllArgsConstructor;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.runtime.ProcessInstance;
import org.springframework.stereotype.Service;
@AllArgsConstructor
@Service
public class FlowCommonService {
    private final RuntimeService runtimeService;
    /**
     * æ ¹æ®æµç¨‹å®žä¾‹id获取definitionKey
     * @param processInstanceId
     * @return
     */
    public String getDefinitionKey(String processInstanceId){
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
            .processInstanceId(processInstanceId)
            .singleResult();
        return processInstance.getProcessDefinitionKey();
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/TaskAssignVO.java
@@ -10,9 +10,9 @@
@Schema(description = "任务计划")
public class TaskAssignVO {
    @Schema(description = "零组件/图号")
    private String partNo;
    private String drawingNo;
    @Schema(description = "图号版次/设计版次")
    private String partNoEdition;
    private String drawingNoEdition;
    @Schema(description = "工序号")
    private String processNo;
    @Schema(description = "工序名称")
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/MdmParamController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package org.springblade.mdm.program.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.mdm.program.service.NcProgramExchangeService;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springblade.system.feign.ISysClient;
import org.springblade.system.feign.IUserClient;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
 * æµç¨‹ç®¡ç†æŽ¥å£
 *
 * @author Chill
 */
@NonDS
@RestController
@RequestMapping("/system/param/")
@AllArgsConstructor
@Tag(name = "MDM系统参数", description = "MDM系统参数")
@Slf4j
public class MdmParamController {
    private final ISysClient sysClient;
    @GetMapping("/getValue")
    @ApiOperationSupport(order = 2)
    @Operation(summary = "获取参数值")
    public R<String> getValue(@Parameter(description = "参数Key") @RequestParam String paramKey) {
        try {
            return sysClient.getParamValue(paramKey);
        }catch (Exception e){
            log.error("入库错误",e);
            return R.fail(e.getMessage());
        }
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/MdmProgramImportController.java
@@ -29,7 +29,7 @@
@RestController
@RequestMapping("/program/mdmimport/")
@AllArgsConstructor
@Tag(name = "DNC导入", description = "DNC导入接口")
@Tag(name = "MDM导入", description = "工控网MDM导入接口")
@Slf4j
public class MdmProgramImportController {
@@ -51,10 +51,10 @@
            return R.fail(e.getMessage());
        }
    }
    /*
    @PostMapping("accept")
    @ApiOperationSupport(order = 2)
    @Operation(summary = "MDM程序入库", description = "涉密网程序确认入库")
    @Operation(summary = "MDM程序入库", description = "工控网导入涉密网程序-确认入库")
    public R<Void> accept(@RequestParam String ids) {
        try {
            mdmProgramImportService.mdmFileAccept(ids);
@@ -63,5 +63,5 @@
            return R.fail(e.getMessage());
        }
        return R.success();
    }*/
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java
@@ -127,4 +127,16 @@
    public R<List<NcProgramVO>> send(@Parameter(description="所属节点ID")@RequestParam Long id) {
        return null;//R.data(ncProcessProgRefService.listByProcess(processInstanceId));
    }
    @GetMapping("/send-to-machine-by-nodeid")
    @Operation(summary = "下发", description = "下发给机床设定的目录")
    public R<Void> sendToMachineByNodeId(@Parameter(description = "节点id") Long nodeId) {
        try {
            ncProgramService.sendByBindNodeId(nodeId);
            return R.success();
        }catch(Exception e) {
            log.error("删除文件失败",e);
            return R.fail(e.getMessage());
        }
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java
@@ -42,7 +42,6 @@
    @Operation(summary = "程序导出DNC分页查询", description = "分页查询,供用户选择数据")
    @GetMapping("/export-dnc-page")
    public R<IPage<NcProgramExportDncPageVO>> page(NcProgramExportDncQueryVO query) {
        //IPage<NcProgramVO> pages = ncProgramService.pageQuery(query);
        return R.data(ncProgramApprovedService.exportDncPageQuery(query));
    }
@@ -53,6 +52,8 @@
            throw new ServiceException("未选择文件导出");
        }
        try {
            response.setHeader("Content-Disposition", "attachment; filename=dnc-t.zip");
            response.setContentType("application/octet-stream");
            ncProgramExportDNCService.exportDnc(vo.getIds(),response.getOutputStream());
        } catch (IOException e) {
            log.error("导出DNC异常", e);
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java
@@ -5,9 +5,6 @@
import lombok.Setter;
import org.springblade.core.mp.base.BizEntity;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Setter
@Getter
@TableName("mdm_nc_node")
@@ -43,7 +40,7 @@
    /**
     * é›¶ç»„件号/图号
     */
    private String partNo;
    private String drawingNo;
    /**
     * å›¾å·ç‰ˆæ¬¡
     */
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java
@@ -58,7 +58,7 @@
    /**
     * é›¶ç»„件号/图号
     */
    private String partNo;
    private String drawingNo;
    /**
     * æè¿°
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/ProcessProgRef.java
@@ -23,4 +23,8 @@
     */
    private Long ncProgramId;
    /**
     * æµç¨‹å®šä¹‰key
     */
    private String processDefinitionKey;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcNodeMapper.xml
@@ -24,26 +24,27 @@
    <!--    <select id="parentTree" resultMap="treeNodeResultMap">-->
<!--        select id, parent_id, dict_value as title, id as "value", id as "key" from blade_dict where is_deleted = 0 and parent_id = 0-->
<!--    </select>-->
    <sql id="prog_all_columns">id,tenant_id,nc_node_id,code,name,machine_code,part_no,is_cured,
    <sql id="prog_all_columns">id,tenant_id,nc_node_id,code,name,machine_code,draw_no,is_cured,
  expire_date,process_edition,is_last_edition,is_locked,task_assign_time,status,create_dept,is_deleted,create_time,create_user,update_time,update_user</sql>
    <select id="getCuredNcProgram" resultMap="BaseResultMap">
        select <include refid="prog_all_columns"/> from mdm_nc_program
        where is_deleted=0 and is_cured=1 and part_no=#{partNo} and is_last_edition=1
        where is_deleted=0 and is_cured=1 and drawing_no=#{drawingNo} and is_last_edition=1
        and machine_code in (select code from mdm_machine where machine_group_code=#{machineGroupCode})
        order by create_time desc
        limit 1
    </select>
    <sql id="all_columns">id,tenant_id,name,parent_id,node_type,status,create_dept,is_deleted,create_time,create_user,update_time,update_user</sql>
    <sql id="all_columns_n">n.id,n.tenant_id,n.name,n.parent_id,n.node_type,n.status,n.create_dept,n.is_deleted,n.create_time,n.create_user,n.update_time,n.update_user</sql>
    <select id="lazyList" resultType="org.springblade.mdm.program.vo.NcNodeVO">
        select <include refid="all_columns"/>,(
        select <include refid="all_columns_n"/>,u.name create_user_name,(
        SELECT
        CASE WHEN count(1) > 0 THEN 1 ELSE 0 END
        FROM
        mdm_nc_node
        WHERE
        parent_id = n.id and is_deleted = 0
        ) AS "has_children" from mdm_nc_node n where is_deleted=0 and parent_id=#{parentId}
        ) AS "has_children" from mdm_nc_node n left join blade_user u on n.create_user=u.id where n.is_deleted=0 and n.parent_id=#{parentId}
    </select>
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramApprovedMapper.xml
@@ -11,7 +11,7 @@
        <result column="is_deleted" property="isDeleted"/>
    </resultMap>
    <select id="exportDncPageQuery" resultType="org.springblade.mdm.program.vo.NcProgramExportDncPageVO">
        select a.id,a.nc_program_id,p.name,p.nc_node_id,p.part_no,p.part_no_edition,p.process_name,a.create_time from mdm_nc_program_approved a inner join mdm_nc_program p on a.nc_program_id=p.id
        select a.id,a.nc_program_id,p.name,p.nc_node_id,p.drawing_no,p.drawing_no_edition,p.process_name,a.create_time from mdm_nc_program_approved a inner join mdm_nc_program p on a.nc_program_id=p.id
        where a.is_deleted=0
        <where>
            <if test="query.name!=null and query.name!=''">
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.java
@@ -18,11 +18,11 @@
    /**
     * èŽ·å–æœ€æ–°å›ºåŒ–ç¨‹åº
     * @param partNo é›¶ç»„件号
     * @param drawingNo é›¶ç»„件号
     * @param machineGroupCode æœºåºŠç»„代码
     * @return
     */
    List<NcProgram> getCuredNcProgram( @Param("partNo")String partNo,@Param("machineGroupCode")String machineGroupCode);
    List<NcProgram> getCuredNcProgram( @Param("drawingNo")String drawingNo,@Param("machineGroupCode")String machineGroupCode);
    IPage<NcProgramVO> pageQuery(@Param("page")IPage<NcNodeProgramVO> page, @Param("query") NcNodeProgramQueryVO query);
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/mapper/NcProgramMapper.xml
@@ -8,7 +8,7 @@
        <result column="package_name" property="packageName"/>
        <result column="machine_code" property="machineCode"/>
        <result column="part_no" property="partNo"/>
        <result column="drawing_no" property="drawingNo"/>
        <result column="is_cured" property="isCured"/>
        <result column="expire_date" property="expireDate"/>
        <result column="process_edition" property="processEdition"/>
@@ -34,17 +34,17 @@
    <!--    <select id="parentTree" resultMap="treeNodeResultMap">-->
<!--        select id, parent_id, dict_value as title, id as "value", id as "key" from blade_dict where is_deleted = 0 and parent_id = 0-->
<!--    </select>-->
    <sql id="all_columns">id,tenant_id,nc_node_id,code,name,machine_code,part_no,is_cured,
    <sql id="all_columns">id,tenant_id,nc_node_id,code,name,machine_code,drawing_no,is_cured,
  expire_date,process_edition,is_last_edition,is_locked,task_assign_time,status,create_dept,is_deleted,create_time,create_user,update_time,update_user</sql>
    <select id="getCuredNcProgram" resultMap="BaseResultMap">
        select <include refid="all_columns"/> from mdm_nc_program
        where is_deleted=0 and is_cured=1 and part_no=#{partNo} and is_last_edition=1
        where is_deleted=0 and is_cured=1 and drawing_no=#{drawingNo} and is_last_edition=1
        and machine_code in (select code from mdm_machine where machine_group_code=#{machineGroupCode})
        order by create_time desc
    </select>
    <select id="pageQuery" resultType="org.springblade.mdm.program.vo.NcProgramVO">
        select id,nc_node_id,name,machine_code,part_no,part_no_edition,process_name,craft_edition from mdm_nc_program p
        select id,nc_node_id,name,machine_code,drawing_no,drawing_no_edition,process_name,craft_edition from mdm_nc_program p
        where is_deleted=0 and is_last_edition=1 and (category='program' or category='subprogram')
        <where>
@@ -53,10 +53,5 @@
            </if>
        </where>
    </select>
    <!--
    <select id="getLastNcProgram" resultType="org.springblade.mdm.program.entity.NcProgram">
        select <include refid="all_columns"/> from mdm_nc_program
        where is_deleted=0 and is_last_edition=1 order by create_time desc limit 1
    </select>
    -->
</mapper>
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java
@@ -9,15 +9,22 @@
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
import org.springblade.core.mp.base.BizEntity;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.FileUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.IoUtil;
import org.springblade.mdm.flow.entity.ApproveRecord;
import org.springblade.mdm.flow.service.ApproveRecordService;
import org.springblade.mdm.flow.service.CureFlowService;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.entity.NcProgramExchange;
import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springblade.mdm.program.vo.MdmProgramImportVO;
import org.springblade.mdm.utils.CustomBinaryReader;
import org.springframework.stereotype.Service;
@@ -27,7 +34,7 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.Duration;
import java.util.*;
/**
@@ -41,6 +48,14 @@
public class MdmProgramImportService extends BizServiceImpl<NcProgramExchangeMapper, NcProgramExchange> {
    private final CureFlowService cureFlowService;
    private final NcProgramService ncProgramService;
    private final NcNodeService ncNodeService;
    private final ApproveRecordService approveRecordService;
    private final BladeRedis bladeRedis;
    private final OssTemplate ossTemplate;
    private String getFileKey(){
        return "mdmimpfile-"+ AuthUtil.getUserId();
    }
    /**
     * MDM导入文件上传
     * @param file MDM涉密网导出文件
@@ -49,6 +64,11 @@
    public List<MdmProgramImportVO> mdmImportUpload(MultipartFile file) {
        List<MdmProgramImportVO> list;
        try {
            BladeFile bfile = ossTemplate.putFile(file);//上传,供后续入库使用
            //设置一个缓存,2小时过期
            bladeRedis.setEx(getFileKey(),bfile.getName(), Duration.ofHours(2));
            String pkgFileName = bladeRedis.get(getFileKey());
            //String fileName = file.getOriginalFilename();
            //InputStream zipFileInputStream = FileExchangeUtil.convertFileToZip(file.getInputStream());
            InputStream zipFileInputStream = file.getInputStream();//test
@@ -125,7 +145,7 @@
                                d.setIsTest(jsonObject.getInteger("isTest"));
                                d.setMachineCode(jsonObject.getString("machineCode"));
                                d.setNcNodeId(jsonObject.getLong("ncNodeId"));
                                d.setPartNo(jsonObject.getString("partNo"));
                                d.setDrawingNo(jsonObject.getString("drawingNo"));
                                d.setProcessEdition(jsonObject.getString("processEdition"));
                                fileDataMap.put(d.getName(),d);
@@ -161,13 +181,16 @@
     * @param ids id列表逗号分隔
     * @return
     */
    public void mdmFileAccept(String ids) {
        /*
    public void mdmFileAccept(String ids) throws IOException {
        String pkgFileName = bladeRedis.get(getFileKey());
        List<Long> idList = Func.toLongList(ids);
        //
        updateProgramFile(pkgFileName,idList);
        List<NcProgram> progList = ncProgramService.listByIds(idList);
        NcProgramExchange exchange;
        //NcProgram program;
        //NcNode programNode;
        for(NcProgram prog:progList){
            exchange = new NcProgramExchange();
@@ -175,11 +198,178 @@
            exchange.setExchangeType(2);//回传
            exchange.setNcProgramId(prog.getId());
            this.save(exchange);
        }
    //直接入库,无流程
        */
    }
    /**
     * æ›´æ–°ç¨‹åºæ–‡ä»¶
     * @param pkgFileName mdm程序包
     * @param idList é€‰å®šå…¥åº“çš„
     */
    private void updateProgramFile(String pkgFileName,List<Long> idList) throws IOException {
        InputStream inputStream = this.ossTemplate.statFileStream(pkgFileName);
        byte[] bytes = FileUtil.copyToByteArray(inputStream);
        List<NcNode> nodeList = new ArrayList<>();
        List<NcProgram> progList = new ArrayList<>();
        List<ApproveRecord> recordList = new ArrayList<>();
        try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(bytes);
             ZipFile zipFile = new ZipFile(channel)) {
            ZipArchiveEntry entry;
            Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
            while (entries.hasMoreElements()) {
                entry = entries.nextElement();
                String entryName = entry.getName();
                if (!entry.isDirectory()) {
                    if(entryName.equals(NcProgramExportDNCService.PROGRAM_JSON_FILE)){
                        try (InputStream insJson = zipFile.getInputStream(entry)) {
                            String jsonStr = IoUtil.readToString(insJson);
                            JSONArray jsonArray = JSONArray.parseArray(jsonStr);
                            for(int i=0;i<jsonArray.size();i++){
                                JSONObject jsonObject = jsonArray.getJSONObject(i);
                                NcProgram d = new NcProgram();
                                d.setId(jsonObject.getLong("id"));
                                d.setName(jsonObject.getString("name"));
                                d.setCode(jsonObject.getString("code"));
                                d.setDescription(jsonObject.getString("description"));
                                d.setCategory(jsonObject.getString("category"));
                                d.setBindNcNodeId(jsonObject.getLong("bindNcNodeId"));
                                d.setIsLastEdition(jsonObject.getInteger("isLastEdition"));
                                d.setIsLocked(jsonObject.getInteger("isLocked"));
                                d.setIsTest(jsonObject.getInteger("isTest"));
                                d.setMachineCode(jsonObject.getString("machineCode"));
                                d.setNcNodeId(jsonObject.getLong("ncNodeId"));
                                d.setDrawingNo(jsonObject.getString("drawingNo"));
                                d.setProcessEdition(jsonObject.getString("processEdition"));
                                setBaseProperties(d,jsonObject);
                                progList.add(d);
                            }
                        }
                    }else if(entryName.equals(NcProgramExportDNCService.NODE_JSON_FILE)){
                        try (InputStream insJson = zipFile.getInputStream(entry)) {
                            String jsonStr = IoUtil.readToString(insJson);
                            JSONArray jsonArray = JSONArray.parseArray(jsonStr);
                            for (int i = 0; i < jsonArray.size(); i++) {
                                JSONObject jsonObject = jsonArray.getJSONObject(i);
                                NcNode node = new NcNode();
                                node.setId(jsonObject.getLong("id"));
                                node.setName(jsonObject.getString("name"));
                                node.setDescription(jsonObject.getString("description"));
                                node.setNodeType(jsonObject.getString("nodeType"));
                                node.setProcessName(jsonObject.getString("processName"));
                                node.setDrawingNo(jsonObject.getString("drawingNo"));
                                node.setMachineCode(jsonObject.getString("machineCode"));
                                node.setParentId(jsonObject.getLong("parentId"));
                                node.setParentIds(jsonObject.getString("parentIds"));
                                node.setIsCured(jsonObject.getInteger("isCured"));
                                setBaseProperties(node,jsonObject);
                                nodeList.add(node);
                            }
                        }
                    }else if(entryName.equals(NcProgramExportDNCService.APPROVE_RECORD_JSON_FILE)){
                        try (InputStream insJson = zipFile.getInputStream(entry)) {
                            String jsonStr = IoUtil.readToString(insJson);
                            JSONArray jsonArray = JSONArray.parseArray(jsonStr);
                            for (int i = 0; i < jsonArray.size(); i++) {
                                JSONObject jsonObject = jsonArray.getJSONObject(i);
                                ApproveRecord record = new ApproveRecord();
                                record.setId(jsonObject.getLong("id"));
                                record.setNcProgramId(jsonObject.getLong("ncProgramId"));
                                record.setUserId(jsonObject.getLong("userId"));
                                record.setUserNickname(jsonObject.getString("userNickname"));
                                record.setOperateResult(jsonObject.getString("operateResult"));
                                record.setOperateTime(jsonObject.getDate("operateTime"));
                                setBaseProperties(record,jsonObject);
                                recordList.add(record);
                            }
                        }
                    }
                }
            }
        }
        try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(bytes);
             ZipFile zipFile = new ZipFile(channel)) {
            ZipArchiveEntry entry;
            Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
            while (entries.hasMoreElements()) {
                entry = entries.nextElement();
                String entryName = entry.getName();
                if (!entry.isDirectory() && !entryName.equals(NcProgramExportDNCService.PROGRAM_JSON_FILE)) {
                    for(NcProgram prog:progList){
                        if(prog.getName().equals(entryName)){
                            try (InputStream ncFileStream = zipFile.getInputStream(entry)) {
                                BladeFile bfile = this.ossTemplate.putFile(prog.getName(),ncFileStream);
                                prog.setOssName(bfile.getName());
                                prog.setUrl(bfile.getLink());
                            }
                            break;
                        }
                    }
                }
            }
        }
        for(NcNode node:nodeList){
            NcNode nodeTemp = this.ncNodeService.getById(node.getId());
            if(nodeTemp == null){
                ncNodeService.save(node);
            }else{
                ncNodeService.updateById(node);
            }
        }
        for(NcProgram prog:progList){
            NcProgram ncTemp = ncProgramService.getById(prog.getId());
            if(ncTemp == null){
                ncProgramService.save(prog);
            }else{
                ncProgramService.updateById(prog);
            }
        }
        for(ApproveRecord record:recordList) {
            ApproveRecord recordTemp = this.approveRecordService.getById(record.getId());
            if (recordTemp == null) {
                approveRecordService.save(record);
            } else {
                approveRecordService.updateById(record);
            }
        }
    }
    void setBaseProperties(BizEntity entity,JSONObject jsonObject){
        entity.setCreateTime(jsonObject.getDate("createTime"));
        entity.setUpdateTime(jsonObject.getDate("updateTime"));
        entity.setStatus(jsonObject.getInteger("status"));
        entity.setCreateUser(jsonObject.getLong("createUser"));
        entity.setUpdateUser(jsonObject.getLong("updateUser"));
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java
@@ -3,28 +3,28 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
import org.apache.commons.io.IOUtils;
import org.springblade.core.mp.base.BizEntity;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.FileUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.IoUtil;
import org.springblade.mdm.flow.service.CureFlowService;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.entity.NcProgramExchange;
import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springblade.mdm.utils.CustomBinaryReader;
import org.springblade.mdm.utils.FileExchangeUtil;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@@ -32,6 +32,7 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.*;
@@ -46,6 +47,13 @@
public class NcProgramExchangeService extends BizServiceImpl<NcProgramExchangeMapper, NcProgramExchange> {
    private final CureFlowService cureFlowService;
    private final NcProgramService ncProgramService;
    private final NcNodeService ncNodeService;
    private final OssTemplate ossTemplate;
    private final BladeRedis bladeRedis;
    private String getFileKey(){
        return "dncexpfile-"+ AuthUtil.getUserId();
    }
    /**
     * dnc回传文件上传(解析后保存入upload表)
     * @param file DNC回传文件
@@ -54,13 +62,15 @@
    public List<DncSendBackData> dncSendBackUpload(MultipartFile file) {
        List<DncSendBackData> list;
        try {
            //String fileName = file.getOriginalFilename();
            BladeFile bfile = ossTemplate.putFile(file);//上传,供后续入库使用
            //设置一个缓存,2小时过期
            bladeRedis.setEx(getFileKey(),bfile.getName(), Duration.ofHours(2));
            //InputStream zipFileInputStream = FileExchangeUtil.convertFileToZip(file.getInputStream());
            InputStream zipFileInputStream = file.getInputStream();//test
            byte[] bytes = FileUtil.copyToByteArray(zipFileInputStream);
            list = parseDncZipFromByteArray(bytes);
        } catch (IOException e) {
            log.error("上传dnc回传文件失败",e);
@@ -138,11 +148,6 @@
                        }
                    }
                    System.out.println("文件名: " + entry.getName());
                    System.out.println("大小: " + entry.getSize());
                    // è¯»å–文件内容到字节数组
                    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                }
@@ -164,13 +169,13 @@
     * @param ids id列表逗号分隔
     * @return
     */
    public void dncFileAccept(String ids) {
    public void dncFileAccept(String ids) throws IOException {
        List<Long> idList = Func.toLongList(ids);
        List<NcProgram> progList = ncProgramService.listByIds(idList);
        //
        NcProgramExchange exchange;
        //NcProgram program;
        //NcNode programNode;
        String pkgFileName = bladeRedis.get(getFileKey());
        updateProgramData(pkgFileName,idList);
        List<NcProgram> progList = ncProgramService.listByIds(idList);
        for(NcProgram prog:progList){
            exchange = new NcProgramExchange();
            exchange.setName(prog.getName());
@@ -182,6 +187,143 @@
        }
        cureFlowService.startCure(progList);
    }
    void updateProgramData(String pkgFileName,List<Long> idList) throws IOException {
        InputStream inputStream = this.ossTemplate.statFileStream(pkgFileName);
        byte[] bytes = FileUtil.copyToByteArray(inputStream);
        List<NcNode> nodeList = new ArrayList<>();
        List<NcProgram> progList = new ArrayList<>();
        try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(bytes);
             ZipFile zipFile = new ZipFile(channel)) {
            ZipArchiveEntry entry;
            Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
            while (entries.hasMoreElements()) {
                entry = entries.nextElement();
                String entryName = entry.getName();
                if (entry.isDirectory()) {
                    continue;
                }
                if(entryName.equals(NcProgramExportDNCService.PROGRAM_JSON_FILE)){
                    try (InputStream insJson = zipFile.getInputStream(entry)) {
                        String jsonStr = IoUtil.readToString(insJson);
                        JSONArray jsonArray = JSONArray.parseArray(jsonStr);
                        for(int i=0;i<jsonArray.size();i++){
                            JSONObject jsonObject = jsonArray.getJSONObject(i);
                            NcProgram program = new NcProgram();
                            program.setId(jsonObject.getLong("id"));
                            if(!idList.contains(program.getId())){//不是选定入库的
                                continue;
                            }
                            program.setName(jsonObject.getString("name"));
                            program.setCode(jsonObject.getString("code"));
                            program.setDescription(jsonObject.getString("description"));
                            program.setCategory(jsonObject.getString("category"));
                            program.setBindNcNodeId(jsonObject.getLong("bindNcNodeId"));
                            program.setIsLastEdition(jsonObject.getInteger("isLastEdition"));
                            program.setIsLocked(jsonObject.getInteger("isLocked"));
                            program.setIsTest(jsonObject.getInteger("isTest"));
                            program.setMachineCode(jsonObject.getString("machineCode"));
                            program.setNcNodeId(jsonObject.getLong("ncNodeId"));
                            program.setDrawingNo(jsonObject.getString("drawingNo"));
                            program.setProcessEdition(jsonObject.getString("processEdition"));
                            setBaseProperties(program,jsonObject);
                            progList.add(program);
                        }
                    }
                }else if(entryName.equals(NcProgramExportDNCService.NODE_JSON_FILE)){
                    try (InputStream insJson = zipFile.getInputStream(entry)) {
                        String jsonStr = IoUtil.readToString(insJson);
                        JSONArray jsonArray = JSONArray.parseArray(jsonStr);
                        for (int i = 0; i < jsonArray.size(); i++) {
                            JSONObject jsonObject = jsonArray.getJSONObject(i);
                            NcNode node = new NcNode();
                            node.setId(jsonObject.getLong("id"));
                            node.setName(jsonObject.getString("name"));
                            node.setDescription(jsonObject.getString("description"));
                            node.setNodeType(jsonObject.getString("nodeType"));
                            node.setProcessName(jsonObject.getString("processName"));
                            node.setDrawingNo(jsonObject.getString("drawingNo"));
                            node.setMachineCode(jsonObject.getString("machineCode"));
                            node.setParentId(jsonObject.getLong("parentId"));
                            node.setParentIds(jsonObject.getString("parentIds"));
                            node.setIsCured(jsonObject.getInteger("isCured"));
                            setBaseProperties(node,jsonObject);
                            nodeList.add(node);
                        }
                    }
                }
            }
        }
        //上传压缩包内的程序并更新程序文件地址
        try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(bytes);
             ZipFile zipFile = new ZipFile(channel)) {
            ZipArchiveEntry entry;
            Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
            while (entries.hasMoreElements()) {
                entry = entries.nextElement();
                String entryName = entry.getName();
                if (!entry.isDirectory() && !NcProgramExportDNCService.isDataFile(entryName)) {
                    for(NcProgram prog:progList){
                        if(prog.getName().equals(entryName)){
                            try (InputStream ncFileStream = zipFile.getInputStream(entry)) {
                                BladeFile bfile = this.ossTemplate.putFile(prog.getName(),ncFileStream);
                                prog.setOssName(bfile.getName());
                                prog.setUrl(bfile.getLink());
                            }
                            break;
                        }
                    }
                }
            }
        }
        for(NcNode node:nodeList){
            NcNode nodeTemp = this.ncNodeService.getById(node.getId());
            if(nodeTemp == null){
                ncNodeService.save(node);
            }else{
                ncNodeService.updateById(node);
            }
        }
        for(NcProgram prog:progList){
            NcProgram ncTemp = ncProgramService.getById(prog.getId());
            if(ncTemp == null){
                ncProgramService.save(prog);
            }else{
                ncProgramService.updateById(prog);
            }
        }
    }
    void setBaseProperties(BizEntity entity, JSONObject jsonObject){
        entity.setCreateTime(jsonObject.getDate("createTime"));
        entity.setUpdateTime(jsonObject.getDate("updateTime"));
        entity.setStatus(jsonObject.getInteger("status"));
        entity.setCreateUser(jsonObject.getLong("createUser"));
        entity.setUpdateUser(jsonObject.getLong("updateUser"));
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java
@@ -7,16 +7,12 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.mp.base.BizEntity;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.tool.utils.FileUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.mdm.flow.entity.ApproveRecord;
import org.springblade.mdm.flow.service.ApproveRecordService;
@@ -27,12 +23,10 @@
import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@@ -46,6 +40,7 @@
@Service
@AllArgsConstructor
public class NcProgramExportDNCService extends BizServiceImpl<NcProgramExchangeMapper, NcProgramExchange> {
    private final NcProgramService progService;
    private final NcProgramApprovedService approvedService;
    private final ApproveRecordService approveRecordService;
@@ -53,6 +48,17 @@
    private final OssTemplate ossTemplate;
    public static final String PROGRAM_JSON_FILE = "exp_mdm_nc_program.json";
    public static final String NODE_JSON_FILE = "exp_mdm_nc_node.json";
    public static final String APPROVE_RECORD_JSON_FILE = "exp_mdm_approve_record.json";
    /**
     * æ˜¯å¦åŽ‹ç¼©åŒ…å†…çš„æ•°æ®æ–‡ä»¶
     * @param filename æ–‡ä»¶åç§°
     * @return
     */
    public static boolean isDataFile(String filename){
        return StringUtils.equals(filename, PROGRAM_JSON_FILE) || StringUtils.equals(filename, NODE_JSON_FILE) || StringUtils.equals(filename, APPROVE_RECORD_JSON_FILE);
    }
    /**
     * åˆ†é¡µæŸ¥è¯¢
     * @param query æŸ¥è¯¢å‚æ•°
@@ -92,6 +98,8 @@
            addDataJson(zipOut, programIdList);
        }
        os.close();
    }
@@ -125,7 +133,7 @@
            recObj.put("category",program.getCategory());
            recObj.put("description",program.getDescription());
            recObj.put("name",program.getName());
            recObj.put("partNo",program.getPartNo());
            recObj.put("drawingNo",program.getDrawingNo());
            recObj.put("ncNodeId",program.getNcNodeId());
            recObj.put("bindNcNodeId",program.getBindNcNodeId());
            recObj.put("url",program.getUrl());
@@ -219,7 +227,7 @@
            recObj.put("description",node.getDescription());
            recObj.put("name",node.getName());
            recObj.put("remark",node.getRemark());
            recObj.put("partNo",node.getPartNo());
            recObj.put("drawingNo",node.getDrawingNo());
            recObj.put("parentIds",node.getParentIds());
            recObj.put("processName",node.getProcessName());
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java
@@ -31,7 +31,9 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.flowable.engine.*;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.mp.support.Condition;
@@ -53,6 +55,7 @@
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
@@ -71,20 +74,18 @@
public class NcProgramService  extends BizServiceImpl<NcProgramMapper, NcProgram> {
    private final MachineService machineService;
    private final OssTemplate ossTemplate;
    private final NcNodeService nodeService;
    private final ProgramSeqMapper seqMapper;
    /**
     * æŸ¥è¯¢çŽ°æœ‰å›ºåŒ–çš„ç¨‹åºï¼Œæš‚å®šæ¡ä»¶ï¼šé›¶ç»„ä»¶å·ç›¸åŒï¼Œä¸”æ˜¯åŒä¸€æœºåºŠç»„
     * @param partNo
     * @param drwaingNo
     * @param machineCode
     * @return
     */
    public List<NcProgram> getCuredNcProgram(String partNo,String machineCode) {
    public List<NcProgram> getCuredNcProgram(String drwaingNo,String machineCode) {
        Machine machine = machineService.getByCode(machineCode);
        return this.getBaseMapper().getCuredNcProgram(partNo,machine.getMachineGroupCode());
        return this.getBaseMapper().getCuredNcProgram(drwaingNo,machine.getMachineGroupCode());
    }
@@ -103,7 +104,7 @@
        prog.setName(file.getOriginalFilename());
        prog.setNcNodeId(uploadVO.getNodeId());
        prog.setOssName(bfile.getName());
        prog.setPartNo(uploadVO.getPartNo());
        prog.setDrawingNo(uploadVO.getDrawingNo());
        prog.setProcessEdition(uploadVO.getProcessEdition());
        prog.setIsLastEdition(1);
        boolean isTextFile = false;
@@ -134,7 +135,7 @@
        prog.setName(file.getOriginalFilename());
        prog.setNcNodeId(uploadVO.getNodeId());
        prog.setOssName(bfile.getName());
        prog.setPartNo(uploadVO.getPartNo());
        prog.setDrawingNo(uploadVO.getDrawingNo());
        prog.setProcessEdition(uploadVO.getProcessEdition());
        prog.setIsLastEdition(1);
        prog.setMachineCode(uploadVO.getMachineCode());
@@ -153,7 +154,7 @@
        node.setName(prog.getName());
        node.setMachineCode(uploadVO.getMachineCode());
        node.setParentId(uploadVO.getNodeId());
        node.setPartNo(uploadVO.getPartNo());
        node.setDrawingNo(uploadVO.getDrawingNo());
        node.setProcessName(uploadVO.getProcessName());
        nodeService.save(node);
@@ -266,4 +267,34 @@
    public IPage<NcProgramVO> pageQuery(NcNodeProgramQueryVO query) {
        return this.getBaseMapper().pageQuery(Condition.getPage(query),query);
    }
    /**
     * ä¸‹å‘给你机床
     * @param bindNcNodeId ä¸Žç¨‹åºç»‘定的节点id
     */
    public void sendByBindNodeId(Long bindNcNodeId) throws IOException {
        //NcNode node = this.nodeService.getById(bindNodeId);
        LambdaQueryWrapper<NcProgram> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(NcProgram::getBindNcNodeId, bindNcNodeId);
        wrapper.eq(NcProgram::getIsLastEdition,1);
        NcProgram prog = this.getOne(wrapper);
        String filePath = prog.getName();
        try(InputStream ins = ossTemplate.statFileStream(prog.getOssName());){
            File targetFile = new File(filePath);
            FileUtils.copyInputStreamToFile(ins, targetFile);
        }
    }
    String getFilePath(NcProgram prog){
        Machine machine = machineService.getByCode(prog.getMachineCode());
        String dirPath = machine.getProgSendDir();
        dirPath = StringUtils.removeEnd(StringUtils.removeEnd(dirPath,"/"),"\\");
        File dirs = new File(dirPath);
        if(!dirs.exists()){
            dirs.mkdirs();
        }
        return dirPath+File.separator+prog.getName();
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProcessProgRefService.java
@@ -37,6 +37,8 @@
import org.springblade.core.oss.model.BladeFile;
import org.springblade.mdm.basesetting.machine.MachineService;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.flow.excution.StartDispatcher;
import org.springblade.mdm.flow.service.FlowCommonService;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.entity.ProcessProgRef;
@@ -69,7 +71,7 @@
@Service
@AllArgsConstructor
public class ProcessProgRefService extends BizServiceImpl<ProcessProgRefMapper, ProcessProgRef> {
    private final FlowCommonService flowCommonService;
    /**
     * æŸ¥è¯¢çŽ°æœ‰å›ºåŒ–çš„ç¨‹åºï¼Œæš‚å®šæ¡ä»¶ï¼šé›¶ç»„ä»¶å·ç›¸åŒï¼Œä¸”æ˜¯åŒä¸€æœºåºŠç»„
     * @param processInstanceId æµç¨‹å®žä¾‹id
@@ -82,13 +84,14 @@
            return;
        }
        String processDefinationKey = flowCommonService.getDefinitionKey(processInstanceId);
        this.lambdaUpdate().eq(ProcessProgRef::getProcessInstanceId, processInstanceId).remove();
        List<ProcessProgRef> entities = new ArrayList<>();
        for (Long programId : programIds) {
            ProcessProgRef entity = new ProcessProgRef();
            entity.setProcessInstanceId(processInstanceId);
            entity.setNcProgramId(programId);
            entity.setProcessDefinitionKey(processDefinationKey);
            entities.add(entity);
        }
        this.saveBatch(entities);
@@ -109,7 +112,8 @@
     */
    public ProcessProgRef lastDispatchDataByNcProgramId(Long ncProgramId) {
        LambdaQueryWrapper<ProcessProgRef> query = Wrappers.lambdaQuery();
        query.eq(ProcessProgRef::getNcProgramId, ncProgramId).orderByDesc(ProcessProgRef::getCreateTime).last("LIMIT 10");;
        query.eq(ProcessProgRef::getNcProgramId, ncProgramId).eq(ProcessProgRef::getProcessDefinitionKey, StartDispatcher.PROCESS_KEY).orderByDesc(ProcessProgRef::getCreateTime).last("LIMIT 1");;
        List<ProcessProgRef> list = this.list(query);
        return list.isEmpty() ? null : list.get(0);
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/MdmProgramImportVO.java
@@ -4,9 +4,6 @@
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
import java.util.List;
/**
 * åœ¨å·¥æŽ§ç½‘导入MDM程序
 */
@@ -48,7 +45,7 @@
    private String machineCode;
    @Schema(description = "图号")
    private String partNo;
    private String drawingNo;
    /**
     * æè¿°
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeProgramVO.java
@@ -34,5 +34,5 @@
    private String craftEdition;
    @Schema(description = "零组件号/图号")
    private String partNo;
    private String drawingNo;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcNodeVO.java
@@ -22,4 +22,6 @@
    private String description;
    @Schema(description = "备注")
    private String remark;
    @Schema(description = "创建用户名称")
    private String createUserName;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcProgramExportDncPageVO.java
@@ -14,9 +14,9 @@
    @Schema(description = "程序名称")
    private String name;
    @Schema(description = "图号")
    private String partNo;
    private String drawingNo;
    @Schema(description = "图号版次")
    private String partNoEdition;
    private String drawingNoEdition;
    @Schema(description = "工序名称")
    private String processName;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcProgramUploadVO.java
@@ -21,7 +21,7 @@
    private MultipartFile file;
    @Schema(description = "零组件号/图号")
    private String partNo;
    private String drawingNo;
    @Schema(description = "工序,如“精铣”")
    private String processName;
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/NcProgramVO.java
@@ -28,9 +28,9 @@
    private String craftEdition;
    @Schema(description = "零组件号/图号")
    private String partNo;
    private String drawingNo;
    @Schema(description = "零组件号/图号版次")
    private String partNoEdition;
    private String drawingNoEdition;
    @Schema(description = "是否测试程序.1是;0否")
    private Integer isTest;
blade-service/blade-mdm/src/main/resources/processesbpmn/program-cure.bpmn20.xml
@@ -11,18 +11,18 @@
      <conditionExpression>${approve=='Y'}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-504610fe-2b87-4df4-8f42-f10c8bf3ce01" sourceRef="seniorApproveTask" targetRef="cureOKOperateTask">
      <conditionExpression>${approve=='Y'</conditionExpression>
      <conditionExpression>${approve=='Y'}</conditionExpression>
    </sequenceFlow>
    <userTask id="cureCheckTask" name="固化校对" flowable:assignee="${assignee}"/>
    <sequenceFlow id="sid-b4ad2b36-5fcc-4449-924b-55b0425b1278" sourceRef="cureCheckTask" targetRef="cureProgramTask">
      <conditionExpression>${approve=='N'</conditionExpression>
      <conditionExpression>${approve=='N'}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-f626de1f-b668-49b8-bd06-6e8039abf2fc" sourceRef="cureCheckTask" targetRef="seniorApproveTask">
      <conditionExpression>${approve=='Y'</conditionExpression>
      <conditionExpression>${approve=='Y'}</conditionExpression>
    </sequenceFlow>
    <endEvent id="cureProgramingNoEnd" name="固化编制结束"/>
    <sequenceFlow id="sid-a3a0654d-e9fd-4814-a1bd-384dce8a3b7a" sourceRef="cureProgramTask" targetRef="cureProgramingNoEnd">
      <conditionExpression>${approve=='N'</conditionExpression>
      <conditionExpression>${approve=='N'}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-c04cc547-0baf-4514-8056-54b1612cdefd" sourceRef="seniorApproveTask" targetRef="cureCheckTask">
      <conditionExpression>${approve=='N'}</conditionExpression>