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