diff --git a/.collaboration b/.collaboration index 3ed38b3b..02fa47f7 100644 --- a/.collaboration +++ b/.collaboration @@ -2270,19 +2270,7 @@ }, { "ModuleName": "PCPage/工作台首页", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2024-11-05T12:26:06.9388838+08:00", - "ModuleType": 1, - "ToRemoveFiles": [ - "Pages\\工作台\\工作台首页.json", - "Pages\\工作台\\工作台首页.rd", - "Pages\\3868fc7f40b841649f14b5adba61954.json", - "Pages\\3868fc7f40b841649f14b5adba61954.rd" - ] + "ModuleType": 1 }, { "ModuleName": "PCPage/项目负荷 (2)", @@ -2530,12 +2518,6 @@ }, { "ModuleName": "TableView/项目反馈数量统计视图", - "State": 3, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2024-11-05T12:25:38.9428333+08:00", "ModuleType": 23 } ] \ No newline at end of file diff --git a/Pages/3868fc7f40b841649f14b5adba61954.json b/Pages/3868fc7f40b841649f14b5adba61954.json index d1c67ddc..497d6723 100644 --- a/Pages/3868fc7f40b841649f14b5adba61954.json +++ b/Pages/3868fc7f40b841649f14b5adba61954.json @@ -6,11 +6,21 @@ "DesignLengthInPixel": 10.0 } }, + "1": { + "GridRowColumnDefinition": { + "DesignLengthInPixel": 20.0 + } + }, "2": { "GridRowColumnDefinition": { "DesignLengthInPixel": 10.0 } }, + "3": { + "GridRowColumnDefinition": { + "DesignLengthInPixel": 20.0 + } + }, "4": { "GridRowColumnDefinition": { "DesignLengthInPixel": 5.0 @@ -27,25 +37,15 @@ "DesignLengthInPixel": 5.0 } }, - "8": { - "GridRowColumnDefinition": { - "DesignLengthInPixel": 10.0 - } - }, - "1": { - "GridRowColumnDefinition": { - "DesignLengthInPixel": 20.0 - } - }, - "3": { - "GridRowColumnDefinition": { - "DesignLengthInPixel": 20.0 - } - }, "7": { "GridRowColumnDefinition": { "DesignLengthInPixel": 20.0 } + }, + "8": { + "GridRowColumnDefinition": { + "DesignLengthInPixel": 10.0 + } } }, "Count": 9, @@ -70,11 +70,6 @@ } } }, - "6": { - "GridRowColumnDefinition": { - "DesignLengthInPixel": 10.0 - } - }, "4": { "GridRowColumnDefinition": { "DesignLengthInPixel": 20.0 @@ -84,6 +79,11 @@ "GridRowColumnDefinition": { "DesignLengthInPixel": 57.0 } + }, + "6": { + "GridRowColumnDefinition": { + "DesignLengthInPixel": 10.0 + } } }, "Count": 7, @@ -265,4 +265,4 @@ "PaperSize": {}, "Margin": {} } -}//BrbLFkReqFa34ornoz+14zGvNWTxRl/zGsbvkDkLK/Xf+HR/Tecp1XdsZSc0dhv+xQg6hGODqy9ZHMQbBVZc0ryvuJUbtPjn58cuXutjsS5WFLsHk76GkaON4CHpymwCe6+bhm3ajrUMaSzqpBHel6USL3AfgruRSQUfiy0dhmU9hMXY9I7XQTWfSERuqhQl3+PWLPWny2JoGsQ8dftRha2X7d6gebLsG4bLLlOeBW9lCQVBxc4FUfTQ9tWgd8ekjxKVGRUHHGrtl3n2CUJNOVOarLcJB3akRViJMMmtbfIeCFNBv9vp6oj040LYdXThYWtiAQ3fRVaM8GfcJeOwUyy8ab3Kv3tzn84up6pyUVoV/MFZTJtHzPAX/PAapTCjJUQf+TbyURsyDYoNuj0JyFSQeL+XnYFBPKOFR1KlbXtfpldHou2JI1Xte/GjAxG/zSqgGpIkysRVLfOY6YQ5vGwL4He6D/N76V5OMdTKB8+E+BETLPxY6CXptjXbaQx4ZhNEsMye8KZezGUU2kzdUovo63dx3FvEG1Na7PHrmUH6PkWiEsxvTGAGJQfts2LsPkUqd9jTcpLUU4PXmX6CWzyAsrXvPpN7fPnoQIwG2Qi6fiJ7S+yMjK/ESV0B5Fe2Xeulx4pLBSZ0/JkmljTwX8efbM3OJnJ2tg+fzBppeS9znB/qZD8pxoPRcmvksy1DdYQB8lmj2um/LOKHHsAfNtsphxBlpq+LD0gXcQfeO818g13xrGNIbhQLm6rgQvvkkSC8Mlqw8i183ptxX67mSwqH9MwN6MZiM6YryF199dDan6zYPdrvEr/8acI8zLNBv5YNp0gTk+5MRgL7WqttJWkqg1wwUYWjJlGMf9lBI91ASgxdwHHa1CJXwKjjlbwc39WT4JUT6Wq9eNkbp+vClw==|920 \ No newline at end of file +}//iuvgm1ZgLKPSnvwbidX515vs41grav+SxVHZWo0YsafU3yPXMFgJJD6dQLWDZF9A3JCH9XgNsNZgfuo22XxBOT0KAfDN8qd9JjpsG36MC0A45b2c5LRUdQt3MiS/FN26Nm1WB6hyPasfTaNer4VUBWs4bcjY7uTsJBV/XhcG3CE6hStLPPO+Xw09rYAzEsJeVqXz9w0swsGyfOjW28Q9JJmXf4YrEZVanxRR26pOBLAKpWqG+XfAJNGn+bVdF8HnteOJ3NvjLtNUbcB7/ZdE9zjsUdINTLc5/QmnOfYM8PBOpTU0WwHCCIVLvOOj5sOTOAzQkDvMp8Nz5nmF0RV87WjyfV8qcmW54iRp7cPpkAm+Mj0e1hgfYx/bjSmYHFc5tl746boUyxOvrQuyskSg0CfxuY/+0mS7blBDCuw2i8gF95vCIbCUhDPZqfSUsYEQj78r0mx/Zm/yu4PZXOT6Tm5nnHb13sFmzL5igHxH/B+uAIIK9FIYFx0A+OmruQsjPQTrGr/n0/qkjZth8UeIGqAz7yKxkvRwsn4gmy68SamKKYSXEPQEeb5RIxETnwph0zBezXQy4NsY/1axqNlhCs8BO5fEbC4tsCRufiF1s6/vYQ+CzhAkH85y8XtDw/Hu/qgEXLwQCPB8Ire0U3zL3fXpjPUn/fOgvFgljjJn3YGSMbhSkNplRPeeYZuYLHkyJnjak3sR6MRce5r2683J/H6Kv0V2Vc/wyDBKnDjPMow3lJXN6HhaPTw46Ig+ey3QJITr89FpI5BWjbk+2aR4ZKrrei+8F7PxxPXeYjUZPbAD45l5VVj7cOAnwK4MtgzKWohPleSiEz3N351Inc1p0ioSmtW07tJflu0Av5MVAf/aya5h2Vs0+ZyYOSTgTR1fNLdldv8edyYMyz2pnhPnsg==|920 \ No newline at end of file diff --git a/Pages/工作台/工作台首页.json b/Pages/工作台/工作台首页.json index f970d3dd..2d429aa4 100644 --- a/Pages/工作台/工作台首页.json +++ b/Pages/工作台/工作台首页.json @@ -33,11 +33,21 @@ "DesignLengthInPixel": 15.0 } }, + "6": { + "GridRowColumnDefinition": { + "DesignLengthInPixel": 32.0 + } + }, "7": { "GridRowColumnDefinition": { "DesignLengthInPixel": 10.0 } }, + "8": { + "GridRowColumnDefinition": { + "DesignLengthInPixel": 243.0 + } + }, "9": { "GridRowColumnDefinition": { "DesignLengthInPixel": 10.0 @@ -55,15 +65,7 @@ }, "12": { "GridRowColumnDefinition": { - "DesignLengthInPixel": 246.0, - "Mode": 2, - "MinLength": { - "Value": 400.0, - "Unit": 1 - }, - "MaxLength": { - "Value": 1.0 - } + "DesignLengthInPixel": 520.0 } }, "13": { @@ -73,30 +75,26 @@ }, "14": { "GridRowColumnDefinition": { - "DesignLengthInPixel": 15.0 + "DesignLengthInPixel": 50.0, + "Mode": 1 } }, "15": { + "GridRowColumnDefinition": { + "DesignLengthInPixel": 15.0 + } + }, + "16": { "GridRowColumnDefinition": { "DesignLengthInPixel": 32.0, "IsHidden": true } - }, - "6": { - "GridRowColumnDefinition": { - "DesignLengthInPixel": 32.0 - } - }, - "8": { - "GridRowColumnDefinition": { - "DesignLengthInPixel": 243.0 - } } }, "InLogicalVisibleIndexes": [ - 15 + 16 ], - "Count": 16, + "Count": 17, "DefaultSize": 10.0 }, "Cols": { @@ -303,6 +301,11 @@ "DesignLengthInPixel": 15.0 } }, + "39": { + "GridRowColumnDefinition": { + "DesignLengthInPixel": 313.0 + } + }, "40": { "GridRowColumnDefinition": { "DesignLengthInPixel": 15.0 @@ -312,11 +315,6 @@ "GridRowColumnDefinition": { "DesignLengthInPixel": 24.0 } - }, - "39": { - "GridRowColumnDefinition": { - "DesignLengthInPixel": 313.0 - } } }, "Count": 42, @@ -507,9 +505,9 @@ "CustomColumns": [] }, "DataSourceListviewName": "图文列表表格1", + "TopCount": 30, "IsLoadOnDemand": true, - "LoadOnDemandCount": 30, - "TemplateKey": "竖排无样式" + "LoadOnDemandCount": 30 } }, "10,1": { @@ -622,7 +620,7 @@ ], "JSONDataSources": [], "ImageDataSource": [], - "Config": "{\"option\":\"// 获取数据源并拆分数据 \\nvar sourceData = Context[\\\"工时统计\\\"];\\nconsole.log(sourceData);\\nvar splitData = ForguncyEchartsHelper.splitDataSource(sourceData);\\n\\n// 将数据保留到1位小数 \\nfor (var key in splitData) {\\n if (key !== \\\"执行人\\\") {\\n splitData[key] = splitData[key].map(function (value) {\\n return parseFloat(value.toFixed(1));\\n });\\n }\\n}\\n\\n// 将数据按照「总上报工时」降序序 \\nvar indices = splitData[\\\"总上报工时\\\"]\\n .map(function (value, index) { return index; })\\n .sort(function (a, b) { return splitData[\\\"总上报工时\\\"][b] - splitData[\\\"总上报工时\\\"][a]; });\\n\\n// 根据排序后的索引重组数据 \\nvar xData = indices.map(function (index) { return splitData[\\\"执行人\\\"][index]; });\\nvar totalReported = indices.map(function (index) { return splitData[\\\"总上报工时\\\"][index]; });\\nvar totalApproved = indices.map(function (index) { return splitData[\\\"总核定工时\\\"][index]; });\\nvar difference = totalReported.map(function (value, index) {\\n return parseFloat((value - totalApproved[index]).toFixed(1));\\n});\\n\\n// 配置 Echarts 的 option \\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 grid: {\\n top: 72,\\n left: \\\"24px\\\",\\n right: \\\"24px\\\",\\n bottom: \\\"24px\\\",\\n containLabel: true,\\n },\\n tooltip: {\\n trigger: 'axis',\\n axisPointer: { type: 'shadow' },\\n formatter: function (params) {\\n return params[0].name + '
' + params[0].seriesName + ':' + params[0].value + '小时' + '
' +\\n params[1].seriesName + ':' + params[1].value;\\n }\\n },\\n legend: {\\n show: false\\n },\\n xAxis: {\\n type: 'category',\\n data: xData,\\n },\\n yAxis: {\\n type: 'value',\\n axisLine: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n }\\n },\\n series: [\\n {\\n name: '已核定工时',\\n type: 'bar',\\n stack: '总量',\\n data: totalApproved,\\n itemStyle: {\\n color: '#63b5f6',\\n borderRadius:\\\"8px\\\"\\n },\\n label: {\\n show: true,\\n position: 'inside',\\n formatter: '{c}小时',\\n color: '#fff',\\n fontSize: 12\\n }\\n },\\n {\\n name: '未核定工时',\\n type: 'bar',\\n stack: '总量',\\n data: difference,\\n itemStyle: {\\n color: '#2196f3',\\n borderRadius:\\\"8px\\\"\\n },\\n label: {\\n show: true,\\n position: 'inside',\\n formatter: function (params) {\\n if (params.value > 0) {\\n return params.value + '小时';\\n } else {\\n return '';\\n }\\n },\\n color: '#fff',\\n fontSize: 12\\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 // 获取数据源并拆分数据 \\nvar sourceData = Context[\\\"工时统计\\\"];\\nconsole.log(sourceData);\\nvar splitData = ForguncyEchartsHelper.splitDataSource(sourceData);\\n// 将数据保留到1位小数 \\nfor (var key in splitData) {\\n if (key !== \\\"执行人\\\") {\\n splitData[key] = splitData[key].map(function (value) {\\n return parseFloat(value.toFixed(1));\\n });\\n }\\n}\\n// 将数据按照「总上报工时」降序序 \\nvar indices = splitData[\\\"总上报工时\\\"]\\n .map(function (value, index) { return index; })\\n .sort(function (a, b) { return splitData[\\\"总上报工时\\\"][b] - splitData[\\\"总上报工时\\\"][a]; });\\n// 根据排序后的索引重组数据 \\nvar xData = indices.map(function (index) { return splitData[\\\"执行人\\\"][index]; });\\nvar totalReported = indices.map(function (index) { return splitData[\\\"总上报工时\\\"][index]; });\\nvar totalApproved = indices.map(function (index) { return splitData[\\\"总核定工时\\\"][index]; });\\nvar difference = totalReported.map(function (value, index) {\\n return parseFloat((value - totalApproved[index]).toFixed(1));\\n});\\n// 配置 Echarts 的 option \\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 grid: {\\n top: 72,\\n left: \\\"24px\\\",\\n right: \\\"24px\\\",\\n bottom: \\\"24px\\\",\\n containLabel: true,\\n },\\n tooltip: {\\n trigger: 'axis',\\n axisPointer: { type: 'shadow' },\\n formatter: function (params) {\\n return params[0].name + '
' + params[0].seriesName + ':' + params[0].value + '小时' + '
' +\\n params[1].seriesName + ':' + params[1].value;\\n }\\n },\\n legend: {\\n show: false\\n },\\n xAxis: {\\n type: 'category',\\n data: xData,\\n },\\n yAxis: {\\n type: 'value',\\n axisLine: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n }\\n },\\n series: [\\n {\\n name: '已核定工时',\\n type: 'bar',\\n stack: '总量',\\n data: totalApproved,\\n itemStyle: {\\n color: '#63b5f6',\\n borderRadius: \\\"8px\\\"\\n },\\n label: {\\n show: true,\\n position: 'inside',\\n formatter: '{c}小时',\\n color: '#fff',\\n fontSize: 12\\n }\\n },\\n {\\n name: '未核定工时',\\n type: 'bar',\\n stack: '总量',\\n data: difference,\\n itemStyle: {\\n color: '#2196f3',\\n borderRadius: \\\"8px\\\"\\n },\\n label: {\\n show: true,\\n position: 'inside',\\n formatter: function (params) {\\n if (params.value > 0) {\\n return params.value + '小时';\\n }\\n else {\\n return '';\\n }\\n },\\n color: '#fff',\\n fontSize: 12\\n }\\n }\\n ]\\n};\\n\\n return {\\n option,\\n datGUI,\\n };\\n }\\n \"}" + "Config": "{\"option\":\"// 获取数据源并拆分数据 \\nvar sourceData = Context[\\\"工时统计\\\"];\\nconsole.log(sourceData);\\nvar splitData = ForguncyEchartsHelper.splitDataSource(sourceData);\\n\\n// 将数据保留到1位小数 \\nfor (var key in splitData) {\\n if (key !== \\\"执行人\\\") {\\n splitData[key] = splitData[key].map(function (value) {\\n return parseFloat(value.toFixed(1));\\n });\\n }\\n}\\n\\n// 将数据按照「总上报工时」降序序 \\nvar indices = splitData[\\\"总上报工时\\\"]\\n .map(function (value, index) { return index; })\\n .sort(function (a, b) { return splitData[\\\"总上报工时\\\"][b] - splitData[\\\"总上报工时\\\"][a]; });\\n\\n// 根据排序后的索引重组数据 \\nvar xData = indices.map(function (index) { return splitData[\\\"执行人\\\"][index]; });\\nvar totalReported = indices.map(function (index) { return splitData[\\\"总上报工时\\\"][index]; });\\nvar totalApproved = indices.map(function (index) { return splitData[\\\"总核定工时\\\"][index]; });\\nvar difference = totalReported.map(function (value, index) {\\n return parseFloat((value - totalApproved[index]).toFixed(1));\\n});\\n\\n// 配置 Echarts 的 option \\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 grid: {\\n top: 72,\\n left: \\\"24px\\\",\\n right: \\\"24px\\\",\\n bottom: \\\"24px\\\",\\n containLabel: true,\\n },\\n tooltip: {\\n trigger: 'axis',\\n axisPointer: { type: 'shadow' },\\n formatter: function (params) {\\n return params[0].name + '
' + params[0].seriesName + ':' + params[0].value + '小时' + '
' +\\n params[1].seriesName + ':' + params[1].value;\\n }\\n },\\n legend: {\\n show: false\\n },\\n xAxis: {\\n type: 'category',\\n data: xData,\\n },\\n yAxis: {\\n type: 'value',\\n axisLine: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n }\\n },\\n series: [\\n {\\n name: '已核定工时',\\n type: 'bar',\\n stack: '总量',\\n data: totalApproved,\\n itemStyle: {\\n color: '#63b5f6',\\n borderRadius:\\\"8px\\\"\\n },\\n label: {\\n show: true,\\n position: 'inside',\\n formatter: '{c}小时',\\n color: '#fff',\\n fontSize: 12\\n }\\n },\\n {\\n name: '未核定工时',\\n type: 'bar',\\n stack: '总量',\\n data: difference,\\n itemStyle: {\\n color: '#2196f3',\\n borderRadius:\\\"8px\\\"\\n },\\n label: {\\n show: true,\\n position: 'inside',\\n formatter: function (params) {\\n if (params.value > 0) {\\n return params.value + '小时';\\n } else {\\n return '';\\n }\\n },\\n color: '#fff',\\n fontSize: 12\\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 // 获取数据源并拆分数据 \\nvar sourceData = Context[\\\"工时统计\\\"];\\nconsole.log(sourceData);\\nvar splitData = ForguncyEchartsHelper.splitDataSource(sourceData);\\n// 将数据保留到1位小数 \\nfor (var key in splitData) {\\n if (key !== \\\"执行人\\\") {\\n splitData[key] = splitData[key].map(function (value) {\\n return parseFloat(value.toFixed(1));\\n });\\n }\\n}\\n// 将数据按照「总上报工时」降序序 \\nvar indices = splitData[\\\"总上报工时\\\"]\\n .map(function (value, index) { return index; })\\n .sort(function (a, b) { return splitData[\\\"总上报工时\\\"][b] - splitData[\\\"总上报工时\\\"][a]; });\\n// 根据排序后的索引重组数据 \\nvar xData = indices.map(function (index) { return splitData[\\\"执行人\\\"][index]; });\\nvar totalReported = indices.map(function (index) { return splitData[\\\"总上报工时\\\"][index]; });\\nvar totalApproved = indices.map(function (index) { return splitData[\\\"总核定工时\\\"][index]; });\\nvar difference = totalReported.map(function (value, index) {\\n return parseFloat((value - totalApproved[index]).toFixed(1));\\n});\\n// 配置 Echarts 的 option \\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 grid: {\\n top: 72,\\n left: \\\"24px\\\",\\n right: \\\"24px\\\",\\n bottom: \\\"24px\\\",\\n containLabel: true,\\n },\\n tooltip: {\\n trigger: 'axis',\\n axisPointer: { type: 'shadow' },\\n formatter: function (params) {\\n return params[0].name + '
' + params[0].seriesName + ':' + params[0].value + '小时' + '
' +\\n params[1].seriesName + ':' + params[1].value;\\n }\\n },\\n legend: {\\n show: false\\n },\\n xAxis: {\\n type: 'category',\\n data: xData,\\n },\\n yAxis: {\\n type: 'value',\\n axisLine: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n }\\n },\\n series: [\\n {\\n name: '已核定工时',\\n type: 'bar',\\n stack: '总量',\\n data: totalApproved,\\n itemStyle: {\\n color: '#63b5f6',\\n borderRadius: \\\"8px\\\"\\n },\\n label: {\\n show: true,\\n position: 'inside',\\n formatter: '{c}小时',\\n color: '#fff',\\n fontSize: 12\\n }\\n },\\n {\\n name: '未核定工时',\\n type: 'bar',\\n stack: '总量',\\n data: difference,\\n itemStyle: {\\n color: '#2196f3',\\n borderRadius: \\\"8px\\\"\\n },\\n label: {\\n show: true,\\n position: 'inside',\\n formatter: function (params) {\\n if (params.value > 0) {\\n return params.value + '小时';\\n }\\n else {\\n return '';\\n }\\n },\\n color: '#fff',\\n fontSize: 12\\n }\\n }\\n ]\\n};\\n\\n return {\\n option,\\n datGUI,\\n };\\n }\\n \"}" } }, "12,1": { @@ -635,111 +633,53 @@ "Name": "recommands", "BindingTableOptions": { "$type": "ServerDesignerCommon.Model.BindingDataSourceModel, ServerDesignerCommon", - "TableName": "需求反馈登记表", + "TableName": "项目反馈数量统计视图", "BindingInfos": [ { - "GUID": "6df7e763-12bb-4fe1-9cd0-98d22dfb9605", + "GUID": "d15e9015-e7dd-43c5-8527-23c05ea3599e", "BindingInfo": { - "TableName": "需求反馈登记表", - "ColumnName": "反馈类型", - "GUID": "97755fad-2aa0-4c76-bbca-06ff729db4a3", - "RelationBinding": { - "RelatedTable": "反馈类型表", - "RelatedColumn": "ID", - "DisplayColumn": "反馈类型" - } + "TableName": "项目反馈数量统计视图", + "ColumnName": "类型", + "GUID": "66ee8be0-f0bb-43f2-90a6-c5390466a33a" }, "ColumnName": "类型" }, { - "GUID": "8eb3cbbe-ce8c-4ce0-94bf-c013574f2780", + "GUID": "7c1248ae-7392-43a9-b0b9-f8f2b7d1e20e", "BindingInfo": { - "TableName": "需求反馈登记表", - "ColumnName": "项目ID", - "GUID": "9e7f3c48-3723-4caf-8b82-f9b35af544ca", - "RelationBinding": { - "RelatedTable": "项目表", - "RelatedColumn": "ID", - "DisplayColumn": "项目名称" - } + "TableName": "项目反馈数量统计视图", + "ColumnName": "项目", + "GUID": "d1a1f815-afa1-43db-bdae-abb8545711eb" }, "ColumnName": "项目" }, { - "GUID": "b9060268-2b70-4d98-b0bf-7ec2cc332651", + "GUID": "6d164818-8269-436d-a12f-097fe6f626f1", "BindingInfo": { - "TableName": "需求反馈登记表", - "ColumnName": "关联任务", - "GUID": "6edee59c-b5dd-4d12-a4cc-a0cfc853c0e9", - "RelationBinding": { - "RelatedTable": "任务平行视图", - "RelatedColumn": "ID", - "DisplayColumn": "任务名称" - } + "TableName": "项目反馈数量统计视图", + "ColumnName": "任务", + "GUID": "3967fb33-945b-465c-85d0-f4cf70adb1a1" }, "ColumnName": "任务" }, { - "GUID": "9a6c4709-4d81-4b34-b035-b7ff704e8d11", + "GUID": "91c6f208-7336-46f3-80d8-9582cde6f9b1", "BindingInfo": { - "TableName": "需求反馈登记表", + "TableName": "项目反馈数量统计视图", "ColumnName": "数量", - "GUID": "dbb1d825-96dd-41ac-b450-bd4331fdd93f" + "GUID": "01c515ec-0904-4418-ab16-7d047db97497" }, "ColumnName": "数量" } ], "NullFormulaValueQueryPolicy": 1, - "OrderBySqlCondition": { - "OrderByColumns": [ - { - "ColumnBindingInfo": { - "TableName": "需求反馈登记表", - "ColumnName": "反馈类型", - "GUID": "de92017b-747c-4f8a-8604-9050a954d7de", - "RelationBinding": { - "RelatedTable": "反馈类型表", - "RelatedColumn": "ID", - "DisplayColumn": "反馈类型" - } - }, - "Order": 0 - }, - { - "ColumnBindingInfo": { - "TableName": "需求反馈登记表", - "ColumnName": "项目ID", - "GUID": "26685434-80e4-4f71-b91a-ff0f7e6d453d", - "RelationBinding": { - "RelatedTable": "项目表", - "RelatedColumn": "ID", - "DisplayColumn": "项目名称" - } - }, - "Order": 0 - }, - { - "ColumnBindingInfo": { - "TableName": "需求反馈登记表", - "ColumnName": "关联任务", - "GUID": "1ccc11ea-bfcf-4cef-8514-c71ce9778aa9", - "RelationBinding": { - "RelatedTable": "任务平行视图", - "RelatedColumn": "ID", - "DisplayColumn": "任务名称" - } - }, - "Order": 0 - } - ] - }, "CustomColumns": [] } } ], "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 nodes = [\\n // 类型节点 \\n ...Array.from(typeSet).map((name, index) => ({\\n name: name,\\n depth: 0, // 明确指定深度 \\n itemStyle: {\\n color: '#2196f3'\\n }\\n })),\\n // 项目节点 \\n ...Array.from(projectSet).map((name, index) => ({\\n name: name,\\n depth: 1, // 明确指定深度 \\n itemStyle: {\\n color: '#ff5722'\\n }\\n })),\\n // 任务节点 \\n ...Array.from(taskSet).map((name, index) => ({\\n name: name,\\n depth: 2, // 明确指定深度 \\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 series: [{\\n type: 'sankey',\\n emphasis: {\\n focus: 'adjacency'\\n },\\n nodeAlign: 'left',\\n orient: 'horizontal',\\n data: nodes,\\n links: links,\\n layoutIterations: 64, // 增加布局迭代次数,使布局更加均匀 \\n nodeGap: 30, // 调整节点之间的间距 \\n nodeWidth: 20, // 调整节点的宽度 \\n draggable: false, // 禁止拖动,保持布局稳定 \\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: 12,\\n color: '#666',\\n formatter: function (params) {\\n return [\\n params.name,\\n `数量: ${params.value || 0}`\\n ].join('\\\\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 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 nodes = [\\n // 类型节点 \\n ...Array.from(typeSet).map((name, index) => ({\\n name: name,\\n depth: 0,\\n itemStyle: {\\n color: '#2196f3'\\n }\\n })),\\n // 项目节点 \\n ...Array.from(projectSet).map((name, index) => ({\\n name: name,\\n depth: 1,\\n itemStyle: {\\n color: '#ff5722'\\n }\\n })),\\n // 任务节点 \\n ...Array.from(taskSet).map((name, index) => ({\\n name: name,\\n depth: 2,\\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 series: [{\\n type: 'sankey',\\n emphasis: {\\n focus: 'adjacency'\\n },\\n nodeAlign: 'left',\\n orient: 'horizontal',\\n data: nodes,\\n links: links,\\n layoutIterations: 64,\\n nodeGap: 30,\\n nodeWidth: 20,\\n draggable: false,\\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: 12,\\n color: '#666',\\n formatter: function (params) {\\n return [\\n params.name,\\n `数量: ${params.value || 0}`\\n ].join('\\\\n');\\n }\\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 // 收集所有唯一的节点 \\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 }\\n },\\n series: [{\\n type: 'sankey',\\n roam: true, // 启用平移缩放 \\n scaleLimit: {\\n min: 0.2, // 最小缩放比例 \\n max: 4 // 最大缩放比例 \\n },\\n animation: true,\\n animationDuration: 300,\\n animationEasingUpdate: 'quinticInOut',\\n left: '15px',\\n top: '60px',\\n right: '120px',\\n bottom: '30px',\\n emphasis: {\\n focus: 'adjacency'\\n },\\n nodeAlign: 'left',\\n orient: 'horizontal',\\n data: nodes,\\n links: links,\\n layoutIterations: 64, // 增加布局迭代次数,使布局更加均匀 \\n nodeGap: 30, // 调整节点之间的间距 \\n nodeWidth: 20, // 调整节点的宽度 \\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 formatter: function (params) {\\n var name = params.name;\\n // 只有当value大于0时才显示数量 \\n if (params.value && params.value > 0) {\\n return `${name} * ${params.value}个`;\\n }\\n // 如果value为0或未定义,只显示名称 \\n return \\\"\\\";\\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 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 }\\n },\\n series: [{\\n type: 'sankey',\\n roam: true,\\n scaleLimit: {\\n min: 0.2,\\n max: 4 // 最大缩放比例 \\n },\\n animation: true,\\n animationDuration: 300,\\n animationEasingUpdate: 'quinticInOut',\\n left: '15px',\\n top: '60px',\\n right: '120px',\\n bottom: '30px',\\n emphasis: {\\n focus: 'adjacency'\\n },\\n nodeAlign: 'left',\\n orient: 'horizontal',\\n data: nodes,\\n links: links,\\n layoutIterations: 64,\\n nodeGap: 30,\\n nodeWidth: 20,\\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 formatter: function (params) {\\n var name = params.name;\\n // 只有当value大于0时才显示数量 \\n if (params.value && params.value > 0) {\\n return `${name} * ${params.value}个`;\\n }\\n // 如果value为0或未定义,只显示名称 \\n return \\\"\\\";\\n }\\n }\\n }]\\n};\\n\\n return {\\n option,\\n datGUI,\\n };\\n }\\n \"}" } } }, @@ -781,43 +721,8 @@ "11,40": 2, "12,1": 0, "12,40": 2, - "13,1": 0, - "13,2": 0, - "13,3": 0, - "13,4": 0, - "13,5": 0, - "13,6": 0, - "13,7": 0, - "13,8": 0, - "13,9": 0, - "13,10": 0, - "13,11": 0, - "13,12": 0, - "13,13": 0, - "13,14": 0, - "13,15": 0, - "13,16": 0, - "13,17": 0, - "13,18": 0, - "13,19": 0, - "13,20": 0, - "13,21": 0, - "13,22": 0, - "13,23": 0, - "13,24": 0, - "13,25": 0, - "13,26": 0, - "13,27": 0, - "13,28": 0, - "13,29": 0, - "13,30": 0, - "13,31": 0, - "13,32": 0, - "13,33": 0, - "13,34": 0, - "13,35": 0, - "13,36": 0, - "13,40": 2 + "13,40": 2, + "14,40": 2 }, "SheetStyle": { "FontFamily": 2, @@ -830,7 +735,7 @@ "3,1,1,36", "5,1,4,36", "10,1,1,36", - "12,1,2,36", + "12,1,3,36", "8,39,5,1" ], "PageInfo": { @@ -875,7 +780,7 @@ "Fill": "Background 2 0" }, "IsAutomaticFill": false, - "Size": "1553,1245" + "Size": "1553,1569" }, { "Name": "0f5baa2c-2dec-44c7-8a3f-45868371fe7b.png", @@ -908,7 +813,7 @@ }, "IsAutomaticFill": false, "Location": "1186,234", - "Size": "343,964" + "Size": "343,1238" }, { "Name": "9585c733-c922-4ba2-8923-e5c50a4f429c.png", @@ -930,7 +835,7 @@ }, "IsAutomaticFill": false, "Location": "24,937", - "Size": "1152,261" + "Size": "1152,585" } ] -}//jK8Q357Mi2QKIpuGYxu/T4GpwgE95aCzIn1/vnraipT0XN1oIW7pEtn5iUOCTPVrJFIfg298YYQg0w4XZFED2XOIN29hY2nUrm4ZGMLdB5aTp/0q6pA0ouFJZe+HcP85HEnsen9xhRfQrVQ422bnrK5q8xRWN+jNzDn9/MKsEKCTP6pvuRKW6HXt/GvBRtsqTUKwxA7wmybzeIXMihUHNtXss1yQsPOn+vfmHeKPaXEBAQA4REeuTuGc7smIedb8B3elUuj3bG9Uo6hUjmQU2H2l12R6NtOEOOZ56Hm3stCNmCuUfPTPY23EtscxO9qj3MU5vrNBw0VwV3ul8Jz8SjZSSEVvANX5OTE/Pt+97Z5dggUEjmHlj/xIkXpveQZHR9fn0X+Fx5ZY2mcYU84ScvPzzYtVIwgolqWvX+MzflZKFtVVUQNdaxLIMkq9hUeiEwobvAVPQ0buU48t3BTugQilj+l82YBYUC0KuEjNOFNdX8SCsei37lfcPZQZLwYPXC2VgtJYCcPQ0sa254DZJ6ifHvMg8ufGUi865pd36iOf8gLWaZC7JGU0rAe8e6xxsmvEDqv9P3bQUWmU+6tg/jleHdg86oASlEeb5paWxoM1di/boG/gPy79G9L8KIyQtuKPMQtUAKnBBy8fTppyLJxV78IuULUtjIKhUpYlgFX/pzU8luSStJWvaObdMZfbJ1UgOTMqMKuyw2h+YE7Od0/ptFAWz70HiDxVEOVduHghipwKb3X//IPD4d5uVITJ+8r+WRluTEtmjmj4vIMsXcoo0ICCR2uU7/n4S7qWsFahci39DfDX4Qp8sJMmAFfUiVdddIF41HBQR0sjFmwU12apGW1GyXv8b9qEUykDvF5bLGl1EJ7bUkZlCJeGIPBW6aa/UxujwxlcRVao9CsPIQ==|920 \ No newline at end of file +}//DYjF7nN93VfCKAFF3suSip1pQdByyHDPD2nRHbqdia/7IJKqHWmPVQ4jvK9WAmugvELvXU53tihHl+iGTeH1DirirJp1EPicmIRMp24r4pz0VaijYHW+M/2VmaGQMHlOpugT3i8nnL2U2I8dk3LHktLkY+zmO+8STcMNPwOJ3fBS50lDtSUwhIbztRIwM3/mkMsgYxOtt0Azdwvbp6TPD4FEUN/WMvDduhLvvKueixmEBJpxV61xxvtJYJooAE3PEiHKE3RZ4yJ2Bv4D3WZMae66nM7a/SuHo74194ZBIX7J0zIxDfLkWGasice+wLBETHy67jud06vO9uTiyu55kqqFRkiQL+6yk5jEzihJ+7YlwSr7d/ban0uRmygUypgPncz9TCyZcwvgiyvXbiLY3U8ulGHUFJ/y9uQEzIBFfzS3i0QkJ0G8+y7FT27fya+NAumi94u+lctCq1QZMH6rpF/OAQndbh1Bwvlw3gHY1AdbRlyuSN3P9LjxgDhVuqHIDXLJr0Qti2jw3Y60e0ka2jyyTrW31cSfpxaW1jHvAKs98yCJN1Zy4MIg2tEopAIkABkuHxMU6b2hrSLOPAICtQURdpXQFTWGFOUf3KOiQrBqNq2xAezeERhpw16Huqd34r+LBh1ljChfCwiltPJ99khWiRBPKwMxVRquL9O7PlHOh83QCNDhNfhxjIAc8y2pfg0jJbj1SxrTdyaziYpZQcWoVgX0bqbR0Q5HcMKNpRgtP564Yxw1JJYZaOWMrhZjKUQEzpgJfcd3Qtr25M7QcfroBKGF9mrsMsCREBsBt5LqZIZioYSOgQIBetZYiTgs0tUhuqrtNcx3RQURfMKnTl2ItAV6DL/ZMmC4V/P/BCwW8f1UhHfgYAOrScK/WfOIU1dvhmKxyE4igR2XC8gIRg==|920 \ No newline at end of file diff --git a/Pages/工作台/工作台首页.rd b/Pages/工作台/工作台首页.rd index 348e6258..0f0b444d 100644 --- a/Pages/工作台/工作台首页.rd +++ b/Pages/工作台/工作台首页.rd @@ -1,5 +1,5 @@ { "PageType": 0, "ColumnCount": 42, - "RowCount": 16 + "RowCount": 17 } \ No newline at end of file diff --git a/Tables/需求反馈/项目反馈数量统计视图.json b/Tables/需求反馈/项目反馈数量统计视图.json new file mode 100644 index 00000000..18342ae5 --- /dev/null +++ b/Tables/需求反馈/项目反馈数量统计视图.json @@ -0,0 +1,50 @@ +{ + "Name": "项目反馈数量统计视图", + "Columns": [ + { + "$type": "Forguncy.SaveLoad.BindingColumnSaveData, ServerDesignerCommon", + "DatabaseColumnType": "nvarchar", + "MaxLength": -1, + "Name": "类型", + "ColumnType": "System.String, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" + }, + { + "$type": "Forguncy.SaveLoad.BindingColumnSaveData, ServerDesignerCommon", + "DatabaseColumnType": "nvarchar", + "MaxLength": -1, + "Name": "项目", + "ColumnType": "System.String, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" + }, + { + "$type": "Forguncy.SaveLoad.BindingColumnSaveData, ServerDesignerCommon", + "DatabaseColumnType": "nvarchar", + "MaxLength": -1, + "Name": "任务", + "ColumnType": "System.String, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" + }, + { + "$type": "Forguncy.SaveLoad.BindingColumnSaveData, ServerDesignerCommon", + "DatabaseColumnType": "int", + "MaxLength": -1, + "Name": "数量", + "ColumnType": "System.Int32, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" + } + ], + "ExternalDatabaseInfo": { + "DataBaseType": "6db454c0-531c-4395-9122-921a18942902", + "ConnectionId": "业务表", + "SourceTableName": "项目反馈数量统计视图", + "SourceTableSchema": "dbo", + "CreateViewSql": "SELECT\r\nlx.[反馈类型] AS 类型,\r\nxm.[项目名称] AS 项目,\r\nrw.[任务名称] AS 任务,\r\ncount(main.ID) AS 数量\r\nFROM [需求反馈登记表] main\r\nLEFT JOIN [反馈类型表] lx ON main.[反馈类型] = lx.[ID]\r\nLEFT JOIN [项目表] xm ON main.[项目ID] = xm.[ID]\r\nLEFT JOIN [任务表] rw ON main.[关联任务] = rw.[ID]\r\nWHERE xm.[项目名称] is not null\r\nGROUP BY\r\nlx.[反馈类型],xm.[项目名称],rw.[任务名称]", + "ViewInfo": { + "ViewName": "项目反馈数量统计视图", + "IsUpdatable": true, + "QueryColumns": [ + "类型", + "项目", + "任务" + ] + } + }, + "Indexes": [] +} \ No newline at end of file