diff --git a/.collaboration b/.collaboration index 5ca3dd17..b99c2267 100644 --- a/.collaboration +++ b/.collaboration @@ -5,137 +5,47 @@ }, { "ModuleName": "TableView/用户信息视图", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T14:12:43.547338+08:00", "ModuleType": 23, - "ToRemoveFiles": [ - "Tables\\用户\\用户信息视图.json", - "ForguncyDB.sqlite3" - ], "ExclusiveType": 0 }, { "ModuleName": "TableView/用户组织关系视图", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T14:12:43.5473528+08:00", "ModuleType": 23, - "ToRemoveFiles": [ - "Tables\\用户\\用户组织关系视图.json", - "ForguncyDB.sqlite3" - ], "ExclusiveType": 0 }, { "ModuleName": "TableView/角色分类关系视图", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T14:12:43.5473546+08:00", "ModuleType": 23, - "ToRemoveFiles": [ - "Tables\\用户\\角色分类关系视图.json", - "ForguncyDB.sqlite3" - ], "ExclusiveType": 0 }, { "ModuleName": "TableView/角色组织关系视图", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T14:12:43.5473555+08:00", "ModuleType": 23, - "ToRemoveFiles": [ - "Tables\\用户\\角色组织关系视图.json", - "ForguncyDB.sqlite3" - ], "ExclusiveType": 0 }, { "ModuleName": "TableView/组织级别视图", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T14:12:43.5473572+08:00", "ModuleType": 23, - "ToRemoveFiles": [ - "Tables\\用户\\组织级别视图.json", - "ForguncyDB.sqlite3" - ], "ExclusiveType": 0 }, { "ModuleName": "TableView/用户角色关系视图", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T14:12:43.547359+08:00", "ModuleType": 23, - "ToRemoveFiles": [ - "Tables\\用户\\用户角色关系视图.json", - "ForguncyDB.sqlite3" - ], "ExclusiveType": 0 }, { "ModuleName": "TableView/角色信息视图", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T14:12:43.5473601+08:00", "ModuleType": 23, - "ToRemoveFiles": [ - "Tables\\用户\\角色信息视图.json", - "ForguncyDB.sqlite3" - ], "ExclusiveType": 0 }, { "ModuleName": "TableView/组织信息视图", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T14:12:43.5473581+08:00", "ModuleType": 23, - "ToRemoveFiles": [ - "Tables\\用户\\组织信息视图.json", - "ForguncyDB.sqlite3" - ], "ExclusiveType": 0 }, { "ModuleName": "TableView/角色拥有权限视图", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T14:12:43.5473624+08:00", "ModuleType": 23, - "ToRemoveFiles": [ - "Tables\\用户\\角色拥有权限视图.json", - "ForguncyDB.sqlite3" - ], "ExclusiveType": 0 }, { @@ -392,47 +302,17 @@ }, { "ModuleName": "Table/FGC_订单记录", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T14:12:43.5473984+08:00", "ModuleType": 7, - "ToRemoveFiles": [ - "Tables\\FGC_页面模板文件夹\\联动页\\FGC_订单记录.json", - "ForguncyDB.sqlite3" - ], "ExclusiveType": 0 }, { "ModuleName": "Table/FGC_商品表", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T14:12:43.5474014+08:00", "ModuleType": 7, - "ToRemoveFiles": [ - "Tables\\FGC_页面模板文件夹\\联动页\\FGC_商品表.json", - "ForguncyDB.sqlite3" - ], "ExclusiveType": 0 }, { "ModuleName": "Table/FGC_订单明细表", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T14:12:43.5474039+08:00", "ModuleType": 7, - "ToRemoveFiles": [ - "Tables\\FGC_页面模板文件夹\\联动页\\FGC_订单明细表.json", - "ForguncyDB.sqlite3" - ], "ExclusiveType": 0 }, { @@ -613,17 +493,7 @@ }, { "ModuleName": "Table/message_test", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T14:12:43.5474116+08:00", "ModuleType": 7, - "ToRemoveFiles": [ - "Tables\\汇报\\message_test.json", - "ForguncyDB.sqlite3" - ], "ExclusiveType": 0 }, { @@ -732,21 +602,7 @@ }, { "ModuleName": "PCPage/项目概况", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T13:32:36.5088264+08:00", - "ModuleType": 1, - "ToRemoveFiles": [ - "Pages\\项目\\项目首页\\项目首页-容器页面\\项目概况.json", - "Pages\\项目\\项目首页\\项目首页-容器页面\\项目概况.rd", - "Pages\\eaf92441634a4701b4a255ccc7601ac.json", - "Pages\\eaf92441634a4701b4a255ccc7601ac.rd", - "Pages\\f9ec059d9c5d440eabbb7db442b15c9.json", - "Pages\\f9ec059d9c5d440eabbb7db442b15c9.rd" - ] + "ModuleType": 1 }, { "ModuleName": "PCPage/项目负荷", @@ -2810,18 +2666,7 @@ }, { "ModuleName": "UserService", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2025-08-08T13:14:17.7654597+08:00", - "ModuleType": 11, - "ToRemoveFiles": [ - "UserServiceDB.sqlite3", - "CloudStorageProvider\\data.json", - "SecurityProviderV2\\data.json" - ] + "ModuleType": 11 }, { "ModuleName": "CustomLibrary", diff --git a/ForguncyDB.sqlite3 b/ForguncyDB.sqlite3 index 33e0350b..a5e66176 100644 Binary files a/ForguncyDB.sqlite3 and b/ForguncyDB.sqlite3 differ diff --git a/Pages/项目/项目首页/项目首页-容器页面/项目概况.json b/Pages/项目/项目首页/项目首页-容器页面/项目概况.json index 3a8ef882..473057ab 100644 --- a/Pages/项目/项目首页/项目首页-容器页面/项目概况.json +++ b/Pages/项目/项目首页/项目首页-容器页面/项目概况.json @@ -18,7 +18,7 @@ }, "3": { "GridRowColumnDefinition": { - "DesignLengthInPixel": 35.0 + "DesignLengthInPixel": 40.0 } }, "4": { @@ -33,7 +33,7 @@ }, "6": { "GridRowColumnDefinition": { - "DesignLengthInPixel": 35.0 + "DesignLengthInPixel": 40.0 } }, "7": { @@ -48,40 +48,60 @@ }, "9": { "GridRowColumnDefinition": { - "DesignLengthInPixel": 284.0 + "DesignLengthInPixel": 40.0 } }, "10": { "GridRowColumnDefinition": { - "DesignLengthInPixel": 24.0 + "DesignLengthInPixel": 284.0 } }, "11": { "GridRowColumnDefinition": { - "DesignLengthInPixel": 35.0 + "DesignLengthInPixel": 24.0 } }, "12": { + "GridRowColumnDefinition": { + "DesignLengthInPixel": 40.0 + } + }, + "13": { "GridRowColumnDefinition": { "DesignLengthInPixel": 379.0, "Mode": 1 } }, - "13": { + "14": { + "GridRowColumnDefinition": { + "DesignLengthInPixel": 24.0 + } + }, + "15": { + "GridRowColumnDefinition": { + "DesignLengthInPixel": 40.0 + } + }, + "16": { + "GridRowColumnDefinition": { + "DesignLengthInPixel": 615.0 + } + }, + "17": { "GridRowColumnDefinition": { "DesignLengthInPixel": 32.0 } }, - "14": { + "18": { "GridRowColumnDefinition": { "DesignLengthInPixel": 45.0 } } }, "InLogicalVisibleIndexes": [ - 14 + 18 ], - "Count": 15, + "Count": 19, "DefaultSize": 24.0 }, "Cols": { @@ -245,7 +265,7 @@ }, "31": { "GridRowColumnDefinition": { - "DesignLengthInPixel": 24.0 + "DesignLengthInPixel": 15.0 } }, "32": { @@ -253,9 +273,9 @@ "DesignLengthInPixel": 24.0 } }, - "39": { + "33": { "GridRowColumnDefinition": { - "DesignLengthInPixel": 32.0 + "DesignLengthInPixel": 24.0 } }, "40": { @@ -282,9 +302,14 @@ "GridRowColumnDefinition": { "DesignLengthInPixel": 32.0 } + }, + "45": { + "GridRowColumnDefinition": { + "DesignLengthInPixel": 32.0 + } } }, - "Count": 45, + "Count": 46, "DefaultSize": 32.0 }, "Values": { @@ -293,8 +318,11 @@ "4,1": "项目三经理成员", "6,1": "项目成员", "7,1": "项目成员统计", - "11,1": "项目进展", - "12,1": "项目甘特图" + "9,1": "工时上报趋势图", + "12,1": "项目进展", + "13,1": "项目甘特图", + "15,1": "反馈桑基图", + "16,1": "反馈统计(饼图+表格)" }, "AttachInfos": { "1,1": { @@ -304,7 +332,7 @@ "OverflowMode": 1 } }, - "1,33": { + "1,34": { "CellType": { "$type": "Forguncy.RepeaterCellType, ServerDesignerCommon", "TemplatePageName": "eaf92441634a4701b4a255ccc7601ac", @@ -402,9 +430,9 @@ ] }, "DataSourceListviewName": "图文列表表格2", - "TopCount": 20, + "TopCount": 30, "IsLoadOnDemand": true, - "LoadOnDemandCount": 20 + "LoadOnDemandCount": 30 } }, "4,1": { @@ -420,7 +448,7 @@ "PageName": "项目成员统计" } }, - "9,1": { + "10,1": { "CellType": { "$type": "EchartsCustomCellType.EchartsCustomCellTypeCellType, EchartsCustomCellType", "EChartTitle": "Echarts图表", @@ -496,10 +524,10 @@ ], "JSONDataSources": [], "ImageDataSource": [], - "Config": "{\"option\":\"\\nconst {\\n \\\"日期\\\": xAxisData,\\n \\\"工时\\\": yAxisData\\n} = ForguncyEchartsHelper.splitDataSource(Context.report);\\nconsole.log(xAxisData);\\nconsole.log(yAxisData);\\n\\n\\noption = {\\n title:{\\n text:'工时上报趋势图',\\n left: 'center'\\n },\\n color: ['#00bcd4', '#00DDFF', '#37A2FF', '#FF0087', '#FFBF00'],\\n tooltip: {\\n trigger: 'axis',\\n axisPointer: {\\n type: 'cross',\\n label: {\\n backgroundColor: '#6a7985'\\n }\\n }\\n },\\n grid:{\\n left:25,\\n right:25,\\n top:55,\\n bottom:30\\n },\\n xAxis: {\\n type: 'category',\\n data: xAxisData,\\n splitLine:{\\n show:false\\n }\\n },\\n yAxis: {\\n type: 'value',\\n splitLine:{\\n show:true,\\n lineStyle:{\\n width:0.5,\\n color:'#e6e6e6'\\n }\\n }\\n },\\n series: [\\n {\\n data: yAxisData,\\n type: 'line',\\n smooth: true,\\n lineStyle: {\\n width: 3\\n },\\n areaStyle: {\\n opacity: 0.8,\\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\\n {\\n offset: 0,\\n color: 'rgba(0,188,212,0.8)'\\n },\\n {\\n offset: 1,\\n color: 'rgba(0,188,212,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 const { \\\"日期\\\": xAxisData, \\\"工时\\\": yAxisData } = ForguncyEchartsHelper.splitDataSource(Context.report);\\nconsole.log(xAxisData);\\nconsole.log(yAxisData);\\noption = {\\n title: {\\n text: '工时上报趋势图',\\n left: 'center'\\n },\\n color: ['#00bcd4', '#00DDFF', '#37A2FF', '#FF0087', '#FFBF00'],\\n tooltip: {\\n trigger: 'axis',\\n axisPointer: {\\n type: 'cross',\\n label: {\\n backgroundColor: '#6a7985'\\n }\\n }\\n },\\n grid: {\\n left: 25,\\n right: 25,\\n top: 55,\\n bottom: 30\\n },\\n xAxis: {\\n type: 'category',\\n data: xAxisData,\\n splitLine: {\\n show: false\\n }\\n },\\n yAxis: {\\n type: 'value',\\n splitLine: {\\n show: true,\\n lineStyle: {\\n width: 0.5,\\n color: '#e6e6e6'\\n }\\n }\\n },\\n series: [\\n {\\n data: yAxisData,\\n type: 'line',\\n smooth: true,\\n lineStyle: {\\n width: 3\\n },\\n areaStyle: {\\n opacity: 0.8,\\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\\n {\\n offset: 0,\\n color: 'rgba(0,188,212,0.8)'\\n },\\n {\\n offset: 1,\\n color: 'rgba(0,188,212,0)'\\n }\\n ])\\n },\\n }\\n ]\\n};\\n\\n return {\\n option,\\n datGUI,\\n };\\n }\\n \"}" + "Config": "{\"option\":\"\\nconst {\\n \\\"日期\\\": xAxisData,\\n \\\"工时\\\": yAxisData\\n} = ForguncyEchartsHelper.splitDataSource(Context.report);\\nconsole.log(xAxisData);\\nconsole.log(yAxisData);\\n\\n\\noption = {\\n title:{\\n text:'工时上报趋势图',\\n show:false,\\n left: 'center'\\n },\\n color: ['#00bcd4', '#00DDFF', '#37A2FF', '#FF0087', '#FFBF00'],\\n tooltip: {\\n trigger: 'axis',\\n axisPointer: {\\n type: 'cross',\\n label: {\\n backgroundColor: '#6a7985'\\n }\\n }\\n },\\n grid:{\\n left:25,\\n right:25,\\n top:55,\\n bottom:30\\n },\\n xAxis: {\\n type: 'category',\\n data: xAxisData,\\n splitLine:{\\n show:false\\n }\\n },\\n yAxis: {\\n type: 'value',\\n splitLine:{\\n show:true,\\n lineStyle:{\\n width:0.5,\\n color:'#e6e6e6'\\n }\\n }\\n },\\n series: [\\n {\\n data: yAxisData,\\n type: 'line',\\n smooth: true,\\n lineStyle: {\\n width: 3\\n },\\n areaStyle: {\\n opacity: 0.8,\\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\\n {\\n offset: 0,\\n color: 'rgba(0,188,212,0.8)'\\n },\\n {\\n offset: 1,\\n color: 'rgba(0,188,212,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,ApplicationResource})=>{\\n var datGUI=undefined;\\n var option={};\\n const { \\\"日期\\\": xAxisData, \\\"工时\\\": yAxisData } = ForguncyEchartsHelper.splitDataSource(Context.report);\\nconsole.log(xAxisData);\\nconsole.log(yAxisData);\\noption = {\\n title: {\\n text: '工时上报趋势图',\\n show: false,\\n left: 'center'\\n },\\n color: ['#00bcd4', '#00DDFF', '#37A2FF', '#FF0087', '#FFBF00'],\\n tooltip: {\\n trigger: 'axis',\\n axisPointer: {\\n type: 'cross',\\n label: {\\n backgroundColor: '#6a7985'\\n }\\n }\\n },\\n grid: {\\n left: 25,\\n right: 25,\\n top: 55,\\n bottom: 30\\n },\\n xAxis: {\\n type: 'category',\\n data: xAxisData,\\n splitLine: {\\n show: false\\n }\\n },\\n yAxis: {\\n type: 'value',\\n splitLine: {\\n show: true,\\n lineStyle: {\\n width: 0.5,\\n color: '#e6e6e6'\\n }\\n }\\n },\\n series: [\\n {\\n data: yAxisData,\\n type: 'line',\\n smooth: true,\\n lineStyle: {\\n width: 3\\n },\\n areaStyle: {\\n opacity: 0.8,\\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\\n {\\n offset: 0,\\n color: 'rgba(0,188,212,0.8)'\\n },\\n {\\n offset: 1,\\n color: 'rgba(0,188,212,0)'\\n }\\n ])\\n },\\n }\\n ]\\n};\\n\\n return {\\n option,\\n datGUI,\\n };\\n }\\n \"}" } }, - "11,43": { + "12,30": { "CellType": { "$type": "Forguncy.ImageCellType, ServerDesignerCommon", "CommandList": [ @@ -527,7 +555,7 @@ "UseCellForeColor": true } }, - "12,1": { + "13,1": { "CellType": { "$type": "Forguncy.RepeaterCellType, ServerDesignerCommon", "TemplatePageName": "f9ec059d9c5d440eabbb7db442b15c9", @@ -613,6 +641,130 @@ }, "TemplateKey": "竖排横线分割" } + }, + "15,30": { + "CellType": { + "$type": "Forguncy.ImageCellType, ServerDesignerCommon", + "CommandList": [ + { + "$type": "Forguncy.Model.ShowPopupCommand, ServerDesignerCommon", + "PageName": "新增进展", + "PassValues": [ + { + "Source": { + "$type": "Forguncy.Model.FormulaReferObject, ServerDesignerCommon", + "SerializeProperty": "=项目概况!项目ID" + }, + "TargetCell": { + "SerializeProperty": "=新增进展!项目ID" + } + } + ], + "LoadBindingDataOption": 2, + "BreakpointIdentity": "8fc5eb08-21e5-452b-954b-aeb4b50de8b9" + } + ], + "ToolTip": "添加进展", + "Size": 18, + "ImagePath": "增加.svg", + "UseCellForeColor": true + } + }, + "16,1": { + "CellType": { + "$type": "EchartsCustomCellType.EchartsCustomCellTypeCellType, EchartsCustomCellType", + "EChartTitle": "Echarts图表", + "DataSourceBinding": "DataSources", + "DataSources": [ + { + "Name": "recommands", + "BindingTableOptions": { + "$type": "ServerDesignerCommon.Model.BindingDataSourceModel, ServerDesignerCommon", + "TableName": "项目反馈数量统计视图", + "BindingInfos": [ + { + "GUID": "d15e9015-e7dd-43c5-8527-23c05ea3599e", + "BindingInfo": { + "TableName": "项目反馈数量统计视图", + "ColumnName": "类型", + "GUID": "9e92f3f0-90fa-46a1-8cce-7ce5b44c068f" + }, + "ColumnName": "类型" + }, + { + "GUID": "91c7c1db-40ed-457b-9f7e-c2b410873c02", + "BindingInfo": { + "TableName": "项目反馈数量统计视图", + "ColumnName": "项目ID", + "GUID": "45e8f319-dad7-4f2b-ac25-53fb8a2cb99e" + }, + "ColumnName": "项目ID" + }, + { + "GUID": "1da4d2ca-b7f5-4067-870c-50e8958c9c01", + "BindingInfo": { + "TableName": "项目反馈数量统计视图", + "ColumnName": "任务ID", + "GUID": "fdac6ba6-e405-4db9-8432-75aaaf3dec3d" + }, + "ColumnName": "任务ID" + }, + { + "GUID": "7c1248ae-7392-43a9-b0b9-f8f2b7d1e20e", + "BindingInfo": { + "TableName": "项目反馈数量统计视图", + "ColumnName": "项目", + "GUID": "a2e35e97-627c-4627-963f-a8f53e7bc1f7" + }, + "ColumnName": "项目" + }, + { + "GUID": "6d164818-8269-436d-a12f-097fe6f626f1", + "BindingInfo": { + "TableName": "项目反馈数量统计视图", + "ColumnName": "任务", + "GUID": "90d1e566-44d4-472b-a318-517c9eb3ad75" + }, + "ColumnName": "任务" + }, + { + "GUID": "91c6f208-7336-46f3-80d8-9582cde6f9b1", + "BindingInfo": { + "TableName": "项目反馈数量统计视图", + "ColumnName": "数量", + "GUID": "b3efeef2-d6a1-4f9b-b1c2-9ec8e4cd2a1d" + }, + "ColumnName": "数量" + } + ], + "SqlCondition": { + "$type": "ForguncyDataAccess.GeneralCESqlCondition, ForguncyDataAccess", + "ColumnBindingInfo": { + "TableName": "项目反馈数量统计视图", + "ColumnName": "项目ID", + "GUID": "a4ad22fd-5c0f-430f-99fb-4b2b8a07d4e7" + }, + "Value": { + "$type": "Forguncy.Model.FormulaReferObject, ServerDesignerCommon", + "SerializeProperty": "=项目首页!项目ID" + } + }, + "NullFormulaValueQueryPolicy": 1, + "CustomColumns": [ + "类型", + "项目ID", + "任务ID", + "项目", + "任务", + "数量" + ] + } + } + ], + "JSONDataSources": [], + "ImageDataSource": [], + "Config": "{\"option\":\"console.log(JSON.stringify(Context[\\\"recommands\\\"]));\\n\\n// 处理数据,生成节点和链接 \\nconst processData = (data) => {\\n // 生成颜色函数 - 使用HSL颜色空间,为每层生成不同的柔和颜色 \\n const generateColors = (count, depth) => {\\n const colors = [];\\n // 黄金角度 约137.5° \\n const goldenAngle = 137.5;\\n\\n // 根据深度调整饱和度和亮度 \\n const getSaturation = (depth) => {\\n switch (depth) {\\n case 0: return '60%'; // 第一层 \\n case 1: return '50%'; // 第二层 \\n case 2: return '40%'; // 第三层 \\n default: return '50%';\\n }\\n };\\n\\n const getLightness = (depth) => {\\n switch (depth) {\\n case 0: return '60%'; // 第一层 \\n case 1: return '60%'; // 第二层 \\n case 2: return '60%'; // 第三层 \\n default: return '60%';\\n }\\n };\\n\\n // 使用黄金角度来生成颜色 \\n const usedHues = new Set();\\n const minHueDistance = 30; // 最小色相差 \\n\\n for (let i = 0; i < count; i++) {\\n // 基础色相值使用黄金角度 \\n let baseHue = (i * goldenAngle) % 360;\\n\\n // 添加小范围随机偏移,但确保与现有颜色保持最小距离 \\n let hue = baseHue;\\n let attempts = 0;\\n const maxAttempts = 10;\\n\\n // 检查新生成的色相是否与已有的色相保持足够距离 \\n while (attempts < maxAttempts) {\\n let isValidHue = true;\\n\\n for (const existingHue of usedHues) {\\n const distance = Math.min(\\n Math.abs(hue - existingHue),\\n 360 - Math.abs(hue - existingHue)\\n );\\n\\n if (distance < minHueDistance) {\\n isValidHue = false;\\n break;\\n }\\n }\\n\\n if (isValidHue) {\\n break;\\n }\\n\\n // 如果当前色相不合适,添加一个小偏移再试 \\n hue = (baseHue + Math.random() * 30 - 15) % 360;\\n if (hue < 0) hue += 360;\\n attempts++;\\n }\\n\\n usedHues.add(hue);\\n colors.push(`hsl(${hue}, ${getSaturation(depth)}, ${getLightness(depth)})`);\\n }\\n\\n return colors;\\n };\\n\\n // 收集所有唯一的节点 \\n const typeSet = new Set(data.map(item => item.类型));\\n const projectSet = new Set();\\n const taskSet = new Set();\\n\\n // 创建项目和任务的映射关系 \\n const projectTypeMap = new Map();\\n const taskTypeMap = new Map();\\n\\n data.forEach(item => {\\n const projectKey = `[${item.项目ID}]${item.项目}`;\\n const taskKey = `[${item.任务ID}]${item.任务}`;\\n\\n projectSet.add(projectKey);\\n taskSet.add(taskKey);\\n\\n if (!projectTypeMap.has(projectKey)) {\\n projectTypeMap.set(projectKey, new Set());\\n }\\n if (!taskTypeMap.has(taskKey)) {\\n taskTypeMap.set(taskKey, new Set());\\n }\\n\\n projectTypeMap.get(projectKey).add(item.类型);\\n taskTypeMap.get(taskKey).add(item.类型);\\n });\\n\\n // 转换为数组 \\n const typeArray = Array.from(typeSet);\\n const projectArray = Array.from(projectSet);\\n const taskArray = Array.from(taskSet);\\n\\n // 为每层生成颜色 \\n const typeColors = {};\\n const projectColors = {};\\n const taskColors = {};\\n\\n const level0Colors = generateColors(typeArray.length, 0);\\n const level1Colors = generateColors(projectArray.length, 1);\\n const level2Colors = generateColors(taskArray.length, 2);\\n\\n typeArray.forEach((type, index) => {\\n typeColors[type] = level0Colors[index];\\n });\\n\\n projectArray.forEach((project, index) => {\\n projectColors[project] = level1Colors[index];\\n });\\n\\n taskArray.forEach((task, index) => {\\n taskColors[task] = level2Colors[index];\\n });\\n\\n // 计算节点值 \\n const nodeValues = {};\\n data.forEach(item => {\\n const projectKey = `[${item.项目ID}]${item.项目}`;\\n const taskKey = `[${item.任务ID}]${item.任务}`;\\n\\n nodeValues[item.类型] = (nodeValues[item.类型] || 0) + item.数量;\\n nodeValues[projectKey] = (nodeValues[projectKey] || 0) + item.数量;\\n nodeValues[taskKey] = (nodeValues[taskKey] || 0) + item.数量;\\n });\\n\\n // 生成节点 \\n const nodes = [\\n // 类型节点 \\n ...typeArray.map((type, index) => ({\\n name: type,\\n value: nodeValues[type],\\n itemStyle: {\\n color: typeColors[type],\\n borderColor: typeColors[type]\\n },\\n category: '类型',\\n depth: 0\\n })),\\n\\n // 项目节点 \\n ...projectArray.map(project => ({\\n name: project,\\n value: nodeValues[project],\\n itemStyle: {\\n color: projectColors[project]\\n },\\n category: '项目',\\n depth: 1\\n })),\\n\\n // 任务节点 \\n ...taskArray.map(task => ({\\n name: task,\\n value: nodeValues[task],\\n itemStyle: {\\n color: taskColors[task]\\n },\\n category: '任务',\\n depth: 2\\n }))\\n ];\\n\\n // 生成连接 \\n const links = [];\\n\\n // 处理类型到项目的连接 \\n data.forEach(item => {\\n const projectKey = `[${item.项目ID}]${item.项目}`;\\n const source = item.类型;\\n const target = projectKey;\\n\\n const existingLink = links.find(link =>\\n link.source === source && link.target === target\\n );\\n\\n if (existingLink) {\\n existingLink.value += item.数量;\\n } else {\\n links.push({\\n source: source,\\n target: target,\\n value: item.数量,\\n sourceType: item.类型,\\n lineStyle: {\\n color: typeColors[item.类型],\\n opacity: 0.2\\n }\\n });\\n }\\n });\\n\\n // 处理项目到任务的连接 \\n data.forEach(item => {\\n const projectKey = `[${item.项目ID}]${item.项目}`;\\n const taskKey = `[${item.任务ID}]${item.任务}`;\\n\\n const existingLink = links.find(link =>\\n link.source === projectKey && link.target === taskKey\\n );\\n\\n if (existingLink) {\\n existingLink.value += item.数量;\\n } else {\\n links.push({\\n source: projectKey,\\n target: taskKey,\\n value: item.数量,\\n sourceType: item.类型,\\n lineStyle: {\\n color: typeColors[item.类型],\\n opacity: 0.2\\n }\\n });\\n }\\n });\\n\\n return { nodes, links };\\n};\\n\\n// 修改提示文字获取函数 \\nconst gettooltip = (params) => {\\n if (params.dataType === 'node') {\\n return `${params.name}
数量: ${params.value}`;\\n }\\n\\n // 获取源节点和目标节点的深度 \\n const sourceNode = params.data.source;\\n const targetNode = params.data.target;\\n const isProjectToTask = sourceNode.includes(']') && targetNode.includes(']');\\n\\n if (isProjectToTask) {\\n // 项目到任务的连接 \\n return ` \\n ${params.data.sourceType}
\\n 项目:${params.data.source}
\\n 任务:${params.data.target}
数量: ${params.value}`;\\n } else {\\n return ` \\n ${params.data.sourceType}
\\n 项目:${params.data.target}
\\n 数量: ${params.value}`;\\n }\\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 show:false;\\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 nodeAlign: 'justify',\\n orient: 'horizontal',\\n emphasis: {\\n focus: 'adjacency'\\n },\\n data: nodes,\\n links: links,\\n nodeGap: 12,\\n nodeWidth: 24,\\n draggable: true,\\n levels: [{\\n depth: 0,\\n itemStyle: {\\n borderWidth: 2\\n },\\n lineStyle: {\\n curveness: 0.5,\\n opacity: 0.8\\n }\\n }, {\\n depth: 1,\\n itemStyle: {\\n borderWidth: 1\\n },\\n lineStyle: {\\n curveness: 0.5,\\n opacity: 0.8\\n }\\n }, {\\n depth: 2,\\n itemStyle: {\\n borderWidth: 1\\n },\\n lineStyle: {\\n curveness: 0.5,\\n opacity: 0.8\\n }\\n }],\\n label: {\\n position: 'right',\\n fontSize: 10,\\n lineHeight: 14,\\n color: '#000000',\\n distance: 10,\\n formatter: function (params) {\\n var name = params.name;\\n if (name.length > 15) {\\n name = name.substring(0, 15) + '...';\\n }\\n return `${name}(${params.value})`;\\n },\\n show: true,\\n align: 'left',\\n verticalAlign: 'middle'\\n }\\n }]\\n};\",\"graphTheme\":null,\"displayMode\":\"canvas\",\"jsCode\":\"\\n async ({Context,JSONContext,ImageContext,echarts,myChart,dat,Forguncy,d3,setInterval,setTimeout,ForguncyEchartsHelper,ApplicationResource})=>{\\n var datGUI=undefined;\\n var option={};\\n console.log(JSON.stringify(Context[\\\"recommands\\\"]));\\n// 处理数据,生成节点和链接 \\nconst processData = (data) => {\\n // 生成颜色函数 - 使用HSL颜色空间,为每层生成不同的柔和颜色 \\n const generateColors = (count, depth) => {\\n const colors = [];\\n // 黄金角度 约137.5° \\n const goldenAngle = 137.5;\\n // 根据深度调整饱和度和亮度 \\n const getSaturation = (depth) => {\\n switch (depth) {\\n case 0: return '60%'; // 第一层 \\n case 1: return '50%'; // 第二层 \\n case 2: return '40%'; // 第三层 \\n default: return '50%';\\n }\\n };\\n const getLightness = (depth) => {\\n switch (depth) {\\n case 0: return '60%'; // 第一层 \\n case 1: return '60%'; // 第二层 \\n case 2: return '60%'; // 第三层 \\n default: return '60%';\\n }\\n };\\n // 使用黄金角度来生成颜色 \\n const usedHues = new Set();\\n const minHueDistance = 30; // 最小色相差 \\n for (let i = 0; i < count; i++) {\\n // 基础色相值使用黄金角度 \\n let baseHue = (i * goldenAngle) % 360;\\n // 添加小范围随机偏移,但确保与现有颜色保持最小距离 \\n let hue = baseHue;\\n let attempts = 0;\\n const maxAttempts = 10;\\n // 检查新生成的色相是否与已有的色相保持足够距离 \\n while (attempts < maxAttempts) {\\n let isValidHue = true;\\n for (const existingHue of usedHues) {\\n const distance = Math.min(Math.abs(hue - existingHue), 360 - Math.abs(hue - existingHue));\\n if (distance < minHueDistance) {\\n isValidHue = false;\\n break;\\n }\\n }\\n if (isValidHue) {\\n break;\\n }\\n // 如果当前色相不合适,添加一个小偏移再试 \\n hue = (baseHue + Math.random() * 30 - 15) % 360;\\n if (hue < 0)\\n hue += 360;\\n attempts++;\\n }\\n usedHues.add(hue);\\n colors.push(`hsl(${hue}, ${getSaturation(depth)}, ${getLightness(depth)})`);\\n }\\n return colors;\\n };\\n // 收集所有唯一的节点 \\n const typeSet = new Set(data.map(item => item.类型));\\n const projectSet = new Set();\\n const taskSet = new Set();\\n // 创建项目和任务的映射关系 \\n const projectTypeMap = new Map();\\n const taskTypeMap = new Map();\\n data.forEach(item => {\\n const projectKey = `[${item.项目ID}]${item.项目}`;\\n const taskKey = `[${item.任务ID}]${item.任务}`;\\n projectSet.add(projectKey);\\n taskSet.add(taskKey);\\n if (!projectTypeMap.has(projectKey)) {\\n projectTypeMap.set(projectKey, new Set());\\n }\\n if (!taskTypeMap.has(taskKey)) {\\n taskTypeMap.set(taskKey, new Set());\\n }\\n projectTypeMap.get(projectKey).add(item.类型);\\n taskTypeMap.get(taskKey).add(item.类型);\\n });\\n // 转换为数组 \\n const typeArray = Array.from(typeSet);\\n const projectArray = Array.from(projectSet);\\n const taskArray = Array.from(taskSet);\\n // 为每层生成颜色 \\n const typeColors = {};\\n const projectColors = {};\\n const taskColors = {};\\n const level0Colors = generateColors(typeArray.length, 0);\\n const level1Colors = generateColors(projectArray.length, 1);\\n const level2Colors = generateColors(taskArray.length, 2);\\n typeArray.forEach((type, index) => {\\n typeColors[type] = level0Colors[index];\\n });\\n projectArray.forEach((project, index) => {\\n projectColors[project] = level1Colors[index];\\n });\\n taskArray.forEach((task, index) => {\\n taskColors[task] = level2Colors[index];\\n });\\n // 计算节点值 \\n const nodeValues = {};\\n data.forEach(item => {\\n const projectKey = `[${item.项目ID}]${item.项目}`;\\n const taskKey = `[${item.任务ID}]${item.任务}`;\\n nodeValues[item.类型] = (nodeValues[item.类型] || 0) + item.数量;\\n nodeValues[projectKey] = (nodeValues[projectKey] || 0) + item.数量;\\n nodeValues[taskKey] = (nodeValues[taskKey] || 0) + item.数量;\\n });\\n // 生成节点 \\n const nodes = [\\n // 类型节点 \\n ...typeArray.map((type, index) => ({\\n name: type,\\n value: nodeValues[type],\\n itemStyle: {\\n color: typeColors[type],\\n borderColor: typeColors[type]\\n },\\n category: '类型',\\n depth: 0\\n })),\\n // 项目节点 \\n ...projectArray.map(project => ({\\n name: project,\\n value: nodeValues[project],\\n itemStyle: {\\n color: projectColors[project]\\n },\\n category: '项目',\\n depth: 1\\n })),\\n // 任务节点 \\n ...taskArray.map(task => ({\\n name: task,\\n value: nodeValues[task],\\n itemStyle: {\\n color: taskColors[task]\\n },\\n category: '任务',\\n depth: 2\\n }))\\n ];\\n // 生成连接 \\n const links = [];\\n // 处理类型到项目的连接 \\n data.forEach(item => {\\n const projectKey = `[${item.项目ID}]${item.项目}`;\\n const source = item.类型;\\n const target = projectKey;\\n const existingLink = links.find(link => link.source === source && link.target === target);\\n if (existingLink) {\\n existingLink.value += item.数量;\\n }\\n else {\\n links.push({\\n source: source,\\n target: target,\\n value: item.数量,\\n sourceType: item.类型,\\n lineStyle: {\\n color: typeColors[item.类型],\\n opacity: 0.2\\n }\\n });\\n }\\n });\\n // 处理项目到任务的连接 \\n data.forEach(item => {\\n const projectKey = `[${item.项目ID}]${item.项目}`;\\n const taskKey = `[${item.任务ID}]${item.任务}`;\\n const existingLink = links.find(link => link.source === projectKey && link.target === taskKey);\\n if (existingLink) {\\n existingLink.value += item.数量;\\n }\\n else {\\n links.push({\\n source: projectKey,\\n target: taskKey,\\n value: item.数量,\\n sourceType: item.类型,\\n lineStyle: {\\n color: typeColors[item.类型],\\n opacity: 0.2\\n }\\n });\\n }\\n });\\n return { nodes, links };\\n};\\n// 修改提示文字获取函数 \\nconst gettooltip = (params) => {\\n if (params.dataType === 'node') {\\n return `${params.name}
数量: ${params.value}`;\\n }\\n // 获取源节点和目标节点的深度 \\n const sourceNode = params.data.source;\\n const targetNode = params.data.target;\\n const isProjectToTask = sourceNode.includes(']') && targetNode.includes(']');\\n if (isProjectToTask) {\\n // 项目到任务的连接 \\n return ` \\n ${params.data.sourceType}
\\n 项目:${params.data.source}
\\n 任务:${params.data.target}
数量: ${params.value}`;\\n }\\n else {\\n return ` \\n ${params.data.sourceType}
\\n 项目:${params.data.target}
\\n 数量: ${params.value}`;\\n }\\n};\\n// 处理数据 \\nconst { nodes, links } = processData(Context[\\\"recommands\\\"]);\\n// Echarts配置 \\noption = {\\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\",\\n title: {\\n text: \\\"项目反馈桑基图\\\",\\n show: false,\\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 nodeAlign: 'justify',\\n orient: 'horizontal',\\n emphasis: {\\n focus: 'adjacency'\\n },\\n data: nodes,\\n links: links,\\n nodeGap: 12,\\n nodeWidth: 24,\\n draggable: true,\\n levels: [{\\n depth: 0,\\n itemStyle: {\\n borderWidth: 2\\n },\\n lineStyle: {\\n curveness: 0.5,\\n opacity: 0.8\\n }\\n }, {\\n depth: 1,\\n itemStyle: {\\n borderWidth: 1\\n },\\n lineStyle: {\\n curveness: 0.5,\\n opacity: 0.8\\n }\\n }, {\\n depth: 2,\\n itemStyle: {\\n borderWidth: 1\\n },\\n lineStyle: {\\n curveness: 0.5,\\n opacity: 0.8\\n }\\n }],\\n label: {\\n position: 'right',\\n fontSize: 10,\\n lineHeight: 14,\\n color: '#000000',\\n distance: 10,\\n formatter: function (params) {\\n var name = params.name;\\n if (name.length > 15) {\\n name = name.substring(0, 15) + '...';\\n }\\n return `${name}(${params.value})`;\\n },\\n show: true,\\n align: 'left',\\n verticalAlign: 'middle'\\n }\\n }]\\n};\\n\\n return {\\n option,\\n datGUI,\\n };\\n }\\n \"}" + } } }, "StyleDatas": { @@ -626,42 +778,63 @@ }, { "FontSize": 14.666666666666666, - "Foreground": 2 + "Foreground": 2, + "TextIndent": 10, + "HorizontalAlignment": 3 }, { - "FontFamily": 3, + "FontFamily": 4, "FontSize": 14.666666666666666, - "Foreground": 2 + "Foreground": 2, + "TextIndent": 10, + "HorizontalAlignment": 3 }, { - "FontFamily": 3, + "FontFamily": 4, "HorizontalAlignment": 1 }, { - "FontFamily": 3 + "FontFamily": 4 }, { - "FontFamily": 3, - "Foreground": 4 + "FontFamily": 4, + "BorderLeft": 0 }, { - "FontFamily": 3, + "FontFamily": 4, + "Foreground": 5 + }, + { + "FontFamily": 4, "FontSize": 13.333333333333332, - "Foreground": 5, + "Foreground": 6, "HorizontalAlignment": 1 }, { - "FontSize": 13.333333333333332 + "FontFamily": 4, + "FontSize": 14.666666666666666, + "Foreground": 2, + "Formatter": 7, + "TextIndent": 10, + "HorizontalAlignment": 3 + }, + { + "FontFamily": 4, + "FontSize": 37.33333333333333, + "Foreground": 0, + "HorizontalAlignment": 1 } ], "Types": { "Strs": [ "Background 1 -15", "Center", - "black", + "Background 1 0", + "Left", "Body", "Accent 1 0", - "Text 1 50" + "Text 1 50", + "General" ], "Borders": [ { @@ -670,18 +843,18 @@ ] }, "CellStyles": { - "0,32": 0, - "1,32": 0, - "1,33": 1, - "2,32": 0, + "0,33": 0, + "1,33": 0, + "1,34": 1, + "2,33": 0, "3,1": 2, - "3,32": 0, - "4,32": 0, - "5,32": 0, + "3,33": 0, + "4,33": 0, + "5,33": 0, "6,1": 3, - "6,32": 0, + "6,33": 0, "7,1": 4, - "7,32": 0, + "7,33": 0, "8,1": 4, "8,2": 4, "8,3": 4, @@ -712,104 +885,137 @@ "8,28": 4, "8,29": 4, "8,30": 4, - "9,1": 5, - "11,1": 3, - "11,43": 6, - "12,1": 7, - "13,1": 7, - "13,2": 7, - "13,3": 7, - "13,4": 7, - "13,5": 7, - "13,6": 7, - "13,7": 7, - "13,8": 7, - "13,9": 7, - "13,10": 7, - "13,11": 7, - "13,12": 7, - "13,13": 7, - "13,14": 7, - "13,15": 7, - "13,16": 7, - "13,17": 7, - "13,18": 7, - "13,19": 7, - "13,20": 7, - "13,21": 7, - "13,22": 7, - "13,23": 7, - "13,24": 7, - "13,25": 7, - "13,26": 7, - "13,27": 7, - "13,28": 7, - "13,29": 7, - "13,30": 7, - "13,33": 8, - "13,34": 8, - "13,35": 8, - "13,36": 8, - "13,37": 8, - "13,38": 8, - "13,39": 8, - "13,40": 8, - "13,41": 8, - "13,42": 8, - "13,43": 8, - "14,1": 5, - "14,2": 5, - "14,3": 5, - "14,4": 5, - "14,5": 5, - "14,6": 5, - "14,7": 5, - "14,8": 5, - "14,9": 5, - "14,10": 5, - "14,11": 5, - "14,12": 5, - "14,13": 5, - "14,14": 5, - "14,15": 5, - "14,16": 5, - "14,17": 5, - "14,18": 5, - "14,19": 5, - "14,20": 5, - "14,21": 5, - "14,22": 5, - "14,23": 5, - "14,24": 5, - "14,25": 5, - "14,26": 5, - "14,27": 5, - "14,28": 5, - "14,29": 5, - "14,30": 5, - "14,33": 8, - "14,34": 8, - "14,35": 8, - "14,36": 8, - "14,37": 8, - "14,38": 8, - "14,39": 8, - "14,40": 8, - "14,41": 8, - "14,42": 8, - "14,43": 8 + "8,31": 4, + "8,32": 5, + "8,33": 6, + "9,1": 3, + "9,2": 5, + "9,3": 5, + "9,4": 5, + "9,5": 5, + "9,6": 5, + "9,7": 5, + "9,8": 5, + "9,9": 5, + "9,10": 5, + "9,11": 5, + "9,12": 5, + "9,13": 5, + "9,14": 5, + "9,15": 5, + "9,16": 5, + "9,17": 5, + "9,18": 5, + "9,19": 5, + "9,20": 5, + "9,21": 5, + "9,22": 5, + "9,23": 5, + "9,24": 5, + "9,25": 5, + "9,26": 5, + "9,27": 5, + "9,28": 5, + "9,29": 5, + "9,30": 5, + "9,31": 5, + "9,32": 5, + "9,33": 6, + "10,1": 5, + "10,32": 5, + "10,33": 6, + "11,32": 5, + "11,33": 6, + "12,1": 3, + "12,30": 7, + "12,32": 5, + "12,33": 6, + "13,1": 8, + "13,32": 5, + "13,33": 6, + "14,1": 8, + "14,2": 8, + "14,3": 8, + "14,4": 8, + "14,5": 8, + "14,6": 8, + "14,7": 8, + "14,8": 8, + "14,9": 8, + "14,10": 8, + "14,11": 8, + "14,12": 8, + "14,13": 8, + "14,14": 8, + "14,15": 8, + "14,16": 8, + "14,17": 8, + "14,18": 8, + "14,19": 8, + "14,20": 8, + "14,21": 8, + "14,22": 8, + "14,23": 8, + "14,24": 8, + "14,25": 8, + "14,26": 8, + "14,27": 8, + "14,28": 8, + "14,29": 8, + "14,30": 8, + "14,31": 8, + "14,32": 5, + "14,33": 6, + "15,0": 5, + "15,1": 9, + "15,2": 5, + "15,3": 5, + "15,4": 5, + "15,5": 5, + "15,6": 5, + "15,7": 5, + "15,8": 5, + "15,9": 5, + "15,10": 5, + "15,11": 5, + "15,12": 5, + "15,13": 5, + "15,14": 5, + "15,15": 5, + "15,16": 5, + "15,17": 5, + "15,18": 5, + "15,19": 5, + "15,20": 5, + "15,21": 5, + "15,22": 5, + "15,23": 5, + "15,24": 5, + "15,25": 5, + "15,26": 5, + "15,27": 5, + "15,28": 5, + "15,29": 5, + "15,30": 7, + "15,32": 5, + "15,33": 6, + "15,45": 5, + "16,1": 10, + "16,32": 5, + "16,33": 6 }, "SheetStyle": { - "FontFamily": 3 + "FontFamily": 4 } }, "Spans": [ - "7,1,1,30", - "1,1,1,30", - "4,1,1,30", - "1,33,7,11", - "9,1,1,43", - "12,1,1,43" + "7,1,1,31", + "1,1,1,31", + "4,1,1,31", + "10,1,1,31", + "13,1,1,31", + "16,1,1,31", + "1,34,16,11" ], "PageInfo": { "$type": "Forguncy.Model.Pages.NormalPage, ServerDesignerCommon", @@ -846,10 +1052,98 @@ "PaperSize": {}, "Margin": {} }, + "BackgroundPictures": [ + { + "Name": "BackgroundPicture0", + "DisplayName": "背景图6", + "StyleInfo": { + "CornerRadius": 10.0, + "Fill": "Background 1 0" + }, + "IsAutomaticFill": false, + "Location": "0,895", + "Size": "1439,1346" + }, + { + "Name": "088a5640-85dd-4199-b030-c26f2e322fe2.png", + "DisplayName": "背景图1", + "StyleInfo": { + "CornerRadius": 4.0, + "Fill": "Accent 1 0", + "StrokeDashType": 8, + "Stroke": "black", + "StrokeThickness": 0.0 + }, + "IsAutomaticStroke": false, + "IsAutomaticFill": false, + "Location": "32,231", + "Size": "975,40" + }, + { + "Name": "cbbfd199-6524-4ff6-9af9-4fc0d365aafc.png", + "DisplayName": "背景图2", + "StyleInfo": { + "CornerRadius": 4.0, + "Fill": "Accent 1 0", + "StrokeDashType": 8, + "Stroke": "black", + "StrokeThickness": 0.0 + }, + "IsAutomaticStroke": false, + "IsAutomaticFill": false, + "Location": "32,470", + "Size": "975,40" + }, + { + "Name": "9b8a58b8-6510-44e8-b3a0-99b0fe46cc37.png", + "DisplayName": "背景图3", + "StyleInfo": { + "CornerRadius": 4.0, + "Fill": "Accent 1 0", + "StrokeDashType": 8, + "Stroke": "black", + "StrokeThickness": 0.0 + }, + "IsAutomaticStroke": false, + "IsAutomaticFill": false, + "Location": "32,1066", + "Size": "975,40" + }, + { + "Name": "BackgroundPicture4", + "DisplayName": "背景图4", + "StyleInfo": { + "CornerRadius": 4.0, + "Fill": "Accent 1 0", + "StrokeDashType": 8, + "Stroke": "black", + "StrokeThickness": 0.0 + }, + "IsAutomaticStroke": false, + "IsAutomaticFill": false, + "Location": "32,718", + "Size": "975,43" + }, + { + "Name": "0579a73c-8569-4603-a179-f21cf9bc1877.png", + "DisplayName": "背景图5", + "StyleInfo": { + "CornerRadius": 4.0, + "Fill": "Accent 1 0", + "StrokeDashType": 8, + "Stroke": "black", + "StrokeThickness": 0.0 + }, + "IsAutomaticStroke": false, + "IsAutomaticFill": false, + "Location": "32,1509", + "Size": "975,40" + } + ], "CustomNames": [ { "Name": "工时走势", - "Formula": "项目概况!$B$10" + "Formula": "项目概况!$B$11" }, { "Name": "关键数据", @@ -861,7 +1155,7 @@ }, { "Name": "项目动态", - "Formula": "项目概况!$AH$2" + "Formula": "项目概况!$AI$2" } ] -}//d0POc88q3/8DG/568MytKwKsvl9jxIT5NoA7q4HQNukiut4QHwBs3Hn+hRLjrc4f/v89kTrLy7cOA+1FIlO83ySi7+PBTe+5Ra8cFvIWl3dlv0zOQByPMKlhoa946X0z0ijYfq45SIXKvFmdRnrEuYF+qTMieOKOxblS1koyPwqlII1vXEyG1IFmVM1cy6lRbOQMHTLiXuiRydorB6F+kVNRc+P5WEw5Bp8AzwigRKtUZriaKdpdiM+g5Ql4FG10i0TOmVoAaF9h9lll0Eq4lY6jKBSU2AH466xBql86gtZtnij23jyRfv0nd5LrXHlPRN6RXcwr6y0ISfb+aQ/OxII3JoS87RYpdglOhP1kguTjes6hcyOmMcAULSD3ft+lW3A2yuopd+tq0MbmoEsvAkZFr1iu3JV+6+ouZsB6d31FYrqXH60muZ1xvJeTBjpEtFst3Et6kswJfDQU3txBvBYlLJbpM6maObwSYiQzLoLHuqnzndWV5Yy31ELmf1twgIMnqyp782b6R5liNuUDQoBMf7ufem8TsaNo4SNrXvF4cG2K1sxdRE2eTFJZV+08/iVMj5Imvbyp6JcDR/4E8rT0+FRJs+kEjbZtnIs3JmVJ60LQnkU+TPeWp1wX7oQUPnulAOHasCfq1prHQ3rLdFsy4WZSZkwOFbCtmBnXDwzzaNRqwpy4zgbSxD4LVhT3VltWixSm+cidfQb35faL3ySV/20cVyj8joMjjoFFLKDdChL5XGgrfkB5Z9+cH2QiNE6Zgkv3D8J24HIZER+N6GOOUirfAU5jRdV7iA2bIJcySshQPSmIKhfWPP13BiT5+G/C9KLN3CJNIG0yb5PwSSLcyfaAOpDR+UCSPyPOIJAi7IJIeOBiSp3lD/pzrHiFmsAirlKrhy7Ph+NUjhnWrw==|920 \ No newline at end of file +}//Ma6KmS7D19e8usxZm/RN+gSmWln8tSdPBZgD2ch7Q0xByNeGGdRAfn05Hln46MukpepMJSg8u22z/uDqwN3IE7Z3hPmJe7ebF4UnhEkBkJ7zdyRnlA9LiQWILkDn17m8upvPn0Fc+RVHDgh1G6n5tgsllCfz3XUgxJ1L6JOg42qX+qNSjYy3H3ttYI3FnLWOuP2S1wKpdVTovDBOC8EWwLyNM93XV7mPBstdb2OY0MVNYX9HcvEb8sUbM9AD81zZq+07hPgKYfnAnGFyeJ9F5hI96pNGzpg+qXQgqRJL4s+Jk71vMb5meCcdpRutbWnApc+EQAhXo1c6dMFcyM05RCU0j3o8eQNm+bfMMMUZXf7yWg0oco0HdOhgqL42blignKGdXIHY2Q2zR87++QXDsCCJQ03enaNHgMd7JKYZXWgzLXGbqO+1/vIpMSiLbaq4mRMizcybx7cNdhAb4DEP0j/rt36pZ+vi3b08EPU3GcG1nFSVQmRfXcJ9hDy0hIXIb1CKgzxJOOObFErfsFLfaHvhSIWFlrqDr/aKeXCT09R1ntHKBTH0oVL6JmM/VdVBAFKERQpEuj867yFhsrNzfZGNm1xE94HZ31UtxVzjwXm0DDqNiAiWKVJgS3AWvB490WcNaOfbNWC5GUaxR7CWNkNG47ct17qQxnWNqwRG6lbyb7sRm1C6tpJloCC8jBbrevL1hEhQig9Jw0XTCI75tyvofn7EpORfKDqB8xGM3RDjtG/m+DmSg6lI1dZNOLCCeGKvYNAHQBmVlYfxDgoeNsnRwwrD1OMmXIiwqpAFLMKcau5csWQYAnivx1+8gUnCQM+LgRrVxdUCFcLtEPu3txxLtezZwK6sbWJaZvOvxmxnP9PYxcl8KLwsLsPqNp37VqhdOJjwGONO39eKy54hJg==|920 \ No newline at end of file diff --git a/Pages/项目/项目首页/项目首页-容器页面/项目概况.rd b/Pages/项目/项目首页/项目首页-容器页面/项目概况.rd index dc97e2d9..c6e49697 100644 --- a/Pages/项目/项目首页/项目首页-容器页面/项目概况.rd +++ b/Pages/项目/项目首页/项目首页-容器页面/项目概况.rd @@ -1,11 +1,11 @@ { "PageType": 0, - "ColumnCount": 45, - "RowCount": 15, + "ColumnCount": 46, + "RowCount": 19, "CustomNames": [ { "Name": "工时走势", - "Formula": "项目概况!$B$10" + "Formula": "项目概况!$B$11" }, { "Name": "关键数据", @@ -17,7 +17,7 @@ }, { "Name": "项目动态", - "Formula": "项目概况!$AH$2" + "Formula": "项目概况!$AI$2" } ] } \ No newline at end of file diff --git a/UserServiceDB.sqlite3 b/UserServiceDB.sqlite3 index 0c9172c2..88d14b4f 100644 Binary files a/UserServiceDB.sqlite3 and b/UserServiceDB.sqlite3 differ