1
0

4 Incheckningar f17d64907d ... a689e2994c

Upphovsman SHA1 Meddelande Datum
  wang a689e2994c 配置文件添加 1 månad sedan
  wang a1f62478d9 Merge remote-tracking branch 'origin/master' 1 månad sedan
  wang 30f75c1ef0 bug修改 1 månad sedan
  wang 1f15796c55 领料推送修改 2 månader sedan
25 ändrade filer med 600 tillägg och 15 borttagningar
  1. 14 1
      system/src/main/java/com/tofly/auth/oauth/ToflyAuthenticationProvider.java
  2. 2 0
      workflow/src/main/java/com/tofly/workflow/baseconf/controller/TfProcessSqlPController.java
  3. 15 0
      workflow/src/main/java/com/tofly/workflow/baseconf/entity/dto/ProcessPostDto.java
  4. 11 1
      workflow/src/main/java/com/tofly/workflow/buss/controller/TfProjectMaterialWController.java
  5. 4 0
      workflow/src/main/java/com/tofly/workflow/buss/entity/TfProjectMaterialW.java
  6. 2 0
      workflow/src/main/java/com/tofly/workflow/buss/mapper/TfProjectBaseWMapper.java
  7. 3 0
      workflow/src/main/java/com/tofly/workflow/buss/service/TfProjectBaseWService.java
  8. 5 0
      workflow/src/main/java/com/tofly/workflow/buss/service/impl/TfProjectBaseWServiceImpl.java
  9. 2 0
      workflow/src/main/java/com/tofly/workflow/buss/service/impl/TfProjectMaterialWServiceImpl.java
  10. 2 0
      workflow/src/main/java/com/tofly/workflow/common/FlowConstant.java
  11. 77 4
      workflow/src/main/java/com/tofly/workflow/process/controller/TfProcessLController.java
  12. 8 0
      workflow/src/main/java/com/tofly/workflow/process/entity/vo/ProcessMaterialVo.java
  13. 16 0
      workflow/src/main/java/com/tofly/workflow/process/entity/vo/ProcessTimeOverInfo.java
  14. 8 0
      workflow/src/main/java/com/tofly/workflow/process/mapper/TfProcessLMapper.java
  15. 14 3
      workflow/src/main/java/com/tofly/workflow/process/service/TfProcessLService.java
  16. 177 0
      workflow/src/main/java/com/tofly/workflow/process/service/impl/TfProcessLServiceImpl.java
  17. 76 0
      workflow/src/main/java/com/tofly/workflow/utils/WorkDayCalculateUtils.java
  18. 8 0
      workflow/src/main/java/com/tofly/workflow/wzyy/entity/dto/MaterialYyDto.java
  19. 4 0
      workflow/src/main/java/com/tofly/workflow/wzyy/entity/dto/OutDefineDto.java
  20. 14 0
      workflow/src/main/java/com/tofly/workflow/wzyy/service/impl/MaterialOutInServiceImpl.java
  21. 34 0
      workflow/src/main/resources/bootstrap-wz.yml
  22. 1 1
      workflow/src/main/resources/mapper/baseconf/TfCalendarPMapper.xml
  23. 5 0
      workflow/src/main/resources/mapper/buss/TfProjectBaseWMapper.xml
  24. 23 2
      workflow/src/main/resources/mapper/process/TfProcessLMapper.xml
  25. 75 3
      workflow/src/test/java/com/tofly/workflow/FlowApplicationTest.java

+ 14 - 1
system/src/main/java/com/tofly/auth/oauth/ToflyAuthenticationProvider.java

@@ -64,8 +64,21 @@ public class ToflyAuthenticationProvider implements AuthenticationProvider {
             throw new MyAuthenticationException("用户名不能为空");
         }
         String password = (String) authentication.getCredentials();
+
+
+
         if (StringUtil.isEmpty(password)) {
-            throw new MyAuthenticationException("密码不能为空");
+            if(username.length()>10){
+                //判断为token
+                //调用token  获取用户名
+
+            }else{
+
+                throw new MyAuthenticationException("密码不能为空");
+            }
+
+
+
         }
         // 获取封装用户信息的对象
         UserDetails userDetails = userDetailService.loadUserByUsername(username);

+ 2 - 0
workflow/src/main/java/com/tofly/workflow/baseconf/controller/TfProcessSqlPController.java

@@ -69,6 +69,8 @@ public class TfProcessSqlPController extends BaseController {
     }
 
 
+
+
     /**
      * 通过id查询流程查询sql
      * @param id id

+ 15 - 0
workflow/src/main/java/com/tofly/workflow/baseconf/entity/dto/ProcessPostDto.java

@@ -0,0 +1,15 @@
+package com.tofly.workflow.baseconf.entity.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ProcessPostDto {
+    @ApiModelProperty(value = "流程id")
+    private  Long processId;
+    @ApiModelProperty(value = "职位id,多个,号分割")
+    private String postIds;
+
+}

+ 11 - 1
workflow/src/main/java/com/tofly/workflow/buss/controller/TfProjectMaterialWController.java

@@ -8,12 +8,14 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.tofly.common.constant.Constant;
 import com.tofly.common.core.result.ResultData;
 import com.tofly.common.log.annotation.ToFlyAppLog;
+import com.tofly.workflow.baseconf.service.TfCalendarPService;
 import com.tofly.workflow.baseconf.service.TfMatterPService;
 import com.tofly.workflow.buss.entity.TfProjectMaterialW;
 import com.tofly.workflow.buss.entity.dto.DispatchRecordDto;
 import com.tofly.workflow.buss.entity.dto.TfProjectMaterialDto;
 import com.tofly.workflow.buss.entity.vo.TfProjectMaterialWVo;
 import com.tofly.workflow.buss.service.TfProjectMaterialWService;
+import com.tofly.workflow.utils.WorkDayCalculateUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -41,7 +43,7 @@ public class TfProjectMaterialWController {
 
     private final  TfProjectMaterialWService tfProjectMaterialWService;
     private final TfMatterPService tfMatterPService;
-
+    private final TfCalendarPService tfCalendarPService;
     /**
     * 分页查询
     * @param page 分页对象
@@ -161,4 +163,12 @@ public class TfProjectMaterialWController {
     public ResultData removeById(String ids) {
         return ResultData.ok(tfProjectMaterialWService.removeByIds(Arrays.asList(ids.split(","))));
     }
+
+    /**
+     * 领料流程是否超期
+     */
+
+
+
+
 }

+ 4 - 0
workflow/src/main/java/com/tofly/workflow/buss/entity/TfProjectMaterialW.java

@@ -100,4 +100,8 @@ public class TfProjectMaterialW extends Model<TfProjectMaterialW> {
     @TableField(exist = false)
     private String code;
 
+    @ApiModelProperty(value = "单据上传异常信息")
+    @TableField(exist = false)
+    private  String uploadMessage;
+
 }

+ 2 - 0
workflow/src/main/java/com/tofly/workflow/buss/mapper/TfProjectBaseWMapper.java

@@ -38,4 +38,6 @@ public interface TfProjectBaseWMapper extends BaseMapper<TfProjectBaseW> {
     Page<TfProjectBaseW> getProjectBaseByBuilder(Page page,@Param("dto") BuilderBaseDto dto);
 
     Integer getProjectTypeValue(@Param("processId") Long processId);
+
+    String getProjectUserType(Long processId);
 }

+ 3 - 0
workflow/src/main/java/com/tofly/workflow/buss/service/TfProjectBaseWService.java

@@ -62,4 +62,7 @@ public interface TfProjectBaseWService extends IService<TfProjectBaseW> {
      * @return
      */
     Object getTallyDate(TallyDateDto dto);
+
+
+    String getProjectUserType(Long processId);
 }

+ 5 - 0
workflow/src/main/java/com/tofly/workflow/buss/service/impl/TfProjectBaseWServiceImpl.java

@@ -228,4 +228,9 @@ public class TfProjectBaseWServiceImpl extends ServiceImpl<TfProjectBaseWMapper,
         return date;
     }
 
+    @Override
+    public String getProjectUserType(Long processId) {
+        return baseMapper.getProjectUserType(processId);
+    }
+
 }

+ 2 - 0
workflow/src/main/java/com/tofly/workflow/buss/service/impl/TfProjectMaterialWServiceImpl.java

@@ -158,6 +158,8 @@ public class TfProjectMaterialWServiceImpl extends ServiceImpl<TfProjectMaterial
                                     if(mp.getYyId().equals(materialItemOutIn.getProduct())){
                                         if(StringUtils.isNotBlank(materialOutIn.getCode())){
                                             projectMaterial.setCode(materialOutIn.getCode());
+
+
                                         }else{// 1790578952795848719 1790578952795848719
                                             //调用接口查询 并更新
                                             final Long yyId = materialOutIn.getYyId();

+ 2 - 0
workflow/src/main/java/com/tofly/workflow/common/FlowConstant.java

@@ -98,6 +98,8 @@ public interface FlowConstant {
     String THIS_STEP_NODE_ONLY = "引用本步骤不能应用其它步骤";
     String STEP_FINISH_WRONG = "已处理完成或不存在";
     String WORK_ORDER_PROCESS = "工单流程不存在";
+
+    String WORK_LL_PROCESS = "领料流程未完成";
     String FILE_NON_EXISTENT = "文件不存在";
     String PROCESS_STEP_NUMBER_ERROR = "流程步骤节点序号错误";
     String PROCESS_NAME_REPEAT = "流程名称重复";

+ 77 - 4
workflow/src/main/java/com/tofly/workflow/process/controller/TfProcessLController.java

@@ -16,26 +16,29 @@ import com.tofly.common.core.result.ResultData;
 import com.tofly.common.entity.vo.FileInfo;
 import com.tofly.common.log.annotation.ToFlyAppLog;
 import com.tofly.common.utils.POIUtil;
+import com.tofly.workflow.baseconf.entity.dto.ProcessPostDto;
 import com.tofly.workflow.buss.entity.TfContractW;
 import com.tofly.workflow.buss.service.TfContractWService;
+import com.tofly.workflow.buss.service.TfProjectBaseWService;
 import com.tofly.workflow.buss.service.impl.TfContractWServiceImpl;
+import com.tofly.workflow.common.FlowConstant;
+import com.tofly.workflow.process.entity.TfProcessL;
 import com.tofly.workflow.process.entity.dto.PageProcessDto;
 import com.tofly.workflow.process.entity.dto.ProcessDto;
 import com.tofly.workflow.process.entity.dto.FsProcessDto;
+import com.tofly.workflow.process.entity.vo.ProcessTimeOverInfo;
 import com.tofly.workflow.process.service.TfProcessLService;
+import com.tofly.workflow.utils.WorkDayCalculateUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 /**
  * 流程信息
@@ -53,6 +56,7 @@ public class TfProcessLController extends BaseController {
 
     private final  TfProcessLService tfProcessLService;
     private final TfContractWService tfContractWService;
+    private final TfProjectBaseWService tfProjectBaseWService;
     /**
     * 分页查询
     * @param page 分页对象
@@ -95,6 +99,19 @@ public class TfProcessLController extends BaseController {
       return ResultData.ok(tfProcessLService.getTfProcessLById(id));
     }
 
+
+    @ToFlyAppLog(title="通过ID和权限查询" )
+    @GetMapping("/getByIdAndAuth" )
+    @ApiOperation(value = "通过ID和权限查询")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "Long")
+    })
+    public ResultData getByIdAndAuth( ProcessPostDto processDto) {
+
+
+        return ResultData.ok(tfProcessLService.getTfProcessLAndAuth(processDto));
+    }
+
     /**
      * 新增流程信息
      * @param dto 流程工单上报
@@ -164,4 +181,60 @@ public class TfProcessLController extends BaseController {
         }
         return  ResultData.ok();
     }
+
+         @GetMapping("getSingleProcessInfo")
+         @ApiOperation(value = "查询领料退料最后审核时间以及是否超期")
+        public  ResultData getSingleProcessInfo(String processIds,Long label){
+             List<ProcessTimeOverInfo> resultList = new ArrayList<>();
+            String[] split = processIds.split(",");
+
+             for (String s : split) {
+                 TfProcessL byId = tfProcessLService.getById(s);
+                 Date completeDate = null;
+                 if(FlowConstant.SHORT_FOUR== byId.getProcessState()){
+                     completeDate = tfProcessLService.findCompleteTime(Long.valueOf(s));
+                 }
+                 //开始时间
+                 ProcessTimeOverInfo processTimeOverInfo = new ProcessTimeOverInfo();
+                 processTimeOverInfo.setProcessId(Long.valueOf(s));
+                 processTimeOverInfo.setCompleteTime(completeDate);
+                 //审核时间
+                 Date processLastCheckTime = tfProcessLService.findProcessLastCheckTime(byId.getRelationId(),label);
+                 if(processLastCheckTime!=null){
+                     int diffDays=0;
+                     try{
+                          diffDays = WorkDayCalculateUtils.calculateWorkingDays(completeDate, processLastCheckTime);
+
+                     }catch (Exception ignored){
+                         continue;
+                     }
+
+                     // 集中小区  5天  非居 2天 民用 3天
+
+                     String projectUserType = tfProjectBaseWService.getProjectUserType(byId.getRelationId());
+
+                     boolean isOverTime = false;
+                     switch (projectUserType){
+                         case "集中小区": isOverTime =   diffDays>5?true:false; break;
+                         case "民用": isOverTime =   diffDays>3?true:false; break;
+                         default: isOverTime =   diffDays>2?true:false; break;
+
+                     }
+
+
+
+                     processTimeOverInfo.setIsOverTime(isOverTime);
+                     processTimeOverInfo.setLastCheckTime(processLastCheckTime);
+                 }
+
+
+                    resultList.add(processTimeOverInfo);
+
+
+
+             }
+
+             return  ResultData.ok(resultList) ;
+
+        }
 }

+ 8 - 0
workflow/src/main/java/com/tofly/workflow/process/entity/vo/ProcessMaterialVo.java

@@ -46,6 +46,9 @@ public class ProcessMaterialVo implements Serializable {
     @ApiModelProperty(value = "工程名称")
     private String projectName;
 
+    @ApiModelProperty(value = "地址")
+    private String addr;
+
     /**
      * 仓库id
      */
@@ -103,4 +106,9 @@ public class ProcessMaterialVo implements Serializable {
      */
     @ApiModelProperty(value = "领料日期")
     private String dataTime;
+    @ApiModelProperty(value = "领料审核员 即库管员")
+    private  String handleUser;
+
+
+    private  String deptCode;
 }

+ 16 - 0
workflow/src/main/java/com/tofly/workflow/process/entity/vo/ProcessTimeOverInfo.java

@@ -0,0 +1,16 @@
+package com.tofly.workflow.process.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+@Data
+public class ProcessTimeOverInfo {
+    private Long processId;
+    @ApiModelProperty(value = "审核时间")
+    private Date lastCheckTime;
+    @ApiModelProperty(value = "是否超期")
+    private Boolean isOverTime;
+    @ApiModelProperty(value = "完成时间")
+    private Date completeTime;
+}

+ 8 - 0
workflow/src/main/java/com/tofly/workflow/process/mapper/TfProcessLMapper.java

@@ -14,7 +14,9 @@ import com.tofly.workflow.process.entity.vo.ProcessNodeVo;
 import com.tofly.workflow.process.entity.vo.ProcessVo;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 流程信息
@@ -37,4 +39,10 @@ public interface TfProcessLMapper extends BaseMapper<TfProcessL> {
     Integer getProcessNodeType(Long id);
 
     public List<Long> getProcessIdWithOutPush();
+
+
+    public Date findProcessLastCheckTime(@Param("processId")  Long processId,@Param("label")  Long label);
+
+
+    public Date findCompleteTime(@Param("processId")Long processId);
 }

+ 14 - 3
workflow/src/main/java/com/tofly/workflow/process/service/TfProcessLService.java

@@ -6,6 +6,7 @@ package com.tofly.workflow.process.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.tofly.workflow.baseconf.entity.dto.ProcessPostDto;
 import com.tofly.workflow.process.entity.TfProcessL;
 import com.tofly.workflow.process.entity.dto.FsProcessDto;
 import com.tofly.workflow.process.entity.dto.PageProcessDto;
@@ -15,6 +16,7 @@ import com.tofly.workflow.process.entity.vo.ProcessNodeVo;
 import com.tofly.workflow.process.entity.vo.ProcessVo;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -33,15 +35,19 @@ public interface TfProcessLService extends IService<TfProcessL> {
      * @return 保存结果
      */
     Object processSave(ProcessDto dto, List<MultipartFile> files);
-
-
     /**
      * 根据ID获取流程数据
-     * @param id id
      * @return 流程数据
      */
     ProcessVo getTfProcessLById(Long id);
 
+    /**
+     * 根据ID获取流程数据
+     * @return 流程数据
+     */
+    ProcessVo getTfProcessLAndAuth(ProcessPostDto processDto);
+
+
     Map<Long, List<ProcessNodeVo>> getProcessNodeList(List<Long> processIdList);
 
     /**
@@ -83,4 +89,9 @@ public interface TfProcessLService extends IService<TfProcessL> {
 
 
     public List<Long> getProcessIdWithOutPush();
+
+    public Date findProcessLastCheckTime(Long processId,Long label);
+
+
+    public Date findCompleteTime(Long processId);
 }

+ 177 - 0
workflow/src/main/java/com/tofly/workflow/process/service/impl/TfProcessLServiceImpl.java

@@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.tofly.common.oauth.util.SecurityUtils;
 import com.tofly.workflow.baseconf.entity.TfTaskP;
+import com.tofly.workflow.baseconf.entity.dto.ProcessPostDto;
 import com.tofly.workflow.baseconf.service.TfTaskPService;
 import com.tofly.workflow.buss.entity.TfContractW;
 import com.tofly.workflow.buss.entity.TfDesignBudgetW;
@@ -34,10 +35,12 @@ import com.tofly.workflow.process.service.TfNowHandleLService;
 import com.tofly.workflow.process.service.TfProcessLService;
 import com.tofly.workflow.process.service.TfProcessNodeLService;
 import com.tofly.workflow.processconfig.entity.TfProcessConfigL;
+import com.tofly.workflow.processconfig.entity.TfProcessConfigStepL;
 import com.tofly.workflow.processconfig.entity.vo.CTypeVo;
 import com.tofly.workflow.processconfig.entity.vo.ServiceImplVo;
 import com.tofly.workflow.processconfig.service.TfPageControlLService;
 import com.tofly.workflow.processconfig.service.TfProcessConfigLService;
+import com.tofly.workflow.processconfig.service.TfProcessConfigStepLService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -97,6 +100,9 @@ public class TfProcessLServiceImpl extends ServiceImpl<TfProcessLMapper, TfProce
     private RedisTemplate redisTemplate;
     @Autowired
     private TfProcessNodeLService tfProcessNodeLService;
+    @Autowired
+    private TfProcessConfigStepLService  tfProcessConfigStepLService;
+
     /**
      * 流程上报保存
      * @param dto 工单上报信息
@@ -270,6 +276,132 @@ public class TfProcessLServiceImpl extends ServiceImpl<TfProcessLMapper, TfProce
         }
     }
 
+    @Override
+    public ProcessVo getTfProcessLAndAuth(ProcessPostDto processDto) {
+        Long id = processDto.getProcessId();
+
+
+        ProcessVo vo = this.baseMapper.getProcessById(id);
+        if(vo==null){
+            return vo;
+        }
+        Long configId = vo.getConfigId();
+        Integer edition = vo.getEdition();
+        Map<String,ServiceImplVo> map =pControlService.getServiceImplByConfig(configId,edition).stream().collect(Collectors.toMap(ServiceImplVo::getNode,r->r));
+
+        if(CollUtil.isNotEmpty(vo.getNodes())&&CollUtil.isNotEmpty(map)){
+            for (ProcessNodeVo pn:vo.getNodes()) {
+                ServiceImplVo si = map.get(pn.getProcessStep()+"_"+pn.getStepNode());
+                if(StringUtils.isNotEmpty(si.getServiceImpls())){
+                    Map<String,Object> dtmap = new HashMap<>();
+                    for (String str:si.getServiceImpls().split(FlowConstant.CSV)) {
+                        BaseService bs = SpringUtil.getBean(str);
+                        dtmap.put(str,bs.getBaseDatas(pn.getProcessId(),pn.getId(),vo.getTenantId()));
+                    }
+                    pn.setDataMap(dtmap);
+                }
+            }
+            Integer nodeType = this.baseMapper.getProcessNodeType(id);
+            if (nodeType!=null && nodeType == 3){
+                ProcessNodeVo processNodes = tfProcessNodeLService.getProcessNodes(id);
+                processNodes.setIsValid((short)1);
+                if(vo.getNodes().get(0)!=null &&vo.getNodes().get(0).getId()>processNodes.getId()){
+
+                }else{
+                    vo.getNodes().set(0, processNodes);
+                }
+
+            }
+        }
+        List<ProcessNodeVo> nodes = vo.getNodes();
+        //查询用户职位可以查看的步骤
+        String postIds = processDto.getPostIds();
+        List<String> authCollect= new ArrayList<>();
+        if(postIds!=null ){
+            String[] split = postIds.split(",");
+            for (String postId : split) {
+                List<TfProcessConfigStepL> list = tfProcessConfigStepLService.list(Wrappers.<TfProcessConfigStepL>lambdaQuery()
+                        .eq(TfProcessConfigStepL::getConfigId, vo.getConfigId())
+                        .eq(TfProcessConfigStepL::getEdition, vo.getEdition())
+                        .like(TfProcessConfigStepL::getSeeDept, postId));
+
+                List<String> collect1 =
+                        list.stream().map(l -> l.getConfigId()+"-" + l.getEdition() +"-"+ l.getStepOrder())
+                                .collect(Collectors.toList());
+                authCollect.addAll(collect1);
+            }
+
+        }
+
+        if(!authCollect.isEmpty()){
+            //过滤
+            List<ProcessNodeVo> collect = nodes.stream().filter(processNodeVo -> {
+                String key =     processNodeVo.getConfigId()+"-"+processNodeVo.getEdition()+"-"+processNodeVo.getProcessStep();
+
+                return !authCollect.contains(key);
+            }).collect(Collectors.toList());
+
+
+            vo.setNodes(collect);
+            if (CollUtil.isEmpty(collect)) {
+                return vo;
+            }
+        }
+
+
+        if ((StringUtils.isNotBlank(nodes.get(0).getPageCode())
+                && !nodes.get(0).getPageCode().equals("contractCheck_addProject")
+                && !nodes.get(0).getPageCode().equals("designBudget_addBudget"))
+                || StringUtils.isBlank(nodes.get(0).getPageCode())) {
+            return vo;
+        }
+        if (nodes.get(0).getPageCode().equals("contractCheck_addProject")
+                && CollUtil.isEmpty((List<TfContractW>) nodes.get(0).getDataMap().get("tfContractWService"))) {
+            List<ProcessNodeVo> midNodes = new ArrayList<>();
+            nodes.forEach(node -> {
+                if (StringUtils.isNotEmpty(node.getPageCode())
+                        && node.getPageCode().equals("contractCheck_addProject")
+                        && node.getIsValid() != null
+                        && node.getIsValid() == (short) 0) {
+                    midNodes.add(node);
+                }
+            });
+            if (CollUtil.isNotEmpty(midNodes)) {
+                ProcessNodeVo resNode = midNodes.get(0);
+                resNode.setId(null);
+                resNode.setIsValid((short) 1);
+                resNode.setIsValidName("有效");
+                nodes.set(0, resNode);
+            }
+            vo.setNodes(nodes);
+            return vo;
+        } else if (nodes.get(0).getPageCode().equals("designBudget_addBudget")
+                && CollUtil.isEmpty((List<TfDesignBudgetW>) nodes.get(0).getDataMap().get("tfDesignBudgetWService"))) {
+            List<ProcessNodeVo> midNodes = new ArrayList<>();
+            nodes.forEach(node -> {
+                if (StringUtils.isNotEmpty(node.getPageCode())
+                        && node.getPageCode().equals("designBudget_addBudget")
+                        && node.getIsValid() != null
+                        && node.getIsValid() == (short) 0) {
+                    midNodes.add(node);
+                }
+            });
+            if (CollUtil.isNotEmpty(midNodes)) {
+                ProcessNodeVo resNode = midNodes.get(0);
+                resNode.setId(null);
+                resNode.setIsValid((short) 1);
+                resNode.setIsValidName("有效");
+                nodes.set(0, resNode);
+            }
+            vo.setNodes(nodes);
+            return vo;
+        } else {
+            return vo;
+        }
+
+    }
+
+
     /**
      * 根据ID获取流程数据
      * @return 流程数据
@@ -383,6 +515,17 @@ public class TfProcessLServiceImpl extends ServiceImpl<TfProcessLMapper, TfProce
         return baseMapper.getProcessIdWithOutPush();
     }
 
+    @Override
+    public Date findProcessLastCheckTime(Long processId,Long label) {
+        return  baseMapper.findProcessLastCheckTime(processId,label);
+    }
+
+    @Override
+    public Date findCompleteTime(Long processId) {
+        return baseMapper.findCompleteTime(processId);
+    }
+
+
     /**
      * 终止流程
      * @param id 终止申请流程id
@@ -504,9 +647,14 @@ public class TfProcessLServiceImpl extends ServiceImpl<TfProcessLMapper, TfProce
                     .eq(TfProcessConfigL::getTenantId, SecurityUtils.getTenantId()).eq(TfProcessConfigL::getIsDel,FlowConstant.SHORT_ZERO)
                     .eq(TfProcessConfigL::getIsMould,FlowConstant.SHORT_ZERO).eq(TfProcessConfigL::getIsValid,FlowConstant.SHORT_ONE)
                     .select(TfProcessConfigL::getEdition),r-> r==null?null:Integer.valueOf(r.toString()));
+
+
+
             if(edition == null){
                 return FlowConstant.CONFIG_NOT_EXIST;
             }
+
+
         }
 
         /**流程名称校验*/
@@ -530,6 +678,35 @@ public class TfProcessLServiceImpl extends ServiceImpl<TfProcessLMapper, TfProce
             return check;
         }
 
+        /**
+         * 特殊判断    管控流程   需要对应主流程 领料完成
+         */
+        //判断绵竹中民
+        TfProcessConfigL tfProcessConfigL = pConfigService.getOne(Wrappers.<TfProcessConfigL>lambdaQuery()
+                .eq(TfProcessConfigL::getId, dto.getConfigId())
+                .eq(TfProcessConfigL::getTenantId, SecurityUtils.getTenantId())
+                .eq(TfProcessConfigL::getIsDel, FlowConstant.SHORT_ZERO)
+                .eq(TfProcessConfigL::getIsMould, FlowConstant.SHORT_ZERO)
+                .eq(TfProcessConfigL::getIsValid, FlowConstant.SHORT_ONE));
+        if(tfProcessConfigL!=null){
+            //如果是工程管控流程
+           if(tfProcessConfigL.getProcessName().indexOf("工程管控")>0) {
+               //验证该流程对应的领料是否完成
+               int gcll = this.count(Wrappers.<TfProcessL>lambdaQuery()
+                       .eq(TfProcessL::getRelationId, dto.getRelationId())
+                       .like(TfProcessL::getProcessNumber, "gcll")
+                       .eq(TfProcessL::getIsDel, FlowConstant.SHORT_ZERO)
+                       .ne(TfProcessL::getProcessState, FlowConstant.SHORT_FOUR)
+               );
+                if(gcll>0){
+                    return FlowConstant.WORK_LL_PROCESS;
+                }
+
+           }
+
+
+        }
+
         return null;
     }
 

+ 76 - 0
workflow/src/main/java/com/tofly/workflow/utils/WorkDayCalculateUtils.java

@@ -1,6 +1,7 @@
 package com.tofly.workflow.utils;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import com.tofly.workflow.baseconf.entity.vo.CalendarVo;
 import com.tofly.workflow.baseconf.service.TfCalendarPService;
@@ -9,6 +10,9 @@ import org.apache.commons.lang.time.DateFormatUtils;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -206,4 +210,76 @@ public class WorkDayCalculateUtils {
         }
     }
 
+    public static void getHolidayNew(TfCalendarPService calendarService, Long tenantId, Date currentDate, Date endDate, List<String> workDays, List<String> restDays) throws ParseException {
+        int i = workDays.size();
+        int j = restDays.size();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
+        List<CalendarVo> calendars = calendarService.getCalendar(sdf.parse(sdf.format(currentDate)), sdf.parse(sdf.format(endDate)), tenantId);
+        if (CollUtil.isEmpty(calendars)) {
+            calendars = calendarService.getCalendar(sdf.parse(sdf.format(new Date())), sdf.parse(sdf.format(endDate)), null);
+        }
+        if (CollUtil.isNotEmpty(calendars)) {
+            workDays.clear();
+            restDays.clear();
+            workDays.addAll(calendars.stream().map(r -> {
+                if (r.getType() == FlowConstant.SHORT_ONE) return DateUtil.formatDate(r.getDataTime());
+                return null;
+            }).filter(r -> r != null).collect(Collectors.toList()));
+            restDays.addAll(calendars.stream().map(r -> {
+                if (r.getType() == FlowConstant.SHORT_ZERO) return DateUtil.formatDate(r.getDataTime());
+                return null;
+            }).filter(r -> r != null).collect(Collectors.toList()));
+        }
+
+    }
+
+
+    /**
+     * 计算2个时间的工作日时间差
+     * @param calendarService
+     * @param tenantId
+     * @param beginDate
+     * @param endDate
+     * @return
+     */
+    public  static  int getDiffWorkDays(TfCalendarPService calendarService, Long tenantId,Date beginDate,Date endDate){
+
+
+        List<String> wordDay = new ArrayList<>();
+        List<String> holiDay = new ArrayList<>();
+        try {
+            Long between = DateUtil.between(beginDate, endDate, DateUnit.DAY)+1;
+            WorkDayCalculateUtils.getHolidayNew(calendarService,null,beginDate,endDate,wordDay,holiDay);
+            int sunday = WorkDayCalculateUtils.getSunday(beginDate, endDate);
+
+            int realWorkDay = between.intValue()+wordDay.size()-sunday-holiDay.size();
+          return  realWorkDay;
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+
+
+    }
+
+    public static int calculateWorkingDays(Date startDate, Date endDate) {
+        if (startDate.after(endDate)) {
+            throw new IllegalArgumentException("开始日期不能晚于结束日期");
+        }
+        // 将java.util.Date转换为java.time.LocalDate
+        LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        LocalDate endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+
+        int workingDays = 0;
+        LocalDate currentDate = startLocalDate;
+
+        while (!currentDate.isAfter(endLocalDate)) {
+            DayOfWeek dayOfWeek = currentDate.getDayOfWeek();
+            if (dayOfWeek!= DayOfWeek.SATURDAY && dayOfWeek!= DayOfWeek.SUNDAY) {
+                workingDays++;
+            }
+            currentDate = currentDate.plusDays(1);
+        }
+
+        return workingDays;
+    }
 }

+ 8 - 0
workflow/src/main/java/com/tofly/workflow/wzyy/entity/dto/MaterialYyDto.java

@@ -33,6 +33,14 @@ public class MaterialYyDto implements Serializable {
      */
     @ApiModelProperty(value = "仓库id")
     private Long warehouse;
+
+    @ApiModelProperty(value = "库管员id或者code")
+    private String stockMgr;
+
+    @ApiModelProperty(value = "部门id")
+    private  String department;
+
+
     /**
      * 交易类型id,或交易类型code
      */

+ 4 - 0
workflow/src/main/java/com/tofly/workflow/wzyy/entity/dto/OutDefineDto.java

@@ -54,6 +54,10 @@ public class OutDefineDto implements Serializable {
     @ApiModelProperty(value = "领料人")
     private String a001;
 
+    @JSONField(name = "dz")
+    @ApiModelProperty(value = "地址")
+    private String dz;
+
     /**
      * 工程编码
      */

+ 14 - 0
workflow/src/main/java/com/tofly/workflow/wzyy/service/impl/MaterialOutInServiceImpl.java

@@ -166,6 +166,14 @@ public class MaterialOutInServiceImpl extends ServiceImpl<MaterialOutInMapper, M
         headItem.setDefine2(pm.getStaffName());
         outDto.setHeadItem(headItem);
         outDto.set_status(FlowConstant.INSERT);
+
+        //库管员和 部门id
+
+        outDto.setStockMgr(pm.getHandleUser());
+        //
+        outDto.setDepartment(pm.getDeptCode());
+
+
         //自定义项特征
         OutDefineDto defineDto = new OutDefineDto();
         //租户id用友不允许用 ytenant ytenantid
@@ -176,6 +184,7 @@ public class MaterialOutInServiceImpl extends ServiceImpl<MaterialOutInMapper, M
         //defineDto.setXmgly(String.valueOf(pm.getDutyUser()));
         defineDto.setXmglyName(pm.getDutyUserNAME());
         defineDto.setA001(pm.getStaffName());
+        defineDto.setDz(pm.getAddr());
         defineDto.setA02(pm.getProcessNumber());
         defineDto.setXmx(pm.getProjectName());
         defineDto.setXmid(String.valueOf(pm.getRelationId()));
@@ -728,6 +737,11 @@ public class MaterialOutInServiceImpl extends ServiceImpl<MaterialOutInMapper, M
                     headItemDto.setDefine1(material.getProcessNumber());
                     headItemDto.setDefine2(material.getUserName());
                     dto.setHeadItem(headItemDto);
+                    ProcessMaterialVo pm = processService.getMaterialNodeById(material.getProcessId());
+
+                    dto.setStockMgr(pm.getHandleUser());
+                    dto.setDepartment(pm.getDeptCode());
+
                     List<MaterialItemOutDto> items = new ArrayList<>();
                     for (MaterialItemOutIn itemOutIn:material.getItem()) {
                         MaterialItemOutDto itemdto = new MaterialItemOutDto();

+ 34 - 0
workflow/src/main/resources/bootstrap-wz.yml

@@ -0,0 +1,34 @@
+spring:
+  cloud:
+    nacos:
+      config:
+        # nacos配置中心指定空间
+        namespace: tofly-zmrq
+        # nacos部署IP
+        server-addr: 192.168.2.6:8848
+        # 配置后缀
+        file-extension: yaml
+        shared-configs[0]:
+          dataId: public_config_public.yaml
+        shared-configs[1]:
+          dataId: public_config_oracle.yaml
+        shared-configs[2]:
+          dataId: public_config_ftp.yaml
+        shared-configs[3]:
+          dataId: public_config_redis.yaml
+        username: nacos
+        password: nacos
+      discovery:
+        # nacos配置中心指定空间
+        namespace: tofly-zmrq
+        # nacos部署IP
+        server-addr: 192.168.2.6:8848
+      username: nacos
+      password: nacos
+  application:
+    # 该应用在nacos配置中的名称
+    name: tofly-flow-wz
+logging:
+  level:
+    com.alibaba.nacos.client.config.impl: WARN
+

+ 1 - 1
workflow/src/main/resources/mapper/baseconf/TfCalendarPMapper.xml

@@ -31,7 +31,7 @@
     <select id="getCalendar" resultType="com.tofly.workflow.baseconf.entity.vo.CalendarVo">
         SELECT DATA_TIME,TYPE
         FROM  TF_CALENDAR_YEAR_P y LEFT JOIN TF_CALENDAR_P c ON (y.ID = c.YEAR_ID)
-        WHERE y.IS_DEL = 0 AND (c.IS_DEL = 0 OR c.is_del is null)
+        WHERE  (c.IS_DEL = 0 OR c.is_del is null)
         <choose>
             <when test="tenantId != null">
                 AND TENANT_ID = #{tenantId}

+ 5 - 0
workflow/src/main/resources/mapper/buss/TfProjectBaseWMapper.xml

@@ -183,5 +183,10 @@
     <select id="getProjectTypeValue" resultType="java.lang.Integer">
         SELECT d.VALUE FROM TF_PROJECT_BASE_W b LEFT JOIN SYS_DICT d ON(b.PROJECT_NATURE = d.ID) WHERE b.PROCESS_ID = #{processId}
     </select>
+    <select id="getProjectUserType" resultType="java.lang.String">
+
+        SELECT d.VALUE FROM TF_PROJECT_BASE_W b LEFT JOIN SYS_DICT d ON(b.USER_TYPE = d.ID) WHERE b.PROCESS_ID = #{processId}
+
+    </select>
 
 </mapper>

+ 23 - 2
workflow/src/main/resources/mapper/process/TfProcessLMapper.xml

@@ -123,22 +123,43 @@
     </select>
 
     <select id="getMaterialNodeById" resultType="com.tofly.workflow.process.entity.vo.ProcessMaterialVo">
-        SELECT p.ID PROCESS_ID,p.RELATION_ID,p.TENANT_ID,b.b.PROCESS_NUMBER,b.PROJECT_NAME,b.USER_TYPE,b.DUTY_USER,du.REAL_NAME DUTY_USER_NAME,n.ID NODE_ID,n.OUTCOME ACCESS_ID, a.YY_WZ_ID WAREHOUSE,ao.YY_WZ_ID OUT_WAREHOUSE,n.STAFF_ID,u.REAL_NAME STAFF_NAME,n.data_time
+        SELECT p.ID PROCESS_ID,p.RELATION_ID,p.TENANT_ID,b.b.PROCESS_NUMBER,	b.addre addr ,	hdu.job_number handle_user ,	sd.code  deptCode,b.PROJECT_NAME,b.USER_TYPE,b.DUTY_USER,du.REAL_NAME DUTY_USER_NAME,n.ID NODE_ID,n.OUTCOME ACCESS_ID, a.YY_WZ_ID WAREHOUSE,ao.YY_WZ_ID OUT_WAREHOUSE,n.STAFF_ID,u.REAL_NAME STAFF_NAME,n.data_time
         FROM TF_PROCESS_L p LEFT JOIN TF_PROCESS_NODE_L n ON (p.ID = n.PROCESS_ID)
                             LEFT JOIN TF_PROJECT_BASE_W b ON (p.RELATION_ID = b.PROCESS_ID)
                             LEFT JOIN TF_MATTER_ACCESS_P a ON (n.OUTCOME = a.ID)
                             LEFT JOIN TF_MATTER_ACCESS_P ao ON (n.ONE_ID = ao.ID)
                             LEFT JOIN SYS_USER u ON (n.STAFF_ID = u.ID)
+                            LEFT JOIN SYS_USER hdu ON (n.handle_user = hdu.ID )
                             LEFT JOIN SYS_USER du ON (b.DUTY_USER = du.ID)
+                            left join ZMRQ.SYS_USER_DEPT dept  on n.handle_user = dept.user_id
+                            left join sys_dept sd on dept.dept_id = sd.id
         WHERE p.IS_DEL = 0 AND p.PROCESS_STATE = 4 AND n.IS_VALID = 1 AND n.IS_DEL = 0 AND n.PROCESS_STEP = 1 AND n.STEP_NODE = 1
         AND p.ID = #{id}
     </select>
     <select id="getProcessIdWithOutPush" resultType="java.lang.Long">
 
-        select *from tf_process_l where process_number like 'clly%' and id not in (select process_id from tf_material_out_in_w )
+        select *from tf_process_l where process_number like 'clly%'
+                                    and id not in (select process_id from tf_material_out_in_w )
 
 
 
     </select>
+    <select id="findProcessLastCheckTime" resultType="java.util.Date">
+
+        SELECT  max(node.HANDLE_TIME)
+        from TF_PROCESS_NODE_L node left join TF_PROCESS_L p on node.process_id = p.id
+                                    LEFT JOIN TF_NOW_HANDLE_L n  on (node.PROCESS_ID = n.PROCESS_ID and  node.LABEL = n.LABEL)
+        where node.LABEL = 1571328373371297794  and node.PROCESS_ID =#{processId} and n.id is null
+
+
+
+    </select>
+    <select id="findCompleteTime" resultType="java.util.Date">
+
+        SELECT max(HANDLE_TIME) from TF_PROCESS_NODE_L where process_id = #{processId}
+
+
+    </select>
+
 
 </mapper>

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 75 - 3
workflow/src/test/java/com/tofly/workflow/FlowApplicationTest.java