diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProjectScheduleController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProjectScheduleController.java index 43493cb..eedebf9 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProjectScheduleController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProjectScheduleController.java @@ -109,4 +109,11 @@ public class OaProjectScheduleController extends BaseController { @PathVariable Long[] scheduleIds) { return toAjax(iOaProjectScheduleService.deleteWithValidByIds(Arrays.asList(scheduleIds), true)); } + + //新增接口插入项目id + @PostMapping("/addByProjectId") + public R addByProjectId(@Validated(AddGroup.class) @RequestBody OaProjectScheduleBo bo) { + return toAjax(iOaProjectScheduleService.insertByProjectId(bo)); + } + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaProjectScheduleStep.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaProjectScheduleStep.java index dfc2e2b..43cb3bd 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaProjectScheduleStep.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/OaProjectScheduleStep.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.Date; import java.math.BigDecimal; @@ -84,4 +85,55 @@ public class OaProjectScheduleStep extends BaseEntity { private Long batchId; + + /** + * tab节点 + */ + private String tabNode; + + /** + * 一级节点(阶段节点) + */ + private String firstLevelNode; + + /** + * 二级节点(关键节点) + */ + private String secondLevelNode; + + /** + * 开始时间 + */ + private LocalDateTime startTime; + + /** + * 原定结束时间 + */ + private LocalDateTime originalEndTime; + + /** + * 结束时间 + */ + private LocalDateTime endTime; + + /** + * 节点负责人 + */ + private String nodeHeader; + + /** + * 相关资料 + */ + private String relatedDocs; + + /** + * 相关图片 + */ + private String relatedImages; + + /** + * 规范说明 + */ + private String specification; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProjectScheduleStepBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProjectScheduleStepBo.java index e54c31d..4cb09de 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProjectScheduleStepBo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/OaProjectScheduleStepBo.java @@ -1,11 +1,13 @@ package com.ruoyi.oa.domain.bo; +import com.baomidou.mybatisplus.annotation.TableField; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; import lombok.Data; import lombok.EqualsAndHashCode; import javax.validation.constraints.*; +import java.time.LocalDateTime; import java.util.Date; import java.util.Date; @@ -98,4 +100,55 @@ public class OaProjectScheduleStepBo extends BaseEntity { private Long batchId; + + /** + * tab节点 + */ + private String tabNode; + + /** + * 一级节点(阶段节点) + */ + private String firstLevelNode; + + /** + * 二级节点(关键节点) + */ + private String secondLevelNode; + + /** + * 开始时间 + */ + private LocalDateTime startTime; + + /** + * 原定结束时间 + */ + private LocalDateTime originalEndTime; + + /** + * 结束时间 + */ + private LocalDateTime endTime; + + /** + * 节点负责人 + */ + private String nodeHeader; + + /** + * 相关资料 + */ + private String relatedDocs; + + /** + * 相关图片 + */ + private String relatedImages; + + /** + * 规范说明 + */ + private String specification; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/dto/NodeDTO.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/dto/NodeDTO.java new file mode 100644 index 0000000..b2fb8a3 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/dto/NodeDTO.java @@ -0,0 +1,12 @@ +package com.ruoyi.oa.domain.dto; + +import lombok.Data; + +@Data +public class NodeDTO { + private String tabNode; // tab节点 + private String firstLevelNode; // 一级节点 + private String secondLevelNode; // 二级节点 + private String stepName; // 步骤名称(非空,建议与二级节点名一致) + private String specification; // 规范说明(新增字段) +} \ No newline at end of file diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProjectScheduleStepVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProjectScheduleStepVo.java index 8fef3e3..b514bd1 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProjectScheduleStepVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProjectScheduleStepVo.java @@ -1,11 +1,15 @@ package com.ruoyi.oa.domain.vo; +import java.time.LocalDateTime; +import java.util.Base64; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import com.ruoyi.common.annotation.ExcelDictFormat; import com.ruoyi.common.convert.ExcelDictConvert; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.oa.domain.bo.OaProjectScheduleStepBo; import com.ruoyi.system.domain.SysOss; import lombok.Data; import java.util.Date; @@ -20,7 +24,7 @@ import java.util.List; */ @Data @ExcelIgnoreUnannotated -public class OaProjectScheduleStepVo { +public class OaProjectScheduleStepVo extends BaseEntity { private static final long serialVersionUID = 1L; @@ -107,4 +111,55 @@ public class OaProjectScheduleStepVo { */ private Long batchId; + /** + * tab节点 + */ + private String tabNode; + + /** + * 一级节点(阶段节点) + */ + private String firstLevelNode; + + /** + * 二级节点(关键节点) + */ + private String secondLevelNode; + + /** + * 开始时间 + */ + private LocalDateTime startTime; + + /** + * 原定结束时间 + */ + private LocalDateTime originalEndTime; + + /** + * 结束时间 + */ + private LocalDateTime endTime; + + /** + * 节点负责人 + */ + private String nodeHeader; + + /** + * 相关资料 + */ + private String relatedDocs; + + /** + * 相关图片 + */ + private String relatedImages; + + /** + * 规范说明 + */ + private String specification; + + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaProjectScheduleStepMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaProjectScheduleStepMapper.java index 2597122..00fcea7 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaProjectScheduleStepMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaProjectScheduleStepMapper.java @@ -7,6 +7,9 @@ import com.ruoyi.oa.domain.vo.OaProjectScheduleStepVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; import org.apache.ibatis.annotations.Param; import com.baomidou.mybatisplus.core.toolkit.Constants; + +import java.util.List; + /** * 项目进度步骤跟踪Mapper接口 * @@ -24,4 +27,6 @@ public interface OaProjectScheduleStepMapper extends BaseMapperPlus entities); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectScheduleService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectScheduleService.java index 89a618f..4e58a04 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectScheduleService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectScheduleService.java @@ -53,4 +53,6 @@ public interface IOaProjectScheduleService { * @return */ boolean complete(OaProjectScheduleBo bo); + + Boolean insertByProjectId(OaProjectScheduleBo bo); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectScheduleStepService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectScheduleStepService.java index eb2d641..3dec809 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectScheduleStepService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectScheduleStepService.java @@ -1,6 +1,9 @@ package com.ruoyi.oa.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.oa.domain.OaProjectScheduleStep; import com.ruoyi.oa.domain.bo.BatchBo; +import com.ruoyi.oa.domain.dto.NodeDTO; import com.ruoyi.oa.domain.vo.OaProjectScheduleStepVo; import com.ruoyi.oa.domain.bo.OaProjectScheduleStepBo; import com.ruoyi.common.core.page.TableDataInfo; @@ -15,7 +18,7 @@ import java.util.List; * @author hdka * @date 2025-05-08 */ -public interface IOaProjectScheduleStepService { +public interface IOaProjectScheduleStepService{ /** * 查询项目进度步骤跟踪 @@ -60,4 +63,6 @@ public interface IOaProjectScheduleStepService { */ int changeBatch(BatchBo boList); + void batchInsertNodes(List nodeList, Long scheduleId); + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleServiceImpl.java index cd69df9..941d5db 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleServiceImpl.java @@ -2,6 +2,7 @@ package com.ruoyi.oa.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.esotericsoftware.minlog.Log; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.core.page.TableDataInfo; @@ -13,12 +14,14 @@ import com.ruoyi.oa.domain.OaScheduleTemplate; import com.ruoyi.oa.domain.OaScheduleTemplateStep; import com.ruoyi.oa.domain.bo.OaProjectScheduleStepBo; import com.ruoyi.oa.domain.bo.OaScheduleTemplateStepBo; +import com.ruoyi.oa.domain.dto.NodeDTO; import com.ruoyi.oa.domain.vo.OaProjectScheduleStepVo; import com.ruoyi.oa.domain.vo.OaScheduleTemplateStepVo; import com.ruoyi.oa.domain.vo.OaScheduleTemplateVo; import com.ruoyi.oa.mapper.OaScheduleTemplateMapper; import com.ruoyi.oa.service.IOaProjectScheduleStepService; import com.ruoyi.oa.service.IOaScheduleTemplateStepService; +import com.ruoyi.oa.utils.TableDataConstantUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.ruoyi.oa.domain.bo.OaProjectScheduleBo; @@ -209,4 +212,22 @@ public class OaProjectScheduleServiceImpl implements IOaProjectScheduleService { } return updateByBo(bo); } + + @Override + public Boolean insertByProjectId(OaProjectScheduleBo bo) { + OaProjectSchedule add = BeanUtil.toBean(bo, OaProjectSchedule.class); + validEntityBeforeSave(add); + add.setTemplateId(1L); + int insert = baseMapper.insert(add); + if (insert <= 0) { + return false; // 插入失败直接返回 + } + Long scheduleId = add.getScheduleId(); + if (scheduleId == null) { + throw new RuntimeException("插入项目进度表后未获取到主键"); + } + projectScheduleStepService.batchInsertNodes(TableDataConstantUtil.getTableData(), scheduleId); + Log.info("项目进度节点批量插入成功"); + return true; + } } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleStepServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleStepServiceImpl.java index de6f694..bbcee1b 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleStepServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleStepServiceImpl.java @@ -3,6 +3,8 @@ package com.ruoyi.oa.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.page.TableDataInfo; @@ -11,8 +13,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.oa.domain.OaProjectSchedule; import com.ruoyi.oa.domain.bo.BatchBo; +import com.ruoyi.oa.domain.dto.NodeDTO; import com.ruoyi.oa.mapper.OaProjectScheduleMapper; import lombok.RequiredArgsConstructor; +import org.flowable.job.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import com.ruoyi.oa.domain.bo.OaProjectScheduleStepBo; import com.ruoyi.oa.domain.vo.OaProjectScheduleStepVo; @@ -22,6 +26,8 @@ import com.ruoyi.oa.service.IOaProjectScheduleStepService; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; /** * 项目进度步骤跟踪Service业务层处理 @@ -99,6 +105,12 @@ public class OaProjectScheduleStepServiceImpl implements IOaProjectScheduleStepS // 除了做更新还需要编辑文件权限将涉及到的所有文件 都涉及到userId OaProjectScheduleStep update = BeanUtil.toBean(bo, OaProjectScheduleStep.class); validEntityBeforeSave(update); + //查询end_time结束时间是不是空 如果是空则证明是第一次修改需要给end_time赋值也就是新的结束时间原来结束时间不变 + OaProjectScheduleStep oaProjectScheduleStep = baseMapper.selectOne(new LambdaQueryWrapper().eq(OaProjectScheduleStep::getTrackId, update.getTrackId())); + if (oaProjectScheduleStep.getEndTime() == null) { + update.setEndTime(bo.getEndTime()); + update.setOriginalEndTime(bo.getEndTime()); + } return baseMapper.updateById(update) > 0; } @@ -187,4 +199,34 @@ public class OaProjectScheduleStepServiceImpl implements IOaProjectScheduleStepS return flag; } + + + /** + * 批量插入节点数据(按表结构约束设置字段值) + * @param nodeList 代码中定义的表格节点数据(需包含tab、一二级节点和规范说明) + * @param scheduleId 所属项目进度ID(非空,必须传入) + */ + public void batchInsertNodes(List nodeList, Long scheduleId) { + // 步骤序号从1开始递增(确保与schedule_id、use_flag、batch_id组合唯一) + AtomicInteger stepOrder = new AtomicInteger(1); + + List entities = nodeList.stream().map(node -> { + OaProjectScheduleStep step = new OaProjectScheduleStep(); + + // 1. 必须设置值的四个核心字段 + step.setTabNode(node.getTabNode()); // tab节点 + step.setFirstLevelNode(node.getFirstLevelNode()); // 一级节点 + step.setSecondLevelNode(node.getSecondLevelNode()); // 二级节点 + step.setSpecification(node.getSpecification()); // 规范说明(从NodeDTO补充此字段) + + // 2. 表结构中非空字段(必须设置,否则插入失败) + step.setScheduleId(scheduleId); // 所属项目进度ID(非空,外部传入) + step.setStepOrder((long) stepOrder.getAndIncrement()); // 步骤序号(非空,递增生成) + step.setStepName(node.getStepName());// 步骤名称(非空,从NodeDTO获取,建议用二级节点名) + return step; + }).collect(Collectors.toList()); + + // 批量插入数据库 + baseMapper.saveBatch(entities); + } } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/utils/TableDataConstantUtil.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/utils/TableDataConstantUtil.java new file mode 100644 index 0000000..3b745f0 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/utils/TableDataConstantUtil.java @@ -0,0 +1,403 @@ +package com.ruoyi.oa.utils; + +import com.ruoyi.oa.domain.dto.NodeDTO; + +import java.util.Arrays; +import java.util.List; + +/** + * 表格数据常量:存储所有需要插入的节点数据(不同表格对应不同的方法) + */ +public class TableDataConstantUtil { + + /** + * 示例1:自动化设计表格数据 + * 包含tab节点、一级节点、二级节点、规范说明 + */ + public static List getTableData() { + return Arrays.asList( + //自动化设计表 + // 技术审查阶段 + createNode( + "自动化设计", // tab节点 + "一、技术审查", // 一级节点 + "接地系统图", // 二级节点 + null // 规范说明 + ), + createNode( + "自动化设计", + "一、技术审查", + "传动单线图", + null + ), + createNode( + "自动化设计", + "一、技术审查", + "MCC单线图", + null + ), + createNode( + "自动化设计", + "一、技术审查", + "变压器清单", + null + ), + createNode( + "自动化设计", + "一、技术审查", + "电气室布置图", + null + ), + + // 自动化设计阶段 + createNode( + "自动化设计", + "一、技术审查", + "操作台面板布置图", + null + ), + createNode( + "自动化设计", + "二、自动化设计", + "马达元器件检测清单", + null + ), + createNode( + "自动化设计", + "二、自动化设计", + "自动化网络配置图", + null + ), + createNode( + "自动化设计", + "二、自动化设计", + "图纸详细设计完成", + null + ), + + //程序设计提资完成 + createNode( + "自动化设计", + "三、程序开发", + "功能说明书", + null + ), + createNode( + "自动化设计", + "三、程序开发", + "程序设计", + null + ), + createNode( + "自动化设计", + "三、程序开发", + "程序仿真", + null + ), + createNode( + "自动化设计", + "三、程序开发", + "程序在线测试", + null + ), + createNode( + "自动化设计", + "三、程序开发", + "画面设计", + null + ), + + //现场调试 + createNode( + "自动化设计", + "四、现场调试", + "单动", + null + ), + createNode( + "自动化设计", + "四、现场调试", + "传动优化", + null + ), + createNode( + "自动化设计", + "四、现场调试", + "联动", + null + ), + + //考核验证通过 + createNode( + "自动化设计", + "五、项目收尾", + null, + null + ), + + //采购,库房表 + // 一、一次配线 阶段 + createNode( + "采购、库房", + "一、一次配线", + "采购审核", + "接收由项目部或技术部发出的、经过审核的《物料清单(BOM)》及技术规范,并对其进行采购可行性(品牌、货期、替代品、成本)评审。" + ), + createNode( + "采购、库房", + "一、一次配线", + "采购计划与询价、定标", + "根据项目计划制定《采购作业计划》,向合格供应商进行询价、比价、议价,并最终确定供应商,提交审批。" + ), + createNode( + "采购、库房", + "一、一次配线", + "采购订单下达与合同签订", + "向选定的供应商下达正式《采购订单》或签订《采购合同》,明确物料规格、数量、价格、交期、付款方式、验收标准等所有细节。" + ), + createNode( + "采购、库房", + "一、一次配线", + "采购过程跟催与交期确认", + "主动、定期地与供应商沟通,跟踪生产/备货进度,确认并确保物料能按承诺日期送达。这是应对长周期物料和避免延期的最关键节点。" + ), + createNode( + "采购、库房", + "一、一次配线", + "到货报验与问题处理", + "物料到达后,采购员协同库房、质检员(IQC)对物料进行数量、外观、型号规格的初步核对,并处理任何与订单不符的问题(如数量短缺、型号错误、损坏等)。" + ), + + // 二、库房管理节点 阶段 + createNode( + "采购、库房", + "二、库房管理节点", + "进货检验(IQC)", + "质检人员根据检验标准和物料清单,对送达的物料进行质量检验,包括功能测试、电气参数测量、证件核查等。" + ), + createNode( + "采购、库房", + "二、库房管理节点", + "物料入库与上架", + "对通过IQC检验的合格物料,办理正式入库手续,包括系统数据录入、贴码、分类,并放置到指定货位。" + ), + createNode( + "采购、库房", + "二、库房管理节点", + "生产领料与发料(齐套性检查)", + "根据生产任务单和BOM,为车间准备所需物料。关键环节是进行“齐套性检查”,即确认一个订单所需的所有物料是否均已备齐,避免生产线因缺料停滞。" + ), + createNode( + "采购、库房", + "二、库房管理节点", + "库存盘点与预警", + "定期(如月度、季度)\n" + + "对在库物料进行全面盘点,\n" + + "确保账、物、卡一致。\n" + + "同时对关键物料设置最低库存预警,触发补货机制。\n" + ), + + //车间设计制造表 + // 一、一次线装配 阶段 + createNode( + "车间设计制造", + "一、一次线装配", + "图纸审核", + null + ), + createNode( + "车间设计制造", + "一、一次线装配", + "安装导轨/安装梁", + "根据布局图安装" + ), + createNode( + "车间设计制造", + "一、一次线装配", + "安装元器件", + "安装断路器、接触器、变频器等一次元件。" + ), + createNode( + "车间设计制造", + "一、一次线装配", + "母排加工与安装", + "制作并安装铜排或铝排,连接处需搪锡或镀银处理。" + ), + createNode( + "车间设计制造", + "一、一次线装配", + "一次线接线", + "使用规定颜色的线缆(通常为黑、棕、灰)连接主回路。" + ), + + // 二、二次线装配 阶段 + createNode( + "车间设计制造", + "二、二次线装配", + "安装端子排、线槽、继电器等二次元件。", + null + ), + createNode( + "车间设计制造", + "二、二次线装配", + "下线与套标", + "根据接线图,使用不同颜色的导线(通常为蓝、黄绿、红等)进行测量、裁剪、压接端子并套上打印好的线号管。" + ), + createNode( + "车间设计制造", + "二、二次线装配", + "布线与接线", + "将线缆整齐地放入线槽,按照图纸接到对应的端子和元件上。要求横平竖直,牢固可靠。" + ), + + // 三、调试、检验与包装发货 阶段 + createNode( + "车间设计制造", + "三、调试、检验与包装发货", + "接线检查", + "对照图纸,进行100%的接线正确性检查。" + ), + createNode( + "车间设计制造", + "三、调试、检验与包装发货", + "接地连续性测试", + "确保所有接地连接可靠。" + ), + createNode( + "车间设计制造", + "三、调试、检验与包装发货", + "绝缘电阻测试", + "使用兆欧表测量相间、相对地的绝缘电阻,确保符合标准(通常>1MΩ)。" + ), + createNode( + "车间设计制造", + "三、调试、检验与包装发货", + "耐压测试", + "施加高于额定电压的测试电压,持续一定时间,检测是否存在绝缘击穿风险。" + ), + createNode( + "车间设计制造", + "三、调试、检验与包装发货", + "功能模拟调试", + "在不接通主电源的情况下,通过外部电源模拟信号,测试控制回路的逻辑是否正确。然后接通主电源,进行空载和带载运行测试。" + ), + + // 四、清理与包装 阶段 + createNode( + "车间设计制造", + "四、清理与包装", + "清理柜内灰尘、线头等。", + null + ), + createNode( + "车间设计制造", + "四、清理与包装", + "张贴铭牌、警告标识、一次系统图等。", + null + ), + createNode( + "车间设计制造", + "四、清理与包装", + "使用塑料膜、气泡袋、护角、木箱等对产品进行防护包装,防止运输途中损坏。", + null + ), + + // 五、文件整理与发货 阶段 + createNode( + "车间设计制造", + "五、文件整理与发货", + "整理随柜文件,通常包括:合格证、出厂检验报告、电气原理图、接线图、元器件说明书等。", + null + ), + createNode( + "车间设计制造", + "五、文件整理与发货", + "安排物流,准时发货给客户。", + null + ), + + //现场实施设计表 + // 四、现场调试 阶段 + createNode( + "现场实施设计", + "四、现场调试", + "接地测试", + "条件:在计划时间点前完成测试,接地电阻值完全符合设计要求(通常≤1Ω或按图纸规定),测试报告(含现场照片、测试仪读数、测试人、时间地点)清晰、规范、完整,并准时上传至公司项目管理平台。\n" + + "主动发现并解决问题:测试结果初次不合格,但团队能主动、快速地分析原因(如土壤问题、连接点腐蚀等),提出整改方案并实施,最终使电阻值达标。此举避免了项目后期更大的延误和成本。\n" + + "提供优化建议:在测试过程中,发现了设计图中未考虑到的接地隐患,或提出了被采纳的接地系统优化建议,提升了整体安全性" + ), + createNode( + "现场实施设计", + "四、现场调试", + "现场接线安装及规范", + "核心目标: 所有电气接线工作100%符合图纸与规范,布线整齐、标识清晰、现场安全整洁,为后续调试奠定坚实的硬件基础,实现“零隐患”移交。\n" + + "考核维度: 正确性、规范性、安全性、进度。" + ), + createNode( + "现场实施设计", + "四、现场调试", + "PLC打点", + "核心目标: 高效、准确地验证并确认PLC的每一个输入/输出(I/O)点与现场对应的传感器、执行器动作完全一致,确保硬件层与软件层信号通道100%正确、可靠。\n" + + "考核维度: 准确性、完整性、效率、文档记录。" + ), + createNode( + "现场实施设计", + "四、现场调试", + "传动优化", + "核心目标: 通过参数整定、特性调试,使所有传动设备(如变频器、伺服驱动器、直流调速器等)的输出特性完全满足甚至超越工艺要求,确保系统运行平稳、高效、可靠。\n" + + "考核维度: 性能指标、稳定性、效率、技术创新" + ), + createNode( + "现场实施设计", + "四、现场调试", + "联动调试", + "核心目标: 在“单动”和“传动优化”完成的基础上,使整个自动化系统按预设的工艺流程、联锁逻辑和安全策略,自动、稳定、可靠地连续运行,实现项目的最终功能。\n" + + "考核维度: 系统稳定性、逻辑正确性、故障率、团队协作、最终用户满意度" + ), + + // 五、项目收尾 阶段 + createNode( + "现场实施设计", + "五、项目收尾", + "收尾", + "核心目标: 成功通过客户或最终用户的正式验收,所有技术指标、性能要求和文档资料均满足合同要求,项目正式移交,并取得关键的验收证明文件。\n" + + "考核维度: 客户满意度、验收一次性通过率、文档完整性、项目尾款触发" + ) + + ); + } + +// /** +// * 示例2:机械设计表格数据(另一组不同的节点) +// */ +// public static List getMechanicalDesignTableData() { +// return Arrays.asList( +// createNode( +// "机械设计", +// "方案设计", +// "初步结构图", +// "需包含关键尺寸及材料选型" +// ), +// createNode( +// "机械设计", +// "详细设计", +// "零件加工图", +// "需标注公差等级及表面处理要求" +// ) +// ); +// } + + /** + * 工具方法:快速创建NodeDTO对象 + * 步骤名称默认使用二级节点名称(确保非空) + */ + private static NodeDTO createNode(String tabNode, String firstLevel, String secondLevel, String specification) { + NodeDTO node = new NodeDTO(); + node.setTabNode(tabNode); + node.setFirstLevelNode(firstLevel); + node.setSecondLevelNode(secondLevel); + node.setSpecification(specification); + node.setStepName(secondLevel); // 步骤名=二级节点名(满足非空约束) + return node; + } +} \ No newline at end of file diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaProjectScheduleStepMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaProjectScheduleStepMapper.xml index 53a7261..a0e1511 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/OaProjectScheduleStepMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaProjectScheduleStepMapper.xml @@ -22,6 +22,16 @@ + + + + + + + + + + + + INSERT INTO oa_project_schedule_step ( + schedule_id, + step_order, + step_name, + tab_node, + first_level_node, + second_level_node, + specification + ) VALUES + + ( + #{item.scheduleId}, + #{item.stepOrder}, + #{item.stepName}, + #{item.tabNode}, + #{item.firstLevelNode}, + #{item.secondLevelNode}, + #{item.specification} + ) + + UPDATE oa_project_schedule_step