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