ly il y a 3 ans
Parent
commit
acc3b998ec

+ 4 - 0
master/src/main/java/com/ruoyi/config/ActivitiConfig.java

@@ -116,6 +116,10 @@ public class ActivitiConfig {
         DeploymentBuilder deploymentBuilder6 = repositoryService().createDeployment();
         Resource spec4 = resourceLoader.getResource("classpath:/processes/sems/monthProcess.bpmn"); //加载流程图资源文件
         deploymentBuilder6.enableDuplicateFiltering().addInputStream(spec4.getFilename(), spec4.getInputStream()).name("特种设备月度检验流程").deploy();//按流程id部署
+
+        DeploymentBuilder deploymentBuilder7 = repositoryService().createDeployment();
+        Resource spec7 = resourceLoader.getResource("classpath:/processes/specTraining/specTrainingPlanProcess.bpmn"); //加载流程图资源文件
+        deploymentBuilder7.enableDuplicateFiltering().addInputStream(spec7.getFilename(), spec7.getInputStream()).name("专项培训计划审核").deploy();//按流程id部署
     }
 }
 

+ 1 - 1
master/src/main/java/com/ruoyi/project/sems/controller/TApproveController.java

@@ -744,6 +744,6 @@ public class TApproveController extends BaseController
             //任务执行总时长
             long times2 = System.currentTimeMillis() - startTime;
             logger.debug("  总共耗时:" + times2 + "毫秒");
-        return AjaxResult.success();
+            return AjaxResult.success();
     }
 }

+ 127 - 0
master/src/main/java/com/ruoyi/project/training/spec/controller/TStApproveController.java

@@ -0,0 +1,127 @@
+package com.ruoyi.project.training.spec.controller;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSON;
+import com.ruoyi.project.listener.monthSemsApprove.*;
+import org.activiti.engine.HistoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.impl.identity.Authentication;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.project.training.spec.domain.TStApprove;
+import com.ruoyi.project.training.spec.service.ITStApproveService;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.web.page.TableDataInfo;
+
+/**
+ * 专项培训计划申请Controller
+ *
+ * @author ly
+ * @date 2022-04-18
+ */
+@RestController
+@RequestMapping("/spec/stapprove")
+public class TStApproveController extends BaseController
+{
+    @Autowired
+    private ITStApproveService tStApproveService;
+    @Autowired
+    private RuntimeService runtimeService;
+    @Autowired
+    private HistoryService historyService;
+    @Autowired
+    private TaskService taskService;
+
+    /**
+     * 查询专项培训计划申请列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(TStApprove tStApprove)
+    {
+        startPage();
+        List<TStApprove> list = tStApproveService.selectTStApproveList(tStApprove);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 新增专项培训计划申请
+     */
+    @Log(title = "专项培训计划申请", businessType = BusinessType.INSERT)
+    @RequestMapping("/addStPlanApprove")
+    public AjaxResult add(@RequestBody TStApprove tStApprove)
+    {
+        //任务开始时间
+        long startTime = System.currentTimeMillis();
+        logger.info("任务申请" + JSON.toJSONString(tStApprove));
+        Long userid = getUserId();
+        //审批编号
+        Date dt = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
+        String data = sdf.format(dt) + userid;
+        tStApprove.setApNo(data);
+        tStApprove.setUserId(userid);
+        tStApproveService.insertTStApprove(tStApprove);
+
+        Map<String, Object> variables = new HashMap<>();
+        //开始工作流、监听
+//        variables.put("endSucessListener", new MonthEndSucessListener());
+//        variables.put("endFaileListener", new MonthEndFaileListener());
+        //审批人员设置
+        variables.put("zzjlusers", tStApprove.getZzjl());
+
+        long bussniseeKey = tStApprove.getId();
+        logger.info("bussniseeKey:" + bussniseeKey);
+        Authentication.setAuthenticatedUserId(userid.toString());
+
+        //采用key来启动流程定义并设置流程变量,返回流程实例
+        ProcessInstance pi = runtimeService.startProcessInstanceByKey("specTrainingPlanProcess", String.valueOf(bussniseeKey), variables);
+        logger.info("流程部署id:" + pi.getDeploymentId());
+        logger.info("流程定义id:" + pi.getProcessDefinitionId());
+        logger.info("流程实例id:" + pi.getProcessInstanceId());
+        logger.info("流程定义对象:" + pi.getProcessVariables());
+        tStApprove.setProcessId(pi.getProcessInstanceId());
+
+        tStApproveService.updateTStApprove(tStApprove);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 修改专项培训计划申请
+     */
+    @Log(title = "专项培训计划申请", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TStApprove tStApprove)
+    {
+        return toAjax(tStApproveService.updateTStApprove(tStApprove));
+    }
+
+    /**
+     * 删除专项培训计划申请
+     */
+    @Log(title = "专项培训计划申请", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(tStApproveService.deleteTStApproveByIds(ids));
+    }
+}

+ 204 - 0
master/src/main/java/com/ruoyi/project/training/spec/domain/TStApprove.java

@@ -0,0 +1,204 @@
+package com.ruoyi.project.training.spec.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import com.ruoyi.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 专项培训计划申请对象 t_st_approve
+ *
+ * @author ly
+ * @date 2022-04-18
+ */
+public class TStApprove extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private Long id;
+
+    /** 申请人id */
+    @Excel(name = "申请人id")
+    private Long userId;
+
+    /** 计划ids */
+    @Excel(name = "计划ids")
+    private String planId;
+
+    /** 审批类型 */
+    @Excel(name = "审批类型")
+    private Long approveType;
+
+    /** 内容 */
+    @Excel(name = "内容")
+    private String content;
+
+    /** 申请状态 0:审批中 1-通过 2-拒绝 */
+    @Excel(name = "申请状态 0:审批中 1-通过 2-拒绝")
+    private Long status;
+
+    /** 开始时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date creattime;
+
+    /** 结束时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date endtime;
+
+    /** 流程id */
+    @Excel(name = "流程id")
+    private String processId;
+
+    /** 申请编号(唯一) */
+    @Excel(name = "申请编号", readConverterExp = "唯=一")
+    private String apNo;
+
+    /** 删除标识 */
+    private Long delFlag;
+
+    /** 部门id */
+    @Excel(name = "部门id")
+    private Long deptId;
+
+    private Long zzjl;
+
+    public Long getZzjl() {
+        return zzjl;
+    }
+
+    public void setZzjl(Long zzjl) {
+        this.zzjl = zzjl;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+    public void setPlanId(String planId)
+    {
+        this.planId = planId;
+    }
+
+    public String getPlanId()
+    {
+        return planId;
+    }
+    public void setApproveType(Long approveType)
+    {
+        this.approveType = approveType;
+    }
+
+    public Long getApproveType()
+    {
+        return approveType;
+    }
+    public void setContent(String content)
+    {
+        this.content = content;
+    }
+
+    public String getContent()
+    {
+        return content;
+    }
+    public void setStatus(Long status)
+    {
+        this.status = status;
+    }
+
+    public Long getStatus()
+    {
+        return status;
+    }
+    public void setCreattime(Date creattime)
+    {
+        this.creattime = creattime;
+    }
+
+    public Date getCreattime()
+    {
+        return creattime;
+    }
+    public void setEndtime(Date endtime)
+    {
+        this.endtime = endtime;
+    }
+
+    public Date getEndtime()
+    {
+        return endtime;
+    }
+    public void setProcessId(String processId)
+    {
+        this.processId = processId;
+    }
+
+    public String getProcessId()
+    {
+        return processId;
+    }
+    public void setApNo(String apNo)
+    {
+        this.apNo = apNo;
+    }
+
+    public String getApNo()
+    {
+        return apNo;
+    }
+    public void setDelFlag(Long delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public Long getDelFlag()
+    {
+        return delFlag;
+    }
+    public void setDeptId(Long deptId)
+    {
+        this.deptId = deptId;
+    }
+
+    public Long getDeptId()
+    {
+        return deptId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("userId", getUserId())
+            .append("planId", getPlanId())
+            .append("approveType", getApproveType())
+            .append("content", getContent())
+            .append("status", getStatus())
+            .append("creattime", getCreattime())
+            .append("endtime", getEndtime())
+            .append("processId", getProcessId())
+            .append("apNo", getApNo())
+            .append("delFlag", getDelFlag())
+            .append("deptId", getDeptId())
+            .toString();
+    }
+}

+ 11 - 0
master/src/main/java/com/ruoyi/project/training/spec/domain/TStPlan.java

@@ -76,6 +76,17 @@ public class TStPlan extends BaseEntity
     @Excel(name = "学习状态")
     private String studyState;
 
+    /** 审核状态 */
+    private Long approveStatus;
+
+    public Long getApproveStatus() {
+        return approveStatus;
+    }
+
+    public void setApproveStatus(Long approveStatus) {
+        this.approveStatus = approveStatus;
+    }
+
     public String getStaffName() {
         return staffName;
     }

+ 63 - 0
master/src/main/java/com/ruoyi/project/training/spec/mapper/TStApproveMapper.java

@@ -0,0 +1,63 @@
+package com.ruoyi.project.training.spec.mapper;
+
+import java.util.List;
+import com.ruoyi.framework.aspectj.lang.annotation.DataScope;
+import com.ruoyi.project.training.spec.domain.TStApprove;
+
+/**
+ * 专项培训计划申请Mapper接口
+ * 
+ * @author ly
+ * @date 2022-04-18
+ */
+public interface TStApproveMapper 
+{
+    /**
+     * 查询专项培训计划申请
+     * 
+     * @param id 专项培训计划申请ID
+     * @return 专项培训计划申请
+     */
+    public TStApprove selectTStApproveById(Long id);
+
+    /**
+     * 查询专项培训计划申请列表
+     * 
+     * @param tStApprove 专项培训计划申请
+     * @return 专项培训计划申请集合
+     */
+    @DataScope(deptAlias = "d")
+    public List<TStApprove> selectTStApproveList(TStApprove tStApprove);
+
+    /**
+     * 新增专项培训计划申请
+     * 
+     * @param tStApprove 专项培训计划申请
+     * @return 结果
+     */
+    public int insertTStApprove(TStApprove tStApprove);
+
+    /**
+     * 修改专项培训计划申请
+     * 
+     * @param tStApprove 专项培训计划申请
+     * @return 结果
+     */
+    public int updateTStApprove(TStApprove tStApprove);
+
+    /**
+     * 删除专项培训计划申请
+     * 
+     * @param id 专项培训计划申请ID
+     * @return 结果
+     */
+    public int deleteTStApproveById(Long id);
+
+    /**
+     * 批量删除专项培训计划申请
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteTStApproveByIds(Long[] ids);
+}

+ 61 - 0
master/src/main/java/com/ruoyi/project/training/spec/service/ITStApproveService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.project.training.spec.service;
+
+import java.util.List;
+import com.ruoyi.project.training.spec.domain.TStApprove;
+
+/**
+ * 专项培训计划申请Service接口
+ * 
+ * @author ly
+ * @date 2022-04-18
+ */
+public interface ITStApproveService 
+{
+    /**
+     * 查询专项培训计划申请
+     * 
+     * @param id 专项培训计划申请ID
+     * @return 专项培训计划申请
+     */
+    public TStApprove selectTStApproveById(Long id);
+
+    /**
+     * 查询专项培训计划申请列表
+     * 
+     * @param tStApprove 专项培训计划申请
+     * @return 专项培训计划申请集合
+     */
+    public List<TStApprove> selectTStApproveList(TStApprove tStApprove);
+
+    /**
+     * 新增专项培训计划申请
+     * 
+     * @param tStApprove 专项培训计划申请
+     * @return 结果
+     */
+    public int insertTStApprove(TStApprove tStApprove);
+
+    /**
+     * 修改专项培训计划申请
+     * 
+     * @param tStApprove 专项培训计划申请
+     * @return 结果
+     */
+    public int updateTStApprove(TStApprove tStApprove);
+
+    /**
+     * 批量删除专项培训计划申请
+     * 
+     * @param ids 需要删除的专项培训计划申请ID
+     * @return 结果
+     */
+    public int deleteTStApproveByIds(Long[] ids);
+
+    /**
+     * 删除专项培训计划申请信息
+     * 
+     * @param id 专项培训计划申请ID
+     * @return 结果
+     */
+    public int deleteTStApproveById(Long id);
+}

+ 93 - 0
master/src/main/java/com/ruoyi/project/training/spec/service/impl/TStApproveServiceImpl.java

@@ -0,0 +1,93 @@
+package com.ruoyi.project.training.spec.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.project.training.spec.mapper.TStApproveMapper;
+import com.ruoyi.project.training.spec.domain.TStApprove;
+import com.ruoyi.project.training.spec.service.ITStApproveService;
+
+/**
+ * 专项培训计划申请Service业务层处理
+ *
+ * @author ly
+ * @date 2022-04-18
+ */
+@Service
+public class TStApproveServiceImpl implements ITStApproveService
+{
+    @Autowired
+    private TStApproveMapper tStApproveMapper;
+
+    /**
+     * 查询专项培训计划申请
+     *
+     * @param id 专项培训计划申请ID
+     * @return 专项培训计划申请
+     */
+    @Override
+    public TStApprove selectTStApproveById(Long id)
+    {
+        return tStApproveMapper.selectTStApproveById(id);
+    }
+
+    /**
+     * 查询专项培训计划申请列表
+     *
+     * @param tStApprove 专项培训计划申请
+     * @return 专项培训计划申请
+     */
+    @Override
+    public List<TStApprove> selectTStApproveList(TStApprove tStApprove)
+    {
+        return tStApproveMapper.selectTStApproveList(tStApprove);
+    }
+
+    /**
+     * 新增专项培训计划申请
+     *
+     * @param tStApprove 专项培训计划申请
+     * @return 结果
+     */
+    @Override
+    public int insertTStApprove(TStApprove tStApprove)
+    {
+        return tStApproveMapper.insertTStApprove(tStApprove);
+    }
+
+    /**
+     * 修改专项培训计划申请
+     *
+     * @param tStApprove 专项培训计划申请
+     * @return 结果
+     */
+    @Override
+    public int updateTStApprove(TStApprove tStApprove)
+    {
+        return tStApproveMapper.updateTStApprove(tStApprove);
+    }
+
+    /**
+     * 批量删除专项培训计划申请
+     *
+     * @param ids 需要删除的专项培训计划申请ID
+     * @return 结果
+     */
+    @Override
+    public int deleteTStApproveByIds(Long[] ids)
+    {
+        return tStApproveMapper.deleteTStApproveByIds(ids);
+    }
+
+    /**
+     * 删除专项培训计划申请信息
+     *
+     * @param id 专项培训计划申请ID
+     * @return 结果
+     */
+    @Override
+    public int deleteTStApproveById(Long id)
+    {
+        return tStApproveMapper.deleteTStApproveById(id);
+    }
+}

+ 116 - 0
master/src/main/resources/mybatis/training/spec/TStApproveMapper.xml

@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.project.training.spec.mapper.TStApproveMapper">
+    
+    <resultMap type="TStApprove" id="TStApproveResult">
+        <result property="id"    column="id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="planId"    column="plan_id"    />
+        <result property="approveType"    column="approve_type"    />
+        <result property="content"    column="content"    />
+        <result property="status"    column="status"    />
+        <result property="creattime"    column="creattime"    />
+        <result property="endtime"    column="endtime"    />
+        <result property="processId"    column="process_id"    />
+        <result property="apNo"    column="ap_no"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="deptId"    column="dept_id"    />
+        <result property="deptName" column="dept_name" />
+    </resultMap>
+
+    <sql id="selectTStApproveVo">
+        select d.id, d.user_id, d.plan_id, d.approve_type, d.content, d.status, d.creattime, d.endtime, d.process_id, d.ap_no, d.del_flag, d.dept_id ,s.dept_name from t_st_approve d
+      left join sys_dept s on s.dept_id = d.dept_id
+    </sql>
+
+    <select id="selectTStApproveList" parameterType="TStApprove" resultMap="TStApproveResult">
+        <include refid="selectTStApproveVo"/>
+        <where>  
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="planId != null  and planId != ''"> and plan_id = #{planId}</if>
+            <if test="approveType != null "> and approve_type = #{approveType}</if>
+            <if test="content != null  and content != ''"> and content = #{content}</if>
+            <if test="status != null "> and status = #{status}</if>
+            <if test="creattime != null "> and creattime = #{creattime}</if>
+            <if test="endtime != null "> and endtime = #{endtime}</if>
+            <if test="processId != null  and processId != ''"> and process_id = #{processId}</if>
+            <if test="apNo != null  and apNo != ''"> and ap_no = #{apNo}</if>
+            <if test="deptId != null "> and dept_id = #{deptId}</if>
+            and d.del_flag = 0
+        </where>
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
+    </select>
+    
+    <select id="selectTStApproveById" parameterType="Long" resultMap="TStApproveResult">
+        <include refid="selectTStApproveVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertTStApprove" parameterType="TStApprove">
+        <selectKey keyProperty="id" resultType="long" order="BEFORE">
+            SELECT seq_t_st_approve.NEXTVAL as id FROM DUAL
+        </selectKey>
+        insert into t_st_approve
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="planId != null">plan_id,</if>
+            <if test="approveType != null">approve_type,</if>
+            <if test="content != null">content,</if>
+            <if test="status != null">status,</if>
+            <if test="creattime != null">creattime,</if>
+            <if test="endtime != null">endtime,</if>
+            <if test="processId != null">process_id,</if>
+            <if test="apNo != null">ap_no,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="deptId != null">dept_id,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="planId != null">#{planId},</if>
+            <if test="approveType != null">#{approveType},</if>
+            <if test="content != null">#{content},</if>
+            <if test="status != null">#{status},</if>
+            <if test="creattime != null">#{creattime},</if>
+            <if test="endtime != null">#{endtime},</if>
+            <if test="processId != null">#{processId},</if>
+            <if test="apNo != null">#{apNo},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="deptId != null">#{deptId},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTStApprove" parameterType="TStApprove">
+        update t_st_approve
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="planId != null">plan_id = #{planId},</if>
+            <if test="approveType != null">approve_type = #{approveType},</if>
+            <if test="content != null">content = #{content},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="creattime != null">creattime = #{creattime},</if>
+            <if test="endtime != null">endtime = #{endtime},</if>
+            <if test="processId != null">process_id = #{processId},</if>
+            <if test="apNo != null">ap_no = #{apNo},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="deptId != null">dept_id = #{deptId},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <update id="deleteTStApproveById" parameterType="Long">
+        update t_st_approve set del_flag = 2 where id = #{id}
+    </update>
+
+    <update id="deleteTStApproveByIds" parameterType="String">
+        update t_st_approve set del_flag = 2 where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+    
+</mapper>

+ 50 - 0
master/src/main/resources/processes/specTraining/specTrainingPlanProcess.bpmn

@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
+  <process id="specTrainingPlanProcess" name="专项培训计划审核" isExecutable="true">
+    <startEvent id="startevent1" name="Start"></startEvent>
+    <endEvent id="endSpecTrainingPlan" name="End"></endEvent>
+    <userTask id="zzjlTask" name="装置经理" activiti:assignee="#{zzjlusers}"></userTask>
+    <endEvent id="endSpecTrainingPlan2" name="End"></endEvent>
+    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="zzjlTask"></sequenceFlow>
+    <sequenceFlow id="flow2" name="通过" sourceRef="zzjlTask" targetRef="endSpecTrainingPlan">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow3" name="不通过" sourceRef="zzjlTask" targetRef="endSpecTrainingPlan2">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 0}]]></conditionExpression>
+    </sequenceFlow>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_specTrainingPlanProcess">
+    <bpmndi:BPMNPlane bpmnElement="specTrainingPlanProcess" id="BPMNPlane_specTrainingPlanProcess">
+      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="60.0" y="40.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="endSpecTrainingPlan" id="BPMNShape_endSpecTrainingPlan">
+        <omgdc:Bounds height="35.0" width="35.0" x="370.0" y="40.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="zzjlTask" id="BPMNShape_zzjlTask">
+        <omgdc:Bounds height="55.0" width="105.0" x="180.0" y="30.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="endSpecTrainingPlan2" id="BPMNShape_endSpecTrainingPlan2">
+        <omgdc:Bounds height="35.0" width="35.0" x="215.0" y="140.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
+        <omgdi:waypoint x="95.0" y="57.0"></omgdi:waypoint>
+        <omgdi:waypoint x="180.0" y="57.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
+        <omgdi:waypoint x="285.0" y="57.0"></omgdi:waypoint>
+        <omgdi:waypoint x="370.0" y="57.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="100.0" x="304.0" y="69.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
+        <omgdi:waypoint x="232.0" y="85.0"></omgdi:waypoint>
+        <omgdi:waypoint x="232.0" y="140.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="100.0" x="240.0" y="109.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>

+ 64 - 0
ui/src/api/training/spec/stapprove.js

@@ -0,0 +1,64 @@
+import request from '@/utils/request'
+
+// 查询专项培训计划申请列表
+export function listStapprove(query) {
+  return request({
+    url: '/spec/stapprove/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询专项培训计划申请详细
+export function getStapprove(id) {
+  return request({
+    url: '/spec/stapprove/' + id,
+    method: 'get'
+  })
+}
+
+// 月检申请
+export function addStPlanApprove(data) {
+  return request({
+    url: '/spec/stapprove/addStPlanApprove',
+    method: 'post',
+    data: data
+  })
+}
+
+
+// 新增专项培训计划申请
+export function addStapprove(data) {
+  return request({
+    url: '/spec/stapprove',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改专项培训计划申请
+export function updateStapprove(data) {
+  return request({
+    url: '/spec/stapprove',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除专项培训计划申请
+export function delStapprove(id) {
+  return request({
+    url: '/spec/stapprove/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出专项培训计划申请
+export function exportStapprove(query) {
+  return request({
+    url: '/spec/stapprove/export',
+    method: 'get',
+    params: query
+  })
+}
+

+ 26 - 3
ui/src/views/training/spec/plan/index.vue

@@ -98,6 +98,14 @@
           @click="handleExport"
           v-hasPermi="['spec:plan:export']"
         >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          size="mini"
+          :disabled="multiple"
+          @click="addAprrove('')"
+        >{{ $t('提交申请') }}</el-button>
       </el-col>
 	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
@@ -237,6 +245,7 @@
               <el-button @click="upload.open = false">取 消</el-button>
           </div>
       </el-dialog>
+    <plan-approve v-if="planApproveVisible" ref="planApprove" @refreshDataList="getList"></plan-approve>
   </div>
 </template>
 
@@ -244,20 +253,22 @@
 import { listPlan, getPlan, delPlan, addPlan, updatePlan, exportPlan, importTemplate, getSuccessorListByMentorId} from "@/api/training/spec/plan";
 import { treeselect } from "@/api/system/dept";
 import { getToken } from "@/utils/auth";
+import PlanApprove from "./plan-approve"
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
-import Editor from '@/components/Editor';
 
 export default {
   name: "Plan",
-  components: { Treeselect },
+  components: { Treeselect,PlanApprove },
   // components: { Editor },
   data() {
     return {
       // 遮罩层
       loading: true,
+      planApproveVisible: false,
       // 选中数组
       ids: [],
+      dataListSelections: [],
       // 非单个禁用
       single: true,
       // 非多个禁用
@@ -404,6 +415,7 @@ export default {
       this.ids = selection.map(item => item.id)
       this.single = selection.length!==1
       this.multiple = !selection.length
+      this.dataListSelections = selection
     },
     /** 新增按钮操作 */
     handleAdd() {
@@ -494,7 +506,18 @@ export default {
       // 提交上传文件
       submitFileForm() {
           this.$refs.upload.submit();
-      }
+      },
+      addAprrove (row, type) {
+        var rows = row ? [row] : this.dataListSelections.map(item => {
+          return item
+        })
+        this.planApproveVisible = true
+        console.log(rows)
+        console.log(type)
+        this.$nextTick(() => {
+          this.$refs.planApprove.init(rows, type)
+        })
+      },
   }
 };
 </script>

+ 183 - 0
ui/src/views/training/spec/plan/plan-approve.vue

@@ -0,0 +1,183 @@
+<template>
+  <!--  -->
+  <el-dialog :title="$t('申请专项培训计划')" :visible.sync="visible" width="1200px" append-to-body>
+    <el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="" label-width="80px">
+      <el-form-item label="申请列表">
+        <el-table
+          :data="planList"
+          border
+          style="width: 100%">
+          <el-table-column label="培训员工编号" align="center" prop="staffId" :show-overflow-tooltip="true"/>
+          <el-table-column label="培训内容" align="center" prop="plantName" :show-overflow-tooltip="true"/>
+          <el-table-column label="开始日期" align="center" prop="startDate" width="100">
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.startDate, '{y}-{m}-{d}') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="结束日期" align="center" prop="endDate" width="100">
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.endDate, '{y}-{m}-{d}') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="学时" align="center" prop="classHour" :show-overflow-tooltip="true"/>
+          <el-table-column label="具体内容" align="center" prop="classContent" :show-overflow-tooltip="true"/>
+        </el-table>
+      </el-form-item>
+      <el-form-item :label="$t('装置经理')" prop="zzjl">
+        <el-select v-model="dataForm.zzjl" filterable :placeholder="$t('请选择')+$t('装置经理')">
+          <el-option
+            v-for="item in userOption"
+            :key="item.userId"
+            :label="item.nickName"
+            :value="item.userId"
+            :disabled="item.disabled">
+          </el-option>
+        </el-select>
+      </el-form-item>
+
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="submitForm">{{ $t('提交') }}</el-button>
+      <el-button @click="cancel">{{ $t('取 消') }}</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import {getToken} from "@/utils/auth";
+import {addStPlanApprove} from "@/api/training/spec/stapprove";
+import {listPostUser} from "@/api/system/user";
+
+export default {
+  name: "tapprove-add",
+  data() {
+    return {
+      visible: false,
+      planList: [],
+      userOption:[],
+      fileTips: '',
+      showDelay: false,
+      dataForm: {
+        id: 0,
+        approveType: 8,
+        planId: '',
+        zzjl: '',
+      },
+      conOptions: [],
+      doc: {
+        file: "",
+        // 是否显示弹出层(报告附件)
+        open: false,
+        // 弹出层标题(报告附件)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 报告附件上传位置编号
+        ids: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/sems/specfile/uploadFile",
+        commonfileList: null,
+        pType: 'traning',
+        pId: null
+      },
+      dataRule: {
+        approveType: [
+          { required: true, message: this.$t('approveType') + this.$t('notEmpty'), trigger: 'blur' }
+        ],
+        content: [
+          { required: true, message: this.$t('content') + this.$t('notEmpty'), trigger: 'blur' }
+        ]
+      },
+      approveOption: [],
+      plantOptions: [],
+      belong: '',
+      fileList: [],
+    };
+  },
+  watch: {
+    // 根据名称筛选部门树
+    deptName(val) {
+      this.$refs.tree.filter(val);
+    }
+  },
+  created() {
+
+  },
+  methods: {
+    init (rows, type) {
+      this.visible = true
+      this.fileList = []
+      this.planList = rows
+      listPostUser(this.queryParams).then(response => {
+        this.userOption = response;
+      });
+    //这里的panId是指的计划的Id
+      for (let i = 0; i < rows.length; i++) {
+        if (i == 0){
+          this.dataForm.planId = rows[i].id
+        }else {
+          this.dataForm.planId += ',' + rows[i].id
+        }
+      }
+    },
+
+    // 审批类型字典翻译
+    approveTypeFormat(row, column) {
+      return this.selectDictLabel(this.approveTypeOptions, row.approveType);
+    },
+    // 取消按钮
+    cancel() {
+      this.visible = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: 0,
+        devType: 2,
+        approveType: 7,
+        devId: '',
+        inspectorOne: '',
+        inspectorTwo: '',
+        inspectorThree: '',
+        auditor: '',
+        approver: '',
+        checkDate: ''
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["dataForm"].validate(valid => {
+        if (valid) {
+          addStPlanApprove(this.dataForm).then(response => {
+              this.msgSuccess(this.$t('申请成功'));
+              this.visible = false;
+            });
+        }
+      });
+      this.$emit('refreshDataList')
+    },
+}
+}
+
+
+</script>
+
+<style scoped>
+
+</style>