├── src ├── main │ ├── resources │ │ ├── qunar-app.properties │ │ ├── templates │ │ │ ├── webLogin.html │ │ │ └── index.html │ │ └── banner2.txt │ └── java │ │ ├── META-INF │ │ └── MANIFEST.MF │ │ ├── com │ │ └── qunar │ │ │ └── superoa │ │ │ ├── config │ │ │ ├── LoginContextSource.java │ │ │ ├── GirlProperties.java │ │ │ ├── LdapProperties.java │ │ │ ├── WebSocketConfig.java │ │ │ ├── Swagger2Config.java │ │ │ └── WebMvcConfig.java │ │ │ ├── utils │ │ │ ├── Views.java │ │ │ ├── JsonUtil.java │ │ │ ├── SpringSecurityUtil.java │ │ │ ├── InputStreamToOutUtils.java │ │ │ ├── WebSocketUtil.java │ │ │ ├── UrlAliveUtil.java │ │ │ ├── TaskLogger.java │ │ │ ├── InvokeUtil.java │ │ │ ├── CookieUtils.java │ │ │ ├── AESUtil.java │ │ │ └── FileMD5Utils.java │ │ │ ├── biz │ │ │ └── Biz.java │ │ │ ├── annotation │ │ │ └── Annotation.java │ │ │ ├── model │ │ │ ├── RequestMessage.java │ │ │ ├── ResponseMessage.java │ │ │ ├── Login.java │ │ │ ├── OpsappAproveParams.java │ │ │ ├── UserRole.java │ │ │ ├── WorkGroup.java │ │ │ ├── OpsappModel.java │ │ │ ├── OpsappVars.java │ │ │ ├── ACLManage.java │ │ │ ├── OpsappUpdateData.java │ │ │ ├── ExtSysFlowModel.java │ │ │ ├── OpsappSendMessageInfo.java │ │ │ ├── Department.java │ │ │ ├── ExtSysUnapproveFlow.java │ │ │ ├── OpsappHistoryData.java │ │ │ ├── Agent.java │ │ │ └── FlowNodeData.java │ │ │ ├── controller │ │ │ ├── BaseController.java │ │ │ ├── ActivitiDesignPageController.java │ │ │ ├── SocketController.java │ │ │ ├── FormDataController.java │ │ │ └── NotifyController.java │ │ │ ├── dto │ │ │ ├── GroupIdDto.java │ │ │ ├── FormKeyDto.java │ │ │ ├── ExtSysDto.java │ │ │ ├── LoginDto.java │ │ │ ├── StartQRCodeV2.java │ │ │ ├── AbstractDto.java │ │ │ ├── AdminDto.java │ │ │ ├── ApproveCountDto.java │ │ │ ├── FlowStatusDto.java │ │ │ ├── RoleDto.java │ │ │ ├── Account.java │ │ │ ├── Result.java │ │ │ ├── MobelResult.java │ │ │ ├── QtalkTkeyBody.java │ │ │ ├── ExtSysResultDto.java │ │ │ ├── PasswordDto.java │ │ │ ├── OpsappApproveDto.java │ │ │ ├── DoFlowDto.java │ │ │ ├── ApproveLogDto.java │ │ │ ├── FlowCountDto.java │ │ │ ├── FlowUserDto.java │ │ │ ├── ExternalQueryDto.java │ │ │ ├── FormDataDto.java │ │ │ ├── FlowOrderDto.java │ │ │ ├── UserRoleDto.java │ │ │ ├── DeploymentResponse.java │ │ │ ├── FlowModelNameDto.java │ │ │ ├── ActivitiDto.java │ │ │ ├── ExternalFlowModelDto.java │ │ │ ├── StarTalkUserDto.java │ │ │ ├── PageAble.java │ │ │ ├── QueryUserDto.java │ │ │ ├── DepartmentDto.java │ │ │ ├── QueryWorkGroupDto.java │ │ │ ├── QtalkAddMucUserBody.java │ │ │ ├── StarTalkUserDetailBody.java │ │ │ ├── PageableDto.java │ │ │ ├── DeptDto.java │ │ │ ├── ModelDto.java │ │ │ ├── MailInfo.java │ │ │ ├── OAUserDto.java │ │ │ ├── CurrentUserDto.java │ │ │ ├── QueryExtSysUnapproveDto.java │ │ │ ├── PageResult.java │ │ │ ├── QtalkMessageBody.java │ │ │ ├── NotifyDto.java │ │ │ ├── QueryFlowDto.java │ │ │ └── FlowDataDto.java │ │ │ ├── service │ │ │ ├── ipml │ │ │ │ ├── MainService.java │ │ │ │ ├── ACLManageServiceImpl.java │ │ │ │ └── FlowNodeDataServiceImpl.java │ │ │ ├── ACLManageServiceI.java │ │ │ ├── FlowNodeDataServiceI.java │ │ │ ├── FormDataServiceI.java │ │ │ ├── FromExternalServiceI.java │ │ │ ├── AgentServiceI.java │ │ │ ├── ExtSysFlowModelServiceI.java │ │ │ ├── DepartmentServiceI.java │ │ │ ├── UserRoleServiceI.java │ │ │ ├── UserInfoApiServiceI.java │ │ │ ├── GroupServiceI.java │ │ │ ├── NotifyServiceI.java │ │ │ ├── ModelerServiceI.java │ │ │ ├── ExtSysUnapproveFlowServiceI.java │ │ │ ├── AdminActivitiServiceI.java │ │ │ ├── OAUserServiceI.java │ │ │ ├── ApproveLogServiceI.java │ │ │ └── OpsappApiServiceI.java │ │ │ ├── dao │ │ │ ├── FormDataRepository.java │ │ │ ├── ACLManageRepository.java │ │ │ ├── FlowNodeDataRepository.java │ │ │ ├── GroupRepository.java │ │ │ ├── AttachmentRepository.java │ │ │ ├── SuperOAUserRepository.java │ │ │ ├── ExtSysFlowModelRepository.java │ │ │ ├── NotifyRepository.java │ │ │ ├── ApproveLogRepository.java │ │ │ ├── UserRoleRepository.java │ │ │ ├── AgentRepository.java │ │ │ ├── ExtSysUnapproveFlowRepository.java │ │ │ ├── OAUserRepository.java │ │ │ └── DepartmentRepository.java │ │ │ ├── enums │ │ │ ├── FlowEnum.java │ │ │ └── RoleTypeEnum.java │ │ │ ├── exceptions │ │ │ ├── GirlException.java │ │ │ ├── ACLManageException.java │ │ │ ├── AgentException.java │ │ │ ├── InvokeException.java │ │ │ ├── GroupException.java │ │ │ ├── FlowException.java │ │ │ ├── UploadException.java │ │ │ ├── EncryptException.java │ │ │ ├── ActivitiFlowException.java │ │ │ ├── RoleException.java │ │ │ ├── SuperOALoginException.java │ │ │ └── FlowModelException.java │ │ │ ├── constants │ │ │ ├── ActivitiStatus.java │ │ │ └── AuthorityConstant.java │ │ │ ├── cache │ │ │ └── Cache.java │ │ │ ├── thread │ │ │ └── ThreadPool.java │ │ │ ├── security │ │ │ ├── MerryyounExpiredSessionStrategy.java │ │ │ ├── AuthorizationServerConfig.java │ │ │ ├── UserDetailsService.java │ │ │ └── MySuperOAUserDetails.java │ │ │ ├── listener │ │ │ ├── DeptVPListener.java │ │ │ ├── DeptDirectorListener.java │ │ │ ├── HrbpListener.java │ │ │ ├── HrdListener.java │ │ │ ├── InitiatorListener.java │ │ │ └── LeaderListener.java │ │ │ ├── task │ │ │ ├── ShardingJobHandler.java │ │ │ └── DemoJobHandler.java │ │ │ ├── validate │ │ │ └── MustDatetime.java │ │ │ ├── SuperoaApplication.java │ │ │ └── interceptor │ │ │ └── WebSocketInterceptor.java │ │ └── org │ │ └── activiti │ │ ├── image │ │ ├── impl │ │ │ ├── icon │ │ │ │ ├── ReceiveTaskIconType.java │ │ │ │ ├── SendTaskIconType.java │ │ │ │ ├── BusinessRuleTaskIconType.java │ │ │ │ ├── UserTaskIconType.java │ │ │ │ ├── ScriptTaskIconType.java │ │ │ │ ├── IconType.java │ │ │ │ └── ManualTaskIconType.java │ │ │ ├── ProcessDiagramDOMGroupManager.java │ │ │ └── ProcessDiagramSVGGraphics2D.java │ │ └── exception │ │ │ ├── ActivitiInterchangeInfoNotFoundException.java │ │ │ └── ActivitiImageException.java │ │ ├── FilterServletOutputStream.java │ │ ├── GenericResponseWrapper.java │ │ └── rest │ │ └── editor │ │ └── main │ │ └── StencilsetRestResource.java └── test │ └── java │ └── com │ └── qunar │ └── superoa │ ├── SuperoaApplicationTests.java │ ├── service │ ├── ipml │ │ ├── LdapServiceTest.java │ │ ├── FlowServiceImplTest.java │ │ └── NotifyServiceImplTest.java │ ├── AdminActivitiServiceTest.java │ ├── UserServiceTest.java │ └── DepartmentServiceTest.java │ ├── task │ └── NotifySendJobHandlerTest.java │ ├── utils │ ├── QRCodeUtilTest.java │ ├── MailUtilTest.java │ └── FileMD5UtilsTest.java │ ├── other │ ├── RedisTestClass.java │ └── SecurityTest.java │ ├── dao │ └── AttachmentRepositoryTest.java │ └── controller │ └── AdminActivitiControllerTest.java ├── helloworld.png ├── .gitignore ├── canvas.html └── LICENSE /src/main/resources/qunar-app.properties: -------------------------------------------------------------------------------- 1 | name=uperoa 2 | token=*********** -------------------------------------------------------------------------------- /helloworld.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qunarcorp/superoa/HEAD/helloworld.png -------------------------------------------------------------------------------- /src/main/java/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Main-Class: com.qunar.superoa.SuperoaApplication 3 | 4 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/config/LoginContextSource.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.config; 2 | 3 | public class LoginContextSource{ 4 | } 5 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/utils/Views.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | public class Views { 4 | public static class Normal{}; 5 | 6 | public static class Manager extends Normal{}; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/biz/Biz.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.biz; 2 | /** 3 | * @Auther: lee.guo 4 | * @Date:Created in 2018/9/27_8:02 PM 5 | * @Despriction: biz 6 | */ 7 | 8 | public class Biz { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/annotation/Annotation.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.annotation; 2 | /** 3 | * @Auther: lee.guo 4 | * @Date:Created in 2018/9/27_8:01 PM 5 | * @Despriction: Annotation 6 | */ 7 | 8 | public class Annotation { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/RequestMessage.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class RequestMessage { 7 | 8 | private String name; 9 | 10 | public String getName() { 11 | return name; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/controller/BaseController.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.controller; 2 | 3 | /** 4 | * @Auther: lee.guo 5 | * @Date:Created in 2018/8/16_下午8:22 6 | * @Despriction: 7 | */ 8 | public interface BaseController { 9 | 10 | Object run() throws Exception; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/GroupIdDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * Created by xing.zhou on 2018/9/18. 8 | */ 9 | @Data 10 | public class GroupIdDto { 11 | 12 | @ApiModelProperty(value = "id") 13 | private Integer id; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/ipml/MainService.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service.ipml; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.stereotype.Service; 6 | 7 | @Service 8 | public class MainService { 9 | 10 | private final static Logger logger = LoggerFactory.getLogger(MainService.class); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/FormDataRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.model.FormData; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | /** 7 | * Created by xing.zhou on 2018/8/30. 8 | */ 9 | public interface FormDataRepository extends JpaRepository { 10 | 11 | FormData findByProcInstId(String procInstId); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/FormKeyDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * Created by xing.zhou on 2018/9/18. 8 | */ 9 | @Data 10 | public class FormKeyDto { 11 | 12 | @ApiModelProperty("流程模板key") 13 | private String formKey; 14 | 15 | @ApiModelProperty("流程模板版本号") 16 | private String formVersion; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/ExtSysDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Auther: chengyan.liang 8 | * @Despriction: 9 | * @Date:Created in 2:05 PM 2019/4/30 10 | * @Modify by: 11 | */ 12 | @Data 13 | public class ExtSysDto { 14 | 15 | @ApiModelProperty(value = "外部系统传输数据") 16 | private Object dataSource; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/enums/FlowEnum.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.enums; 2 | 3 | /** 4 | * created by chengyan.liang on 2018/9/27 5 | */ 6 | 7 | /** 8 | * 表单状态 9 | */ 10 | public class FlowEnum { 11 | 12 | //未启用 13 | public static final Integer UN_START_USED = 0; 14 | //启用 15 | public static final Integer START_USED = 1; 16 | //草稿 17 | public static final Integer DRAFT_FLOW = 2; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/ResponseMessage.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class ResponseMessage { 7 | private String responseMessage; 8 | 9 | public ResponseMessage(String responseMessage) { 10 | this.responseMessage = responseMessage; 11 | } 12 | 13 | public String getResponseMessage() { 14 | return responseMessage; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/ACLManageServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.model.ACLManage; 4 | 5 | import java.util.Optional; 6 | 7 | /** 8 | * @author zhouxing 9 | * @date 2019-03-10 15:30 10 | */ 11 | public interface ACLManageServiceI { 12 | /** 13 | * 根据IP查询aclmanage 14 | * @param ip 15 | * @return 16 | */ 17 | Optional getAclManageByIp(String ip); 18 | } 19 | -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/SuperoaApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit4.SpringRunner; 7 | 8 | @RunWith(SpringRunner.class) 9 | @SpringBootTest 10 | public class SuperoaApplicationTests { 11 | 12 | @Test 13 | public void contextLoads() { 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/LoginDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Auther: lee.guo 8 | * @Date:Created in 2018/9/13_下午7:45 9 | * @Despriction: 10 | */ 11 | 12 | @Data 13 | public class LoginDto { 14 | 15 | @ApiModelProperty("用户名") 16 | private String qtalk; 17 | 18 | @ApiModelProperty("密码") 19 | private String password; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/StartQRCodeV2.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiParam; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Auther: lee.guo 8 | * @Date:Created in 2018/8/27_6:34 PM 9 | * @Despriction: 获取qtalk二维码 10 | */ 11 | 12 | @Data 13 | public class StartQRCodeV2 { 14 | 15 | @ApiParam("qtalk 还是 qchat") 16 | private String p; 17 | 18 | @ApiParam("系统名称") 19 | private String type; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/AbstractDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * Created by xing.zhou on 2018/9/7. 8 | */ 9 | @Data 10 | public class AbstractDto { 11 | 12 | @ApiModelProperty(value = "字段名称", name = "字段名称") 13 | private String fieldName; 14 | 15 | @ApiModelProperty(value = "字段值key", name = "字段值key") 16 | private String valueKey; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/ACLManageRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.model.ACLManage; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.util.Optional; 7 | 8 | /** 9 | * @author zhouxing 10 | * @date 2019-03-10 15:36 11 | */ 12 | 13 | public interface ACLManageRepository extends JpaRepository { 14 | 15 | Optional getACLManageByIpsLike(String ip); 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/FlowNodeDataRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.model.FlowNodeData; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.data.jpa.repository.JpaSpecificationExecutor; 6 | 7 | /** 8 | * @author zhouxing 9 | * @date 2019-02-20 11:06 10 | */ 11 | public interface FlowNodeDataRepository extends JpaRepository, JpaSpecificationExecutor { 12 | 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/AdminDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import java.util.List; 5 | import lombok.Data; 6 | 7 | /** 8 | * @Auther: chengyan.liang 9 | * @Despriction: 10 | * @Date:Created in 10:49 AM 2019/6/3 11 | * @Modify by: 12 | */ 13 | @Data 14 | public class AdminDto { 15 | 16 | @ApiModelProperty("用户名") 17 | private String userName; 18 | 19 | @ApiModelProperty("角色列表") 20 | private List roles; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/image/impl/icon/ReceiveTaskIconType.java: -------------------------------------------------------------------------------- 1 | package org.activiti.image.impl.icon; 2 | 3 | public class ReceiveTaskIconType extends TaskIconType { 4 | 5 | @Override 6 | public String getStyleValue() { 7 | return "fill:#16964d;stroke:none;"; 8 | } 9 | 10 | @Override 11 | public String getDValue() { 12 | return "m 0.5,2.5 0,13 17,0 0,-13 z M 2,4 6.5,8.5 2,13 z M 4,4 14,4 9,9 z m 12,0 0,9 -4.5,-4.5 z M 7.5,9.5 9,11 10.5,9.5 15,14 3,14 z"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/image/impl/icon/SendTaskIconType.java: -------------------------------------------------------------------------------- 1 | package org.activiti.image.impl.icon; 2 | 3 | public class SendTaskIconType extends TaskIconType { 4 | 5 | @Override 6 | public String getStyleValue() { 7 | return "fill:#16964d;stroke:none;"; 8 | } 9 | 10 | @Override 11 | public String getDValue() { 12 | return "M 1 3 L 9 11 L 17 3 L 1 3 z M 1 5 L 1 13 L 5 9 L 1 5 z M 17 5 L 13 9 L 17 13 L 17 5 z M 6 10 L 1 15 L 17 15 L 12 10 L 9 13 L 6 10 z "; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/config/GirlProperties.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.stereotype.Component; 6 | 7 | /** 8 | * @Auther: lee.guo 9 | * @Despriction: 获取配置文件中的配置 10 | */ 11 | @Data 12 | @Component 13 | @ConfigurationProperties(prefix = "girl") 14 | public class GirlProperties { 15 | private String cupSize; 16 | private Integer age; 17 | private String content; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/ApproveCountDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * Created by xing.zhou on 2018/9/12. 8 | */ 9 | @Data 10 | public class ApproveCountDto { 11 | 12 | @ApiModelProperty(value = "待办条数") 13 | private int approveCount; 14 | 15 | @ApiModelProperty(value = "已办条数") 16 | private int approved; 17 | 18 | @ApiModelProperty(value = "外部系统待办条数") 19 | private int extSysApproveCount; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/FlowStatusDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Auther: chengyan.liang 8 | * @Despriction: 更改表单状态中间类 9 | * @Date:Created in 上午11:07 2018/9/28 10 | * @Modify by: 11 | */ 12 | @Data 13 | public class FlowStatusDto { 14 | 15 | @ApiModelProperty(value = "流程模版id(唯一值)", required = true) 16 | private String id ; 17 | 18 | @ApiModelProperty(value = "流程表单要被更改为的状态", required = false) 19 | private Integer flowStatus ; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/config/LdapProperties.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.stereotype.Component; 6 | 7 | /** 8 | * @Auther: lee.guo 9 | * @Despriction: 获取配置文件中的配置 10 | */ 11 | @Data 12 | @Component 13 | @ConfigurationProperties(prefix = "ldap") 14 | public class LdapProperties { 15 | String ldap_host; 16 | String ldap_user; 17 | String ldap_pwd; 18 | String ldap_basedn; 19 | String ldap_basemail; 20 | String ldap_cn; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/RoleDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Author: yang.du 8 | * @Description: 9 | * @Date: Created in 16:15 2018/9/6 10 | */ 11 | 12 | @Data 13 | public class RoleDto { 14 | 15 | @ApiModelProperty("权限(SYSTEM_ADMIN:系统管理员; ACTIVITI_ADMIN: 流程管理员; ROLE_USER:普通用户)") 16 | private String role; 17 | 18 | public RoleDto (String role) { 19 | super(); 20 | this.role = role; 21 | } 22 | 23 | public RoleDto (){ 24 | super(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/resources/templates/webLogin.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | OA 9 | 10 | 11 | 12 |
13 | 14 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/image/impl/icon/BusinessRuleTaskIconType.java: -------------------------------------------------------------------------------- 1 | package org.activiti.image.impl.icon; 2 | 3 | public class BusinessRuleTaskIconType extends TaskIconType { 4 | 5 | @Override 6 | public String getStyleValue() { 7 | return "fill:#72a7d0;stroke:none"; 8 | } 9 | 10 | @Override 11 | public String getDValue() { 12 | return "m 1,2 0,14 16,0 0,-14 z m 1.45458,5.6000386 2.90906,0 0,2.7999224 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.7999224 -8.72718,0 z m -4.36364,4.1998844 2.90906,0 0,2.800116 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.800116 -8.72718,0 z"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/Login.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import io.swagger.annotations.ApiParam; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Auther: lee.guo 8 | * @Date:Created in 2018/8/27_4:11 PM 9 | * @Despriction: 10 | */ 11 | 12 | @Data 13 | public class Login { 14 | 15 | @ApiParam(value = "userName", name = "账户", required = true) 16 | private String userName; 17 | 18 | @ApiParam(value = "password", name = "密码", required = true) 19 | private String password; 20 | 21 | @ApiParam(value = "type", name = "登录类型", required = true) 22 | private String type; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/exceptions/GirlException.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.exceptions; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | /** 7 | * @Auther: lee.guo 8 | * @Date:Created in 2018/8/16_下午8:38 9 | * @Despriction: 10 | */ 11 | 12 | @Data 13 | @EqualsAndHashCode(callSuper = false) 14 | public class GirlException extends RuntimeException{ 15 | 16 | private Integer code; 17 | 18 | public GirlException(ResultEnum resultEnum){ 19 | super(resultEnum.getMsg()); 20 | this.code = resultEnum.getCode(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/exceptions/ACLManageException.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.exceptions; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * @Auther: xing.zhou 9 | * @Date:Created in 2019/3/10_3:44 PM 10 | * @Despriction: 11 | */ 12 | 13 | @EqualsAndHashCode(callSuper = true) 14 | @Data 15 | public class ACLManageException extends RuntimeException { 16 | 17 | private Integer code; 18 | 19 | public ACLManageException(ResultEnum resultEnum) { 20 | super(resultEnum.getMsg()); 21 | this.code = resultEnum.getCode(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/exceptions/AgentException.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.exceptions; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * @Auther: lee.guo 9 | * @Date:Created in 2018/8/17_下午2:53 10 | * @Despriction: 11 | */ 12 | 13 | @Data 14 | @EqualsAndHashCode(callSuper = false) 15 | public class AgentException extends RuntimeException{ 16 | 17 | private Integer code; 18 | 19 | public AgentException(ResultEnum resultEnum){ 20 | super(resultEnum.getMsg()); 21 | this.code = resultEnum.getCode(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/exceptions/InvokeException.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.exceptions; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * @Auther: lee.guo 9 | * @Date:Created in 2018/9/10_下午6:25 10 | * @Despriction: 11 | */ 12 | 13 | @Data 14 | @EqualsAndHashCode(callSuper = false) 15 | public class InvokeException extends RuntimeException { 16 | 17 | private Integer code; 18 | 19 | public InvokeException(ResultEnum resultEnum){ 20 | super(resultEnum.getMsg()); 21 | this.code = resultEnum.getCode(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/exceptions/GroupException.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.exceptions; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * @Auther: xing.zhou 9 | * @Despriction: 10 | * @Date:Created in 10:58 2018/11/30 11 | * @Modify by: 12 | */ 13 | @EqualsAndHashCode(callSuper = true) 14 | @Data 15 | public class GroupException extends RuntimeException { 16 | 17 | 18 | private Integer code; 19 | 20 | public GroupException(ResultEnum resultEnum) { 21 | super(resultEnum.getMsg()); 22 | this.code = resultEnum.getCode(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/exceptions/FlowException.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.exceptions; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * @Auther: xing.zhou 9 | * @Auther: lee.guo 10 | * @Date:Created in 2018/9/29_2:22 PM 11 | * @Despriction: 12 | */ 13 | 14 | @EqualsAndHashCode(callSuper = true) 15 | @Data 16 | public class FlowException extends RuntimeException { 17 | 18 | private Integer code; 19 | 20 | public FlowException(ResultEnum resultEnum) { 21 | super(resultEnum.getMsg()); 22 | this.code = resultEnum.getCode(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/Account.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | import org.springframework.security.core.GrantedAuthority; 6 | 7 | import java.util.List; 8 | 9 | 10 | /** 11 | * @Auther: lee.guo 12 | * @Date:Created in 2018/8/27_3:53 PM 13 | * @Despriction: 登录账号信息 14 | */ 15 | 16 | @Data 17 | public class Account { 18 | 19 | @ApiModelProperty("登录类型") 20 | private String type; 21 | 22 | @ApiModelProperty("状态") 23 | private String status; 24 | 25 | @ApiModelProperty("权限") 26 | private List currentAuthority; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/exceptions/UploadException.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.exceptions; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * @Auther: lee.guo 9 | * @Date:Created in 2018/9/7_下午6:05 10 | * @Despriction: 11 | */ 12 | 13 | @Data 14 | @EqualsAndHashCode(callSuper = false) 15 | public class UploadException extends RuntimeException { 16 | 17 | 18 | private Integer code; 19 | 20 | public UploadException(ResultEnum resultEnum){ 21 | super(resultEnum.getMsg()); 22 | this.code = resultEnum.getCode(); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/exceptions/EncryptException.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.exceptions; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * @Auther: chengyan.liang 9 | * @Despriction: 10 | * @Date:Created in 4:02 PM 2019/3/19 11 | * @Modify by: 12 | */ 13 | @Data 14 | @EqualsAndHashCode(callSuper = true) 15 | public class EncryptException extends RuntimeException { 16 | 17 | private Integer code; 18 | 19 | public EncryptException(ResultEnum resultEnum) { 20 | super(resultEnum.getMsg()); 21 | this.code = resultEnum.getCode(); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/image/impl/icon/UserTaskIconType.java: -------------------------------------------------------------------------------- 1 | package org.activiti.image.impl.icon; 2 | 3 | public class UserTaskIconType extends TaskIconType { 4 | 5 | @Override 6 | public String getStyleValue() { 7 | return "fill:#d1b575;stroke:none;"; 8 | } 9 | 10 | @Override 11 | public String getDValue() { 12 | return "m 1,17 16,0 0,-1.7778 -5.333332,-3.5555 0,-1.7778 c 1.244444,0 1.244444,-2.3111 1.244444,-2.3111 l 0,-3.0222 C 12.555557,0.8221 9.0000001,1.0001 9.0000001,1.0001 c 0,0 -3.5555556,-0.178 -3.9111111,3.5555 l 0,3.0222 c 0,0 0,2.3111 1.2444443,2.3111 l 0,1.7778 L 1,15.2222 1,17 17,17"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/constants/ActivitiStatus.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.constants; 2 | 3 | /** 4 | * @Auther: chengyan.liang 5 | * @Despriction: activiti设计集成系统基础参数定义 6 | * @Date:Created in 12:05 PM 2019/3/26 7 | * @Modify by: 8 | */ 9 | public class ActivitiStatus { 10 | 11 | //状态码 12 | public final static String SUCCESS = "000"; 13 | public final static String FAIL = "001"; 14 | public final static String NO_LOGIN = "003"; 15 | public final static String NO_PRIVILEGE = "004"; 16 | 17 | //资源状态 18 | public final static int DELETE = 0; 19 | public final static int ENABLE = 1; 20 | public final static int DISABLE = 2; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/image/impl/icon/ScriptTaskIconType.java: -------------------------------------------------------------------------------- 1 | package org.activiti.image.impl.icon; 2 | 3 | public class ScriptTaskIconType extends TaskIconType { 4 | 5 | @Override 6 | public String getStyleValue() { 7 | return "fill:#72a7d0;stroke:none"; 8 | } 9 | 10 | @Override 11 | public String getDValue() { 12 | return "m 5,2 0,0.094 c 0.23706,0.064 0.53189,0.1645 0.8125,0.375 0.5582,0.4186 1.05109,1.228 1.15625,2.5312 l 8.03125,0 1,0 1,0 c 0,-3 -2,-3 -2,-3 l -10,0 z M 4,3 4,13 2,13 c 0,3 2,3 2,3 l 9,0 c 0,0 2,0 2,-3 L 15,6 6,6 6,5.5 C 6,4.1111 5.5595,3.529 5.1875,3.25 4.8155,2.971 4.5,3 4.5,3 L 4,3 z"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/Result.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Auther: lee.guo 8 | * @Despriction: http请求返回的最外层对象 9 | * @Modify by: 10 | */ 11 | 12 | @Data 13 | public class Result { 14 | 15 | /** 错误码 */ 16 | @ApiModelProperty(value = "错误码", name = "错误码") 17 | private Integer status; 18 | 19 | /** 提示信息 */ 20 | @ApiModelProperty(value = "错误码描述", name = "返回消息,成功为“success”,失败为具体失败信息") 21 | private String message; 22 | 23 | /** 具体的内容 */ 24 | @ApiModelProperty(value = "数据对象", name = "数据对象") 25 | private T data; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/OpsappAproveParams.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | /** 8 | * @Auther: lee.guo 9 | * @Despriction: opsapp 审批传来的参数 10 | * @Date: Created in 1:58 PM 2018/10/25 11 | * @Modify by: 12 | */ 13 | 14 | @Data 15 | @ApiModel("opsapp 审批传来的参数") 16 | public class OpsappAproveParams { 17 | 18 | @ApiModelProperty("系统名称") 19 | private String system; 20 | 21 | @ApiModelProperty("qtalk账号") 22 | private String rtx_id; 23 | 24 | @ApiModelProperty("opsapp审批具体参数") 25 | private OpsappVars vars; 26 | 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/controller/ActivitiDesignPageController.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.controller; 2 | 3 | import io.swagger.annotations.Api; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | 7 | /** 8 | * @Auther: chengyan.liang 9 | * @Despriction: editor路径转到modeler.html 10 | * @Date:Created in 11:42 AM 2019/3/26 11 | * @Modify by: 12 | */ 13 | @Api(value = "activitiDesignPageController", tags = "editor路径转到modeler.html模版") 14 | @Controller 15 | public class ActivitiDesignPageController { 16 | @GetMapping("/editor") 17 | public String toModelerHtml(){ 18 | return "/modeler"; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/MobelResult.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Auther: lee.guo 8 | * @Despriction: Mobel http请求返回的最外层对象 9 | * @Modify by: 10 | */ 11 | 12 | @Data 13 | public class MobelResult { 14 | 15 | /** 错误码 */ 16 | @ApiModelProperty(value = "错误码", name = "错误码") 17 | private Integer errcode; 18 | 19 | /** 提示信息 */ 20 | @ApiModelProperty(value = "错误码描述", name = "返回消息,成功为“success”,失败为具体失败信息") 21 | private String msg; 22 | 23 | /** 具体的内容 */ 24 | @ApiModelProperty(value = "数据对象", name = "数据对象") 25 | private T data; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/QtalkTkeyBody.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | /** 8 | * @Auther: lee.guo 9 | * @Despriction: 10 | * @Date: Created in 10:42 PM 2018/12/21 11 | * @Modify by: 12 | */ 13 | @Data 14 | @ApiModel("发送qtalk消息") 15 | public class QtalkTkeyBody { 16 | 17 | @ApiModelProperty("appcode") 18 | private String app_code; 19 | @ApiModelProperty("ckey") 20 | private String ckey; 21 | 22 | public QtalkTkeyBody(String ckey) { 23 | this.app_code = "ops_superoa"; 24 | this.ckey = ckey; 25 | } 26 | 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/exceptions/ActivitiFlowException.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.exceptions; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * @Auther: lee.guo 9 | * @Date:Created in 2018/8/16_下午8:38 10 | * @Despriction: activities的异常 11 | */ 12 | 13 | //避免给继承的方法属性生成get set方法 14 | @EqualsAndHashCode(callSuper = true) 15 | @Data 16 | public class ActivitiFlowException extends RuntimeException { 17 | 18 | private Integer code; 19 | 20 | public ActivitiFlowException(ResultEnum resultEnum) { 21 | super(resultEnum.getMsg()); 22 | this.code = resultEnum.getCode(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/ExtSysResultDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Auther: chengyan.liang 8 | * @Despriction: 集成系统待审批流程结果传送转换 9 | * @Date:Created in 6:02 PM 2019/4/26 10 | * @Modify by: 11 | */ 12 | @Data 13 | public class ExtSysResultDto { 14 | 15 | @ApiModelProperty(value = "单条审批流程更新状态") 16 | private boolean isOk; 17 | 18 | @ApiModelProperty(value = "更新信息") 19 | private String msg = ""; 20 | 21 | @ApiModelProperty(value = "操作方式") 22 | private String operation = ""; 23 | 24 | @ApiModelProperty(value = "更新失败的审批流程信息") 25 | private String errorFlow = ""; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/FlowNodeDataServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | /** 4 | * Created by xing.zhou on 2019/2/20. 5 | * 节点流程数据service 6 | */ 7 | public interface FlowNodeDataServiceI { 8 | 9 | /** 10 | * 保存节点数据 11 | * @param createUserId 12 | * @param createUserName 13 | * @param formDatas 14 | * @param flowKey 15 | * @param flowName 16 | * @param nodeDefKey 17 | * @param nodeName 18 | * @param procInstId 19 | */ 20 | void saveFlowNodeData(String createUserId, String createUserName, String formDatas, String flowKey, String flowName, 21 | String nodeDefKey, String nodeName, String procInstId); 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/PasswordDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Auther: chengyan.liang 8 | * @Despriction: 修改密码 9 | * @Date:Created in 10:14 AM 2019/5/30 10 | * @Modify by: 11 | */ 12 | @Data 13 | public class PasswordDto { 14 | 15 | @ApiModelProperty("用户id") 16 | private String id; 17 | 18 | @ApiModelProperty("用户名") 19 | private String userName; 20 | 21 | @ApiModelProperty("旧密码") 22 | private String oldPassword; 23 | 24 | @ApiModelProperty("新密码") 25 | private String newPassword; 26 | 27 | @ApiModelProperty("确认密码") 28 | private String confirmPassword; 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/OpsappApproveDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | /** 8 | * @Auther: lee.guo 9 | * @Despriction: 10 | * @Date: Created in 1:49 PM 2018/10/25 11 | * @Modify by: 12 | */ 13 | 14 | @Data 15 | @ApiModel("opsapp 审批 返回结果信息") 16 | public class OpsappApproveDto { 17 | 18 | @ApiModelProperty(value = "errcode", name = "errcode") 19 | private String e; 20 | 21 | @ApiModelProperty(value = "message", name = "message") 22 | private String m; 23 | 24 | /** 具体的内容 */ 25 | @ApiModelProperty(value = "数据对象", name = "数据对象") 26 | private T d; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/image/impl/ProcessDiagramDOMGroupManager.java: -------------------------------------------------------------------------------- 1 | package org.activiti.image.impl; 2 | 3 | import org.apache.batik.ext.awt.g2d.GraphicContext; 4 | import org.apache.batik.svggen.DOMGroupManager; 5 | import org.apache.batik.svggen.DOMTreeManager; 6 | 7 | public class ProcessDiagramDOMGroupManager extends DOMGroupManager { 8 | 9 | public ProcessDiagramDOMGroupManager(GraphicContext gc, 10 | DOMTreeManager domTreeManager) { 11 | super(gc, 12 | domTreeManager); 13 | } 14 | 15 | public void setCurrentGroupId(String id) { 16 | this.currentGroup.setAttribute("id", 17 | id); 18 | } 19 | } -------------------------------------------------------------------------------- /src/main/resources/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | OA 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/DoFlowDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import com.qunar.superoa.utils.CommonUtil; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import java.util.Map; 6 | import lombok.Data; 7 | 8 | /** 9 | * @Auther: lee.guo 10 | * @Date:Created in 2018/9/13_下午8:25 11 | * @Despriction: 12 | */ 13 | 14 | @Data 15 | public class DoFlowDto { 16 | @ApiModelProperty(value = "流程实例ID", required = true) 17 | private String flowId; 18 | 19 | @ApiModelProperty(value = "审批意见") 20 | private String memo; 21 | 22 | @ApiModelProperty(value = "转交人userId - 即qtalk") 23 | private String forwardUserId; 24 | 25 | @ApiModelProperty(value = "表单数据") 26 | private Map formDatas; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/exceptions/RoleException.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.exceptions; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * @Author: yang.du 9 | * @Description: 10 | * @Date: Created in 10:30 2018/9/6 11 | */ 12 | @Data 13 | @EqualsAndHashCode(callSuper = false) 14 | public class RoleException extends RuntimeException { 15 | 16 | private Integer code; 17 | 18 | public RoleException (ResultEnum resultEnum) { 19 | super(resultEnum.getMsg()); 20 | this.code = resultEnum.getCode(); 21 | } 22 | 23 | public RoleException (Integer code, String msg) { 24 | super(msg); 25 | this.code = code; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/FormDataServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.dto.FormDataDto; 4 | import com.qunar.superoa.model.FlowModel; 5 | import com.qunar.superoa.model.FormData; 6 | 7 | /** 8 | * Created by xing.zhou on 2018/8/30. 9 | */ 10 | public interface FormDataServiceI { 11 | 12 | /** 13 | * 查询FromDateDto 14 | */ 15 | FormDataDto getFromDataByProcInstId(String procInstId); 16 | 17 | /** 18 | * 查询FromDate 19 | */ 20 | FormData findByProcInstId(String procInstId); 21 | 22 | /** 23 | * 新建保存FromData 24 | */ 25 | FormData addFromData(FormDataDto formDataDto, FlowModel flowModel, boolean update); 26 | 27 | FormData updateFromData(String procInstId, String formDatas); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/ApproveLogDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * Created by xing.zhou on 2018/9/12. 8 | */ 9 | @Data 10 | public class ApproveLogDto { 11 | 12 | @ApiModelProperty(value = "审批人") 13 | private String approveUserId; 14 | 15 | @ApiModelProperty(value = "审批人头像") 16 | private String approveUserAvatar; 17 | 18 | @ApiModelProperty(value = "当前节点") 19 | private String nodeName; 20 | 21 | @ApiModelProperty(value = "下一节点") 22 | private String nextNodeName; 23 | 24 | @ApiModelProperty(value = "审批意见") 25 | private String memo; 26 | 27 | @ApiModelProperty(value = "审批时间") 28 | private String approveTime; 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/utils/JsonUtil.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | /** 4 | * @Auther: chengyan.liang 5 | * @Despriction: 6 | * @Date:Created in 下午7:40 2018/10/29 7 | * @Modify by: 8 | */ 9 | 10 | import com.google.gson.FieldNamingPolicy; 11 | import com.google.gson.Gson; 12 | import com.google.gson.GsonBuilder; 13 | import org.springframework.stereotype.Component; 14 | 15 | /** 16 | * json工具类 17 | */ 18 | @Component 19 | public class JsonUtil { 20 | 21 | /** 22 | * 开启驼峰式和下划线式自动转换 23 | */ 24 | private static GsonBuilder gsonBuilder = new GsonBuilder() 25 | .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).serializeNulls(); 26 | 27 | 28 | public Gson getGson() { 29 | return gsonBuilder.create(); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/FlowCountDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * Created by xing.zhou on 2018/9/11. 8 | */ 9 | @Data 10 | public class FlowCountDto { 11 | @ApiModelProperty(value = "本人草稿流程数") 12 | private int draftCount; 13 | 14 | @ApiModelProperty(value = "本人审批中流程数") 15 | private int approvalCount; 16 | 17 | @ApiModelProperty(value = "本人已完成流程数") 18 | private int offCount; 19 | 20 | @ApiModelProperty(value = "本人已撤销流程数") 21 | private int revokeCount; 22 | 23 | @ApiModelProperty(value = "本人oa待审批流程数") 24 | private int oaUnApproveCount; 25 | 26 | @ApiModelProperty(value = "本人外部系统待审批流程数") 27 | private int extSysUnApproveCount; 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/exceptions/SuperOALoginException.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.exceptions; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * @Auther: lee.guo 9 | * @Date:Created in 2018/9/11_下午3:53 10 | * @Despriction: 11 | */ 12 | 13 | @Data 14 | @EqualsAndHashCode(callSuper = false) 15 | public class SuperOALoginException extends RuntimeException { 16 | 17 | private Integer code; 18 | 19 | public SuperOALoginException (ResultEnum resultEnum) { 20 | super(resultEnum.getMsg()); 21 | this.code = resultEnum.getCode(); 22 | } 23 | 24 | public SuperOALoginException (Integer code, String msg) { 25 | super(msg); 26 | this.code = code; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/utils/SpringSecurityUtil.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | import org.springframework.security.core.context.SecurityContextImpl; 4 | import org.springframework.security.core.userdetails.UserDetails; 5 | 6 | import javax.servlet.http.HttpSession; 7 | 8 | /** 9 | * @Auther: lee.guo 10 | * @Date:Created in 2018/8/23_5:33 PM 11 | * @Despriction: 12 | */ 13 | 14 | public class SpringSecurityUtil { 15 | 16 | //session 由controller 注入参数传入 17 | public static String currentUser(HttpSession session) { 18 | SecurityContextImpl securityContext = (SecurityContextImpl) session.getAttribute("SPRING_SECURITY_CONTEXT"); 19 | return ((UserDetails)securityContext.getAuthentication().getPrincipal()).getUsername(); 20 | } 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/GroupRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.model.WorkGroup; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.data.jpa.repository.JpaSpecificationExecutor; 6 | 7 | import java.util.List; 8 | import java.util.Optional; 9 | 10 | /** 11 | * @Auther: lee.guo 12 | * @Date:Created in 2018/8/17_上午10:24 13 | * @Despriction: 14 | */ 15 | 16 | public interface GroupRepository extends JpaRepository,JpaSpecificationExecutor { 17 | 18 | /** 19 | * 根据年龄查询 20 | * 方法名必须按照固定格式书写 21 | * @param name 22 | * @return girl list 23 | */ 24 | List findByName(Integer name); 25 | 26 | Optional findByName(String name); 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/FlowUserDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Auther: chengyan.liang 8 | * @Despriction: 9 | * @Date:Created in 9:12 PM 2019/1/15 10 | * @Modify by: 11 | */ 12 | @Data 13 | public class FlowUserDto { 14 | @ApiModelProperty( value = "流程flowOrderID" ) 15 | private String flowId; 16 | 17 | @ApiModelProperty( value = "被替换人userId" ) 18 | private String oldUserId; 19 | 20 | @ApiModelProperty( value = "替换人userId,用英文逗号分隔" ) 21 | private String newUserIds; 22 | 23 | @ApiModelProperty( value = "处理备注" ) 24 | private String memo; 25 | 26 | @ApiModelProperty( value = "所做操作:替换 - updateApprover、添加-addApprover、删除-delApprover" ) 27 | private String operationApprover; 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/ExternalQueryDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | import java.util.Map; 7 | 8 | /** 9 | * @author zhouxing 10 | * @date 2019-02-28 11:25 11 | */ 12 | @Data 13 | public class ExternalQueryDto { 14 | 15 | @ApiModelProperty(value = "流程表单模板key(唯一值)") 16 | private String formKey; 17 | 18 | @ApiModelProperty(value = "appCode") 19 | private String appCode; 20 | 21 | @ApiModelProperty(value = "版本号") 22 | private String version; 23 | 24 | @ApiModelProperty(value = "表单") 25 | private Map formDatas; 26 | 27 | @ApiModelProperty(value = "发起人qtalk") 28 | private String currentUserId; 29 | 30 | @ApiModelProperty(value = "发起人name") 31 | private String currentUserName; 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/service/ipml/LdapServiceTest.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service.ipml; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | import org.springframework.test.context.junit4.SpringRunner; 8 | import org.springframework.util.Assert; 9 | 10 | /** 11 | * @Auther: lee.guo 12 | * @Date:Created in 2018/9/27_7:33 PM 13 | * @Despriction: ldap测试 14 | */ 15 | 16 | 17 | @RunWith(SpringRunner.class) 18 | @SpringBootTest 19 | public class LdapServiceTest { 20 | 21 | @Autowired 22 | private LdapService ldapService; 23 | 24 | @Test 25 | public void authenticate() { 26 | Assert.isTrue(ldapService.authenticate("lee.guo", "Qunar.9333"), "执行失败"); 27 | } 28 | } -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/cache/Cache.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.cache; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * @Auther: lee.guo 8 | * @Date:Created in 2018/9/27_8:01 PM 9 | * @Despriction: cache 10 | */ 11 | 12 | public class Cache { 13 | 14 | 15 | private static Map flowDataCache = new HashMap(); 16 | 17 | public static Map getAllFlowDataCache() { 18 | return flowDataCache; 19 | } 20 | 21 | public static Object getFlowDataCacheByKey(String key) { 22 | return flowDataCache.get(key); 23 | } 24 | 25 | public static void setFlowDataCache(String key, Object object) { 26 | flowDataCache.put(key, object); 27 | } 28 | 29 | public static void deleteFlowDataCache(String key) { 30 | flowDataCache.remove(key); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/exceptions/FlowModelException.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.exceptions; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * @Auther: xing.zhou 9 | * @Auther: lee.guo 10 | * @Date:Created in 2018/9/29_2:23 PM 11 | * @Despriction: 12 | */ 13 | 14 | @EqualsAndHashCode(callSuper = true) 15 | @Data 16 | public class FlowModelException extends RuntimeException { 17 | 18 | private Integer code; 19 | 20 | public FlowModelException(ResultEnum resultEnum) { 21 | super(resultEnum.getMsg()); 22 | this.code = resultEnum.getCode(); 23 | } 24 | 25 | public FlowModelException(ResultEnum resultEnum, String message) { 26 | super(resultEnum.getMsg() + "---" + message); 27 | this.code = resultEnum.getCode(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/FormDataDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import com.qunar.superoa.utils.CommonUtil; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * Created by xing.zhou on 2018/8/30. 11 | */ 12 | @Data 13 | public class FormDataDto { 14 | 15 | @ApiModelProperty(value = "流程Id", required = false) 16 | private String procInstId; 17 | 18 | @ApiModelProperty(value = "流程key", required = true) 19 | private String flowKey; 20 | 21 | @ApiModelProperty(value = "流程名称", required = false) 22 | private String flowName; 23 | 24 | @ApiModelProperty(value = "表单数据", required = true) 25 | private Map formDatas; 26 | 27 | public void setFormDatas(Object formDatas) { 28 | this.formDatas = CommonUtil.o2m(formDatas); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/thread/ThreadPool.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.thread; 2 | 3 | import java.util.concurrent.ExecutorService; 4 | import java.util.concurrent.SynchronousQueue; 5 | import java.util.concurrent.ThreadPoolExecutor; 6 | import java.util.concurrent.TimeUnit; 7 | 8 | /** 9 | * @Auther: xing.zhou 10 | * @Despriction: 11 | * @Date:Created in 22:10 2018/11/11 12 | * @Modify by: 13 | */ 14 | public class ThreadPool { 15 | 16 | private static ExecutorService executorService; 17 | 18 | public static ExecutorService createThreadPool() { 19 | if (executorService == null) { 20 | executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 21 | 60L, TimeUnit.SECONDS, 22 | new SynchronousQueue()); 23 | return executorService; 24 | } else { 25 | return executorService; 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/utils/InputStreamToOutUtils.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | import java.io.ByteArrayOutputStream; 4 | import java.io.IOException; 5 | import java.io.InputStream; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | * @Auther: chengyan.liang 10 | * @Despriction: 11 | * @Date:Created in 下午3:01 2018/11/6 12 | * @Modify by: 13 | */ 14 | 15 | /** 16 | * 流的转换 17 | */ 18 | @Component 19 | public class InputStreamToOutUtils { 20 | 21 | public ByteArrayOutputStream inputStreamToOut(InputStream input) throws IOException { 22 | ByteArrayOutputStream baos = new ByteArrayOutputStream(); 23 | byte[] buffer = new byte[1024]; 24 | int len; 25 | while ((len = input.read(buffer)) > -1 ) { 26 | baos.write(buffer, 0, len); 27 | } 28 | baos.flush(); 29 | 30 | return baos; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/service/AdminActivitiServiceTest.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import org.junit.Test; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | 6 | public class AdminActivitiServiceTest { 7 | 8 | @Autowired 9 | private AdminActivitiServiceI adminActivitiServiceI; 10 | 11 | @Test 12 | public void deploy() { 13 | } 14 | 15 | @Test 16 | public void findProcessInstanceList() { 17 | } 18 | 19 | @Test 20 | public void processList() { 21 | } 22 | 23 | @Test 24 | public void updateState() { 25 | } 26 | 27 | @Test 28 | public void delete() { 29 | } 30 | 31 | @Test 32 | public void remove() { 33 | } 34 | 35 | @Test 36 | public void readResource() { 37 | } 38 | 39 | @Test 40 | public void loadByDeployment() { 41 | } 42 | } -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/service/UserServiceTest.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.service.ipml.UserService; 4 | import org.junit.Test; 5 | import org.junit.runner.RunWith; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | import org.springframework.test.context.junit4.SpringRunner; 9 | 10 | /** 11 | * @Auther: chengyan.liang 12 | * @Despriction: 13 | * @Date:Created in 下午2:59 2018/9/29 14 | * @Modify by: 15 | */ 16 | @RunWith(SpringRunner.class) 17 | @SpringBootTest 18 | public class UserServiceTest { 19 | 20 | @Autowired 21 | private UserService userService; 22 | 23 | @Test 24 | public void userUrlTest() { 25 | String url = userService.findUserAvatarByName("mingliang.gao") ; 26 | System.out.println(url); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/ipml/ACLManageServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service.ipml; 2 | 3 | import com.qunar.superoa.dao.ACLManageRepository; 4 | import com.qunar.superoa.model.ACLManage; 5 | import com.qunar.superoa.service.ACLManageServiceI; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.Optional; 11 | 12 | /** 13 | * @author zhouxing 14 | * @date 2019-03-10 15:30 15 | */ 16 | @Service 17 | @Slf4j 18 | public class ACLManageServiceImpl implements ACLManageServiceI { 19 | 20 | @Autowired 21 | private ACLManageRepository aclManageRepository; 22 | 23 | @Override 24 | public Optional getAclManageByIp(String ip) { 25 | return aclManageRepository.getACLManageByIpsLike("%" + ip + "%"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/image/impl/icon/IconType.java: -------------------------------------------------------------------------------- 1 | package org.activiti.image.impl.icon; 2 | 3 | import org.activiti.image.impl.ProcessDiagramSVGGraphics2D; 4 | 5 | public abstract class IconType { 6 | 7 | abstract public Integer getWidth(); 8 | 9 | abstract public Integer getHeight(); 10 | 11 | abstract public String getAnchorValue(); 12 | 13 | abstract public String getFillValue(); 14 | 15 | abstract public String getStyleValue(); 16 | 17 | abstract public String getDValue(); 18 | 19 | abstract public void drawIcon(final int imageX, 20 | final int imageY, 21 | final int iconPadding, 22 | final ProcessDiagramSVGGraphics2D svgGenerator); 23 | 24 | abstract public String getStrokeValue(); 25 | 26 | abstract public String getStrokeWidth(); 27 | } 28 | -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/task/NotifySendJobHandlerTest.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.task; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.junit.Test; 7 | import org.junit.runner.RunWith; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.boot.test.context.SpringBootTest; 10 | import org.springframework.test.context.junit4.SpringRunner; 11 | 12 | /** 13 | * @Auther: chengyan.liang 14 | * @Despriction: 15 | * @Date:Created in 下午3:17 2018/11/9 16 | * @Modify by: 17 | */ 18 | @RunWith(SpringRunner.class) 19 | @SpringBootTest 20 | @Slf4j 21 | public class NotifySendJobHandlerTest { 22 | 23 | @Autowired 24 | private NotifySendJobHandler notifySendJobHandler; 25 | 26 | @Test 27 | public void notifySendTest() throws Exception { 28 | //notifySendJobHandler.execute("s"); 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/AttachmentRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.model.UserAttachment; 4 | import java.util.Date; 5 | import java.util.List; 6 | import java.util.Optional; 7 | import org.springframework.data.jpa.repository.JpaRepository; 8 | 9 | /** 10 | * @Auther: lee.guo 11 | * @Date:Created in 2018/9/7_下午7:23 12 | * @Despriction: 附件表 13 | */ 14 | 15 | public interface AttachmentRepository extends JpaRepository { 16 | 17 | 18 | UserAttachment findByRelationId(String relation); 19 | 20 | Optional> findAllByExpiredDateBefore(Date date); 21 | 22 | /** 23 | *根据md5查找附件内容 24 | */ 25 | Optional findFirstByMd5OrderByUploadDateDesc(String md5); 26 | 27 | /** 28 | * 根据文件名查找附件内容 29 | */ 30 | Optional findByAttachName(String fileName); 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/FromExternalServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.dto.ExternalFlowModelDto; 4 | import com.qunar.superoa.dto.ExternalQueryDto; 5 | import com.qunar.superoa.model.FlowModel; 6 | 7 | import javax.servlet.http.HttpServletRequest; 8 | import java.util.Map; 9 | 10 | /** 11 | * @author zhouxing 12 | * @date 2019-02-27 20:51 13 | */ 14 | public interface FromExternalServiceI { 15 | 16 | /** 17 | * 查询flowModel 18 | * 19 | * @param formKey 20 | * @param appCode 21 | * @return 22 | */ 23 | ExternalFlowModelDto getFlowModelByFormKey(String formKey, String appCode); 24 | 25 | 26 | /** 27 | * 发起流程 28 | * 29 | * @param formKey 30 | * @param appCode 31 | * @param formDatas 32 | * @return 33 | */ 34 | String startFlow(HttpServletRequest request, ExternalQueryDto externalQueryDto); 35 | } 36 | -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/utils/QRCodeUtilTest.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | import com.qunar.superoa.constants.Constant; 4 | import com.qunar.superoa.model.UserAttachment; 5 | import java.io.ByteArrayInputStream; 6 | import java.io.ByteArrayOutputStream; 7 | import java.io.InputStream; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.junit.Test; 10 | import org.junit.runner.RunWith; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.boot.test.context.SpringBootTest; 13 | import org.springframework.test.context.junit4.SpringRunner; 14 | 15 | /** 16 | * @Auther: chengyan.liang 17 | * @Despriction: 18 | * @Date:Created in 下午5:53 2018/11/9 19 | * @Modify by: 20 | */ 21 | @RunWith(SpringRunner.class) 22 | @SpringBootTest 23 | @Slf4j 24 | public class QRCodeUtilTest { 25 | 26 | @Autowired 27 | private MinioUtils minioUtils; 28 | 29 | } -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/security/MerryyounExpiredSessionStrategy.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.security; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import com.qunar.superoa.exceptions.SuperOALoginException; 5 | import java.io.IOException; 6 | import javax.servlet.ServletException; 7 | import org.springframework.security.web.session.SessionInformationExpiredEvent; 8 | import org.springframework.security.web.session.SessionInformationExpiredStrategy; 9 | 10 | /** 11 | * @Auther: lee.guo 12 | * @Date:Created in 2018/10/8_11:35 AM 13 | * @Despriction: 14 | */ 15 | 16 | 17 | public class MerryyounExpiredSessionStrategy implements SessionInformationExpiredStrategy { 18 | 19 | @Override 20 | public void onExpiredSessionDetected(SessionInformationExpiredEvent event) 21 | throws IOException, ServletException { 22 | throw new SuperOALoginException(ResultEnum.LOGIN_OTHER); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/other/RedisTestClass.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.other; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | import org.junit.runner.RunWith; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | import org.springframework.data.redis.core.StringRedisTemplate; 8 | import org.springframework.test.context.junit4.SpringRunner; 9 | 10 | import javax.annotation.Resource; 11 | 12 | /** 13 | * @Auther: lee.guo 14 | * @Date:Created in 2018/9/25_下午3:05 15 | * @Despriction: 测试redis 16 | */ 17 | 18 | @RunWith(SpringRunner.class) 19 | @SpringBootTest 20 | public class RedisTestClass { 21 | 22 | @Resource 23 | private StringRedisTemplate stringRedisTemplate; 24 | 25 | @Test 26 | public void test() { 27 | stringRedisTemplate.opsForValue().set("aaa", "111"); 28 | Assert.assertEquals("111", stringRedisTemplate.opsForValue().get("aaa")); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/FlowOrderDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import com.qunar.superoa.utils.CommonUtil; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * Created by xing.zhou on 2018/9/12. 11 | */ 12 | @Data 13 | public class FlowOrderDto { 14 | 15 | 16 | @ApiModelProperty(value = "流程实例") 17 | FlowOrder flowOrder; 18 | 19 | @ApiModelProperty(value = "表单模板") 20 | private Map formModelJson; 21 | 22 | @ApiModelProperty(value = "表单数据") 23 | private Map formDatas; 24 | 25 | @ApiModelProperty(value = "申请人头像url") 26 | private String applyUserAvatar; 27 | 28 | public void setFormDatas(Object formDatas) { 29 | this.formDatas = CommonUtil.o2m(formDatas); 30 | } 31 | 32 | public void setFormModelJson(Object formModelJson) { 33 | this.formModelJson = CommonUtil.o2m(formModelJson); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/UserRoleDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Author: yang.du 8 | * @Description: 9 | * @Date: Created in 16:04 2018/9/7 10 | */ 11 | 12 | @Data 13 | public class UserRoleDto { 14 | 15 | @ApiModelProperty("用户名称") 16 | private String username; 17 | 18 | @ApiModelProperty("角色") 19 | private String role; 20 | 21 | @ApiModelProperty("角色名称") 22 | private String roleName; 23 | 24 | public UserRoleDto(String username, String role) { 25 | super(); 26 | this.username = username; 27 | this.role = role; 28 | } 29 | 30 | public UserRoleDto(String username, String role, String roleName) { 31 | super(); 32 | this.username = username; 33 | this.role = role; 34 | this.roleName = roleName; 35 | } 36 | 37 | public UserRoleDto() { 38 | super(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/SuperOAUserRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.model.SuperOAUser; 4 | import java.util.List; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | import org.springframework.data.jpa.repository.Query; 7 | 8 | /** 9 | * @Auther: chengyan.liang 10 | * @Despriction: 11 | * @Date:Created in 11:11 AM 2019/5/21 12 | * @Modify by: 13 | */ 14 | public interface SuperOAUserRepository extends JpaRepository { 15 | 16 | /** 17 | * 根据部门id获取全部用户 18 | */ 19 | List findAllByDeptId(String deptId); 20 | 21 | /** 22 | * 根据部门id获取全部用户id 23 | */ 24 | @Query(value = "select userName from SuperOAUser where deptId = ?1 order by userName asc") 25 | List findAllUserNameByDeptId(String deptId); 26 | 27 | /** 28 | * 根据userName获取用户信息 29 | */ 30 | List findByUserName(String userName); 31 | 32 | } 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | <<<<<<< HEAD 2 | /target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | 5 | ### STS ### 6 | .apt_generated 7 | .classpath 8 | .factorypath 9 | .project 10 | .settings 11 | .springBeans 12 | .sts4-cache 13 | 14 | ### IntelliJ IDEA ### 15 | .idea 16 | *.iws 17 | *.iml 18 | *.ipr 19 | 20 | ### NetBeans ### 21 | /nbproject/private/ 22 | /build/ 23 | /nbbuild/ 24 | /dist/ 25 | /nbdist/ 26 | /.nb-gradle/ 27 | ======= 28 | # kdiff3 ignore 29 | *.orig 30 | 31 | # maven ignore 32 | target/ 33 | 34 | # eclipse ignore 35 | .settings/ 36 | .project 37 | .classpath 38 | 39 | # idea ignore 40 | .idea/ 41 | *.ipr 42 | *.iml 43 | *.iws 44 | 45 | # temp ignore 46 | *.log 47 | *.cache 48 | *.diff 49 | *.patch 50 | *.tmp 51 | 52 | # system ignore 53 | .DS_Store 54 | Thumbs.db 55 | 56 | # package ignore (optional) 57 | # *.jar 58 | # *.war 59 | # *.zip 60 | # *.tar 61 | # *.tar.gz 62 | 63 | # pods ignore 64 | Pods/ 65 | >>>>>>> 3fe5431fe6ef90c19f85d6e1ec5492e8403a7cd7 66 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/AgentServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.dto.AgentDto; 4 | import com.qunar.superoa.dto.PageAble; 5 | import com.qunar.superoa.dto.PageResult; 6 | import com.qunar.superoa.model.Agent; 7 | import java.util.List; 8 | import java.util.Optional; 9 | 10 | /** 11 | * @Auther: lee.guo 12 | * @Date:Created in 2018/9/21_上午10:49 13 | * @Despriction: 代理人相关接口 14 | */ 15 | 16 | public interface AgentServiceI { 17 | 18 | /** 19 | * 根据搜索内容 返回分页列表 20 | * 21 | * @param pageAble 分页信息和关键字信息 22 | * @return 返回PageResult结果集 23 | */ 24 | PageResult getListPageAble(PageAble pageAble); 25 | 26 | /** 27 | * 根据被代理人查询代理人 28 | * @param qtalk 29 | * @return 30 | */ 31 | List getAgentByQtalk(String qtalk); 32 | 33 | /** 34 | * 根据代理人查询被代理人 35 | * @param agent 36 | * @return 37 | */ 38 | Optional> getAgentByAgent(String agent); 39 | 40 | } -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/ExtSysFlowModelRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.model.ExtSysFlowModel; 4 | import java.util.List; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | import org.springframework.data.jpa.repository.JpaSpecificationExecutor; 7 | import org.springframework.data.jpa.repository.Query; 8 | 9 | /** 10 | * @Auther: chengyan.liang 11 | * @Despriction: 12 | * @Date:Created in 5:38 PM 2019/4/29 13 | * @Modify by: 14 | */ 15 | public interface ExtSysFlowModelRepository extends JpaRepository, JpaSpecificationExecutor { 16 | 17 | /** 18 | * 查询当前用户可发起流程所涉及到的所有外部系统标识 19 | */ 20 | @Query(value = "select distinct processKeys from ExtSysFlowModel") 21 | List findAllProcessKeys(); 22 | 23 | /** 24 | * 根据原系统id和系统标识查询可发起流程 25 | */ 26 | List findByOidAndAndProcessKeys(String oid, String processKeys); 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/NotifyRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.model.Notify; 4 | import java.util.List; 5 | import org.springframework.data.domain.Page; 6 | import org.springframework.data.domain.Pageable; 7 | import org.springframework.data.jpa.domain.Specification; 8 | import org.springframework.data.jpa.repository.JpaRepository; 9 | 10 | /** 11 | * @Auther: lee.guo 12 | * @Date:Created in 2018/9/11_下午9:06 13 | * @Despriction: 14 | */ 15 | 16 | public interface NotifyRepository extends JpaRepository { 17 | 18 | List findByQtalk(String qtalk); 19 | 20 | Page findByQtalk(String qtalk, Pageable pageAble); 21 | 22 | List findByIdIn(List idList); 23 | 24 | Page findAll(Specification spec, Pageable pageAble); 25 | 26 | List findAllByQtalkStatus(int qtalkStatus); 27 | 28 | List findAllByMailStatus(int mailStatus); 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/ExtSysFlowModelServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.model.ExtSysFlowModel; 4 | import java.util.List; 5 | 6 | /** 7 | * @Auther: chengyan.liang 8 | * @Despriction: 9 | * @Date:Created in 5:42 PM 2019/4/29 10 | * @Modify by: 11 | */ 12 | public interface ExtSysFlowModelServiceI { 13 | 14 | /** 15 | * 更新一条流程 16 | * @param dataSource 集成系统所发送数据 17 | */ 18 | Object updateExtSysFlowModel(Object dataSource); 19 | 20 | /** 21 | * 删除一条流程 22 | * @param dataSource 集成系统所发送数据 23 | */ 24 | Object deleteExtSysFlowModel(Object dataSource); 25 | 26 | /** 27 | * 批量更新流程 28 | * @param dataSource 集成系统所发送数据 29 | */ 30 | Object updatePatchExtSysFlowModel(Object dataSource); 31 | 32 | 33 | /** 34 | * 获取当前用户可发起流程所涉及到的所有外部系统标识 35 | */ 36 | List getExtSysFlowModelProcessKeys(); 37 | 38 | /** 39 | * 获取所有集成系统可发起流程 40 | */ 41 | List getAllExtSysFlowModel(); 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/constants/AuthorityConstant.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.constants; 2 | 3 | /** 4 | * @Auther: chengyan.liang 5 | * @Despriction: 权限校验常量 6 | * @Date:Created in 2:51 PM 2019/5/9 7 | * @Modify by: 8 | */ 9 | public class AuthorityConstant { 10 | 11 | /** 12 | * 外部系统模版接入接口 13 | */ 14 | public static final String EXT_SYS_FORM = "/fromExternal/"; 15 | 16 | /** 17 | * 外部系统流程待审批接入接口 18 | */ 19 | public static final String EXT_SYS_UNAPPROVE_FLOW = "/extSysUnapproveFlow/"; 20 | 21 | /** 22 | * 外部系统流程发起接入接口 23 | */ 24 | public static final String EXT_SYS_FLOW_MODEL = "/extSysFlowModel/"; 25 | 26 | /** 27 | * 所有免登录操作 28 | */ 29 | public static final String NO_NEED_LOGIN = "toIndexHtml,login,logout,dologin,qmonitor,html,healthcheck,details,detailsAllInfo,approve,reject,history"; 30 | 31 | /** 32 | * 外部系统流程待审批、发起 更新、删除接口方法 - 严格IP限制(包括登录时) 33 | */ 34 | public static final String STRICT_EXT_SYS_FLOW = "update,remove,update_patch"; 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/utils/WebSocketUtil.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | import com.google.gson.Gson; 4 | import com.qunar.superoa.model.Notify; 5 | import com.qunar.superoa.service.WebSocketServer; 6 | import org.springframework.stereotype.Component; 7 | import org.springframework.web.socket.TextMessage; 8 | 9 | /** 10 | * @Author: yang.du 11 | * @Description: 12 | * @Date: Created in 9:54 2018/9/10 13 | */ 14 | @Component 15 | public class WebSocketUtil { 16 | 17 | private static WebSocketServer webSocketServer = new WebSocketServer(); 18 | 19 | /** 20 | * 向前端推送消息 21 | * @param target:用户Qtalk 22 | * @param o: 推送信息封装的对象 23 | * @return 是否成功 24 | */ 25 | public static boolean pushMessage (String target, Object o) { 26 | Gson gosn = new Gson(); 27 | return webSocketServer.sendMessageToUser(target, new TextMessage(gosn.toJson(ResultUtil.success(o)))); 28 | } 29 | 30 | public static void pushMessage(Notify notify) { 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/ApproveLogRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.model.ApproveLog; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.util.List; 7 | import java.util.Optional; 8 | 9 | /** 10 | * Created by xing.zhou on 2018/8/31. 11 | */ 12 | public interface ApproveLogRepository extends JpaRepository { 13 | 14 | /** 15 | * 根据oid查询审批日志 16 | * @param oid 17 | * @return 18 | */ 19 | Optional> findByOidOrderByApproveTime(String oid); 20 | 21 | ApproveLog findTopByOidOrderByApproveTimeDesc(String oid); 22 | 23 | /** 24 | * 根据流程实例ID和TaskID获取最后一条日志 25 | */ 26 | ApproveLog findTopByOidAndTaskIdOrderByApproveTimeDesc(String oid, String taskId); 27 | 28 | /** 29 | * 根据流程实例ID和TaskID和managerType获取最后一条日志 30 | */ 31 | ApproveLog findTopByOidAndTaskIdAndManagerTypeOrderByApproveTimeDesc(String oid, String taskId, String type); 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/listener/DeptVPListener.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.listener; 2 | 3 | import com.qunar.superoa.constants.Constant; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | import org.activiti.bpmn.model.UserTask; 7 | import org.activiti.engine.delegate.DelegateExecution; 8 | import org.springframework.stereotype.Component; 9 | 10 | /** 11 | * @Auther: xing.zhou 12 | * @Despriction: 获取部门vp为当前节点审批人 13 | * @Date:Created in 14:32 2018/10/18 14 | * @Modify by: 15 | */ 16 | @Component 17 | public class DeptVPListener extends CandidatesListener { 18 | 19 | /** 20 | * 重写设置节点操作着方法 21 | */ 22 | @Override 23 | public void setGroupApproveUser(UserTask userTask, DelegateExecution delegateExecution) { 24 | String owner = delegateExecution.getVariable("owner").toString(); 25 | List candidateUsers = new ArrayList(); 26 | candidateUsers.add(userInfoUtil.getUserDeptLeader(owner, Constant.DEPT_VP)); 27 | userTask.setCandidateUsers(candidateUsers); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/DepartmentServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | /** 4 | * @Auther: chengyan.liang 5 | * @Despriction: 6 | * @Date:Created in 下午3:00 2018/10/29 7 | * @Modify by: 8 | */ 9 | 10 | import com.qunar.superoa.dto.DepartmentDto; 11 | import com.qunar.superoa.model.Department; 12 | 13 | /** 14 | * 部门信息操作 15 | */ 16 | public interface DepartmentServiceI { 17 | 18 | /** 19 | * 模糊查询部门信息 20 | */ 21 | Object getDeptByK(String kw); 22 | 23 | /** 24 | * 获取整个部门树 25 | */ 26 | Object getDeptTrees(); 27 | 28 | /** 29 | * 获取部门详细信息 30 | */ 31 | Object getDeptInfo(String id); 32 | 33 | /** 34 | * 修改部门信息 - 部门名称、部门VP、部门leaders、部门hrbps 35 | */ 36 | Department updateDepartment(DepartmentDto departmentDto); 37 | 38 | /** 39 | * 添加新部门 - 包括部门名称、部门vp、部门leaders、部门hrbps、部门层级、上级部门id 40 | */ 41 | Department addDepartment(DepartmentDto departmentDto); 42 | 43 | /** 44 | * 删除部门 45 | */ 46 | String deleteDepartment(String id); 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/DeploymentResponse.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import com.fasterxml.jackson.databind.annotation.JsonSerialize; 4 | import java.util.Date; 5 | import lombok.Data; 6 | import org.activiti.engine.repository.Deployment; 7 | import org.activiti.rest.common.util.DateToStringSerializer; 8 | 9 | /** 10 | * @Auther: chengyan.liang 11 | * @Despriction: 12 | * @Date:Created in 11:21 AM 2019/3/26 13 | * @Modify by: 14 | */ 15 | @Data 16 | public class DeploymentResponse { 17 | 18 | private String id; 19 | private String name; 20 | @JsonSerialize(using = DateToStringSerializer.class, as= Date.class) 21 | private Date deploymentTime; 22 | private String category; 23 | private String tenantId; 24 | 25 | public DeploymentResponse(Deployment deployment) { 26 | setId(deployment.getId()); 27 | setName(deployment.getName()); 28 | setDeploymentTime(deployment.getDeploymentTime()); 29 | setCategory(deployment.getCategory()); 30 | setTenantId(deployment.getTenantId()); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/FlowModelNameDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * Created by xing.zhou on 2018/9/12. 8 | */ 9 | @Data 10 | public class FlowModelNameDto { 11 | 12 | @ApiModelProperty(value = "流程表单模板名称(唯一值)") 13 | private String formName; 14 | 15 | @ApiModelProperty(value = "流程表单模板key(唯一值)") 16 | private String formKey; 17 | 18 | @ApiModelProperty(value = "流程表单所属系统") 19 | private String formMark; 20 | 21 | @ApiModelProperty(value = "员工部门Id") 22 | private String unitId; 23 | 24 | public FlowModelNameDto() { 25 | 26 | } 27 | 28 | public FlowModelNameDto(String formKey, String formName) { 29 | this.formKey = formKey; 30 | this.formName = formName; 31 | } 32 | 33 | public FlowModelNameDto(String formKey, String formName, String formMark, String unitId) { 34 | this.formKey = formKey; 35 | this.formName = formName; 36 | this.formMark = formMark; 37 | this.unitId = unitId; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/ActivitiDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * Created by xing.zhou on 2018/9/26. 8 | */ 9 | @Data 10 | public class ActivitiDto { 11 | 12 | @ApiModelProperty("流程Id") 13 | private String deploymentId; 14 | 15 | @ApiModelProperty(value = "流程Name") 16 | private String name; 17 | 18 | @ApiModelProperty(value = "流程key") 19 | private String key; 20 | 21 | @ApiModelProperty(value = "流程版本") 22 | private String version; 23 | 24 | @ApiModelProperty(value = "流程部署时间") 25 | private String deployDateTime; 26 | 27 | @ApiModelProperty(value = "流程实例总数") 28 | private Long flowCount; 29 | 30 | @ApiModelProperty(value = "流程未完成实例数") 31 | private Long flowUnFinishedCount; 32 | 33 | @ApiModelProperty(value = "流程状态") 34 | private String status; 35 | 36 | @ApiModelProperty(value = "图片名称") 37 | private String imgName; 38 | 39 | @ApiModelProperty(value = "流程定义id") 40 | private String processDefinitionId; 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/FilterServletOutputStream.java: -------------------------------------------------------------------------------- 1 | package org.activiti; 2 | 3 | import javax.servlet.ServletOutputStream; 4 | import javax.servlet.WriteListener; 5 | import java.io.DataOutputStream; 6 | import java.io.IOException; 7 | import java.io.OutputStream; 8 | 9 | public class FilterServletOutputStream extends ServletOutputStream { 10 | 11 | private DataOutputStream stream; 12 | private WriteListener writeListener; 13 | 14 | public FilterServletOutputStream(OutputStream output) { 15 | stream = new DataOutputStream(output); 16 | } 17 | 18 | public void write(int b) throws IOException { 19 | stream.write(b); 20 | } 21 | 22 | public void write(byte[] b) throws IOException { 23 | stream.write(b); 24 | } 25 | 26 | public void write(byte[] b, int off, int len) throws IOException { 27 | stream.write(b, off, len); 28 | } 29 | 30 | public void setWriteListener(WriteListener writeListener) { 31 | this.writeListener = writeListener; 32 | } 33 | 34 | public boolean isReady() { 35 | return true; 36 | } 37 | } -------------------------------------------------------------------------------- /canvas.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | 9 | 39 | 40 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/UserRoleRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.dto.UserRoleDto; 4 | import com.qunar.superoa.model.UserRole; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | import org.springframework.data.jpa.repository.Query; 7 | 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | /** 12 | * @Author: yang.du 13 | * @Description: 14 | * @Date: Created in 17:53 2018/8/29 15 | */ 16 | public interface UserRoleRepository extends JpaRepository { 17 | List findByRoleType (String roleType); 18 | 19 | List findByQtalk (String qtalk); 20 | 21 | List findByQtalkAndRoleType (String qtalk, String roleType); 22 | 23 | @Query(value = "SELECT r.qtalk as username,string_agg (r.role_type,',') as role,string_agg (r.role_name,',') as roleName FROM user_role r GROUP BY qtalk", nativeQuery = true) 24 | List> findAllUser (); 25 | 26 | int deleteByQtalkAndRoleType (String qtalk, String roleType); 27 | 28 | int deleteByQtalk (String qtalk); 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/image/exception/ActivitiInterchangeInfoNotFoundException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Alfresco, Inc. and/or its affiliates. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package org.activiti.image.exception; 18 | 19 | /** 20 | * Exception thrown when the BPMN modle doesn't have graphic info inside 21 | */ 22 | public class ActivitiInterchangeInfoNotFoundException extends ActivitiImageException { 23 | 24 | public ActivitiInterchangeInfoNotFoundException(String message) { 25 | super(message); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/UserRoleServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.dto.RoleDto; 4 | import com.qunar.superoa.dto.UserRoleDto; 5 | import com.qunar.superoa.model.SuperOAUser; 6 | import com.qunar.superoa.model.UserRole; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @Author: yang.du 12 | * @Description: 13 | * @Date: Created in 18:00 2018/8/30 14 | */ 15 | public interface UserRoleServiceI { 16 | List getRoleByUser(SuperOAUser superOAUser); 17 | 18 | List getRoleByUserName (String userName); 19 | 20 | List getAllRoleUser (); 21 | 22 | List getRoleByUserNameAndRoleType (String userName, String roleType); 23 | 24 | List getRolesWithCurrentUser (); 25 | 26 | boolean addRole (String userName, List roles); 27 | 28 | boolean modifyRole (UserRole userRole); 29 | 30 | boolean removeRole (UserRole userRole); 31 | 32 | boolean removeRoleByUserNameAndRoleType(String userName, String roleType); 33 | 34 | boolean removeRolesByUserName (String userName); 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/listener/DeptDirectorListener.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.listener; 2 | 3 | import com.qunar.superoa.constants.Constant; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | import org.activiti.bpmn.model.UserTask; 7 | import org.activiti.engine.delegate.DelegateExecution; 8 | import org.springframework.stereotype.Component; 9 | 10 | /** 11 | * @Auther: xing.zhou 12 | * @Despriction: 13 | * @Date:Created in 17:16 2018/11/13 14 | * @Modify by: 15 | * 16 | * ${deptDirectorListener} 17 | */ 18 | @Component 19 | public class DeptDirectorListener extends CandidatesListener { 20 | 21 | /** 22 | * 查询部门主管 23 | * @param userTask 24 | * @param delegateExecution 25 | */ 26 | @Override 27 | public void setGroupApproveUser(UserTask userTask, DelegateExecution delegateExecution) { 28 | String owner = delegateExecution.getVariable("owner").toString(); 29 | List candidateUsers = new ArrayList(); 30 | candidateUsers.add(userInfoUtil.getUserDeptLeader(owner, Constant.DEPT_DIRECTOR)); 31 | userTask.setCandidateUsers(candidateUsers); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/UserRole.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import io.swagger.annotations.ApiParam; 4 | import java.io.Serializable; 5 | import lombok.Data; 6 | 7 | import javax.persistence.*; 8 | import javax.validation.constraints.NotNull; 9 | 10 | /** 11 | * @Auther: lee.guo 12 | * @Date:Created in 2018/8/23_6:35 PM 13 | * @Despriction: 用户角色表 14 | */ 15 | 16 | @Data 17 | @Entity 18 | public class UserRole implements Serializable { 19 | 20 | /** 21 | * ID 22 | */ 23 | @Id 24 | @Column(name = "id") 25 | @GeneratedValue(strategy = GenerationType.AUTO) 26 | private Integer id; 27 | 28 | /** 29 | * 用户Qtalk 30 | */ 31 | @NotNull(message = "用户名不能为空") 32 | @Column(name = "qtalk", nullable = false) 33 | @ApiParam(value = "用户Qtalk", required = true) 34 | private String qtalk; 35 | 36 | /** 37 | * 角色类型 38 | */ 39 | @NotNull(message = "角色类型不能为空") 40 | @ApiParam(value = "角色类型", required = true) 41 | private String roleType; 42 | 43 | /** 44 | * 角色描述 45 | */ 46 | @ApiParam(value = "角色描述", required = true) 47 | private String roleName; 48 | 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/utils/UrlAliveUtil.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | /** 4 | * @Auther: chengyan.liang 5 | * @Despriction: 6 | * @Date:Created in 下午2:31 2018/10/30 7 | * @Modify by: 8 | */ 9 | 10 | import java.net.HttpURLConnection; 11 | import java.net.MalformedURLException; 12 | import java.net.URL; 13 | import org.springframework.stereotype.Component; 14 | 15 | /** 16 | * 检验url地址是否连通 17 | */ 18 | @Component 19 | public class UrlAliveUtil { 20 | 21 | public boolean isUrlAlive(String url) { 22 | boolean isAlive = true; 23 | HttpURLConnection connection; 24 | 25 | try { 26 | URL newUrl = new URL(url); 27 | connection = (HttpURLConnection) newUrl.openConnection(); 28 | connection.setConnectTimeout(1000 * 30); 29 | connection.connect(); 30 | int code = connection.getResponseCode(); 31 | boolean success = (code >= 200) && (code < 300); 32 | if (!success) { 33 | isAlive = false; 34 | } 35 | connection.disconnect(); 36 | } catch (Exception e) { 37 | isAlive = false; 38 | } 39 | return isAlive; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Qunar, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/dao/AttachmentRepositoryTest.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import com.qunar.superoa.model.UserAttachment; 6 | import java.util.Optional; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.boot.test.context.SpringBootTest; 12 | import org.springframework.test.context.junit4.SpringRunner; 13 | 14 | /** 15 | * @Auther: chengyan.liang 16 | * @Despriction: 17 | * @Date:Created in 下午2:22 2018/11/6 18 | * @Modify by: 19 | */ 20 | @RunWith(SpringRunner.class) 21 | @SpringBootTest 22 | @Slf4j 23 | public class AttachmentRepositoryTest { 24 | 25 | @Autowired 26 | private AttachmentRepository attachmentRepository; 27 | 28 | @Test 29 | public void findFirstByMd5OrderByUploadDateDesc() { 30 | Optional userAttachmentOptional = attachmentRepository.findFirstByMd5OrderByUploadDateDesc("d41d8cd98f00b204e9800998ecf8427e"); 31 | log.info(userAttachmentOptional.get().getUrl()); 32 | 33 | } 34 | } -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/ExternalFlowModelDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import com.qunar.superoa.model.FlowModel; 4 | import com.qunar.superoa.utils.CommonUtil; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import lombok.Data; 7 | 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | /** 12 | * @author zhouxing 13 | * @date 2019-02-27 21:38 14 | */ 15 | @Data 16 | public class ExternalFlowModelDto { 17 | 18 | @ApiModelProperty(value = "流程表单模板key(唯一值)", required = true) 19 | private String key; 20 | 21 | @ApiModelProperty(value = "流程表单模板名称(唯一值)", required = true) 22 | private String name; 23 | 24 | @ApiModelProperty(value = "字段组集合") 25 | private List groups; 26 | 27 | @ApiModelProperty(value = "版本号", required = true) 28 | private Integer version; 29 | 30 | public ExternalFlowModelDto(){ 31 | 32 | } 33 | 34 | public ExternalFlowModelDto(FlowModel flowModel){ 35 | key = flowModel.getFormKey(); 36 | name = flowModel.getFormName(); 37 | version = flowModel.getFormVersion(); 38 | groups = (List) CommonUtil.s2m(flowModel.getFormModels()).get("groups"); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/StarTalkUserDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | import java.util.ArrayList; 7 | import java.util.Map; 8 | 9 | /** 10 | * @Auther: lee.guo 11 | * @Date:Created in 2018/9/11_上午10:51 12 | * @Despriction: 13 | */ 14 | 15 | @Data 16 | public class StarTalkUserDto { 17 | 18 | @ApiModelProperty("Qtalk账号") 19 | private String qtalk; 20 | 21 | @ApiModelProperty("中文名") 22 | private String cname; 23 | 24 | @ApiModelProperty("头像") 25 | private String avatar; 26 | 27 | @ApiModelProperty("性别") 28 | private String gender; 29 | 30 | @ApiModelProperty("心情") 31 | private String mood; 32 | 33 | public StarTalkUserDto(ArrayList> listData) { 34 | listData.forEach(stringStringMap -> { 35 | qtalk = stringStringMap.get("user_id"); 36 | cname = stringStringMap.get("user_name"); 37 | avatar = stringStringMap.get("url"); 38 | gender = stringStringMap.get("gender"); 39 | mood = stringStringMap.get("mood"); 40 | }); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/WorkGroup.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import javax.persistence.Column; 6 | import javax.persistence.Lob; 7 | import lombok.Data; 8 | 9 | import javax.persistence.Entity; 10 | import javax.persistence.GeneratedValue; 11 | import javax.persistence.Id; 12 | import javax.validation.constraints.NotNull; 13 | 14 | /** 15 | * @Auther: lee.guo 16 | * @Date:Created in 2018/8/17_上午10:21 17 | * @Despriction: 工作组 18 | */ 19 | 20 | @Data 21 | @Entity 22 | @ApiModel("工作组") 23 | public class WorkGroup { 24 | 25 | /** 26 | * ID 27 | */ 28 | @Id 29 | @GeneratedValue 30 | @ApiModelProperty(value = "工作组ID") 31 | private Integer id; 32 | 33 | /** 34 | * 工作组名称 35 | */ 36 | @NotNull(message = "组名称必填") 37 | @ApiModelProperty(value = "工作组名字", required = true) 38 | private String name; 39 | 40 | /** 41 | * 工作组成员 42 | */ 43 | @ApiModelProperty(value = "工作组成员,逗号分隔") 44 | private String members; 45 | 46 | /** 47 | * 备注 48 | */ 49 | @ApiModelProperty(value = "备注") 50 | private String remarks; 51 | } 52 | -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/utils/MailUtilTest.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | import com.qunar.superoa.dto.MailInfo; 4 | import com.qunar.superoa.model.Notify; 5 | import org.junit.Test; 6 | import org.junit.runner.RunWith; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.beans.factory.annotation.Value; 11 | import org.springframework.boot.test.context.SpringBootTest; 12 | import org.springframework.mail.javamail.JavaMailSender; 13 | import org.springframework.mail.javamail.MimeMessageHelper; 14 | import org.springframework.test.context.junit4.SpringRunner; 15 | 16 | import javax.mail.MessagingException; 17 | import javax.mail.internet.MimeMessage; 18 | 19 | 20 | @RunWith(SpringRunner.class) 21 | @SpringBootTest 22 | public class MailUtilTest { 23 | 24 | private Logger logger = LoggerFactory.getLogger(MailUtilTest.class); 25 | 26 | @Autowired 27 | private MailUtil mailUtil; 28 | @Value("${spring.mail.username}") 29 | private String username; 30 | 31 | 32 | @Test 33 | public void getMimeMessage() { 34 | 35 | } 36 | } -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/utils/FileMD5UtilsTest.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import java.io.File; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.boot.test.context.SpringBootTest; 11 | import org.springframework.test.context.junit4.SpringRunner; 12 | 13 | /** 14 | * @Auther: chengyan.liang 15 | * @Despriction: 16 | * @Date:Created in 上午11:04 2018/11/6 17 | * @Modify by: 18 | */ 19 | @RunWith(SpringRunner.class) 20 | @SpringBootTest 21 | @Slf4j 22 | public class FileMD5UtilsTest { 23 | 24 | @Autowired 25 | private FileMD5Utils fileMD5Utils; 26 | 27 | @Test 28 | public void getMd5ByFile() { 29 | //String md5 = fileMD5Utils.getMd5ByFile(new File("/Users/qitmac000560/Desktop/group.zip")); 30 | String md5 = fileMD5Utils.getMd5ByFile(new File("/Users/qitmac000560/Downloads/g.zip")); 31 | log.info(md5); 32 | } 33 | 34 | @Test 35 | public void getMd5ByInputStream() { 36 | } 37 | 38 | @Test 39 | public void getMd5ByMultiFile() { 40 | } 41 | } -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/AgentRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.model.Agent; 4 | import java.util.Date; 5 | import java.util.List; 6 | import java.util.Optional; 7 | import org.springframework.data.domain.Page; 8 | import org.springframework.data.domain.Pageable; 9 | import org.springframework.data.jpa.domain.Specification; 10 | import org.springframework.data.jpa.repository.JpaRepository; 11 | 12 | /** 13 | * @Auther: lee.guo 14 | * @Date:Created in 2018/8/17_下午12:14 15 | * @Despriction: 16 | */ 17 | public interface AgentRepository extends JpaRepository { 18 | 19 | /** 20 | * 根据条件分页消除 21 | * @param agentSpecification 条件 22 | * @param pageAble 分页 23 | * @return PAGE对象结果 24 | */ 25 | Page findAll(Specification agentSpecification, Pageable pageAble); 26 | 27 | /** 28 | * 根据被代理人查询代理人 29 | * @param qtalk 30 | * @return 31 | */ 32 | List findByDeadlineAfterAndQtalk(Date deadline, String qtalk); 33 | 34 | /** 35 | * 根据代理人查询被代理人 36 | * @param agent 37 | * @return 38 | */ 39 | Optional> findByDeadlineAfterAndAgent(Date deadline, String agent); 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/security/AuthorizationServerConfig.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.security; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.beans.factory.annotation.Qualifier; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.security.authentication.AuthenticationManager; 7 | import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; 8 | import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; 9 | import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; 10 | 11 | @Configuration 12 | @EnableAuthorizationServer 13 | public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { 14 | 15 | @Qualifier("authenticationManagerBean") 16 | @Autowired 17 | private AuthenticationManager authenticationManager; 18 | 19 | @Override 20 | public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 21 | endpoints.authenticationManager(this.authenticationManager); 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/resources/banner2.txt: -------------------------------------------------------------------------------- 1 | ${AnsiColor.BRIGHT_YELLOW} 2 | 3 | $$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$%. 4 | &$ &$ =$ $ 5 | $ $$$$$$= @& 6 | B=$$ $$$$$$ $$&= 7 | $$$$ +1s $$&-$$ +1s $$$ 8 | $$$$ $- $ $$$ 9 | $ $ $ .B 10 | $ @ $ .= 11 | $ $ $ % 12 | $ =$ =$ @& 13 | #$$$$$$$$$% -@$$$$$$$$B 14 | 15 | 莫生 莫生 16 | 气 气 17 | 18 | 代码辣鸡非我意, 19 | 自己动手分田地; 20 | 你若气死谁如意? 21 | 谈笑风生活长命. 22 | 23 | Powered by IS团队` 24 | 25 | ${AnsiColor.BLUE} 26 | spring boot: ${spring-boot.version}${application.version}${application.formatted-version}${application.formatted-version} 27 | ${AnsiColor.BRIGHT_RED} 28 | 佩奇保佑 永不宕机 永无BUG -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/PageAble.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | import org.springframework.data.domain.PageRequest; 6 | import org.springframework.data.domain.Sort; 7 | 8 | /** 9 | * @Auther: lee.guo 10 | * @Date:Created in 2018/9/10_下午7:19 11 | * @Despriction: 分页对象 12 | */ 13 | @Data 14 | public class PageAble { 15 | 16 | /** 17 | * 搜索 18 | */ 19 | @ApiModelProperty("搜索内容") 20 | private String k; 21 | 22 | @ApiModelProperty("当前页, 默认1") 23 | private int page = 1; 24 | 25 | @ApiModelProperty("当前页, 默认10") 26 | private int size = 10; 27 | 28 | @ApiModelProperty("当前页, 默认根据id") 29 | private String sort = "updateTime"; 30 | 31 | @ApiModelProperty("排序方式(DESC/ASC) 默认DESC") 32 | private String direction = "DESC"; 33 | 34 | public PageAble(){} 35 | 36 | public PageRequest getPageAble() { 37 | return PageRequest.of(page < 1 ? 0 : page - 1, 38 | size == 0 ? 6 : size, 39 | new Sort( 40 | "ASC".equalsIgnoreCase(direction) ? Sort.Direction.ASC : Sort.Direction.DESC, 41 | "".endsWith(sort) ? "id" : sort 42 | )); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/utils/TaskLogger.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | import com.xxl.job.core.log.XxlJobLogger; 4 | import lombok.extern.slf4j.Slf4j; 5 | 6 | /** 7 | * @Auther: lee.guo 8 | * @Despriction: 定时任务日志工具 (同时在控制台和调度中心打印日志) 9 | * @Date: Created in 11:16 AM 2018/10/30 10 | * @Modify by: chengyan.liang in 15:13 PM 2018/10/30 11 | */ 12 | 13 | @Slf4j 14 | public class TaskLogger { 15 | 16 | public static void info(String msg) { 17 | log.info(msg); 18 | XxlJobLogger.log(msg); 19 | } 20 | 21 | public static void info(String msg, Object object) { 22 | log.info(msg, object); 23 | XxlJobLogger.log(msg, object); 24 | } 25 | 26 | public static void debug(String msg) { 27 | log.debug(msg); 28 | XxlJobLogger.log(msg); 29 | } 30 | 31 | public static void dubug(String msg, Object object) { 32 | log.debug(msg, object); 33 | XxlJobLogger.log(msg, object); 34 | } 35 | 36 | public static void error(String msg) { 37 | log.error(msg); 38 | XxlJobLogger.log(msg); 39 | } 40 | 41 | public static void error(String msg, Object object) { 42 | log.error(msg, object); 43 | XxlJobLogger.log(msg, object); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/QueryUserDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | import org.springframework.data.domain.PageRequest; 6 | import org.springframework.data.domain.Sort; 7 | 8 | /** 9 | * @Auther: chengyan.liang 10 | * @Despriction: 11 | * @Date:Created in 3:22 PM 2019/5/22 12 | * @Modify by: 13 | */ 14 | @Data 15 | public class QueryUserDto { 16 | 17 | @ApiModelProperty(value = "关键字搜索字段") 18 | private String key; 19 | 20 | @ApiModelProperty("当前页, 默认1") 21 | private int page = 1; 22 | 23 | @ApiModelProperty("当前页, 默认10") 24 | private int size = 10; 25 | 26 | @ApiModelProperty("当前页, 默认根据id") 27 | private String sort = "userName"; 28 | 29 | @ApiModelProperty("排序方式(DESC/ASC) 默认ASC") 30 | private String direction = "ASC"; 31 | 32 | public PageRequest getPageAble() { 33 | return PageRequest.of( 34 | page < 1 ? 0 : page - 1, 35 | size == 0 ? 10 : size, 36 | new Sort( 37 | "ASC".equalsIgnoreCase(direction) ? Sort.Direction.ASC : Sort.Direction.DESC, 38 | "".endsWith(sort) ? "userName" : sort 39 | ) 40 | ); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/listener/HrbpListener.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.listener; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | import org.activiti.bpmn.model.UserTask; 7 | import org.activiti.engine.delegate.DelegateExecution; 8 | import org.springframework.stereotype.Component; 9 | 10 | /** 11 | * 获取hrbp 为当前节点审批人 12 | * Created by xing.zhou on 2018/9/14. 13 | */ 14 | @Component 15 | public class HrbpListener extends CandidatesListener { 16 | 17 | /** 18 | * 重写设置节点操作着方法 19 | * 20 | * @param userTask 21 | * @param delegateExecution 22 | */ 23 | @Override 24 | public void setGroupApproveUser(UserTask userTask, DelegateExecution delegateExecution) { 25 | String owner = delegateExecution.getVariable("owner").toString(); 26 | List candidateUsers = new ArrayList(); 27 | String hrbps = userInfoUtil.getUserHrbp(owner); 28 | Arrays.stream(hrbps.replaceAll(";",",").split(",")).forEach(hrbp ->{ 29 | if(!hrbp.isEmpty()){ 30 | candidateUsers.add(hrbp); 31 | } 32 | }); 33 | userTask.setCandidateUsers(candidateUsers); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/UserInfoApiServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.dto.StarTalkUserDetailBody; 4 | import java.util.Map; 5 | import org.springframework.cloud.openfeign.FeignClient; 6 | import org.springframework.stereotype.Service; 7 | import org.springframework.web.bind.annotation.PostMapping; 8 | import org.springframework.web.bind.annotation.RequestBody; 9 | 10 | /** 11 | * @Auther: chengyan.liang 12 | * @Despriction: 获取员工信息接口(姓名、部门、直属领导、部门总监、hrbp、hrd等) 13 | * @Date:Created in 2:34 PM 2019/5/10 14 | * @Modify by: 15 | */ 16 | @Service 17 | @FeignClient(url = "${api.starTalk}", name = "userDetailApi") 18 | public interface UserInfoApiServiceI { 19 | 20 | /** 21 | * 获取用户汇报线关系、部门等信息 22 | */ 23 | @PostMapping(value = "/newapi/getOa.qunar", produces = "application/json;charset=utf-8") 24 | String getUserInfoByUserId(@RequestBody Map userInfoBody); 25 | 26 | /** 27 | * 获取用户详细信息包括姓名、性别、签名、头像地址等信息 28 | */ 29 | @PostMapping(value = "/corp/userinfo/get_user_info.qunar", produces = "application/json;charset=utf-8") 30 | String getUserDetailByUserId(@RequestBody StarTalkUserDetailBody starTalkUserDetailBody); 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/image/impl/ProcessDiagramSVGGraphics2D.java: -------------------------------------------------------------------------------- 1 | package org.activiti.image.impl; 2 | 3 | import java.util.Map; 4 | 5 | import org.apache.batik.svggen.SVGGraphics2D; 6 | import org.w3c.dom.Document; 7 | 8 | public class ProcessDiagramSVGGraphics2D extends SVGGraphics2D { 9 | 10 | public ProcessDiagramSVGGraphics2D(Document domFactory) { 11 | super(domFactory); 12 | this.setDOMGroupManager(new ProcessDiagramDOMGroupManager(this.getGraphicContext(), 13 | this.getDOMTreeManager())); 14 | } 15 | 16 | @Override 17 | public void setRenderingHints(@SuppressWarnings("rawtypes") Map hints) { 18 | super.setRenderingHints(hints); 19 | } 20 | 21 | @Override 22 | public void addRenderingHints(@SuppressWarnings("rawtypes") Map hints) { 23 | super.addRenderingHints(hints); 24 | } 25 | 26 | public void setCurrentGroupId(String id) { 27 | this.getExtendDOMGroupManager().setCurrentGroupId(id); 28 | } 29 | 30 | public ProcessDiagramDOMGroupManager getExtendDOMGroupManager() { 31 | return (ProcessDiagramDOMGroupManager) super.getDOMGroupManager(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/DepartmentDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import java.util.List; 5 | import javax.validation.constraints.NotNull; 6 | import lombok.Data; 7 | 8 | /** 9 | * @Auther: chengyan.liang 10 | * @Despriction: 添加/更新部门 11 | * @Date:Created in 3:34 PM 2019/5/21 12 | * @Modify by: 13 | */ 14 | @Data 15 | public class DepartmentDto { 16 | 17 | @ApiModelProperty(value = "部门id") 18 | private String id; 19 | 20 | @NotNull 21 | @ApiModelProperty(value = "部门名称") 22 | private String name; 23 | 24 | @ApiModelProperty(value = "部门vp") 25 | private String vp = ""; 26 | 27 | @ApiModelProperty(value = "部门领导") 28 | private String leaders = ""; 29 | 30 | @ApiModelProperty(value = "部门hrbps") 31 | private String hrbps = ""; 32 | 33 | @ApiModelProperty(value = "部门层级") 34 | private Integer deep; 35 | 36 | @ApiModelProperty(value = "上级部门id") 37 | private String pid; 38 | 39 | @ApiModelProperty(value = "以'/'连接的一级部门到当前部门") 40 | private String nodeNameStr; 41 | 42 | @ApiModelProperty(value = "部门人数") 43 | private Integer userSize; 44 | 45 | @ApiModelProperty(value = "所有用户信息") 46 | private List usersInfo; 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/OpsappModel.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import java.util.ArrayList; 6 | import java.util.HashMap; 7 | import java.util.List; 8 | import java.util.Map; 9 | import lombok.Data; 10 | 11 | /** 12 | * @Auther: lee.guo 13 | * @Despriction: opsapp最外层封装 14 | * @Date: Created in 6:14 PM 2018/10/16 15 | * @Modify by: 16 | */ 17 | @Data 18 | @ApiModel("opsapp参数数据") 19 | public class OpsappModel { 20 | 21 | @ApiModelProperty("dataSource") 22 | private List dataSource; 23 | 24 | public List> getDataSource() { 25 | return dataSource; 26 | } 27 | 28 | public OpsappModel(List data, Boolean isPatch) { 29 | List> dataSource = new ArrayList(); 30 | Map dataSourceM = new HashMap<>(); 31 | dataSourceM.put("processKeys", "QUNAR_SUPER_OA"); 32 | if (isPatch) { 33 | dataSourceM.put("add", new ArrayList<>()); 34 | dataSourceM.put("remove", data); 35 | } else { 36 | dataSourceM.put("data", data); 37 | } 38 | dataSource.add(dataSourceM); 39 | this.dataSource = dataSource; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/OpsappVars.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | /** 8 | * @Auther: lee.guo 9 | * @Despriction: opsapp审批具体参数 10 | * @Date: Created in 2:01 PM 2018/10/25 11 | * @Modify by: 12 | */ 13 | 14 | @Data 15 | @ApiModel("opsapp审批具体参数") 16 | public class OpsappVars { 17 | 18 | 19 | @ApiModelProperty(value = "id", name = "id", required = true) 20 | private String taskIds; 21 | 22 | @ApiModelProperty(value = "审批操作", name = "审批操作", required = true) 23 | private String approve; 24 | 25 | @ApiModelProperty(value = "原因", name = "原因", required = false) 26 | private String reason; 27 | 28 | @ApiModelProperty(value = "查询条数", name = "查询条数", required = false) 29 | private String length; 30 | 31 | @ApiModelProperty(value = "processKeys = super-oa") 32 | private String processKeys; 33 | 34 | @ApiModelProperty("开始条目") 35 | private String start; 36 | 37 | @ApiModelProperty("user") 38 | private String user; 39 | 40 | @ApiModelProperty("keywords") 41 | private String keywords; 42 | 43 | @ApiModelProperty("表单数据") 44 | private String formDatas; 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/GroupServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.dto.PageResult; 4 | import com.qunar.superoa.dto.QueryWorkGroupDto; 5 | import com.qunar.superoa.dto.Result; 6 | import com.qunar.superoa.model.WorkGroup; 7 | import org.springframework.data.domain.Page; 8 | 9 | /** 10 | * created by chengyan.liang on 2018/9/25 11 | */ 12 | public interface GroupServiceI { 13 | 14 | /** 15 | * 添加一个工作组 16 | * @param workGroup 工作组 17 | * @return 18 | */ 19 | WorkGroup saveWorkGroup(WorkGroup workGroup); 20 | 21 | /** 22 | * 根据id查询工作组 23 | * @param id 工作组id 24 | * @return 25 | */ 26 | WorkGroup findWorkGroupById(Integer id); 27 | 28 | /** 29 | * 根据id删除工作组 30 | * @param id 31 | * @return 32 | */ 33 | void deleteWorkGroupById(Integer id); 34 | 35 | /** 36 | * 更新WorkGroup 37 | * @param workGroup 工作组 38 | * @return 39 | */ 40 | WorkGroup updateWorkGroup(WorkGroup workGroup); 41 | 42 | /** 43 | * 查询group列表 44 | * @param queryWorkGroupDto 工作组中间类 45 | * @return 46 | */ 47 | PageResult findWorkGroupByLike(QueryWorkGroupDto queryWorkGroupDto); 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/task/ShardingJobHandler.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.task; 2 | 3 | import com.xxl.job.core.biz.model.ReturnT; 4 | import com.xxl.job.core.handler.IJobHandler; 5 | import com.xxl.job.core.handler.annotation.JobHandler; 6 | import com.xxl.job.core.log.XxlJobLogger; 7 | import com.xxl.job.core.util.ShardingUtil; 8 | import org.springframework.stereotype.Service; 9 | 10 | /** 11 | * @Auther: lee.guo 12 | * @Despriction: 13 | * @Date: Created in 4:47 PM 2018/10/29 14 | * @Modify by: 15 | */ 16 | @JobHandler(value = "shardingJobHandler") 17 | @Service 18 | public class ShardingJobHandler extends IJobHandler { 19 | 20 | @Override 21 | public ReturnT execute(String param) throws Exception { 22 | 23 | // 分片参数 24 | ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo(); 25 | XxlJobLogger.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardingVO.getIndex(), shardingVO.getTotal()); 26 | 27 | // 业务逻辑 28 | for (int i = 0; i < shardingVO.getTotal(); i++) { 29 | if (i == shardingVO.getIndex()) { 30 | XxlJobLogger.log("第 {} 片, 命中分片开始处理", i); 31 | } else { 32 | XxlJobLogger.log("第 {} 片, 忽略", i); 33 | } 34 | } 35 | 36 | return SUCCESS; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/utils/InvokeUtil.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | import com.qunar.superoa.enums.ResultEnum; 4 | import com.qunar.superoa.exceptions.InvokeException; 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | 8 | import java.lang.reflect.InvocationTargetException; 9 | 10 | /** 11 | * @Auther: lee.guo 12 | * @Date:Created in 2018/9/10_下午6:10 13 | * @Despriction: 反射工具类 14 | */ 15 | 16 | 17 | public class InvokeUtil { 18 | 19 | private final static Logger logger = LoggerFactory.getLogger(InvokeUtil.class); 20 | 21 | public static Object newDto(Object model, Class dtoClass) { 22 | logger.info("model: ${} dto: ${}", model, dtoClass); 23 | try { 24 | return dtoClass.getConstructor(Object.class).newInstance(model); 25 | } catch (InstantiationException e) { 26 | e.printStackTrace(); 27 | } catch (IllegalAccessException e) { 28 | e.printStackTrace(); 29 | } catch (InvocationTargetException e) { 30 | e.printStackTrace(); 31 | } catch (NoSuchMethodException e) { 32 | e.printStackTrace(); 33 | } 34 | throw new InvokeException(ResultEnum.INVOKE_ERROR); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/other/SecurityTest.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.other; 2 | 3 | import com.qunar.superoa.security.SecurityUtils; 4 | import java.util.List; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.junit.Test; 7 | import org.junit.runner.RunWith; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.boot.test.context.SpringBootTest; 10 | import org.springframework.security.core.session.SessionRegistry; 11 | import org.springframework.test.context.junit4.SpringRunner; 12 | 13 | /** 14 | * @Auther: lee.guo 15 | * @Date:Created in 2018/9/25_下午5:34 16 | * @Despriction: 测试登录相关 17 | */ 18 | 19 | @Slf4j 20 | @RunWith(SpringRunner.class) 21 | @SpringBootTest 22 | public class SecurityTest { 23 | 24 | @Autowired 25 | private SessionRegistry sessionRegistry; 26 | 27 | @Autowired 28 | private SecurityUtils securityUtils; 29 | 30 | @Test 31 | public void test() { 32 | log.info("u begin"); 33 | securityUtils.logInAs("lee.guo"); 34 | List allPrincipals = sessionRegistry.getAllPrincipals(); 35 | log.info("${}", allPrincipals.size()); 36 | allPrincipals.forEach(System.out::println); 37 | //可以转换成spring的User} 38 | log.info("u end"); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/ACLManage.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | import javax.persistence.Column; 8 | import javax.persistence.Entity; 9 | import javax.persistence.GeneratedValue; 10 | import javax.persistence.Id; 11 | import javax.validation.constraints.NotNull; 12 | 13 | /** 14 | * @author zhouxing 15 | * @date 2019-03-10 15:17 16 | */ 17 | @Data 18 | @Entity 19 | @ApiModel("acl限制") 20 | public class ACLManage { 21 | 22 | @Id 23 | @GeneratedValue(generator = "jpa-uuid") 24 | @Column(length = 32) 25 | @ApiModelProperty("ID") 26 | private String id; 27 | 28 | @NotNull(message = "ip") 29 | @ApiModelProperty(value = "ips", required = true) 30 | private String ips; 31 | 32 | @NotNull(message = "apis") 33 | @ApiModelProperty(value = "apis", required = true) 34 | private String apis; 35 | 36 | @NotNull(message = "flows") 37 | @ApiModelProperty(value = "flows", required = true) 38 | private String flows; 39 | 40 | @ApiModelProperty(value = "负责人", required = true) 41 | private String users; 42 | 43 | @ApiModelProperty(value = "描述") 44 | private String remark; 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/utils/CookieUtils.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | import javax.servlet.http.Cookie; 4 | import javax.servlet.http.HttpServletRequest; 5 | import javax.servlet.http.HttpServletResponse; 6 | import lombok.extern.slf4j.Slf4j; 7 | 8 | /** 9 | * 10 | * Cookie 工具类 11 | * 12 | * @Auther: lee.guo 13 | * @Despriction: 14 | * @Date: Created in 14:18 2019-02-26 15 | * @Modify by: 16 | */ 17 | @Slf4j 18 | public class CookieUtils { 19 | 20 | public static String getCookie(HttpServletRequest request, String cookieName) { 21 | 22 | Cookie[] cookies = request.getCookies(); 23 | if (cookies != null) { 24 | for (Cookie cookie : cookies) { 25 | log.info("cookies [ {}: {} ] ({})", cookie.getName(), cookie.getValue(), cookie.getDomain()); 26 | if (cookie.getName().equals(cookieName)) { 27 | return cookie.getValue(); 28 | } 29 | } 30 | } 31 | 32 | return null; 33 | } 34 | 35 | 36 | public static void writeCookie(HttpServletResponse response, String cookieName, String value) { 37 | Cookie cookie = new Cookie(cookieName, value); 38 | cookie.setPath("/"); 39 | cookie.setMaxAge(3600); 40 | response.addCookie(cookie); 41 | } 42 | 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/image/exception/ActivitiImageException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Alfresco, Inc. and/or its affiliates. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.activiti.image.exception; 17 | 18 | /** 19 | * Runtime exception for all image logic. 20 | */ 21 | public class ActivitiImageException extends RuntimeException { 22 | 23 | private static final long serialVersionUID = 1L; 24 | 25 | public ActivitiImageException(String message, 26 | Throwable cause) { 27 | super(message, 28 | cause); 29 | } 30 | 31 | public ActivitiImageException(String message) { 32 | super(message); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/ExtSysUnapproveFlowRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.model.ExtSysUnapproveFlow; 4 | import java.util.List; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | import org.springframework.data.jpa.repository.JpaSpecificationExecutor; 7 | import org.springframework.data.jpa.repository.Query; 8 | 9 | /** 10 | * @Auther: chengyan.liang 11 | * @Despriction: 集成系统待审批流程数据库操作层 12 | * @Date:Created in 4:02 PM 2019/4/26 13 | * @Modify by: 14 | */ 15 | public interface ExtSysUnapproveFlowRepository extends JpaRepository, JpaSpecificationExecutor { 16 | 17 | /** 18 | * 根据原系统id和系统标识查询待审批流程 19 | */ 20 | List findByOidAndAndProcessKeysOrderByUpdateTimeDesc(String oid, String processKeys); 21 | 22 | /** 23 | * 查询当前用户申请的进行中的流程数 24 | */ 25 | int countByApplyUserLike(String userId); 26 | 27 | /** 28 | * 查询用户当前待审批的流程数 29 | */ 30 | int countByApproveUsersLike(String userId); 31 | 32 | /** 33 | * 查询当前用户待审批流程所涉及到的所有外部系统标识 34 | */ 35 | @Query(value = "select distinct processKeys from ExtSysUnapproveFlow where approveUsers like %?1%") 36 | List findAllProcessKeys(String userId); 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/OAUserRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.model.SuperOAUser; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.util.List; 7 | import org.springframework.data.jpa.repository.JpaSpecificationExecutor; 8 | 9 | /** 10 | * @Author: chengyan.liang 11 | * @Description: 12 | * @Date: Created in 17:52 2018/8/29 13 | */ 14 | public interface OAUserRepository extends JpaRepository, JpaSpecificationExecutor { 15 | 16 | /** 17 | * 根据userId查询用户 18 | */ 19 | List findByUserName(String username); 20 | 21 | /** 22 | * 根据用户中文名查询所有用户 23 | */ 24 | List findAllByCname (String cname); 25 | 26 | /** 27 | * 根据kw模糊查询cname含有kw的所有用户 28 | */ 29 | List findAllByCnameContaining(String kw); 30 | 31 | /** 32 | * 根据kw模糊查询userName含有kw的所有用户 33 | */ 34 | List findAllByUserNameContaining(String kw); 35 | 36 | /** 37 | * 查询所有leader为userName的用户 38 | */ 39 | List findAllByLeader(String userName); 40 | 41 | /** 42 | * 查询所有hr为userName的用户 43 | */ 44 | List findAllByHr(String userName); 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/QueryWorkGroupDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | import org.springframework.data.domain.PageRequest; 6 | import org.springframework.data.domain.Sort; 7 | 8 | /** 9 | * Created by xing.zhou on 2018/9/18. 10 | */ 11 | @Data 12 | public class QueryWorkGroupDto { 13 | 14 | @ApiModelProperty(value = "工作组名字") 15 | private String name; 16 | 17 | @ApiModelProperty(value = "工作组成员,逗号分隔") 18 | private String members; 19 | 20 | @ApiModelProperty(value = "模糊搜索条件") 21 | private String search; 22 | 23 | @ApiModelProperty("当前页, 默认1") 24 | private int page = 1; 25 | 26 | @ApiModelProperty("当前页, 默认10") 27 | private int size = 10; 28 | 29 | @ApiModelProperty("当前页, 默认根据id") 30 | private String sort = "applyTime"; 31 | 32 | @ApiModelProperty("排序方式(DESC/ASC) 默认DESC") 33 | private String direction = "DESC"; 34 | 35 | public PageRequest getPageAble() { 36 | return PageRequest.of( 37 | page < 1 ? 0 : page - 1, 38 | size == 0 ? 10 : size, 39 | new Sort( 40 | "ASC".equalsIgnoreCase(direction) ? Sort.Direction.ASC : Sort.Direction.DESC, 41 | "".endsWith(sort) ? "id" : sort 42 | ) 43 | ); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/task/DemoJobHandler.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.task; 2 | 3 | import com.xxl.job.core.biz.model.ReturnT; 4 | import com.xxl.job.core.handler.IJobHandler; 5 | import com.xxl.job.core.handler.annotation.JobHandler; 6 | import com.xxl.job.core.log.XxlJobLogger; 7 | import java.util.concurrent.TimeUnit; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.springframework.stereotype.Component; 10 | 11 | 12 | /** 13 | * 任务Handler示例(Bean模式) 14 | * 15 | * 开发步骤: 16 | * 17 | * 1、继承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”; 2、注册到Spring容器:添加“@Component”注解,被Spring容器扫描为Bean实例; 18 | * 3、注册到执行器工厂:添加“@JobHandler(value="自定义jobhandler名称")”注解,注解value值对应的是调度中心新建任务的JobHandler属性的值。 19 | * 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志; 20 | */ 21 | 22 | @Slf4j 23 | @JobHandler(value = "demoJobHandler") 24 | @Component 25 | public class DemoJobHandler extends IJobHandler { 26 | 27 | @Override 28 | public ReturnT execute(String param) throws Exception { 29 | XxlJobLogger.log("XXL-JOB, Hello World."); 30 | log.info("XXL-JOB, Hello World."); 31 | for (int i = 0; i < 5; i++) { 32 | XxlJobLogger.log("beat at:" + i); 33 | log.info("beat at:" + i); 34 | TimeUnit.SECONDS.sleep(2); 35 | } 36 | 37 | return SUCCESS; 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/config/WebSocketConfig.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.config; 2 | 3 | import com.qunar.superoa.interceptor.WebSocketInterceptor; 4 | import com.qunar.superoa.service.WebSocketServer; 5 | import org.apache.tomcat.websocket.server.WsSci; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | import org.springframework.web.socket.config.annotation.EnableWebSocket; 9 | import org.springframework.web.socket.config.annotation.WebSocketConfigurer; 10 | import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; 11 | import org.springframework.web.socket.server.standard.ServerEndpointExporter; 12 | 13 | /** 14 | * @Author: yang.du 15 | * @Description: WebSocket的配置类 16 | * @Date: Created in 14:52 2018/9/4 17 | */ 18 | 19 | @Configuration 20 | @EnableWebSocket 21 | public class WebSocketConfig implements WebSocketConfigurer { 22 | 23 | @Override 24 | public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 25 | registry.addHandler(webSocketServer(), "/websocket").addInterceptors(new WebSocketInterceptor()); 26 | } 27 | 28 | // @Bean 29 | public WebSocketServer webSocketServer() { 30 | return new WebSocketServer (); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/QtalkAddMucUserBody.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | import lombok.Data; 8 | import lombok.extern.slf4j.Slf4j; 9 | 10 | /** 11 | * @Auther: lee.guo 12 | * @Despriction: 13 | * @Date: Created in 5:16 PM 2018/12/21 14 | * @Modify by: 15 | */ 16 | @Data 17 | @Slf4j 18 | @ApiModel("拉入群的参数") 19 | public class QtalkAddMucUserBody { 20 | 21 | @ApiModelProperty("qtalk域") 22 | private String muc_domain; 23 | 24 | @ApiModelProperty("群ID") 25 | private String muc_id; 26 | 27 | @ApiModelProperty("成员") 28 | private List muc_member; 29 | 30 | @ApiModelProperty("操作人") 31 | private String muc_owner; 32 | 33 | @ApiModelProperty("appcode") 34 | private String system; 35 | 36 | public QtalkAddMucUserBody(String muc_id, String muc_owner, String muc_domain, String muc_member, 37 | String system) { 38 | List memberList = new ArrayList<>(); 39 | memberList.add(muc_member); 40 | this.muc_id = muc_id; 41 | this.muc_domain = muc_domain; 42 | this.muc_owner = muc_owner; 43 | this.muc_member = memberList; 44 | this.system = system; 45 | } 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/NotifyServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.dto.NotifyDto; 4 | import com.qunar.superoa.dto.PageResult; 5 | import com.qunar.superoa.model.Notify; 6 | import com.qunar.superoa.dto.PageAble; 7 | 8 | /** 9 | * @Auther: lee.guo 10 | * @Date:Created in 2018/9/11_下午9:08 11 | * @Despriction: 通知服务接口 12 | */ 13 | 14 | public interface NotifyServiceI { 15 | 16 | /** 17 | * 发送通知 18 | * @param notify 19 | */ 20 | void sendNotify(Notify notify); 21 | 22 | /** 23 | * 发送通知 24 | * @param notify 25 | * @param qtalks (qtalk账号逗号分隔) 26 | */ 27 | void sendNotify(Notify notify, String qtalks); 28 | 29 | /** 30 | * 批量清除读消息 31 | * @param ids 32 | */ 33 | void readNotify(String ids); 34 | 35 | /** 36 | * 获取当前用户通知 37 | * @param pageAble 38 | * @return 39 | */ 40 | PageResult findAll(PageAble pageAble); 41 | 42 | /** 43 | * 获取所有用户通知 44 | * @param pageAble 45 | * @return 46 | */ 47 | PageResult findCurrentUserNotify(PageAble pageAble); 48 | 49 | /** 50 | * 获取所有用户通知 51 | * @param pageAble 52 | * @return 53 | */ 54 | PageResult findUnread(PageAble pageAble); 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/StarTalkUserDetailBody.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | import lombok.Data; 7 | import lombok.extern.slf4j.Slf4j; 8 | 9 | /** 10 | * @Auther: lee.guo 11 | * @Date:Created in 2018/9/11_上午11:36 12 | * @Despriction: 获取Qtalk信息的请求参数 13 | */ 14 | 15 | @Data 16 | @Slf4j 17 | public class StarTalkUserDetailBody { 18 | 19 | @ApiModelProperty("appcode") 20 | private String system = "ops_superoa"; 21 | 22 | @ApiModelProperty("UserList") 23 | private List users; 24 | 25 | public StarTalkUserDetailBody(){ 26 | 27 | } 28 | 29 | public StarTalkUserDetailBody(String userName) { 30 | this.system = "ops_superoa"; 31 | List users = new ArrayList<>(); 32 | users.add(new Users(userName)); 33 | this.users = users; 34 | log.info("${} 正在获取StarTalkUserInfo信息", users); 35 | } 36 | } 37 | 38 | @Data 39 | class Users { 40 | 41 | @ApiModelProperty("userId,用户唯一标识") 42 | private String username; 43 | 44 | @ApiModelProperty("用户域") 45 | private String host; 46 | 47 | Users(String userName) { 48 | this.username = userName; 49 | this.host = "qtalk.test.org"; 50 | } 51 | } -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/listener/HrdListener.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.listener; 2 | 3 | /** 4 | * @Auther: chengyan.liang 5 | * @Despriction: 6 | * @Date:Created in 4:43 PM 2018/12/11 7 | * @Modify by: 8 | */ 9 | 10 | import com.google.common.collect.Lists; 11 | import com.qunar.superoa.constants.Constant; 12 | import java.util.Arrays; 13 | import java.util.List; 14 | import org.activiti.bpmn.model.UserTask; 15 | import org.activiti.engine.delegate.DelegateExecution; 16 | import org.apache.commons.lang.StringUtils; 17 | import org.springframework.stereotype.Component; 18 | 19 | /** 20 | * 获取流程发起人的人力资源总监Hrd 21 | */ 22 | @Component 23 | public class HrdListener extends CandidatesListener { 24 | 25 | /** 26 | * 重写设置节点审批人方法 27 | */ 28 | @Override 29 | public void setGroupApproveUser(UserTask userTask, DelegateExecution delegateExecution) { 30 | String owner = delegateExecution.getVariable("owner").toString(); 31 | List candidatesUsers = Lists.newArrayList(); 32 | String hrds = userInfoUtil.getUserDeptLeader(owner, Constant.DEPT_HRD); 33 | Arrays.stream(hrds.split(",")).forEach(hrd -> { 34 | if (StringUtils.isNotBlank(hrd)) { 35 | candidatesUsers.add(hrd); 36 | } 37 | }); 38 | 39 | userTask.setCandidateUsers(candidatesUsers); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/PageableDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | 4 | import org.springframework.data.domain.Pageable; 5 | import org.springframework.data.domain.Sort; 6 | 7 | /** 8 | * @Auther: xing.zhou 9 | * @Despriction: 10 | * @Date:Created in 19:44 2018/11/2 11 | * @Modify by: 12 | */ 13 | public class PageableDto implements Pageable { 14 | 15 | private int pageSize; 16 | private int pageNumber; 17 | 18 | public PageableDto() { 19 | } 20 | 21 | public PageableDto(int page, int size) { 22 | this.pageNumber = page; 23 | this.pageSize = size; 24 | } 25 | 26 | @Override 27 | public int getPageNumber() { 28 | return this.pageNumber; 29 | } 30 | 31 | @Override 32 | public int getPageSize() { 33 | return this.pageSize; 34 | } 35 | 36 | @Override 37 | public long getOffset() { 38 | return 0; 39 | } 40 | 41 | @Override 42 | public Sort getSort() { 43 | return null; 44 | } 45 | 46 | @Override 47 | public Pageable next() { 48 | return null; 49 | } 50 | 51 | @Override 52 | public Pageable previousOrFirst() { 53 | return null; 54 | } 55 | 56 | @Override 57 | public Pageable first() { 58 | return null; 59 | } 60 | 61 | @Override 62 | public boolean hasPrevious() { 63 | return false; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/listener/InitiatorListener.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.listener; 2 | 3 | import com.qunar.superoa.dao.FlowOrderRepository; 4 | import com.qunar.superoa.model.FlowOrder; 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | import java.util.Optional; 8 | import org.activiti.bpmn.model.UserTask; 9 | import org.activiti.engine.delegate.DelegateExecution; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.stereotype.Component; 12 | 13 | /** 14 | * @Auther: xing.zhou 15 | * @Despriction: 订单发起人审批 16 | * @Date:Created in 11:04 2018/11/27 17 | * @Modify by: 18 | */ 19 | @Component 20 | public class InitiatorListener extends CandidatesListener { 21 | 22 | @Autowired 23 | private FlowOrderRepository flowOrderRepository; 24 | 25 | /** 26 | * 重写设置节点操作着方法 27 | */ 28 | @Override 29 | public void setGroupApproveUser(UserTask userTask, DelegateExecution delegateExecution) { 30 | String processInstanceId = delegateExecution.getProcessInstanceId(); 31 | Optional flowOrder = flowOrderRepository.findByProcInstId(processInstanceId); 32 | List candidateUsers = new ArrayList<>(); 33 | candidateUsers.add(flowOrder.get().getApplyUserId()); 34 | userTask.setCandidateUsers(candidateUsers); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/OpsappUpdateData.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | import java.util.stream.Collectors; 7 | import lombok.Data; 8 | import org.apache.commons.lang.StringUtils; 9 | 10 | /** 11 | * @Auther: lee.guo 12 | * @Despriction: 推送到opsapp的数据 13 | * @Date: Created in 6:06 PM 2018/10/16 14 | * @Modify by: 15 | */ 16 | @Data 17 | public class OpsappUpdateData { 18 | 19 | @ApiModelProperty("ID") 20 | private String oid; 21 | 22 | @ApiModelProperty("申请人") 23 | private String user; 24 | 25 | @ApiModelProperty("审批人") 26 | private List approver; 27 | 28 | @ApiModelProperty("\"%Y-%m-%d %H:%M:%S\" 格式字符串") 29 | private String time; 30 | 31 | @ApiModelProperty("sum") 32 | private String sum; 33 | 34 | public OpsappUpdateData() { 35 | } 36 | 37 | public OpsappUpdateData(FlowOrder flowOrder) { 38 | this.oid = flowOrder.getId(); 39 | this.user = flowOrder.getApplyUserId(); 40 | this.approver = Arrays.stream(flowOrder.getNextApproveUsers().split(",")) 41 | .filter(v -> StringUtils.isNotBlank(v)).collect( 42 | Collectors.toList()); 43 | this.time = flowOrder.getApplyTime(); 44 | this.sum = flowOrder.getHeadline(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/DeptDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | import org.springframework.data.domain.PageRequest; 6 | import org.springframework.data.domain.Sort; 7 | 8 | /** 9 | * Created by xing.zhou on 2018/9/13. 10 | */ 11 | @Data 12 | public class DeptDto { 13 | 14 | @ApiModelProperty("流程所属部门") 15 | private String dept; 16 | 17 | @ApiModelProperty("流程表单模板名称") 18 | private String formName; 19 | 20 | @ApiModelProperty("流程表单模板key") 21 | private String formKey; 22 | 23 | @ApiModelProperty("流程表单状态") 24 | private Integer flowStatus; 25 | 26 | @ApiModelProperty("当前页, 默认1") 27 | private int page = 1; 28 | 29 | @ApiModelProperty("当前页, 默认10") 30 | private int size = 10; 31 | 32 | @ApiModelProperty("当前页, 默认根据id") 33 | private String sort = "updateTime"; 34 | 35 | @ApiModelProperty("排序方式(DESC/ASC) 默认DESC") 36 | private String direction = "DESC"; 37 | 38 | 39 | public PageRequest getPageAble() { 40 | return PageRequest.of( 41 | page < 1 ? 0 : page - 1, 42 | size == 0 ? 6 : size, 43 | new Sort( 44 | "ASC".equalsIgnoreCase(direction) ? Sort.Direction.ASC : Sort.Direction.DESC, 45 | "".endsWith(sort) ? "id" : sort 46 | ) 47 | ); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/ModelerServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.dto.ModelDto; 4 | import com.qunar.superoa.dto.PageAble; 5 | import com.qunar.superoa.dto.PageResult; 6 | import java.io.IOException; 7 | import javax.servlet.http.HttpServletResponse; 8 | import org.springframework.web.multipart.MultipartFile; 9 | 10 | /** 11 | * @Auther: chengyan.liang 12 | * @Despriction: activiti 流程设计相关方法 13 | * @Date:Created in 5:26 PM 2019/3/29 14 | * @Modify by: 15 | */ 16 | public interface ModelerServiceI { 17 | 18 | /** 19 | * 新建一个模型model 20 | */ 21 | String newActivitiModel(); 22 | 23 | /** 24 | * 上传bpmn20.xml文件并存入model数据库 25 | */ 26 | String uploadBpmn(MultipartFile file) throws IOException; 27 | 28 | /** 29 | * 下载流程模型 30 | */ 31 | void downloadModel(String id, HttpServletResponse response) throws IOException; 32 | 33 | /** 34 | * 下载已部署的bpmnModel 35 | */ 36 | void downBpmnModel(String processDefinitionId, HttpServletResponse response) 37 | throws IOException; 38 | 39 | /** 40 | * 部署model模型 41 | */ 42 | String deployModel(String id) throws Exception; 43 | 44 | /** 45 | * 获取model列表 46 | */ 47 | PageResult getModelList(PageAble pageAble); 48 | 49 | /** 50 | * 删除model 51 | */ 52 | String deleteModel(String id); 53 | 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/ExtSysUnapproveFlowServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.dto.PageResult; 4 | import com.qunar.superoa.dto.QueryExtSysUnapproveDto; 5 | import com.qunar.superoa.model.ExtSysUnapproveFlow; 6 | import java.util.List; 7 | 8 | /** 9 | * @Auther: chengyan.liang 10 | * @Despriction: 集成系统待审批流程service接口层 11 | * @Date:Created in 4:21 PM 2019/4/26 12 | * @Modify by: 13 | */ 14 | public interface ExtSysUnapproveFlowServiceI { 15 | 16 | /** 17 | * 更新一条待审批流程 18 | * @param dataSource 集成系统所发送数据 19 | */ 20 | Object updateExtSysUnapproveFlow(Object dataSource); 21 | 22 | /** 23 | * 删除一条待审批流程 24 | * @param dataSource 集成系统所发送数据 25 | */ 26 | Object deleteExtSysUnapproveFlow(Object dataSource); 27 | 28 | /** 29 | * 批量更新审批流程 30 | * @param dataSource 集成系统所发送数据 31 | */ 32 | Object updatePatchExtSysUnapproveFlow(Object dataSource); 33 | 34 | /** 35 | * 获取外部系统待我审批的、我发起的进行中流程 36 | */ 37 | PageResult getMyExtSysUnapproveFlows(QueryExtSysUnapproveDto queryUnapproveDto); 38 | 39 | /** 40 | * 获取外部系统我的待办流程数(当前登录人) 41 | */ 42 | int getExtSysToApproveCount(); 43 | 44 | /** 45 | * 获取外部系统当前用户发起的审批中流程数 46 | */ 47 | int getMyExtSysFlowCount(); 48 | 49 | /** 50 | * 获取当前用户待审批流程所涉及到的所有外部系统标识 51 | */ 52 | List getMyExtSysUnapproveProcessKeys(); 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/ExtSysFlowModel.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import javax.persistence.Column; 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.Id; 9 | import javax.persistence.Index; 10 | import javax.persistence.Table; 11 | import lombok.Data; 12 | import org.hibernate.annotations.GenericGenerator; 13 | 14 | /** 15 | * @Auther: chengyan.liang 16 | * @Despriction: 17 | * @Date:Created in 5:27 PM 2019/4/29 18 | * @Modify by: 19 | */ 20 | @Data 21 | @Entity 22 | @Table(indexes = {@Index(name = "idx_oid", columnList = "oid")}) 23 | @GenericGenerator(name = "jpa-uuid", strategy = "uuid") 24 | @ApiModel("集成系统可发起流程实例") 25 | public class ExtSysFlowModel { 26 | @Id 27 | @GeneratedValue(generator = "jpa-uuid") 28 | @Column(length = 32) 29 | @ApiModelProperty(value = "流程实例Id") 30 | private String id; 31 | 32 | @ApiModelProperty(value = "流程所属系统标识") 33 | private String processKeys; 34 | 35 | @ApiModelProperty(value = "流程对应原系统中的id") 36 | private String oid; 37 | 38 | @ApiModelProperty(value = "可发起流程标题") 39 | private String title; 40 | 41 | @ApiModelProperty(value = "发起流程跳转链接") 42 | private String redirectUrl; 43 | 44 | @ApiModelProperty(value = "流程是否属于外部系统") 45 | private String formMark; 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/ModelDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import com.qunar.superoa.utils.DateTimeUtil; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | import org.activiti.engine.repository.Model; 7 | 8 | /** 9 | * @Auther: chengyan.liang 10 | * @Despriction: 流程模型Dto 11 | * @Date:Created in 7:39 PM 2019/4/2 12 | * @Modify by: 13 | */ 14 | @Data 15 | public class ModelDto { 16 | 17 | @ApiModelProperty(value = "流程模型Id") 18 | private String id; 19 | 20 | @ApiModelProperty(value = "流程模型名称") 21 | private String name; 22 | 23 | @ApiModelProperty(value = "流程模型创建时间") 24 | private String createTime; 25 | 26 | @ApiModelProperty(value = "流程模型最终修改时间") 27 | private String lastUpdateTime; 28 | 29 | @ApiModelProperty(value = "流程模型key") 30 | private String key; 31 | 32 | @ApiModelProperty(value = "流程模型部署Id") 33 | private String deploymentId; 34 | 35 | @ApiModelProperty(value = "流程模型版本") 36 | private String version; 37 | 38 | public ModelDto(Model model) { 39 | this.id = model.getId(); 40 | this.deploymentId = model.getDeploymentId(); 41 | this.key = model.getKey(); 42 | this.name = model.getName(); 43 | this.version = String.valueOf(model.getVersion()); 44 | this.createTime = DateTimeUtil.toString(model.getCreateTime()); 45 | this.lastUpdateTime = DateTimeUtil.toString(model.getLastUpdateTime()); 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/validate/MustDatetime.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.validate; 2 | 3 | import javax.validation.Constraint; 4 | import javax.validation.Payload; 5 | import java.lang.annotation.Documented; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | import static java.lang.annotation.ElementType.*; 10 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 11 | 12 | /** 13 | * @Auther: lee.guo 14 | * @Date:Created in 2018/8/17_下午1:25 15 | * @Despriction: 必须为日期格式 16 | */ 17 | @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 18 | @Retention(RUNTIME) 19 | @Documented 20 | @Constraint(validatedBy = { }) 21 | public @interface MustDatetime { 22 | 23 | String message() default "时间格式不正确,正确格式为: 2000-01-01 12:00:00 "; 24 | 25 | /**「 26 | * @return the regular expression to match 27 | */ 28 | String regexp() default "/^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\\s+(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d$/"; 29 | Class[] groups() default { }; 30 | 31 | Class[] payload() default { }; 32 | 33 | /** 34 | * Defines several {@link MustDatetime} annotations on the same element. 35 | * 36 | * @see MustDatetime 37 | */ 38 | @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 39 | @Retention(RUNTIME) 40 | @Documented 41 | @interface List { 42 | MustDatetime[] value(); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/image/impl/icon/ManualTaskIconType.java: -------------------------------------------------------------------------------- 1 | package org.activiti.image.impl.icon; 2 | 3 | public class ManualTaskIconType extends TaskIconType { 4 | 5 | @Override 6 | public String getStyleValue() { 7 | return "fill:#d1b575;stroke=none"; 8 | } 9 | 10 | @Override 11 | public String getDValue() { 12 | return "m 17,9.3290326 c -0.0069,0.5512461 -0.455166,1.0455894 -0.940778,1.0376604 l -5.792746,0 c 0.0053,0.119381 0.0026,0.237107 0.0061,0.355965 l 5.154918,0 c 0.482032,-0.0096 0.925529,0.49051 0.919525,1.037574 -0.0078,0.537128 -0.446283,1.017531 -0.919521,1.007683 l -5.245273,0 c -0.01507,0.104484 -0.03389,0.204081 -0.05316,0.301591 l 2.630175,0 c 0.454137,-0.0096 0.872112,0.461754 0.866386,0.977186 C 13.619526,14.554106 13.206293,15.009498 12.75924,15 L 3.7753054,15 C 3.6045812,15 3.433552,14.94423 3.2916363,14.837136 c -0.00174,0 -0.00436,0 -0.00609,0 C 1.7212035,14.367801 0.99998255,11.458641 1,11.458641 L 1,7.4588393 c 0,0 0.6623144,-1.316333 1.8390583,-2.0872584 1.1767614,-0.7711868 6.8053358,-2.40497 7.2587847,-2.8052901 0.453484,-0.40032 1.660213,1.4859942 0.04775,2.4010487 C 8.5332315,5.882394 8.507351,5.7996113 8.4370292,5.7936859 l 6.3569748,-0.00871 c 0.497046,-0.00958 0.952273,0.5097676 0.94612,1.0738232 -0.0053,0.556126 -0.456176,1.0566566 -0.94612,1.0496854 l -4.72435,0 c 0.01307,0.1149374 0.0244,0.2281319 0.03721,0.3498661 l 5.952195,0 c 0.494517,-0.00871 0.947906,0.5066305 0.940795,1.0679848 z"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/GenericResponseWrapper.java: -------------------------------------------------------------------------------- 1 | package org.activiti; 2 | 3 | import javax.servlet.ServletOutputStream; 4 | import javax.servlet.http.HttpServletResponse; 5 | import javax.servlet.http.HttpServletResponseWrapper; 6 | import java.io.ByteArrayOutputStream; 7 | import java.io.PrintWriter; 8 | 9 | public class GenericResponseWrapper extends HttpServletResponseWrapper { 10 | private ByteArrayOutputStream output; 11 | private int contentLength; 12 | private String contentType; 13 | 14 | public GenericResponseWrapper(HttpServletResponse response) { 15 | super(response); 16 | output = new ByteArrayOutputStream(); 17 | } 18 | 19 | public byte[] getData() { 20 | return output.toByteArray(); 21 | } 22 | 23 | public ServletOutputStream getOutputStream() { 24 | return new FilterServletOutputStream(output); 25 | } 26 | 27 | public PrintWriter getWriter() { 28 | return new PrintWriter(getOutputStream(), true); 29 | } 30 | 31 | public void setContentLength(int length) { 32 | this.contentLength = length; 33 | super.setContentLength(length); 34 | } 35 | 36 | public int getContentLength() { 37 | return contentLength; 38 | } 39 | 40 | public void setContentType(String type) { 41 | this.contentType = type; 42 | super.setContentType(type); 43 | } 44 | 45 | public String getContentType() { 46 | return contentType; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/AdminActivitiServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.dto.ActivitiDto; 4 | import com.qunar.superoa.dto.PageAble; 5 | import com.qunar.superoa.dto.PageResult; 6 | import org.activiti.engine.repository.ProcessDefinition; 7 | import org.springframework.web.multipart.MultipartFile; 8 | 9 | import javax.servlet.http.HttpServletResponse; 10 | import java.io.InputStream; 11 | import java.util.List; 12 | 13 | /** 14 | * @Auther: lee.guo 15 | * @Date:Created in 2018/8/16_下午8:32 16 | * @Despriction: 流程控制 17 | */ 18 | public interface AdminActivitiServiceI { 19 | 20 | String deploy(MultipartFile file) throws Exception; 21 | 22 | PageResult processList(PageAble pageAble) ; 23 | 24 | ProcessDefinition processById(String deploymentId) ; 25 | 26 | ProcessDefinition processByKey(String procDefKey); 27 | 28 | String updateState(String deploymentId, String status) ; 29 | 30 | String delete(String deploymentId) ; 31 | 32 | String remove(String deploymentId) ; 33 | 34 | List findProcessInstanceList() throws Exception; 35 | 36 | InputStream readResource(String processDefinitionId, String processInstanceId) ; 37 | 38 | void loadByDeployment(String deploymentId, String resourceType, HttpServletResponse response) throws Exception; 39 | 40 | InputStream viewPic(String deploymentId); 41 | 42 | String viewPicForUrl(String deploymentId); 43 | 44 | List findProcessDefinition(); 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/OAUserServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.dto.OAUserDto; 4 | import com.qunar.superoa.dto.PasswordDto; 5 | import com.qunar.superoa.dto.QueryUserDto; 6 | import org.springframework.web.multipart.MultipartFile; 7 | 8 | /** 9 | * @Auther: chengyan.liang 10 | * @Despriction: 11 | * @Date:Created in 10:33 AM 2019/5/22 12 | * @Modify by: 13 | */ 14 | public interface OAUserServiceI { 15 | 16 | /** 17 | * 管理员获取所有用户信息 18 | */ 19 | Object adminGetAllUserInfo(QueryUserDto queryUserDto); 20 | 21 | /** 22 | * 管理员根据id获取某个用户信息 23 | */ 24 | Object adminGetUserInfo(String id); 25 | 26 | /** 27 | * 用户获取自身信息 28 | */ 29 | Object getUserInfo(); 30 | 31 | /** 32 | * 管理员添加用户 33 | */ 34 | Object adminAddOAUser(OAUserDto oaUserDto); 35 | 36 | /** 37 | * 管理员更新用户信息 38 | */ 39 | Object adminUpdateOAUser(OAUserDto oaUserDto); 40 | 41 | /** 42 | * 管理员变更用户密码 43 | */ 44 | Object adminUpdateOAUserPassword(PasswordDto passwordDto); 45 | 46 | /** 47 | * 管理员根据id删除用户 48 | */ 49 | Object adminDeleteOAUserById(String id); 50 | 51 | /** 52 | * 用户更新自身信息 53 | */ 54 | Object updateOAUserSelf(OAUserDto oaUserDto); 55 | 56 | /** 57 | * 根据关键字查询用户列表 58 | */ 59 | Object searchOAUser(String key); 60 | 61 | /** 62 | * 用户更新密码 63 | */ 64 | Object updatePassword(PasswordDto passwordDto); 65 | 66 | /** 67 | * 用户更新头像 68 | */ 69 | Object updateAvatar(MultipartFile imageFile) throws Exception; 70 | 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/ipml/FlowNodeDataServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service.ipml; 2 | 3 | import com.qunar.superoa.dao.FlowNodeDataRepository; 4 | import com.qunar.superoa.model.FlowNodeData; 5 | import com.qunar.superoa.service.FlowNodeDataServiceI; 6 | import com.qunar.superoa.utils.DateTimeUtil; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | /** 12 | * @author zhouxing 13 | * @date 2019-02-20 11:04 14 | */ 15 | @Service 16 | @Slf4j 17 | public class FlowNodeDataServiceImpl implements FlowNodeDataServiceI { 18 | @Autowired 19 | public FlowNodeDataRepository flowNodeDataRepository; 20 | 21 | @Override 22 | public void saveFlowNodeData(String createUserId, String createUserName, String formDatas, String flowKey, String flowName, 23 | String nodeDefKey, String nodeName, String procInstId) { 24 | FlowNodeData flowNodeData = new FlowNodeData(); 25 | flowNodeData.setCreateTime(DateTimeUtil.getDateTime()); 26 | flowNodeData.setCreateUserId(createUserId); 27 | flowNodeData.setCreateUserName(createUserName); 28 | flowNodeData.setFormDatas(formDatas); 29 | flowNodeData.setFormModelFlowKey(flowKey); 30 | flowNodeData.setFormModelName(flowName); 31 | flowNodeData.setNodeDefKey(nodeDefKey); 32 | flowNodeData.setNodeName(nodeName); 33 | flowNodeData.setProcInstId(procInstId); 34 | flowNodeDataRepository.save(flowNodeData); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/OpsappSendMessageInfo.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import com.qunar.superoa.constants.Constant; 4 | import io.swagger.annotations.ApiModel; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import java.util.Arrays; 7 | import java.util.List; 8 | import lombok.Data; 9 | 10 | /** 11 | * @Auther: chengyan.liang 12 | * @Despriction: 13 | * @Date:Created in 上午11:58 2018/10/23 14 | * @Modify by: 15 | */ 16 | @Data 17 | @ApiModel("发送qtalk通知") 18 | public class OpsappSendMessageInfo { 19 | 20 | @ApiModelProperty("发送的人员列表") 21 | private List qtalk_ids; 22 | 23 | @ApiModelProperty("使用发送的账号") 24 | private String system; 25 | 26 | @ApiModelProperty("title") 27 | private String title; 28 | 29 | @ApiModelProperty("content") 30 | private String content; 31 | 32 | @ApiModelProperty("body") 33 | private String body; 34 | 35 | @ApiModelProperty("pc端跳转URL") 36 | private String linkurl; 37 | 38 | @ApiModelProperty("移动端跳转URL") 39 | private String reacturl; 40 | 41 | @ApiModelProperty("图标url") 42 | private String img; 43 | 44 | @ApiModelProperty("类型") 45 | private String type; 46 | 47 | public OpsappSendMessageInfo(){} 48 | 49 | public OpsappSendMessageInfo(com.qunar.superoa.model.FlowOrder flowOrder,String prefix) { 50 | this.title = prefix + flowOrder.getHeadline(); 51 | this.qtalk_ids = Arrays.asList(flowOrder.getNextApproveUsers().split(",")); 52 | this.system = "worknotice"; 53 | this.img = Constant.QT_NOTICE_IMG; 54 | this.type = "667"; 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/SuperoaApplication.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.boot.builder.SpringApplicationBuilder; 6 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 7 | import org.springframework.cloud.openfeign.EnableFeignClients; 8 | import org.springframework.context.annotation.ComponentScan; 9 | import org.springframework.security.web.session.HttpSessionEventPublisher; 10 | import org.springframework.web.servlet.config.annotation.EnableWebMvc; 11 | 12 | import javax.servlet.ServletContext; 13 | import javax.servlet.ServletException; 14 | 15 | /** 16 | * @Auther: lee.guo 17 | * @Date:Created in 2018/9/25_下午3:41 18 | * @Despriction: 入口 19 | */ 20 | 21 | @EnableWebMvc 22 | @EnableFeignClients 23 | @ComponentScan(basePackages = {"com.qunar.superoa","org.activiti"}) 24 | @SpringBootApplication() 25 | public class SuperoaApplication extends SpringBootServletInitializer { 26 | 27 | @Override 28 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 29 | return application.sources(SuperoaApplication.class); 30 | } 31 | 32 | @Override 33 | public void onStartup(ServletContext servletContext) throws ServletException { 34 | super.onStartup(servletContext); 35 | servletContext.addListener(new HttpSessionEventPublisher()); 36 | } 37 | 38 | public static void main(String[] args) { 39 | SpringApplication.run(SuperoaApplication.class, args); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/MailInfo.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | 4 | import com.qunar.superoa.model.Notify; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import lombok.Data; 7 | 8 | @Data 9 | public class MailInfo { 10 | 11 | @ApiModelProperty("主题") 12 | private String subject; 13 | @ApiModelProperty("关系人姓名") 14 | private String relationUserName; 15 | @ApiModelProperty("内容") 16 | private String content; 17 | @ApiModelProperty("抄送") 18 | private String ccListMail; 19 | @ApiModelProperty("邮件组") 20 | private String emailGroup; 21 | @ApiModelProperty("收件人") 22 | private String targetEmail; 23 | @ApiModelProperty("链接") 24 | private String linkUrl; 25 | @ApiModelProperty("标题前缀") 26 | private String prefix; 27 | @ApiModelProperty("标题后缀") 28 | private String suffix; 29 | @ApiModelProperty("qtalk审批扫一扫的图片地址") 30 | private String qrCodeUrl; 31 | 32 | public MailInfo(Notify notify) { 33 | this.subject = "Qunar OA 通知"; 34 | this.content = new StringBuilder().append(notify.getWho()).append(" ").append(notify.getContent()).append(" ").append(notify.getFlowName()).toString(); 35 | this.targetEmail = notify.getQtalk(); 36 | } 37 | 38 | public MailInfo(com.qunar.superoa.model.FlowOrder flowOrder,String prefix) { 39 | 40 | this.subject = flowOrder.getHeadline(); 41 | this.targetEmail = flowOrder.getNextApproveUsers(); 42 | this.relationUserName = flowOrder.getApplyUserName(); 43 | this.prefix = prefix; 44 | this.suffix = "的申请待您审批"; 45 | 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/listener/LeaderListener.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.listener; 2 | 3 | import com.qunar.superoa.cache.Cache; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | import org.activiti.bpmn.model.ManualTask; 7 | import org.activiti.bpmn.model.UserTask; 8 | import org.activiti.engine.delegate.DelegateExecution; 9 | import org.apache.commons.lang.StringUtils; 10 | import org.springframework.stereotype.Component; 11 | 12 | /** 13 | * ${leaderListener} Created by xing.zhou on 2018/9/14. 14 | */ 15 | @Component 16 | public class LeaderListener extends CandidatesListener { 17 | 18 | /** 19 | * 重写设置节点操作着方法 获取直属领导为当前节点审批人 20 | */ 21 | @Override 22 | public void setGroupApproveUser(UserTask userTask, DelegateExecution delegateExecution) { 23 | String owner = delegateExecution.getVariable("owner").toString(); 24 | List candidateUsers = new ArrayList(); 25 | candidateUsers.add(userInfoUtil.getUserTL(owner)); 26 | userTask.setCandidateUsers(candidateUsers); 27 | } 28 | 29 | /** 30 | * 知会节点 知会直属TL 31 | */ 32 | @Override 33 | public void sendNotify(ManualTask manualTask, DelegateExecution delegateExecution) { 34 | String owner = delegateExecution.getVariable("owner").toString(); 35 | String notifyUsersStr = userInfoUtil.getUserTL(owner) + ","; 36 | String processInstanceId = delegateExecution.getProcessInstanceId(); 37 | //知会查看人字段 38 | Object temp = Cache.getFlowDataCacheByKey(processInstanceId); 39 | Cache.setFlowDataCache(processInstanceId, 40 | temp != null && StringUtils.isNotBlank(temp.toString()) ? temp.toString() + notifyUsersStr : notifyUsersStr); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/controller/SocketController.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.controller; 2 | 3 | import com.qunar.superoa.dto.Result; 4 | import com.qunar.superoa.dto.UserRoleDto; 5 | import com.qunar.superoa.service.WebSocketServer; 6 | import com.qunar.superoa.utils.ResultUtil; 7 | import com.qunar.superoa.utils.WebSocketUtil; 8 | import org.slf4j.Logger; 9 | import org.slf4j.LoggerFactory; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.stereotype.Controller; 12 | import org.springframework.web.bind.annotation.GetMapping; 13 | import org.springframework.web.bind.annotation.PostMapping; 14 | import org.springframework.web.bind.annotation.RequestParam; 15 | import org.springframework.web.bind.annotation.ResponseBody; 16 | 17 | /** 18 | * @Author: yang.du 19 | * @Description: 20 | * @Date: Created in 16:59 2018/9/4 21 | */ 22 | 23 | @Controller 24 | public class SocketController { 25 | private Logger logger = LoggerFactory.getLogger(SocketController.class); 26 | 27 | @Autowired 28 | private WebSocketServer webSocketServer; 29 | 30 | @GetMapping("/socket") 31 | public String socket () { 32 | return "online"; 33 | } 34 | 35 | @GetMapping("/socket2") 36 | public String socket2 () { 37 | return "socket"; 38 | } 39 | 40 | 41 | @PostMapping("/message") 42 | @ResponseBody 43 | public Result sendMessage(@RequestParam String clientId, @RequestParam String userName, @RequestParam String role) { 44 | UserRoleDto userRoleDto = new UserRoleDto(userName, role); 45 | return ResultUtil.success(WebSocketUtil.pushMessage(clientId, userRoleDto)); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/ApproveLogServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | /** 4 | * @Auther: chengyan.liang 5 | * @Despriction: 6 | * @Date:Created in 10:43 AM 2018/12/21 7 | * @Modify by: 8 | */ 9 | 10 | import com.qunar.superoa.model.ApproveLog; 11 | import java.util.List; 12 | import java.util.Optional; 13 | 14 | /** 15 | * 日志服务 16 | */ 17 | public interface ApproveLogServiceI { 18 | 19 | /** 20 | * 根据oid查询审批日志 21 | * @param oid 22 | * @return 23 | */ 24 | Optional> findByOidOrderByApproveTime(String oid); 25 | 26 | /** 27 | * 根据流程实例id和任务id获取审批日志 28 | * 29 | * @param proinstId 流程实例id 30 | * @param taskId 任务id 31 | */ 32 | ApproveLog getApproveLogByProInstIdAndTaskId(String proinstId, String taskId); 33 | 34 | /** 35 | * 根据流程实例id和任务id和审批类型获取审批日志 36 | * @param proinstId 37 | * @param taskId 38 | * @param type 39 | * @return 40 | */ 41 | ApproveLog getApproveLogByProInstIdAndTaskIdAndType(String proinstId, String taskId, String type); 42 | 43 | /** 44 | * 创建日志并保存 45 | * @param procInstId 46 | * @param taskId 47 | * @param nodeDefKey 48 | * @param taskName 49 | * @param flowModelName 50 | * @param type 51 | * @param Memo 52 | * @param currentUserId 53 | * @param currentUserName 54 | * @return 55 | */ 56 | ApproveLog createApproveLog(String procInstId, String taskId, String nodeDefKey, String taskName, String flowModelName, 57 | String type, String Memo, String currentUserId, String currentUserName); 58 | 59 | /** 60 | * 保存 61 | * @param approveLog 62 | * @return 63 | */ 64 | ApproveLog save(ApproveLog approveLog); 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/Department.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | /** 4 | * @Auther: chengyan.liang 5 | * @Despriction: 6 | * @Date:Created in 上午11:37 2018/10/29 7 | * @Modify by: 8 | */ 9 | 10 | import io.swagger.annotations.ApiModel; 11 | import io.swagger.annotations.ApiModelProperty; 12 | import javax.persistence.Column; 13 | import javax.persistence.Entity; 14 | import javax.persistence.GeneratedValue; 15 | import javax.persistence.Id; 16 | import javax.persistence.Index; 17 | import javax.persistence.Table; 18 | import lombok.Data; 19 | import org.hibernate.annotations.GenericGenerator; 20 | 21 | 22 | /** 23 | * 员工各级部门 24 | */ 25 | @Data 26 | @Entity 27 | @Table(indexes = { 28 | @Index(columnList = "pid", name = "idx_pid") 29 | }) 30 | @GenericGenerator(name = "jpa-uuid", strategy = "uuid") 31 | @ApiModel("员工各级部门") 32 | public class Department { 33 | 34 | @Id 35 | @GeneratedValue(generator = "jpa-uuid") 36 | @Column(length = 32) 37 | @ApiModelProperty("部门Id") 38 | private String id; 39 | 40 | @ApiModelProperty(value = "部门分管领导") 41 | private String vp; 42 | 43 | @ApiModelProperty(value = "以'$'连接一级部门到父部门的id") 44 | private String parentStr; 45 | 46 | @ApiModelProperty(value = "以','连接的直接领导信息") 47 | private String leaders; 48 | 49 | @ApiModelProperty(value = "以'/'连接的一级部门到当前部门") 50 | private String nodeNameStr; 51 | 52 | @ApiModelProperty(value = "上一级部门id") 53 | private String pid; 54 | 55 | @ApiModelProperty(value = "当前部门的级数,1代表一级部门,2代表二级部门,以此类推") 56 | private int deep; 57 | 58 | @ApiModelProperty(value = "以','连接的hrbp信息") 59 | private String hrbps; 60 | 61 | @ApiModelProperty(value = "部门名称") 62 | private String name; 63 | 64 | } 65 | -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/controller/AdminActivitiControllerTest.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.controller; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | import org.springframework.test.context.junit4.SpringRunner; 9 | import org.springframework.test.web.servlet.MockMvc; 10 | import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; 11 | import org.springframework.test.web.servlet.result.MockMvcResultMatchers; 12 | 13 | import static org.junit.Assert.*; 14 | 15 | /** 16 | * @Auther: lee.guo 17 | * @Date:Created in 2018/8/17_上午12:00 18 | * @Despriction: 19 | */ 20 | @RunWith(SpringRunner.class) 21 | @SpringBootTest 22 | @AutoConfigureMockMvc 23 | public class AdminActivitiControllerTest { 24 | 25 | @Autowired 26 | private MockMvc mvc; 27 | 28 | @Test 29 | public void deploy() { 30 | } 31 | 32 | @Test 33 | public void processList() throws Exception{ 34 | mvc.perform(MockMvcRequestBuilders.post("/admin/processList")) 35 | .andExpect(MockMvcResultMatchers.status().isOk()); 36 | } 37 | 38 | @Test 39 | public void updateState() { 40 | } 41 | 42 | @Test 43 | public void delete() { 44 | } 45 | 46 | @Test 47 | public void remove() { 48 | } 49 | 50 | @Test 51 | public void readResource() { 52 | } 53 | 54 | @Test 55 | public void findProcessInstanceList() { 56 | } 57 | 58 | @Test 59 | public void loadByDeployment() { 60 | } 61 | } -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/OAUserDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Auther: chengyan.liang 8 | * @Despriction: 9 | * @Date:Created in 10:57 AM 2019/5/22 10 | * @Modify by: 11 | */ 12 | @Data 13 | public class OAUserDto { 14 | 15 | /** 16 | * 用户id 17 | */ 18 | @ApiModelProperty("用户id") 19 | private String id; 20 | 21 | /** 22 | * userName,唯一 23 | */ 24 | @ApiModelProperty("userName") 25 | private String userName; 26 | 27 | /** 28 | * 用户密码 29 | */ 30 | @ApiModelProperty("密码") 31 | private String password; 32 | 33 | /** 34 | * 中文名 35 | */ 36 | @ApiModelProperty("中文名") 37 | private String cname; 38 | 39 | /** 40 | * 用户所属部门id 41 | */ 42 | @ApiModelProperty("部门id") 43 | private String deptId; 44 | 45 | /** 46 | * 用户所属部门 47 | */ 48 | @ApiModelProperty("用户所属部门") 49 | private String deptStr; 50 | 51 | /** 52 | * 用户直属领导 53 | */ 54 | @ApiModelProperty("用户直属领导") 55 | private String leader; 56 | 57 | /** 58 | * 用户负责hr 59 | */ 60 | @ApiModelProperty("用户负责hr") 61 | private String hr; 62 | 63 | /** 64 | * 头像地址 65 | */ 66 | @ApiModelProperty("头像地址") 67 | private String avatar; 68 | 69 | /** 70 | * 性别 71 | */ 72 | @ApiModelProperty("性别 - 0:女; 1:男") 73 | private String gender; 74 | 75 | /** 76 | * 个人心情签名 77 | */ 78 | @ApiModelProperty("个人心情签名") 79 | private String mood; 80 | 81 | /** 82 | * 个人邮箱 83 | */ 84 | @ApiModelProperty("个人邮箱") 85 | private String email; 86 | 87 | /** 88 | * 手机号 89 | */ 90 | @ApiModelProperty("手机号") 91 | private String phone; 92 | 93 | } 94 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/ExtSysUnapproveFlow.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import javax.persistence.Column; 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.Id; 9 | import javax.persistence.Index; 10 | import javax.persistence.Table; 11 | import lombok.Data; 12 | import org.hibernate.annotations.GenericGenerator; 13 | 14 | /** 15 | * @Auther: chengyan.liang 16 | * @Despriction: 集成系统待审批流程 17 | * @Date:Created in 3:40 PM 2019/4/26 18 | * @Modify by: 19 | */ 20 | @Data 21 | @Entity 22 | @Table(indexes = {@Index(name = "idx_oid", columnList = "oid")}) 23 | @GenericGenerator(name = "jpa-uuid", strategy = "uuid") 24 | @ApiModel("集成系统待审批流程实例") 25 | public class ExtSysUnapproveFlow { 26 | 27 | @Id 28 | @GeneratedValue(generator = "jpa-uuid") 29 | @Column(length = 32) 30 | @ApiModelProperty(value = "流程实例Id") 31 | private String id; 32 | 33 | @ApiModelProperty(value = "流程所属系统标识") 34 | private String processKeys; 35 | 36 | @ApiModelProperty(value = "流程对应原系统中的id") 37 | private String oid; 38 | 39 | @ApiModelProperty(value = "申请人") 40 | private String applyUser; 41 | 42 | @Column(columnDefinition = "TEXT") 43 | @ApiModelProperty(value = "待审批人,以英文逗号分隔") 44 | private String approveUsers; 45 | 46 | @ApiModelProperty(value = "流程审批标题") 47 | private String title; 48 | 49 | @ApiModelProperty(value = "申请时间") 50 | private String applyTime; 51 | 52 | @ApiModelProperty(value = "流程最新更新时间") 53 | private String updateTime; 54 | 55 | @ApiModelProperty(value = "流程跳转链接") 56 | private String redirectUrl; 57 | 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/controller/FormDataController.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.controller; 2 | 3 | import com.qunar.superoa.dto.FormDataDto; 4 | import com.qunar.superoa.dto.Result; 5 | import com.qunar.superoa.service.FormDataServiceI; 6 | import com.qunar.superoa.utils.ResultUtil; 7 | import io.swagger.annotations.Api; 8 | import io.swagger.annotations.ApiOperation; 9 | import io.swagger.annotations.ApiParam; 10 | import org.slf4j.Logger; 11 | import org.slf4j.LoggerFactory; 12 | import org.springframework.beans.factory.annotation.Autowired; 13 | import org.springframework.web.bind.annotation.*; 14 | 15 | import javax.validation.Valid; 16 | 17 | /** 18 | * Created by xing.zhou on 2018/8/30. 19 | */ 20 | //@Api(value = "FromDataController", tags = "表单数据相关") 21 | //@RestController 22 | //@RequestMapping("fromData") 23 | public class FormDataController { 24 | 25 | private final static Logger logger = LoggerFactory.getLogger(FormDataController.class); 26 | 27 | 28 | @Autowired 29 | private FormDataServiceI formDataServiceI; 30 | 31 | 32 | @ApiOperation("获取表单数据") 33 | @PostMapping(value = "getFromDateById") 34 | public Result getFromDateById(@ApiParam(name = "procInstId", value = "流程id", required = true) @RequestParam("procInstId") String procInstId) throws Exception { 35 | return ResultUtil.run(() -> formDataServiceI.getFromDataByProcInstId(procInstId)); 36 | } 37 | 38 | 39 | // @ApiOperation("新建流程表单数据") 40 | // @PostMapping(value = "addFromDate") 41 | // public Result addFromDate(@RequestBody FormDataDto formDataDto) throws Exception { 42 | // return ResultUtil.run(() -> formDataServiceI.addFromDate(formDataDto)); 43 | // } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/OpsappHistoryData.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | import java.util.stream.Collectors; 7 | import lombok.Data; 8 | import org.apache.commons.lang.StringUtils; 9 | 10 | /** 11 | * @Auther: lee.guo 12 | * @Despriction: 推送到opsapp的数据 13 | * @Date: Created in 6:06 PM 2018/10/16 14 | * @Modify by: 15 | */ 16 | @Data 17 | public class OpsappHistoryData { 18 | 19 | @ApiModelProperty("ID") 20 | private String oid; 21 | 22 | @ApiModelProperty("申请人") 23 | private String user; 24 | 25 | @ApiModelProperty("审批人") 26 | private String approver; 27 | 28 | @ApiModelProperty("本次审批结果 1 通过 0 拒绝 -1 其他 必选项") 29 | private String result; 30 | 31 | @ApiModelProperty("如果有下一节点,下一节点审批人, 逗号分隔,如果没有下一节点置空") 32 | private String next; 33 | 34 | @ApiModelProperty("\"%Y-%m-%d %H:%M:%S\" 格式字符串") 35 | private String update_time; 36 | 37 | @ApiModelProperty("\"%Y-%m-%d %H:%M:%S\" 格式字符串") 38 | private String create_time; 39 | 40 | @ApiModelProperty("标题") 41 | private String sum; 42 | 43 | @ApiModelProperty("其他扩展信息,json字符串,没用可为空") 44 | private String ext; 45 | 46 | public OpsappHistoryData() { 47 | } 48 | 49 | public OpsappHistoryData(FlowOrder flowOrder, String result, String currentUser) { 50 | this.oid = flowOrder.getId(); 51 | this.user = flowOrder.getApplyUserId(); 52 | this.approver = currentUser; 53 | this.result = result; 54 | this.next = flowOrder.getNextApproveUsers(); 55 | this.update_time = flowOrder.getUpdateTime(); 56 | this.create_time = flowOrder.getApplyTime(); 57 | this.sum = flowOrder.getHeadline(); 58 | this.ext = ""; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/config/Swagger2Config.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.config; 2 | 3 | import org.springframework.beans.factory.annotation.Value; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import springfox.documentation.builders.ApiInfoBuilder; 7 | import springfox.documentation.builders.PathSelectors; 8 | import springfox.documentation.builders.RequestHandlerSelectors; 9 | import springfox.documentation.service.ApiInfo; 10 | import springfox.documentation.spi.DocumentationType; 11 | import springfox.documentation.spring.web.plugins.Docket; 12 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 13 | 14 | /** 15 | * swagger 16 | */ 17 | @Configuration 18 | @EnableSwagger2 19 | public class Swagger2Config { 20 | 21 | @Value("${spring.profiles.active}") 22 | private String environment; 23 | 24 | @Bean 25 | public Docket createRestApi() { 26 | if ("prod".equals(environment)) { 27 | return new Docket(DocumentationType.SWAGGER_2) 28 | .apiInfo(apiInfo()) 29 | .select() 30 | .apis(RequestHandlerSelectors.basePackage("com.qunar.superoa.model")) 31 | .paths(PathSelectors.any()) 32 | .build(); 33 | } 34 | return new Docket(DocumentationType.SWAGGER_2) 35 | .apiInfo(apiInfo()) 36 | .select() 37 | .apis(RequestHandlerSelectors.basePackage("com.qunar.superoa.controller")) 38 | .paths(PathSelectors.any()) 39 | .build(); 40 | } 41 | 42 | private ApiInfo apiInfo() { 43 | return new ApiInfoBuilder() 44 | .title("SUPEROA项目API在线文档") 45 | .description("SUPEROA项目后台api接口文档") 46 | .version("1.0") 47 | .build(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/CurrentUserDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import com.google.gson.internal.LinkedTreeMap; 4 | import com.qunar.superoa.enums.ResultEnum; 5 | import com.qunar.superoa.exceptions.SuperOALoginException; 6 | import com.qunar.superoa.utils.CommonUtil; 7 | import io.swagger.annotations.ApiModelProperty; 8 | import lombok.Data; 9 | 10 | import java.util.List; 11 | import java.util.Map; 12 | 13 | /** 14 | * @Auther: lee.guo 15 | * @Date:Created in 2018/9/10_下午2:49 16 | * @Despriction: 当前登录的用户 17 | */ 18 | 19 | @Data 20 | public class CurrentUserDto { 21 | 22 | @ApiModelProperty("Qtalk账户名") 23 | private String qtalk; 24 | 25 | @ApiModelProperty("头像") 26 | private String avatar; 27 | 28 | @ApiModelProperty("中文名") 29 | private String cname; 30 | 31 | @ApiModelProperty("当前用户权限") 32 | private List currentAuthority; 33 | 34 | @ApiModelProperty("性别") 35 | private String gender; 36 | 37 | @ApiModelProperty("心情") 38 | private String mood; 39 | 40 | public CurrentUserDto(Object currentUserInfo) throws SuperOALoginException { 41 | try { 42 | Map stringObjectMap = CommonUtil.o2m(currentUserInfo); 43 | this.qtalk = (String) stringObjectMap.get("userName"); 44 | this.avatar = (String) stringObjectMap.get("avatar"); 45 | this.cname = (String) stringObjectMap.get("cname"); 46 | this.currentAuthority = (List) stringObjectMap.get("roles"); 47 | this.mood = (String) stringObjectMap.get("mood"); 48 | this.gender = "1".equalsIgnoreCase(String.valueOf(stringObjectMap.get("gender"))) ? "男" : "女"; 49 | } catch (Exception e) { 50 | throw new SuperOALoginException(ResultEnum.GET_CURRENT_USER_ERROR); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/service/OpsappApiServiceI.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.model.OpsappModel; 4 | import com.qunar.superoa.model.OpsappSendMessageInfo; 5 | import java.util.Map; 6 | import org.springframework.cloud.openfeign.FeignClient; 7 | import org.springframework.stereotype.Service; 8 | import org.springframework.web.bind.annotation.RequestBody; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.RequestMethod; 11 | 12 | /** 13 | * @Auther: lee.guo 14 | * @Date:Created in 2018/10/23_下午9:21 15 | * @Despriction: opsapp相关接口 16 | */ 17 | 18 | @Service 19 | @FeignClient(url = "${api.opsapp}", name = "opsapp.qunar.com") 20 | public interface OpsappApiServiceI { 21 | 22 | /** 23 | * 发送Qtalk通知 24 | * @param opsappSendMessageInfo 25 | * @return 26 | */ 27 | @RequestMapping(value = "/ops/opsapp/api/send_qtalk_message", method = RequestMethod.POST, produces = "application/json") 28 | Object sendQtalkMessage(@RequestBody OpsappSendMessageInfo opsappSendMessageInfo); 29 | 30 | /** 31 | * 推送待审批数据 32 | */ 33 | @RequestMapping(value = "/ops/opsapp/api/update", method = RequestMethod.POST, produces = "application/json") 34 | Object update(@RequestBody OpsappModel opsappModel); 35 | 36 | /** 37 | * 增量推送待审批数据 38 | */ 39 | @RequestMapping(value = "/ops/opsapp/api/update_patch", method = RequestMethod.POST, produces = "application/json") 40 | Object update_patch(@RequestBody OpsappModel opsappModel); 41 | 42 | /** 43 | * 推送已审批数据 44 | */ 45 | @RequestMapping(value = "/ops/opsapp/api/push/history", method = RequestMethod.POST, produces = "application/json") 46 | Object history(@RequestBody Map opsappModel); 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dao/DepartmentRepository.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dao; 2 | 3 | import com.qunar.superoa.model.Department; 4 | import java.util.List; 5 | import java.util.Optional; 6 | import org.springframework.data.jpa.repository.JpaRepository; 7 | import org.springframework.data.jpa.repository.Query; 8 | 9 | /** 10 | * @Auther: chengyan.liang 11 | * @Descpriction: 12 | * @Date:Created in 下午3:29 2018/10/29 13 | * @Modify by: 14 | */ 15 | public interface DepartmentRepository extends JpaRepository{ 16 | 17 | 18 | /** 19 | * 根据关键字获取全部部门信息 20 | * @param nodeNameStr k,如 - isdev 21 | */ 22 | List findAllByNodeNameStrContaining(String nodeNameStr); 23 | 24 | /** 25 | * 根据关键字id获取全部部门信息 26 | * @param id 部门id 27 | */ 28 | List findAllByParentStrContaining(String id); 29 | 30 | /** 31 | * 根据层级获取所有部门名称 32 | * @param deep 层级 33 | * @return 34 | */ 35 | @Query(value = "select distinct name from Department where deep = ?1 order by name asc") 36 | List findAllDeptNameByDeep(Integer deep); 37 | 38 | /** 39 | * 根据层级获取所有部门对象 40 | */ 41 | List findAllByDeep(Integer deep); 42 | 43 | /** 44 | * 根据父id - pid获取所有部门对象 45 | */ 46 | List findAllByPid(String pid); 47 | 48 | /** 49 | * 查询所有leaders包含userName的部门 50 | */ 51 | List findAllByLeadersContaining(String userName); 52 | 53 | /** 54 | * 查询所有vp包含userName的部门 55 | */ 56 | List findAllByVpContaining(String userName); 57 | 58 | /** 59 | * 查询所有hrbps包含userName的部门 60 | */ 61 | List findAllByHrbpsContaining(String userName); 62 | 63 | /** 64 | * 根据name查询部门 65 | */ 66 | List findByName(String name); 67 | 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/controller/NotifyController.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.controller; 2 | 3 | import com.qunar.superoa.dto.NotifyDto; 4 | import com.qunar.superoa.dto.PageResult; 5 | import com.qunar.superoa.dto.Result; 6 | import com.qunar.superoa.dto.PageAble; 7 | import com.qunar.superoa.service.NotifyServiceI; 8 | import com.qunar.superoa.utils.ResultUtil; 9 | import io.swagger.annotations.Api; 10 | import io.swagger.annotations.ApiParam; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.web.bind.annotation.*; 13 | 14 | /** 15 | * @Auther: lee.guo 16 | * @Date:Created in 2018/9/12_下午2:39 17 | * @Despriction: NotifyController 18 | */ 19 | 20 | @Api(value = "通知", tags = "通知") 21 | @RestController 22 | @RequestMapping("notify") 23 | public class NotifyController { 24 | 25 | @Autowired 26 | private NotifyServiceI notifyServiceI; 27 | 28 | 29 | @PostMapping("/findByCurrentUser") 30 | public Result> findByCurrentUser(@RequestBody PageAble pageAble){ 31 | return ResultUtil.success(notifyServiceI.findCurrentUserNotify(pageAble)); 32 | } 33 | 34 | @PostMapping("/findAll") 35 | public Result> findAll(@RequestBody PageAble pageAble){ 36 | return ResultUtil.success(notifyServiceI.findAll(pageAble)); 37 | } 38 | 39 | 40 | @PostMapping("/findUnread") 41 | public Result> findUnread(@RequestBody PageAble pageAble){ 42 | return ResultUtil.success(notifyServiceI.findUnread(pageAble)); 43 | } 44 | 45 | @PostMapping("/read") 46 | public Result read(@ApiParam("ids (多个用逗号分隔)") @RequestParam String ids){ 47 | notifyServiceI.readNotify(ids); 48 | return ResultUtil.success(); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/interceptor/WebSocketInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.interceptor; 2 | 3 | import com.qunar.superoa.security.SecurityUtils; 4 | import org.springframework.http.server.ServerHttpRequest; 5 | import org.springframework.http.server.ServerHttpResponse; 6 | import org.springframework.http.server.ServletServerHttpRequest; 7 | import org.springframework.web.socket.WebSocketHandler; 8 | import org.springframework.web.socket.server.HandshakeInterceptor; 9 | 10 | import javax.servlet.http.HttpSession; 11 | import java.util.Map; 12 | 13 | /** 14 | * @Author: yang.du 15 | * @Description: 16 | * @Date: Created in 16:38 2018/9/4 17 | */ 18 | public class WebSocketInterceptor implements HandshakeInterceptor { 19 | @Override 20 | public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler, Map map) throws Exception { 21 | if (request instanceof ServletServerHttpRequest) { 22 | ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request; 23 | HttpSession session = serverHttpRequest.getServletRequest().getSession(); 24 | if (session != null) { 25 | // String userId = (String) session.getAttribute("userId"); 26 | String userId = SecurityUtils.currentUsername(); 27 | if (userId == null) { 28 | userId = "WEBSOCKET_USERNAME_IS_NULL"; 29 | } 30 | map.put("userId", userId); 31 | } 32 | 33 | } 34 | return true; 35 | } 36 | 37 | @Override 38 | public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) { 39 | 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/org/activiti/rest/editor/main/StencilsetRestResource.java: -------------------------------------------------------------------------------- 1 | /* Licensed under the Apache License, Version 2.0 (the "License"); 2 | * you may not use this file except in compliance with the License. 3 | * You may obtain a copy of the License at 4 | * 5 | * http://www.apache.org/licenses/LICENSE-2.0 6 | * 7 | * Unless required by applicable law or agreed to in writing, software 8 | * distributed under the License is distributed on an "AS IS" BASIS, 9 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | * See the License for the specific language governing permissions and 11 | * limitations under the License. 12 | */ 13 | package org.activiti.rest.editor.main; 14 | 15 | import org.activiti.engine.ActivitiException; 16 | import org.apache.commons.io.IOUtils; 17 | import org.springframework.web.bind.annotation.RequestMapping; 18 | import org.springframework.web.bind.annotation.RequestMethod; 19 | import org.springframework.web.bind.annotation.ResponseBody; 20 | import org.springframework.web.bind.annotation.RestController; 21 | 22 | import java.io.InputStream; 23 | 24 | /** 25 | * @author Tijs Rademakers 26 | */ 27 | @RestController 28 | @RequestMapping("/service") 29 | public class StencilsetRestResource { 30 | 31 | /** 32 | * activiti editor 汉化 33 | */ 34 | @RequestMapping(value="/editor/stencilset", method = RequestMethod.GET, produces = "application/json;charset=utf-8") 35 | public @ResponseBody 36 | String getStencilset() { 37 | InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json"); 38 | try { 39 | return IOUtils.toString(stencilsetStream, "utf-8"); 40 | } catch (Exception e) { 41 | throw new ActivitiException("Error while loading stencil set", e); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/service/ipml/FlowServiceImplTest.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service.ipml; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import com.qunar.superoa.dao.FlowOrderRepository; 6 | import com.qunar.superoa.model.FlowOrder; 7 | import java.util.Map; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.activiti.engine.RepositoryService; 10 | import org.activiti.engine.RuntimeService; 11 | import org.activiti.engine.TaskService; 12 | import org.activiti.engine.runtime.ProcessInstance; 13 | import org.activiti.engine.task.Task; 14 | import org.junit.Test; 15 | import org.junit.runner.RunWith; 16 | import org.springframework.beans.factory.annotation.Autowired; 17 | import org.springframework.boot.test.context.SpringBootTest; 18 | import org.springframework.test.context.junit4.SpringRunner; 19 | 20 | /** 21 | * @Auther: chengyan.liang 22 | * @Despriction: 23 | * @Date:Created in 4:50 PM 2018/12/24 24 | * @Modify by: 25 | */ 26 | @SpringBootTest 27 | @RunWith(SpringRunner.class) 28 | @Slf4j 29 | public class FlowServiceImplTest { 30 | 31 | @Autowired 32 | private RuntimeService runtimeService; 33 | 34 | @Autowired 35 | private TaskService taskService; 36 | 37 | @Autowired 38 | private FlowOrderRepository flowOrderRepository; 39 | 40 | @Autowired 41 | private RepositoryService repositoryService; 42 | 43 | @Test 44 | public void editNode() { 45 | 46 | FlowOrder flowOrder = flowOrderRepository.findById("e4d008a167df45910167df46a30d0001").get(); 47 | Task task = taskService.createTaskQuery().processInstanceId(flowOrder.getProcInstId()) 48 | .singleResult(); 49 | String editNodeName = String 50 | .valueOf(runtimeService.getVariable(task.getExecutionId(), "editNodeName")); 51 | log.info("测试节点名称: {}", editNodeName); 52 | 53 | } 54 | 55 | } -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/QueryExtSysUnapproveDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | import org.springframework.data.domain.PageRequest; 6 | import org.springframework.data.domain.Sort; 7 | 8 | /** 9 | * @Auther: chengyan.liang 10 | * @Despriction: 查询外部系统审批流程参数传递 11 | * @Date:Created in 4:49 PM 2019/4/28 12 | * @Modify by: 13 | */ 14 | @Data 15 | public class QueryExtSysUnapproveDto { 16 | 17 | @ApiModelProperty(value = "关键字搜索字段") 18 | private String key; 19 | 20 | @ApiModelProperty(value = "外部系统标识") 21 | private String flowType; 22 | 23 | @ApiModelProperty(value = "提交审批开始时间") 24 | private String submitBeginTime; 25 | 26 | @ApiModelProperty(value = "提交审批结束时间") 27 | private String submitEndTime; 28 | 29 | @ApiModelProperty(value = "完成审批开始时间") 30 | private String finishBeginTime; 31 | 32 | @ApiModelProperty(value = "完成审批结束时间") 33 | private String finishEndTime; 34 | 35 | @ApiModelProperty(value = "发起人") 36 | private String userId; 37 | 38 | @ApiModelProperty(value = "查询类型(0:我发起的; 2:待我审批的)") 39 | private String queryType; 40 | 41 | @ApiModelProperty("当前页,默认1") 42 | private int page = 1; 43 | 44 | @ApiModelProperty("页容量,默认10") 45 | private int size = 10; 46 | 47 | @ApiModelProperty("排序方式,默认根据流程提交时间") 48 | private String sort = "applyTime"; 49 | 50 | @ApiModelProperty("排序方式(DESC/ASC) 默认DESC") 51 | private String direction = "DESC"; 52 | 53 | public PageRequest getPageAble() { 54 | return PageRequest.of( 55 | page < 1 ? 0 : page -1, 56 | size == 0 ? 10 :size, 57 | new Sort( 58 | "ASC".equalsIgnoreCase(direction) ? Sort.Direction.ASC : Sort.Direction.DESC, 59 | "".endsWith(sort) ? "oid" : sort 60 | ) 61 | ); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/PageResult.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import com.qunar.superoa.utils.InvokeUtil; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | import lombok.Data; 8 | import org.springframework.data.domain.Page; 9 | import org.springframework.data.domain.Pageable; 10 | 11 | /** 12 | * @Auther: lee.guo 13 | * @Date:Created in 2018/9/10_下午5:57 14 | * @Despriction: 返回带有分页信息的list结果集 15 | */ 16 | 17 | @Data 18 | public class PageResult { 19 | 20 | @ApiModelProperty("数据列表") 21 | private List content; 22 | 23 | @ApiModelProperty("总数") 24 | private int total; 25 | 26 | @ApiModelProperty("分页信息") 27 | private Pageable pageable; 28 | 29 | public PageResult() { 30 | } 31 | 32 | 33 | //将model转成dto 34 | public PageResult(Page pageModel, Class dtoClass) { 35 | List dto = new ArrayList<>(); 36 | pageModel.getContent().forEach(model -> dto.add((T) InvokeUtil.newDto(model, dtoClass))); 37 | this.total = (int) pageModel.getTotalElements(); 38 | this.content = dto; 39 | this.pageable = pageModel.getPageable(); 40 | } 41 | 42 | public PageResult(Page pageModel) { 43 | this.total = (int) pageModel.getTotalElements(); 44 | this.content = (List) pageModel.getContent(); 45 | this.pageable = pageModel.getPageable(); 46 | } 47 | 48 | public PageResult(Page pageModel, List list) { 49 | this.total = (int) pageModel.getTotalElements(); 50 | this.content = (List) list; 51 | this.pageable = pageModel.getPageable(); 52 | } 53 | 54 | public void setContent(Object pageModel, Class dtoClass) { 55 | List dto = new ArrayList<>(); 56 | getContent().forEach(model -> dto.add((T) InvokeUtil.newDto(model, dtoClass))); 57 | this.content = dto; 58 | } 59 | } -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/QtalkMessageBody.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import java.util.ArrayList; 6 | import java.util.HashMap; 7 | import java.util.List; 8 | import java.util.Map; 9 | import lombok.Data; 10 | 11 | /** 12 | * @Auther: lee.guo 13 | * @Despriction: 14 | * @Date: Created in 10:42 PM 2018/12/21 15 | * @Modify by: 16 | */ 17 | @Data 18 | @ApiModel("发送qtalk消息") 19 | public class QtalkMessageBody { 20 | 21 | @ApiModelProperty("") 22 | private String auto_reply; 23 | @ApiModelProperty("") 24 | private String backupinfo; 25 | @ApiModelProperty("") 26 | private String content; 27 | @ApiModelProperty("") 28 | private String extendinfo; 29 | @ApiModelProperty("发送方") 30 | private String from; 31 | @ApiModelProperty("") 32 | private String fromhost; 33 | @ApiModelProperty("") 34 | private String msgtype; 35 | @ApiModelProperty("") 36 | private String system; 37 | @ApiModelProperty("") 38 | private List> to; 39 | @ApiModelProperty("") 40 | private String type; 41 | 42 | public QtalkMessageBody(String MucId, String userName) { 43 | List> toList = new ArrayList(); 44 | Map toMap = new HashMap(); 45 | toMap.put("user", MucId); 46 | toMap.put("host", "conference.ejabhost1"); 47 | toList.add(toMap); 48 | this.from = "worknotice"; 49 | this.to = toList; 50 | this.type = "groupchat"; 51 | this.extendinfo = ""; 52 | this.msgtype = "1"; 53 | this.content = "@" + userName + " 同学你好, QOA系统相关问题请咨询 @郭立lee @周星 @粱成琰 , 流程相关问题请咨询 @蒋卫东 。"; 54 | this.system = "ops_superoa"; 55 | this.auto_reply = "false"; 56 | this.backupinfo = ""; 57 | this.fromhost = "ejabhost1"; 58 | } 59 | 60 | 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/enums/RoleTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.enums; 2 | 3 | import com.google.common.base.Preconditions; 4 | import lombok.Getter; 5 | import org.springframework.util.StringUtils; 6 | 7 | /** 8 | * @Author: yang.du 9 | * @Description: 10 | * @Date: Created in 10:30 2018/9/3 11 | */ 12 | @Getter 13 | public enum RoleTypeEnum { 14 | 15 | ROLE_SYSTEM_ADMIN(0, "SYSTEM_ADMIN", "系统管理员"), 16 | ROLE_ACTIVITI_ADMIN(1, "ACTIVITI_ADMIN", "流程管理员"); 17 | 18 | int code; 19 | String text; 20 | String desc; 21 | 22 | RoleTypeEnum(int code, String text, String desc){ 23 | this.code = code; 24 | this.text = text; 25 | this.desc = desc; 26 | } 27 | 28 | public static RoleTypeEnum getEnumByCode(int code) { 29 | Preconditions.checkArgument(code >= 0 && code <= 1, "code只能为0-1"); 30 | for (RoleTypeEnum roleTypeEnum : RoleTypeEnum.values()) { 31 | if (roleTypeEnum.code == code) { 32 | return roleTypeEnum; 33 | } 34 | } 35 | return null; 36 | } 37 | 38 | public static RoleTypeEnum getEnumByText(String text) { 39 | Preconditions.checkArgument(!StringUtils.isEmpty(text), "名称不能为空"); 40 | for (RoleTypeEnum roleTypeEnum : RoleTypeEnum.values()) { 41 | if (roleTypeEnum.text.equals(text)) { 42 | return roleTypeEnum; 43 | } 44 | } 45 | return null; 46 | } 47 | 48 | public static RoleTypeEnum getEnumByDesc(String desc) { 49 | Preconditions.checkArgument(!StringUtils.isEmpty(desc), "描述不能为空"); 50 | for (RoleTypeEnum roleTypeEnum : RoleTypeEnum.values()) { 51 | if (roleTypeEnum.desc.equals(desc)) { 52 | return roleTypeEnum; 53 | } 54 | } 55 | return null; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/security/UserDetailsService.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.security; 2 | 3 | 4 | import com.qunar.superoa.model.SuperOAUser; 5 | import com.qunar.superoa.model.UserRole; 6 | import com.qunar.superoa.service.ipml.UserRoleService; 7 | import com.qunar.superoa.service.ipml.UserService; 8 | import java.util.List; 9 | import javax.annotation.Resource; 10 | import lombok.extern.slf4j.Slf4j; 11 | import org.springframework.security.core.userdetails.UsernameNotFoundException; 12 | import org.springframework.stereotype.Service; 13 | 14 | /** 15 | * @Auther: lee.guo 16 | * @Date:Created in 2018/8/23_6:12 PM 17 | * @Despriction: 使用用户名从数据库查找到用户的信息,然后构建 MySuperOAUserDetails 18 | */ 19 | 20 | @Slf4j 21 | @Service 22 | public class UserDetailsService implements 23 | org.springframework.security.core.userdetails.UserDetailsService { 24 | 25 | @Resource 26 | private UserService userService; 27 | 28 | @Resource 29 | private UserRoleService userRoleService; 30 | 31 | /** 32 | * 使用 username 加载用户的信息,如密码,权限等 33 | * 34 | * @param userName 登陆表单中用户输入的用户名 35 | */ 36 | 37 | @Override 38 | public MySuperOAUserDetails loadUserByUsername(String userName) throws UsernameNotFoundException { 39 | SuperOAUser superOAUser; 40 | try { 41 | superOAUser = userService.findByName(userName); 42 | } catch (Exception e) { 43 | throw new UsernameNotFoundException(userName + " : superOAUser select fail"); 44 | } 45 | if (superOAUser == null) { 46 | throw new UsernameNotFoundException("no superOAUser found"); 47 | } else { 48 | try { 49 | List roles = userRoleService.getRoleByUser(superOAUser); 50 | return new MySuperOAUserDetails(superOAUser, roles); 51 | } catch (Exception e) { 52 | throw new UsernameNotFoundException("superOAUser role select fail"); 53 | } 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/service/ipml/NotifyServiceImplTest.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service.ipml; 2 | 3 | import com.qunar.superoa.dao.FlowOrderRepository; 4 | import com.qunar.superoa.dao.NotifyRepository; 5 | import com.qunar.superoa.model.FlowOrder; 6 | import com.qunar.superoa.model.Notify; 7 | import com.qunar.superoa.service.NotifyServiceI; 8 | import java.util.Map; 9 | import org.junit.Test; 10 | import org.junit.runner.RunWith; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.boot.test.context.SpringBootTest; 13 | import org.springframework.test.context.junit4.SpringRunner; 14 | 15 | import static org.junit.Assert.*; 16 | @RunWith(SpringRunner.class) 17 | @SpringBootTest 18 | public class NotifyServiceImplTest { 19 | 20 | @Autowired 21 | private NotifyServiceImpl notifyServiceI; 22 | 23 | @Autowired 24 | private NotifyRepository notifyRepository; 25 | 26 | @Test 27 | public void sendNotify() { 28 | } 29 | 30 | 31 | @Test 32 | public void readNotify() { 33 | } 34 | 35 | @Test 36 | public void readNotify1() { 37 | } 38 | 39 | @Test 40 | public void sendMail() throws Exception { 41 | Notify notify = notifyRepository.findById("8addd3d0668ba5f701669aac157c0004").get(); 42 | notifyServiceI.sendMail(notify); 43 | } 44 | 45 | @Test 46 | public void sendQtalk() { 47 | //Notify notify = notifyRepository.findById("8addbc2b66816070016681fce1780011").get(); 48 | Notify notify = notifyRepository.findById("8adda47466f3ebc6016706db93a60047").get(); 49 | //FlowOrder flowOrder = flowOrderRepository.findById(notify.getFlowID()).get(); 50 | notifyServiceI.sendQtalk(notify); 51 | } 52 | 53 | @Test 54 | public void sendWebNotify() { 55 | Notify notify = notifyRepository.findById("8adda47466f3ebc6016706db93a60047").get(); 56 | } 57 | } -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/NotifyDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import com.qunar.superoa.model.Notify; 4 | import com.qunar.superoa.utils.DateTimeUtil; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import lombok.Data; 7 | 8 | /** 9 | * @Auther: lee.guo 10 | * @Date:Created in 2018/9/12_下午1:39 11 | * @Despriction: 12 | */ 13 | 14 | @Data 15 | public class NotifyDto { 16 | @ApiModelProperty("通知ID") 17 | private String id; 18 | 19 | @ApiModelProperty("通知人") 20 | private String qtalk; 21 | 22 | @ApiModelProperty("通知类型(0:点击跳转待办; 1:点击跳转已申请; -1: 不跳转任何页面)") 23 | private int noticeType; 24 | 25 | @ApiModelProperty("谁") 26 | private String who; 27 | 28 | @ApiModelProperty("谁的QTALK") 29 | private String whoQtalk; 30 | 31 | @ApiModelProperty("谁的头像") 32 | private String whoAvatar; 33 | 34 | @ApiModelProperty("通知内容") 35 | private String content; 36 | 37 | @ApiModelProperty("模板名称") 38 | private String flowName; 39 | 40 | @ApiModelProperty("通知时间") 41 | private String createTime; 42 | 43 | @ApiModelProperty("已读") 44 | private Boolean read; 45 | 46 | @ApiModelProperty("流程ID") 47 | private String flowID; 48 | 49 | @ApiModelProperty("最后操作时间") 50 | private String updateTime; 51 | 52 | public NotifyDto(Object model){ 53 | Notify notify = (Notify)model; 54 | this.id = notify.getId(); 55 | this.qtalk = notify.getQtalk(); 56 | this.noticeType = notify.getNoticeType(); 57 | this.content = notify.getContent(); 58 | this.createTime = DateTimeUtil.toString(notify.getCreateTime()); 59 | this.read = notify.getRead(); 60 | this.flowID = notify.getFlowID(); 61 | this.updateTime = notify.getUpdateTime(); 62 | this.who = notify.getWho(); 63 | this.whoQtalk = notify.getWhoQtak(); 64 | this.flowName = notify.getFlowName(); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/QueryFlowDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import io.swagger.annotations.ApiModelProperty; 4 | import lombok.Data; 5 | import org.springframework.data.domain.PageRequest; 6 | import org.springframework.data.domain.Sort; 7 | 8 | /** 9 | * @Auther: xing.zhou 10 | * @Auther: lee.guo 11 | * @Date:Created in 2018/9/29_5:06 PM 12 | * @Despriction: 13 | */ 14 | 15 | @Data 16 | public class QueryFlowDto { 17 | 18 | @ApiModelProperty(value = "流程模板名称", required = true) 19 | private String flowType; 20 | 21 | @ApiModelProperty(value = "流程状态(0:审批完成;1:审批中;2:已撤销;3:未发起;4:全部;5:拒绝)", required = true) 22 | private String status; 23 | 24 | @ApiModelProperty(value = "关键字搜索字段") 25 | private String key; 26 | 27 | @ApiModelProperty(value = "提交审批开始时间") 28 | private String submitBeginTime; 29 | 30 | @ApiModelProperty(value = "提交审批结束时间") 31 | private String submitEndTime; 32 | 33 | @ApiModelProperty(value = "完成审批开始时间") 34 | private String finishBeginTime; 35 | 36 | @ApiModelProperty(value = "完成审批结束时间") 37 | private String finishEndTime; 38 | 39 | @ApiModelProperty(value = "发起人") 40 | private String userId; 41 | 42 | @ApiModelProperty(value = "查询类型(0:我发起的;1:我已审批;2:待我审批;3:知会给我的)") 43 | private String queryType; 44 | 45 | @ApiModelProperty("当前页, 默认1") 46 | private int page = 1; 47 | 48 | @ApiModelProperty("当前页, 默认10") 49 | private int size = 10; 50 | 51 | @ApiModelProperty("当前页, 默认根据id") 52 | private String sort = "applyTime"; 53 | 54 | @ApiModelProperty("排序方式(DESC/ASC) 默认DESC") 55 | private String direction = "DESC"; 56 | 57 | 58 | public PageRequest getPageAble() { 59 | return PageRequest.of( 60 | page < 1 ? 0 : page - 1, 61 | size == 0 ? 10 : size, 62 | new Sort( 63 | "ASC".equalsIgnoreCase(direction) ? Sort.Direction.ASC : Sort.Direction.DESC, 64 | "".endsWith(sort) ? "id" : sort 65 | ) 66 | ); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/utils/AESUtil.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | import java.nio.charset.StandardCharsets; 4 | import java.util.Base64.Decoder; 5 | import javax.crypto.Cipher; 6 | import javax.crypto.SecretKey; 7 | import javax.crypto.spec.SecretKeySpec; 8 | import org.bouncycastle.util.encoders.Base64; 9 | 10 | /** 11 | * @Auther: chengyan.liang 12 | * @Despriction: AES加密解密算法 13 | * @Date:Created in 10:16 AM 2019/4/9 14 | * @Modify by: 15 | */ 16 | public class AESUtil { 17 | /** 18 | * 加密解密算法 19 | */ 20 | private static final String ALGORITHM = "AES"; 21 | /** 22 | * 加解密算法/工作模式/填充方式 23 | */ 24 | private static final String ALGORITHM_MODE_PADDING = "AES/ECB/PKCS5Padding"; 25 | /** 26 | * 生成key 27 | */ 28 | private static SecretKeySpec key = new SecretKeySpec("TbyacXAvOYPPI94i".getBytes(), ALGORITHM); 29 | 30 | static SecretKey secretKey; 31 | 32 | /** 33 | * AES加密 34 | * @param data 待加密数据 35 | * @return 加密后的数据 36 | * @throws Exception 37 | */ 38 | public static String encryptData(String data) throws Exception { 39 | // 创建密码器 40 | Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING); 41 | //初始化,加密模式 42 | cipher.init(Cipher.ENCRYPT_MODE, key); 43 | //生成密码 44 | return new String(Base64.encode(cipher.doFinal(data.getBytes()))); 45 | } 46 | 47 | /** 48 | * AES解密 49 | * @param data 待解密的数据 50 | * @param keyMd5 解密的key 51 | * @return 解密后的数据 52 | * @throws Exception 53 | */ 54 | public static String decryptData(String data, String keyMd5) throws Exception { 55 | // 创建密码器 56 | Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING); 57 | //解密密钥 58 | secretKey = new SecretKeySpec(keyMd5.getBytes(StandardCharsets.UTF_8), ALGORITHM); 59 | //初始化,解密模式 60 | cipher.init(Cipher.DECRYPT_MODE, secretKey); 61 | Decoder decoder = java.util.Base64.getDecoder(); 62 | byte[] decrypt = cipher.doFinal(decoder.decode(data)); 63 | 64 | return new String(decrypt, StandardCharsets.UTF_8); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/utils/FileMD5Utils.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.utils; 2 | 3 | import java.io.File; 4 | import java.io.FileInputStream; 5 | import java.io.FileNotFoundException; 6 | import java.io.IOException; 7 | import java.io.InputStream; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.apache.commons.codec.digest.DigestUtils; 10 | import org.apache.commons.io.IOUtils; 11 | import org.springframework.stereotype.Component; 12 | import org.springframework.web.multipart.MultipartFile; 13 | 14 | /** 15 | * @Auther: chengyan.liang 16 | * @Despriction: 17 | * @Date:Created in 上午10:27 2018/11/6 18 | * @Modify by: 19 | */ 20 | 21 | /** 22 | * 获取文件md5值 23 | */ 24 | @Component 25 | @Slf4j 26 | public class FileMD5Utils { 27 | 28 | /** 29 | * 根据文件获取md5值 30 | */ 31 | public String getMd5ByFile(File file) { 32 | 33 | String md5 = null; 34 | 35 | try { 36 | FileInputStream fileInputStream = new FileInputStream(file); 37 | md5 = DigestUtils.md5Hex(IOUtils.toByteArray(fileInputStream)); 38 | 39 | } catch (FileNotFoundException e) { 40 | log.error("获取文件inputStream失败",e); 41 | } catch (IOException e) { 42 | log.error("根据inputStream获取md5值失败",e); 43 | } 44 | return md5; 45 | } 46 | 47 | /** 48 | *根据InputStream获取md5值 49 | */ 50 | public String getMd5ByInputStream(InputStream inputStream) { 51 | String md5 = null; 52 | 53 | try { 54 | md5 = DigestUtils.md5Hex(IOUtils.toByteArray(inputStream)); 55 | } catch (IOException e) { 56 | log.error("根据inputStream获取文件md5值失败",e); 57 | } 58 | return md5; 59 | } 60 | 61 | /** 62 | *根据MultiPartFile获取md5值 63 | */ 64 | public String getMd5ByFile(MultipartFile multipartFile) { 65 | String md5 = null; 66 | 67 | try { 68 | InputStream inputStream = multipartFile.getInputStream(); 69 | md5 = DigestUtils.md5Hex(IOUtils.toByteArray(inputStream)); 70 | } catch (IOException e) { 71 | log.error("获取multiPartFile文件的md5值失败",e); 72 | } 73 | return md5; 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/security/MySuperOAUserDetails.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.security; 2 | 3 | import com.qunar.superoa.model.SuperOAUser; 4 | import com.qunar.superoa.model.UserRole; 5 | import java.util.Collection; 6 | import java.util.List; 7 | import org.springframework.security.core.GrantedAuthority; 8 | import org.springframework.security.core.authority.AuthorityUtils; 9 | import org.springframework.security.core.userdetails.UserDetails; 10 | 11 | /** 12 | * @Auther: lee.guo 13 | * @Date:Created in 2018/8/23_6:05 PM 14 | * @Despriction: 自定义的 MySuperOAUserDetails 可以保存用户的其他信息到 session 里, 例如 user id 等. 15 | */ 16 | 17 | public class MySuperOAUserDetails extends SuperOAUser implements UserDetails { 18 | 19 | private List roles; 20 | 21 | public MySuperOAUserDetails(SuperOAUser superOAUser, List roles) { 22 | super(superOAUser); 23 | this.roles = roles; 24 | } 25 | 26 | @Override 27 | public Collection getAuthorities() { 28 | if (roles == null || roles.size() < 1) { 29 | return AuthorityUtils.commaSeparatedStringToAuthorityList(""); 30 | } 31 | StringBuilder commaBuilder = new StringBuilder(); 32 | for (UserRole role : roles) { 33 | commaBuilder.append(role.getRoleType()).append(","); 34 | } 35 | String authorities = commaBuilder.substring(0, commaBuilder.length() - 1); 36 | return AuthorityUtils.commaSeparatedStringToAuthorityList(authorities); 37 | } 38 | 39 | @Override 40 | public String getPassword() { 41 | return super.getPassword(); 42 | } 43 | 44 | @Override 45 | public String getUsername() { 46 | return super.getUserName(); 47 | } 48 | 49 | @Override 50 | public boolean isAccountNonExpired() { 51 | return true; 52 | } 53 | 54 | @Override 55 | public boolean isAccountNonLocked() { 56 | return true; 57 | } 58 | 59 | @Override 60 | public boolean isCredentialsNonExpired() { 61 | return true; 62 | } 63 | 64 | @Override 65 | public boolean isEnabled() { 66 | return true; 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/config/WebMvcConfig.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.config; 2 | 3 | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.web.filter.HttpPutFormContentFilter; 7 | import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 8 | import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; 9 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; 10 | import springfox.documentation.spring.web.SpringfoxWebMvcConfiguration; 11 | 12 | @Configuration 13 | @ConditionalOnClass(SpringfoxWebMvcConfiguration.class) 14 | public class WebMvcConfig extends WebMvcConfigurationSupport { 15 | 16 | @Override 17 | public void addResourceHandlers(ResourceHandlerRegistry registry) { 18 | registry.addResourceHandler("/js/**").addResourceLocations("classpath:/js/"); 19 | registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); 20 | registry.addResourceHandler("swagger-ui.html") 21 | .addResourceLocations("classpath:/META-INF/resources/"); 22 | registry.addResourceHandler("/webjars/**") 23 | .addResourceLocations("classpath:/META-INF/resources/webjars/"); 24 | registry.addResourceHandler("/**").addResourceLocations("classpath:/static/"); 25 | } 26 | 27 | @Override 28 | public void addViewControllers(ViewControllerRegistry registry) { 29 | registry.addViewController("/index").setViewName("/index"); 30 | registry.addViewController("/viewPicTestHtml").setViewName("/viewPicTestHtml"); 31 | registry.addViewController("qsso").setViewName("qsso"); 32 | registry.addViewController("webLogin").setViewName("webLogin"); 33 | registry.addViewController("healthcheck.html").setViewName("healthcheck.html"); 34 | } 35 | 36 | @Bean 37 | public HttpPutFormContentFilter httpPutFormContentFilter() { 38 | return new HttpPutFormContentFilter(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/dto/FlowDataDto.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.dto; 2 | 3 | import com.qunar.superoa.utils.CommonUtil; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | /** 11 | * Created by xing.zhou on 2018/9/12. 12 | * 流程数据详情 传递前端数据 13 | */ 14 | @Data 15 | public class FlowDataDto { 16 | 17 | @ApiModelProperty(value = "流程Id") 18 | private String procInstId; 19 | 20 | @ApiModelProperty(value = "流程key") 21 | private String flowKey; 22 | 23 | @ApiModelProperty(value = "流程名称") 24 | private String flowName; 25 | 26 | @ApiModelProperty(value = "申请人Id") 27 | private String applyUserId; 28 | 29 | @ApiModelProperty(value = "申请人Name") 30 | private String applyUserName; 31 | 32 | @ApiModelProperty(value = "申请人部门") 33 | private String applyUserDept; 34 | 35 | @ApiModelProperty(value = "申请人全部部门") 36 | private String applyUserFullDept; 37 | 38 | @ApiModelProperty(value = "申请时间") 39 | private String applyTime; 40 | 41 | @ApiModelProperty(value = "节点审批人") 42 | private String approveUsers; 43 | 44 | @ApiModelProperty(value = "节点审批人头像") 45 | private String approveUsersAvatar; 46 | 47 | @ApiModelProperty(value = "是否可撤销及回退") 48 | private String canRevokeOrBack; 49 | 50 | @ApiModelProperty(value = "节点审批名称") 51 | private String approveNodeName; 52 | 53 | @ApiModelProperty( value = "表单特殊字段集合(hide:隐藏;edit:可编辑)") 54 | private List> editNodeName; 55 | 56 | @ApiModelProperty(value = "表单模板") 57 | private Map formModelJson; 58 | 59 | @ApiModelProperty(value = "表单数据") 60 | private Map formDatas; 61 | 62 | @ApiModelProperty(value = "审批日志") 63 | private List approveLogs; 64 | 65 | public void setFormModelJson(Object formModelJson) { 66 | this.formModelJson = CommonUtil.o2m(formModelJson); 67 | } 68 | 69 | public void setFormDatas(Object formDatas) { 70 | this.formDatas = CommonUtil.o2m(formDatas); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/Agent.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | import com.qunar.superoa.utils.DateTimeUtil; 4 | import io.swagger.annotations.ApiModel; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import lombok.Data; 7 | import org.hibernate.annotations.GenericGenerator; 8 | import org.springframework.format.annotation.DateTimeFormat; 9 | 10 | import javax.persistence.*; 11 | import javax.validation.constraints.Future; 12 | import javax.validation.constraints.NotNull; 13 | import java.util.Date; 14 | 15 | /** 16 | * @Auther: lee.guo 17 | * @Date:Created in 2018/8/17_上午11:59 18 | * @Despriction: 代理人 19 | */ 20 | @Data 21 | @Entity 22 | @ApiModel("代理人") 23 | @GenericGenerator(name = "jpa-uuid", strategy = "uuid") 24 | public class Agent { 25 | @Id 26 | @GeneratedValue(generator = "jpa-uuid") 27 | @Column(length = 32) 28 | @ApiModelProperty("代理人ID") 29 | private String id; 30 | 31 | @NotNull(message = "Qtalk(被代理人)不能为空") 32 | @ApiModelProperty(value = "Qtalk", required = true) 33 | private String qtalk; 34 | 35 | @NotNull(message = "代理人不能为空") 36 | @ApiModelProperty(value = "代理人Qtalk(多个用逗号分隔)", required = true) 37 | private String agent; 38 | 39 | @Future 40 | @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME, pattern = "yyyy-MM-dd HH:mm:ss") 41 | @ApiModelProperty(value = "代理截止时间(yyyy-MM-dd HH:mm:ss)") 42 | @Temporal(TemporalType.TIMESTAMP) 43 | private Date deadline; 44 | 45 | @ApiModelProperty(value = "代理流程ID(默认全部)") 46 | private String processID; 47 | 48 | @ApiModelProperty(value = "更新时间(参数不需要传入)") 49 | private String updateTime; 50 | 51 | @ApiModelProperty("备注") 52 | private String remarks; 53 | 54 | public String getDeadline(){ 55 | if(this.deadline == null) return null; 56 | return DateTimeUtil.toString(this.deadline); 57 | } 58 | 59 | public void setDeadline(String date){ 60 | setDeadline(DateTimeUtil.toDate(date)); 61 | } 62 | 63 | public void setDeadline(Date date){ 64 | this.deadline = date; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/com/qunar/superoa/model/FlowNodeData.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.model; 2 | 3 | 4 | import io.swagger.annotations.ApiModel; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import lombok.Data; 7 | import org.hibernate.annotations.GenericGenerator; 8 | 9 | import javax.persistence.Column; 10 | import javax.persistence.Entity; 11 | import javax.persistence.GeneratedValue; 12 | import javax.persistence.Id; 13 | import javax.validation.constraints.NotNull; 14 | 15 | /** 16 | * 用于存储流程所有节点的当前数据 17 | */ 18 | @Data 19 | @Entity 20 | @ApiModel("节点数据表") 21 | @GenericGenerator(name="jpa-uuid", strategy = "uuid") 22 | public class FlowNodeData { 23 | 24 | @Id 25 | @GeneratedValue(generator = "jpa-uuid") 26 | @Column(length = 32) 27 | @ApiModelProperty(value = "节点数据表ID") 28 | private String id; 29 | 30 | @NotNull(message = "节点key不能为空") 31 | @ApiModelProperty(value = "节点key") 32 | private String nodeDefKey; 33 | 34 | @NotNull(message = "节点名称不能为空") 35 | @ApiModelProperty(value = "节点名称") 36 | private String nodeName; 37 | 38 | @NotNull(message = "操作人Id不能为空") 39 | @ApiModelProperty(value = "操作人Id") 40 | private String createUserId; 41 | 42 | @NotNull(message = "操作人Name不能为空") 43 | @ApiModelProperty(value = "操作人Name") 44 | private String createUserName; 45 | 46 | @NotNull(message = "流程Id不能为空") 47 | @ApiModelProperty(value = "流程Id", required = true) 48 | private String procInstId; 49 | 50 | @NotNull(message = "表单模板name不能为空") 51 | @ApiModelProperty(value = "表单模板name", required = true) 52 | private String formModelName; 53 | 54 | @NotNull(message = "表单模板流程key不能为空") 55 | @ApiModelProperty(value = "表单模板流程key", required = true) 56 | private String formModelFlowKey; 57 | 58 | @NotNull(message = "表单数据不能为空") 59 | @ApiModelProperty(value = "表单数据", required = true) 60 | @Column(columnDefinition = "TEXT") 61 | private String formDatas; 62 | 63 | @NotNull(message = "创建时间不能为空") 64 | @ApiModelProperty(value = "创建时间", required = true) 65 | private String createTime; 66 | } 67 | -------------------------------------------------------------------------------- /src/test/java/com/qunar/superoa/service/DepartmentServiceTest.java: -------------------------------------------------------------------------------- 1 | package com.qunar.superoa.service; 2 | 3 | import com.qunar.superoa.dao.AttachmentRepository; 4 | import com.qunar.superoa.dao.DepartmentRepository; 5 | import com.qunar.superoa.model.UserAttachment; 6 | import java.net.HttpURLConnection; 7 | import java.net.URL; 8 | import java.util.Date; 9 | import java.util.List; 10 | import java.util.Map; 11 | import java.util.Optional; 12 | import java.util.concurrent.atomic.AtomicInteger; 13 | import lombok.extern.java.Log; 14 | import org.junit.Test; 15 | import org.junit.runner.RunWith; 16 | import org.springframework.beans.factory.annotation.Autowired; 17 | import org.springframework.boot.test.context.SpringBootTest; 18 | import org.springframework.test.context.junit4.SpringRunner; 19 | 20 | /** 21 | * @Auther: chengyan.liang 22 | * @Despriction: 23 | * @Date:Created in 下午3:51 2018/10/29 24 | * @Modify by: 25 | */ 26 | @RunWith(SpringRunner.class) 27 | @SpringBootTest 28 | @Log 29 | public class DepartmentServiceTest { 30 | 31 | @Autowired 32 | AttachmentRepository attachmentRepository; 33 | 34 | @Test 35 | public void attachmentTest() { 36 | Optional> userAttachmentList = attachmentRepository.findAllByExpiredDateBefore(new Date()); 37 | log.info(userAttachmentList.toString()); 38 | } 39 | 40 | @Test 41 | public void swiftDeleteTest() { 42 | } 43 | 44 | @Test 45 | public void urlExistTest() { 46 | boolean isAlive = true; 47 | try { 48 | URL url = new URL("https://blog.csdn.net/fangqun663775/article/details/45309287"); 49 | HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 50 | connection.setConnectTimeout(1000*30); 51 | connection.connect(); 52 | int code = connection.getResponseCode(); 53 | boolean success = (code >= 200) && (code < 300) ; 54 | if (!success) { 55 | isAlive = false; 56 | } 57 | connection.disconnect(); 58 | } catch (Exception e) { 59 | isAlive = false; 60 | } 61 | log.info(String.valueOf(isAlive)); 62 | } 63 | 64 | } 65 | --------------------------------------------------------------------------------