Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yanxuan-qc-change-system
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
胡园园
yanxuan-qc-change-system
Commits
8a31c288
Commit
8a31c288
authored
Nov 16, 2022
by
“zcwang”
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add: 创建工单
parent
d9758754
Show whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
670 additions
and
19 deletions
+670
-19
pom.xml
pom.xml
+11
-0
ChangeFlowBiz.java
...om/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
+89
-3
ExceptionFactory.java
...l/yanxuan/change/biz/meta/exception/ExceptionFactory.java
+1
-1
ServiceException.java
...l/yanxuan/change/biz/meta/exception/ServiceException.java
+1
-1
AdminChangeConfigService.java
.../yanxuan/change/biz/service/AdminChangeConfigService.java
+1
-1
AdminChangeConfigServiceImpl.java
...change/biz/service/impl/AdminChangeConfigServiceImpl.java
+2
-3
ChangeExecConfigServiceImpl.java
.../biz/service/impl/change/ChangeExecConfigServiceImpl.java
+1
-1
ChangeTypeServiceImpl.java
...change/biz/service/impl/change/ChangeTypeServiceImpl.java
+1
-1
AjaxResult.java
...m/netease/mail/yanxuan/change/common/bean/AjaxResult.java
+1
-1
CommonConstants.java
...ease/mail/yanxuan/change/common/bean/CommonConstants.java
+6
-1
RequestLocalBean.java
...ase/mail/yanxuan/change/common/bean/RequestLocalBean.java
+103
-0
ResponseCode.java
...netease/mail/yanxuan/change/common/bean/ResponseCode.java
+4
-2
ResponseCodeEnum.java
...ase/mail/yanxuan/change/common/bean/ResponseCodeEnum.java
+1
-1
ChangeFlowEnum.java
...ease/mail/yanxuan/change/common/enums/ChangeFlowEnum.java
+37
-0
FlowOperationTypeEnum.java
...il/yanxuan/change/common/enums/FlowOperationTypeEnum.java
+31
-0
FlowxOperationEnum.java
.../mail/yanxuan/change/common/enums/FlowxOperationEnum.java
+54
-0
FlowRpcService.java
.../mail/yanxuan/change/integration/flow/FlowRpcService.java
+50
-0
FlowxCreateDTO.java
.../mail/yanxuan/change/integration/flow/FlowxCreateDTO.java
+59
-0
GlobalExceptionHandler.java
...e/mail/yanxuan/change/web/aop/GlobalExceptionHandler.java
+1
-1
LoginInterceptor.java
...ease/mail/yanxuan/change/web/config/LoginInterceptor.java
+56
-0
UserInterceptor.java
...tease/mail/yanxuan/change/web/config/UserInterceptor.java
+95
-0
WebMvcConfig.java
.../netease/mail/yanxuan/change/web/config/WebMvcConfig.java
+63
-0
ChangeConfigController.java
...yanxuan/change/web/controller/ChangeConfigController.java
+1
-1
ChangeFlowController.java
...l/yanxuan/change/web/controller/ChangeFlowController.java
+1
-1
No files found.
pom.xml
View file @
8a31c288
...
@@ -234,6 +234,12 @@
...
@@ -234,6 +234,12 @@
<artifactId>
missa-client
</artifactId>
<artifactId>
missa-client
</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>
com.netease.mail
</groupId>
<artifactId>
yx-openid-login
</artifactId>
<version>
1.0.1-SNAPSHOT
</version>
</dependency>
<!--其他严选中间件依赖包按需添加-->
<!--其他严选中间件依赖包按需添加-->
<!--
<!--
<dependency>
<dependency>
...
@@ -355,6 +361,11 @@
...
@@ -355,6 +361,11 @@
<artifactId>
pagehelper-spring-boot-starter
</artifactId>
<artifactId>
pagehelper-spring-boot-starter
</artifactId>
<version>
1.3.0
</version>
<version>
1.3.0
</version>
</dependency>
</dependency>
<dependency>
<groupId>
com.netease.yanxuan.flowx
</groupId>
<artifactId>
yanxuan-flowx-sdk
</artifactId>
<version>
1.3
</version>
</dependency>
</dependencies>
</dependencies>
<repositories>
<repositories>
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
View file @
8a31c288
...
@@ -6,27 +6,49 @@
...
@@ -6,27 +6,49 @@
*/
*/
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
biz
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
biz
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.UUID
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.Assert
;
import
org.springframework.util.Assert
;
import
org.springframework.util.CollectionUtils
;
import
com.alibaba.fastjson.JSON
;
import
com.netease.mail.yanxuan.change.biz.config.AppConfig
;
import
com.netease.mail.yanxuan.change.biz.config.AppConfig
;
import
com.netease.mail.yanxuan.change.biz.meta.exception.ExceptionFactory
;
import
com.netease.mail.yanxuan.change.biz.service.ChangeFlowService
;
import
com.netease.mail.yanxuan.change.biz.service.ChangeFlowService
;
import
com.netease.mail.yanxuan.change.biz.service.change.ChangeConfigService
;
import
com.netease.mail.yanxuan.change.biz.service.change.ChangeConfigService
;
import
com.netease.mail.yanxuan.change.common.bean.CommonConstants
;
import
com.netease.mail.yanxuan.change.common.bean.RequestLocalBean
;
import
com.netease.mail.yanxuan.change.common.bean.ResponseCode
;
import
com.netease.mail.yanxuan.change.common.bean.ResponseCodeEnum
;
import
com.netease.mail.yanxuan.change.common.enums.ChangeFlowEnum
;
import
com.netease.mail.yanxuan.change.common.enums.ChangeStatusEnum
;
import
com.netease.mail.yanxuan.change.common.enums.ChangeStatusEnum
;
import
com.netease.mail.yanxuan.change.common.enums.ChangeSubjectEnum
;
import
com.netease.mail.yanxuan.change.common.enums.ChangeSubjectEnum
;
import
com.netease.mail.yanxuan.change.common.enums.FlowOperationTypeEnum
;
import
com.netease.mail.yanxuan.change.common.enums.FlowxOperationEnum
;
import
com.netease.mail.yanxuan.change.common.enums.NeedFileEnum
;
import
com.netease.mail.yanxuan.change.common.enums.NeedFileEnum
;
import
com.netease.mail.yanxuan.change.common.util.DateUtils
;
import
com.netease.mail.yanxuan.change.common.util.DateUtils
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeConfig
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeConfig
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeRecord
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeRecord
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowCreateReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowCreateReq
;
import
com.netease.mail.yanxuan.change.integration.flow.FlowRpcService
;
import
com.netease.yanxuan.flowx.sdk.meta.controller.communal.AjaxResponse
;
import
com.netease.yanxuan.flowx.sdk.meta.dto.base.FlowDataDTO
;
import
com.netease.yanxuan.flowx.sdk.meta.dto.flow.FlowCreateReqDTO
;
import
com.netease.yanxuan.flowx.sdk.meta.dto.flow.NodeSubmitReqDTO
;
import
lombok.extern.slf4j.Slf4j
;
/**
/**
* @Author zcwang
* @Author zcwang
* @Date 2022/11/15
* @Date 2022/11/15
*/
*/
@Component
@Component
@Slf4j
public
class
ChangeFlowBiz
{
public
class
ChangeFlowBiz
{
@Autowired
@Autowired
...
@@ -38,7 +60,12 @@ public class ChangeFlowBiz {
...
@@ -38,7 +60,12 @@ public class ChangeFlowBiz {
@Autowired
@Autowired
private
AppConfig
appConfig
;
private
AppConfig
appConfig
;
@Autowired
private
FlowRpcService
flowRpcService
;
public
Boolean
createAndSubmit
(
ChangeFlowCreateReq
changeFlowCreateReq
)
{
public
Boolean
createAndSubmit
(
ChangeFlowCreateReq
changeFlowCreateReq
)
{
String
uid
=
RequestLocalBean
.
getUid
();
String
name
=
RequestLocalBean
.
getName
();
// 校验变更主体
// 校验变更主体
Boolean
containsChangeSubject
=
ChangeSubjectEnum
.
getByType
(
changeFlowCreateReq
.
getChangeSubject
());
Boolean
containsChangeSubject
=
ChangeSubjectEnum
.
getByType
(
changeFlowCreateReq
.
getChangeSubject
());
Assert
.
isTrue
(
containsChangeSubject
,
"变更主体不存在"
);
Assert
.
isTrue
(
containsChangeSubject
,
"变更主体不存在"
);
...
@@ -56,14 +83,73 @@ public class ChangeFlowBiz {
...
@@ -56,14 +83,73 @@ public class ChangeFlowBiz {
// 结束时间不可晚于第二天定时任务执行时间
// 结束时间不可晚于第二天定时任务执行时间
Long
tomorrowSpecificTime
=
DateUtils
.
getTomorrowSpecificTime
(
"09:00:00"
);
Long
tomorrowSpecificTime
=
DateUtils
.
getTomorrowSpecificTime
(
"09:00:00"
);
Assert
.
isTrue
(
changeFlowCreateReq
.
getChangeConfirmResultTime
()
>=
tomorrowSpecificTime
,
"时间不可晚于下次执行时间"
);
Assert
.
isTrue
(
changeFlowCreateReq
.
getChangeConfirmResultTime
()
>=
tomorrowSpecificTime
,
"时间不可晚于下次执行时间"
);
// 创建并提交工作流
Map
<
String
,
Object
>
content
=
new
HashMap
<>(
10
);
content
.
put
(
"createUserName"
,
name
);
content
.
put
(
"createUser"
,
uid
);
content
.
put
(
"createTime"
,
System
.
currentTimeMillis
());
content
.
put
(
"updateTime"
,
System
.
currentTimeMillis
());
content
.
put
(
CommonConstants
.
FLOW_OPERATION_KEY
,
FlowOperationTypeEnum
.
PASS
.
getValue
());
// 创建并提交工单
createAndSubmitFlow
(
ChangeFlowEnum
.
CHANGE_FLOW_CONFIRM
.
getTopoId
(),
uid
,
name
,
JSON
.
toJSONString
(
content
),
FlowxOperationEnum
.
CREATE
.
getName
());
// 保存工单数据
// 保存工单数据
ChangeRecord
changeRecord
=
buildRecord
(
changeFlowCreateReq
);
ChangeRecord
changeRecord
=
buildRecord
(
changeFlowCreateReq
);
changeFlowService
.
saveRecord
(
changeRecord
);
changeFlowService
.
saveRecord
(
changeRecord
);
return
null
;
return
null
;
}
}
private
void
createAndSubmitFlow
(
String
topoId
,
String
uid
,
String
userName
,
String
content
,
String
operateResult
)
{
// 先创建工单,创建完成后直接提交
FlowCreateReqDTO
flowCreateReqDTO
=
new
FlowCreateReqDTO
();
flowCreateReqDTO
.
setTopoId
(
topoId
);
flowCreateReqDTO
.
setUid
(
uid
);
flowCreateReqDTO
.
setUserName
(
userName
);
flowCreateReqDTO
.
setOperateResult
(
operateResult
);
flowCreateReqDTO
.
setWorkOrderId
(
StringUtils
.
joinWith
(
"-"
,
topoId
,
UUID
.
randomUUID
().
toString
()));
log
.
info
(
"[createAndSubmitFlow] flowCreateReqDTO={}"
,
flowCreateReqDTO
);
AjaxResponse
<
String
>
flowCreateResponse
=
flowRpcService
.
create
(
CommonConstants
.
FLOWX_PRODUCT
,
flowCreateReqDTO
);
String
flowId
;
if
(
ResponseCodeEnum
.
SUCCESS
.
getCode
()
==
flowCreateResponse
.
getCode
())
{
flowId
=
flowCreateResponse
.
getData
();
log
.
info
(
"[createAndSubmitFlow] flowId ={}"
,
JSON
.
toJSONString
(
flowId
));
}
else
{
log
.
error
(
"[createAndSubmitFlow] create flow failed, query={}, errMsg={}"
,
JSON
.
toJSONString
(
flowCreateReqDTO
),
flowCreateResponse
.
getErrorMsg
());
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
CREATE_FLOW_ERROR
,
flowCreateResponse
.
getErrorMsg
());
}
// 查询工单详情,根据详情提交
FlowDataDTO
flowDataDTO
;
AjaxResponse
<
FlowDataDTO
>
flowDetailResponse
=
flowRpcService
.
getDetail
(
CommonConstants
.
FLOWX_PRODUCT
,
flowId
);
if
(
ResponseCodeEnum
.
SUCCESS
.
getCode
()
==
flowDetailResponse
.
getCode
())
{
flowDataDTO
=
flowDetailResponse
.
getData
();
log
.
info
(
"[createAndSubmitFlow] flowDataDTO={}"
,
JSON
.
toJSONString
(
flowDataDTO
));
}
else
{
log
.
error
(
"[createAndSubmitFlow] get flow detail failed, query={}, errMsg={}"
,
JSON
.
toJSONString
(
flowId
),
flowCreateResponse
.
getErrorMsg
());
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
DETAIL_FLOW_ERROR
,
flowCreateResponse
.
getErrorMsg
());
}
NodeSubmitReqDTO
nodeSubmitReqDTO
=
new
NodeSubmitReqDTO
();
nodeSubmitReqDTO
.
setNodeId
(
flowDataDTO
.
getFlowMeta
().
getCurrNodeDataList
().
get
(
0
).
getNodeId
());
nodeSubmitReqDTO
.
setUid
(
flowCreateReqDTO
.
getUid
());
nodeSubmitReqDTO
.
setUserName
(
flowCreateReqDTO
.
getUserName
());
nodeSubmitReqDTO
.
setFlowId
(
flowId
);
nodeSubmitReqDTO
.
setTopoId
(
flowCreateReqDTO
.
getTopoId
());
nodeSubmitReqDTO
.
setContent
(
flowCreateReqDTO
.
getContent
());
nodeSubmitReqDTO
.
setOperateResult
(
FlowxOperationEnum
.
CREATE
.
getName
());
// 提交工单
AjaxResponse
<
List
<
String
>>
submitResponse
=
flowRpcService
.
submit
(
CommonConstants
.
FLOWX_PRODUCT
,
flowId
);
if
(
ResponseCodeEnum
.
SUCCESS
.
getCode
()
==
flowDetailResponse
.
getCode
())
{
List
<
String
>
nextNodeIdList
=
submitResponse
.
getData
();
log
.
info
(
"[createAndSubmitFlow] nextNodeIdList={}"
,
JSON
.
toJSONString
(
nextNodeIdList
));
}
else
{
log
.
error
(
"[createAndSubmitFlow] submit flow failed, query={}, errMsg={}"
,
JSON
.
toJSONString
(
flowId
),
flowCreateResponse
.
getErrorMsg
());
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
SUBMIT_FLOW_ERROR
,
flowCreateResponse
.
getErrorMsg
());
}
}
private
ChangeRecord
buildRecord
(
ChangeFlowCreateReq
changeFlowCreateReq
)
{
private
ChangeRecord
buildRecord
(
ChangeFlowCreateReq
changeFlowCreateReq
)
{
ChangeRecord
changeRecord
=
new
ChangeRecord
();
ChangeRecord
changeRecord
=
new
ChangeRecord
();
// todo
// todo
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/meta/exception/ExceptionFactory.java
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
meta
.
exception
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
meta
.
exception
;
import
com.netease.mail.yanxuan.change.
biz.meta
.ResponseCode
;
import
com.netease.mail.yanxuan.change.
common.bean
.ResponseCode
;
/**
/**
* @author: bndong
* @author: bndong
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/meta/exception/ServiceException.java
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
meta
.
exception
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
meta
.
exception
;
import
com.netease.mail.yanxuan.change.
biz.meta
.ResponseCode
;
import
com.netease.mail.yanxuan.change.
common.bean
.ResponseCode
;
/**
/**
* @author: bndong
* @author: bndong
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/AdminChangeConfigService.java
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
service
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
service
;
import
com.netease.mail.yanxuan.change.
biz.meta
.AjaxResult
;
import
com.netease.mail.yanxuan.change.
common.bean
.AjaxResult
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeConfigQueryReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeConfigQueryReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeConfigReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeConfigReq
;
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/impl/AdminChangeConfigServiceImpl.java
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
service
.
impl
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
service
.
impl
;
import
com.netease.mail.yanxuan.change.biz.meta.AjaxResult
;
import
com.netease.mail.yanxuan.change.common.bean.AjaxResult
;
import
com.netease.mail.yanxuan.change.biz.meta.ResponseCode
;
import
com.netease.mail.yanxuan.change.biz.service.AdminChangeConfigService
;
import
com.netease.mail.yanxuan.change.biz.service.AdminChangeConfigService
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeConfigQueryReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeConfigQueryReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeConfigReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeConfigReq
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
/**
/**
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/impl/change/ChangeExecConfigServiceImpl.java
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
service
.
impl
.
change
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
service
.
impl
.
change
;
import
com.netease.mail.yanxuan.change.
biz.meta
.ResponseCode
;
import
com.netease.mail.yanxuan.change.
common.bean
.ResponseCode
;
import
com.netease.mail.yanxuan.change.biz.meta.exception.ExceptionFactory
;
import
com.netease.mail.yanxuan.change.biz.meta.exception.ExceptionFactory
;
import
com.netease.mail.yanxuan.change.biz.service.change.ChangeExecConfigService
;
import
com.netease.mail.yanxuan.change.biz.service.change.ChangeExecConfigService
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeExecConfig
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeExecConfig
;
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/impl/change/ChangeTypeServiceImpl.java
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
service
.
impl
.
change
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
service
.
impl
.
change
;
import
com.netease.mail.yanxuan.change.
biz.meta
.ResponseCode
;
import
com.netease.mail.yanxuan.change.
common.bean
.ResponseCode
;
import
com.netease.mail.yanxuan.change.biz.meta.exception.ExceptionFactory
;
import
com.netease.mail.yanxuan.change.biz.meta.exception.ExceptionFactory
;
import
com.netease.mail.yanxuan.change.biz.service.change.ChangeTypeService
;
import
com.netease.mail.yanxuan.change.biz.service.change.ChangeTypeService
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeType
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeType
;
...
...
yanxuan-qc-change-system-
biz/src/main/java/com/netease/mail/yanxuan/change/biz/meta
/AjaxResult.java
→
yanxuan-qc-change-system-
common/src/main/java/com/netease/mail/yanxuan/change/common/bean
/AjaxResult.java
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
meta
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
common
.
bean
;
import
lombok.Data
;
import
lombok.Data
;
...
...
yanxuan-qc-change-system-
biz/src/main/java/com/netease/mail/yanxuan/change/biz/meta
/CommonConstants.java
→
yanxuan-qc-change-system-
common/src/main/java/com/netease/mail/yanxuan/change/common/bean
/CommonConstants.java
View file @
8a31c288
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
* Copyright 2022 Netease, Inc. All rights reserved.
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
*/
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
meta
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
common
.
bean
;
/**
/**
* @Author zcwang
* @Author zcwang
...
@@ -13,7 +13,11 @@ package com.netease.mail.yanxuan.change.biz.meta;
...
@@ -13,7 +13,11 @@ package com.netease.mail.yanxuan.change.biz.meta;
*/
*/
public
class
CommonConstants
{
public
class
CommonConstants
{
// 工单业务数据操作key
public
static
final
String
FLOW_OPERATION_KEY
=
"operation"
;;
public
static
Integer
SIZE
=
1
;
public
static
Integer
SIZE
=
1
;
public
static
Integer
PAGE
=
10
;
public
static
Integer
PAGE
=
10
;
public
static
String
FLOWX_PRODUCT
=
"qc"
;
}
}
\ No newline at end of file
yanxuan-qc-change-system-common/src/main/java/com/netease/mail/yanxuan/change/common/bean/RequestLocalBean.java
0 → 100644
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
common
.
bean
;
/**
* @author: bndong
* @date: 2021/5/25
*/
public
class
RequestLocalBean
{
/**
* 存储当前的用户的Id
*/
private
static
final
ThreadLocal
<
Long
>
userIdLocal
=
new
ThreadLocal
<>();
/**
* 存储当期用户的uid
*/
private
static
final
ThreadLocal
<
String
>
uidLocal
=
new
ThreadLocal
<>();
/**
* 存储当前请求的ip信息
*/
private
static
final
ThreadLocal
<
String
>
ipLocal
=
new
ThreadLocal
<>();
/**
* 真实姓名
*/
private
static
final
ThreadLocal
<
String
>
nameLocal
=
new
ThreadLocal
<>();
/**
* 最近登录时间
*/
private
static
final
ThreadLocal
<
Long
>
lastLoginTimeLocal
=
new
ThreadLocal
<>();
public
static
void
rmrRequestUserId
()
{
userIdLocal
.
remove
();
}
public
static
Long
getRequestUserId
()
{
return
userIdLocal
.
get
();
}
public
static
void
setRequestUserId
(
Long
userId
)
{
userIdLocal
.
set
(
userId
);
}
public
static
void
rmrRequestIp
()
{
ipLocal
.
remove
();
}
public
static
String
getRequestIp
()
{
return
ipLocal
.
get
();
}
public
static
void
setRequestIp
(
String
ip
)
{
ipLocal
.
set
(
ip
);
}
public
static
void
rmUid
()
{
uidLocal
.
remove
();
}
public
static
String
getUid
()
{
return
uidLocal
.
get
();
}
public
static
void
setUid
(
String
uid
)
{
uidLocal
.
set
(
uid
);
}
public
static
void
rmrName
()
{
nameLocal
.
remove
();
}
public
static
String
getName
()
{
return
nameLocal
.
get
();
}
public
static
void
setName
(
String
name
)
{
nameLocal
.
set
(
name
);
}
public
static
void
rmrLastLoginTime
()
{
lastLoginTimeLocal
.
remove
();
}
public
static
Long
getLastLoginTime
()
{
return
lastLoginTimeLocal
.
get
();
}
public
static
void
setLastLoginTime
(
Long
lastLoginTime
)
{
lastLoginTimeLocal
.
set
(
lastLoginTime
);
}
public
static
void
clear
()
{
RequestLocalBean
.
rmUid
();
RequestLocalBean
.
rmrRequestIp
();
RequestLocalBean
.
rmrRequestUserId
();
RequestLocalBean
.
rmrName
();
RequestLocalBean
.
rmrLastLoginTime
();
}
}
yanxuan-qc-change-system-
biz/src/main/java/com/netease/mail/yanxuan/change/biz/meta
/ResponseCode.java
→
yanxuan-qc-change-system-
common/src/main/java/com/netease/mail/yanxuan/change/common/bean
/ResponseCode.java
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
meta
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
common
.
bean
;
/**
/**
* 返回的code
* 返回的code
...
@@ -120,7 +120,9 @@ public enum ResponseCode {
...
@@ -120,7 +120,9 @@ public enum ResponseCode {
NO_GOOD_TASK
(
802
,
"不是商品任务"
),
NO_GOOD_TASK
(
802
,
"不是商品任务"
),
CONFIG_ERROR
(
1001
,
"配置错误"
),
CREATE_FLOW_ERROR
(
1001
,
"创建工单错误"
),
DETAIL_FLOW_ERROR
(
1002
,
"查询工单详情错误"
),
SUBMIT_FLOW_ERROR
(
1002
,
"查询工单详情错误"
),
//----------10xx-----------
//----------10xx-----------
...
...
yanxuan-qc-change-system-
biz/src/main/java/com/netease/mail/yanxuan/change/biz/meta
/ResponseCodeEnum.java
→
yanxuan-qc-change-system-
common/src/main/java/com/netease/mail/yanxuan/change/common/bean
/ResponseCodeEnum.java
View file @
8a31c288
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
* Copyright 2022 Netease, Inc. All rights reserved.
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
*/
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
meta
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
common
.
bean
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Map
;
...
...
yanxuan-qc-change-system-common/src/main/java/com/netease/mail/yanxuan/change/common/enums/ChangeFlowEnum.java
0 → 100644
View file @
8a31c288
/**
* @(#)ChangeFlowEnum.java, 2022/11/16.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package
com
.
netease
.
mail
.
yanxuan
.
change
.
common
.
enums
;
import
lombok.Getter
;
/**
* @Author zcwang
* @Date 2022/11/16
*/
public
enum
ChangeFlowEnum
{
CHANGE_FLOW_START
(
"79560500"
,
"开始节点"
,
"qc-change-flow"
),
CHANGE_FLOW_SUBMIT
(
"79560501"
,
"变更申请提交"
,
"qc-change-flow"
),
CHANGE_FLOW_EXE
(
"79560503"
,
"变更结果确认"
,
"qc-change-flow"
),
CHANGE_FLOW_CONFIRM
(
"79560502"
,
"变更申请提交"
,
"qc-change-flow"
),
END
(
"9999"
,
"结束"
,
"qc-change-flow"
);
@Getter
private
final
String
nodeId
;
private
final
String
name
;
@Getter
private
final
String
topoId
;
ChangeFlowEnum
(
String
nodeId
,
String
name
,
String
topoId
)
{
this
.
nodeId
=
nodeId
;
this
.
name
=
name
;
this
.
topoId
=
topoId
;
}
}
\ No newline at end of file
yanxuan-qc-change-system-common/src/main/java/com/netease/mail/yanxuan/change/common/enums/FlowOperationTypeEnum.java
0 → 100644
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
common
.
enums
;
import
lombok.AllArgsConstructor
;
/**
* @author tangld
* 工单操作类型
*/
@AllArgsConstructor
public
enum
FlowOperationTypeEnum
{
/**
* 通过
*/
PASS
(
"pass"
),
/**
* 驳回
*/
REFUSE
(
"refuse"
),
/**
* 转交
*/
DELIVER
(
"deliver"
);
private
String
value
;
public
String
getValue
()
{
return
value
;
}
}
yanxuan-qc-change-system-common/src/main/java/com/netease/mail/yanxuan/change/common/enums/FlowxOperationEnum.java
0 → 100644
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
common
.
enums
;
import
lombok.AllArgsConstructor
;
@AllArgsConstructor
public
enum
FlowxOperationEnum
{
/**
* 创建成功
*/
CREATE
(
1
,
"创建成功"
),
/**
* 提交工单
*/
SUBMIT
(
2
,
"提交工单"
),
/**
* 审核通过
*/
APPROVE
(
3
,
"审核通过"
),
/**
* 审批不通过
*/
APPROVE_FAIL
(
4
,
"审批不通过"
),
/**
* 驳回
*/
REFUSE
(
5
,
"驳回"
),
/**
* 转交
*/
DELIVER
(
6
,
"转交"
),
/**
* 系统自动提交
*/
SYSTEM
(
7
,
"系统自动提交工单"
);
/**
* 类型
*/
private
Integer
type
;
/**
* 名称
*/
private
String
name
;
public
Integer
getType
()
{
return
type
;
}
public
String
getName
()
{
return
name
;
}
}
yanxuan-qc-change-system-integration/src/main/java/com/netease/mail/yanxuan/change/integration/flow/FlowRpcService.java
0 → 100644
View file @
8a31c288
/**
* @(#)FlowRpcService.java, 2022/11/16.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package
com
.
netease
.
mail
.
yanxuan
.
change
.
integration
.
flow
;
import
java.util.List
;
import
org.apache.ibatis.annotations.Param
;
import
org.springframework.http.MediaType
;
import
org.springframework.stereotype.Service
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
com.netease.yanxuan.bpmstore.meta.AjaxResult
;
import
com.netease.yanxuan.flowx.sdk.meta.controller.communal.AjaxResponse
;
import
com.netease.yanxuan.flowx.sdk.meta.dto.base.FlowDataDTO
;
import
com.netease.yanxuan.flowx.sdk.meta.dto.flow.FlowCreateReqDTO
;
import
com.netease.yanxuan.missa.client.annotation.MissaClient
;
import
jdk.internal.org.objectweb.asm.tree.analysis.Value
;
/**
* @Author zcwang
* @Date 2022/11/16
*/
@Service
@MissaClient
(
serviceCode
=
"yanxuan-flowx-server.service"
)
public
interface
FlowRpcService
{
/**
* 创建流转工单
*
* @param product
* @param req
* @return
*/
@PostMapping
(
value
=
"/{product}/workOrderFlow/v1/create"
,
consumes
=
MediaType
.
APPLICATION_JSON_VALUE
)
AjaxResponse
<
String
>
create
(
@PathVariable
(
"product"
)
String
product
,
FlowCreateReqDTO
req
);
@GetMapping
(
value
=
"/{product}/workOrder/v1/{flowId}/detail"
)
AjaxResponse
<
FlowDataDTO
>
getDetail
(
@PathVariable
(
"product"
)
String
flowxProduct
,
@PathVariable
(
"flowId"
)
String
flowId
);
@PostMapping
(
value
=
"/{product}/workOrderFlow/v1/submit"
)
AjaxResponse
<
List
<
String
>>
submit
(
@PathVariable
(
"product"
)
String
flowxProduct
,
String
flowId
);
}
\ No newline at end of file
yanxuan-qc-change-system-integration/src/main/java/com/netease/mail/yanxuan/change/integration/flow/FlowxCreateDTO.java
0 → 100644
View file @
8a31c288
/**
* @(#)FlowxCreateDTO.java, 2022/11/16.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package
com
.
netease
.
mail
.
yanxuan
.
change
.
integration
.
flow
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
/**
* @Author zcwang
* @Date 2022/11/16
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public
class
FlowxCreateDTO
{
/**
* 执行更新操作的员工id
*/
private
String
uid
;
/**
* xxx@corp.netease.com
*/
private
String
userName
;
/**
* 业务数据
*/
private
String
content
;
/**
* topoId
*/
private
String
topoId
;
/**
* 工单实例ID
*/
private
String
workOrderId
;
/**
* 备注,提交操作时填写的备注框内容
*/
private
String
remark
;
/**
* 操作结果,用于展示在操作日志中
*/
private
String
operateResult
;
}
\ No newline at end of file
yanxuan-qc-change-system-web/src/main/java/com/netease/mail/yanxuan/change/web/aop/GlobalExceptionHandler.java
View file @
8a31c288
...
@@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.ControllerAdvice;
...
@@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.ControllerAdvice;
import
org.springframework.web.bind.annotation.ExceptionHandler
;
import
org.springframework.web.bind.annotation.ExceptionHandler
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSON
;
import
com.netease.mail.yanxuan.change.
biz.meta
.AjaxResult
;
import
com.netease.mail.yanxuan.change.
common.bean
.AjaxResult
;
import
com.netease.mail.yanxuan.change.biz.meta.exception.ServiceException
;
import
com.netease.mail.yanxuan.change.biz.meta.exception.ServiceException
;
import
com.netease.mail.yanxuan.change.common.util.RequestUtil
;
import
com.netease.mail.yanxuan.change.common.util.RequestUtil
;
import
com.netease.mail.yanxuan.change.common.util.ResponseUtil
;
import
com.netease.mail.yanxuan.change.common.util.ResponseUtil
;
...
...
yanxuan-qc-change-system-web/src/main/java/com/netease/mail/yanxuan/change/web/config/LoginInterceptor.java
0 → 100644
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
web
.
config
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
org.apache.commons.lang.StringUtils
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.servlet.HandlerInterceptor
;
import
org.springframework.web.servlet.ModelAndView
;
import
com.alibaba.fastjson.JSON
;
import
com.netease.mail.yanxuan.change.common.bean.AjaxResult
;
import
com.netease.mail.yanxuan.change.common.bean.ResponseCodeEnum
;
import
com.netease.mail.yanxuan.change.common.bean.RequestLocalBean
;
import
com.netease.mail.yanxuan.change.common.util.ResponseUtil
;
import
lombok.extern.slf4j.Slf4j
;
/**
* 严选用户登录拦截器
*
* @author lwtang
*/
@Component
@Slf4j
public
class
LoginInterceptor
implements
HandlerInterceptor
{
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
String
yxUid
=
RequestLocalBean
.
getUid
();
if
(
yxUid
==
null
)
{
String
text
=
JSON
.
toJSONString
(
AjaxResult
.
of
(
ResponseCodeEnum
.
SC_UNAUTHORIZED
.
getCode
(),
"not-login"
));
String
callback
=
request
.
getParameter
(
"callback"
);
if
(!
StringUtils
.
isEmpty
(
callback
))
{
text
=
callback
+
"("
+
text
+
")"
;
}
ResponseUtil
.
writeJson
(
response
,
text
);
return
false
;
}
return
true
;
}
@Override
public
void
postHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
ModelAndView
modelAndView
)
throws
Exception
{
log
.
info
(
"postHandle"
);
}
@Override
public
void
afterCompletion
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
Exception
ex
)
throws
Exception
{
log
.
info
(
"afterCompletion"
);
}
}
yanxuan-qc-change-system-web/src/main/java/com/netease/mail/yanxuan/change/web/config/UserInterceptor.java
0 → 100644
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
web
.
config
;
import
javax.servlet.http.Cookie
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.servlet.HandlerInterceptor
;
import
org.springframework.web.servlet.ModelAndView
;
import
com.netease.mail.yanxuan.change.common.bean.RequestLocalBean
;
import
com.netease.mail.yx.openid.YxOpenidLogin
;
import
com.netease.mail.yx.openid.YxOpenidUser
;
import
lombok.extern.slf4j.Slf4j
;
/**
* 提取用户uid
*
* @author lwtang
*/
@Component
@Slf4j
public
class
UserInterceptor
implements
HandlerInterceptor
{
@Value
(
"${product:product}"
)
String
product
;
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
//获取cookie信息
Cookie
[]
cookies
=
request
.
getCookies
();
String
userCookie
=
null
;
if
(
cookies
!=
null
)
{
for
(
Cookie
cookie
:
cookies
)
{
if
(
cookie
.
getName
().
equals
(
"YX_OPENID_SESS"
))
{
userCookie
=
cookie
.
getValue
();
}
}
}
log
.
info
(
"YX_OPENID_SESS: {}"
,
userCookie
);
// 解析cookie
YxOpenidUser
yxuser
=
null
;
if
(
userCookie
!=
null
)
{
yxuser
=
YxOpenidLogin
.
parseCookie
(
userCookie
);
}
// ajax请求,走返回码
String
accept
=
request
.
getHeader
(
"Accept"
);
// cookie不存在或者超过一个小时(时间自己定)
if
(
yxuser
==
null
||
yxuser
.
getLoginTime
()
<
System
.
currentTimeMillis
()
-
60
*
1000
*
1000
)
{
//如果是ajax请求
if
(!
accept
.
contains
(
"text/html"
)
||
request
.
getRequestURI
().
contains
(
"ajax"
))
{
log
.
info
(
"ajax request user is null or login time too early, yxuser: {}"
,
yxuser
);
}
else
{
String
url
=
request
.
getRequestURL
().
toString
();
String
loginUrl
=
YxOpenidLogin
.
getLoginUrl
(
url
);
log
.
info
(
"redirect url: {}"
,
loginUrl
);
response
.
sendRedirect
(
loginUrl
);
}
}
else
{
// 获取用户信息
// 邮箱地址
String
email
=
yxuser
.
getEmail
();
RequestLocalBean
.
setUid
(
email
);
// 中文姓名
String
fullname
=
yxuser
.
getFullName
();
RequestLocalBean
.
setName
(
fullname
);
// 用户登录时间戳
long
loginTime
=
yxuser
.
getLoginTime
();
log
.
info
(
"[UserAccess] user: {}, url: {}"
,
email
,
request
.
getPathInfo
());
RequestLocalBean
.
setLastLoginTime
(
loginTime
);
}
return
true
;
}
@Override
public
void
postHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
ModelAndView
modelAndView
)
throws
Exception
{
}
@Override
public
void
afterCompletion
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
Exception
ex
)
throws
Exception
{
RequestLocalBean
.
clear
();
}
}
yanxuan-qc-change-system-web/src/main/java/com/netease/mail/yanxuan/change/web/config/WebMvcConfig.java
0 → 100644
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
web
.
config
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
;
import
org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer
;
import
org.springframework.web.servlet.config.annotation.InterceptorRegistry
;
import
org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
;
/**
* @author zhangbingQAQ
* @date 2021/8/27 10:18
*/
@Configuration
public
class
WebMvcConfig
extends
WebMvcConfigurerAdapter
{
@Autowired
private
LoginInterceptor
loginInterceptor
;
/**
* 拦截器配置
*
* @param registry
*/
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
registry
.
addInterceptor
(
loginInterceptor
).
addPathPatterns
(
"/**"
)
.
excludePathPatterns
(
"/i/health"
)
.
excludePathPatterns
(
"/getHeliosCacheConfig"
)
.
excludePathPatterns
(
"/getDistributedCacheSchedule"
)
.
excludePathPatterns
(
"/getLocalCacheSchedule"
)
.
excludePathPatterns
(
"/nameSpace"
)
.
excludePathPatterns
(
"/loadEnvClusterInfo"
)
.
excludePathPatterns
(
"/test/**"
)
.
excludePathPatterns
(
"/sdk/resultForCacheKey"
)
.
excludePathPatterns
(
"/sdk/reportDispatchResult"
)
.
excludePathPatterns
(
"/sdk/getOpMessage"
)
.
excludePathPatterns
(
"/sdk/opMessageResp"
)
.
excludePathPatterns
(
"/openapi/control/**"
)
.
excludePathPatterns
(
"/sacs/ape/callback"
);
super
.
addInterceptors
(
registry
);
}
@Bean
public
ThreadPoolTaskExecutor
mvcTaskExecutor
()
{
ThreadPoolTaskExecutor
executor
=
new
ThreadPoolTaskExecutor
();
executor
.
setCorePoolSize
(
10
);
executor
.
setQueueCapacity
(
100
);
executor
.
setMaxPoolSize
(
25
);
return
executor
;
}
//配置异步支持,设置了一个用来异步执行业务逻辑的工作线程池,设置了默认的超时时间是60秒
@Override
public
void
configureAsyncSupport
(
AsyncSupportConfigurer
configurer
)
{
configurer
.
setTaskExecutor
(
mvcTaskExecutor
());
configurer
.
setDefaultTimeout
(
apolloConfig
.
getLongPollingTimeout
());
}
}
yanxuan-qc-change-system-web/src/main/java/com/netease/mail/yanxuan/change/web/controller/ChangeConfigController.java
View file @
8a31c288
package
com
.
netease
.
mail
.
yanxuan
.
change
.
web
.
controller
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
web
.
controller
;
import
com.netease.mail.yanxuan.change.
biz.meta
.AjaxResult
;
import
com.netease.mail.yanxuan.change.
common.bean
.AjaxResult
;
import
com.netease.mail.yanxuan.change.biz.service.AdminChangeConfigService
;
import
com.netease.mail.yanxuan.change.biz.service.AdminChangeConfigService
;
import
com.netease.mail.yanxuan.change.dal.mapper.ChangeConfigMapper
;
import
com.netease.mail.yanxuan.change.dal.mapper.ChangeConfigMapper
;
import
com.netease.mail.yanxuan.change.dal.mapper.ChangeExecConfigMapper
;
import
com.netease.mail.yanxuan.change.dal.mapper.ChangeExecConfigMapper
;
...
...
yanxuan-qc-change-system-web/src/main/java/com/netease/mail/yanxuan/change/web/controller/ChangeFlowController.java
View file @
8a31c288
...
@@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
...
@@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSON
;
import
com.netease.mail.yanxuan.change.biz.biz.ChangeFlowBiz
;
import
com.netease.mail.yanxuan.change.biz.biz.ChangeFlowBiz
;
import
com.netease.mail.yanxuan.change.biz.config.TitleConfig
;
import
com.netease.mail.yanxuan.change.biz.config.TitleConfig
;
import
com.netease.mail.yanxuan.change.
biz.meta
.AjaxResult
;
import
com.netease.mail.yanxuan.change.
common.bean
.AjaxResult
;
import
com.netease.mail.yanxuan.change.biz.service.ChangeFlowService
;
import
com.netease.mail.yanxuan.change.biz.service.ChangeFlowService
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowCreateReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowCreateReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowReq
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment