drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdPatrolTaskController.java
@@ -173,7 +173,7 @@ @ApiOperationSupport(order = 10) @ApiOperation(value = "审核巡查任务", notes = "传入审核参数,拒绝时必须填写拒绝原因") public R audit(@Valid @RequestBody GdPatrolTaskAuditParam auditParam) { boolean result = gdPatrolTaskService.auditPatrolTask(auditParam.getId(), auditParam.getAuditStatus(), auditParam.getRejectReason()); boolean result = gdPatrolTaskService.auditPatrolTask(auditParam); return R.status(result); } drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/controller/GdWorkOrderFlowController.java
@@ -1,19 +1,3 @@ /* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package org.sxkj.gd.workorder.controller; import io.swagger.annotations.Api; @@ -70,26 +54,26 @@ return R.data(GdWorkOrderFlowWrapper.build().entityVO(detail)); } /** * 流程记录表 分页 * 流程记录表 列表 */ // @GetMapping("/list") // @ApiOperationSupport(order = 2) // @ApiOperation(value = "分页", notes = "传入gdWorkOrderFlow") // public R<IPage<GdWorkOrderFlowVO>> list(@ApiIgnore @RequestParam Map<String, Object> gdWorkOrderFlow, Query query) { // IPage<GdWorkOrderFlowEntity> pages = gdWorkOrderFlowService.page(Condition.getPage(query), Condition.getQueryWrapper(gdWorkOrderFlow, GdWorkOrderFlowEntity.class)); // return R.data(GdWorkOrderFlowWrapper.build().pageVO(pages)); // } @GetMapping("/list") @ApiOperationSupport(order = 2) @ApiOperation(value = "列表", notes = "传入gdWorkOrderFlow") public R<List<GdWorkOrderFlowVO>> list(@ApiIgnore @RequestParam Map<String, Object> gdWorkOrderFlow) { List<GdWorkOrderFlowEntity> list = gdWorkOrderFlowService.list(Condition.getQueryWrapper(gdWorkOrderFlow, GdWorkOrderFlowEntity.class)); return R.data(GdWorkOrderFlowWrapper.build().entityVOList(list)); } /** * 流程记录表 自定义分页 */ @GetMapping("/page") @ApiOperationSupport(order = 3) @ApiOperation(value = "分页", notes = "传入gdWorkOrderFlow") public R<IPage<GdWorkOrderFlowVO>> page(GdWorkOrderFlowVO gdWorkOrderFlow, Query query) { IPage<GdWorkOrderFlowVO> pages = gdWorkOrderFlowService.selectGdWorkOrderFlowPage(Condition.getPage(query), gdWorkOrderFlow); return R.data(pages); } // @GetMapping("/page") // @ApiOperationSupport(order = 3) // @ApiOperation(value = "分页", notes = "传入gdWorkOrderFlow") // public R<IPage<GdWorkOrderFlowVO>> page(GdWorkOrderFlowVO gdWorkOrderFlow, Query query) { // IPage<GdWorkOrderFlowVO> pages = gdWorkOrderFlowService.selectGdWorkOrderFlowPage(Condition.getPage(query), gdWorkOrderFlow); // return R.data(pages); // } /** * 流程记录表 新增 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/enums/PatrolTaskStatusEnum.java
@@ -97,4 +97,48 @@ public static boolean isValidValue(String value) { return getByValue(value) != null; } } /** * 检查当前状态是否允许指定的操作类型 * @param operationType 操作类型:1接单,2拒接接单,3申请取消,4申请修改,5同意取消,6不同意取消,7同意修改,8不同意修改 * @return 是否允许操作 */ public boolean isAllowedOperation(Integer operationType) { if (operationType == null) { return false; } switch (this) { case PENDING_SIGNING: // 发布中_接单中状态允许:1接单,2拒接接单 return operationType == 1 || operationType == 2; case REJECTED_SIGNING: // 响应中_待拆分状态允许:3申请取消,4申请修改 return operationType == 3 || operationType == 4 ; case WITHDRAWN: // 响应中_申请取消状态允许:5同意取消,6不同意取消 return operationType == 5 || operationType == 6; case PENDING_AUDIT: // 响应中_申请修改状态允许:7同意修改,8不同意修改 return operationType ==7 || operationType == 8 ; case AUDIT_REJECTED: // 响应中_拒绝取消状态允许:3申请取消 return operationType == 3; case AUDIT_PASSED: // 响应中_拒绝修改状态允许:4申请修改 return operationType == 4; case PENDING_ACCEPTANCE: // 响应中_拒绝修改状态允许:4申请修改 return operationType == 4; case REJECTED_ACCEPTANCE: // 响应中_拒绝修改状态允许:4申请修改 return operationType == 4; case ACCEPTANCE_PASSED: // 响应中_拒绝修改状态允许:4申请修改 return operationType == 4; default: // 其他状态不允许操作 return false; } } } drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/enums/WorkOrderStatusEnum.java
@@ -212,7 +212,7 @@ /** * 检查当前状态是否允许指定的操作类型 * @param operationType 操作类型:1接单,2拒接接单,3申请取消,4申请修改, 5同意取消 6不同意取消 7.同意修改 8.不同意修改 * @param operationType 操作类型:1接单,2拒接接单,3申请取消,4申请修改,5同意取消,6不同意取消,7同意修改,8不同意修改 * @return 是否允许操作 */ public boolean isAllowedOperation(Integer operationType) { @@ -228,16 +228,16 @@ // 响应中_待拆分状态允许:3申请取消,4申请修改 return operationType == 3 || operationType == 4 ; case RESPONDING_APPLY_CANCEL: // 响应中_申请取消状态允许:6同意取消,8不同意取消 // 响应中_申请取消状态允许:5同意取消,6不同意取消 return operationType == 5 || operationType == 6; case RESPONDING_APPLY_MODIFY: // 响应中_申请修改状态允许:7同意修改,9不同意修改 // 响应中_申请修改状态允许:7同意修改,8不同意修改 return operationType ==7 || operationType == 8 ; case RESPONDING_REJECT_CANCEL: // 响应中_拒绝取消状态允许:1接单 // 响应中_拒绝取消状态允许:3申请取消 return operationType == 3; case RESPONDING_REJECT_MODIFY: // 响应中_拒绝修改状态允许:1接单 // 响应中_拒绝修改状态允许:4申请修改 return operationType == 4; default: // 其他状态不允许操作 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/GdPatrolTaskAuditParam.java
@@ -16,9 +16,9 @@ private Long id; /** * 审核状态:4审核通过、5审核拒绝 * 审核状态: */ @ApiModelProperty(value = "审核状态:4审核通过、5审核拒绝", required = true) @ApiModelProperty(value = "审核状态:1.同意签收、2.拒绝签收 、3.撤回任务 、4.同意审核、 5.拒绝审核、 6.验收通过、 7.验收拒绝", required = true) @NotNull(message = "审核状态不能为空") private String auditStatus; drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/WorkOrderAddParam.java
@@ -33,7 +33,7 @@ @NotNull private String deviceLoadDemand; @ApiModelProperty(value = "工单状态:0草稿、10发布中_接单中、11发布中_拒绝接单、20响应中_待拆分、21响应中_申请取消、22响应中_申请修改、23响应中_已取消、30执行中_待全部完成、31执行中_协商修改、40完成待验_待全部验收、50验收通过_待结算、60结算完成_已结算") @ApiModelProperty(value = "工单状态:0草稿、10发布中_接单中、11发布中_拒绝接单、20响应中_待拆分、21响应中_申请取消、22响应中_申请修改、23响应中_已取消、24响应中_拒绝取消、25响应中_拒绝修改 30执行中_待全部完成、31执行中_协商修改、40完成待验_待全部验收、50验收通过_待结算、60结算完成_已结算") @NotNull private String workOrderStatus; /** drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/WorkOrderPageParam.java
@@ -22,7 +22,7 @@ @NotNull private String workOrderType; @ApiModelProperty(value = "工单状态:0草稿、10发布中_接单中、11发布中_拒绝接单、20响应中_待拆分、21响应中_申请取消、22响应中_申请修改、23响应中_已取消、30执行中_待全部完成、31执行中_协商修改、40完成待验_待全部验收、50验收通过_待结算、60结算完成_已结算") @ApiModelProperty(value = "工单状态:0草稿、10发布中_接单中、11发布中_拒绝接单、20响应中_待拆分、21响应中_申请取消、22响应中_申请修改、23响应中_已取消、24响应中_拒绝取消、25响应中_拒绝修改 30执行中_待全部完成、31执行中_协商修改、40完成待验_待全部验收、50验收通过_待结算、60结算完成_已结算") @NotNull private String workOrderStatus; drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/param/WorkOrderStatusParam.java
@@ -23,7 +23,7 @@ /** * 操作类型:1接单,2拒接接单 */ @ApiModelProperty(value = "操作类型:1接单,2拒接接单,3申请取消,4申请修改, 5同意取消 6不同意取消 7.同意修改 7.不同意修改 ", required = true) @ApiModelProperty(value = "操作类型:1接单,2拒接接单,3申请取消,4申请修改, 5同意取消 6不同意取消 7.同意修改 8.不同意修改 ", required = true) @NotNull(message = "操作类型不能为空") private Integer operationType; drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/IGdPatrolTaskService.java
@@ -18,6 +18,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import org.sxkj.gd.workorder.entity.GdPatrolTaskEntity; import org.sxkj.gd.workorder.param.GdPatrolTaskAuditParam; import org.sxkj.gd.workorder.param.GdPatrolTaskPageParam; import org.sxkj.gd.workorder.vo.GdPatrolTaskVO; import org.sxkj.gd.workorder.excel.GdPatrolTaskExcel; @@ -59,10 +60,8 @@ /** * 审核巡查任务 * @param id 任务ID * @param auditStatus 审核状态:4审核通过、5审核拒绝 * @param rejectReason 拒绝原因(审核拒绝时必填) * @param auditParam * @return */ boolean auditPatrolTask(Long id, String auditStatus, String rejectReason); boolean auditPatrolTask(GdPatrolTaskAuditParam auditParam); } drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdPatrolTaskServiceImpl.java
@@ -27,6 +27,7 @@ import org.sxkj.gd.workorder.enums.PatrolTaskStatusEnum; import org.sxkj.gd.workorder.enums.WorkOrderStatusEnum; import org.sxkj.gd.workorder.enums.WorkOrderTypeEnum; import org.sxkj.gd.workorder.param.GdPatrolTaskAuditParam; import org.sxkj.gd.workorder.param.GdPatrolTaskPageParam; import org.sxkj.gd.workorder.service.IGdWorkOrderFlowService; import org.sxkj.gd.workorder.vo.GdPatrolTaskVO; @@ -109,7 +110,10 @@ @Override @Transactional(rollbackFor = Exception.class) public boolean auditPatrolTask(Long id, String auditStatus, String rejectReason) { public boolean auditPatrolTask(GdPatrolTaskAuditParam auditParam) { Long id = auditParam.getId(); String auditStatus = auditParam.getAuditStatus(); String rejectReason = auditParam.getRejectReason(); // 1. 获取巡查任务 GdPatrolTaskEntity task = getById(id); if (task == null) { drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdWorkOrderServiceImpl.java
@@ -1,19 +1,3 @@ /* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package org.sxkj.gd.workorder.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; @@ -87,53 +71,68 @@ @Override @Transactional(rollbackFor = Exception.class) public boolean saveOrUpdateWorkOrder(WorkOrderAddParam workOrderParam) { GdWorkOrderEntity entity = Objects.requireNonNull(BeanUtil.copy(workOrderParam, GdWorkOrderEntity.class)); // 参数转换 GdWorkOrderEntity entity = BeanUtil.copy(workOrderParam, GdWorkOrderEntity.class); // 验证并格式化几何数据 String geom = entity.getGeom(); String validatedGeom = GeomUtils.validateAndFormatGeom(geom); String validatedGeom = GeomUtils.validateAndFormatGeom(entity.getGeom()); if (validatedGeom == null) { return false; } // 设置验证后的几何数据 entity.setGeom(validatedGeom); // 生成工单编号 if (StringUtils.isBlank(entity.getWorkOrderCode())) { // 使用时间戳生成唯一工单编号 String timestamp = OrderNumUtils.initOrderNum(WordOrderConstant.ORDER_REDIS_KEY); entity.setWorkOrderCode(WordOrderConstant.ORDER_PREFIX + timestamp); } Integer save = 0; // 保存操作 Integer saveResult; Date now = new Date(); if (entity.getId() != null) { // 更新操作 entity.setUpdateUser(AuthUtil.getUserId()); entity.setUpdateTime(new Date()); save = baseMapper.updateWorkOrderById(entity); entity.setUpdateTime(now); // 状态转换:拒绝状态修改后自动转换为待处理状态 switch (entity.getWorkOrderStatus()) { case "11": // 发布中_拒绝接单 → 发布中_接单中 entity.setWorkOrderStatus(WorkOrderStatusEnum.PUBLISHING_ACCEPTING.getCode()); break; case "24": // 响应中_拒绝取消 → 响应中_申请取消 entity.setWorkOrderStatus(WorkOrderStatusEnum.RESPONDING_APPLY_CANCEL.getCode()); break; case "25": // 响应中_拒绝修改 → 响应中_申请修改 entity.setWorkOrderStatus(WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY.getCode()); break; } saveResult = baseMapper.updateWorkOrderById(entity); } else { // 新增操作 entity.setCreateUser(AuthUtil.getUserId()); entity.setCreateTime(new Date()); entity.setCreateTime(now); entity.setCreateDept(Long.valueOf(AuthUtil.getDeptId())); entity.setStatus(1); entity.setIsDeleted(0); save = baseMapper.saveWorkOrder(entity); saveResult = baseMapper.saveWorkOrder(entity); } // 保存成功 if (save > 0) { // 保存流转记录 GdWorkOrderFlowEntity gdWorkOrderFlowEntity = new GdWorkOrderFlowEntity(); gdWorkOrderFlowEntity.setCreateUser(AuthUtil.getUserId()); gdWorkOrderFlowEntity.setWorkOrderId(entity.getId()); gdWorkOrderFlowEntity.setFlowName(WorkOrderStatusEnum.STAGE_WORK_ORDER_RELEASE.getStageDesc()); gdWorkOrderFlowEntity.setFlowDesc(AuthUtil.getUserName() + " " + org.springblade.core.tool.utils.DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); gdWorkOrderFlowEntity.setOperator(AuthUtil.getUserName()); gdWorkOrderFlowEntity.setType(WorkOrderTypeEnum.WORK_ORDER_TASK.getValue()); gdWorkOrderFlowEntity.setAreaCode(entity.getAreaCode()); gdWorkOrderFlowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId())); boolean save1 = gdWorkOrderFlowService.save(gdWorkOrderFlowEntity); return save1; // 保存成功则保存流转记录 if (saveResult > 0) { // 构建并保存流转记录 GdWorkOrderFlowEntity flowEntity = new GdWorkOrderFlowEntity(); flowEntity.setCreateUser(AuthUtil.getUserId()); flowEntity.setWorkOrderId(entity.getId()); flowEntity.setFlowName(WorkOrderStatusEnum.STAGE_WORK_ORDER_RELEASE.getStageDesc()); flowEntity.setFlowDesc(String.format("%s %s", AuthUtil.getUserName(), org.springblade.core.tool.utils.DateUtil.format(now, "yyyy-MM-dd HH:mm:ss"))); flowEntity.setOperator(AuthUtil.getUserName()); flowEntity.setType(WorkOrderTypeEnum.WORK_ORDER_TASK.getValue()); flowEntity.setAreaCode(entity.getAreaCode()); flowEntity.setCreateDept(Long.valueOf(AuthUtil.getDeptId())); return gdWorkOrderFlowService.save(flowEntity); } return false; } @@ -146,82 +145,62 @@ @Override @Transactional(rollbackFor = Exception.class) public boolean handleWorkOrderStatus(WorkOrderStatusParam statusParam) { // 获取工单信息 // 1. 获取工单信息 GdWorkOrderEntity workOrder = getById(statusParam.getWorkOrderId()); if (workOrder == null) { return false; } // 检查当前状态是否允许该操作类型 // 2. 状态权限校验 WorkOrderStatusEnum currentStatus = WorkOrderStatusEnum.getByCode(workOrder.getWorkOrderStatus()); if (currentStatus == null || !currentStatus.isAllowedOperation(statusParam.getOperationType())) { Integer operationType = statusParam.getOperationType(); if (currentStatus == null || !currentStatus.isAllowedOperation(operationType)) { return false; } // 操作类型:1接单,2拒接接单,3申请取消,4申请修改, 5同意取消 6不同意取消 7.同意修改 8.不同意修改 Integer operationType = statusParam.getOperationType(); String newStatus = null; String flowName = null; // 统一设置流转描述前缀 String flowDesc = AuthUtil.getUserName() + " " + org.springblade.core.tool.utils.DateUtil.format(new Date(), CommonConstant.YYYY_MM_DD_HH_MM_SS); // 3. 确定新状态和流转名称 WorkOrderStatusEnum newStatusEnum; switch (operationType) { case 1: case 7: // 接单操作:更新状态为响应中_待拆分(20) newStatus = WorkOrderStatusEnum.RESPONDING_TO_BE_SPLIT.getCode(); flowName = WorkOrderStatusEnum.RESPONDING_TO_BE_SPLIT.getStageDesc(); case 1: // 接单 case 7: // 同意修改 newStatusEnum = WorkOrderStatusEnum.RESPONDING_TO_BE_SPLIT; break; case 2: // 拒接接单操作:更新状态为发布中_拒绝接单(11) newStatus = WorkOrderStatusEnum.PUBLISHING_REJECTING.getCode(); flowName = WorkOrderStatusEnum.PUBLISHING_REJECTING.getStageDesc(); case 2: // 拒接接单 newStatusEnum = WorkOrderStatusEnum.PUBLISHING_REJECTING; break; case 3: // 申请取消操作:更新状态为响应中_申请取消(21) newStatus = WorkOrderStatusEnum.RESPONDING_APPLY_CANCEL.getCode(); flowName = WorkOrderStatusEnum.RESPONDING_APPLY_CANCEL.getStageDesc(); case 3: // 申请取消 newStatusEnum = WorkOrderStatusEnum.RESPONDING_APPLY_CANCEL; break; case 4: // 申请修改操作:更新状态为响应中_申请修改(22) newStatus = WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY.getCode(); flowName = WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY.getStageDesc(); case 4: // 申请修改 newStatusEnum = WorkOrderStatusEnum.RESPONDING_APPLY_MODIFY; break; case 5: // 已取消操作:更新状态为响应中_已取消(23) newStatus = WorkOrderStatusEnum.RESPONDING_CANCELED.getCode(); flowName = WorkOrderStatusEnum.RESPONDING_CANCELED.getStageDesc(); case 5: // 同意取消 newStatusEnum = WorkOrderStatusEnum.RESPONDING_CANCELED; break; case 6: // 已取消操作:更新状态为响应中_已取消(24) newStatus = WorkOrderStatusEnum.RESPONDING_REJECT_CANCEL.getCode(); flowName = WorkOrderStatusEnum.RESPONDING_REJECT_CANCEL.getStageDesc(); case 6: // 不同意取消 newStatusEnum = WorkOrderStatusEnum.RESPONDING_REJECT_CANCEL; break; case 8: // 已取消操作:更新状态为响应中_已取消(25) newStatus = WorkOrderStatusEnum.RESPONDING_REJECT_MODIFY.getCode(); flowName = WorkOrderStatusEnum.RESPONDING_REJECT_MODIFY.getStageDesc(); case 8: // 不同意修改 newStatusEnum = WorkOrderStatusEnum.RESPONDING_REJECT_MODIFY; break; default: // 无效的操作类型 default: // 无效操作类型 return false; } // 更新工单状态 workOrder.setWorkOrderStatus(newStatus); // 4. 更新工单状态 Date now = new Date(); workOrder.setWorkOrderStatus(newStatusEnum.getCode()); workOrder.setUpdateUser(AuthUtil.getUserId()); workOrder.setUpdateTime(new Date()); workOrder.setGeom(null); boolean update = updateById(workOrder); workOrder.setUpdateTime(now); boolean updateResult = updateById(workOrder); // 更新成功,保存流转记录 if (update) { // 5. 保存流转记录 if (updateResult) { GdWorkOrderFlowEntity flowEntity = new GdWorkOrderFlowEntity(); flowEntity.setCreateUser(AuthUtil.getUserId()); flowEntity.setWorkOrderId(workOrder.getId()); flowEntity.setFlowName(flowName); flowEntity.setFlowDesc(flowDesc); flowEntity.setFlowName(newStatusEnum.getStageDesc()); flowEntity.setFlowDesc(String.format("%s %s", AuthUtil.getUserName(), org.springblade.core.tool.utils.DateUtil.format(now, CommonConstant.YYYY_MM_DD_HH_MM_SS))); flowEntity.setOperator(AuthUtil.getUserName()); flowEntity.setType(WorkOrderTypeEnum.WORK_ORDER_TASK.getValue()); flowEntity.setAreaCode(workOrder.getAreaCode()); drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/vo/GdWorkOrderFlowVO.java
@@ -32,11 +32,25 @@ private static final long serialVersionUID = 1L; /** * 流转名称 */ @ApiModelProperty(value = "流转名称") private String flowName; /** * 流转描述 */ @ApiModelProperty(value = "流转描述") private String flowDesc; /** * 关联工单任务表ID/巡查任务ID */ @ApiModelProperty(value = "关联工单任务表ID/巡查任务ID") private Long workOrderId; /** * 操作人 */ @ApiModelProperty(value = "操作人") private String operator; /** * 类型(0工单任务 1巡查任务) */ drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/wrapper/GdWorkOrderFlowWrapper.java
@@ -20,7 +20,10 @@ import org.springblade.core.tool.utils.BeanUtil; import org.sxkj.gd.workorder.entity.GdWorkOrderFlowEntity; import org.sxkj.gd.workorder.vo.GdWorkOrderFlowVO; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * 流程记录表 包装类,返回视图层所需的字段 @@ -46,5 +49,18 @@ return gdWorkOrderFlowVO; } /** * 将实体列表转换为VO列表 * @param list 实体列表 * @return VO列表 */ public List<GdWorkOrderFlowVO> entityVOList(List<GdWorkOrderFlowEntity> list) { if (list == null || list.isEmpty()) { return new ArrayList<>(); } return list.stream() .map(this::entityVO) .collect(Collectors.toList()); } }