diff --git a/.collaboration b/.collaboration index f919ade7..02fa47f7 100644 --- a/.collaboration +++ b/.collaboration @@ -2270,19 +2270,7 @@ }, { "ModuleName": "PCPage/工作台首页", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2024-11-05T14:40:53.2791153+08:00", - "ModuleType": 1, - "ToRemoveFiles": [ - "Pages\\工作台\\工作台首页.json", - "Pages\\工作台\\工作台首页.rd", - "Pages\\3868fc7f40b841649f14b5adba61954.json", - "Pages\\3868fc7f40b841649f14b5adba61954.rd" - ] + "ModuleType": 1 }, { "ModuleName": "PCPage/项目负荷 (2)", diff --git a/Pages/工作台/工作台首页.json b/Pages/工作台/工作台首页.json index 440a41b5..07e920b6 100644 --- a/Pages/工作台/工作台首页.json +++ b/Pages/工作台/工作台首页.json @@ -285,11 +285,6 @@ } }, "35": { - "GridRowColumnDefinition": { - "DesignLengthInPixel": 32.0 - } - }, - "36": { "GridRowColumnDefinition": { "DesignLengthInPixel": 32.0, "Mode": 2, @@ -301,42 +296,42 @@ } } }, - "37": { + "36": { "GridRowColumnDefinition": { "DesignLengthInPixel": 10.0 } }, - "38": { + "37": { "GridRowColumnDefinition": { "DesignLengthInPixel": 15.0 } }, - "39": { + "38": { "GridRowColumnDefinition": { "DesignLengthInPixel": 313.0 } }, - "40": { + "39": { "GridRowColumnDefinition": { "DesignLengthInPixel": 15.0 } }, - "41": { + "40": { "GridRowColumnDefinition": { "DesignLengthInPixel": 24.0 } } }, - "Count": 42, + "Count": 41, "DefaultSize": 32.0 }, "Values": { "1,1": "工作台_关键信息", - "1,38": "公告栏", + "1,37": "公告栏", "3,1": "工作台_快捷入口", "5,1": "工时折线图", - "6,39": "项目动态", - "8,39": "项目动态", + "6,38": "项目动态", + "8,38": "项目动态", "10,1": "工时排行榜(柱形图)", "12,1": "反馈统计(饼图+表格)" }, @@ -430,7 +425,7 @@ "Config": "{\"option\":\"let completeXAxisData = []; \\nlet completePlanData = []; // 计划工时数据 \\nlet completeActualData = []; // 实际工时数据 \\n\\n// 打印数据源以进行检查 \\nconsole.log(\\\"Context['工时表']:\\\", Context[\\\"工时表\\\"]); \\n\\n// 按工时类型分组数据 \\nconst groupedData = {}; \\nContext[\\\"工时表\\\"].forEach(item => { \\n if (!groupedData[item[\\\"工时类型\\\"]]) { \\n groupedData[item[\\\"工时类型\\\"]] = { \\n dates: [], \\n hours: [] \\n }; \\n } \\n groupedData[item[\\\"工时类型\\\"]].dates.push(item[\\\"日期\\\"]); \\n groupedData[item[\\\"工时类型\\\"]].hours.push(item[\\\"总工时\\\"]); \\n}); \\n\\n// 日期格式化函数保持不变 \\nfunction getDateFormat(value) { \\n if (typeof value === \\\"number\\\") { \\n const excelEpoch = new Date(Date.UTC(1899, 11, 30)); \\n const date = new Date(excelEpoch.getTime() + value * 24 * 60 * 60 * 1000); \\n const year = date.getUTCFullYear(); \\n const month = (date.getUTCMonth() + 1).toString().padStart(2, \\\"0\\\"); \\n const day = date.getUTCDate().toString().padStart(2, \\\"0\\\"); \\n return `${year}-${month}-${day}`; \\n } else if (typeof value === \\\"string\\\") { \\n return value; \\n } \\n return \\\"\\\"; \\n} \\n\\n// 生成日期范围函数保持不变 \\nfunction getDateRange(startDate, endDate) { \\n const dateList = []; \\n let currentDate = new Date(startDate); \\n while (currentDate <= endDate) { \\n const year = currentDate.getFullYear(); \\n const month = (\\\"0\\\" + (currentDate.getMonth() + 1)).slice(-2); \\n const day = (\\\"0\\\" + currentDate.getDate()).slice(-2); \\n dateList.push(`${year}-${month}-${day}`); \\n currentDate.setDate(currentDate.getDate() + 1); \\n } \\n return dateList; \\n} \\n\\n// 获取所有日期并找出最大最小日期 \\nconst allDates = []; \\nObject.values(groupedData).forEach(data => { \\n data.dates.forEach(date => { \\n allDates.push(new Date(getDateFormat(date))); \\n }); \\n}); \\n\\nif (allDates.length > 0) { \\n const minDate = new Date(Math.min(...allDates)); \\n const maxDate = new Date(Math.max(...allDates)); \\n completeXAxisData = getDateRange(minDate, maxDate); \\n\\n // 处理每种类型的数据 \\n Object.entries(groupedData).forEach(([type, data]) => { \\n // 格式化日期 \\n const formattedDates = data.dates.map(date => getDateFormat(date)); \\n \\n // 创建日期-工时映射 \\n const dataMap = {}; \\n formattedDates.forEach((date, index) => { \\n dataMap[date] = data.hours[index]; \\n }); \\n\\n // 补全数据 \\n const completeData = completeXAxisData.map(date => { \\n return dataMap[date] !== undefined ? dataMap[date] : 0; \\n }); \\n\\n // 根据类型存储数据 \\n if (type === \\\"计划\\\") { \\n completePlanData = completeData; \\n } else if (type === \\\"实际\\\") { \\n completeActualData = completeData; \\n } \\n }); \\n} \\n\\n// 配置 Echarts 图表 \\noption = { \\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\", \\n title: { \\n text: \\\"报工趋势图 (近30天)\\\", \\n left: \\\"center\\\", \\n top: 24, \\n textStyle: { \\n fontSize: 16, \\n fontWeight: \\\"bold\\\", \\n }, \\n }, \\n legend: { \\n data: ['计划工时', '实际工时'], \\n top: 60, \\n textStyle: { \\n color: '#666' \\n } \\n }, \\n grid: { \\n top: 100, // 增加top值以适应legend \\n left: \\\"24px\\\", \\n right: \\\"24px\\\", \\n bottom: \\\"24px\\\", \\n containLabel: true, \\n }, \\n xAxis: { \\n type: \\\"category\\\", \\n data: completeXAxisData, \\n axisLabel: { \\n color: \\\"#abacac\\\", \\n }, \\n axisLine: { \\n lineStyle: { \\n color: \\\"#f5f6f6\\\", \\n }, \\n }, \\n axisTick: { \\n lineStyle: { \\n color: \\\"#f5f6f6\\\", \\n }, \\n }, \\n }, \\n yAxis: { \\n type: \\\"value\\\", \\n axisLabel: { \\n color: \\\"#abacac\\\", \\n }, \\n axisLine: { \\n lineStyle: { \\n color: \\\"#f5f6f6\\\", \\n }, \\n }, \\n axisTick: { \\n lineStyle: { \\n color: \\\"#f5f6f6\\\", \\n }, \\n }, \\n splitLine: { \\n show: true, \\n lineStyle: { \\n color: \\\"#f8fafc\\\", \\n }, \\n }, \\n }, \\n tooltip: { \\n trigger: \\\"axis\\\", \\n backgroundColor: \\\"#FFFFFF\\\", \\n textStyle: { \\n color: \\\"#000000\\\", \\n }, \\n }, \\n series: [ \\n { \\n name: '计划工时', \\n data: completePlanData, \\n type: \\\"line\\\", \\n lineStyle: { \\n width: 3, \\n shadowColor: \\\"rgba(0, 0, 0, 0.1)\\\", \\n shadowBlur: 10, \\n shadowOffsetX: 0, \\n shadowOffsetY: 4, \\n }, \\n smooth: true, \\n symbolSize: 8, \\n symbol: \\\"none\\\", \\n itemStyle: { \\n color: \\\"#2196f3\\\", // 蓝色 \\n }, \\n areaStyle: { \\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ \\n { \\n offset: 0, \\n color: \\\"rgba(33,150,243,0.3)\\\", \\n }, \\n { \\n offset: 1, \\n color: \\\"rgba(33,150,243,0)\\\", \\n }, \\n ]), \\n }, \\n }, \\n { \\n name: '实际工时', \\n data: completeActualData, \\n type: \\\"line\\\", \\n lineStyle: { \\n width: 3, \\n shadowColor: \\\"rgba(0, 0, 0, 0.1)\\\", \\n shadowBlur: 10, \\n shadowOffsetX: 0, \\n shadowOffsetY: 4, \\n }, \\n smooth: true, \\n symbolSize: 8, \\n symbol: \\\"none\\\", \\n itemStyle: { \\n color: \\\"#ff5722\\\", // 橙色 \\n }, \\n areaStyle: { \\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ \\n { \\n offset: 0, \\n color: \\\"rgba(255,87,34,0.3)\\\", \\n }, \\n { \\n offset: 1, \\n color: \\\"rgba(255,87,34,0)\\\", \\n }, \\n ]), \\n }, \\n } \\n ], \\n};\",\"graphTheme\":null,\"displayMode\":\"canvas\",\"jsCode\":\"\\n async ({Context,JSONContext,ImageContext,echarts,myChart,dat,Forguncy,d3,setInterval,setTimeout,ForguncyEchartsHelper,PublicResource})=>{\\n var datGUI=undefined;\\n var option={};\\n let completeXAxisData = [];\\nlet completePlanData = []; // 计划工时数据 \\nlet completeActualData = []; // 实际工时数据 \\n// 打印数据源以进行检查 \\nconsole.log(\\\"Context['工时表']:\\\", Context[\\\"工时表\\\"]);\\n// 按工时类型分组数据 \\nconst groupedData = {};\\nContext[\\\"工时表\\\"].forEach(item => {\\n if (!groupedData[item[\\\"工时类型\\\"]]) {\\n groupedData[item[\\\"工时类型\\\"]] = {\\n dates: [],\\n hours: []\\n };\\n }\\n groupedData[item[\\\"工时类型\\\"]].dates.push(item[\\\"日期\\\"]);\\n groupedData[item[\\\"工时类型\\\"]].hours.push(item[\\\"总工时\\\"]);\\n});\\n// 日期格式化函数保持不变 \\nfunction getDateFormat(value) {\\n if (typeof value === \\\"number\\\") {\\n const excelEpoch = new Date(Date.UTC(1899, 11, 30));\\n const date = new Date(excelEpoch.getTime() + value * 24 * 60 * 60 * 1000);\\n const year = date.getUTCFullYear();\\n const month = (date.getUTCMonth() + 1).toString().padStart(2, \\\"0\\\");\\n const day = date.getUTCDate().toString().padStart(2, \\\"0\\\");\\n return `${year}-${month}-${day}`;\\n }\\n else if (typeof value === \\\"string\\\") {\\n return value;\\n }\\n return \\\"\\\";\\n}\\n// 生成日期范围函数保持不变 \\nfunction getDateRange(startDate, endDate) {\\n const dateList = [];\\n let currentDate = new Date(startDate);\\n while (currentDate <= endDate) {\\n const year = currentDate.getFullYear();\\n const month = (\\\"0\\\" + (currentDate.getMonth() + 1)).slice(-2);\\n const day = (\\\"0\\\" + currentDate.getDate()).slice(-2);\\n dateList.push(`${year}-${month}-${day}`);\\n currentDate.setDate(currentDate.getDate() + 1);\\n }\\n return dateList;\\n}\\n// 获取所有日期并找出最大最小日期 \\nconst allDates = [];\\nObject.values(groupedData).forEach(data => {\\n data.dates.forEach(date => {\\n allDates.push(new Date(getDateFormat(date)));\\n });\\n});\\nif (allDates.length > 0) {\\n const minDate = new Date(Math.min(...allDates));\\n const maxDate = new Date(Math.max(...allDates));\\n completeXAxisData = getDateRange(minDate, maxDate);\\n // 处理每种类型的数据 \\n Object.entries(groupedData).forEach(([type, data]) => {\\n // 格式化日期 \\n const formattedDates = data.dates.map(date => getDateFormat(date));\\n // 创建日期-工时映射 \\n const dataMap = {};\\n formattedDates.forEach((date, index) => {\\n dataMap[date] = data.hours[index];\\n });\\n // 补全数据 \\n const completeData = completeXAxisData.map(date => {\\n return dataMap[date] !== undefined ? dataMap[date] : 0;\\n });\\n // 根据类型存储数据 \\n if (type === \\\"计划\\\") {\\n completePlanData = completeData;\\n }\\n else if (type === \\\"实际\\\") {\\n completeActualData = completeData;\\n }\\n });\\n}\\n// 配置 Echarts 图表 \\noption = {\\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\",\\n title: {\\n text: \\\"报工趋势图 (近30天)\\\",\\n left: \\\"center\\\",\\n top: 24,\\n textStyle: {\\n fontSize: 16,\\n fontWeight: \\\"bold\\\",\\n },\\n },\\n legend: {\\n data: ['计划工时', '实际工时'],\\n top: 60,\\n textStyle: {\\n color: '#666'\\n }\\n },\\n grid: {\\n top: 100,\\n left: \\\"24px\\\",\\n right: \\\"24px\\\",\\n bottom: \\\"24px\\\",\\n containLabel: true,\\n },\\n xAxis: {\\n type: \\\"category\\\",\\n data: completeXAxisData,\\n axisLabel: {\\n color: \\\"#abacac\\\",\\n },\\n axisLine: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n axisTick: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n },\\n yAxis: {\\n type: \\\"value\\\",\\n axisLabel: {\\n color: \\\"#abacac\\\",\\n },\\n axisLine: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n axisTick: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n splitLine: {\\n show: true,\\n lineStyle: {\\n color: \\\"#f8fafc\\\",\\n },\\n },\\n },\\n tooltip: {\\n trigger: \\\"axis\\\",\\n backgroundColor: \\\"#FFFFFF\\\",\\n textStyle: {\\n color: \\\"#000000\\\",\\n },\\n },\\n series: [\\n {\\n name: '计划工时',\\n data: completePlanData,\\n type: \\\"line\\\",\\n lineStyle: {\\n width: 3,\\n shadowColor: \\\"rgba(0, 0, 0, 0.1)\\\",\\n shadowBlur: 10,\\n shadowOffsetX: 0,\\n shadowOffsetY: 4,\\n },\\n smooth: true,\\n symbolSize: 8,\\n symbol: \\\"none\\\",\\n itemStyle: {\\n color: \\\"#2196f3\\\", // 蓝色 \\n },\\n areaStyle: {\\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\\n {\\n offset: 0,\\n color: \\\"rgba(33,150,243,0.3)\\\",\\n },\\n {\\n offset: 1,\\n color: \\\"rgba(33,150,243,0)\\\",\\n },\\n ]),\\n },\\n },\\n {\\n name: '实际工时',\\n data: completeActualData,\\n type: \\\"line\\\",\\n lineStyle: {\\n width: 3,\\n shadowColor: \\\"rgba(0, 0, 0, 0.1)\\\",\\n shadowBlur: 10,\\n shadowOffsetX: 0,\\n shadowOffsetY: 4,\\n },\\n smooth: true,\\n symbolSize: 8,\\n symbol: \\\"none\\\",\\n itemStyle: {\\n color: \\\"#ff5722\\\", // 橙色 \\n },\\n areaStyle: {\\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\\n {\\n offset: 0,\\n color: \\\"rgba(255,87,34,0.3)\\\",\\n },\\n {\\n offset: 1,\\n color: \\\"rgba(255,87,34,0)\\\",\\n },\\n ]),\\n },\\n }\\n ],\\n};\\n\\n return {\\n option,\\n datGUI,\\n };\\n }\\n \"}" } }, - "8,39": { + "8,38": { "CellType": { "$type": "Forguncy.RepeaterCellType, ServerDesignerCommon", "TemplatePageName": "3868fc7f40b841649f14b5adba61954", @@ -689,7 +684,7 @@ ], "JSONDataSources": [], "ImageDataSource": [], - "Config": "{\"option\":\"console.log(Context[\\\"recommands\\\"]);\\n\\n// 处理数据,生成节点和链接 \\nconst processData = (data) => {\\n // 收集所有唯一的节点 \\n const typeSet = new Set(data.map(item => item.类型 || \\\"其他\\\"));\\n const projectSet = new Set(data.map(item => item.项目 || \\\"未知项目\\\"));\\n const taskSet = new Set(data.map(item => item.任务 || \\\"未知任务\\\"));\\n\\n // 预计算每个节点的总值 \\n const nodeValues = {};\\n\\n // 计算类型节点的值 \\n data.forEach(item => {\\n nodeValues[item.类型] = (nodeValues[item.类型] || 0) + item.数量;\\n nodeValues[item.项目] = (nodeValues[item.项目] || 0) + item.数量;\\n nodeValues[item.任务] = (nodeValues[item.任务] || 0) + item.数量;\\n });\\n\\n // 生成节点数组,确保节点按照类型、项目、任务的顺序排列 \\n const nodes = [\\n // 类型节点 \\n ...Array.from(typeSet).map((name) => ({\\n name: name,\\n depth: 0,\\n value: nodeValues[name], // 添加value值 \\n itemStyle: {\\n color: '#2196f3'\\n }\\n })),\\n // 项目节点 \\n ...Array.from(projectSet).map((name) => ({\\n name: name,\\n depth: 1,\\n value: nodeValues[name], // 添加value值 \\n itemStyle: {\\n color: '#ff5722'\\n }\\n })),\\n // 任务节点 \\n ...Array.from(taskSet).map((name) => ({\\n name: name,\\n depth: 2,\\n value: nodeValues[name], // 添加value值 \\n itemStyle: {\\n color: '#4caf50'\\n }\\n }))\\n ];\\n\\n // 生成连接数组 \\n const links = [];\\n\\n // 类型 -> 项目的链接 \\n data.forEach(item => {\\n const existingLink = links.find(\\n link => link.source === item.类型 && link.target === item.项目\\n );\\n if (existingLink) {\\n existingLink.value += item.数量;\\n } else {\\n links.push({\\n source: item.类型,\\n target: item.项目,\\n value: item.数量\\n });\\n }\\n });\\n\\n // 项目 -> 任务的链接 \\n data.forEach(item => {\\n const existingLink = links.find(\\n link => link.source === item.项目 && link.target === item.任务\\n );\\n if (existingLink) {\\n existingLink.value += item.数量;\\n } else {\\n links.push({\\n source: item.项目,\\n target: item.任务,\\n value: item.数量\\n });\\n }\\n });\\n\\n return { nodes, links };\\n};\\n\\n//获取提示文字\\nconst gettooltip = (params) => {\\n console.log(params);\\n if (params.dataType === 'node') {\\n return `${params.name}\\\\n数量: ${params.value}`;\\n }\\n return `${params.data.source} → ${params.data.target}\\\\n数量: ${params.value}`;\\n}\\n\\n// 处理数据 \\nconst { nodes, links } = processData(Context[\\\"recommands\\\"]);\\n\\n// Echarts配置 \\noption = {\\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\",\\n title: {\\n text: \\\"项目反馈桑基图\\\",\\n left: \\\"center\\\",\\n top: 24,\\n textStyle: {\\n fontSize: 16,\\n fontWeight: \\\"bold\\\",\\n },\\n },\\n tooltip: {\\n trigger: 'item',\\n triggerOn: 'mousemove',\\n backgroundColor: '#fff',\\n borderColor: '#eee',\\n borderWidth: 1,\\n textStyle: {\\n color: '#333'\\n },\\n formatter: gettooltip\\n },\\n toolbox: {\\n show: true,\\n top: 20,\\n left: 30,\\n feature: {\\n restore: {},\\n saveAsImage: {},\\n dataZoom: {\\n yAxisIndex: 'none'\\n },\\n }\\n },\\n dataZoom: [\\n {\\n type: 'slider',\\n show: true,\\n start: 0,\\n end: 100,\\n bottom: 10\\n },\\n {\\n type: 'inside',\\n orient: 'vertical',\\n start: 0,\\n end: 100\\n },\\n {\\n type: 'inside',\\n orient: 'horizontal',\\n start: 0,\\n end: 100\\n }\\n ],\\n series: [{\\n type: 'sankey',\\n animation: true,\\n animationDuration: 300,\\n animationEasingUpdate: 'quinticInOut',\\n // 调整整体布局范围,留出更多空间 \\n left: '5%',\\n top: '12%',\\n right: '20%',\\n bottom: '12%',\\n emphasis: {\\n focus: 'adjacency'\\n },\\n nodeAlign: 'left',\\n orient: 'horizontal',\\n data: nodes,\\n links: links,\\n // 增加布局迭代次数,使布局更加均匀 \\n layoutIterations: 100,\\n // 增加节点间距 \\n nodeGap: 50,\\n // 适当增加节点宽度 \\n nodeWidth: 24,\\n draggable: true,\\n lineStyle: {\\n color: 'source',\\n curveness: 0.5,\\n opacity: 0.5\\n },\\n levels: [{\\n depth: 0,\\n itemStyle: {\\n color: '#2196f3'\\n },\\n lineStyle: {\\n color: 'source',\\n opacity: 0.6\\n }\\n }, {\\n depth: 1,\\n itemStyle: {\\n color: '#ff5722'\\n },\\n lineStyle: {\\n color: 'source',\\n opacity: 0.4\\n }\\n }, {\\n depth: 2,\\n itemStyle: {\\n color: '#4caf50'\\n }\\n }],\\n label: {\\n position: 'right',\\n fontSize: 14,\\n lineHeight: 18,\\n color: '#000000',\\n // 设置标签偏移量,避免重叠 \\n distance: 10,\\n // 调整标签显示方式 \\n formatter: function (params) {\\n var name = params.name;\\n // 如果名称过长,进行截断 \\n if (name.length > 10) {\\n name = name.substring(0, 10) + '...';\\n }\\n if (params.value && params.value > 0) {\\n return `${name}\\\\n(${params.value}个)`;\\n }\\n return \\\"\\\";\\n },\\n // 确保标签始终显示 \\n show: true,\\n // 允许标签自动调整位置 \\n align: 'left',\\n verticalAlign: 'middle',\\n // 标签换行配置 \\n width: 100,\\n overflow: 'break',\\n // 添加背景色,提高可读性 \\n backgroundColor: 'rgba(255,255,255,0.7)',\\n padding: [4, 8],\\n borderRadius: 4\\n }\\n }]\\n};\",\"graphTheme\":null,\"displayMode\":\"canvas\",\"jsCode\":\"\\n async ({Context,JSONContext,ImageContext,echarts,myChart,dat,Forguncy,d3,setInterval,setTimeout,ForguncyEchartsHelper,PublicResource})=>{\\n var datGUI=undefined;\\n var option={};\\n console.log(Context[\\\"recommands\\\"]);\\n// 处理数据,生成节点和链接 \\nconst processData = (data) => {\\n // 收集所有唯一的节点 \\n const typeSet = new Set(data.map(item => item.类型 || \\\"其他\\\"));\\n const projectSet = new Set(data.map(item => item.项目 || \\\"未知项目\\\"));\\n const taskSet = new Set(data.map(item => item.任务 || \\\"未知任务\\\"));\\n // 预计算每个节点的总值 \\n const nodeValues = {};\\n // 计算类型节点的值 \\n data.forEach(item => {\\n nodeValues[item.类型] = (nodeValues[item.类型] || 0) + item.数量;\\n nodeValues[item.项目] = (nodeValues[item.项目] || 0) + item.数量;\\n nodeValues[item.任务] = (nodeValues[item.任务] || 0) + item.数量;\\n });\\n // 生成节点数组,确保节点按照类型、项目、任务的顺序排列 \\n const nodes = [\\n // 类型节点 \\n ...Array.from(typeSet).map((name) => ({\\n name: name,\\n depth: 0,\\n value: nodeValues[name],\\n itemStyle: {\\n color: '#2196f3'\\n }\\n })),\\n // 项目节点 \\n ...Array.from(projectSet).map((name) => ({\\n name: name,\\n depth: 1,\\n value: nodeValues[name],\\n itemStyle: {\\n color: '#ff5722'\\n }\\n })),\\n // 任务节点 \\n ...Array.from(taskSet).map((name) => ({\\n name: name,\\n depth: 2,\\n value: nodeValues[name],\\n itemStyle: {\\n color: '#4caf50'\\n }\\n }))\\n ];\\n // 生成连接数组 \\n const links = [];\\n // 类型 -> 项目的链接 \\n data.forEach(item => {\\n const existingLink = links.find(link => link.source === item.类型 && link.target === item.项目);\\n if (existingLink) {\\n existingLink.value += item.数量;\\n }\\n else {\\n links.push({\\n source: item.类型,\\n target: item.项目,\\n value: item.数量\\n });\\n }\\n });\\n // 项目 -> 任务的链接 \\n data.forEach(item => {\\n const existingLink = links.find(link => link.source === item.项目 && link.target === item.任务);\\n if (existingLink) {\\n existingLink.value += item.数量;\\n }\\n else {\\n links.push({\\n source: item.项目,\\n target: item.任务,\\n value: item.数量\\n });\\n }\\n });\\n return { nodes, links };\\n};\\n//获取提示文字\\nconst gettooltip = (params) => {\\n console.log(params);\\n if (params.dataType === 'node') {\\n return `${params.name}\\\\n数量: ${params.value}`;\\n }\\n return `${params.data.source} → ${params.data.target}\\\\n数量: ${params.value}`;\\n};\\n// 处理数据 \\nconst { nodes, links } = processData(Context[\\\"recommands\\\"]);\\n// Echarts配置 \\noption = {\\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\",\\n title: {\\n text: \\\"项目反馈桑基图\\\",\\n left: \\\"center\\\",\\n top: 24,\\n textStyle: {\\n fontSize: 16,\\n fontWeight: \\\"bold\\\",\\n },\\n },\\n tooltip: {\\n trigger: 'item',\\n triggerOn: 'mousemove',\\n backgroundColor: '#fff',\\n borderColor: '#eee',\\n borderWidth: 1,\\n textStyle: {\\n color: '#333'\\n },\\n formatter: gettooltip\\n },\\n toolbox: {\\n show: true,\\n top: 20,\\n left: 30,\\n feature: {\\n restore: {},\\n saveAsImage: {},\\n dataZoom: {\\n yAxisIndex: 'none'\\n },\\n }\\n },\\n dataZoom: [\\n {\\n type: 'slider',\\n show: true,\\n start: 0,\\n end: 100,\\n bottom: 10\\n },\\n {\\n type: 'inside',\\n orient: 'vertical',\\n start: 0,\\n end: 100\\n },\\n {\\n type: 'inside',\\n orient: 'horizontal',\\n start: 0,\\n end: 100\\n }\\n ],\\n series: [{\\n type: 'sankey',\\n animation: true,\\n animationDuration: 300,\\n animationEasingUpdate: 'quinticInOut',\\n // 调整整体布局范围,留出更多空间 \\n left: '5%',\\n top: '12%',\\n right: '20%',\\n bottom: '12%',\\n emphasis: {\\n focus: 'adjacency'\\n },\\n nodeAlign: 'left',\\n orient: 'horizontal',\\n data: nodes,\\n links: links,\\n // 增加布局迭代次数,使布局更加均匀 \\n layoutIterations: 100,\\n // 增加节点间距 \\n nodeGap: 50,\\n // 适当增加节点宽度 \\n nodeWidth: 24,\\n draggable: true,\\n lineStyle: {\\n color: 'source',\\n curveness: 0.5,\\n opacity: 0.5\\n },\\n levels: [{\\n depth: 0,\\n itemStyle: {\\n color: '#2196f3'\\n },\\n lineStyle: {\\n color: 'source',\\n opacity: 0.6\\n }\\n }, {\\n depth: 1,\\n itemStyle: {\\n color: '#ff5722'\\n },\\n lineStyle: {\\n color: 'source',\\n opacity: 0.4\\n }\\n }, {\\n depth: 2,\\n itemStyle: {\\n color: '#4caf50'\\n }\\n }],\\n label: {\\n position: 'right',\\n fontSize: 14,\\n lineHeight: 18,\\n color: '#000000',\\n // 设置标签偏移量,避免重叠 \\n distance: 10,\\n // 调整标签显示方式 \\n formatter: function (params) {\\n var name = params.name;\\n // 如果名称过长,进行截断 \\n if (name.length > 10) {\\n name = name.substring(0, 10) + '...';\\n }\\n if (params.value && params.value > 0) {\\n return `${name}\\\\n(${params.value}个)`;\\n }\\n return \\\"\\\";\\n },\\n // 确保标签始终显示 \\n show: true,\\n // 允许标签自动调整位置 \\n align: 'left',\\n verticalAlign: 'middle',\\n // 标签换行配置 \\n width: 100,\\n overflow: 'break',\\n // 添加背景色,提高可读性 \\n backgroundColor: 'rgba(255,255,255,0.7)',\\n padding: [4, 8],\\n borderRadius: 4\\n }\\n }]\\n};\\n\\n return {\\n option,\\n datGUI,\\n };\\n }\\n \"}" + "Config": "{\"option\":\"console.log(Context[\\\"recommands\\\"]);\\n\\n// 处理数据,生成节点和链接 \\nconst processData = (data) => {\\n // 生成颜色函数 - 使用HSL颜色空间 \\n const getColorByDepthAndIndex = (depth, index, totalInDepth) => {\\n // 黄金分割比 \\n const goldenRatio = 0.618033988749895;\\n\\n // 使用索引和黄金分割比来生成分散的色相值 \\n // 直接使用0-360的完整色相范围 \\n const hue = ((index * goldenRatio) % 1) * 360;\\n\\n // 统一的饱和度和明度 \\n return `hsl(${hue}, 60%, 55%)`;\\n };\\n\\n // 收集所有唯一的节点 \\n const typeSet = new Set(data.map(item => item.类型 || \\\"其他\\\"));\\n const projectSet = new Set(data.map(item => item.项目 || \\\"未知项目\\\"));\\n const taskSet = new Set(data.map(item => item.任务 || \\\"未知任务\\\"));\\n\\n // 转换为数组以便计算总数和索引 \\n const typeArray = Array.from(typeSet);\\n const projectArray = Array.from(projectSet);\\n const taskArray = Array.from(taskSet);\\n\\n // 预计算每个节点的总值 \\n const nodeValues = {};\\n\\n // 计算类型节点的值 \\n data.forEach(item => {\\n nodeValues[item.类型] = (nodeValues[item.类型] || 0) + item.数量;\\n nodeValues[item.项目] = (nodeValues[item.项目] || 0) + item.数量;\\n nodeValues[item.任务] = (nodeValues[item.任务] || 0) + item.数量;\\n });\\n\\n /// 生成节点数组,确保节点按照类型、项目、任务的顺序排列 \\n const nodes = [\\n // 类型节点 \\n ...typeArray.map((name, index) => ({\\n name: name,\\n depth: 0,\\n value: nodeValues[name],\\n itemStyle: {\\n color: getColorByDepthAndIndex(0, index, typeArray.length),\\n borderColor: getColorByDepthAndIndex(0, index, typeArray.length)\\n }\\n })),\\n // 项目节点 \\n ...projectArray.map((name, index) => ({\\n name: name,\\n depth: 1,\\n value: nodeValues[name],\\n itemStyle: {\\n color: getColorByDepthAndIndex(1, index, projectArray.length),\\n borderColor: getColorByDepthAndIndex(1, index, projectArray.length)\\n }\\n })),\\n // 任务节点 \\n ...taskArray.map((name, index) => ({\\n name: name,\\n depth: 2,\\n value: nodeValues[name],\\n itemStyle: {\\n color: getColorByDepthAndIndex(2, index, taskArray.length),\\n borderColor: getColorByDepthAndIndex(2, index, taskArray.length)\\n }\\n }))\\n ];\\n\\n\\n // 生成连接数组 \\n const links = [];\\n\\n // 类型 -> 项目的链接 \\n data.forEach(item => {\\n const existingLink = links.find(\\n link => link.source === item.类型 && link.target === item.项目\\n );\\n if (existingLink) {\\n existingLink.value += item.数量;\\n } else {\\n links.push({\\n source: item.类型,\\n target: item.项目,\\n value: item.数量\\n });\\n }\\n });\\n\\n // 项目 -> 任务的链接 \\n data.forEach(item => {\\n const existingLink = links.find(\\n link => link.source === item.项目 && link.target === item.任务\\n );\\n if (existingLink) {\\n existingLink.value += item.数量;\\n } else {\\n links.push({\\n source: item.项目,\\n target: item.任务,\\n value: item.数量\\n });\\n }\\n });\\n\\n return { nodes, links };\\n};\\n\\n//获取提示文字\\nconst gettooltip = (params) => {\\n console.log(params);\\n if (params.dataType === 'node') {\\n return `${params.name}\\\\n数量: ${params.value}`;\\n }\\n return `${params.data.source} → ${params.data.target}\\\\n数量: ${params.value}`;\\n}\\n\\n// 处理数据 \\nconst { nodes, links } = processData(Context[\\\"recommands\\\"]);\\n\\n// Echarts配置 \\noption = {\\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\",\\n title: {\\n text: \\\"项目反馈桑基图\\\",\\n subtext:\\\"展示各个项目任务的不同反馈分类占比\\\",\\n left: \\\"center\\\",\\n top: 24,\\n textStyle: {\\n fontSize: 16,\\n fontWeight: \\\"bold\\\",\\n },\\n },\\n tooltip: {\\n trigger: 'item',\\n triggerOn: 'mousemove',\\n formatter: gettooltip\\n },\\n series: [{\\n type: \\\"sankey\\\",\\n animation: true,\\n animationDuration: 300,\\n animationEasingUpdate: 'quinticInOut',\\n left: '5%',\\n top: '12%',\\n right: '20%',\\n bottom: '12%',\\n emphasis: {\\n focus: 'adjacency'\\n },\\n nodeAlign: 'left',\\n orient: 'horizontal',\\n data: nodes,\\n links: links,\\n nodeGap: 15,\\n nodeWidth: 25,\\n draggable: true,\\n lineStyle: {\\n color: 'source',\\n curveness: 0.5,\\n opacity: 0.6,\\n width: function (params) {\\n return Math.max(10, params.value);\\n }\\n },\\n label: {\\n position: 'right',\\n fontSize: 12,\\n lineHeight: 16,\\n color: '#000000',\\n distance: 10,\\n formatter: function (params) {\\n var name = params.name;\\n if (name.length > 10) {\\n name = name.substring(0, 10) + '...';\\n }\\n if (params.value && params.value > 0) {\\n return `${name}(${params.value}个)`;\\n }\\n return \\\"\\\";\\n },\\n show: true,\\n align: 'left',\\n verticalAlign: 'middle',\\n backgroundColor:'#ffffffa1',\\n overflow: 'break',\\n padding: [4, 8],\\n borderRadius: 4\\n }\\n }]\\n};\",\"graphTheme\":null,\"displayMode\":\"canvas\",\"jsCode\":\"\\n async ({Context,JSONContext,ImageContext,echarts,myChart,dat,Forguncy,d3,setInterval,setTimeout,ForguncyEchartsHelper,PublicResource})=>{\\n var datGUI=undefined;\\n var option={};\\n console.log(Context[\\\"recommands\\\"]);\\n// 处理数据,生成节点和链接 \\nconst processData = (data) => {\\n // 生成颜色函数 - 使用HSL颜色空间 \\n const getColorByDepthAndIndex = (depth, index, totalInDepth) => {\\n // 黄金分割比 \\n const goldenRatio = 0.618033988749895;\\n // 使用索引和黄金分割比来生成分散的色相值 \\n // 直接使用0-360的完整色相范围 \\n const hue = ((index * goldenRatio) % 1) * 360;\\n // 统一的饱和度和明度 \\n return `hsl(${hue}, 60%, 55%)`;\\n };\\n // 收集所有唯一的节点 \\n const typeSet = new Set(data.map(item => item.类型 || \\\"其他\\\"));\\n const projectSet = new Set(data.map(item => item.项目 || \\\"未知项目\\\"));\\n const taskSet = new Set(data.map(item => item.任务 || \\\"未知任务\\\"));\\n // 转换为数组以便计算总数和索引 \\n const typeArray = Array.from(typeSet);\\n const projectArray = Array.from(projectSet);\\n const taskArray = Array.from(taskSet);\\n // 预计算每个节点的总值 \\n const nodeValues = {};\\n // 计算类型节点的值 \\n data.forEach(item => {\\n nodeValues[item.类型] = (nodeValues[item.类型] || 0) + item.数量;\\n nodeValues[item.项目] = (nodeValues[item.项目] || 0) + item.数量;\\n nodeValues[item.任务] = (nodeValues[item.任务] || 0) + item.数量;\\n });\\n /// 生成节点数组,确保节点按照类型、项目、任务的顺序排列 \\n const nodes = [\\n // 类型节点 \\n ...typeArray.map((name, index) => ({\\n name: name,\\n depth: 0,\\n value: nodeValues[name],\\n itemStyle: {\\n color: getColorByDepthAndIndex(0, index, typeArray.length),\\n borderColor: getColorByDepthAndIndex(0, index, typeArray.length)\\n }\\n })),\\n // 项目节点 \\n ...projectArray.map((name, index) => ({\\n name: name,\\n depth: 1,\\n value: nodeValues[name],\\n itemStyle: {\\n color: getColorByDepthAndIndex(1, index, projectArray.length),\\n borderColor: getColorByDepthAndIndex(1, index, projectArray.length)\\n }\\n })),\\n // 任务节点 \\n ...taskArray.map((name, index) => ({\\n name: name,\\n depth: 2,\\n value: nodeValues[name],\\n itemStyle: {\\n color: getColorByDepthAndIndex(2, index, taskArray.length),\\n borderColor: getColorByDepthAndIndex(2, index, taskArray.length)\\n }\\n }))\\n ];\\n // 生成连接数组 \\n const links = [];\\n // 类型 -> 项目的链接 \\n data.forEach(item => {\\n const existingLink = links.find(link => link.source === item.类型 && link.target === item.项目);\\n if (existingLink) {\\n existingLink.value += item.数量;\\n }\\n else {\\n links.push({\\n source: item.类型,\\n target: item.项目,\\n value: item.数量\\n });\\n }\\n });\\n // 项目 -> 任务的链接 \\n data.forEach(item => {\\n const existingLink = links.find(link => link.source === item.项目 && link.target === item.任务);\\n if (existingLink) {\\n existingLink.value += item.数量;\\n }\\n else {\\n links.push({\\n source: item.项目,\\n target: item.任务,\\n value: item.数量\\n });\\n }\\n });\\n return { nodes, links };\\n};\\n//获取提示文字\\nconst gettooltip = (params) => {\\n console.log(params);\\n if (params.dataType === 'node') {\\n return `${params.name}\\\\n数量: ${params.value}`;\\n }\\n return `${params.data.source} → ${params.data.target}\\\\n数量: ${params.value}`;\\n};\\n// 处理数据 \\nconst { nodes, links } = processData(Context[\\\"recommands\\\"]);\\n// Echarts配置 \\noption = {\\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\",\\n title: {\\n text: \\\"项目反馈桑基图\\\",\\n subtext: \\\"展示各个项目任务的不同反馈分类占比\\\",\\n left: \\\"center\\\",\\n top: 24,\\n textStyle: {\\n fontSize: 16,\\n fontWeight: \\\"bold\\\",\\n },\\n },\\n tooltip: {\\n trigger: 'item',\\n triggerOn: 'mousemove',\\n formatter: gettooltip\\n },\\n series: [{\\n type: \\\"sankey\\\",\\n animation: true,\\n animationDuration: 300,\\n animationEasingUpdate: 'quinticInOut',\\n left: '5%',\\n top: '12%',\\n right: '20%',\\n bottom: '12%',\\n emphasis: {\\n focus: 'adjacency'\\n },\\n nodeAlign: 'left',\\n orient: 'horizontal',\\n data: nodes,\\n links: links,\\n nodeGap: 15,\\n nodeWidth: 25,\\n draggable: true,\\n lineStyle: {\\n color: 'source',\\n curveness: 0.5,\\n opacity: 0.6,\\n width: function (params) {\\n return Math.max(10, params.value);\\n }\\n },\\n label: {\\n position: 'right',\\n fontSize: 12,\\n lineHeight: 16,\\n color: '#000000',\\n distance: 10,\\n formatter: function (params) {\\n var name = params.name;\\n if (name.length > 10) {\\n name = name.substring(0, 10) + '...';\\n }\\n if (params.value && params.value > 0) {\\n return `${name}(${params.value}个)`;\\n }\\n return \\\"\\\";\\n },\\n show: true,\\n align: 'left',\\n verticalAlign: 'middle',\\n backgroundColor: '#ffffffa1',\\n overflow: 'break',\\n padding: [4, 8],\\n borderRadius: 4\\n }\\n }]\\n};\\n\\n return {\\n option,\\n datGUI,\\n };\\n }\\n \"}" } }, "16,1": { @@ -785,21 +780,18 @@ ] }, "CellStyles": { - "1,38": 0, - "1,40": 0, - "2,40": 0, - "3,40": 0, - "6,39": 1, + "1,37": 0, + "1,39": 0, + "2,39": 0, + "3,39": 0, + "6,38": 1, + "8,38": 2, "8,39": 2, - "8,40": 2, - "9,40": 2, + "9,39": 2, "10,1": 0, - "10,40": 2, - "11,40": 2, + "10,39": 2, + "11,39": 2, "12,1": 0, - "12,40": 2, - "13,40": 2, - "14,40": 2, "15,1": 0, "15,2": 0, "15,3": 0, @@ -835,10 +827,8 @@ "15,33": 0, "15,34": 0, "15,35": 0, - "15,36": 0, - "15,40": 2, - "16,1": 3, - "16,40": 2 + "15,39": 2, + "16,1": 3 }, "SheetStyle": { "FontFamily": 2, @@ -846,14 +836,14 @@ } }, "Spans": [ - "1,38,3,3", - "1,1,1,36", - "3,1,1,36", - "5,1,4,36", - "10,1,1,36", - "12,1,3,36", - "16,1,1,36", - "8,39,3,1" + "1,37,3,3", + "1,1,1,35", + "3,1,1,35", + "5,1,4,35", + "10,1,1,35", + "8,38,3,1", + "12,1,3,39", + "16,1,1,39" ], "PageInfo": { "$type": "Forguncy.Model.Pages.NormalPage, ServerDesignerCommon", @@ -982,7 +972,7 @@ "Fill": "Background 2 0" }, "IsAutomaticFill": false, - "Size": "1553,3059" + "Size": "1521,3059" }, { "Name": "0f5baa2c-2dec-44c7-8a3f-45868371fe7b.png", @@ -993,7 +983,7 @@ }, "IsAutomaticFill": false, "Location": "24,234", - "Size": "1152,300" + "Size": "1120,300" }, { "Name": "7e86b317-11df-41f3-a863-d077d49a760b.png", @@ -1003,7 +993,7 @@ "Fill": "Background 1 0" }, "IsAutomaticFill": false, - "Location": "1186,15", + "Location": "1154,15", "Size": "343,209" }, { @@ -1014,7 +1004,7 @@ "Fill": "Background 1 0" }, "IsAutomaticFill": false, - "Location": "1186,234", + "Location": "1154,234", "Size": "343,693" }, { @@ -1026,7 +1016,7 @@ }, "IsAutomaticFill": false, "Location": "24,544", - "Size": "1152,383" + "Size": "1120,383" }, { "Name": "cc656816-79e5-4f40-957c-c72753c75e5d.png", @@ -1037,7 +1027,7 @@ }, "IsAutomaticFill": false, "Location": "24,937", - "Size": "1152,1065" + "Size": "1473,1065" }, { "Name": "fb94cc28-18cf-4cd3-bae7-8f9a8156ed34.png", @@ -1048,7 +1038,7 @@ }, "IsAutomaticFill": false, "Location": "24,2012", - "Size": "1152,1000" + "Size": "1473,1000" } ] -}//Faw8qgZ5K9AZzF22Y5WzTfIUUPzO5/45gDFim3oPAhKlrzdD2DwSJcOOkVHpyPuHxsMyxJ681MMpEJhOyEyQgjUWMQUUwbQbvJGyQsZJV1bgho2pRH2ki7Ef1JjxmDOFzdOPW7Td1CGuaPRBIB+dE0YdlarA8hH7jYzOktDl07D+jIRZHolvlDLag/KaGa0jVA6F7NNUWLbWnWace37RXiW178jpa9s3dhtuHQliktFde7n+SBUrzvvNHEkHyruZTZpqliLzP64DEE3ruqIYJWO1yms/MyuhA9oVugSMtWGO1deqATLiLBsr1U0jbR7E/OTqvGYI/Ee+p9J7ZVi4lBAc9vM4BO7AwTtNbU5j2v+0BIRFZnxWzCHxGfWVQ+LHhAWY4RtxF/q/Sis4KsHlMeK1KfQUOYguQuantBUE22dPuNmIA495O/5kvaSe6vZhxLVZdioGPRwQTHYouhrIzDPChGmzJqnPZpx9+BqGVxAz46Eeyj0rgWoLemHO9Xo2ZIHewSZYJ2hUJi+TDlV/tbyf0fidYpiIbFrrVxzBBTA/szJIidOwZ69xV0OPSX8HKZgbk/u/IDIZJ1LQUj/PKrsvOUyx+fZtzZXe33sS4DLS9IhIA0IGbrDxhLDnq1CKgQhZro8Qiz274JHgUgjYoHxgkTw7kptijxZSybWW+4afVI0Y1AcfOfswzO78sZdY+BcHAOkz8Kntu8w4taMhTpZ3RBWn9fc6cntNdspvdIJErZdHS44JZu2n/dwjhY/JlAin3H9WeKRZoIUQ4b5cFtHfoZJE0oQ6MKVys3wXwquUChDhIZA6imGUb2Tpa8SLz/zYVFJqd2voBv/N4IktKILt7Dg/3eM5APLl9p4ARjKPLlj6G9VqjIN0nUxSSh85KwDbISGfwBQpJu+EuwSbPg==|920 \ No newline at end of file +}//OvpFVJAt71cxWBj3r9CPg0zcbr5hp+CQ0pVqNPJtMDWlbLIzIv/dbEON0/XnYYeclW0AhpjFNJXJ09aIpyc2yqfM8OcKg9CuVUN09ibiFkCo3NxD2JY/k31LLOriKZI1kmLPazkRf3OEfvFHXfwcGnM51+cw83Y9V7dhgAnmfpNQUUmiKEAVifYGAp60bRmSQkbzzigpLML+QzWeUeMSjjpJlP/4f+zD3xtXxBfYZC8mozGMU8p58kNPO3z2hobbAg6le68iFZscPPE6O/Ry16Xba82m+jf6wkKA5Cmjl0wKFbDQ75h+/aT8h0J1rxDfMFvKPowce0Ep+LljgTMPrJ+p9bnZGHMCiouLkmtImFOLKUVK9FC7pY9zDbIQNNMQB6D3DzXswVA8v8vFukR0+wocBHEI9HEyzXiat3LcYRJklJCDHNPt0oO4ZNlYPAPlRhITvrqMgOAXGsbBoKJWY4Jw17jw7uF5gpoyYBiHczeC9253mEg7jMkRq/qsrRTs8+uDDcNebWfmsmoeH7I87L2f3KalgL1gj5uyJUTJzttok2SphiqhGBAW4MoGC8QrtM3ui8N6CeJwUXp18E46xV+CNFtetTXlxNWES1vJDN3KvmL1aLstBlVtKQ0fckyOUsoxWUd44BaDRcWR4Y9pd//nQcYeoVpoAJc++nUY5mIwAhaJ3T0dwVSG+mzBiREbr86K0QYvFRGzEtCORLY03JLjh6MRoIjuXe/26weQ0TbyqWSllvf9mAAijXi9Y1jbfmYjbmMLrWI+2S07EU4Mb8Wfg58TMDOM+BF9rATJMha5ZzyhF4SvQOm9mTP13PVcVzrzB0yHzMnPofG5MbNOI2P4iP7Z980rkG9jB9xcFjATzkAuHVO37dyCuqv7QXVR5aT7ldQ6TcFewD1P6tPJow==|920 \ No newline at end of file diff --git a/Pages/工作台/工作台首页.rd b/Pages/工作台/工作台首页.rd index 2378094b..0338f105 100644 --- a/Pages/工作台/工作台首页.rd +++ b/Pages/工作台/工作台首页.rd @@ -1,5 +1,5 @@ { "PageType": 0, - "ColumnCount": 42, + "ColumnCount": 41, "RowCount": 19 } \ No newline at end of file