yangys
2025-06-17 b0449f9ed437831018030d57b98a55e1dd43a6ef
修改计划表表名
已重命名1个文件
已修改8个文件
已添加3个文件
540 ■■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/mapper/ProduceDivisionMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/MyFlowController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java 178 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/CureProgramCheckTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/FlowVO.java 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/OvertimeTaskExcelVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/sql/mdm/mdm.mysql.all.create.sql 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/basesetting/producedivision/mapper/ProduceDivisionMapper.xml
@@ -15,10 +15,11 @@
    </resultMap>-->
    <select id="pageQuery" resultType="org.springblade.mdm.basesetting.producedivision.vo.ProduceDivisionViewVO">
        select p.id,p.team_leader_id,p.programmer_id,p.checker_id,p.senior_id,l.name team_leader_name,pro.name  programmer_name,c.name checker_name,s.name seniorName
        from mdm_produce_plan p join blade_user l on p.team_leader_id=l.id and l.is_deleted=0
        from mdm_produce_division p join blade_user l on p.team_leader_id=l.id and l.is_deleted=0
                                join blade_user pro on p.programmer_id=pro.id and pro.is_deleted=0
                                join blade_user c on p.checker_id=c.id and c.is_deleted=0
                                join blade_user s on p.senior_id=s.id and c.is_deleted=0
                                                         where p.is_deleted=0
        <if test="name != null and name != ''">
            AND (l.account like concat('%',#{name,jdbcType=VARCHAR},'%') or l.name like
            concat('%',#{name,jdbcType=VARCHAR},'%')
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
@@ -51,8 +51,14 @@
        if (Func.isEmpty(variables)) {
            variables = Kv.create();
        }
        // å®Œæˆä»»åŠ¡
        taskService.complete(taskId, variables);
        return R.success("流程提交成功");
        if(variables.containsKey("assignee")){
            //指定了下一步执行人
            taskService.complete(taskId, variables);
            return R.success("流程提交成功");
        }else {
            // å®Œæˆä»»åŠ¡,给默认用户
            return R.fail("请指定流程下一步处理人");
        }
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java
@@ -5,24 +5,27 @@
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.TaskService;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.flow.core.pojo.entity.BladeFlow;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.mdm.basesetting.machine.vo.MachineExcelVO;
import org.springblade.mdm.flow.service.FlowBusinessService;
import org.springblade.mdm.flow.vo.FlowVO;
import org.springblade.mdm.flow.vo.OvertimeTaskExcelVO;
import org.springblade.mdm.flow.vo.TaskTraceVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@@ -34,16 +37,34 @@
    @Autowired
    private FlowBusinessService businessService;
    /**
     * å¾…办任务列表页
     */
    @GetMapping("overtime-list")
    @ApiOperationSupport(order = 3)
    @Operation(summary = "超时查询", description = "查询所有超时任务")
    public R<IPage<BladeFlow>> overtimeList(@Parameter(description = "任务到达时间开始") LocalDate createTimeBegin, @Parameter(description = "任务到达时间截止")LocalDate createTimeEnd, @Parameter(description = "执行人员") String assigneeName, @Parameter(description = "关键字") String keyword, Query query) {
        IPage<BladeFlow> pages = businessService.selectOvertimePage(Condition.getPage(query), createTimeBegin,createTimeEnd,assigneeName,keyword);
    public R<IPage<FlowVO>> overtimeList(@Parameter(description = "任务到达时间开始") LocalDate createTimeBegin, @Parameter(description = "任务到达时间截止")LocalDate createTimeEnd, @Parameter(description = "执行人员") String assigneeName, @Parameter(description = "关键字") String keyword, Query query) {
        IPage<FlowVO> pages = businessService.selectOvertimePage(Condition.getPage(query), createTimeBegin,createTimeEnd,assigneeName,keyword);
        return R.data(pages);
    }
    @GetMapping("overtime-export")
    @ApiOperationSupport(order = 3)
    @Operation(summary = "超时导出", description = "超时任务导出")
    public void overtimeExport(@Parameter(description = "任务到达时间开始") LocalDate createTimeBegin, @Parameter(description = "任务到达时间截止")LocalDate createTimeEnd, @Parameter(description = "执行人员") String assigneeName, @Parameter(description = "关键字") String keyword, Query query, HttpServletResponse response) {
        query.setCurrent(1);
        query.setSize(Integer.MAX_VALUE);
        IPage<FlowVO> pages = businessService.selectOvertimePage(Condition.getPage(query), createTimeBegin,createTimeEnd,assigneeName,keyword);
        List<OvertimeTaskExcelVO> list = new ArrayList<>();
        pages.getRecords().forEach(data ->{
            //data.get
            OvertimeTaskExcelVO excelVO = new OvertimeTaskExcelVO();
            BeanUtils.copyProperties(data, excelVO);
            list.add(excelVO);
        });
        ExcelUtil.export(response, "超时任务" + DateUtil.time(), "超时任务表", list, OvertimeTaskExcelVO.class);
    }
    @GetMapping("process-trace")
    public R<List<TaskTraceVO>> processTrace(long processInstanceId){
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/MyFlowController.java
@@ -13,10 +13,8 @@
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.flow.core.pojo.entity.BladeFlow;
import org.springblade.mdm.flow.excution.StartDispatcher;
import org.springblade.mdm.flow.service.FlowBusinessService;
import org.springblade.mdm.flow.vo.TaskAssignVO;
import org.springblade.mdm.flow.vo.FlowVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -39,8 +37,8 @@
    @GetMapping("todo-list")
    @ApiOperationSupport(order = 3)
    @Operation(summary = "待办任务", description = "传入流程信息")
    public R<IPage<BladeFlow>> todoList(@Parameter(description = "关键字") String keyword, @Parameter(description = "创建时间开始") LocalDate createTimeBegin, @Parameter(description = "创建时间截止") LocalDate createTimeEnd, Query query) {
        IPage<BladeFlow> pages = businessService.selectTodoPage(Condition.getPage(query), createTimeBegin,createTimeEnd,keyword);
    public R<IPage<FlowVO>> todoList(@Parameter(description = "关键字") String keyword, @Parameter(description = "创建时间开始") LocalDate createTimeBegin, @Parameter(description = "创建时间截止") LocalDate createTimeEnd, Query query) {
        IPage<FlowVO> pages = businessService.selectTodoPage(Condition.getPage(query), createTimeBegin,createTimeEnd,keyword);
        return R.data(pages);
    }
@@ -50,8 +48,8 @@
    @GetMapping("alltask-list")
    @ApiOperationSupport(order = 3)
    @Operation(summary = "所有任务(fortest)", description = "传入流程信息")
    public R<IPage<BladeFlow>> alltaskList(@Parameter(description = "关键字") String keyword,LocalDate createTimeBegin,LocalDate createTimeEnd, Query query) {
        IPage<BladeFlow> pages = businessService.selectAllTaskPage(Condition.getPage(query), keyword);
    public R<IPage<FlowVO>> alltaskList(@Parameter(description = "关键字") String keyword, LocalDate createTimeBegin, LocalDate createTimeEnd, Query query) {
        IPage<FlowVO> pages = businessService.selectAllTaskPage(Condition.getPage(query), keyword);
        return R.data(pages);
    }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java
@@ -1,28 +1,4 @@
/**
 * BladeX Commercial License Agreement
 * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
 * <p>
 * Use of this software is governed by the Commercial License Agreement
 * obtained after purchasing a license from BladeX.
 * <p>
 * 1. This software is for development use only under a valid license
 * from BladeX.
 * <p>
 * 2. Redistribution of this software's source code to any third party
 * without a commercial license is strictly prohibited.
 * <p>
 * 3. Licensees may copyright their own code but cannot use segments
 * from this software for such purposes. Copyright of this software
 * remains with BladeX.
 * <p>
 * Using this software signifies agreement to this License, and the software
 * must not be used for illegal purposes.
 * <p>
 * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
 * not liable for any claims arising from secondary or illegal development.
 * <p>
 * Author: Chill Zhuang (bladejava@qq.com)
 */
package org.springblade.mdm.flow.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -30,27 +6,20 @@
import org.flowable.engine.HistoryService;
import org.flowable.engine.TaskService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.history.HistoricProcessInstanceQuery;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskQuery;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.*;
import org.springblade.flow.core.constant.ProcessConstant;
import org.springblade.flow.core.pojo.entity.BladeFlow;
import org.springblade.flow.core.utils.TaskUtil;
import org.springblade.mdm.flow.entity.MdmFlowProcess;
import org.springblade.mdm.flow.util.MdmFlowCache;
import org.springblade.mdm.flow.vo.FlowVO;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
 * æµç¨‹ä¸šåŠ¡å®žçŽ°ç±»
@@ -65,49 +34,29 @@
    private final HistoryService historyService;
    public IPage<BladeFlow> selectTodoPage(IPage<BladeFlow> page, LocalDate createTimeBegin,LocalDate createTimeEnd, String keyword) {
    public IPage<FlowVO> selectTodoPage(IPage<FlowVO> page, LocalDate createTimeBegin, LocalDate createTimeEnd, String keyword) {
        //String taskUser = TaskUtil.getTaskUser();
        String userId = ""+AuthUtil.getUserId();
        List<BladeFlow> flowList = new LinkedList<>();
        String userId = "" + AuthUtil.getUserId();
        List<FlowVO> flowList = new LinkedList<>();
        TaskQuery todoQuery = taskService.createTaskQuery().taskAssignee(userId).active().includeProcessVariables();
        if(Func.isNotEmpty(createTimeBegin)){
        if (Func.isNotEmpty(createTimeBegin)) {
            todoQuery.taskCreatedAfter(DateUtil.toDate(createTimeBegin));
            //如果查询实例的开始时间:todoQuery.taskInProgressStartDueAfter()
        }
        if(Func.isNotEmpty(createTimeEnd)){
        if (Func.isNotEmpty(createTimeEnd)) {
            todoQuery.taskCreatedBefore(DateUtil.toDate(createTimeEnd));
        }
        if(Func.isNotEmpty(keyword)){
            todoQuery.or();
            todoQuery.processVariableValueLike("processNo",keyword);
            todoQuery.processVariableValueLike("machineCode",keyword);
            todoQuery.processVariableValueLike("machineMode",keyword);
            todoQuery.processVariableValueLike("processName",keyword);
            todoQuery.processVariableValueLike("processEdition",keyword);
            todoQuery.processVariableValueLike("craftEdition",keyword);
            //TODO å¤šä¸ªå­—段都要匹配
            todoQuery.endOr();
        if (Func.isNotEmpty(keyword)) {
            addKeywordCondition(todoQuery, keyword);
        }
        todoQuery.orderByTaskCreateTime().desc();
        //List<Task> listt = todoQuery.list();
        // å·²ç­¾æ”¶çš„任务.caseVariableValueLike("processNo",keyword)
        /*
        TaskQuery todoQuery = taskService.createTaskQuery().taskAssignee(userId).active()
            .includeProcessVariables().orderByTaskCreateTime().desc();
         */
        // æž„建列表数据
        BladeFlow bladeFlow = new BladeFlow();
        buildFlowTaskList(bladeFlow, flowList, todoQuery, "todo");//FlowEngineConstant.STATUS_TODO
        FlowVO bladeFlow = new FlowVO();
        buildFlowTaskList(bladeFlow, flowList, todoQuery);//FlowEngineConstant.STATUS_TODO , "todo"
        // è®¡ç®—总数
        long count = todoQuery.count();
@@ -118,6 +67,21 @@
        // è®¾ç½®æ•°æ®
        page.setRecords(flowList);
        return page;
    }
    void addKeywordCondition(TaskQuery todoQuery,String keyword) {
        if(Func.isNotEmpty(keyword)) {
            todoQuery.or();
            todoQuery.processVariableValueLike("processNo", "%" + keyword + "%");
            todoQuery.processVariableValueLike("machineCode", "%" + keyword + "%");
            todoQuery.processVariableValueLike("machineMode", "%" + keyword + "%");
            todoQuery.processVariableValueLike("processName", "%" + keyword + "%");
            todoQuery.processVariableValueLike("processEdition", "%" + keyword + "%");
            todoQuery.processVariableValueLike("craftEdition", "%" + keyword + "%");
            todoQuery.endOr();
        }
    }
    /*
    @Override
@@ -258,25 +222,6 @@
        return page;
    }
    @Override
    public boolean completeTask(BladeFlow flow) {
        String taskId = flow.getTaskId();
        String processInstanceId = flow.getProcessInstanceId();
        String comment = Func.toStr(flow.getComment(), ProcessConstant.PASS_COMMENT);
        // å¢žåŠ è¯„è®º
        if (StringUtil.isNoneBlank(processInstanceId, comment)) {
            taskService.addComment(taskId, processInstanceId, comment);
        }
        // åˆ›å»ºå˜é‡
        Map<String, Object> variables = flow.getVariables();
        if (variables == null) {
            variables = Kv.create();
        }
        variables.put(ProcessConstant.PASS_KEY, flow.isPass());
        // å®Œæˆä»»åŠ¡
        taskService.complete(taskId, variables);
        return true;
    }
    */
    /**
     * æž„建流程
@@ -284,9 +229,8 @@
     * @param bladeFlow æµç¨‹é€šç”¨ç±»
     * @param flowList  æµç¨‹åˆ—表
     * @param taskQuery ä»»åŠ¡æŸ¥è¯¢ç±»
     * @param status    çŠ¶æ€
     */
    private void buildFlowTaskList(BladeFlow bladeFlow, List<BladeFlow> flowList, TaskQuery taskQuery, String status) {
    private void buildFlowTaskList(FlowVO bladeFlow, List<FlowVO> flowList, TaskQuery taskQuery) {
        if (bladeFlow.getCategory() != null) {
            taskQuery.processCategoryIn(Func.toStrList(bladeFlow.getCategory()));
        }
@@ -301,7 +245,7 @@
        }
        List<Task> tasks = taskQuery.list();
        tasks.forEach(task -> {
            BladeFlow flow = new BladeFlow();
            FlowVO flow = new FlowVO();
            flow.setTaskId(task.getId());
            flow.setTaskDefinitionKey(task.getTaskDefinitionKey());
            flow.setTaskName(task.getName());
@@ -310,20 +254,15 @@
            flow.setClaimTime(task.getClaimTime());
            flow.setExecutionId(task.getExecutionId());
            flow.setVariables(task.getProcessVariables());
            flow.setDueDate(task.getDueDate());
            flow.setProcessDefinitionId(task.getProcessDefinitionId());
            //flow.setProcessDefinitionName(task.getprocessd);
            //flow.setProcessDefinitionKey(processDefinition.getKey());
            //flow.setProcessDefinitionVersion(processDefinition.getVersion());
            flow.setProcessInstanceId(task.getProcessInstanceId());
            /*
            HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(task.getProcessInstanceId());
            if (Func.isNotEmpty(historicProcessInstance)) {
                String[] businessKey = Func.toStrArray(StringPool.COLON, historicProcessInstance.getBusinessKey());
                flow.setBusinessTable(businessKey[0]);
                flow.setBusinessId(businessKey[1]);
            }*/
            MdmFlowProcess processDefinition = MdmFlowCache.getProcessDefinition(task.getProcessDefinitionId());
@@ -335,8 +274,7 @@
            flow.setProcessDefinitionVersion(processDefinition.getVersion());
            flow.setProcessInstanceId(task.getProcessInstanceId());
            //flow.setStatus(status);
            /*
             */
            flowList.add(flow);
        });
    }
@@ -351,33 +289,20 @@
        return historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
    }
    public IPage<BladeFlow> selectAllTaskPage(IPage<BladeFlow> page, String keyword) {
    public IPage<FlowVO> selectAllTaskPage(IPage<FlowVO> page, String keyword) {
        List<BladeFlow> flowList = new LinkedList<>();
        List<FlowVO> flowList = new LinkedList<>();
        TaskQuery todoQuery = taskService.createTaskQuery().active().includeProcessVariables();
        if(Func.isNotEmpty(keyword)){
            todoQuery.or();
            todoQuery.processVariableValueLike("processNo",keyword);
            todoQuery.processVariableValueLike("machineCode",keyword);
            todoQuery.processVariableValueLike("machineMode",keyword);
            todoQuery.processVariableValueLike("processName",keyword);
            todoQuery.processVariableValueLike("processEdition",keyword);
            todoQuery.processVariableValueLike("craftEdition",keyword);
            //TODO å¤šä¸ªå­—段都要匹配
            todoQuery.endOr();
        }
        addKeywordCondition(todoQuery, keyword);
        todoQuery.orderByTaskCreateTime().desc();
        // æž„建列表数据
        BladeFlow bladeFlow = new BladeFlow();
        buildFlowTaskList(bladeFlow, flowList, todoQuery, "todo");//FlowEngineConstant.STATUS_TODO
        FlowVO bladeFlow = new FlowVO();
        buildFlowTaskList(bladeFlow, flowList, todoQuery);//FlowEngineConstant.STATUS_TODO
        // è®¡ç®—总数
        long count = todoQuery.count();
@@ -392,13 +317,13 @@
    /**
     * è¶…时任务查询
     * @param page
     * @param keyword
     * @return
     * @param page åˆ†é¡µä¿¡æ¯
     * @param keyword å…³é”®å­—
     * @return åˆ†é¡µæ•°æ®
     */
    public IPage<BladeFlow> selectOvertimePage(IPage<BladeFlow> page,LocalDate createTimeBegin,LocalDate createTimeEnd, String assigneeName,String keyword) {
    public IPage<FlowVO> selectOvertimePage(IPage<FlowVO> page, LocalDate createTimeBegin, LocalDate createTimeEnd, String assigneeName, String keyword) {
        List<BladeFlow> flowList = new LinkedList<>();
        List<FlowVO> flowList = new LinkedList<>();
        Date now = new Date();
        TaskQuery todoQuery = taskService.createTaskQuery().taskDueBefore(now).active().includeProcessVariables();
        if(Func.isNotEmpty(createTimeBegin)) {
@@ -411,27 +336,14 @@
        if(Func.isNotEmpty(keyword)) {
            todoQuery.taskVariableValueLike("assigneeName", "%"+assigneeName+"%");
        }
        if(Func.isNotEmpty(keyword)){
            todoQuery.or();
            keyword = "%"+keyword+"%";
            todoQuery.processVariableValueLike("processNo",keyword);
            todoQuery.processVariableValueLike("machineCode",keyword);
            todoQuery.processVariableValueLike("machineMode",keyword);
            todoQuery.processVariableValueLike("processName",keyword);
            todoQuery.processVariableValueLike("processEdition",keyword);
            todoQuery.processVariableValueLike("craftEdition",keyword);
            //TODO å¤šä¸ªå­—段都要匹配
            todoQuery.endOr();
        }
        addKeywordCondition(todoQuery, keyword);
        todoQuery.orderByTaskCreateTime().desc();
        // æž„建列表数据
        BladeFlow bladeFlow = new BladeFlow();
        buildFlowTaskList(bladeFlow, flowList, todoQuery, "todo");//FlowEngineConstant.STATUS_TODO
        FlowVO bladeFlow = new FlowVO();
        buildFlowTaskList(bladeFlow, flowList, todoQuery);//FlowEngineConstant.STATUS_TODO
        // è®¡ç®—总数
        long count = todoQuery.count();
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/task/dispatch/CureProgramCheckTask.java
@@ -14,6 +14,6 @@
        String hasCuredProgram =  (String)execution.getVariable("hasCuredProgram");
        NcProgram ncProgram =  (NcProgram)execution.getVariable("curedNcProgram");
        System.out.println("执行服务任务");
        System.out.println("执行固化程序任务服务");
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/FlowVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,195 @@
/**
 * BladeX Commercial License Agreement
 * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
 * <p>
 * Use of this software is governed by the Commercial License Agreement
 * obtained after purchasing a license from BladeX.
 * <p>
 * 1. This software is for development use only under a valid license
 * from BladeX.
 * <p>
 * 2. Redistribution of this software's source code to any third party
 * without a commercial license is strictly prohibited.
 * <p>
 * 3. Licensees may copyright their own code but cannot use segments
 * from this software for such purposes. Copyright of this software
 * remains with BladeX.
 * <p>
 * Using this software signifies agreement to this License, and the software
 * must not be used for illegal purposes.
 * <p>
 * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
 * not liable for any claims arising from secondary or illegal development.
 * <p>
 * Author: Chill Zhuang (bladejava@qq.com)
 */
package org.springblade.mdm.flow.vo;
import lombok.Data;
import org.springblade.flow.core.constant.ProcessConstant;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;
/**
 * mdm工作流通用实体类
 *
 * @author yangys
 */
@Data
public class FlowVO implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     * ä»»åŠ¡ç¼–å·
     */
    private String taskId;
    /**
     * ä»»åŠ¡åç§°
     */
    private String taskName;
    /**
     * ä»»åŠ¡å®šä¹‰Key
     */
    private String taskDefinitionKey;
    /**
     * ä»»åŠ¡æ‰§è¡Œäººç¼–å·
     */
    private String assignee;
    /**
     * ä»»åŠ¡æ‰§è¡Œäººåç§°
     */
    private String assigneeName;
    /**
     * æµç¨‹åˆ†ç±»
     */
    private String category;
    /**
     * æµç¨‹åˆ†ç±»å
     */
    private String categoryName;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private Date createTime;
    /**
     * ç»“束时间
     */
    private Date endTime;
    /**
     * ç­¾æ”¶æ—¶é—´
     */
    private Date claimTime;
    /**
     * åŽ†å²ä»»åŠ¡ç»“æŸæ—¶é—´
     */
    private Date historyTaskEndTime;
    /**
     * æ‰§è¡ŒID
     */
    private String executionId;
    /**
     * æµç¨‹å®žä¾‹ID
     */
    private String processInstanceId;
    /**
     * æµç¨‹ID
     */
    private String processDefinitionId;
    /**
     * æµç¨‹æ ‡è¯†
     */
    private String processDefinitionKey;
    /**
     * æµç¨‹å
     */
    private String processDefinitionName;
    /**
     * æµç¨‹ç‰ˆæœ¬
     */
    private int processDefinitionVersion;
    /**
     * æµç¨‹è¯´æ˜Ž
     */
    private String processDefinitionDesc;
    /**
     * æµç¨‹ç®€å›¾å
     */
    private String processDefinitionDiagramResName;
    /**
     * æµç¨‹é‡å‘½å
     */
    private String processDefinitionResName;
    /**
     * åŽ†å²ä»»åŠ¡æµç¨‹å®žä¾‹ID æŸ¥çœ‹æµç¨‹å›¾ä¼šç”¨åˆ°
     */
    private String historyProcessInstanceId;
    /**
     * æµç¨‹å®žä¾‹æ˜¯å¦ç»“束
     */
    private String processIsFinished;
    /**
     * åŽ†å²æ´»åŠ¨ID
     */
    private String historyActivityId;
    /**
     * åŽ†å²æ´»åŠ¨æµç¨‹
     */
    private String historyActivityName;
    /**
     * åŽ†å²æ´»åŠ¨è€—æ—¶
     */
    private String historyActivityDurationTime;
    /**
     * ä¸šåŠ¡ç»‘å®šTable
     */
    private String businessTable;
    /**
     * ä¸šåŠ¡ç»‘å®šID
     */
    private String businessId;
    /**
     * ä»»åŠ¡çŠ¶æ€
     */
    private String status;
    /**
     * ä»»åŠ¡æ„è§
     */
    private String comment;
    /**
     * æ˜¯å¦é€šè¿‡
     */
    private boolean isPass;
    /**
     * æ˜¯å¦é€šè¿‡ä»£å·
     */
    private String flag;
    /**
     * å¼€å§‹æŸ¥è¯¢æ—¥æœŸ
     */
    private Date beginDate;
    /**
     * ç»“束查询日期
     */
    private Date endDate;
    /**
     * æµç¨‹å‚æ•°
     */
    private Map<String, Object> variables;
    /**
     * è¦æ±‚完成的时间(超时时间)
     */
    private Date dueDate;
    /**
     * èŽ·å–æ˜¯å¦é€šè¿‡
     */
    public boolean isPass() {
        return ProcessConstant.PASS_ALIAS.equals(flag) || ProcessConstant.PASS_COMMENT.equals(comment);
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/OvertimeTaskExcelVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package org.springblade.mdm.flow.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Date;
@Data
@ColumnWidth(25)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class OvertimeTaskExcelVO {
    @ExcelProperty("执行人员")
    private String assigneeName;
    @ExcelProperty("任务名称")
    private String processDefinitionName;
    @ExcelProperty("任务节点")
    private String taskName;
    @ExcelProperty("任务到达时间")
    private LocalDateTime time;
    @ExcelProperty("要求完成时间")
    private Date dueDate;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package org.springblade.mdm.program.controller;
import io.swagger.v3.oas.annotations.Operation;
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.NcProgramService;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
/**
 * ç¨‹åºèŠ‚ç‚¹
 *
 * @author yangys
 */
@NonDS
@RestController
@RequestMapping("/program/ncfile")
@AllArgsConstructor
@Tag(name = "数控程序", description = "数控程序")
@Slf4j
public class NcProgramController {
    private final NcProgramService ncProgramService;
    @PostMapping("/upload")
    @Operation(summary = "上传", description = "上传程序/附件文件")
    public R<Boolean> upload(@RequestParam MultipartFile file,Long nodeId,
                             @RequestParam String category) {
        ncProgramService.uploadNcFile(file,nodeId,category);
        return R.<Boolean>status(true);
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramService.java
@@ -36,6 +36,8 @@
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
@@ -69,4 +71,7 @@
        return this.getBaseMapper().getCuredNcProgram(partNo,machine.getMachineGroupCode());
    }
    public void uploadNcFile(MultipartFile file,Long nodeId, String category) {
    }
}
blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml
@@ -4,9 +4,9 @@
    <startEvent id="start" name="开始"/>
    <sequenceFlow id="sid-c1619263-d1ff-4106-9315-f9ab9a3bee71" sourceRef="start" targetRef="teamLeaderTask"/>
    <userTask id="teamLeaderTask" name="专业组长" flowable:assignee="${teamLeader}"/>
    <userTask id="programmingTask" name="编制" flowable:assignee="${programmer}"/>
    <userTask id="check" name="校对" flowable:assignee="${checker}"/>
    <userTask id="approveTask" name="高师审批" flowable:assignee="${senior}"/>
    <userTask id="programmingTask" name="编制" flowable:assignee="${assignee}"/>
    <userTask id="check" name="校对" flowable:assignee="${assignee}"/>
    <userTask id="approveTask" name="高师审批" flowable:assignee="${assignee}"/>
    <endEvent id="approveEnd" name="审批完成"/>
    <sequenceFlow id="programingToCheck" sourceRef="programmingTask" targetRef="check" name="编制完成给校对">
      <conditionExpression xsi:type="tFormalExpression">${approve=='Y'}</conditionExpression>
@@ -24,30 +24,30 @@
      <conditionExpression xsi:type="tFormalExpression">${approve=='Y'}</conditionExpression>
    </sequenceFlow>
    <serviceTask id="cureCheckServiceTask" flowable:exclusive="true" name="固化程序检查服务任务" flowable:expression="cureProgramCheckTask.execute(execution)"/>
    <userTask id="sid-015ac835-1083-489a-9496-97dbb9432d09" name="检查程序是否可用"/>
    <userTask id="sid-015ac835-1083-489a-9496-97dbb9432d09" name="检查程序是否可用" flowable:assignee="${assignee}"/>
    <sequenceFlow id="sid-46ccac64-2d48-4933-88a6-f2941ae131dd" sourceRef="teamLeaderTask" targetRef="programmingTask">
      <conditionExpression xsi:type="tFormalExpression">hasCuredProgram==‘N'</conditionExpression>
      <conditionExpression xsi:type="tFormalExpression">${approve=='Y' &amp;&amp; hasCuredProgram=='N'}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-af92e6ab-bc80-43ed-8b09-1d3ec54cc9e7" sourceRef="teamLeaderTask" targetRef="cureCheckServiceTask">
      <conditionExpression xsi:type="tFormalExpression">hasCuredProgram==‘Y'</conditionExpression>
      <conditionExpression xsi:type="tFormalExpression">${approve=='Y' &amp;&amp; hasCuredProgram=='Y'}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-353381d5-35c7-47b0-bf5b-2bafe865ab5e" sourceRef="cureCheckServiceTask" targetRef="sid-015ac835-1083-489a-9496-97dbb9432d09"/>
    <sequenceFlow id="sid-d144dad0-dc94-4a2b-96d6-9d8451b05ec1" sourceRef="sid-015ac835-1083-489a-9496-97dbb9432d09" targetRef="sid-82237034-5cb2-45c7-9a74-e2d5abb3b398" name="固化程序可用">
      <conditionExpression>approve=='Y'</conditionExpression>
      <conditionExpression>${approve=='Y'}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-d4133565-1a45-4bb6-b603-9b9e4db1cdbb" sourceRef="approveTask" targetRef="check">
      <conditionExpression>{approve=='N'}</conditionExpression>
      <conditionExpression>${approve=='N'}</conditionExpression>
    </sequenceFlow>
    <exclusiveGateway id="sid-82237034-5cb2-45c7-9a74-e2d5abb3b398" name="可用程序流转网关"/>
    <sequenceFlow id="sid-b15dcf6a-a48c-4e01-b6bc-5c2a74ca817e" sourceRef="sid-82237034-5cb2-45c7-9a74-e2d5abb3b398" targetRef="check" name="工序版次一致并且可用">
      <conditionExpression xsi:type="tFormalExpression">processEditionEqual=='Y'</conditionExpression>
      <conditionExpression xsi:type="tFormalExpression">${processEditionEqual=='Y'}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-6249886b-7c4a-4904-9b0b-cf743932be9f" sourceRef="sid-82237034-5cb2-45c7-9a74-e2d5abb3b398" targetRef="emptyUpgradeProcessEdtionServiceTask">
      <conditionExpression xsi:type="tFormalExpression">processEditionEqual=='N'</conditionExpression>
      <conditionExpression xsi:type="tFormalExpression">${processEditionEqual=='N'}</conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-598e1dbe-85b3-40d0-89c8-bd2580ecbfc5" sourceRef="emptyUpgradeProcessEdtionServiceTask" targetRef="check"/>
    <sequenceFlow id="sid-80b50f96-7601-4ba2-8c32-968923170d25" sourceRef="sid-015ac835-1083-489a-9496-97dbb9432d09" targetRef="programmingTask">
      <conditionExpression>approve=='N'</conditionExpression>
      <conditionExpression>${approve=='N'}</conditionExpression>
    </sequenceFlow>
    <serviceTask id="emptyUpgradeProcessEdtionServiceTask" flowable:exclusive="true" name="空升版" flowable:expression="programEmptyUpgradeProcessEdtionTask.execute(execution)"/>
  </process>
doc/sql/mdm/mdm.mysql.all.create.sql
ÎļþÃû´Ó doc/sql/mdm/mdm.all.create.sql ÐÞ¸Ä
@@ -86,6 +86,7 @@
  `code` varchar(100) NOT NULL COMMENT '程序编号',
  `name` varchar(100) NOT NULL COMMENT '程序名称',
  `package_name` varchar(100) NOT NULL COMMENT '程序包名',
  `url` varchar(400) NOT NULL COMMENT '文件地址',
  `machine_code` bigint DEFAULT NULL COMMENT '设备编号/机床编号',
  `part_no` varchar(100) NOT NULL COMMENT '零组件编号',
  `is_cured` int DEFAULT NULL COMMENT '是否固化,1是;0否',