lipenghui 1 månad sedan
förälder
incheckning
5af1a3b342
28 ändrade filer med 600 tillägg och 54 borttagningar
  1. 17 0
      yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java
  2. 19 0
      yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/io/FileUtils.java
  3. 10 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/failure/IotFailureReportController.java
  4. 4 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/failure/vo/IotFailureReportSaveReqVO.java
  5. 26 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/IotMaintainController.java
  6. 27 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/vo/IotMaintainRespVO.java
  7. 21 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/vo/IotMaintainSaveReqVO.java
  8. 2 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/stat/IotStaticController.java
  9. 2 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/failure/IotFailureReportDO.java
  10. 30 8
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/maintain/IotMaintainDO.java
  11. 2 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/IotOperationPlanJob.java
  12. 24 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/oa/OaPeopleJob.java
  13. 24 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/oa/CallBackOaVo.java
  14. 106 13
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/oa/OaFlow.java
  15. 2 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/failure/IotFailureReportService.java
  16. 26 3
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/failure/IotFailureReportServiceImpl.java
  17. 5 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainService.java
  18. 179 16
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainServiceImpl.java
  19. 2 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java
  20. 12 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java
  21. 15 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java
  22. 5 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java
  23. 1 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java
  24. 8 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java
  25. 2 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java
  26. 15 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
  27. 10 6
      yudao-server/src/main/resources/application-dev.yaml
  28. 4 0
      yudao-server/src/main/resources/application-prod.yaml

+ 17 - 0
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java

@@ -322,4 +322,21 @@ public class DateUtils {
             );
             return mergedDateTime;
         }
+
+        public static String convertTimeToString(String time) {
+            // 定义时间戳(毫秒级)
+            long timestamp = Long.parseLong(time);
+
+            // 转换步骤:
+            // 1. 将时间戳转为Instant对象
+            Instant instant = Instant.ofEpochMilli(timestamp);
+            // 2. 转换为本地日期(默认时区,也可指定如ZoneId.of("Asia/Shanghai"))
+            LocalDate localDate = instant.atZone(ZoneId.systemDefault()).toLocalDate();
+            // 3. 定义格式化器
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            // 4. 格式化日期
+            String dateStr = localDate.format(formatter);
+
+            return dateStr;
+        }
 }

+ 19 - 0
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/io/FileUtils.java

@@ -7,6 +7,7 @@ import cn.hutool.core.io.file.FileNameUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.digest.DigestUtil;
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
 import lombok.SneakyThrows;
@@ -15,6 +16,7 @@ import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Date;
 
@@ -115,5 +117,22 @@ public class FileUtils {
         }
     }
 
+    public static String getFileNameByUrlParse(String urlPath)  {
+        // 1. 解析 URL 路径,获取完整路径部分(path)
+        URL url = null;
+        try {
+            url = new URL(urlPath);
+        } catch (MalformedURLException e) {
+            throw new ServiceException(new ErrorCode(100,"文件名称解析错误"));
+        }
+        String fullPath = url.getPath(); // 示例:/admin-api/infra/file/29/get/wechat_2025-08-19_221137_550.png
 
+        // 2. 找到最后一个 "/" 的位置,截取其后的字符串(即文件名)
+        int lastSlashIndex = fullPath.lastIndexOf("/");
+        if (lastSlashIndex == -1) {
+            // 若路径中无 "/",则整个路径视为文件名(极端场景,如:https://example.com/filename.png)
+            return fullPath;
+        }
+        return fullPath.substring(lastSlashIndex + 1);
+    }
 }

+ 10 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/failure/IotFailureReportController.java

@@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.failure.vo.IotFailureReportS
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainSaveVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.failure.IotFailureReportDO;
 import cn.iocoder.yudao.module.pms.service.failure.IotFailureReportService;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
@@ -121,4 +122,13 @@ public class IotFailureReportController {
         iotFailureReportProcessVO.setAssigneeUserId(Long.valueOf(assigneeUserId));
         return success(iotFailureReportService.updateIotFailureReportProcess(iotFailureReportProcessVO));
     }
+
+    @GetMapping("/get/approval")
+    @Operation(summary = "获得故障上报")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rq:iot-failure-report:query')")
+    public CommonResult<List<AdminUserRespDTO>> getApproval() {
+        List<AdminUserRespDTO> approval = iotFailureReportService.getApproval();
+        return success(approval);
+    }
 }

+ 4 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/failure/vo/IotFailureReportSaveReqVO.java

@@ -73,4 +73,8 @@ public class IotFailureReportSaveReqVO {
 
     @Schema(description = "设备编码")
     private String deviceCode;
+
+    /**审批人id*/
+    @Schema(description = "审批人id逗号分隔")
+    private String approvalId;
 }

+ 26 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/IotMaintainController.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.pms.controller.admin.maintain;
 
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
@@ -15,7 +16,9 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.failure.IotFailureReportDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.oa.IotOaPersonDO;
 import cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant;
+import cn.iocoder.yudao.module.pms.oa.CallBackOaVo;
 import cn.iocoder.yudao.module.pms.service.IotDeviceService;
 import cn.iocoder.yudao.module.pms.service.failure.IotFailureReportService;
 import cn.iocoder.yudao.module.pms.service.maintain.IotMaintainBomService;
@@ -196,4 +199,27 @@ public class IotMaintainController {
         return success(userListByDept);
 
     }
+
+    @GetMapping("/maintain/applyusers")
+    @PreAuthorize("@ss.hasPermission('system:user:query')")
+    public CommonResult<List<IotOaPersonDO>> getApplyUsers(@RequestParam("id") String id) {
+        List<IotOaPersonDO> maintainPerson = iotMaintainService.getMaintainPerson(id);
+        return success(maintainPerson);
+    }
+    @GetMapping("/maintain/project")
+    @PreAuthorize("@ss.hasPermission('system:user:query')")
+    public CommonResult<List<IotOaPersonDO>> getProjectUsers(@RequestParam("id") String id) {
+        List<IotOaPersonDO> maintainPerson = iotMaintainService.getProjectPerson(id);
+        return success(maintainPerson);
+    }
+
+    @PostMapping("/oa")
+    @PreAuthorize("@ss.hasPermission('system:oa:query')")
+    public CommonResult<String> getProjectUsers(@RequestBody CallBackOaVo callBackOaVo) {
+        if (StringUtils.isBlank(callBackOaVo.getRequestId())||StringUtils.isBlank(callBackOaVo.getIfSuccess())||Objects.isNull(callBackOaVo.getMainData())){
+            throw new ServiceException(new ErrorCode(200, "参数缺失"));
+        }
+        iotMaintainService.oaDeal(callBackOaVo);
+        return success("成功");
+    }
 }

+ 27 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/vo/IotMaintainRespVO.java

@@ -109,7 +109,7 @@ public class IotMaintainRespVO {
     /**
      * 供应商
      */
-    private Long supplier;
+    private String supplier;
     /**
      * 委外附件
      */
@@ -130,4 +130,30 @@ public class IotMaintainRespVO {
     private LocalDateTime executeDate;
     private List<String> pics;
     private List<String> outFiles;
+
+    private String creator;
+    private String maintainPersonName;
+    /**申请人id*/
+    private String applyPersonId;
+    /**申请部门id*/
+    private String applyDeptId;
+    /**规格型号*/
+    private String model;
+    /**启用日期*/
+    private String enableDate;
+    /**维修类别*/
+    private String maintainClassify;
+
+    /**运转公里/小时*/
+    private String kmHour;
+    /**维修地点*/
+    private String address;
+    /**项目经理*/
+    private String projectManager;
+    /**oa流程单号*/
+    private String oaFlowNo;
+    /**维修项目*/
+    private String maintainItem;
+    /**oa返回的请求id*/
+    private String requestId;
 }

+ 21 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/vo/IotMaintainSaveReqVO.java

@@ -87,7 +87,7 @@ public class IotMaintainSaveReqVO {
     /**
      * 供应商
      */
-    private Long supplier;
+    private String supplier;
     /**
      * 委外附件
      */
@@ -106,4 +106,24 @@ public class IotMaintainSaveReqVO {
 
     private List<String> pics;
     private List<String> outFiles;
+
+    /**申请人id*/
+    private String applyPersonId;
+    /**申请部门id*/
+    private String applyDeptId;
+    /**规格型号*/
+    private String model;
+    /**启用日期*/
+    private String enableDate;
+    /**维修类别*/
+    private String maintainClassify;
+
+    /**运转公里/小时*/
+    private String kmHour;
+    /**维修地点*/
+    private String address;
+    /**项目经理*/
+    private String projectManager;
+
+    private String maintainItem;
 }

+ 2 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/stat/IotStaticController.java

@@ -427,9 +427,10 @@ public class IotStaticController {
             depts = deptApi.getDeptByName(dto.getName());
         }
         if (CollUtil.isNotEmpty(depts)) {
+            Long deptId = depts.get(0).getId();
             if (Objects.nonNull(depts.get(0).getId())) {
                 ids = deptService.getChildDeptIdListFromCache(depts.get(0).getId());
-                ids.add(depts.get(0).getId());
+                ids.add(deptId);
             }
         }
         return  ids;

+ 2 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/failure/IotFailureReportDO.java

@@ -108,4 +108,6 @@ public class IotFailureReportDO extends BaseDO {
     private String type;
 
     private String deviceCode;
+    /**审批人id*/
+    private String approvalId;
 }

+ 30 - 8
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/maintain/IotMaintainDO.java

@@ -1,16 +1,13 @@
 package cn.iocoder.yudao.module.pms.dal.dataobject.maintain;
 
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;
 
 import java.math.BigDecimal;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
 import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.*;
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 
 /**
  * 维修工单 DO
@@ -128,7 +125,7 @@ public class IotMaintainDO extends BaseDO {
     /**
      * 供应商
      */
-    private Long supplier;
+    private String supplier;
     /**
      * 委外附件
      */
@@ -144,4 +141,29 @@ public class IotMaintainDO extends BaseDO {
     private String maintainPersonName;
 
     private LocalDateTime executeDate;
+    /**申请人id*/
+    private String applyPersonId;
+    /**申请部门id*/
+    private String applyDeptId;
+    /**规格型号*/
+    private String model;
+    /**启用日期*/
+    private String enableDate;
+    /**维修类别*/
+    private String maintainClassify;
+
+    /**运转公里/小时*/
+    private String kmHour;
+    /**维修地点*/
+    private String address;
+    /**项目经理*/
+    private String projectManager;
+    /**oa流程单号*/
+    private String oaFlowNo;
+    /**维修项目*/
+    private String maintainItem;
+    /**oa返回的请求id*/
+    private String requestId;
+    /**请求意见*/
+    private String suggestionJson;
 }

+ 2 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/IotOperationPlanJob.java

@@ -40,7 +40,7 @@ import static cn.iocoder.yudao.module.pms.framework.config.MultiThreadConfigurat
  * @date 2025/5/11 10:26
  * @description
  */
-@Component
+//@Component
 @Slf4j
 public class IotOperationPlanJob implements JobHandler {
 
@@ -265,4 +265,4 @@ public class IotOperationPlanJob implements JobHandler {
         System.out.println("*****************插入运行记录设备表完成***********************");
     }
 
-}
+}

+ 24 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/oa/OaPeopleJob.java

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.pms.job.oa;
+
+import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
+import cn.iocoder.yudao.module.pms.oa.OaFlow;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class OaPeopleJob implements JobHandler {
+    @Autowired
+    private OaFlow oaFlow;
+
+    @Override
+    @TenantIgnore
+    public String execute(String param) throws Exception {
+        oaFlow.getCompany();
+        oaFlow.getDepart();
+        oaFlow.getPerson();
+        return "";
+    }
+}

+ 24 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/oa/CallBackOaVo.java

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.pms.oa;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class CallBackOaVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String requestId;
+    private String ifSuccess;
+    private String flowNo;
+    private List<ApprovalInfo> mainData;
+
+    @Data
+    public static class ApprovalInfo{
+        private String userId;
+        private String name;
+        private String message;
+        private Integer index;
+    }
+}

+ 106 - 13
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/oa/OaFlow.java

@@ -1,27 +1,38 @@
 package cn.iocoder.yudao.module.pms.oa;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
+import cn.iocoder.yudao.framework.common.util.io.FileUtils;
+import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.oa.IotOaCompanyDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.oa.IotOaDepartDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.oa.IotOaPersonDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.maintain.IotMaintainMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.oa.IotOaCompanyMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.oa.IotOaDepartMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.oa.IotOaPersonMapper;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Component;
-import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Component
@@ -29,6 +40,7 @@ public class OaFlow {
     private final IotOaCompanyMapper iotOaCompanyMapper;
     private final IotOaDepartMapper iotOaDepartMapper;
     private final IotOaPersonMapper iotOaPersonMapper;
+    private final IotMaintainMapper iotMaintainMapper;
     @Value("${oa.appid}")
     private String appid;
     @Value("${oa.cpk}")
@@ -43,13 +55,21 @@ public class OaFlow {
     private String departmentUrl;
     @Value("${oa.userUrl}")
     private String userUrl;
+    @Value("${oa.workflowId}")
+    private String workflowId;
+    @Value("${oa.requestName}")
+    private String requestName;
+    @Value("${oa.outMaintain}")
+    private String outMaintainUrl;
+
     private static String spk = "";
     private static String secret = "";
 
-    public OaFlow(IotOaCompanyMapper iotOaCompanyMapper, IotOaDepartMapper iotOaDepartMapper, IotOaPersonMapper iotOaPersonMapper) {
+    public OaFlow(IotOaCompanyMapper iotOaCompanyMapper, IotOaDepartMapper iotOaDepartMapper, IotOaPersonMapper iotOaPersonMapper, IotMaintainMapper iotMaintainMapper) {
         this.iotOaCompanyMapper = iotOaCompanyMapper;
         this.iotOaDepartMapper = iotOaDepartMapper;
         this.iotOaPersonMapper = iotOaPersonMapper;
+        this.iotMaintainMapper = iotMaintainMapper;
     }
 
 
@@ -186,16 +206,89 @@ public class OaFlow {
                     //先删除
                     List<Long> ids = iotOaPersonMapper.selectList().stream().map(IotOaPersonDO::getId).collect(Collectors.toList());
                     iotOaPersonMapper.deleteByIds(ids);
-                    JSON.parseArray(resultJson.get("dataList").toString(), IotOaPersonDO.class).forEach(item -> {
-                        IotOaPersonDO iotOaPersonDO = new IotOaPersonDO();
-                        BeanUtils.copyProperties(item, iotOaPersonDO);
-                        iotOaPersonDO.setOaId(String.valueOf(iotOaPersonDO.getId()));
-                        iotOaPersonDO.setId(null);
-                        iotOaPersonDO.setDeleted(false);
-                        iotOaPersonMapper.insert(iotOaPersonDO);
+                    TenantUtils.execute(1L, () -> {
+                        JSON.parseArray(resultJson.get("dataList").toString(), IotOaPersonDO.class).forEach(item -> {
+                            IotOaPersonDO iotOaPersonDO = new IotOaPersonDO();
+                            BeanUtils.copyProperties(item, iotOaPersonDO);
+                            iotOaPersonDO.setOaId(String.valueOf(iotOaPersonDO.getId()));
+                            iotOaPersonDO.setId(null);
+                            iotOaPersonDO.setDeleted(false);
+                            iotOaPersonMapper.insert(iotOaPersonDO);
+                        });
                     });
                 }
             }
         }
     }
+
+
+    public void createOutRepairFlow(IotMaintainDO iotMaintainDO) throws Exception {
+        String token = getToken();
+        HttpHeaders headersOut = new HttpHeaders();
+        headersOut.add("token", token);
+        headersOut.add("appid", appid);
+        String person = E9ApiTokenUtil.encryptString(spk, iotMaintainDO.getApplyPersonId());
+        headersOut.add("userid", person);
+
+        OutRepairFlow flow = new OutRepairFlow().setFieldName("xmjl").setFieldValue(iotMaintainDO.getProjectManager());
+        OutRepairFlow flow1 = new OutRepairFlow().setFieldName("sqr").setFieldValue(iotMaintainDO.getApplyPersonId());
+        List<IotOaPersonDO> dos = iotOaPersonMapper.selectList("oa_id", iotMaintainDO.getApplyPersonId());
+        if (CollUtil.isEmpty(dos)) {
+            throw new ServiceException(new ErrorCode(111, "不存在oa部门"));
+        }
+        OutRepairFlow flow2 = new OutRepairFlow().setFieldName("sqbm").setFieldValue(dos.get(0).getDepartmentid());
+        OutRepairFlow flow3 = new OutRepairFlow().setFieldName("sqrq").setFieldValue(DateUtil.format(new Date(), DatePattern.NORM_DATE_PATTERN));
+        OutRepairFlow flow4 = new OutRepairFlow().setFieldName("clxh").setFieldValue(iotMaintainDO.getDeviceName());
+        OutRepairFlow flow5 = new OutRepairFlow().setFieldName("cph").setFieldValue(iotMaintainDO.getDeviceName());
+        OutRepairFlow flow6 = new OutRepairFlow().setFieldName("wxyy").setFieldValue(iotMaintainDO.getMaintainDescription());
+        OutRepairFlow flow7 = new OutRepairFlow().setFieldName("ygjey").setFieldValue(String.valueOf(iotMaintainDO.getMaintainFee()));
+        OutRepairFlow flow8 = new OutRepairFlow().setFieldName("wxdd").setFieldValue(Objects.isNull(iotMaintainDO.getAddress())?"": iotMaintainDO.getAddress());
+        OutRepairFlow flow9 = new OutRepairFlow().setFieldName("ggxh").setFieldValue(String.valueOf(iotMaintainDO.getModel()));
+        OutRepairFlow flow10 = new OutRepairFlow().setFieldName("qyrq").setFieldValue(StringUtils.substring(iotMaintainDO.getEnableDate(), 0,10));
+        OutRepairFlow flow11 = new OutRepairFlow().setFieldName("wxlb").setFieldValue(String.valueOf(iotMaintainDO.getMaintainClassify()));
+        OutRepairFlow flow12 = new OutRepairFlow().setFieldName("yzglxs").setFieldValue(Objects.isNull(iotMaintainDO.getKmHour())?"": iotMaintainDO.getKmHour());
+        OutRepairFlow flow13 = new OutRepairFlow().setFieldName("wxcj").setFieldValue(String.valueOf(iotMaintainDO.getSupplier()));
+        OutRepairFlow flow14 = new OutRepairFlow().setFieldName("gzms").setFieldValue(String.valueOf(iotMaintainDO.getDescription()));
+        OutRepairFlow flow15 = new OutRepairFlow().setFieldName("wxxm").setFieldValue(String.valueOf(iotMaintainDO.getMaintainItem()));
+        List<String> strings = JSON.parseArray(iotMaintainDO.getOutFile(), String.class);
+        List<ImmutableMap> files = new ArrayList<>();
+        strings.forEach(e ->{
+            String fileName = FileUtils.getFileNameByUrlParse(e);
+            files.add(ImmutableMap.of("filePath", e,"fileName", fileName));
+        });
+
+        OutRepairFlow flow16 = new OutRepairFlow().setFieldName("fjsc").setFieldValue(JSON.toJSONString(files));
+        OutRepairFlow flow17 = new OutRepairFlow().setFieldName("sfdy").setFieldValue("1");
+        ImmutableList<OutRepairFlow> outRepairFlows = ImmutableList.of(flow16,flow12, flow3, flow4, flow5, flow6, flow7, flow8, flow9, flow10, flow11, flow2, flow, flow14, flow1, flow15, flow13,flow17);
+
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("workflowId", workflowId);
+        params.put("requestName", requestName);
+        params.put("mainData", outRepairFlows);
+        // 3. 组合请求头和请求体
+        HttpEntity<Map<String, Object>> requestEntityOut = new HttpEntity<>(params, headersOut);
+        RestTemplate restTemplate = SslSkippingRestTemplate.createRestTemplate();
+        String out = restTemplate.postForObject(outMaintainUrl, requestEntityOut, String.class);
+        JSONObject outInfo = JSON.parseObject(out);
+        //请求成功
+        if (Objects.isNull(outInfo) || !"success".equalsIgnoreCase(String.valueOf(outInfo.get("code")))) {
+            throw new ServiceException(new ErrorCode(777, "发起oa流程失败"));
+        }
+        JSONObject jsonObject = JSON.parseObject(outInfo.get("data").toString());
+        String requestid = String.valueOf(jsonObject.get("requestid"));
+        iotMaintainDO.setRequestId(requestid);
+        iotMaintainMapper.updateById(iotMaintainDO);
+
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class OutRepairFlow {
+        private String fieldName;
+        private String fieldValue;
+    }
+
 }

+ 2 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/failure/IotFailureReportService.java

@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.failure.vo.IotFailureReportP
 import cn.iocoder.yudao.module.pms.controller.admin.failure.vo.IotFailureReportProcessVO;
 import cn.iocoder.yudao.module.pms.controller.admin.failure.vo.IotFailureReportSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.failure.IotFailureReportDO;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 
 /**
  * 故障上报 Service 接口
@@ -50,6 +51,7 @@ public interface IotFailureReportService {
      * @return 故障上报
      */
     IotFailureReportDO getIotFailureReport(Long id);
+    List<AdminUserRespDTO> getApproval();
 
     /**
      * 获得故障上报分页

+ 26 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/failure/IotFailureReportServiceImpl.java

@@ -33,6 +33,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import com.google.common.collect.ImmutableList;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -130,12 +131,18 @@ public class IotFailureReportServiceImpl implements IotFailureReportService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String submitForApproval(Long id) {
-//        IotFailureReportDO iotFailureReportDO = iotFailureReportMapper.selectById(id);
+        IotFailureReportDO iotFailureReportDO = iotFailureReportMapper.selectById(id);
 //        if (Objects.isNull(iotFailureReportDO)) {throw new ServiceException(IOT_FAILURE_REPORT_NOT_EXISTS);}
         // 发起BPM流程
         // 获取当前登录人信息
+        Map<String, List<Long>> assigness = new HashMap<>();
+        List<Long> approvalIds = new ArrayList<>();
+        for (String s : iotFailureReportDO.getApprovalId().split(",")) {
+            approvalIds.add(Long.parseLong(s));
+        }
+        assigness.put(PROCESS_KEY, approvalIds);
         String processInstanceId = processInstanceApi.createProcessInstance(SecurityFrameworkUtils.getLoginUserId(),
-                new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY).setBusinessKey(String.valueOf(id)));
+                new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY).setBusinessKey(String.valueOf(id)).setStartUserSelectAssignees(assigness));
         // 将流程实例id 更新到 供应商主数据表
         iotFailureReportMapper.updateById(new IotFailureReportDO().setId(id).setProcessInstanceId(processInstanceId).setAuditStatus(FailureAuditStatusEnum.PROCESS.getStatus()));
         return processInstanceId;
@@ -163,11 +170,13 @@ public class IotFailureReportServiceImpl implements IotFailureReportService {
             iotFailureReportMapper.insert(iotFailureReport);
         } else {
             iotFailureReport.setStatus("reporting");
+            if (StringUtils.isBlank(createReqVO.getApprovalId())||Objects.isNull(iotFailureReport.getApprovalId())) {
+                throw new ServiceException(new ErrorCode(111,"审批人未填"));
+            }
             iotFailureReport.setAuditStatus(FailureAuditStatusEnum.PROCESS.getStatus());
             iotFailureReportMapper.insert(iotFailureReport);
             //直接发起流程
             String processInstanceId = submitForApproval(iotFailureReport.getId());
-//            sendMessage(iotFailureReport,processInstanceId);
         }
         // 返回
         return iotFailureReport.getId();
@@ -233,6 +242,20 @@ public class IotFailureReportServiceImpl implements IotFailureReportService {
         return iotFailureReportMapper.selectById(id);
     }
 
+    @Override
+    public List<AdminUserRespDTO> getApproval() {
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserRespDTO user = adminUserApi.getUser(loginUserId);
+        if (Objects.isNull(user)) {throw new ServiceException(111,"无该用户");}
+        DeptRespDTO dept = deptApi.getDept(user.getDeptId());
+        if (Objects.isNull(dept)) {throw new ServiceException(111,"无该部门");}
+
+        List<Long> deptIds = deptApi.getChildDeptList(dept.getParentId()).stream().map(DeptRespDTO::getId).collect(Collectors.toList());
+        deptIds.add(dept.getParentId());
+        List<AdminUserRespDTO> userListByDeptId = adminUserApi.getUserListByDeptIdsNew(deptIds);
+        return userListByDeptId;
+    }
+
     @Override
     public PageResult<IotFailureReportDO> getIotFailureReportPage(IotFailureReportPageReqVO pageReqVO) {
         Set<Long> ids = new HashSet<>();

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainService.java

@@ -14,6 +14,8 @@ import cn.iocoder.yudao.module.pms.controller.admin.stat.IotStaticController;
 import cn.iocoder.yudao.module.pms.controller.admin.stat.vo.OrderVo;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.material.IotMaintainMaterialDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.oa.IotOaPersonDO;
+import cn.iocoder.yudao.module.pms.oa.CallBackOaVo;
 
 /**
  * 维修工单 Service 接口
@@ -21,6 +23,9 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.material.IotMaintainM
  * @author phli
  */
 public interface IotMaintainService {
+    void oaDeal(CallBackOaVo callBackOaVo);
+    List<IotOaPersonDO> getMaintainPerson(String id);
+    List<IotOaPersonDO> getProjectPerson(String id);
     PageResult<OrderVo> getNotice(OrderVo pageReqVO);
     void approvalMaintain(Long businessKey, Integer bpmStatus);
     Long submitForApproval(Long id);

+ 179 - 16
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainServiceImpl.java

@@ -12,23 +12,20 @@ import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
 import cn.iocoder.yudao.module.pms.controller.admin.failure.vo.IotFailureReportProcessVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.bom.vo.IotMaintainBomSaveReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.maintain.material.vo.IotMaintainMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainSaveVO;
-import cn.iocoder.yudao.module.pms.controller.admin.stat.IotStaticController;
 import cn.iocoder.yudao.module.pms.controller.admin.stat.vo.OrderVo;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotProductClassifyDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.failure.IotFailureReportDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.information.IotInformationDbDO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.inspect.IotInspectRouteDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotlockstock.IotLockStockDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotoutbound.IotOutboundDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainMaterialsDO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.material.IotMaintainMaterialDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.oa.IotOaPersonDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.failure.IotFailureReportMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.information.IotInformationDbMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotlockstock.IotLockStockMapper;
@@ -37,7 +34,11 @@ import cn.iocoder.yudao.module.pms.dal.mysql.maintain.IotMaintainBomMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.maintain.IotMaintainMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.maintain.IotMaintainMaterialsMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.maintain.material.IotMaintainMaterialMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.oa.IotOaPersonMapper;
 import cn.iocoder.yudao.module.pms.enums.common.FailureAuditStatusEnum;
+import cn.iocoder.yudao.module.pms.oa.CallBackOaVo;
+import cn.iocoder.yudao.module.pms.oa.OaFlow;
+import cn.iocoder.yudao.module.pms.oa.OaVo;
 import cn.iocoder.yudao.module.pms.service.IotDeviceService;
 import cn.iocoder.yudao.module.pms.service.IotProductClassifyService;
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
@@ -47,7 +48,6 @@ import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
 import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
-import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -64,9 +64,11 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.*;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_MAINTAIN_BOMS_NOT_EXISTS;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_MAINTAIN_NOT_EXISTS;
 
 /**
  * 维修工单 Service 实现类
@@ -109,6 +111,10 @@ public class IotMaintainServiceImpl implements IotMaintainService {
     private IotInformationDbMapper iotInformationDbMapper;
     @Resource
     private DeptService deptService;
+    @Autowired
+    private IotOaPersonMapper iotOaPersonMapper;
+    @Autowired
+    private OaFlow oaFlow;
 
     @Override
     public void approvalMaintain(Long businessKey, Integer bpmStatus) {
@@ -152,9 +158,11 @@ public class IotMaintainServiceImpl implements IotMaintainService {
         IotMaintainDO iotMaintain = BeanUtils.toBean(createReqVO.getMaintain(), IotMaintainDO.class);
         iotMaintain.setFailureCode("GZ"+ DateUtil.format(new Date(), "yyyyMMddHHmmss"));
         iotMaintain.setFailureName(createReqVO.getMaintain().getDeviceCode()+createReqVO.getMaintain().getDeviceName()+DateUtil.format(new Date(), "yyyyMMddHHmmss"));
-//        if (Objects.nonNull(iotMaintain.getAuditStatus())&&iotMaintain.getAuditStatus()==20&&"out".equals(iotMaintain.getType())){
+        if ("out".equals(iotMaintain.getType())){
+            iotMaintain.setStatus("oa");
+        } else {
             iotMaintain.setStatus("finished");
-//        }
+        }
         iotMaintain.setDeleted(false);
         iotMaintain.setMaintainPerson(SecurityFrameworkUtils.getLoginUserId());
         if (Objects.isNull(SecurityFrameworkUtils.getLoginUserId())) throw new ServiceException(new ErrorCode(11,"责任人id不存在"));
@@ -201,14 +209,13 @@ public class IotMaintainServiceImpl implements IotMaintainService {
 //            sendMessage(BeanUtils.toBean(iotMaintain, IotMaintainDO.class), "maintain-report", msg);
 //        }
         //如果委外发起流程
-//        if ("out".equals(createReqVO.getMaintain().getType())){
-//            String processInstanceId = processInstanceApi.createProcessInstance(SecurityFrameworkUtils.getLoginUserId(),
-//                    new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY).setBusinessKey(String.valueOf(iotMaintain.getId())));
-//            // 将流程实例id 更新到维修工单主数据表
-//            iotMaintainMapper.updateById(new IotMaintainDO().setId(iotMaintain.getId()).setProcessInstanceId(processInstanceId).setAuditStatus(FailureAuditStatusEnum.PROCESS.getStatus()));
-//            String msg = "【PMS】有新的委外维修流程, 请前往系统审批";
-////            sendMessage(BeanUtils.toBean(iotMaintain, IotMaintainDO.class), "maintain-out", msg);
-//        }
+        if ("out".equals(createReqVO.getMaintain().getType())){
+            try {
+                oaFlow.createOutRepairFlow(iotMaintain);
+            } catch (Exception e) {
+                throw new ServiceException(122, e.getMessage());
+            }
+        }
         //异步写入故障知识库
         CompletableFuture.runAsync(()->{
             IotDeviceDO iotDevice = iotDeviceService.getIotDevice(iotMaintain.getDeviceId());
@@ -420,4 +427,160 @@ public class IotMaintainServiceImpl implements IotMaintainService {
         IPage<OrderVo> notices = iotMaintainMapper.selectNotice(Page.of(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO);
         return new PageResult<>(notices.getRecords(), notices.getTotal());
     }
+
+
+    @Override
+    public void oaDeal(CallBackOaVo callBackOaVo) {
+        List<IotMaintainDO> iotMaintainDOS = iotMaintainMapper.selectList("request_id", callBackOaVo.getRequestId());
+        if (CollUtil.isEmpty(iotMaintainDOS)) {
+            throw new ServiceException(new ErrorCode(300,"无该流程"));
+        }
+        IotMaintainDO iotMaintainDO = iotMaintainDOS.get(0);
+        iotMaintainDO.setOaFlowNo(callBackOaVo.getFlowNo());
+        if ("0".equals(callBackOaVo.getIfSuccess())){
+            iotMaintainDO.setStatus("oareject");
+        } else {
+            iotMaintainDO.setStatus("finished");
+        }
+        iotMaintainDO.setSuggestionJson(JSON.toJSONString(callBackOaVo.getMainData()));
+//        List<OaVo.MainData> mainData = callBackOaVo.getMainData();
+//        mainData.forEach(e -> {
+//            if ("wxyy".equals(e.getFieldName())&&!iotMaintainDO.getMaintainDescription().equals(e.getFieldValue())) {
+//                iotMaintainDO.setMaintainDescription(e.getFieldValue());
+//            } else if ("ygjey".equals(e.getFieldName())&&!iotMaintainDO.getMaintainFee().toString().equals(e.getFieldValue())){
+//                iotMaintainDO.setMaintainFee(new BigDecimal(e.getFieldValue()));
+//            } else if ("wxdd".equals(e.getFieldName())&&!iotMaintainDO.getAddress().equals(e.getFieldValue())){
+//                iotMaintainDO.setAddress(e.getFieldValue());
+//            } else if ("ggxh".equals(e.getFieldName())&&!iotMaintainDO.getModel().equals(e.getFieldValue())) {
+//                iotMaintainDO.setModel(e.getFieldValue());
+//            } else if ("qyrq".equals(e.getFieldName())&&!iotMaintainDO.getEnableDate().equals(e.getFieldValue())) {
+//                iotMaintainDO.setEnableDate(e.getFieldValue());
+//            } else if ("wxlb".equals(e.getFieldName())&&!iotMaintainDO.getMaintainClassify().equals(e.getFieldValue())) {
+//                iotMaintainDO.setMaintainClassify(e.getFieldValue());
+//            } else if ("yzglxs".equals(e.getFieldName())&&!iotMaintainDO.getKmHour().equals(e.getFieldValue())) {
+//                iotMaintainDO.setKmHour(e.getFieldValue());
+//            } else if ("wxcj".equals(e.getFieldName())&&!iotMaintainDO.getSupplier().equals(e.getFieldValue())) {
+//                iotMaintainDO.setSupplier(e.getFieldValue());
+//            } else if ("gzms".equals(e.getFieldName())&&!iotMaintainDO.getDescription().equals(e.getFieldValue())) {
+//                iotMaintainDO.setDescription(e.getFieldValue());
+//            } else if ("wxxm".equals(e.getFieldName())&&!iotMaintainDO.getMaintainItem().equals(e.getFieldValue())) {
+//                iotMaintainDO.setMaintainItem(e.getFieldValue());
+//            }
+//        });
+        iotMaintainMapper.updateById(iotMaintainDO);
+    }
+
+    public List<IotOaPersonDO> getMaintainPerson(String id) {
+        Long loginUserId;
+        if (StringUtils.isBlank(id)||"undefined".equals(id)) {
+            loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        } else {
+            loginUserId = Long.valueOf(id);
+        }
+        AdminUserRespDTO user = adminUserApi.getUser(loginUserId);
+        if (Objects.isNull(user)) {
+            throw new ServiceException(new ErrorCode(666,"用户不存在"));
+        }
+        List<IotOaPersonDO> currentUser;
+        if ("admin".equals(user.getUsername())) {
+            currentUser = iotOaPersonMapper.selectList().stream().filter(e -> "0".equals(e.getStatus()) || "1".equals(e.getStatus()) || "2".equals(e.getStatus()) || "3".equals(e.getStatus())).collect(Collectors.toList());
+            return currentUser;
+        } else {
+            String workcode = user.getUsername();
+            currentUser = iotOaPersonMapper.selectList("workcode", workcode);
+        }
+        if (CollUtil.isNotEmpty(currentUser)) {
+            return currentUser;
+        }
+        Long deptId = user.getDeptId();
+        DeptRespDTO dept = deptApi.getDept(deptId);
+        String name = dept.getName();
+        String companyCode = "";
+        if (name.contains("瑞恒")) {
+            companyCode = "6000";
+        } else if (name.contains("瑞都")) {
+            companyCode = "5020";
+        } else if (name.contains("瑞鹰")) {
+            companyCode = "6010";
+        } else {
+            DeptRespDTO dept1 = deptApi.getDept(dept.getParentId());
+            String name1 = dept1.getName();
+            if (name1.contains("瑞恒")) {
+                companyCode = "6000";
+            } else if (name1.contains("瑞都")) {
+                companyCode = "5020";
+            } else if (name1.contains("瑞鹰")) {
+                companyCode = "6010";
+            } else {
+                DeptRespDTO dept2 = deptApi.getDept(dept1.getParentId());
+                String name2 = dept2.getName();
+                if (name2.contains("瑞恒")) {
+                    companyCode = "6000";
+                } else if (name2.contains("瑞都")) {
+                    companyCode = "5020";
+                } else if (name2.contains("瑞鹰")) {
+                    companyCode = "6010";
+                }
+            }
+        }
+        List<IotOaPersonDO> companyUsers = iotOaPersonMapper.selectList("subcompanycode", companyCode);
+        List<IotOaPersonDO> result = companyUsers.stream().filter(e -> "0".equals(e.getStatus()) || "1".equals(e.getStatus()) || "2".equals(e.getStatus()) || "3".equals(e.getStatus())).collect(Collectors.toList());
+        return result;
+    }
+
+    public List<IotOaPersonDO> getProjectPerson(String id) {
+        Long loginUserId;
+        if (StringUtils.isBlank(id)||"undefined".equals(id)) {
+            loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        } else {
+            loginUserId = Long.valueOf(id);
+        }
+        AdminUserRespDTO user = adminUserApi.getUser(loginUserId);
+        if (Objects.isNull(user)) {
+            throw new ServiceException(new ErrorCode(666,"用户不存在"));
+        }
+        List<IotOaPersonDO> currentUser = Collections.emptyList();
+        if ("admin".equals(user.getUsername())) {
+            currentUser = iotOaPersonMapper.selectList().stream().filter(e -> "0".equals(e.getStatus()) || "1".equals(e.getStatus()) || "2".equals(e.getStatus()) || "3".equals(e.getStatus())).collect(Collectors.toList());
+            return currentUser;
+        }
+        if (CollUtil.isNotEmpty(currentUser)) {
+            return currentUser;
+        }
+        Long deptId = user.getDeptId();
+        DeptRespDTO dept = deptApi.getDeptNoPermission(deptId);
+        String name = dept.getName();
+        String companyCode = "";
+        if (name.contains("瑞恒")) {
+            companyCode = "6000";
+        } else if (name.contains("瑞都")) {
+            companyCode = "5020";
+        } else if (name.contains("瑞鹰")) {
+            companyCode = "6010";
+        } else {
+            Long parentId = dept.getParentId();
+            DeptRespDTO dept1 = deptApi.getDeptNoPermission(parentId);
+            String name1 = dept1.getName();
+            if (name1.contains("瑞恒")) {
+                companyCode = "6000";
+            } else if (name1.contains("瑞都")) {
+                companyCode = "5020";
+            } else if (name1.contains("瑞鹰")) {
+                companyCode = "6010";
+            } else {
+                DeptRespDTO dept2 = deptApi.getDeptNoPermission(dept1.getParentId());
+                String name2 = dept2.getName();
+                if (name2.contains("瑞恒")) {
+                    companyCode = "6000";
+                } else if (name2.contains("瑞都")) {
+                    companyCode = "5020";
+                } else if (name2.contains("瑞鹰")) {
+                    companyCode = "6010";
+                }
+            }
+        }
+        List<IotOaPersonDO> companyUsers = iotOaPersonMapper.selectList("subcompanycode", companyCode);
+        List<IotOaPersonDO> result = companyUsers.stream().filter(e -> "0".equals(e.getStatus()) || "1".equals(e.getStatus()) || "2".equals(e.getStatus()) || "3".equals(e.getStatus())).collect(Collectors.toList());
+        return result;
+    }
 }

+ 2 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java

@@ -49,6 +49,7 @@ public interface AdminUserApi {
      * @return 用户数组
      */
     List<AdminUserRespDTO> getUserListByDeptIds(Collection<Long> deptIds);
+    List<AdminUserRespDTO> getUserListByDeptIdsNew(Collection<Long> deptIds);
     List<Pms.deptStat> getUserCountByDeptId(Long deptId);
     /**
      * 获得指定岗位的用户数组
@@ -57,6 +58,7 @@ public interface AdminUserApi {
      * @return 用户数组
      */
     List<AdminUserRespDTO> getUserListByPostIds(Collection<Long> postIds);
+    List<AdminUserRespDTO> getAllUser();
 
     /**
      * 获得用户 Map

+ 12 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java

@@ -63,7 +63,7 @@ public class AdminUserApiImpl implements AdminUserApi {
 
     @Override
     public List<AdminUserRespDTO> getUserListByDeptId(Long id) {
-        DeptDO dept = deptService.getDept(id);
+        DeptDO dept = deptService.getDeptNoPermission(id);
         if (Objects.isNull(dept)) {
             return Collections.emptyList();
         }
@@ -99,7 +99,11 @@ public class AdminUserApiImpl implements AdminUserApi {
         List<AdminUserDO> users = userService.getUserListByDeptIds(deptIds);
         return BeanUtils.toBean(users, AdminUserRespDTO.class);
     }
-
+    @Override
+    public List<AdminUserRespDTO> getUserListByDeptIdsNew(Collection<Long> deptIds) {
+        List<AdminUserDO> users = userService.getUserListByDeptIdsNew(deptIds);
+        return BeanUtils.toBean(users, AdminUserRespDTO.class);
+    }
     @Override
     @DataPermission(enable = false)
     public List<Pms.deptStat> getUserCountByDeptId(Long deptId) {
@@ -113,6 +117,12 @@ public class AdminUserApiImpl implements AdminUserApi {
         return BeanUtils.toBean(users, AdminUserRespDTO.class);
     }
 
+    @Override
+    public List<AdminUserRespDTO> getAllUser() {
+        List<AdminUserDO> allUsers = userService.getAllUsers();
+        return BeanUtils.toBean(allUsers, AdminUserRespDTO.class);
+    }
+
     @Override
     public List<AdminUserRespDTO> getUserListByUsername(String username) {
         List<AdminUserDO> users = userService.getUserListByUsername(username);

+ 15 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java

@@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.security.config.SecurityProperties;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
@@ -26,6 +28,7 @@ import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameters;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -65,6 +68,8 @@ public class AuthController {
     private SecurityProperties securityProperties;
     @Resource
     private SocialUserService socialUserService;
+    @Value("${oa.oaSecret}")
+    private String oaSecret;
 
     @PostMapping("/login")
     @PermitAll
@@ -80,6 +85,16 @@ public class AuthController {
         return success(authService.simpleLogin(id));
     }
 
+    @PostMapping("/oa/login")
+    @PermitAll
+    @TenantIgnore
+    public CommonResult<AuthLoginRespVO> oaLogin(@RequestHeader("oa-secret") String secret) {
+        if (!oaSecret.equals(secret)){
+            throw new ServiceException(new ErrorCode(100, "验证失败"));
+        }
+        return success(authService.oaLogin());
+    }
+
     @PostMapping("/logout")
     @PermitAll
     @Operation(summary = "登出系统")

+ 5 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java

@@ -73,6 +73,11 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
     default List<AdminUserDO> selectListByDeptIds(Collection<Long> deptIds) {
         return selectList(AdminUserDO::getDeptId, deptIds);
     }
+    default List<AdminUserDO> selectListByDeptIdsNew(Collection<Long> deptids) {
+        return selectList(new LambdaQueryWrapperX<AdminUserDO>()
+                .inIfPresent(AdminUserDO::getDeptId, deptids));
+    }
+
     @DataPermission(enable = false)
     default List<AdminUserDO> selectListByDept(Long deptId) {
         return selectList(AdminUserDO::getDeptId, deptId);

+ 1 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java

@@ -24,6 +24,7 @@ public interface AdminAuthService {
     AdminUserDO authenticate(String username, String password);
 
     AuthLoginRespVO simpleLogin(Long id);
+    AuthLoginRespVO oaLogin();
     /**
      * 账号登录
      *

+ 8 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java

@@ -76,6 +76,8 @@ public class AdminAuthServiceImpl implements AdminAuthService {
     private SmsCodeApi smsCodeApi;
     @Resource
     private SocialUserBindMapper socialUserBindMapper;
+    @Value("${oa.user}")
+    private String oaUser;
     /**
      * 验证码的开关,默认为 true
      */
@@ -111,6 +113,12 @@ public class AdminAuthServiceImpl implements AdminAuthService {
         return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME);
     }
 
+    @Override
+    public AuthLoginRespVO oaLogin() {
+        AdminUserDO user = userService.getUserByUsername(oaUser);
+        return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME);
+    }
+
     @Override
     public AuthLoginRespVO login(AuthLoginReqVO reqVO) {
         // 校验验证码

+ 2 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java

@@ -144,7 +144,7 @@ public interface AdminUserService {
      * @return 用户数组
      */
     List<AdminUserDO> getUserListByDeptIds(Collection<Long> deptIds);
-
+    List<AdminUserDO> getUserListByDeptIdsNew(Collection<Long> deptIds);
     /**
      * 获得指定岗位的用户数组
      *
@@ -152,6 +152,7 @@ public interface AdminUserService {
      * @return 用户数组
      */
     List<AdminUserDO> getUserListByPostIds(Collection<Long> postIds);
+    List<AdminUserDO> getAllUsers();
 
     /**
      * 获得用户列表

+ 15 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java

@@ -13,6 +13,7 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
+import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
 import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
 import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
 import cn.iocoder.yudao.module.infra.api.file.FileApi;
@@ -365,6 +366,20 @@ public class AdminUserServiceImpl implements AdminUserService {
         return userMapper.selectListByDeptIds(deptIds);
     }
 
+    @Override
+    @DataPermission(enable = false)
+    public List<AdminUserDO> getUserListByDeptIdsNew(Collection<Long> deptIds) {
+        if (CollUtil.isEmpty(deptIds)) {
+            return Collections.emptyList();
+        }
+        return userMapper.selectListByDeptIdsNew(deptIds);
+    }
+
+    @Override
+    public List<AdminUserDO> getAllUsers() {
+        return userMapper.selectList();
+    }
+
     @Override
     public List<AdminUserDO> getUserListByPostIds(Collection<Long> postIds) {
         if (CollUtil.isEmpty(postIds)) {

+ 10 - 6
yudao-server/src/main/resources/application-dev.yaml

@@ -276,13 +276,17 @@ system:
   url: https://iot.deepoil.cc/
 
 oa:
-  register: https://172.17.25.231/api/ec/dev/auth/regist
-  gettoken: https://172.17.25.231/api/ec/dev/auth/applytoken
-  outMaintain: https://172.17.25.231/api/workflow/paService/doCreateRequest
-  companyUrl: https://172.17.25.231/api/hrm/resful/getHrmsubcompanyWithPage
-  departmentUrl: https://172.17.25.231/api/hrm/resful/getHrmdepartmentWithPage
-  userUrl: https://172.17.25.231/api/hrm/resful/getHrmUserInfoWithPage
+  register: http://172.17.25.231/api/ec/dev/auth/regist
+  gettoken: http://172.17.25.231/api/ec/dev/auth/applytoken
+  outMaintain: http://172.17.25.231/api/workflow/paService/doCreateRequest
+  companyUrl: http://172.17.25.231/api/hrm/resful/getHrmsubcompanyWithPage
+  departmentUrl: http://172.17.25.231/api/hrm/resful/getHrmdepartmentWithPage
+  userUrl: http://172.17.25.231/api/hrm/resful/getHrmUserInfoWithPage
+  workflowId: "640"
+  requestName: "设备委外维修申请流程"
   #  appid: EEAA5436-7577-4BE0-8C6C-89E9D88805EE
 #  appid: EEAA5436-7577-4BE0-8C6C-89E9D88805E1
   appid: tw
   cpk: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApmtQUp9M82/z22P7am5owQCknjQnjF4U4ckEh7XVtJVQZrZx7d1lCPfoYrwOKEM4DEV7khW6++4Zv5caJ/9nqPn4QFwCqJWVmCEm9vC1BA6i2yfa4bmTxdR1/oeU/Af9pDFlvv5GC9XyilO7CIKu19Ce50v7aN6h1Tjix+h5Ba8e12XAEpEZk9pFroEYfR4lrecvi1pQOwRw8YzDRC4lhGNOo5Cen1rGjk7dwzzgs4uEv9ZyPZoVJnty5P9JE/ctboEf3x4jbqIliuCRgOyXYsLlp+N282CKcWZ35URkGw2orKyG1U6L1hNoj7kkpvAo8Zagf97SdZ0nYdRBIHv6PQIDAQAB
+  oaSecret: kryfoa20250905@szh
+  user: OAuser

+ 4 - 0
yudao-server/src/main/resources/application-prod.yaml

@@ -280,7 +280,11 @@ oa:
   companyUrl: https://172.17.25.231/api/hrm/resful/getHrmsubcompanyWithPage
   departmentUrl: https://172.17.25.231/api/hrm/resful/getHrmdepartmentWithPage
   userUrl: https://172.17.25.231/api/hrm/resful/getHrmUserInfoWithPage
+  workflowId: "640"
+  requestName: "设备委外维修申请流程"
   #  appid: EEAA5436-7577-4BE0-8C6C-89E9D88805EE
   #  appid: EEAA5436-7577-4BE0-8C6C-89E9D88805E1
   appid: tw
   cpk: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApmtQUp9M82/z22P7am5owQCknjQnjF4U4ckEh7XVtJVQZrZx7d1lCPfoYrwOKEM4DEV7khW6++4Zv5caJ/9nqPn4QFwCqJWVmCEm9vC1BA6i2yfa4bmTxdR1/oeU/Af9pDFlvv5GC9XyilO7CIKu19Ce50v7aN6h1Tjix+h5Ba8e12XAEpEZk9pFroEYfR4lrecvi1pQOwRw8YzDRC4lhGNOo5Cen1rGjk7dwzzgs4uEv9ZyPZoVJnty5P9JE/ctboEf3x4jbqIliuCRgOyXYsLlp+N282CKcWZ35URkGw2orKyG1U6L1hNoj7kkpvAo8Zagf97SdZ0nYdRBIHv6PQIDAQAB
+  oaSecret: kryfoa20250905@szh
+  user: OAuser