Commit 5e45ca3d by 王志超

feat: 子工单分批流转逻辑处理

parent 479f9a08
......@@ -721,6 +721,33 @@ public class ChangeFlowBiz {
log.info("[NEW_CHANGE_FLOW_CONFIRM_EXEC_PLAN] 主工单流转成功,flowId:{}, nextNodeId:{}",
flowId, ownerApproveNodeId);
return ownerApproveNodeId;
case NEW_CHANGE_FLOW_OWNER_APPROVE:
case NEW_CHANGE_FLOW_ADMIN_APPROVE:
case NEW_CHANGE_FLOW_QUALITY_APPROVE:
// 部门负责人、质量部负责人、变更管理员审批节点:检查所有子单是否都已审批通过
return null;
case NEW_CHANGE_FLOW_EXE:
// todo:
// 这些节点检查所有子单是否都已完成(FINISHED或CANCELLED)
if (!checkAllSubFlowsFinishedForMainFlow(changeRecord.getId())) {
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST,
"存在子单未完成,无法提交主工单");
}
// 所有子单都已完成,提交主工单到下一节点
String mainFlowNextNodeId = flowService.submitFlow(flowId.toString(), flowDataDTO, uid,
ChangeFlowEnum.NEW_CHANGE_FLOW.getTopoId(), JSON.toJSONString(content), true,
FlowxOperationEnum.SUBMIT.getName(), "所有子单已完成,主工单流转", changeRecord.getCreateTime());
changeRecord.setFlowNode(mainFlowNextNodeId);
changeRecord.setUpdateTime(DateUtils.getCurrentTime());
changeFlowService.updateRecord(changeRecord);
log.info("[NEW_CHANGE_FLOW] 主工单流转成功,flowId:{}, node:{}, nextNodeId:{}",
flowId, node, mainFlowNextNodeId);
return mainFlowNextNodeId;
case NEW_CHANGE_FLOW_CONFIRM:
// todo:
return null;
case CHANGE_FLOW_CONFIRM:
Integer changeResult = changeFlowSubmitReq.getChangeResult();
ChangeResultEnum changeResultStatus = ChangeResultEnum.getByStatus(changeResult);
......@@ -1732,4 +1759,25 @@ public class ChangeFlowBiz {
);
}
/**
* 检查主工单下所有子单是否都已完成(供主工单流转时调用)
* 条件:status = FINISHED 或 CANCELLED
*
* @param changeRecordId 主工单ID
* @return true 表示所有子单都已完成
*/
public boolean checkAllSubFlowsFinishedForMainFlow(Long changeRecordId) {
// 查询该主工单下所有子单
List<ChangeSubFlowRecord> allSubFlows = changeSubFlowRecordMapper.selectByChangeRecordId(changeRecordId);
if (CollectionUtils.isEmpty(allSubFlows)) {
return false;
}
// 检查是否所有子单都满足条件:状态是 FINISHED 或 CANCELLED
return allSubFlows.stream().allMatch(subFlow ->
ChangeSubFlowStatusEnum.FINISHED.getStatus().equals(subFlow.getStatus())
|| ChangeSubFlowStatusEnum.CANCELLED.getStatus().equals(subFlow.getStatus())
);
}
}
package com.netease.mail.yanxuan.change.biz.service;
import java.util.List;
import com.netease.mail.yanxuan.change.common.enums.FileTypeEnum;
import com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowFile;
/**
* 子单文件服务
*/
public interface ChangeSubFlowFileService {
/**
* 保存文件
*/
void saveRecord(ChangeSubFlowFile file);
/**
* 批量保存文件
*/
void batchSaveRecord(List<ChangeSubFlowFile> files);
/**
* 根据子单记录ID查询文件列表
*/
List<ChangeSubFlowFile> getFileList(Long subFlowRecordId);
/**
* 根据子单记录ID删除文件
*/
Integer deleteBySubFlowRecordId(Long subFlowRecordId);
/**
* 根据子单记录ID和文件类型删除文件
*/
void deleteBySubFlowRecordIdAndType(Long subFlowRecordId, FileTypeEnum type);
}
package com.netease.mail.yanxuan.change.biz.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.netease.mail.yanxuan.change.biz.service.ChangeSubFlowFileService;
import com.netease.mail.yanxuan.change.common.enums.FileTypeEnum;
import com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowFile;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeSubFlowFileMapper;
/**
* 子单文件服务实现
*/
@Service
public class ChangeSubFlowFileServiceImpl implements ChangeSubFlowFileService {
@Autowired
private ChangeSubFlowFileMapper changeSubFlowFileMapper;
@Override
public void saveRecord(ChangeSubFlowFile file) {
changeSubFlowFileMapper.insertSelective(file);
}
@Override
public void batchSaveRecord(List<ChangeSubFlowFile> files) {
changeSubFlowFileMapper.insertList(files);
}
@Override
public List<ChangeSubFlowFile> getFileList(Long subFlowRecordId) {
return changeSubFlowFileMapper.selectBySubFlowRecordId(subFlowRecordId);
}
@Override
public Integer deleteBySubFlowRecordId(Long subFlowRecordId) {
return changeSubFlowFileMapper.deleteBySubFlowRecordId(subFlowRecordId);
}
@Override
public void deleteBySubFlowRecordIdAndType(Long subFlowRecordId, FileTypeEnum type) {
changeSubFlowFileMapper.deleteBySubFlowRecordIdAndType(subFlowRecordId, type.getType());
}
}
package com.netease.mail.yanxuan.change.dal.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 子单文件实体
*/
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
@Entity
@Table(name = "TB_YX_QC_CHANGE_SUB_FLOW_FILE")
public class ChangeSubFlowFile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 子单记录ID
*/
private Long subFlowRecordId;
/**
* 文件名
*/
private String fileName;
/**
* 文件URL
*/
private String fileUrl;
/**
* 文件类型
* @see com.netease.mail.yanxuan.change.common.enums.FileTypeEnum
*/
private Integer fileType;
/**
* 创建时间
*/
private Long createTime;
/**
* 更新时间
*/
private Long updateTime;
}
......@@ -89,6 +89,27 @@ public class ChangeSubFlowRecord {
private String rejectReason;
/**
* 变更结论(提交执行结果时填写)
* @see com.netease.mail.yanxuan.change.common.enums.ChangeResultEnum
*/
private Integer changeResult;
/**
* 备注
*/
private String remark;
/**
* 取消原因
*/
private String cancelReason;
/**
* 变更确认结果时间(延期时使用)
*/
private Long changeConfirmResultTime;
/**
* 创建时间
*/
private Long createTime;
......
package com.netease.mail.yanxuan.change.dal.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowFile;
/**
* 子单文件 Mapper
*/
@Mapper
public interface ChangeSubFlowFileMapper extends tk.mybatis.mapper.common.Mapper<ChangeSubFlowFile> {
/**
* 根据子单记录ID查询文件列表
*/
@Select("SELECT * FROM TB_YX_QC_CHANGE_SUB_FLOW_FILE WHERE sub_flow_record_id = #{subFlowRecordId}")
List<ChangeSubFlowFile> selectBySubFlowRecordId(@Param("subFlowRecordId") Long subFlowRecordId);
/**
* 批量插入文件
*/
@Insert({ "<script>",
"insert into TB_YX_QC_CHANGE_SUB_FLOW_FILE(sub_flow_record_id, file_type, file_name, file_url, create_time, update_time) values ",
"<foreach collection='list' item='item' index='index' separator=','>",
"(#{item.subFlowRecordId}, #{item.fileType}, #{item.fileName}, #{item.fileUrl}, #{item.createTime}, #{item.updateTime})",
"</foreach>", "</script>" })
void insertList(List<ChangeSubFlowFile> files);
/**
* 根据子单记录ID删除文件
*/
@Delete("delete from TB_YX_QC_CHANGE_SUB_FLOW_FILE where sub_flow_record_id = #{subFlowRecordId}")
Integer deleteBySubFlowRecordId(@Param("subFlowRecordId") Long subFlowRecordId);
/**
* 根据子单记录ID和文件类型删除文件
*/
@Delete("delete from TB_YX_QC_CHANGE_SUB_FLOW_FILE where sub_flow_record_id = #{subFlowRecordId} and file_type = #{type}")
void deleteBySubFlowRecordIdAndType(@Param("subFlowRecordId") Long subFlowRecordId, @Param("type") Integer type);
}
......@@ -55,5 +55,31 @@ public class ChangeSubFlowSubmitReq {
* 拒绝原因(审批不通过时必填)
*/
private String rejectReason;
/**
* 变更结论(提交执行结果时使用)
* @see com.netease.mail.yanxuan.change.common.enums.ChangeResultEnum
*/
private Integer changeResult;
/**
* 备注
*/
private String remark;
/**
* 取消原因(变更结论为取消时必填)
*/
private String cancelReason;
/**
* 变更确认结果时间(延期时必填)
*/
private Long changeConfirmResultTime;
/**
* 变更结果文件列表
*/
private List<ChangeFlowFile> changeResultFiles;
}
......@@ -13,12 +13,16 @@
<result column="change_commander" jdbcType="VARCHAR" property="changeCommander" />
<result column="change_plan_approved" jdbcType="TINYINT" property="changePlanApproved" />
<result column="reject_reason" jdbcType="VARCHAR" property="rejectReason" />
<result column="change_result" jdbcType="INTEGER" property="changeResult" />
<result column="remark" jdbcType="VARCHAR" property="remark" />
<result column="cancel_reason" jdbcType="VARCHAR" property="cancelReason" />
<result column="change_confirm_result_time" jdbcType="BIGINT" property="changeConfirmResultTime" />
<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, status, approver, change_exec_user_email, change_exec_department, change_commander, change_plan_approved, reject_reason, create_time, update_time
id, change_record_id, sub_flow_id, sub_flow_node, status, approver, change_exec_user_email, change_exec_department, change_commander, change_plan_approved, reject_reason, change_result, remark, cancel_reason, change_confirm_result_time, create_time, update_time
</sql>
<select id="selectByCondition" resultMap="BaseResultMap" parameterType="com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowListQueryReq">
......
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