车车 4 сар өмнө
parent
commit
54fd3c203e

+ 18 - 17
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowwork/WorkflowWorkController.java

@@ -1,30 +1,25 @@
 package cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork;
 
-import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork.vo.WorkflowWorkPageReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork.vo.WorkflowWorkRespVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork.vo.WorkflowWorkSaveReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.StartWorkVO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowWorkDO;
 import cn.iocoder.yudao.module.iscs.service.workdesign.WorkflowWorkService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.annotation.Resource;
-import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.Valid;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.io.IOException;
 import java.util.List;
 
-import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 
@@ -78,17 +73,23 @@ public class WorkflowWorkController {
         return success(BeanUtils.toBean(pageResult, WorkflowWorkRespVO.class));
     }
 
-    @GetMapping("/exportWorkflowWorkExcel")
-    @Operation(summary = "导出作业 Excel")
-    @PreAuthorize("@ss.hasPermission('iscs:workflow-work:export')")
-    @ApiAccessLog(operateType = EXPORT)
-    public void exportWorkflowWorkExcel(@Valid WorkflowWorkPageReqVO pageReqVO,
-              HttpServletResponse response) throws IOException {
-        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<WorkflowWorkDO> list = workflowWorkService.getWorkflowWorkPage(pageReqVO).getList();
-        // 导出 Excel
-        ExcelUtils.write(response, "作业.xls", "数据", WorkflowWorkRespVO.class,
-                        BeanUtils.toBean(list, WorkflowWorkRespVO.class));
+    @GetMapping("/checkWorkById")
+    @Operation(summary = "发布时检查作业")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('iscs:workflow-work:query')")
+    public CommonResult<List<String>> checkWorkById(@RequestParam("id") Long id) {
+        List<String> mes = workflowWorkService.checkWorkById(id);
+        return success(mes);
+    }
+
+    /**
+     * 如果定时任务到时间了要开始,直接把传type=0,就可以直接开始了
+     */
+    @PostMapping("/updateStartWork")
+    @Operation(summary = "发布作业")
+    @PreAuthorize("@ss.hasPermission('iscs:workflow-work:update')")
+    public CommonResult<Boolean> updateStartWork(@Valid @RequestBody StartWorkVO vo) {
+        return success(workflowWorkService.updateStartWork(vo));
     }
 
 }

+ 21 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowworknode/vo/StartWorkVO.java

@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "发布作业")
+@Data
+public class StartWorkVO {
+
+    @Schema(description = "作业ID")
+    private Long workId;
+
+    @Schema(description = "发布方式(0-立即发布 1-定时发布)")
+    private String startType;
+
+    @Schema(description = "发布时间")
+    private LocalDateTime planTime;
+
+}

+ 7 - 7
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowworknode/vo/WorkflowWorkNodePageReqVO.java

@@ -1,10 +1,10 @@
 package cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo;
 
-import lombok.*;
-import java.util.*;
-import io.swagger.v3.oas.annotations.media.Schema;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
+
 import java.time.LocalDateTime;
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@@ -35,10 +35,7 @@ public class WorkflowWorkNodePageReqVO extends PageParam {
     private String nodeIcon;
 
     @Schema(description = "节点X坐标")
-    private Integer positionX;
-
-    @Schema(description = "节点Y坐标")
-    private Integer positionY;
+    private Integer position;
 
     @Schema(description = "表单ID", example = "10671")
     private Long formId;
@@ -62,4 +59,7 @@ public class WorkflowWorkNodePageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    @Schema(description = "隔离节点ID")
+    private String isolationNodeUuid;
+
 }

+ 3 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowworknode/vo/WorkflowWorkNodeRespVO.java

@@ -102,6 +102,9 @@ public class WorkflowWorkNodeRespVO {
     @ExcelProperty("隔离点")
     private String isolationPoints;
 
+    @Schema(description = "隔离节点ID")
+    private String isolationNodeUuid;
+
     @Schema(description = "被通知人ID", example = "20189")
     @ExcelProperty("被通知人ID")
     private Long notifyUserId;

+ 3 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowworknode/vo/WorkflowWorkNodeSaveReqVO.java

@@ -31,6 +31,9 @@ public class WorkflowWorkNodeSaveReqVO {
     @Schema(description = "隔离点")
     private String isolationPoints;
 
+    @Schema(description = "隔离节点ID")
+    private String isolationNodeUuid;
+
     @Schema(description = "节点设置人员信息")
     private List<WorkflowWorkNodeUserDO> nodeUserDOList;
 

+ 5 - 2
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/workdesign/WorkflowWorkDO.java

@@ -93,9 +93,12 @@ public class WorkflowWorkDO extends BaseDO {
      */
     private String cancellationReason;
     /**
-     * 状态:pending-待开始,running-执行中,completed-已完成,cancelled-已取消
+     * 状态:unreleased-未发布,scheduled-定时发布,pending-待开始,running-执行中,completed-已完成,cancelled-已取消
      */
     private String status;
-
+    /**
+     * 定时时间
+     */
+    private LocalDateTime planTime;
 
 }

+ 14 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/workdesign/WorkflowWorkNodeDO.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;
 
+import java.time.LocalDateTime;
+
 /**
  * 作业节点 DO
  *
@@ -130,5 +132,17 @@ public class WorkflowWorkNodeDO extends BaseDO {
      * 隔离点
      */
     private String isolationPoints;
+    /**
+     * 隔离节点ID
+     */
+    private String isolationNodeUuid;
+    /**
+     * 开始时间
+     */
+    private LocalDateTime startTime;
+    /**
+     * 结束时间
+     */
+    private LocalDateTime endTime;
 
 }

+ 15 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowWorkService.java

@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork.vo.WorkflowWorkPageReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork.vo.WorkflowWorkRespVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork.vo.WorkflowWorkSaveReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.StartWorkVO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowWorkDO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import jakarta.validation.Valid;
@@ -62,4 +63,18 @@ public interface WorkflowWorkService extends IService<WorkflowWorkDO> {
      */
     PageResult<WorkflowWorkDO> getWorkflowWorkPage(WorkflowWorkPageReqVO pageReqVO);
 
+    /**
+     * 发布时检查作业
+     * @param id
+     * @return
+     */
+    List<String> checkWorkById(Long id);
+
+    /**
+     * 发布作业
+     * @param vo
+     * @return
+     */
+    Boolean updateStartWork(StartWorkVO vo);
+
 }

+ 56 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowWorkServiceImpl.java

@@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork.vo.WorkflowWorkPageReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork.vo.WorkflowWorkRespVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowwork.vo.WorkflowWorkSaveReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.StartWorkVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.WorkflowWorkNodeRespVO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowDesignDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.WorkflowWorkDO;
@@ -17,10 +18,13 @@ import cn.iocoder.yudao.module.iscs.dal.mysql.workdesign.WorkflowWorkMapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import jakarta.annotation.Resource;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -143,4 +147,56 @@ public class WorkflowWorkServiceImpl extends ServiceImpl<WorkflowWorkMapper, Wor
         return workflowWorkMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public List<String> checkWorkById(Long id) {
+        Assert.notNull(id, "请告知需要检查的ID!");
+        List<WorkflowWorkNodeDO> list = workflowWorkNodeService.list(Wrappers.<WorkflowWorkNodeDO>lambdaQuery()
+                .eq(WorkflowWorkNodeDO::getWorkId, id));
+        List<String> mes = new ArrayList<>();
+        if (!list.isEmpty()) {
+            // 1.检查负责人和负责人组同时为空的
+            List<WorkflowWorkNodeDO> list1 = list.stream().filter(o -> o.getWorkerUserId() == null
+                    && o.getWorkerGroupId() == null && !"createJob".equals(o.getType())
+                    && !"1".equals(o.getIsolationType())).toList();
+            list1.forEach( o -> mes.add("节点[" + o.getNodeName() + "]:未选择负责人/负责人组" ));
+
+            // 2.检查isolation类型的隔离点位数据是否为空
+            List<WorkflowWorkNodeDO> list2 = list.stream().filter(o -> "isolation".equals(o.getType()) && StringUtils.isBlank(o.getIsolationPoints())).toList();
+            list2.forEach( o -> mes.add("节点[" + o.getNodeName() + "]:未选择隔离点" ));
+
+            // 3.检查isolation类型的隔离方式是否为空
+            List<WorkflowWorkNodeDO> list3 = list.stream().filter(o -> "isolation".equals(o.getType()) && StringUtils.isBlank(o.getIsolationType())).toList();
+            list3.forEach( o -> mes.add("节点[" + o.getNodeName() + "]:未选择隔离方式" ));
+        }
+        return mes;
+    }
+
+    @Transactional
+    @Override
+    public Boolean updateStartWork(StartWorkVO vo) {
+        Assert.notNull(vo.getWorkId(), "作业ID不能为空!");
+        Assert.notNull(vo.getStartType(), "发布方式不能为空!");
+        Assert.isFalse("1".equals(vo.getStartType()) && vo.getPlanTime() == null, "时间不能为空!");
+
+        if ("1".equals(vo.getStartType())) {
+            // 1.定时
+            update(Wrappers.<WorkflowWorkDO>lambdaUpdate()
+                    .eq(WorkflowWorkDO::getId, vo.getWorkId())
+                    .set(WorkflowWorkDO::getPlanTime, vo.getPlanTime())
+                    .set(WorkflowWorkDO::getStatus, "scheduled"));
+        } else {
+            // 2.立即
+            update(Wrappers.<WorkflowWorkDO>lambdaUpdate()
+                    .eq(WorkflowWorkDO::getId, vo.getWorkId())
+                    .set(WorkflowWorkDO::getStatus, "pending"));
+            // 开始更新node
+            workflowWorkNodeService.update(Wrappers.<WorkflowWorkNodeDO>lambdaUpdate()
+                    .eq(WorkflowWorkNodeDO::getWorkId, vo.getWorkId())
+                    .and(o -> o.isNull(WorkflowWorkNodeDO::getParentUuid).or().eq(WorkflowWorkNodeDO::getParentUuid, ""))
+                    .set(WorkflowWorkNodeDO::getApprovalStatus, "unaudited")
+                    .set(WorkflowWorkNodeDO::getStartTime, LocalDateTime.now()));
+        }
+        return true;
+    }
+
 }