Commit 933e7902 by “zcwang”

modify: 取消变更

parent 1532953a
......@@ -62,8 +62,8 @@ CREATE TABLE `TB_YX_QC_CHANGE_RECORD`
`change_profit` int(11) NOT NULL DEFAULT '0' COMMENT '变更收益',
`change_profit_desc` varchar(550) NOT NULL DEFAULT '' COMMENT '变更收益说明',
`change_confirm_result_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '变更结果确认时间',
`state` int(2) NOT NULL DEFAULT '0' COMMENT '工单状态',
`is_cancel` int(2) NOT NULL DEFAULT '0' COMMENT '是否被取消',
`state` int(2) NOT NULL DEFAULT '0' COMMENT '工单状态,1进行中,2取消完结,3延期,4正常完结',
`cancel_reason` varchar(550) NOT NULL DEFAULT '' COMMENT '取消原因',
`change_result` int(2) NOT NULL DEFAULT '0' COMMENT '变更结论',
`create_source` int(2) NOT NULL DEFAULT '0' COMMENT '创建端(普通or同舟)',
`create_supplier` varchar(20) NOT NULL DEFAULT '' COMMENT '创建人所属供应商(同舟创建)',
......
......@@ -24,7 +24,6 @@ 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.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;
......@@ -35,8 +34,9 @@ import com.netease.mail.yanxuan.change.common.enums.FlowxOperationEnum;
import com.netease.mail.yanxuan.change.common.util.DateUtils;
import com.netease.mail.yanxuan.change.dal.entity.ChangeRecord;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeExecConfigReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowCancelReq;
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.ChangeFlowSubmitReq;
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;
......@@ -67,12 +67,10 @@ public class ChangeFlowBiz {
public String createAndSubmit(ChangeFlowCreateReq changeFlowCreateReq) {
// String uid = RequestLocalBean.getUid();
String uid = "1";
String uid = "x@mesg.com";
// String userName = RequestLocalBean.getName();
String userName = "x@mesg.com";
// 校验变更主体
Boolean containsChangeSubject = ChangeSubjectEnum.getByType(changeFlowCreateReq.getChangeSubject());
Assert.isTrue(containsChangeSubject, "变更主体不存在");
checkSubject(changeFlowCreateReq);
// 检验是否需要资料
// ChangeConfig changeConfig = changeConfigService.queryChangeConfig(changeFlowCreateReq.getSonChangeClassId());
// Assert.notNull(changeConfig, "二级变更类型不存在");
......@@ -83,19 +81,18 @@ public class ChangeFlowBiz {
// 变更行动项不可为空,最多20项
Assert.isTrue(changeFlowCreateReq.getChangeExecProject().size() <= appConfig.getChangeExecLimit(),
"变更行动方案配置数超限");
// 结束时间不可晚于第二天定时任务执行时间
Long tomorrowSpecificTime = DateUtils.getTomorrowSpecificTime("09:00:00");
Assert.isTrue(changeFlowCreateReq.getChangeConfirmResultTime() >= tomorrowSpecificTime, "时间不可晚于下次执行时间");
Map<String, Object> content = new HashMap<>(10);
content.put("createUserName", userName);
content.put("createUserName", uid);
content.put("createUser", uid);
content.put("createTime", System.currentTimeMillis());
content.put("updateTime", System.currentTimeMillis());
content.put(CommonConstants.FLOW_OPERATION_KEY, FlowOperationTypeEnum.PASS.getValue());
// 组装工单创建数据
FlowCreateReqDTO flowCreateReqDTO = buildFlowCreateReqDTO(ChangeFlowEnum.CHANGE_FLOW_START.getTopoId(), uid,
userName, JSON.toJSONString(content), FlowxOperationEnum.CREATE.getName());
JSON.toJSONString(content), FlowxOperationEnum.CREATE.getName());
// 创建工单
String flowId = createFlow(flowCreateReqDTO);
// 查询工单详情
......@@ -107,10 +104,10 @@ public class ChangeFlowBiz {
ChangeRecord changeRecord = buildRecord(flowId, nodeId, changeFlowCreateReq, changeCommander);
changeFlowService.saveRecord(changeRecord);
// todo:判断发起人和审核人
// 如果发起人=变更负责人
if (true) {
List<String> nextNodeIdList = submitFlow(flowId, flowDataDTO, uid, userName,
List<String> nextNodeIdList = submitFlow(flowId, flowDataDTO, uid,
ChangeFlowEnum.CHANGE_FLOW_START.getTopoId(), JSON.toJSONString(content));
if (CollectionUtils.isEmpty(nextNodeIdList)) {
throw ExceptionFactory.createBiz(ResponseCode.SUBMIT_FLOW_ERROR, "首次提交节点失败");
......@@ -120,6 +117,23 @@ public class ChangeFlowBiz {
return flowId;
}
private void checkSubject(ChangeFlowCreateReq changeFlowCreateReq) {
ChangeSubjectEnum type = ChangeSubjectEnum.getByType(changeFlowCreateReq.getChangeSubject());
Assert.notNull(type, "变更主体不存在");
switch (type) {
case PRODUCT:
Assert.isTrue(StringUtils.isNotBlank(changeFlowCreateReq.getChangeItems()), " 变更商品不可为空");
break;
case SUPPLIER:
Assert.isTrue(StringUtils.isNotBlank(changeFlowCreateReq.getChangeSupplier()), " 变更供应商不可为空");
break;
case OTHER:
break;
default:
throw ExceptionFactory.createBiz(ResponseCode.CHANGE_SUBJECT_ERROR, "变更主体类型错误");
}
}
private FlowDataDTO flowDetail(String flowId) {
// 查询工单详情,根据详情提交
FlowDataDTO flowDataDTO;
......@@ -135,24 +149,22 @@ public class ChangeFlowBiz {
return flowDataDTO;
}
private FlowCreateReqDTO buildFlowCreateReqDTO(String topoId, String uid, String userName, String content,
String operateResult) {
private FlowCreateReqDTO buildFlowCreateReqDTO(String topoId, String uid, String content, String operateResult) {
FlowCreateReqDTO flowCreateReqDTO = new FlowCreateReqDTO();
flowCreateReqDTO.setTopoId(topoId);
flowCreateReqDTO.setUid(uid);
flowCreateReqDTO.setUserName(userName);
flowCreateReqDTO.setUserName(uid);
flowCreateReqDTO.setOperateResult(operateResult);
flowCreateReqDTO.setWorkOrderId(StringUtils.joinWith("-", topoId, UUID.randomUUID().toString()));
return flowCreateReqDTO;
}
private List<String> submitFlow(String flowId, FlowDataDTO flowDataDTO, String uid, String userName, String topoId,
String content) {
private List<String> submitFlow(String flowId, FlowDataDTO flowDataDTO, String uid, String topoId, String content) {
NodeSubmitReqDTO nodeSubmitReqDTO = new NodeSubmitReqDTO();
nodeSubmitReqDTO.setFlowId(flowId);
nodeSubmitReqDTO.setNodeId(flowDataDTO.getFlowMeta().getCurrNodeDataList().get(0).getNodeId());
nodeSubmitReqDTO.setUid(uid);
nodeSubmitReqDTO.setUserName(userName);
nodeSubmitReqDTO.setUserName(uid);
nodeSubmitReqDTO.setTopoId(topoId);
nodeSubmitReqDTO.setContent(content);
nodeSubmitReqDTO.setOperateResult(FlowxOperationEnum.SUBMIT.getName());
......@@ -178,20 +190,22 @@ public class ChangeFlowBiz {
private String createFlow(FlowCreateReqDTO flowCreateReqDTO) {
// 先创建工单,创建完成后直接提交
log.info("[createFlow] flowCreateReqDTO={}", flowCreateReqDTO);
AjaxResponse<String> flowCreateResponse = flowRpcService.create(CommonConstants.FLOWX_PRODUCT, flowCreateReqDTO);
AjaxResponse<String> flowCreateResponse = flowRpcService.create(CommonConstants.FLOWX_PRODUCT,
flowCreateReqDTO);
String flowId;
if (ResponseCodeEnum.SUCCESS.getCode() == flowCreateResponse.getCode()) {
flowId = flowCreateResponse.getData();
log.info("[createFlow] flowId ={}", JSON.toJSONString(flowId));
} else {
log.error("[createFlow] create flow failed, query={}, errMsg={}", JSON.toJSONString(flowCreateReqDTO),
JSON.toJSONString(flowCreateResponse));
JSON.toJSONString(flowCreateResponse));
throw ExceptionFactory.createBiz(ResponseCode.CREATE_FLOW_ERROR, "创建工单错误");
}
return flowId;
}
private ChangeRecord buildRecord(String flowId, String nodeId, ChangeFlowCreateReq changeFlowCreateReq, String changeCommander) {
private ChangeRecord buildRecord(String flowId, String nodeId, ChangeFlowCreateReq changeFlowCreateReq,
String changeCommander) {
ChangeRecord changeRecord = new ChangeRecord();
changeRecord.setFlowId(Long.parseLong(flowId));
changeRecord.setFlowNode(nodeId);
......@@ -199,15 +213,16 @@ public class ChangeFlowBiz {
changeRecord.setParentChangeClassId(changeFlowCreateReq.getParentChangeClassId());
changeRecord.setSonChangeClassId(changeFlowCreateReq.getSonChangeClassId());
changeRecord.setChangeLevel(changeFlowCreateReq.getChangeLevel());
// todo: 查询负责人
changeRecord.setChangeCommander("");
changeRecord.setChangeCommander(changeCommander);
changeRecord.setChangeDepartment(changeFlowCreateReq.getChangeDepartment());
List<ChangeExecConfigReq> changeExecProject = changeFlowCreateReq.getChangeExecProject();
List<String> execDepartmentList = changeExecProject.stream().map(ChangeExecConfigReq::getChangeExecDepartment)
.collect(Collectors.toList());
changeRecord.setParticipateChangeExecDepartment(JSON.toJSONString(execDepartmentList));
// todo: 当变更类型是商品时有值
changeRecord.setChangeItem(changeFlowCreateReq.getChangeItems());
if (ChangeSubjectEnum.PRODUCT.getType().equals(changeFlowCreateReq.getChangeSubject())) {
// 当变更类型是商品时有值
changeRecord.setChangeItem(changeFlowCreateReq.getChangeItems());
}
// todo: 当变更类型是供应商时有效
changeRecord.setChangeSupplier(changeFlowCreateReq.getChangeSupplier());
changeRecord.setChangeReason(changeFlowCreateReq.getChangeReason());
......@@ -226,20 +241,19 @@ public class ChangeFlowBiz {
return changeRecord;
}
public String submit(ChangeFlowReq changeFlowReq) {
log.info("[submit] changeFlowReq:{}", JSON.toJSONString(changeFlowReq));
Long flowId = changeFlowReq.getFlowId();
public String submit(ChangeFlowSubmitReq changeFlowSubmitReq) {
log.info("[submitFlow] changeFlowReq:{}", JSON.toJSONString(changeFlowSubmitReq));
Long flowId = changeFlowSubmitReq.getFlowId();
// 查询工单有效性
ChangeRecord changeRecord = changeFlowService.getByFlowId(flowId);
if (changeRecord == null) {
throw ExceptionFactory.createBiz(ResponseCode.ERROR_FLOW_ID, "工单id不存在");
}
if (!changeRecord.getFlowNode().equals(changeFlowReq.getCurrentNodeId())) {
if (!changeRecord.getFlowNode().equals(changeFlowSubmitReq.getCurrentNodeId())) {
throw ExceptionFactory.createBiz(ResponseCode.NODE_ERROR, "工单已流转至其他节点");
}
// todo:检验操作权限
// String uid = RequestLocalBean.getUid();
String userName = RequestLocalBean.getName();
String uid = "1";
String changeCommander = changeRecord.getChangeCommander();
if (!uid.equals(changeCommander)) {
......@@ -251,11 +265,16 @@ public class ChangeFlowBiz {
Map<String, Object> content = new HashMap<>(CommonConstants.INIT_HASH_MAP_SIZE);
content.put("updateTime", System.currentTimeMillis());
content.put(CommonConstants.FLOW_OPERATION_KEY, FlowOperationTypeEnum.PASS.getValue());
List<String> nextNodeList = this.submitFlow(flowId.toString(), flowDataDTO, uid, userName,
List<String> nextNodeList = this.submitFlow(flowId.toString(), flowDataDTO, uid,
ChangeFlowEnum.CHANGE_FLOW_SUBMIT.getTopoId(), JSON.toJSONString(content));
if (CollectionUtils.isEmpty(nextNodeList)) {
return ChangeFlowEnum.END.getNodeId();
}
return nextNodeList.get(0);
}
public Boolean cancel(ChangeFlowCancelReq req) {
log.info("[cancel] req:{}", JSON.toJSONString(req));
return false;
}
}
......@@ -120,30 +120,14 @@ public enum ResponseCode {
NO_GOOD_TASK(802, "不是商品任务"),
//----------10xx-----------
CREATE_FLOW_ERROR(1001, "创建工单错误"),
DETAIL_FLOW_ERROR(1002, "查询工单详情错误"),
SUBMIT_FLOW_ERROR(1002, "提交工单错误"),
ERROR_FLOW_ID(1003, "工单id不存在"),
NODE_ERROR(1004, "工单已流转至其他节点"),
NO_AUTH(1005, "没有当前节点操作权限"),
//----------10xx-----------
NO_DATA(1007, "无数据"),
STEP_NOT_ENOUGH(1008, "步数不足"),
ALREADY_DO(1009, "已完成"),
NOT_FINISH(1011, "未完成"),
FINISH_GUIDE(1012, "完成新手奖励"),
RECEIVE_GUIDE(1013, "完成新手奖励"),
NOT_IN_DMP(1014, "未命中DMP分组"),
NOT_BIND_PHONE(1015, "未绑定手机号"),
/**
* 名字已经被使用
*/
NAME_EXIST(2000, "NAME_IS_USED"),
CHANGE_SUBJECT_ERROR(1006, "变更主体类型错误"),
/**
* 无权限
......
......@@ -13,8 +13,9 @@ package com.netease.mail.yanxuan.change.common.enums;
public enum ChangeStatusEnum {
IN(1, "进行中"),
CANCEL(2, "取消"),
END(3, "完结");
CANCEL(2, "取消完结"),
DELAY(3, "延期"),
END(4, "完结");
private Integer status;
......
......@@ -34,13 +34,13 @@ public enum ChangeSubjectEnum {
return desc;
}
public static Boolean getByType(Integer type) {
public static ChangeSubjectEnum getByType(Integer type) {
for (ChangeSubjectEnum value : ChangeSubjectEnum.values()) {
if (value.getType().equals(type)) {
return true;
return value;
}
}
return false;
return null;
}
public static ChangeSubjectEnum getChangeSubjectEnum(Integer id){
......
......@@ -128,7 +128,7 @@ public class ChangeRecord {
private Integer state;
/**
* 是否被取消
* 取消原因
*/
private String cancelReason;
......
/**
* @(#)ChangeFlowCancelReq.java, 2022/11/21.
* <p/>
* Copyright 2022 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.dal.meta.model.req;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import lombok.Data;
/**
* @Author zcwang
* @Date 2022/11/21
*/
@Data
public class ChangeFlowCancelReq {
/**
* 工单id
*/
@NotNull(message = "工单id不能为空")
private Long flowId;
@NotBlank(message = "取消原因不能为空")
@Size(max = 200, message = "取消原因限制200字")
private String cancelReason;
}
\ No newline at end of file
......@@ -86,8 +86,9 @@ public class ChangeFlowCreateReq {
private List<ChangeFlowFile> files;
/**
* 变更潜在风险
* 变更潜在风险描述
*/
@NotBlank(message = "变更潜在风险描述不能为空")
private String changeRiskDesc;
/**
......
......@@ -6,8 +6,6 @@
*/
package com.netease.mail.yanxuan.change.web.controller;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -22,8 +20,9 @@ import com.netease.mail.yanxuan.change.biz.biz.ChangeFlowBiz;
import com.netease.mail.yanxuan.change.biz.config.TitleConfig;
import com.netease.mail.yanxuan.change.common.bean.AjaxResult;
import com.netease.mail.yanxuan.change.biz.service.ChangeFlowService;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowCancelReq;
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.ChangeFlowSubmitReq;
import lombok.extern.slf4j.Slf4j;
......@@ -71,7 +70,7 @@ public class ChangeFlowController {
}
/**
* 发起变更,自动跳转到第一个节点
* 发起变更,如果发起人=审核人,自动跳转到第一个节点
* @return
*/
@PostMapping("/create")
......@@ -85,8 +84,8 @@ public class ChangeFlowController {
* @return
*/
@PostMapping("/submit")
public AjaxResult<String> submit(@RequestBody @Valid ChangeFlowReq changeFlowReq) {
return AjaxResult.success(changeFlowBiz.submit(changeFlowReq));
public AjaxResult<String> submit(@RequestBody @Valid ChangeFlowSubmitReq changeFlowSubmitReq) {
return AjaxResult.success(changeFlowBiz.submit(changeFlowSubmitReq));
}
/**
......@@ -103,9 +102,8 @@ public class ChangeFlowController {
* @return
*/
@GetMapping("/cancel")
public AjaxResult<Void> cancel() {
return AjaxResult.success();
public AjaxResult<Boolean> cancel(@RequestBody @Valid ChangeFlowCancelReq changeFlowCancelReq) {
return AjaxResult.success(changeFlowBiz.cancel(changeFlowCancelReq));
}
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment