当前位置: 首页 > news >正文

甘特图开发代码(测试版)

场景:要实现的功能就是单行数据能左右拖动。

流程五个:ABCDE。(对应:Charter开发、概念和计划、初样开发、正样开发、验证)

1、A有开始时间,结束时间。B的开始时间必须是A的结束时间(相等或者大于A的结束时间)。CDE以此类推。

2、一条数据有父子级的话,父级数据的进度条取A的开始时间,E的结束时间,如果当前流程没到E,就是取现有的流程的结束时间。流程阶段影响父级

3、单个流程进度条移动会影响前后进度条,如果没有前后节点就不影响

一、代码实现

https://juejin.cn/post/7451884906761486372

https://juejin.cn/post/7273096710826967092

1、html页面

import React, { useState, useMemo, useRef } from 'react';
import {Button,DataSet,DatePicker,Dropdown,Form,Menu,message,Modal,Select,Table,TextField,
} from 'choerodon-ui/pro';
import GanttModal from './components/ganttModal/main';const platformCharter = () => {return <GanttModal />
};export default platformCharter;

2、组件页面

const handleCheckboxClick = useCallback(event => {const target = event.target;if (target.tagName === 'INPUT' && target.type === 'checkbox') {const taskId = target.getAttribute('data-task-id');const isChecked = target.checked;// 更新任务数据中的选中状态const task = gantt.getTask(taskId);task.selected = isChecked;gantt.updateTask(taskId);// 获取子任务const childTasks = gantt.getChildren(taskId);childTasks.forEach(childTask => {const childCheckbox = gantt.getTask(childTask.id);childCheckbox.selected = isChecked; // 设置子任务的选中状态gantt.updateTask(childTask.id);});// 更新父任务的选中状态const parentTask = gantt.getTask(task.parent);if (parentTask) {const siblings = gantt.getChildren(parentTask.id);const allChecked = siblings.every(sibling => sibling.selected);parentTask.selected = allChecked; // 如果所有兄弟任务都选中,父任务选中gantt.updateTask(parentTask.id);}console.log('任务选中状态:', taskId, isChecked);}
}, []);
import React, {forwardRef,useEffect,useRef,useState,useCallback,
} from 'react';
import { Button } from 'choerodon-ui/pro';
import { ButtonColor, FuncType } from 'choerodon-ui/pro/lib/button/enum';
import { observer } from 'mobx-react';
import { gantt } from '@/lib/dhtmlx-gantt/dhtmlxgantt.js';
import '@/lib/dhtmlx-gantt/dhtmlxgantt.css';
import { zoomLevels } from './store';
import './index.less';
import DetailModal from '../detail/main';
import RecordModal from '../record/main';
import { languageConfig } from '@/language/language';const GanttChart = observer(forwardRef((props, ref) => {const [visible, setVisible] = useState(false); // 弹框(详情/编辑)const [recordVisible, setRecordVisible] = useState(false); // 记录弹框const [operationType, setOperationType] = useState('detail'); // 弹框类型const [operationId, setOperationId] = useState(''); // 操作ID(用于调用详情)const ganttRef = useRef<any>(null);const [currentZoom, setCurrentZoom] = useState('day'); // 时间刻度(默认值: day)const currentZoomRef = useRef('day');/** 配置 Gantt */const initConfig = useCallback(() => {// 语言设置-中文gantt.i18n.setLocale('cn');// 行高gantt.config.row_height = 48;// 日期格式gantt.config.date_format = '%Y-%m-%d %H:%i';// 自适应gantt.config.autosize = 'y';// 设置列(name为数据字段,label为表头显示的名称,width为列宽,align为对齐方式)gantt.config.columns = [{name: 'selected', // 勾选框列label: '', // 表头为空width: 50,align: 'center',template: task => {return `<div class="gantt-checkbox"><inputtype="checkbox"data-task-id="${task.id}"${task.selected ? 'checked' : ''}/></div>`;},},{name: 'text',label: '姓名',width: 150,tree: true,},{ name: 'start_date', label: '开始日期', width: 130, align: 'center' },{ name: 'duration', label: '持续时间', width: 80, align: 'center' },{ name: 'progress', label: '进度', width: 80, align: 'center' },{name: 'actions',label: '操作',width: 200,align: 'center',template: task => {return `<div class="gantt-actions"><div class="edit-btn" data-task-id="${task.id}">编辑</div><div class="detail-btn" data-task-id="${task.id}">详情</div><div class="record-btn" data-task-id="${task.id}">修改记录</div></div>`;},},];// 布局gantt.config.layout = {css: 'custom-gantt-style',rows: [{cols: [{ view: 'grid', width: 450 }, // 任务列表{ view: 'timeline', scrollX: 50, scrollY: 60 }, // 时间轴],},],resizer: {width: 10,handler: true,},};// 启用当前日期标识插件gantt.plugins({marker: true,});// 设置时间列的样式gantt.templates.timeline_cell_class = (task, date) => {const isDisabledZoom = ['month', 'year', 'quarter'].includes(currentZoomRef.current,);if (!isDisabledZoom && !gantt.isWorkTime(date)) return 'week_end';return '';};}, []);/** 设置当前日期标识线 */const initCurrentDateMarker = useCallback(() => {const dateToStr = gantt.date.date_to_str(gantt.config.task_date);const today = new Date(new Date().setHours(0, 0, 0, 0)); // 当天零点gantt.addMarker({start_date: today,css: 'today',text: '今日',title: `Today: ${dateToStr(today)}`,});}, []);/** 初始化缩放配置 */const initZoom = useCallback(() => {const zoomConfig = {levels: zoomLevels,element: () => gantt.$root.querySelector('.gantt_task'),};gantt.ext.zoom.init(zoomConfig);gantt.ext.zoom.setLevel('day');}, []);/** 加载任务数据 */const loadTasks = useCallback(() => {const tasks = {data: [{id: 1,text: 'Karla',start_date: '2019-08-01 00:00',duration: 3,parent: 0,progress: 0.5,open: true,},{id: 11,text: 'Karla-01',start_date: '2019-08-01 10:00',duration: 3,parent: 1,progress: 0.8,},{id: 2,text: '前端',start_date: '2019-08-02 00:00',duration: 2,parent: 1,progress: 0.7,},{id: 3,text: 'York',start_date: '2019-08-03 00:00',duration: 4,parent: 0,progress: 0.3,open: true,},{id: 4,text: '后端',start_date: '2019-08-04 00:00',duration: 1,parent: 3,progress: 0.6,open: true,},{id: 5,text: 'Coco',start_date: '2019-08-05 00:00',duration: 2,parent: 0,progress: 0.8,open: true,},{id: 6,text: '测试',start_date: '2019-08-06 00:00',duration: 5,parent: 5,progress: 0.4,},{id: 7,text: 'Happy',start_date: '2019-08-07 00:00',duration: 3,parent: 0,progress: 0.9,},{id: 9,text: 'Rose',start_date: '2019-08-09 00:00',duration: 1,parent: 0,progress: 0.1,},],};gantt.parse(tasks);}, []);/** change 操作按钮点击事件 */const handleActionClick = useCallback(event => {const target = event.target;const taskId = target.getAttribute('data-task-id');if (!taskId) return;setOperationId(taskId);const actionMap = {'edit-btn': () => {console.log('点击了编辑:', taskId);setOperationType('edit');setVisible(true);},'detail-btn': () => {console.log('点击了详情:', taskId);setOperationType('detail');setVisible(true);},'record-btn': () => {console.log('点击了修改记录:', taskId);setRecordVisible(true);},};// 调用对应的处理逻辑const action = actionMap[target.className];if (action) {action();}}, []);/**change 时间刻度视图 */const handleZoomChange = useCallback(zoom => {setCurrentZoom(zoom);currentZoomRef.current = zoom;gantt.ext.zoom.setLevel(zoom);}, []);/** 处理勾选框点击事件 */const handleCheckboxClick = useCallback(event => {const target = event.target;if (target.tagName === 'INPUT' && target.type === 'checkbox') {const taskId = target.getAttribute('data-task-id');const isChecked = target.checked;// 更新任务数据中的选中状态const task = gantt.getTask(taskId);task.selected = isChecked;gantt.updateTask(taskId);console.log('任务选中状态:', taskId, isChecked);}}, []);/** 初始化 Gantt */useEffect(() => {initConfig();initZoom();initCurrentDateMarker();// 初始化gantt.init(ganttRef.current);// 加载数据loadTasks();// 绑定操作按钮的点击事件const ganttContainer = ganttRef.current;ganttContainer.addEventListener('click', handleActionClick);// 绑定勾选框的点击事件ganttContainer.addEventListener('change', handleCheckboxClick);// 清理事件监听器return () => {ganttContainer.removeEventListener('click', handleActionClick);ganttContainer.removeEventListener('change', handleCheckboxClick);};}, [initConfig,initZoom,initCurrentDateMarker,loadTasks,handleActionClick,handleCheckboxClick,]);return (<div>{/* 时间刻度:切换按钮 */}<div style={{ margin: '12px 0' }}>{zoomLevels.map(item => (<Buttonkey={item.name}color={ButtonColor.primary}funcType={FuncType.raised}disabled={item.name === currentZoom}onClick={() => handleZoomChange(item.name)}style={{ marginRight: 6 }}>{item.label}</Button>))}</div>{/* Gantt 容器 */}<div style={{ height: '500px', overflow: 'auto' }}><div ref={ganttRef} style={{ width: '100%', height: '100%' }}></div></div>{/* 详情/编辑弹框 */}{visible && (<DetailModalvisible={visible}setVisible={setVisible}onSelect={() => {}}title={operationType === 'detail'? languageConfig('platformCharter.title.detail', '详情'): languageConfig('platformCharter.title.edit', '编辑')}infoData={{operationId,operationType,}}/>)}{/* 记录 */}{recordVisible && (<RecordModalvisible={recordVisible}setVisible={setRecordVisible}onSelect={() => {}}title={languageConfig('platformCharter.title.editRecord','修改记录',)}infoData={{operationId,}}/>)}</div>);}),
);export default GanttChart;

store.js文件

export const zoomLevels = [// {//   name: 'hour',//   label: '小时',//   scale_height: 50,//   min_column_width: 30,//   scales: [//     { unit: 'day', format: '%Y-%m-%d' },//     { unit: 'hour', format: '%H' },//   ],// },{name: 'day',label: '日',scale_height: 70,min_column_width: 30,scales: [{ unit: 'month', format: '%Y年 %F' },// { unit: "day", step: 1, format: "%j %D" },{unit: 'day',step: 1,format: date => {const weekDays = ['日', '一', '二', '三', '四', '五', '六'];const day = new Date(date).getDate();const weekDay = new Date(date).getDay();return `<div class='scale-formate-date'><span class='formate-date'>${day}</span><span class='formate-weekDay'>${weekDays[weekDay]}</span></div>`;// return "<strong>Day " + dayNumber(date) + "</strong><br/>" + dateFormat(date);},},],},{name: 'week',label: '周',scale_height: 50,min_column_width: 50,scales: [{ unit: 'month', format: '%Y年 %F' },{ unit: 'week', step: 1, date: '%W周' },],},{name: 'month',label: '月',scale_height: 50,min_column_width: 50,scales: [// { unit: "year", step: 1, format: "%Y年" },{unit: 'quarter',step: 1,format: date => {const year = new Date(date).getFullYear();const month = new Date(date).getMonth();const quarter = Math.floor(month / 3 + 1);return `${year}年-Q${quarter}`;// return `Q${quarter}`;},},{ unit: 'month', step: 1, format: '%F' },],},{name: 'quarter',label: '季',scale_height: 50,min_column_width: 50,scales: [{ unit: 'year', step: 1, format: '%Y年' },{unit: 'quarter',step: 1,format: date => {// const year = new Date(date).getFullYear();const month = new Date(date).getMonth();const quarter = Math.floor(month / 3 + 1);// return `${year}年-Q${quarter}`;return `Q${quarter}`;},},],},{name: 'year',label: '年',scale_height: 50,min_column_width: 50,scales: [{ unit: 'year', step: 1, format: '%Y年' }],},
];export const zoomMap = {day: '日',week: '周',month: '月',quarter: '季',year: '年',
};.gantt-actions {display: flex;gap: 8px;justify-content: center;
}/************************************* table Header **************************************/
.gantt_grid_head_cell {background-color: #f5f7f8;font-size: 14px;font-weight: 400;
}/************************************* checkbox 勾选框 **************************************/
.gantt-checkbox input {cursor: pointer;border-radius: 4px;border: 1px solid #c7cfd8;width: 14px;height: 14px;appearance: none; /* 清除默认样式 */-webkit-appearance: none; /* 兼容 Safari 和 Chrome */-moz-appearance: none; /* 兼容 Firefox */position: relative; /* 为伪元素定位 */
}/* 选中状态样式 */
.gantt-checkbox input:checked {background-color: #1890ff; /* 选中时的背景色 */border-color: #1890ff; /* 选中时的边框颜色 */
}/* 小勾样式 */
.gantt-checkbox input:checked::after {content: '';position: absolute;top: 50%;left: 50%;width: 4px;height: 8px;border: solid white;border-width: 0 2px 2px 0;transform: translate(-50%, -60%) rotate(45deg); /* 调整位置和旋转角度 */
}/************************************* 操作(btn) **************************************/
.edit-btn,
.detail-btn,
.record-btn {color: #007dc6;cursor: pointer;
}

3、mock数据(暂时没用上)

export const tasksList = {data: [{bid: 1,pCode: '0',type: 1,code: 'm1234',name: 'm1234',projectRank: 'm1234',marketPositioning: 'm1234',costBenchmarking: 'm1234',performanceBenchmark: 'm1234',targetAudienceName: 'm1234',focusedIndustriesAndClientsName: 'm1234',newReachableCapacity: 'm1234',preparationOfKeyTechnologies: null,valueProposition: 'm1234',keyCompetitive: 'm1234',charterInitDate: '2025-01-02 00:00:00',charterTransferDate: '2025-01-02 00:00:00',pdcpDate: '2025-01-02 00:00:00',tr4aDate: '2025-01-02 00:00:00',edcpDate: '2025-01-02 00:00:00',adcpDate: '2025-05-02 00:00:00',insightFinishDate: '2025-03-02 00:00:00',relateOfferingName: null,rerlationshipName: null,serviceSolution: null,belongSolutionName: null,productClassL3Name: null,productSeriesL4Name: null,productOfferingL5Name: null,productBelongGroupsName: null,productBelongSpdtName: null,charterClass: null,charterTransferVersionTypeName: null,decisionLevelName: null,priorityName: null,businessPropertyName: null,bak: null,verison: null,state: 1,createUser: null,updatedUser: null,milestones: null,children: [{bid: 4,pCode: 'm1234',type: 2,code: 'm1234567',name: 'm1234',projectRank: 'm1234',marketPositioning: 'm1234',costBenchmarking: 'm1234',performanceBenchmark: 'm1234',targetAudienceName: 'm1234',focusedIndustriesAndClientsName: 'm1234',newReachableCapacity: 'm1234',preparationOfKeyTechnologies: null,valueProposition: 'm1234',keyCompetitive: 'm1234',charterInitDate: '2025-01-02 00:00:00',charterTransferDate: '2025-02-02 00:00:00',pdcpDate: '2025-03-02 00:00:00',tr4aDate: '2025-04-02 00:00:00',edcpDate: '2025-05-02 00:00:00',adcpDate: '2025-09-02 00:00:00',insightFinishDate: '2025-09-02 00:00:00',relateOfferingName: null,rerlationshipName: null,serviceSolution: null,belongSolutionName: null,productClassL3Name: null,productSeriesL4Name: null,productOfferingL5Name: null,productBelongGroupsName: null,productBelongSpdtName: null,charterClass: null,charterTransferVersionTypeName: null,decisionLevelName: null,priorityName: null,businessPropertyName: null,bak: null,verison: null,state: 1,createUser: null,updatedUser: null,milestones: [{id: 'm1234567-1',pCode: 'm1234567',startDate: '2025-01-02',endDate: '2025-02-02',text: 'Charter开发',milestonskey: 'CHARTER_DEVELOPMENT',parent: 'm1234567',start_date: '2025-01-02',end_date: '2025-02-02',},{id: 'm1234567-2',pCode: 'm1234567',startDate: '2025-02-02',endDate: '2025-03-02',text: '概念和计划',milestonskey: 'CONCEPT_AND_PLAN',parent: 'm1234567',start_date: '2025-02-02',end_date: '2025-03-02',},{id: 'm1234567-3',pCode: 'm1234567',startDate: '2025-03-02',endDate: '2025-04-02',text: '初样开发',milestonskey: 'INITIAL_SAMPLE_DEVELOPMENT',parent: 'm1234567',start_date: '2025-03-02',end_date: '2025-04-02',},{id: 'm1234567-4',pCode: 'm1234567',startDate: '2025-04-02',endDate: '2025-05-02',text: '正样开发',milestonskey: 'PROTOTYPE_DEVELOPMENT',parent: 'm1234567',start_date: '2025-04-02',end_date: '2025-05-02',},{id: 'm1234567-5',pCode: 'm1234567',startDate: '2025-05-02',endDate: '2025-09-02',text: '验证',milestonskey: 'VERIFY',parent: 'm1234567',start_date: '2025-05-02',end_date: '2025-09-02',},],children: null,parent: 'm1234',render: 'split',isChildrenNode: true,},{bid: 5,pCode: 'm1234',type: 2,code: 'm12345678',name: 'm1234',projectRank: 'm1234',marketPositioning: 'm1234',costBenchmarking: 'm1234',performanceBenchmark: 'm1234',targetAudienceName: 'm1234',focusedIndustriesAndClientsName: 'm1234',newReachableCapacity: 'm1234',preparationOfKeyTechnologies: null,valueProposition: 'm1234',keyCompetitive: 'm1234',charterInitDate: '2025-01-02 00:00:00',charterTransferDate: '2025-02-02 00:00:00',pdcpDate: '2025-03-02 00:00:00',tr4aDate: '2025-04-02 00:00:00',edcpDate: '2025-05-02 00:00:00',adcpDate: '2025-07-02 00:00:00',insightFinishDate: '2025-09-02 00:00:00',relateOfferingName: null,rerlationshipName: null,serviceSolution: null,belongSolutionName: null,productClassL3Name: null,productSeriesL4Name: null,productOfferingL5Name: null,productBelongGroupsName: null,productBelongSpdtName: null,charterClass: null,charterTransferVersionTypeName: null,decisionLevelName: null,priorityName: null,businessPropertyName: null,bak: null,verison: null,state: 1,createUser: null,updatedUser: null,milestones: [{id: 'm12345678-1',pCode: 'm12345678',startDate: '2025-01-02',endDate: '2025-02-02',text: 'Charter开发',milestonskey: 'CHARTER_DEVELOPMENT',parent: 'm12345678',start_date: '2025-01-02',end_date: '2025-02-02',},{id: 'm12345678-2',pCode: 'm12345678',startDate: '2025-02-02',endDate: '2025-03-02',text: '概念和计划',milestonskey: 'CONCEPT_AND_PLAN',parent: 'm12345678',start_date: '2025-02-02',end_date: '2025-03-02',},{id: 'm12345678-3',pCode: 'm12345678',startDate: '2025-03-02',endDate: '2025-04-02',text: '初样开发',milestonskey: 'INITIAL_SAMPLE_DEVELOPMENT',parent: 'm12345678',start_date: '2025-03-02',end_date: '2025-04-02',},{id: 'm12345678-4',pCode: 'm12345678',startDate: '2025-04-02',endDate: '2025-05-02',text: '正样开发',milestonskey: 'PROTOTYPE_DEVELOPMENT',parent: 'm12345678',start_date: '2025-04-02',end_date: '2025-05-02',},{id: 'm12345678-5',pCode: 'm12345678',startDate: '2025-05-02',endDate: '2025-07-02',text: '验证',milestonskey: 'VERIFY',parent: 'm12345678',start_date: '2025-05-02',end_date: '2025-07-02',},],children: null,parent: 'm1234',render: 'split',isChildrenNode: true,},],id: 'm1234',color: '#c7cfd8',text: '',},{id: 'm1234567-1',pCode: 'm1234567',startDate: '2025-01-02',endDate: '2025-02-02',text: 'Charter开发',milestonskey: 'CHARTER_DEVELOPMENT',parent: 'm1234567',start_date: '2025-01-02',end_date: '2025-02-02',color: '#adbbff',},{id: 'm1234567-2',pCode: 'm1234567',startDate: '2025-02-02',endDate: '2025-03-02',text: '概念和计划',milestonskey: 'CONCEPT_AND_PLAN',parent: 'm1234567',start_date: '2025-02-02',end_date: '2025-03-02',color: '#ffe179',},{id: 'm1234567-3',pCode: 'm1234567',startDate: '2025-03-02',endDate: '2025-04-02',text: '初样开发',milestonskey: 'INITIAL_SAMPLE_DEVELOPMENT',parent: 'm1234567',start_date: '2025-03-02',end_date: '2025-04-02',color: '#adbbff',},{id: 'm1234567-4',pCode: 'm1234567',startDate: '2025-04-02',endDate: '2025-05-02',text: '正样开发',milestonskey: 'PROTOTYPE_DEVELOPMENT',parent: 'm1234567',start_date: '2025-04-02',end_date: '2025-05-02',color: '#92d9fb',},{id: 'm1234567-5',pCode: 'm1234567',startDate: '2025-05-02',endDate: '2025-09-02',text: '验证',milestonskey: 'VERIFY',parent: 'm1234567',start_date: '2025-05-02',end_date: '2025-09-02',color: '#64e0b7',},{bid: 4,pCode: 'm1234',type: 2,code: 'm1234567',name: 'm1234',projectRank: 'm1234',marketPositioning: 'm1234',costBenchmarking: 'm1234',performanceBenchmark: 'm1234',targetAudienceName: 'm1234',focusedIndustriesAndClientsName: 'm1234',newReachableCapacity: 'm1234',preparationOfKeyTechnologies: null,valueProposition: 'm1234',keyCompetitive: 'm1234',charterInitDate: '2025-01-02 00:00:00',charterTransferDate: '2025-02-02 00:00:00',pdcpDate: '2025-03-02 00:00:00',tr4aDate: '2025-04-02 00:00:00',edcpDate: '2025-05-02 00:00:00',adcpDate: '2025-09-02 00:00:00',insightFinishDate: '2025-09-02 00:00:00',relateOfferingName: null,rerlationshipName: null,serviceSolution: null,belongSolutionName: null,productClassL3Name: null,productSeriesL4Name: null,productOfferingL5Name: null,productBelongGroupsName: null,productBelongSpdtName: null,charterClass: null,charterTransferVersionTypeName: null,decisionLevelName: null,priorityName: null,businessPropertyName: null,bak: null,verison: null,state: 1,createUser: null,updatedUser: null,milestones: [{id: 'm1234567-1',pCode: 'm1234567',startDate: '2025-01-02',endDate: '2025-02-02',text: 'Charter开发',milestonskey: 'CHARTER_DEVELOPMENT',parent: 'm1234567',start_date: '2025-01-02',end_date: '2025-02-02',},{id: 'm1234567-2',pCode: 'm1234567',startDate: '2025-02-02',endDate: '2025-03-02',text: '概念和计划',milestonskey: 'CONCEPT_AND_PLAN',parent: 'm1234567',start_date: '2025-02-02',end_date: '2025-03-02',},{id: 'm1234567-3',pCode: 'm1234567',startDate: '2025-03-02',endDate: '2025-04-02',text: '初样开发',milestonskey: 'INITIAL_SAMPLE_DEVELOPMENT',parent: 'm1234567',start_date: '2025-03-02',end_date: '2025-04-02',},{id: 'm1234567-4',pCode: 'm1234567',startDate: '2025-04-02',endDate: '2025-05-02',text: '正样开发',milestonskey: 'PROTOTYPE_DEVELOPMENT',parent: 'm1234567',start_date: '2025-04-02',end_date: '2025-05-02',},{id: 'm1234567-5',pCode: 'm1234567',startDate: '2025-05-02',endDate: '2025-09-02',text: '验证',milestonskey: 'VERIFY',parent: 'm1234567',start_date: '2025-05-02',end_date: '2025-09-02',},],children: null,parent: 'm1234',render: 'split',isChildrenNode: true,id: 'm1234567',},{id: 'm12345678-1',pCode: 'm12345678',startDate: '2025-01-02',endDate: '2025-02-02',text: 'Charter开发',milestonskey: 'CHARTER_DEVELOPMENT',parent: 'm12345678',start_date: '2025-01-02',end_date: '2025-02-02',color: '#adbbff',},{id: 'm12345678-2',pCode: 'm12345678',startDate: '2025-02-02',endDate: '2025-03-02',text: '概念和计划',milestonskey: 'CONCEPT_AND_PLAN',parent: 'm12345678',start_date: '2025-02-02',end_date: '2025-03-02',color: '#ffe179',},{id: 'm12345678-3',pCode: 'm12345678',startDate: '2025-03-02',endDate: '2025-04-02',text: '初样开发',milestonskey: 'INITIAL_SAMPLE_DEVELOPMENT',parent: 'm12345678',start_date: '2025-03-02',end_date: '2025-04-02',color: '#adbbff',},{id: 'm12345678-4',pCode: 'm12345678',startDate: '2025-04-02',endDate: '2025-05-02',text: '正样开发',milestonskey: 'PROTOTYPE_DEVELOPMENT',parent: 'm12345678',start_date: '2025-04-02',end_date: '2025-05-02',color: '#92d9fb',},{id: 'm12345678-5',pCode: 'm12345678',startDate: '2025-05-02',endDate: '2025-07-02',text: '验证',milestonskey: 'VERIFY',parent: 'm12345678',start_date: '2025-05-02',end_date: '2025-07-02',color: '#64e0b7',},{bid: 5,pCode: 'm1234',type: 2,code: 'm12345678',name: 'm1234',projectRank: 'm1234',marketPositioning: 'm1234',costBenchmarking: 'm1234',performanceBenchmark: 'm1234',targetAudienceName: 'm1234',focusedIndustriesAndClientsName: 'm1234',newReachableCapacity: 'm1234',preparationOfKeyTechnologies: null,valueProposition: 'm1234',keyCompetitive: 'm1234',charterInitDate: '2025-01-02 00:00:00',charterTransferDate: '2025-02-02 00:00:00',pdcpDate: '2025-03-02 00:00:00',tr4aDate: '2025-04-02 00:00:00',edcpDate: '2025-05-02 00:00:00',adcpDate: '2025-07-02 00:00:00',insightFinishDate: '2025-09-02 00:00:00',relateOfferingName: null,rerlationshipName: null,serviceSolution: null,belongSolutionName: null,productClassL3Name: null,productSeriesL4Name: null,productOfferingL5Name: null,productBelongGroupsName: null,productBelongSpdtName: null,charterClass: null,charterTransferVersionTypeName: null,decisionLevelName: null,priorityName: null,businessPropertyName: null,bak: null,verison: null,state: 1,createUser: null,updatedUser: null,milestones: [{id: 'm12345678-1',pCode: 'm12345678',startDate: '2025-01-02',endDate: '2025-02-02',text: 'Charter开发',milestonskey: 'CHARTER_DEVELOPMENT',parent: 'm12345678',start_date: '2025-01-02',end_date: '2025-02-02',},{id: 'm12345678-2',pCode: 'm12345678',startDate: '2025-02-02',endDate: '2025-03-02',text: '概念和计划',milestonskey: 'CONCEPT_AND_PLAN',parent: 'm12345678',start_date: '2025-02-02',end_date: '2025-03-02',},{id: 'm12345678-3',pCode: 'm12345678',startDate: '2025-03-02',endDate: '2025-04-02',text: '初样开发',milestonskey: 'INITIAL_SAMPLE_DEVELOPMENT',parent: 'm12345678',start_date: '2025-03-02',end_date: '2025-04-02',},{id: 'm12345678-4',pCode: 'm12345678',startDate: '2025-04-02',endDate: '2025-05-02',text: '正样开发',milestonskey: 'PROTOTYPE_DEVELOPMENT',parent: 'm12345678',start_date: '2025-04-02',end_date: '2025-05-02',},{id: 'm12345678-5',pCode: 'm12345678',startDate: '2025-05-02',endDate: '2025-07-02',text: '验证',milestonskey: 'VERIFY',parent: 'm12345678',start_date: '2025-05-02',end_date: '2025-07-02',},],children: null,parent: 'm1234',render: 'split',isChildrenNode: true,id: 'm12345678',},{id: 'm12345-1',pCode: 'm12345',startDate: '2025-01-02',endDate: '2025-02-02',text: 'Charter开发',milestonskey: 'CHARTER_DEVELOPMENT',parent: 'm12345',start_date: '2025-01-02',end_date: '2025-02-02',color: '#adbbff',},{id: 'm12345-2',pCode: 'm12345',startDate: '2025-02-02',endDate: '2025-03-02',text: '概念和计划',milestonskey: 'CONCEPT_AND_PLAN',parent: 'm12345',start_date: '2025-02-02',end_date: '2025-03-02',color: '#ffe179',},{id: 'm12345-3',pCode: 'm12345',startDate: '2025-03-02',endDate: '2025-04-02',text: '初样开发',milestonskey: 'INITIAL_SAMPLE_DEVELOPMENT',parent: 'm12345',start_date: '2025-03-02',end_date: '2025-04-02',color: '#adbbff',},{id: 'm12345-4',pCode: 'm12345',startDate: '2025-04-02',endDate: '2025-05-02',text: '正样开发',milestonskey: 'PROTOTYPE_DEVELOPMENT',parent: 'm12345',start_date: '2025-04-02',end_date: '2025-05-02',color: '#92d9fb',},{id: 'm12345-5',pCode: 'm12345',startDate: '2025-05-02',endDate: '2025-06-02',text: '验证',milestonskey: 'VERIFY',parent: 'm12345',start_date: '2025-05-02',end_date: '2025-06-02',color: '#64e0b7',},{bid: 2,pCode: '0',type: 2,code: 'm12345',name: 'm1234',projectRank: 'm1234',marketPositioning: 'm1234',costBenchmarking: 'm1234',performanceBenchmark: 'm1234',targetAudienceName: 'm1234',focusedIndustriesAndClientsName: 'm1234',newReachableCapacity: 'm1234',preparationOfKeyTechnologies: null,valueProposition: 'm1234',keyCompetitive: 'm1234',charterInitDate: '2025-01-02 00:00:00',charterTransferDate: '2025-02-02 00:00:00',pdcpDate: '2025-03-02 00:00:00',tr4aDate: '2025-04-02 00:00:00',edcpDate: '2025-05-02 00:00:00',adcpDate: '2025-06-02 00:00:00',insightFinishDate: '2025-07-02 00:00:00',relateOfferingName: null,rerlationshipName: null,serviceSolution: null,belongSolutionName: null,productClassL3Name: null,productSeriesL4Name: null,productOfferingL5Name: null,productBelongGroupsName: null,productBelongSpdtName: null,charterClass: null,charterTransferVersionTypeName: null,decisionLevelName: null,priorityName: null,businessPropertyName: null,bak: null,verison: null,state: 1,createUser: null,updatedUser: null,milestones: [{id: 'm12345-1',pCode: 'm12345',startDate: '2025-01-02',endDate: '2025-02-02',text: 'Charter开发',milestonskey: 'CHARTER_DEVELOPMENT',parent: 'm12345',start_date: '2025-01-02',end_date: '2025-02-02',},{id: 'm12345-2',pCode: 'm12345',startDate: '2025-02-02',endDate: '2025-03-02',text: '概念和计划',milestonskey: 'CONCEPT_AND_PLAN',parent: 'm12345',start_date: '2025-02-02',end_date: '2025-03-02',},{id: 'm12345-3',pCode: 'm12345',startDate: '2025-03-02',endDate: '2025-04-02',text: '初样开发',milestonskey: 'INITIAL_SAMPLE_DEVELOPMENT',parent: 'm12345',start_date: '2025-03-02',end_date: '2025-04-02',},{id: 'm12345-4',pCode: 'm12345',startDate: '2025-04-02',endDate: '2025-05-02',text: '正样开发',milestonskey: 'PROTOTYPE_DEVELOPMENT',parent: 'm12345',start_date: '2025-04-02',end_date: '2025-05-02',},{id: 'm12345-5',pCode: 'm12345',startDate: '2025-05-02',endDate: '2025-06-02',text: '验证',milestonskey: 'VERIFY',parent: 'm12345',start_date: '2025-05-02',end_date: '2025-06-02',},],children: null,render: 'split',id: 'm12345',},{id: 'm12346-1',pCode: 'm12346',startDate: '2025-01-02',endDate: '2025-02-02',text: 'Charter开发',milestonskey: 'CHARTER_DEVELOPMENT',parent: 'm12346',start_date: '2025-01-02',end_date: '2025-02-02',color: '#adbbff',},{id: 'm12346-2',pCode: 'm12346',startDate: '2025-02-02',endDate: '2025-03-02',text: '概念和计划',milestonskey: 'CONCEPT_AND_PLAN',parent: 'm12346',start_date: '2025-02-02',end_date: '2025-03-02',color: '#ffe179',},{id: 'm12346-3',pCode: 'm12346',startDate: '2025-03-02',endDate: '2025-04-02',text: '初样开发',milestonskey: 'INITIAL_SAMPLE_DEVELOPMENT',parent: 'm12346',start_date: '2025-03-02',end_date: '2025-04-02',color: '#adbbff',},{id: 'm12346-4',pCode: 'm12346',startDate: '2025-04-02',endDate: '2025-05-02',text: '正样开发',milestonskey: 'PROTOTYPE_DEVELOPMENT',parent: 'm12346',start_date: '2025-04-02',end_date: '2025-05-02',color: '#92d9fb',},{id: 'm12346-5',pCode: 'm12346',startDate: '2025-05-02',endDate: '2025-08-02',text: '验证',milestonskey: 'VERIFY',parent: 'm12346',start_date: '2025-05-02',end_date: '2025-08-02',color: '#64e0b7',},{bid: 3,pCode: '0',type: 2,code: 'm12346',name: 'm1234',projectRank: 'm1234',marketPositioning: 'm1234',costBenchmarking: 'm1234',performanceBenchmark: 'm1234',targetAudienceName: 'm1234',focusedIndustriesAndClientsName: 'm1234',newReachableCapacity: 'm1234',preparationOfKeyTechnologies: null,valueProposition: 'm1234',keyCompetitive: 'm1234',charterInitDate: '2025-01-02 00:00:00',charterTransferDate: '2025-02-02 00:00:00',pdcpDate: '2025-03-02 00:00:00',tr4aDate: '2025-04-02 00:00:00',edcpDate: '2025-05-02 00:00:00',adcpDate: '2025-08-02 00:00:00',insightFinishDate: '2025-09-02 00:00:00',relateOfferingName: null,rerlationshipName: null,serviceSolution: null,belongSolutionName: null,productClassL3Name: null,productSeriesL4Name: null,productOfferingL5Name: null,productBelongGroupsName: null,productBelongSpdtName: null,charterClass: null,charterTransferVersionTypeName: null,decisionLevelName: null,priorityName: null,businessPropertyName: null,bak: null,verison: null,state: 1,createUser: null,updatedUser: null,milestones: [{id: 'm12346-1',pCode: 'm12346',startDate: '2025-01-02',endDate: '2025-02-02',text: 'Charter开发',milestonskey: 'CHARTER_DEVELOPMENT',parent: 'm12346',start_date: '2025-01-02',end_date: '2025-02-02',},{id: 'm12346-2',pCode: 'm12346',startDate: '2025-02-02',endDate: '2025-03-02',text: '概念和计划',milestonskey: 'CONCEPT_AND_PLAN',parent: 'm12346',start_date: '2025-02-02',end_date: '2025-03-02',},{id: 'm12346-3',pCode: 'm12346',startDate: '2025-03-02',endDate: '2025-04-02',text: '初样开发',milestonskey: 'INITIAL_SAMPLE_DEVELOPMENT',parent: 'm12346',start_date: '2025-03-02',end_date: '2025-04-02',},{id: 'm12346-4',pCode: 'm12346',startDate: '2025-04-02',endDate: '2025-05-02',text: '正样开发',milestonskey: 'PROTOTYPE_DEVELOPMENT',parent: 'm12346',start_date: '2025-04-02',end_date: '2025-05-02',},{id: 'm12346-5',pCode: 'm12346',startDate: '2025-05-02',endDate: '2025-08-02',text: '验证',milestonskey: 'VERIFY',parent: 'm12346',start_date: '2025-05-02',end_date: '2025-08-02',},],children: null,render: 'split',id: 'm12346',},],
};


http://www.mrgr.cn/news/93170.html

相关文章:

  • 解决redis lettuce连接池经常出现连接拒绝(Connection refused)问题
  • linux一些使用技巧
  • C#将Box企业网盘里的文件批量上载到S3,并导入Redshift
  • C/C++中函数指针和指针函数的原理和区别是什么,分别通过用例说明。
  • Docker 学习(三)——数据管理、端口映射、容器互联
  • Clion快捷键、修改字体
  • 代码贴——堆(二叉树)数据结构
  • JVM简单了解
  • 面试150,数组 / 字符串
  • 通义万相2.1:开启视频生成新时代
  • C++并发以及多线程的秘密
  • 复试准备日常
  • Spring项目中常用操作记录
  • Linux搭建个人大模型RAG-(ollama+deepseek+anythingLLM)
  • Rust编程实战:初探WebAssembly
  • 爬虫Incapsula reese84加密案例:Etihad航空
  • 【第12节】C++设计模式(结构型模式)-Proxy(代理)模式
  • 9道Dubbo面试题
  • Excel-to-JSON v2.0.0发布,可以在Excel内部,把Excel表格转换成JSON,嵌套的JSON也能转
  • 【笔记ing】python