Commit f2eaa556 by 王志超

feat: 变更行动工单列表

parent c2113b8c
......@@ -3,8 +3,12 @@ package com.netease.mail.yanxuan.change.biz.biz;
import com.alibaba.fastjson.JSON;
import com.netease.mail.yanxuan.change.biz.meta.exception.ExceptionFactory;
import com.netease.mail.yanxuan.change.biz.service.ChangeFlowExecService;
import com.netease.mail.yanxuan.change.biz.service.ChangeFlowService;
import com.netease.mail.yanxuan.change.biz.service.ChangeSubFlowRecordService;
import com.netease.mail.yanxuan.change.biz.service.ChangeSubFlowService;
import com.netease.mail.yanxuan.change.biz.service.rpc.FlowService;
import com.netease.mail.yanxuan.change.biz.service.rpc.IusService;
import com.netease.mail.yanxuan.change.integration.flow.ius.IusRpcService;
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;
......@@ -13,22 +17,32 @@ 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.util.DateUtils;
import com.netease.mail.yanxuan.change.dal.entity.ChangeExecRecord;
import com.netease.mail.yanxuan.change.dal.entity.ChangeRecord;
import com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowRecord;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeSubFlowRecordMapper;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowCreateReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowListQueryReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowSubmitReq;
import com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowExecVO;
import com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowVO;
import com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeSubFlowListVO;
import com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeSubFlowVO;
import com.netease.mail.yanxuan.change.dal.meta.model.vo.PageVO;
import com.netease.mail.yanxuan.change.integration.flow.UserQueryDTO;
import com.netease.mail.yanxuan.change.integration.flow.ius.rsp.IusUserInfoRsp;
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 lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import javax.validation.Valid;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.*;
import java.util.stream.Collectors;
@Component
@Slf4j
......@@ -43,6 +57,24 @@ public class ChangeSubFlowBiz {
@Autowired
private ChangeFlowExecService changeFlowExecService;
@Autowired
private ChangeFlowService changeFlowService;
@Autowired
private ChangeSubFlowRecordService changeSubFlowRecordService;
@Autowired
private ChangeSubFlowRecordMapper changeSubFlowRecordMapper;
@Autowired
private ChangeFlowBiz changeFlowBiz;
@Autowired
private IusRpcService iusRpcService;
@Autowired
private IusService iusService;
public String createAndSubmit(@Valid ChangeSubFlowCreateReq changeSubFlowCreateReq) {
String uid = RequestLocalBean.getUid();
......@@ -203,4 +235,366 @@ public class ChangeSubFlowBiz {
String.format("当前节点[%s]与预期节点[%s]不匹配", currentNode, expectedNodes));
}
}
/**
* 根据变更行动工单ID查询详情
* 说明:展示内容和主单的detail一样,但行动项只展示该变更行动工单下绑定的行动项
*
* @param subFlowId 变更行动工单ID(即topo)
* @return 变更工单详情
*/
public ChangeFlowVO detailBySubFlowId(String subFlowId) {
if (StringUtils.isBlank(subFlowId)) {
throw ExceptionFactory.createBiz(ResponseCode.ERROR_FLOW_ID, "变更行动工单ID不能为空");
}
// 根据 subFlowId 查询变更行动工单记录
ChangeSubFlowRecord subFlowRecord = changeSubFlowRecordService.getBySubFlowId(subFlowId);
if (subFlowRecord == null) {
throw ExceptionFactory.createBiz(ResponseCode.ERROR_FLOW_ID, "变更行动工单不存在");
}
Long changeRecordId = subFlowRecord.getChangeRecordId();
Long subFlowRecordId = subFlowRecord.getId();
// 获取主单信息
ChangeRecord changeRecord = changeFlowService.getById(changeRecordId);
if (changeRecord == null) {
throw ExceptionFactory.createBiz(ResponseCode.ERROR_FLOW_ID, "主单记录不存在");
}
// 调用主单的 detail 方法获取完整信息
ChangeFlowVO changeFlowVO = changeFlowBiz.detail(changeRecord.getFlowId());
// 只保留该变更行动工单下绑定的行动项
List<ChangeExecRecord> execRecords = changeFlowExecService.getBySubFlowRecordId(subFlowRecordId);
if (CollectionUtils.isNotEmpty(execRecords)) {
// 转换为 ChangeFlowExecVO
List<ChangeFlowExecVO> filteredExecList = execRecords.stream()
.map(c -> ChangeFlowExecVO.builder()
.changeExecId(c.getId())
.changeRecordId(c.getChangeRecordId())
.changeExecDepartment(c.getChangeExecDepartment())
.changeExecUserType(c.getChangeExecUserType())
.changeExecUser(c.getChangeExecUser())
.changeExecUserEmail(c.getChangeExecUserEmail())
.changeRiskDesc(c.getChangeRiskDesc())
.changeExecProject(c.getChangeExecProject())
.changeChecking(c.getChangeChecking())
.changeExecFinishTime(c.getChangeExecFinishTime())
.changeExecFinishDesc(c.getChangeExecFinishDesc())
.subFlowId(c.getSubFlowId())
.subFlowNode(c.getSubFlowNode())
.build())
.collect(Collectors.toList());
// 填充用户名信息
try {
Set<String> userEmail = filteredExecList.stream()
.map(ChangeFlowExecVO::getChangeExecUserEmail)
.collect(Collectors.toSet());
AjaxResponse<List<IusUserInfoRsp>> userListInfo = iusRpcService.queryUserListInfo(
UserQueryDTO.builder().uids(new ArrayList<>(userEmail)).build());
List<IusUserInfoRsp> data = userListInfo.getData();
filteredExecList.forEach(i -> {
Optional<IusUserInfoRsp> anyExeUser = data.stream()
.filter(u -> u.getUid().equals(i.getChangeExecUserEmail()))
.findAny();
if (anyExeUser.isPresent()) {
i.setChangeExecUserName(anyExeUser.get().getName());
} else {
// 批量查询没查到的人名,通过全量查询单独再查一次
IusUserInfoRsp user = iusService.queryUserInfo(i.getChangeExecUserEmail());
if (user != null && StringUtils.isNotBlank(user.getName())) {
i.setChangeExecUserName(user.getName());
}
}
});
} catch (Exception ex) {
log.error("query user info has ex", ex);
}
changeFlowVO.setChangeExecProjectList(filteredExecList);
} else {
changeFlowVO.setChangeExecProjectList(new ArrayList<>());
}
return changeFlowVO;
}
/**
* 查询变更行动工单列表
*
* @param page 页码
* @param pageSize 每页大小
* @param queryReq 查询条件
* @return 变更行动工单列表
*/
public ChangeSubFlowListVO querySubFlowList(Integer page, Integer pageSize, ChangeSubFlowListQueryReq queryReq) {
log.info("[querySubFlowList] page:{}, pageSize:{}, queryReq:{}", page, pageSize, JSON.toJSONString(queryReq));
// 数据可见范围:仅查看我跟进的工单(默认true)
final String currentUser;
if (queryReq.getOnlyMyFollowed()) {
String uid = RequestLocalBean.getUid();
if (StringUtils.isNotBlank(uid)) {
currentUser = uid;
queryReq.setCurrentUser(currentUser);
log.info("[querySubFlowList] 数据可见范围:仅查看我跟进的工单, currentUser:{}", currentUser);
} else {
currentUser = null;
}
} else {
currentUser = null;
}
// 先查询所有符合条件的变更行动工单(不进行分页,因为需要在内存中过滤)
List<ChangeSubFlowRecord> allSubFlowRecords = changeSubFlowRecordMapper.selectByCondition(queryReq);
if (CollectionUtils.isEmpty(allSubFlowRecords)) {
PageVO pageVO = buildPageVo(0L, pageSize, page);
ChangeSubFlowListVO result = new ChangeSubFlowListVO();
result.setPageVo(pageVO);
result.setChangeSubFlowList(new ArrayList<>());
return result;
}
// 批量获取主单信息
List<Long> changeRecordIds = allSubFlowRecords.stream()
.map(ChangeSubFlowRecord::getChangeRecordId)
.distinct()
.collect(Collectors.toList());
final Map<Long, ChangeRecord> changeRecordMap;
if (CollectionUtils.isNotEmpty(changeRecordIds)) {
List<ChangeRecord> changeRecords = changeRecordIds.stream()
.map(changeFlowService::getById)
.filter(Objects::nonNull)
.collect(Collectors.toList());
changeRecordMap = changeRecords.stream()
.collect(Collectors.toMap(ChangeRecord::getId, r -> r));
} else {
changeRecordMap = new HashMap<>();
}
// 批量获取行动项信息(用于获取行动人、部门、完成时间等)
List<Long> subFlowRecordIds = allSubFlowRecords.stream()
.map(ChangeSubFlowRecord::getId)
.collect(Collectors.toList());
Map<Long, List<ChangeExecRecord>> execRecordMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(subFlowRecordIds)) {
for (Long subFlowRecordId : subFlowRecordIds) {
List<ChangeExecRecord> execRecords = changeFlowExecService.getBySubFlowRecordId(subFlowRecordId);
if (CollectionUtils.isNotEmpty(execRecords)) {
execRecordMap.put(subFlowRecordId, execRecords);
}
}
}
// 在内存中过滤
List<ChangeSubFlowRecord> filteredSubFlowRecords = allSubFlowRecords.stream()
.filter(subFlowRecord -> {
// 过滤 flowId
if (queryReq.getFlowId() != null) {
ChangeRecord changeRecord = changeRecordMap.get(subFlowRecord.getChangeRecordId());
if (changeRecord == null || !queryReq.getFlowId().equals(changeRecord.getFlowId())) {
return false;
}
}
// 过滤 itemId
if (StringUtils.isNotBlank(queryReq.getItemId())) {
ChangeRecord changeRecord = changeRecordMap.get(subFlowRecord.getChangeRecordId());
if (changeRecord == null || StringUtils.isBlank(changeRecord.getChangeItem())
|| !changeRecord.getChangeItem().contains(queryReq.getItemId())) {
return false;
}
}
// 过滤 supplier
if (StringUtils.isNotBlank(queryReq.getSupplier())) {
ChangeRecord changeRecord = changeRecordMap.get(subFlowRecord.getChangeRecordId());
if (changeRecord == null || !queryReq.getSupplier().equals(changeRecord.getChangeSupplier())) {
return false;
}
}
// 过滤 changeExecUser
if (StringUtils.isNotBlank(queryReq.getChangeExecUser())) {
List<ChangeExecRecord> execRecords = execRecordMap.get(subFlowRecord.getId());
if (CollectionUtils.isEmpty(execRecords)) {
return false;
}
boolean matched = execRecords.stream().anyMatch(exec ->
(StringUtils.isNotBlank(exec.getChangeExecUserEmail())
&& exec.getChangeExecUserEmail().contains(queryReq.getChangeExecUser()))
|| (StringUtils.isNotBlank(exec.getChangeExecUser())
&& exec.getChangeExecUser().contains(queryReq.getChangeExecUser())));
if (!matched) {
return false;
}
}
// 过滤 changeExecDepartment
if (StringUtils.isNotBlank(queryReq.getChangeExecDepartment())) {
List<ChangeExecRecord> execRecords = execRecordMap.get(subFlowRecord.getId());
if (CollectionUtils.isEmpty(execRecords)) {
return false;
}
boolean matched = execRecords.stream().anyMatch(exec ->
queryReq.getChangeExecDepartment().equals(exec.getChangeExecDepartment()));
if (!matched) {
return false;
}
}
// 过滤 onlyMyFollowed
if (queryReq.getOnlyMyFollowed() && currentUser != null && StringUtils.isNotBlank(currentUser)) {
ChangeRecord changeRecord = changeRecordMap.get(subFlowRecord.getChangeRecordId());
boolean matched = false;
// 检查主单的 creator, changeCommander, approver
if (changeRecord != null) {
if (currentUser.equals(changeRecord.getCreator())
|| currentUser.equals(changeRecord.getChangeCommander())) {
matched = true;
} else if (StringUtils.isNotBlank(changeRecord.getApprover())
&& changeRecord.getApprover().contains("\"" + currentUser + "\"")) {
matched = true;
}
}
// 检查行动工单的 approver
if (!matched && StringUtils.isNotBlank(subFlowRecord.getApprover())
&& subFlowRecord.getApprover().contains("\"" + currentUser + "\"")) {
matched = true;
}
// 检查行动项的 changeExecUserEmail
if (!matched) {
List<ChangeExecRecord> execRecords = execRecordMap.get(subFlowRecord.getId());
if (CollectionUtils.isNotEmpty(execRecords)) {
matched = execRecords.stream().anyMatch(exec ->
currentUser.equals(exec.getChangeExecUserEmail()));
}
}
if (!matched) {
return false;
}
}
return true;
})
.collect(Collectors.toList());
// 手动分页
long total = filteredSubFlowRecords.size();
int start = (page - 1) * pageSize;
int end = Math.min(start + pageSize, filteredSubFlowRecords.size());
List<ChangeSubFlowRecord> pagedSubFlowRecords = start < end
? filteredSubFlowRecords.subList(start, end)
: new ArrayList<>();
List<ChangeSubFlowVO> list = new ArrayList<>();
if (CollectionUtils.isNotEmpty(pagedSubFlowRecords)) {
// 构建返回列表
for (ChangeSubFlowRecord subFlowRecord : pagedSubFlowRecords) {
ChangeSubFlowVO vo = new ChangeSubFlowVO();
vo.setSubFlowId(subFlowRecord.getSubFlowId());
vo.setSubFlowNode(subFlowRecord.getSubFlowNode());
vo.setCreateTime(subFlowRecord.getCreateTime());
// 获取主单信息
ChangeRecord changeRecord = changeRecordMap.get(subFlowRecord.getChangeRecordId());
if (changeRecord != null) {
vo.setFlowId(changeRecord.getFlowId());
}
// 获取行动项信息(取第一个行动项的信息作为展示)
List<ChangeExecRecord> execRecords = execRecordMap.get(subFlowRecord.getId());
if (CollectionUtils.isNotEmpty(execRecords)) {
ChangeExecRecord firstExec = execRecords.get(0);
vo.setChangeExecUserEmail(firstExec.getChangeExecUserEmail());
vo.setChangeExecDepartment(firstExec.getChangeExecDepartment());
// 完成时间:如果有完成时间则使用,否则使用预期完成时间(从主单获取)
if (firstExec.getChangeExecFinishTime() != null) {
vo.setChangeExecFinishTime(firstExec.getChangeExecFinishTime());
} else if (changeRecord != null) {
vo.setChangeExecFinishTime(changeRecord.getChangeConfirmResultTime());
}
}
list.add(vo);
}
// 批量查询用户名信息
try {
Set<String> userEmails = list.stream()
.map(ChangeSubFlowVO::getChangeExecUserEmail)
.filter(StringUtils::isNotBlank)
.collect(Collectors.toSet());
if (CollectionUtils.isNotEmpty(userEmails)) {
AjaxResponse<List<IusUserInfoRsp>> userListInfo = iusRpcService.queryUserListInfo(
UserQueryDTO.builder().uids(new ArrayList<>(userEmails)).build());
List<IusUserInfoRsp> userData = userListInfo.getData();
Map<String, String> userNameMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(userData)) {
userNameMap = userData.stream()
.collect(Collectors.toMap(IusUserInfoRsp::getUid, IusUserInfoRsp::getName));
}
// 填充用户名和展示信息
for (ChangeSubFlowVO vo : list) {
String email = vo.getChangeExecUserEmail();
if (StringUtils.isNotBlank(email)) {
String name = userNameMap.get(email);
if (StringUtils.isBlank(name)) {
// 批量查询没查到的人名,通过全量查询单独再查一次
IusUserInfoRsp user = iusService.queryUserInfo(email);
if (user != null && StringUtils.isNotBlank(user.getName())) {
name = user.getName();
}
}
vo.setChangeExecUserName(name);
// 构建展示信息:姓名+邮箱
if (StringUtils.isNotBlank(name)) {
vo.setChangeExecUserView(name + "(" + email + ")");
} else {
vo.setChangeExecUserView(email);
}
}
}
}
} catch (Exception ex) {
log.error("query user info has ex", ex);
}
}
PageVO pageVO = buildPageVo(total, pageSize, page);
ChangeSubFlowListVO result = new ChangeSubFlowListVO();
result.setPageVo(pageVO);
result.setChangeSubFlowList(list);
return result;
}
/**
* 构建分页信息
*
* @param total 总记录数
* @param pageSize 每页大小
* @param page 当前页码
* @return 分页信息
*/
private PageVO buildPageVo(Long total, Integer pageSize, Integer page) {
Integer totalCount = Math.toIntExact(total);
int totalPage;
int i = totalCount % pageSize;
if (i != 0) {
totalPage = totalCount / pageSize + 1;
} else {
totalPage = totalCount / pageSize;
}
return PageVO.builder().page(page).totalPage(totalPage).pageSize(pageSize).pageCount(pageSize)
.totalCount(totalCount).build();
}
}
......@@ -4,6 +4,9 @@ import com.netease.mail.yanxuan.change.dal.entity.ChangeExecRecord;
import java.util.List;
/**
* @author TmindA
*/
public interface ChangeSubFlowService {
/**
......
......@@ -8,6 +8,9 @@ import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author TmindA
*/
@Service
public class ChangeSubFlowServiceImpl implements ChangeSubFlowService {
......
......@@ -51,5 +51,12 @@ public interface ChangeSubFlowRecordMapper extends tk.mybatis.mapper.common.Mapp
"</script>")
List<ChangeSubFlowRecord> selectByChangeRecordIds(@Param("changeRecordIds") List<Long> changeRecordIds);
/**
* 根据条件查询变更行动工单列表
* @param queryReq 查询条件
* @return 变更行动工单列表
*/
List<ChangeSubFlowRecord> selectByCondition(com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowListQueryReq queryReq);
}
/**
* @(#)ChangeSubFlowListQueryReq.java, 2024/01/01.
* <p/>
* Copyright 2024 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 lombok.Data;
import java.util.List;
/**
* 变更行动工单列表查询请求
*
* @Author system
* @Date 2024/01/01
*/
@Data
public class ChangeSubFlowListQueryReq {
/**
* 变更工单ID(主单flowId)
*/
private Long flowId;
/**
* 变更行动工单ID(subFlowId)
*/
private String subFlowId;
/**
* 商品ID
*/
private String itemId;
/**
* 供应商
*/
private String supplier;
/**
* 变更行动人(姓名或邮箱)
*/
private String changeExecUser;
/**
* 变更行动部门
*/
private String changeExecDepartment;
/**
* 行动工单状态(subFlowNode)
*/
private String subFlowNode;
/**
* 开始时间(行动工单发起时间)
*/
private Long startTime;
/**
* 结束时间(行动工单发起时间)
*/
private Long endTime;
/**
* 数据可见范围:仅查看我跟进的工单(默认true)
* true: 仅展示当前用户相关的变更行动工单
* false: 展示所有变更行动工单
*/
private Boolean onlyMyFollowed;
/**
* 当前用户邮箱(用于数据可见范围过滤)
*/
private String currentUser;
/**
* 变更记录ID列表(用于过滤)
*/
private List<Long> changeRecordIds;
}
/**
* @(#)ChangeSubFlowListVO.java, 2024/01/01.
* <p/>
* Copyright 2024 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.dal.meta.model.vo;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 变更行动工单列表VO
*
* @Author system
* @Date 2024/01/01
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ChangeSubFlowListVO {
/**
* 分页信息
*/
private PageVO pageVo;
/**
* 变更行动工单列表
*/
private List<ChangeSubFlowVO> changeSubFlowList;
}
/**
* @(#)ChangeSubFlowVO.java, 2024/01/01.
* <p/>
* Copyright 2024 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.netease.mail.yanxuan.change.dal.meta.model.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 变更行动工单VO
*
* @Author system
* @Date 2024/01/01
*/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ChangeSubFlowVO {
/**
* 变更行动ID(subFlowId)
*/
private String subFlowId;
/**
* 变更ID(主单的flowId)
*/
private Long flowId;
/**
* 变更行动人邮箱
*/
private String changeExecUserEmail;
/**
* 变更行动人姓名
*/
private String changeExecUserName;
/**
* 变更行动人(姓名+邮箱)
*/
private String changeExecUserView;
/**
* 变更行动部门
*/
private String changeExecDepartment;
/**
* 行动工单状态(subFlowNode)
*/
private String subFlowNode;
/**
* 行动完成时间(变更行动工单的完成时间,或预期完成时间)
*/
private Long changeExecFinishTime;
/**
* 创建时间(行动工单发起时间)
*/
private Long createTime;
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.netease.mail.yanxuan.change.dal.mapper.ChangeSubFlowRecordMapper">
<resultMap id="BaseResultMap" type="com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowRecord">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="change_record_id" jdbcType="BIGINT" property="changeRecordId" />
<result column="sub_flow_id" jdbcType="VARCHAR" property="subFlowId" />
<result column="sub_flow_node" jdbcType="VARCHAR" property="subFlowNode" />
<result column="approver" jdbcType="VARCHAR" property="approver" />
<result column="create_time" jdbcType="BIGINT" property="createTime" />
<result column="update_time" jdbcType="BIGINT" property="updateTime" />
</resultMap>
<sql id="Base_Column_List">
id, change_record_id, sub_flow_id, sub_flow_node, approver, create_time, update_time
</sql>
<select id="selectByCondition" resultMap="BaseResultMap" parameterType="com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowListQueryReq">
SELECT <include refid="Base_Column_List" />
FROM TB_YX_QC_CHANGE_SUB_FLOW_RECORD
<where>
<if test="subFlowId != null and subFlowId != ''">
and sub_flow_id = #{subFlowId}
</if>
<if test="subFlowNode != null and subFlowNode != ''">
and sub_flow_node = #{subFlowNode}
</if>
<if test="startTime != null">
and create_time >= #{startTime}
</if>
<if test="endTime != null">
and create_time <![CDATA[ <= ]]> #{endTime}
</if>
<if test="changeRecordIds != null and changeRecordIds.size() > 0">
and change_record_id in
<foreach collection="changeRecordIds" close=")" open="(" item="item" separator=",">
#{item}
</foreach>
</if>
</where>
order by create_time desc
</select>
</mapper>
......@@ -10,7 +10,10 @@ import com.netease.mail.yanxuan.change.biz.biz.ChangeSubFlowBiz;
import com.netease.mail.yanxuan.change.common.bean.AjaxResult;
import com.netease.mail.yanxuan.change.dal.entity.ChangeExecRecord;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowCreateReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowListQueryReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowSubmitReq;
import com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowVO;
import com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeSubFlowListVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -52,6 +55,62 @@ public class ChangeSubFlowController {
}
/**
* 变更行动工单列表查询
*
* @param page 页码
* @param pageSize 每页大小
* @param flowId 变更工单ID(主单flowId)
* @param subFlowId 变更行动工单ID
* @param itemId 商品ID
* @param supplier 供应商
* @param changeExecUser 变更行动人(姓名或邮箱)
* @param changeExecDepartment 变更行动部门
* @param subFlowNode 行动工单状态
* @param startTime 开始时间(行动工单发起时间)
* @param endTime 结束时间(行动工单发起时间)
* @param onlyMyFollowed 数据可见范围:仅查看我跟进的工单(默认true)
* @return 变更行动工单列表
*/
@GetMapping("/page")
public AjaxResult<ChangeSubFlowListVO> page(@RequestParam(name = "page", defaultValue = "1") Integer page,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
@RequestParam(name = "flowId", required = false) Long flowId,
@RequestParam(name = "subFlowId", required = false) String subFlowId,
@RequestParam(name = "itemId", required = false) String itemId,
@RequestParam(name = "supplier", required = false) String supplier,
@RequestParam(name = "changeExecUser", required = false) String changeExecUser,
@RequestParam(name = "changeExecDepartment", required = false) String changeExecDepartment,
@RequestParam(name = "subFlowNode", required = false) String subFlowNode,
@RequestParam(name = "startTime", required = false) Long startTime,
@RequestParam(name = "endTime", required = false) Long endTime,
@RequestParam(name = "onlyMyFollowed", defaultValue = "true") Boolean onlyMyFollowed) {
ChangeSubFlowListQueryReq queryReq = new ChangeSubFlowListQueryReq();
queryReq.setFlowId(flowId);
queryReq.setSubFlowId(subFlowId);
queryReq.setItemId(itemId);
queryReq.setSupplier(supplier);
queryReq.setChangeExecUser(changeExecUser);
queryReq.setChangeExecDepartment(changeExecDepartment);
queryReq.setSubFlowNode(subFlowNode);
queryReq.setStartTime(startTime);
queryReq.setEndTime(endTime);
queryReq.setOnlyMyFollowed(onlyMyFollowed);
return AjaxResult.success(changeSubFlowBiz.querySubFlowList(page, pageSize, queryReq));
}
/**
* 变更行动工单详情查询
* 说明:展示内容和主单的detail一样,但行动项只展示该变更行动工单下绑定的行动项
*
* @param subFlowId 变更行动工单ID(即topo)
* @return 变更工单详情
*/
@GetMapping("/detail")
public AjaxResult<ChangeFlowVO> detail(@RequestParam String subFlowId) {
return AjaxResult.success(changeSubFlowBiz.detailBySubFlowId(subFlowId));
}
/**
* 子流程提交
*
* @return
......
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