From e3847f9a192caa820ac1c2037066d943923a45f4 Mon Sep 17 00:00:00 2001 From: cuckooent Date: Tue, 5 Nov 2024 17:07:07 +0800 Subject: [PATCH] =?UTF-8?q?{"Message":"=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E6=97=B6=E8=A1=A8=E8=A1=A8","MessageType":2,"Modules":[{"State?= =?UTF-8?q?":1,"Type":23,"Name":"TableView/View=5F=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=B7=A5=E6=97=B6=E7=BB=9F=E8=AE=A1"},{"State":1,"Type":1,"Nam?= =?UTF-8?q?e":"PCPage/=E5=B7=A5=E4=BD=9C=E5=8F=B0=E9=A6=96=E9=A1=B5"},{"St?= =?UTF-8?q?ate":1,"Type":1,"Name":"PCPage/=E7=BB=9F=E8=AE=A1=E9=A6=96?= =?UTF-8?q?=E9=A1=B5"},{"State":1,"Type":18,"Name":"RdlReport/=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E5=B7=A5=E6=97=B6=E6=8A=A5=E8=A1=A8"},{"State":3,"Typ?= =?UTF-8?q?e":18,"Name":"RdlReport/=E5=AE=A2=E6=88=B7=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E5=B7=A5=E6=97=B6=E6=8A=A5=E8=A1=A8"}],"Version":"v1"}?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .collaboration | 55 +----- Pages/工作台/工作台首页.json | 4 +- Pages/统计/统计首页.json | 49 ++++- Reports/客户工时报表.rdlx | 2 +- Reports/客户部门工时报表.json | 296 +++++++++++++++++++++++++++++ Reports/客户部门工时报表.rdlx | 1 + Tables/工时/View_任务工时统计.json | 16 +- 7 files changed, 359 insertions(+), 64 deletions(-) create mode 100644 Reports/客户部门工时报表.json create mode 100644 Reports/客户部门工时报表.rdlx diff --git a/.collaboration b/.collaboration index 81b52c84..2b18b8f5 100644 --- a/.collaboration +++ b/.collaboration @@ -122,16 +122,7 @@ }, { "ModuleName": "TableView/View_任务工时统计", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2024-11-05T16:52:31.64344+08:00", - "ModuleType": 23, - "ToRemoveFiles": [ - "Tables\\工时\\View_任务工时统计.json" - ] + "ModuleType": 23 }, { "ModuleName": "Tables/需求反馈", @@ -2279,19 +2270,7 @@ }, { "ModuleName": "PCPage/工作台首页", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2024-11-05T16:15:02.3139817+08:00", - "ModuleType": 1, - "ToRemoveFiles": [ - "Pages\\工作台\\工作台首页.json", - "Pages\\工作台\\工作台首页.rd", - "Pages\\3868fc7f40b841649f14b5adba61954.json", - "Pages\\3868fc7f40b841649f14b5adba61954.rd" - ] + "ModuleType": 1 }, { "ModuleName": "PCPage/项目负荷 (2)", @@ -2463,17 +2442,7 @@ }, { "ModuleName": "PCPage/统计首页", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2024-11-05T16:30:19.1006505+08:00", - "ModuleType": 1, - "ToRemoveFiles": [ - "Pages\\统计\\统计首页.json", - "Pages\\统计\\统计首页.rd" - ] + "ModuleType": 1 }, { "ModuleName": "Pages/统计", @@ -2505,17 +2474,7 @@ }, { "ModuleName": "RdlReport/客户工时报表", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2024-11-05T16:29:51.4862625+08:00", - "ModuleType": 18, - "ToRemoveFiles": [ - "Reports\\客户工时报表.json", - "Reports\\客户工时报表.rdlx" - ] + "ModuleType": 18 }, { "ModuleName": "RdlReport/项目工时报表", @@ -2563,12 +2522,6 @@ }, { "ModuleName": "RdlReport/客户部门工时报表", - "State": 3, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2024-11-05T16:15:23.2913414+08:00", "ModuleType": 18 } ] \ No newline at end of file diff --git a/Pages/工作台/工作台首页.json b/Pages/工作台/工作台首页.json index c1ece950..fac21cc2 100644 --- a/Pages/工作台/工作台首页.json +++ b/Pages/工作台/工作台首页.json @@ -684,7 +684,7 @@ ], "JSONDataSources": [], "ImageDataSource": [], - "Config": "{\"option\":\"console.log(Context[\\\"recommands\\\"]);\\n\\n// 处理数据,生成节点和链接 \\nconst processData = (data) => {\\n // 生成颜色函数 - 使用HSL颜色空间 \\n const getColorByDepthAndIndex = (depth, index, totalInDepth) => {\\n // 黄金分割比 \\n const goldenRatio = 0.618033988749895;\\n\\n // 使用索引和黄金分割比来生成分散的色相值 \\n // 直接使用0-360的完整色相范围 \\n const hue = ((index * goldenRatio) % 1) * 360;\\n\\n // 统一的饱和度和明度 \\n return `hsl(${hue}, 60%, 55%)`;\\n };\\n\\n // 收集所有唯一的节点 \\n const typeSet = new Set(data.map(item => item.类型 || \\\"其他\\\"));\\n const projectSet = new Set(data.map(item => item.项目 || \\\"未知项目\\\"));\\n const taskSet = new Set(data.map(item => item.任务 || \\\"未知任务\\\"));\\n\\n // 转换为数组以便计算总数和索引 \\n const typeArray = Array.from(typeSet);\\n const projectArray = Array.from(projectSet);\\n const taskArray = Array.from(taskSet);\\n\\n // 给每个一级节点(类型)分配一个固定颜色 \\n const typeColors = {};\\n typeArray.forEach((type, index) => {\\n const hue = ((index * 0.618033988749895) % 1) * 360;\\n typeColors[type] = `hsl(${hue}, 60%, 55%)`;\\n });\\n\\n // 创建项目到类型的映射,用于追踪源头 \\n const projectToTypeMap = {};\\n data.forEach(item => {\\n projectToTypeMap[item.项目] = item.类型;\\n });\\n\\n // 预计算每个节点的总值 \\n const nodeValues = {};\\n\\n // 计算类型节点的值 \\n data.forEach(item => {\\n nodeValues[item.类型] = (nodeValues[item.类型] || 0) + item.数量;\\n nodeValues[item.项目] = (nodeValues[item.项目] || 0) + item.数量;\\n nodeValues[item.任务] = (nodeValues[item.任务] || 0) + item.数量;\\n });\\n\\n /// 生成节点数组,确保节点按照类型、项目、任务的顺序排列 \\n const nodes = [\\n // 类型节点 \\n ...typeArray.map((name, index) => ({\\n name: name,\\n depth: 0,\\n value: nodeValues[name],\\n itemStyle: {\\n color: typeColors[name],\\n borderColor: typeColors[name]\\n }\\n })),\\n // 项目节点 \\n ...projectArray.map((name, index) => ({\\n name: name,\\n depth: 1,\\n value: nodeValues[name],\\n itemStyle: {\\n color: getColorByDepthAndIndex(1, index, projectArray.length),\\n borderColor: getColorByDepthAndIndex(1, index, projectArray.length)\\n }\\n })),\\n // 任务节点 \\n ...taskArray.map((name, index) => ({\\n name: name,\\n depth: 2,\\n value: nodeValues[name],\\n itemStyle: {\\n color: getColorByDepthAndIndex(2, index, taskArray.length),\\n borderColor: getColorByDepthAndIndex(2, index, taskArray.length)\\n }\\n }))\\n ];\\n\\n\\n // 生成连接数组 \\n const links = [];\\n\\n // 类型 -> 项目的链接 \\n data.forEach(item => {\\n const existingLink = links.find(\\n link => link.source === item.类型 && link.target === item.项目\\n );\\n if (existingLink) {\\n existingLink.value += item.数量;\\n } else {\\n links.push({\\n source: item.类型,\\n target: item.项目,\\n value: item.数量,\\n lineStyle: {\\n color: typeColors[item.类型],\\n opacity: 0.7\\n }\\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 // 确保正确获取源头类型的颜色 \\n const sourceType = projectToTypeMap[item.项目];\\n if (!typeColors[sourceType]) {\\n console.warn(`找不到类型颜色: ${sourceType} for 项目: ${item.项目}`);\\n }\\n\\n links.push({\\n source: item.项目,\\n target: item.任务,\\n value: item.数量,\\n lineStyle: {\\n color: typeColors[sourceType] || '#999', // 添加后备颜色 \\n opacity: 0.7\\n },\\n // 添加源类型信息便于调试 \\n sourceType: sourceType\\n });\\n }\\n });\\n\\n return { nodes, links };\\n};\\n\\n//获取提示文字\\nconst gettooltip = (params) => {\\n console.log(params);\\n if (params.dataType === 'node') {\\n return `${params.name}\\\\n数量: ${params.value}`;\\n }\\n return `${params.data.source} → ${params.data.target}\\\\n数量: ${params.value}`;\\n}\\n\\n// 处理数据 \\nconst { nodes, links } = processData(Context[\\\"recommands\\\"]);\\n\\n// Echarts配置 \\noption = {\\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\",\\n title: {\\n text: \\\"项目反馈桑基图\\\",\\n subtext: \\\"展示各个项目任务的不同反馈分类占比\\\",\\n left: \\\"center\\\",\\n top: 24,\\n textStyle: {\\n fontSize: 16,\\n fontWeight: \\\"bold\\\",\\n },\\n },\\n tooltip: {\\n trigger: 'item',\\n triggerOn: 'mousemove',\\n formatter: gettooltip\\n },\\n series: [{\\n type: \\\"sankey\\\",\\n animation: true,\\n animationDuration: 300,\\n animationEasingUpdate: 'quinticInOut',\\n left: '5%',\\n top: '12%',\\n right: '20%',\\n bottom: '12%',\\n nodeAlign: 'left',\\n orient: 'horizontal',\\n data: nodes,\\n links: links,\\n nodeGap: 15,\\n nodeWidth: 25,\\n draggable: true,\\n lineStyle: {\\n curveness: 0.5,\\n opacity: 0.7,\\n width: function (params) {\\n return Math.max(10, params.value);\\n },\\n shadowBlur: 3,\\n shadowColor: 'rgba(0,0,0,0.2)'\\n },\\n emphasis: {\\n focus: 'adjacency',\\n lineStyle: {\\n opacity: 0.9,\\n shadowBlur: 10,\\n shadowColor: 'rgba(0,0,0,0.5)'\\n }\\n },\\n label: {\\n position: 'right',\\n fontSize: 12,\\n lineHeight: 16,\\n color: '#000000',\\n distance: 10,\\n formatter: function (params) {\\n var name = params.name;\\n if (name.length > 10) {\\n name = name.substring(0, 10) + '...';\\n }\\n if (params.value && params.value > 0) {\\n return `${name}(${params.value}个)`;\\n }\\n return \\\"\\\";\\n },\\n show: true,\\n align: 'left',\\n verticalAlign: 'middle',\\n backgroundColor: '#ffffffa1',\\n overflow: 'break',\\n padding: [4, 8],\\n borderRadius: 4\\n }\\n }]\\n};\",\"graphTheme\":null,\"displayMode\":\"canvas\",\"jsCode\":\"\\n async ({Context,JSONContext,ImageContext,echarts,myChart,dat,Forguncy,d3,setInterval,setTimeout,ForguncyEchartsHelper,PublicResource})=>{\\n var datGUI=undefined;\\n var option={};\\n console.log(Context[\\\"recommands\\\"]);\\n// 处理数据,生成节点和链接 \\nconst processData = (data) => {\\n // 生成颜色函数 - 使用HSL颜色空间 \\n const getColorByDepthAndIndex = (depth, index, totalInDepth) => {\\n // 黄金分割比 \\n const goldenRatio = 0.618033988749895;\\n // 使用索引和黄金分割比来生成分散的色相值 \\n // 直接使用0-360的完整色相范围 \\n const hue = ((index * goldenRatio) % 1) * 360;\\n // 统一的饱和度和明度 \\n return `hsl(${hue}, 60%, 55%)`;\\n };\\n // 收集所有唯一的节点 \\n const typeSet = new Set(data.map(item => item.类型 || \\\"其他\\\"));\\n const projectSet = new Set(data.map(item => item.项目 || \\\"未知项目\\\"));\\n const taskSet = new Set(data.map(item => item.任务 || \\\"未知任务\\\"));\\n // 转换为数组以便计算总数和索引 \\n const typeArray = Array.from(typeSet);\\n const projectArray = Array.from(projectSet);\\n const taskArray = Array.from(taskSet);\\n // 给每个一级节点(类型)分配一个固定颜色 \\n const typeColors = {};\\n typeArray.forEach((type, index) => {\\n const hue = ((index * 0.618033988749895) % 1) * 360;\\n typeColors[type] = `hsl(${hue}, 60%, 55%)`;\\n });\\n // 创建项目到类型的映射,用于追踪源头 \\n const projectToTypeMap = {};\\n data.forEach(item => {\\n projectToTypeMap[item.项目] = item.类型;\\n });\\n // 预计算每个节点的总值 \\n const nodeValues = {};\\n // 计算类型节点的值 \\n data.forEach(item => {\\n nodeValues[item.类型] = (nodeValues[item.类型] || 0) + item.数量;\\n nodeValues[item.项目] = (nodeValues[item.项目] || 0) + item.数量;\\n nodeValues[item.任务] = (nodeValues[item.任务] || 0) + item.数量;\\n });\\n /// 生成节点数组,确保节点按照类型、项目、任务的顺序排列 \\n const nodes = [\\n // 类型节点 \\n ...typeArray.map((name, index) => ({\\n name: name,\\n depth: 0,\\n value: nodeValues[name],\\n itemStyle: {\\n color: typeColors[name],\\n borderColor: typeColors[name]\\n }\\n })),\\n // 项目节点 \\n ...projectArray.map((name, index) => ({\\n name: name,\\n depth: 1,\\n value: nodeValues[name],\\n itemStyle: {\\n color: getColorByDepthAndIndex(1, index, projectArray.length),\\n borderColor: getColorByDepthAndIndex(1, index, projectArray.length)\\n }\\n })),\\n // 任务节点 \\n ...taskArray.map((name, index) => ({\\n name: name,\\n depth: 2,\\n value: nodeValues[name],\\n itemStyle: {\\n color: getColorByDepthAndIndex(2, index, taskArray.length),\\n borderColor: getColorByDepthAndIndex(2, index, taskArray.length)\\n }\\n }))\\n ];\\n // 生成连接数组 \\n const links = [];\\n // 类型 -> 项目的链接 \\n data.forEach(item => {\\n const existingLink = links.find(link => link.source === item.类型 && link.target === item.项目);\\n if (existingLink) {\\n existingLink.value += item.数量;\\n }\\n else {\\n links.push({\\n source: item.类型,\\n target: item.项目,\\n value: item.数量,\\n lineStyle: {\\n color: typeColors[item.类型],\\n opacity: 0.7\\n }\\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 // 确保正确获取源头类型的颜色 \\n const sourceType = projectToTypeMap[item.项目];\\n if (!typeColors[sourceType]) {\\n console.warn(`找不到类型颜色: ${sourceType} for 项目: ${item.项目}`);\\n }\\n links.push({\\n source: item.项目,\\n target: item.任务,\\n value: item.数量,\\n lineStyle: {\\n color: typeColors[sourceType] || '#999',\\n opacity: 0.7\\n },\\n // 添加源类型信息便于调试 \\n sourceType: sourceType\\n });\\n }\\n });\\n return { nodes, links };\\n};\\n//获取提示文字\\nconst gettooltip = (params) => {\\n console.log(params);\\n if (params.dataType === 'node') {\\n return `${params.name}\\\\n数量: ${params.value}`;\\n }\\n return `${params.data.source} → ${params.data.target}\\\\n数量: ${params.value}`;\\n};\\n// 处理数据 \\nconst { nodes, links } = processData(Context[\\\"recommands\\\"]);\\n// Echarts配置 \\noption = {\\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\",\\n title: {\\n text: \\\"项目反馈桑基图\\\",\\n subtext: \\\"展示各个项目任务的不同反馈分类占比\\\",\\n left: \\\"center\\\",\\n top: 24,\\n textStyle: {\\n fontSize: 16,\\n fontWeight: \\\"bold\\\",\\n },\\n },\\n tooltip: {\\n trigger: 'item',\\n triggerOn: 'mousemove',\\n formatter: gettooltip\\n },\\n series: [{\\n type: \\\"sankey\\\",\\n animation: true,\\n animationDuration: 300,\\n animationEasingUpdate: 'quinticInOut',\\n left: '5%',\\n top: '12%',\\n right: '20%',\\n bottom: '12%',\\n nodeAlign: 'left',\\n orient: 'horizontal',\\n data: nodes,\\n links: links,\\n nodeGap: 15,\\n nodeWidth: 25,\\n draggable: true,\\n lineStyle: {\\n curveness: 0.5,\\n opacity: 0.7,\\n width: function (params) {\\n return Math.max(10, params.value);\\n },\\n shadowBlur: 3,\\n shadowColor: 'rgba(0,0,0,0.2)'\\n },\\n emphasis: {\\n focus: 'adjacency',\\n lineStyle: {\\n opacity: 0.9,\\n shadowBlur: 10,\\n shadowColor: 'rgba(0,0,0,0.5)'\\n }\\n },\\n label: {\\n position: 'right',\\n fontSize: 12,\\n lineHeight: 16,\\n color: '#000000',\\n distance: 10,\\n formatter: function (params) {\\n var name = params.name;\\n if (name.length > 10) {\\n name = name.substring(0, 10) + '...';\\n }\\n if (params.value && params.value > 0) {\\n return `${name}(${params.value}个)`;\\n }\\n return \\\"\\\";\\n },\\n show: true,\\n align: 'left',\\n verticalAlign: 'middle',\\n backgroundColor: '#ffffffa1',\\n overflow: 'break',\\n padding: [4, 8],\\n borderRadius: 4\\n }\\n }]\\n};\\n\\n return {\\n option,\\n datGUI,\\n };\\n }\\n \"}" + "Config": "{\"option\":\"console.log(Context[\\\"recommands\\\"]);\\n\\n// 处理数据,生成节点和链接 \\nconst processData = (data) => {\\n // 生成颜色函数 - 使用HSL颜色空间 \\n const getColorByDepthAndIndex = (depth, index, totalInDepth) => {\\n const goldenRatio = 0.618033988749895;\\n const hue = ((index * goldenRatio) % 1) * 360;\\n return `hsl(${hue}, 60%, 55%)`;\\n };\\n\\n // 收集所有唯一的节点 \\n const typeSet = new Set(data.map(item => item.类型 || \\\"其他\\\"));\\n const projectSet = new Set(data.map(item => item.项目 || \\\"未知项目\\\"));\\n const taskSet = new Set(data.map(item => item.任务 || \\\"未知任务\\\"));\\n\\n // 转换为数组以便计算总数和索引 \\n const typeArray = Array.from(typeSet);\\n const projectArray = Array.from(projectSet);\\n const taskArray = Array.from(taskSet);\\n\\n // 给每个类型分配固定颜色 \\n const typeColors = {};\\n typeArray.forEach((type, index) => {\\n const hue = ((index * 0.618033988749895) % 1) * 360;\\n typeColors[type] = `hsl(${hue}, 60%, 55%)`;\\n });\\n\\n // 创建项目到类型的映射和任务到类型的映射\\n const projectToTypeMap = {};\\n const taskToTypeMap = {};\\n data.forEach(item => {\\n projectToTypeMap[item.项目] = item.类型;\\n taskToTypeMap[item.任务] = item.类型;\\n });\\n\\n // 预计算每个节点的总值 \\n const nodeValues = {};\\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 nodeTypeMap = new Map();\\n data.forEach(item => {\\n nodeTypeMap.set(item.类型, '类型');\\n nodeTypeMap.set(item.项目, '项目');\\n nodeTypeMap.set(item.任务, '任务');\\n });\\n\\n // 生成节点数组\\n const nodes = [\\n ...typeArray.map((name, index) => ({\\n name: name,\\n depth: 0,\\n value: nodeValues[name],\\n itemStyle: {\\n color: typeColors[name],\\n borderColor: typeColors[name]\\n },\\n category: '类型'\\n })),\\n ...projectArray.map((name, index) => ({\\n name: name,\\n depth: 1,\\n value: nodeValues[name],\\n itemStyle: {\\n color: typeColors[projectToTypeMap[name]],\\n borderColor: typeColors[projectToTypeMap[name]]\\n },\\n category: '项目',\\n sourceType: projectToTypeMap[name]\\n })),\\n ...taskArray.map((name, index) => ({\\n name: name,\\n depth: 2,\\n value: nodeValues[name],\\n itemStyle: {\\n color: typeColors[taskToTypeMap[name]],\\n borderColor: typeColors[taskToTypeMap[name]]\\n },\\n category: '任务',\\n sourceType: taskToTypeMap[name]\\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 sourceType: item.类型,\\n lineStyle: {\\n color: typeColors[item.类型],\\n opacity: 0.7\\n }\\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 const sourceType = projectToTypeMap[item.项目];\\n links.push({\\n source: item.项目,\\n target: item.任务,\\n value: item.数量,\\n sourceType: sourceType,\\n lineStyle: {\\n color: typeColors[sourceType] || '#999',\\n opacity: 0.7\\n }\\n });\\n }\\n });\\n\\n return { nodes, links };\\n};\\n\\n// 获取提示文字\\nconst gettooltip = (params) => {\\n if (params.dataType === 'node') {\\n const sourceType = params.data.sourceType ? `\\\\n来源类型: ${params.data.sourceType}` : '';\\n return `${params.name}\\\\n类别: ${params.data.category}\\\\n数量: ${params.value}${sourceType}`;\\n }\\n return `${params.data.source} → ${params.data.target}\\\\n数量: ${params.value}\\\\n类型: ${params.data.sourceType}`;\\n}\\n\\n// 处理数据 \\nconst { nodes, links } = processData(Context[\\\"recommands\\\"]);\\n\\n// Echarts配置 \\noption = {\\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\",\\n title: {\\n text: \\\"项目反馈桑基图\\\",\\n subtext: \\\"展示各个项目任务的不同反馈分类占比\\\",\\n left: \\\"center\\\",\\n top: 24,\\n textStyle: {\\n fontSize: 16,\\n fontWeight: \\\"bold\\\",\\n },\\n },\\n tooltip: {\\n trigger: 'item',\\n triggerOn: 'mousemove',\\n formatter: gettooltip\\n },\\n series: [{\\n type: \\\"sankey\\\",\\n animation: true,\\n animationDuration: 300,\\n animationEasingUpdate: 'quinticInOut',\\n left: '5%',\\n top: '12%',\\n right: '20%',\\n bottom: '12%',\\n nodeAlign: 'left',\\n orient: 'horizontal',\\n data: nodes,\\n links: links,\\n nodeGap: 15,\\n nodeWidth: 25,\\n draggable: true,\\n lineStyle: {\\n curveness: 0.5,\\n opacity: 0.7,\\n width: function (params) {\\n return Math.max(10, params.value);\\n },\\n shadowBlur: 3,\\n shadowColor: 'rgba(0,0,0,0.2)'\\n },\\n emphasis: {\\n focus: 'adjacency',\\n lineStyle: {\\n opacity: 0.9,\\n shadowBlur: 10,\\n shadowColor: 'rgba(0,0,0,0.5)'\\n }\\n },\\n label: {\\n position: 'right',\\n fontSize: 12,\\n lineHeight: 16,\\n color: '#000000',\\n distance: 10,\\n formatter: function (params) {\\n var name = params.name;\\n if (name.length > 10) {\\n name = name.substring(0, 10) + '...';\\n }\\n if (params.value && params.value > 0) {\\n return `${name}(${params.value}个)`;\\n }\\n return \\\"\\\";\\n },\\n show: true,\\n align: 'left',\\n verticalAlign: 'middle',\\n backgroundColor: '#ffffffa1',\\n overflow: 'break',\\n padding: [4, 8],\\n borderRadius: 4\\n }\\n }]\\n};\",\"graphTheme\":null,\"displayMode\":\"canvas\",\"jsCode\":\"\\n async ({Context,JSONContext,ImageContext,echarts,myChart,dat,Forguncy,d3,setInterval,setTimeout,ForguncyEchartsHelper,PublicResource})=>{\\n var datGUI=undefined;\\n var option={};\\n console.log(Context[\\\"recommands\\\"]);\\n// 处理数据,生成节点和链接 \\nconst processData = (data) => {\\n // 生成颜色函数 - 使用HSL颜色空间 \\n const getColorByDepthAndIndex = (depth, index, totalInDepth) => {\\n const goldenRatio = 0.618033988749895;\\n const hue = ((index * goldenRatio) % 1) * 360;\\n return `hsl(${hue}, 60%, 55%)`;\\n };\\n // 收集所有唯一的节点 \\n const typeSet = new Set(data.map(item => item.类型 || \\\"其他\\\"));\\n const projectSet = new Set(data.map(item => item.项目 || \\\"未知项目\\\"));\\n const taskSet = new Set(data.map(item => item.任务 || \\\"未知任务\\\"));\\n // 转换为数组以便计算总数和索引 \\n const typeArray = Array.from(typeSet);\\n const projectArray = Array.from(projectSet);\\n const taskArray = Array.from(taskSet);\\n // 给每个类型分配固定颜色 \\n const typeColors = {};\\n typeArray.forEach((type, index) => {\\n const hue = ((index * 0.618033988749895) % 1) * 360;\\n typeColors[type] = `hsl(${hue}, 60%, 55%)`;\\n });\\n // 创建项目到类型的映射和任务到类型的映射\\n const projectToTypeMap = {};\\n const taskToTypeMap = {};\\n data.forEach(item => {\\n projectToTypeMap[item.项目] = item.类型;\\n taskToTypeMap[item.任务] = item.类型;\\n });\\n // 预计算每个节点的总值 \\n const nodeValues = {};\\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 nodeTypeMap = new Map();\\n data.forEach(item => {\\n nodeTypeMap.set(item.类型, '类型');\\n nodeTypeMap.set(item.项目, '项目');\\n nodeTypeMap.set(item.任务, '任务');\\n });\\n // 生成节点数组\\n const nodes = [\\n ...typeArray.map((name, index) => ({\\n name: name,\\n depth: 0,\\n value: nodeValues[name],\\n itemStyle: {\\n color: typeColors[name],\\n borderColor: typeColors[name]\\n },\\n category: '类型'\\n })),\\n ...projectArray.map((name, index) => ({\\n name: name,\\n depth: 1,\\n value: nodeValues[name],\\n itemStyle: {\\n color: typeColors[projectToTypeMap[name]],\\n borderColor: typeColors[projectToTypeMap[name]]\\n },\\n category: '项目',\\n sourceType: projectToTypeMap[name]\\n })),\\n ...taskArray.map((name, index) => ({\\n name: name,\\n depth: 2,\\n value: nodeValues[name],\\n itemStyle: {\\n color: typeColors[taskToTypeMap[name]],\\n borderColor: typeColors[taskToTypeMap[name]]\\n },\\n category: '任务',\\n sourceType: taskToTypeMap[name]\\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 sourceType: item.类型,\\n lineStyle: {\\n color: typeColors[item.类型],\\n opacity: 0.7\\n }\\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 const sourceType = projectToTypeMap[item.项目];\\n links.push({\\n source: item.项目,\\n target: item.任务,\\n value: item.数量,\\n sourceType: sourceType,\\n lineStyle: {\\n color: typeColors[sourceType] || '#999',\\n opacity: 0.7\\n }\\n });\\n }\\n });\\n return { nodes, links };\\n};\\n// 获取提示文字\\nconst gettooltip = (params) => {\\n if (params.dataType === 'node') {\\n const sourceType = params.data.sourceType ? `\\\\n来源类型: ${params.data.sourceType}` : '';\\n return `${params.name}\\\\n类别: ${params.data.category}\\\\n数量: ${params.value}${sourceType}`;\\n }\\n return `${params.data.source} → ${params.data.target}\\\\n数量: ${params.value}\\\\n类型: ${params.data.sourceType}`;\\n};\\n// 处理数据 \\nconst { nodes, links } = processData(Context[\\\"recommands\\\"]);\\n// Echarts配置 \\noption = {\\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\",\\n title: {\\n text: \\\"项目反馈桑基图\\\",\\n subtext: \\\"展示各个项目任务的不同反馈分类占比\\\",\\n left: \\\"center\\\",\\n top: 24,\\n textStyle: {\\n fontSize: 16,\\n fontWeight: \\\"bold\\\",\\n },\\n },\\n tooltip: {\\n trigger: 'item',\\n triggerOn: 'mousemove',\\n formatter: gettooltip\\n },\\n series: [{\\n type: \\\"sankey\\\",\\n animation: true,\\n animationDuration: 300,\\n animationEasingUpdate: 'quinticInOut',\\n left: '5%',\\n top: '12%',\\n right: '20%',\\n bottom: '12%',\\n nodeAlign: 'left',\\n orient: 'horizontal',\\n data: nodes,\\n links: links,\\n nodeGap: 15,\\n nodeWidth: 25,\\n draggable: true,\\n lineStyle: {\\n curveness: 0.5,\\n opacity: 0.7,\\n width: function (params) {\\n return Math.max(10, params.value);\\n },\\n shadowBlur: 3,\\n shadowColor: 'rgba(0,0,0,0.2)'\\n },\\n emphasis: {\\n focus: 'adjacency',\\n lineStyle: {\\n opacity: 0.9,\\n shadowBlur: 10,\\n shadowColor: 'rgba(0,0,0,0.5)'\\n }\\n },\\n label: {\\n position: 'right',\\n fontSize: 12,\\n lineHeight: 16,\\n color: '#000000',\\n distance: 10,\\n formatter: function (params) {\\n var name = params.name;\\n if (name.length > 10) {\\n name = name.substring(0, 10) + '...';\\n }\\n if (params.value && params.value > 0) {\\n return `${name}(${params.value}个)`;\\n }\\n return \\\"\\\";\\n },\\n show: true,\\n align: 'left',\\n verticalAlign: 'middle',\\n backgroundColor: '#ffffffa1',\\n overflow: 'break',\\n padding: [4, 8],\\n borderRadius: 4\\n }\\n }]\\n};\\n\\n return {\\n option,\\n datGUI,\\n };\\n }\\n \"}" } }, "16,1": { @@ -1041,4 +1041,4 @@ "Size": "1473,1000" } ] -}//1LYyb7nMoLuI7UKN8tKJvaedZk9J+D8Qb/5brdHHuaQSZ4lrKC9jCypKqUsGyYlH6cAXvg2C2fT9gPi18KzBdIsghVvlaHfjnaGwynCb+XyZ9L1o8zvy/afAM++R7jmjItvy0g2lGxoUmCDIWrzFR7xBrAamDO0JlpLs4SQByUtwtoPLbF1Jdfz017gCBHmFGSiXCpdXG+Aa4ccGls6MrnLOfCSSlVOXiXcVXTDTrNzot9gS9rQLB+PI4/uCl6T66xDlYGlRtYVU2151/yUAQ2sn6qicoCQYcz3PbD0WZGhG13soWNmqxfcrqodyRh8GsSMGUH7vx6to51BNZzCO+YoYECRvCYamjGqiaRCQKl0BTb7iESOzIYSzKMmxe5UR13qg+BE2xu3uwRm5iwPAIyKeSTN7Bm2BJbPxYTGeSI2JQT1LpVY1fzWnWn9AZ69buDNmWzOKDTVS1JGK+8mSjZ+fDcGu2q6CJh19BmrIMgth+x71vegiFZgOmyyO2OGKMfkFKnF4kliFdCR81vu0iHbmpc8DXLw2EGcZdS8yCoGmoL6hpRLgOvWvIUywCKIFnr6VSZRelAFzmTA0epeYznV2o8z89jnb0ohN+x5W9fap+3QrTqS0G5scWxvDIUTXrmmfRjDcRNj/AnRSBdQGvWRmI1gsTbWVknbDJur7HgMFQD3zIBnWqco9SzVnlvMeMbM7YcQASe7xfar1zBlO3gIm5tWybQBVnopes+EPl9aOuiYYGT2Q61u1TRVUNW2ymUQWHU503RiPWOPKucPrFFGAR9BPzdOgNxGl52VUx0TIfoLKa3evELjSPylD0wPtcKvadjxr510SaxtI3hNw3HWTuvX5pf2R7sw3sodMdxWDL3cnxmn/ChmKWtNORBQSPmGa8OWATcrTW9Y0BrPNGA==|920 \ No newline at end of file +}//d/OdtusR5qSuWOcQTG6eLY4yFPWc6mSJlu1/Q2uba0vqTBM81YLRwZIxgiNHKwjJRKoKSeetAVPlq25GPy322tT32YMuvpkcl5Y9a+1BG3N6K4oE7RKCz2I3zQn9b0JVjiH1WAgaWhvXldWwoNw+U3Z1Mkexz37FJy3M/LAISHRWK5vr4KD58/9ktkT14XLA6Ccm2RY4LBxF2uF2Wdu9TvZOuY6yqfJOsvRw5M3X93nFAbsPkG/ArgeJqEORfp6+xRWE9gJHb5LPXAtvrTQRSNG6VP1AScLiIwJQHDuH2tvyD2EHlfl8blexp/EyoUX/ijCa1eiI3hTSmu0jDOP6MFdAdzdNyTsU6eO3pl2rRDM6zY1G5YFf7f38UM2o1cP7ACdOhfgS2jMo8t4rD8/ghOeFUmKNGCNFHYlcYaqjGJEHz4xrUcfOL+sxb8T4HW5TeQ2qpjuCcQU6b6alO15BjBbgh1rZBcBm/IhdKlBSDBn2CdDB/E8grmdZfWTq26qq3hewjgwCQXgnbYeI9Q0RNAWYL9jxCK2kstDy6KIZqY6H1JFrWsEpQ2e7w+4orItYF/YoPjv8wsTaTPbwVG3ueGapBvJVIP0uvvmmLeSI7bQxSDye5A+KsULFLGP6EBosjkicNoGJAWq8WeiD7n3yXglQGn8t+hnXJo+NpRMln0+fWTkoglpmqNSw/9ddYy7AinINvIclC0Sh2monz4XjsAtW/6VjH8A6+Jr38gq6ADJmrm/Pb7pFY2dEoRc+94WRETeBzTDtYT6Ru5P1PpeHflEhWJDROrDGUZjopD3AfIz+rx8tzQ5OdkTqSCdbCShzSNJKpqmFkwXRLbzRz9e4xF2SNrZrjHRzGNoG289D2MvSHhxN5zOrjUz+0gk8v5vykN1Y11mnuMmgLQiGOFBBpw==|920 \ No newline at end of file diff --git a/Pages/统计/统计首页.json b/Pages/统计/统计首页.json index 5873f3b8..6e03d3c4 100644 --- a/Pages/统计/统计首页.json +++ b/Pages/统计/统计首页.json @@ -343,13 +343,13 @@ "CommandList": [ { "$type": "Forguncy.Model.OpenActiveReportCommand, ServerDesignerCommon", - "SessionGuid": "ff1cbba5-a121-4a67-a096-87b0fb7c3e1b", + "SessionGuid": "374ad4c2-e050-43d6-ba87-e363c9b46593", "OpenReportName": "人员工时报表", "SideBarPosition": 2, "OpenReportTitle": "人员工时详情报表" } ], - "ID": "99885c4e-bfd9-43e3-918a-0e5b349ba0b7" + "ID": "f606cf14-ebed-46ec-a8b2-de09e77caf91" }, { "Condition": { @@ -367,13 +367,13 @@ "CommandList": [ { "$type": "Forguncy.Model.OpenActiveReportCommand, ServerDesignerCommon", - "SessionGuid": "8fe7b695-bd88-464d-a655-6b80e5a2ea90", + "SessionGuid": "6831ef9b-7188-478f-a9ef-c302f9dd4427", "OpenReportName": "客户工时报表", "SideBarPosition": 2, - "OpenReportTitle": "人员工时详情报表" + "OpenReportTitle": "开发服务工时报表" } ], - "ID": "32835437-2b31-4c48-83b6-94941fb2842d" + "ID": "94f0033c-0aa4-492e-a666-ff8ca1106a0a" }, { "Condition": { @@ -391,13 +391,37 @@ "CommandList": [ { "$type": "Forguncy.Model.OpenActiveReportCommand, ServerDesignerCommon", - "SessionGuid": "487a8a9d-a65f-43da-8cc0-95bfdd1e83ca", + "SessionGuid": "f25b178e-28fb-46fd-b131-03024c23315c", "OpenReportName": "项目工时报表", "SideBarPosition": 2, - "OpenReportTitle": "人员工时详情报表" + "OpenReportTitle": "项目工时详情报表" } ], - "ID": "7a721f29-9df0-4215-b4c2-d6c1c7475adf" + "ID": "f08c26a2-9bed-4189-9b75-28e256363f6b" + }, + { + "Condition": { + "$type": "Forguncy.Model.IfCondition, ServerDesignerCommon", + "param": { + "$type": "Forguncy.Model.IfConditionPageElementParam, ServerDesignerCommon", + "cellLocations": [ + { + "SerializeProperty": "=值" + } + ] + }, + "value": "部门工时报表" + }, + "CommandList": [ + { + "$type": "Forguncy.Model.OpenActiveReportCommand, ServerDesignerCommon", + "SessionGuid": "51286a26-cb1f-4e44-82dd-b577ecb1f527", + "OpenReportName": "客户部门工时报表", + "SideBarPosition": 2, + "OpenReportTitle": "开发服务工时报表" + } + ], + "ID": "eb0c2ccc-0014-4824-8c66-8c1d3b021808" } ] } @@ -462,6 +486,13 @@ "CanVisitRoleList": [ "FGC_LoginUser" ] + }, + { + "value": "部门工时报表", + "label": "部门工时报表", + "CanVisitRoleList": [ + "FGC_LoginUser" + ] } ] } @@ -649,4 +680,4 @@ "Formula": "统计首页!$M$24" } ] -}//n1LsgywkHHzmUMX0qjegqB+N3hgbK/7phAI3gyyfzfxlX7TgfzxOSe3DHLyp5zW5/6YeLX1k6Yr9CALYhcsCATVqPBAOIxZ1odfaou5D1quAkux376BDFwB58QPARefPR6YtTNLiHjqDeDiw7ipCUcyixU6IrGOM7iRu8Yr/6rgnuDMqTR8qYvMPDCMdEqQjkX7bmz+7HFOEvBm+2zSgd3NtdIxb/xdIai0pOhyJFhxQ8H7yP5oNeBrMZEjkZCDHlPQ+KAcIP490rXmcy8Y/dD36JWYqClAOQ5NJKlsGx2H4syVRTtZGZcINS/Ei/7aTpqRA3/cpztzkbqCd4QbGQqLVCia9qvvp4zAkr8xoUxyc7on3FuYnq1BWete7Chle1UmdhmonG25WMPEKeCUxwNkvzwbwYt9VInrdIFo74hpo0gaCMBq1uvADy1XVeqiiLTgqX/NnHog1gjsdJ0d9cpOx9DlZogGmw3VQaoxFJ5bmcS+arnxhLmD2lxrwfm60HNA/lH4B+bSUpyQuLwRG1L5ZseN7rtCsfUP0HwxTeEiY1ryRYZQOeeRuMrdJYxbM/h5dJHiaw+4EjbcP195hQTW34cs75ij2HxsDKBQYTli47x6x6pbKxLFUtqsetZngz/Lfa8y1GdsLHvE/i1NGM2fdWbHIUUFCQA+nIl7I49doFm4cli+5z+brDGWRedVF+rph9JU2emn+KFEA8afE+GN5H+6vffalalyyp6sEDhWMZPOAYHdM1xkYpg70EfryJE17MUcDXA+7K2hF1mRhQI9I0vEuesNuTQgnB38OYWUqZc8+F2oM4MamQ4P92QKW5MAEnK8NxFYbK0rl2EBUGL3KarUrfXOZyHxtOJAesevXUcV6xyl8SxmZSms2vrcRpUtDtXF6AKpiHzEEdgqUqA==|920 \ No newline at end of file +}//TJecZQVHAVSmF9I+o3g7h5tTdmBitfs/bb+RyC6npwcAXgutOq7MHqc8N3iLMTeNTWEs0fq2NL4Phi/7adyBxDJm0tTUqyxuI0KsHq6mYW51bAZ9ecERZShWF2NLP77a6Fi4c9dU43jTfH8B9/1HBmwGL5463pMLsScMz0xgEOqts0L9jAtaBsq3dnXRN7+vNLFDNsVxDh6ucR/UM4yChNKj3tzkchLiEJ76dyzvQOudLXsAq2wXrCUPKwPzATsNzI0JUiKGOCZU59cebfZougZigDPHrHrTaNiYx5en15KU7cL2bNoDwZZkFRiV+dbSGZkAv9cZfgO6vz4LfETFF4sPgdB4GLKMEI+h9yV7VdNTqaHmthVHAI7XC8VpikepPl3CGRX/l8OvCjgAt5xsGOKE0QSD6DdvQMKdSBpsGiBrXR8F5vM4rIBtmooxQR2c7IaP63Owpc3dWUdtaJcpNumhRf9ugyx2lLhIhZP6d2cta+Wtah0Gt+wmcU0Wha7H9QDOwUZP9FGg2qfxx0uWXr6QHDYC/Fm+tfRL1BWy2TN59C+j11yETLZNpAVTr7sJ7n7aw55Wu6hzz599rIWAKCbYWB9qI6sb9wsRKoN93Z8ZsT+5HxjYGECavzqUdWThfxgyAw4fa2/7IjD6c6EV6/vBzEZPgpXKCuqHB+Kg4kad5Bu+G76F0EoIyQkp0Gy1++ROiUC+4EnUak80IZzCGElNTHryaLajSuj5mRs8EsWp/vrukfp6+lsKD3rVl7jK+pjdiXykkDxoJ9Sf0y06lrPCNgtV7qgVYA6dhjsg5XFiJlimbuwkcWmfUmDRkCrBV2hjPZoMxmMAN2JmsbU9C2Yfdc9SzXHzaZdsKDDzUwwEIAYa/fzkWsc9NDi2NCO++Gy/obgCjoeBBjpS1YVuIQ==|920 \ No newline at end of file diff --git a/Reports/客户工时报表.rdlx b/Reports/客户工时报表.rdlx index 6bb18376..6bccdf89 100644 --- a/Reports/客户工时报表.rdlx +++ b/Reports/客户工时报表.rdlx @@ -1 +1 @@ -客户工时报表.rdlx5.251cm0cm0.049cm33.951cm5.251cm工时表_DataSet客户工时报表Auto
true1.751cm6true项目服务月度报表0.75cmtrue日期true任务true文本框3负责人true版本true内容true工时
Ascending=Fields.Item("项目ID").ValueAscending=Fields.Item("日期").ValueAscending=Fields.Item("任务ID").ValueAscending=Fields.Item("执行人").Value0.75cmTrueRestrictedtrue日期=Fields.Item("日期").ValueTrueRestrictedtrue任务名称=Fields.Item("任务名称").ValueTrueRestrictedtrue执行人=Fields.Item("执行人").ValueTrueRestrictedtrue版本名称=Fields.Item("版本名称").Valuetrue执行内容=Fields.Item("执行内容").Valuetrue上报工时=Fields.Item("上报工时").Value
1cm5true合计true=Sum(Fields!上报工时.Value)
5.538cm5.035cm4.927cm4.001cm10.401cm4.049cm
true1cm4true项目名称=Fields!项目名称.Value & IIF(IsNothing(Fields!项目代号.Value), "", "(" & Fields!项目代号.Value & ")")true小计true=Sum(Fields!上报工时.Value)
=Fields.Item("项目ID").Value
1cm1cm21cm36cm1cm1cm34cmInteger客户True客户表_DataSet客户名称IDInteger部门Truetrue客户部门_DataSet部门名称ID客户部门_DataSetIDDateTimetrue开始日期TrueDateTimetrue结束日期Truejsondoc=http://localhost:26489/Forguncy/ARDataSource/GetDataSource/34dec195-948f-493a-8364-02df3b09b8c6;schemadata={"type":"array","items":{"type":"object","properties":{"所属客户":{"type":"integer"},"所属客户部门":{"type":"integer"},"日期":{"type":"date-time"},"执行人":{"type":"string"},"项目ID":{"type":"integer"},"项目名称":{"type":"string"},"项目代号":{"type":"string"},"任务ID":{"type":"integer"},"任务名称":{"type":"string"},"版本名称":{"type":"string"},"执行内容":{"type":"string"},"上报工时":{"type":"number"}}}}JSONjsondoc=http://localhost:26489/Forguncy/ARDataSource/GetDataSource/e2702e2e-d2cf-4678-86b2-98b675666b47;schemadata={"type":"array","items":{"type":"object","properties":{"ID":{"type":"integer"},"客户名称":{"type":"string"}}}}JSONjsondoc=http://localhost:26489/Forguncy/ARDataSource/GetDataSource/9cbbe954-b292-43d0-888a-aab456f332ca;schemadata={"type":"array","items":{"type":"object","properties":{"ID":{"type":"integer"},"客户ID":{"type":"integer"},"部门名称":{"type":"string"}}}}JSON所属客户所属客户部门日期执行人项目ID项目名称项目代号任务ID任务名称版本名称执行内容上报工时=Fields!所属客户.Value=Parameters!客户.ValueEqual=Fields!所属客户部门.Value=Parameters!部门.ValueIn=Fields!日期.Value=IIF(IsNothing(Parameters!开始日期.Value), Fields!日期.Value, Parameters!开始日期.Value)GreaterThanOrEqual=Fields!日期.Value=IIF(IsNothing(Parameters!结束日期.Value), Fields!日期.Value, Parameters!结束日期.Value)LessThanOrEqual$.[*]工时表ID客户名称$.[*]客户表ID客户ID部门名称=Fields!客户ID.Value=Parameters!客户.ValueEqual$.[*]客户部门DisplayTypeGalleySizeTypeFitToWidthPaperOrientationLandscapeParametersView{"controls":[{"left":25,"top":10,"width":200,"height":75,"control":{"type":"dropdown","binding":"客户","label":{"display":"top","text":"客户","color":"default","font":{"bold":false,"italic":false,"underline":false,"transform":"none"}}}},{"left":235,"top":10,"width":200,"height":75,"control":{"type":"dropdown","binding":"部门","label":{"display":"top","text":"部门","color":"default","font":{"bold":false,"italic":false,"underline":false,"transform":"none"}}}},{"left":905,"top":40,"width":100,"height":30,"control":{"type":"button","action":"preview","text":"","background":"accent"}},{"left":795,"top":40,"width":100,"height":30,"control":{"type":"button","action":"reset","background":"warning","text":""}},{"left":445,"top":10,"width":340,"height":75,"control":{"type":"date-range","binding":["开始日期","结束日期"],"maxRange":["none"],"viewMode":"default","daysViewHeaderFormat":"","label":{"display":"top","text":"日期范围"}}}]}DefaultTheme.rdlx-theme
\ No newline at end of file +客户工时报表.rdlx5.251cm0cm0.049cm33.951cm5.251cm工时表_DataSet客户工时报表Auto
true1.751cm6true开发服务月度工时报表0.75cmtrue日期true任务true文本框3负责人true版本true内容true工时
Ascending=Fields.Item("项目ID").ValueAscending=Fields.Item("日期").ValueAscending=Fields.Item("任务ID").ValueAscending=Fields.Item("执行人").Value0.75cmTrueRestrictedtrue日期=Fields.Item("日期").ValueTrueRestrictedtrue任务名称=Fields.Item("任务名称").ValueTrueRestrictedtrue执行人=Fields.Item("执行人").ValueTrueRestrictedtrue版本名称=Fields.Item("版本名称").Valuetrue执行内容=Fields.Item("执行内容").Valuetrue上报工时=Fields.Item("上报工时").Value
1cm5true合计true=Sum(Fields!上报工时.Value)
5.538cm5.035cm4.927cm4.001cm10.401cm4.049cm
true1cm4true项目名称=Fields!项目名称.Value & IIF(IsNothing(Fields!项目代号.Value), "", "(" & Fields!项目代号.Value & ")")true小计true=Sum(Fields!上报工时.Value)
=Fields.Item("项目ID").Value
1cm1cm21cm36cm1cm1cm34cmInteger客户True客户表_DataSet客户名称IDInteger部门Truetrue客户部门_DataSet部门名称ID客户部门_DataSetIDDateTimetrue开始日期TrueDateTimetrue结束日期Truejsondoc=http://localhost:26489/Forguncy/ARDataSource/GetDataSource/34dec195-948f-493a-8364-02df3b09b8c6;schemadata={"type":"array","items":{"type":"object","properties":{"所属客户":{"type":"integer"},"所属客户部门":{"type":"integer"},"日期":{"type":"date-time"},"执行人":{"type":"string"},"项目ID":{"type":"integer"},"项目名称":{"type":"string"},"项目代号":{"type":"string"},"任务ID":{"type":"integer"},"任务名称":{"type":"string"},"版本名称":{"type":"string"},"执行内容":{"type":"string"},"上报工时":{"type":"number"}}}}JSONjsondoc=http://localhost:26489/Forguncy/ARDataSource/GetDataSource/e2702e2e-d2cf-4678-86b2-98b675666b47;schemadata={"type":"array","items":{"type":"object","properties":{"ID":{"type":"integer"},"客户名称":{"type":"string"}}}}JSONjsondoc=http://localhost:26489/Forguncy/ARDataSource/GetDataSource/9cbbe954-b292-43d0-888a-aab456f332ca;schemadata={"type":"array","items":{"type":"object","properties":{"ID":{"type":"integer"},"客户ID":{"type":"integer"},"部门名称":{"type":"string"}}}}JSON所属客户所属客户部门日期执行人项目ID项目名称项目代号任务ID任务名称版本名称执行内容上报工时=Fields!所属客户.Value=Parameters!客户.ValueEqual=Fields!所属客户部门.Value=Parameters!部门.ValueIn=Fields!日期.Value=IIF(IsNothing(Parameters!开始日期.Value), Fields!日期.Value, Parameters!开始日期.Value)GreaterThanOrEqual=Fields!日期.Value=IIF(IsNothing(Parameters!结束日期.Value), Fields!日期.Value, Parameters!结束日期.Value)LessThanOrEqual$.[*]工时表ID客户名称$.[*]客户表ID客户ID部门名称=Fields!客户ID.Value=Parameters!客户.ValueEqual$.[*]客户部门DisplayTypeGalleySizeTypeFitToWidthPaperOrientationLandscapeParametersView{"controls":[{"left":25,"top":10,"width":200,"height":75,"control":{"type":"dropdown","binding":"客户","label":{"display":"top","text":"客户","color":"default","font":{"bold":false,"italic":false,"underline":false,"transform":"none"}}}},{"left":235,"top":10,"width":200,"height":75,"control":{"type":"dropdown","binding":"部门","label":{"display":"top","text":"部门","color":"default","font":{"bold":false,"italic":false,"underline":false,"transform":"none"}}}},{"left":905,"top":40,"width":100,"height":30,"control":{"type":"button","action":"preview","text":"","background":"accent"}},{"left":795,"top":40,"width":100,"height":30,"control":{"type":"button","action":"reset","background":"warning","text":""}},{"left":445,"top":10,"width":340,"height":75,"control":{"type":"date-range","binding":["开始日期","结束日期"],"maxRange":["none"],"viewMode":"default","daysViewHeaderFormat":"","label":{"display":"top","text":"日期范围"}}}]}DefaultTheme.rdlx-theme
\ No newline at end of file diff --git a/Reports/客户部门工时报表.json b/Reports/客户部门工时报表.json new file mode 100644 index 00000000..a50d36e9 --- /dev/null +++ b/Reports/客户部门工时报表.json @@ -0,0 +1,296 @@ +{ + "Name": "客户部门工时报表", + "DataSources": [ + { + "Name": "工时表", + "GUID": "626dc4a2-38c3-4b2c-9a6d-0b539b349d64", + "DataSourceSetting": { + "TableName": "View_任务工时统计", + "BindingInfos": [ + { + "GUID": "6e3465c4-ccdf-4085-a2dc-e23a05ef68a0", + "BindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "项目ID", + "GUID": "a3d0ba0f-de86-4698-a758-9bc78e63dcbd", + "RelationBinding": { + "RelatedTable": "项目平行视图", + "RelatedColumn": "ID", + "DisplayColumn": "所属客户" + } + }, + "ColumnName": "所属客户" + }, + { + "GUID": "262adc93-673d-4f70-a566-304590ff8ced", + "BindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "项目ID", + "GUID": "c554b7d7-210f-428c-b5c8-53d3d9b68f84", + "RelationBinding": { + "RelatedTable": "项目平行视图", + "RelatedColumn": "ID", + "DisplayColumn": "所属客户部门" + } + }, + "ColumnName": "部门ID" + }, + { + "GUID": "43d34edc-1e3f-4775-85ad-c5178fb0ed13", + "BindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "项目ID", + "GUID": "f0bd613b-9a27-4d8d-8f4e-02dfb64b3a8e", + "RelationBinding": { + "RelatedTable": "项目平行视图", + "RelatedColumn": "ID", + "DisplayColumn": "所属客户部门", + "NextRelationBinding": { + "RelatedTable": "客户部门表", + "RelatedColumn": "ID", + "DisplayColumn": "部门名称" + } + } + }, + "ColumnName": "部门名称" + }, + { + "GUID": "dcc73f4f-4433-4109-85e1-70b0311734cf", + "BindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "日期", + "GUID": "5c45e4e4-202f-47c4-a864-46e79706c52c" + }, + "ColumnName": "日期" + }, + { + "GUID": "d667dd4a-0de8-4d4b-b108-d3d0cdb1dbad", + "BindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "执行人", + "GUID": "0614a00c-1af1-49cc-9b79-ccf3513069de", + "AttachType": { + "$type": "ForguncyDataAccess.UserColumnAttachObj, ForguncyDataAccess", + "UserColumnAttachType": 1 + } + }, + "ColumnName": "执行人" + }, + { + "GUID": "978e8680-a4fc-408d-b8b5-6dd5a450380a", + "BindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "项目ID", + "GUID": "e3029b2a-dcec-4c12-bdbb-f9cf00e7890a" + }, + "ColumnName": "项目ID" + }, + { + "GUID": "382b8827-861d-4493-a53c-ed86ac3f1233", + "BindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "项目名称", + "GUID": "583e5d5b-40e0-4a59-891e-30351ebc5d4a" + }, + "ColumnName": "项目名称" + }, + { + "GUID": "681d783f-0f86-4ecf-8e2b-eb5ed6ebf779", + "BindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "任务ID", + "GUID": "99b0a01a-2530-4fe7-8a22-7b618aaeba03" + }, + "ColumnName": "任务ID" + }, + { + "GUID": "a28db579-b2c3-41b1-88b6-805ed071d2bf", + "BindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "任务名称", + "GUID": "1409de08-8af1-454e-b331-bc38d29f497e" + }, + "ColumnName": "任务名称" + }, + { + "GUID": "5062ddff-1878-401a-ac9a-ce1f9b1ad3a5", + "BindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "任务ID", + "GUID": "c9348399-b6ad-45ce-bf61-79a0e4348934", + "RelationBinding": { + "RelatedTable": "任务平行视图", + "RelatedColumn": "ID", + "DisplayColumn": "版本", + "NextRelationBinding": { + "RelatedTable": "项目版本", + "RelatedColumn": "ID", + "DisplayColumn": "版本名称" + } + } + }, + "ColumnName": "版本名称" + }, + { + "GUID": "a48c52c0-d8df-4e01-be23-3410d6376150", + "BindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "执行内容", + "GUID": "f60c3820-94a6-49b4-9c02-14c5a593c944" + }, + "ColumnName": "执行内容" + }, + { + "GUID": "cdb09b4f-5074-4a40-82fd-d12c70af9ba9", + "BindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "上报工时", + "GUID": "40a3a387-1863-4fb3-9619-c1f768bd2b24" + }, + "ColumnName": "上报工时" + }, + { + "GUID": "085ce2f6-1694-44a4-91c6-bd889cf89acb", + "BindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "上报人天", + "GUID": "57c4de08-80ff-460b-abd9-fa850441904d" + }, + "ColumnName": "上报人天" + } + ], + "SqlCondition": { + "$type": "ForguncyDataAccess.GeneralCESqlCondition, ForguncyDataAccess", + "CompareType": 2, + "ColumnBindingInfo": { + "TableName": "View_任务工时统计", + "ColumnName": "上报工时", + "GUID": "76027b54-2310-4946-b120-2376da07a655" + }, + "Value": "0" + } + }, + "ColumnsType": [ + "integer", + "integer", + "string", + "date-time", + "string", + "integer", + "string", + "integer", + "string", + "string", + "string", + "number", + "number" + ] + }, + { + "Name": "客户表", + "GUID": "04414b10-23b8-43e4-bad1-ce5281cc2d3a", + "DataSourceSetting": { + "TableName": "客户表", + "BindingInfos": [ + { + "GUID": "e1967e3b-1188-475c-81eb-f6832b550126", + "BindingInfo": { + "TableName": "客户表", + "ColumnName": "ID", + "GUID": "77846f21-5096-4d64-b49d-ef462fe94569" + }, + "ColumnName": "ID" + }, + { + "GUID": "c008a240-9240-4d41-829c-ceb226f7d6da", + "BindingInfo": { + "TableName": "客户表", + "ColumnName": "客户名称", + "GUID": "13bddc6f-684e-44cd-a6f4-14e43a5426d8" + }, + "ColumnName": "客户名称" + } + ], + "SqlCondition": { + "$type": "ForguncyDataAccess.GeneralCESqlCondition, ForguncyDataAccess", + "CompareType": 1, + "ColumnBindingInfo": { + "TableName": "客户表", + "ColumnName": "删除", + "GUID": "61812702-3e37-4f5f-b60d-ade7bf90b9e8" + }, + "Value": "1" + } + }, + "ColumnsType": [ + "integer", + "string" + ] + }, + { + "Name": "客户部门", + "GUID": "276a04a7-4c76-4074-85c4-6f8e0902f8ba", + "DataSourceSetting": { + "TableName": "客户部门表", + "BindingInfos": [ + { + "GUID": "9c169d21-9c50-4b2b-86d3-3287f254dfba", + "BindingInfo": { + "TableName": "客户部门表", + "ColumnName": "ID", + "GUID": "ea95d20d-4b14-483e-9075-52e143f83b3c" + }, + "ColumnName": "ID" + }, + { + "GUID": "4e6d2860-e7a6-4d86-913e-ee63ab9da727", + "BindingInfo": { + "TableName": "客户部门表", + "ColumnName": "客户ID", + "GUID": "5c6dc0bf-7414-42d6-adec-bf8fcabc5fe5" + }, + "ColumnName": "客户ID" + }, + { + "GUID": "df730495-3c7e-4534-a8a2-631954009375", + "BindingInfo": { + "TableName": "客户部门表", + "ColumnName": "部门名称", + "GUID": "c63eb029-8273-452f-a69b-9a546150fbec" + }, + "ColumnName": "部门名称" + } + ] + }, + "ColumnsType": [ + "integer", + "integer", + "string" + ] + } + ], + "PermissionData": { + "$type": "Forguncy.RbacPermission.Core.Impl.ActiveReport.ActiveReportPermissionData, Forguncy.RbacPermission.Core", + "permissionResource": { + "$type": "Forguncy.RbacPermission.Core.Impl.ActiveReport.ActiveReportPermissionResource, Forguncy.RbacPermission.Core", + "activeReportType": 1 + }, + "permissionBindings": [ + { + "$type": "Forguncy.RbacPermission.Core.Impl.ActiveReport.ActiveReportPermissionBinding, Forguncy.RbacPermission.Core", + "activeReportPermissionType": 1, + "roleNames": [ + "FGC_LoginUser" + ] + }, + { + "$type": "Forguncy.RbacPermission.Core.Impl.ActiveReport.ActiveReportPermissionBinding, Forguncy.RbacPermission.Core", + "activeReportPermissionType": 2, + "roleNames": [ + "FGC_LoginUser" + ] + } + ] + }, + "ReportType": 1 +} \ No newline at end of file diff --git a/Reports/客户部门工时报表.rdlx b/Reports/客户部门工时报表.rdlx new file mode 100644 index 00000000..72061405 --- /dev/null +++ b/Reports/客户部门工时报表.rdlx @@ -0,0 +1 @@ +客户部门工时报表.rdlx4.251cm0cm0.122cm44.256cm4.251cm工时表_DataSet客户工时报表Auto
1.751cm8true开发服务月度工时报表0.75cmtrue日期true部门true项目true文本框32版本true任务true文本框3负责人true内容true=IIF(Parameters!显示工时.Value, "工时", "人天")
=Fields.Item("日期").Value=Fields.Item("部门ID").Value=Fields.Item("项目ID").Value=Fields.Item("版本名称").Value=Fields.Item("任务ID").Value=Fields.Item("执行人").Value=Fields.Item("执行内容").Value=Fields.Item("上报工时").ValueAscending=Fields.Item("日期").ValueAscending=Fields.Item("项目ID").ValueAscending=Fields.Item("任务ID").ValueAscending=Fields.Item("执行人").Value0.75cmtrue日期=Fields.Item("日期").Valuetrue部门名称=Fields.Item("部门名称").Valuetrue项目名称=Fields.Item("项目名称").Valuetrue版本名称=Fields.Item("版本名称").Valuetrue任务名称=Fields.Item("任务名称").Valuetrue执行人=Fields.Item("执行人").Valuetrue执行内容=Fields.Item("执行内容").Valuetrue上报人天=IIF(Parameters!显示工时.Value, Fields!上报工时.Value, Fields!上报人天.Value)
1cm7true合计true=IIF(Parameters!显示工时.Value, Sum(Fields!上报工时.Value), Sum(Fields!上报人天.Value))
4.453cm4.5cm6.045cm3.879cm6.002cm4.927cm10.401cm4.049cm
1cm1cm100cm48cm1cm1cm44.378cmInteger客户True客户表_DataSet客户名称IDInteger部门Truetrue客户部门_DataSet部门名称ID客户部门_DataSetIDDateTimetrue开始日期TrueDateTimetrue结束日期TrueBoolean勾选择显示工时,否则显示人天Truetruejsondoc=http://localhost:26489/Forguncy/ARDataSource/GetDataSource/626dc4a2-38c3-4b2c-9a6d-0b539b349d64;schemadata={"type":"array","items":{"type":"object","properties":{"所属客户":{"type":"integer"},"部门ID":{"type":"integer"},"部门名称":{"type":"string"},"日期":{"type":"date-time"},"执行人":{"type":"string"},"项目ID":{"type":"integer"},"项目名称":{"type":"string"},"任务ID":{"type":"integer"},"任务名称":{"type":"string"},"版本名称":{"type":"string"},"执行内容":{"type":"string"},"上报工时":{"type":"number"},"上报人天":{"type":"number"}}}}JSONjsondoc=http://localhost:26489/Forguncy/ARDataSource/GetDataSource/04414b10-23b8-43e4-bad1-ce5281cc2d3a;schemadata={"type":"array","items":{"type":"object","properties":{"ID":{"type":"integer"},"客户名称":{"type":"string"}}}}JSONjsondoc=http://localhost:26489/Forguncy/ARDataSource/GetDataSource/276a04a7-4c76-4074-85c4-6f8e0902f8ba;schemadata={"type":"array","items":{"type":"object","properties":{"ID":{"type":"integer"},"客户ID":{"type":"integer"},"部门名称":{"type":"string"}}}}JSON所属客户部门ID部门名称日期执行人项目ID项目名称任务ID任务名称版本名称执行内容上报工时上报人天=Fields!所属客户.Value=Parameters!客户.ValueEqual=Fields!部门ID.Value=IIF(IsNothing(Parameters!部门.Value), Fields!部门ID.Value, Parameters!部门.Value)In=Fields!日期.Value=IIF(IsNothing(Parameters!开始日期.Value), Fields!日期.Value, Parameters!开始日期.Value)GreaterThanOrEqual=Fields!日期.Value=IIF(IsNothing(Parameters!结束日期.Value), Fields!日期.Value, Parameters!结束日期.Value)LessThanOrEqual$.[*]工时表ID客户名称$.[*]客户表ID客户ID部门名称=Fields!客户ID.Value=Parameters!客户.ValueEqual$.[*]客户部门DisplayTypeGalleySizeTypeFitToWidthPaperOrientationLandscapeParametersView{"controls":[{"left":25,"top":10,"width":200,"height":75,"control":{"type":"dropdown","binding":"客户","label":{"display":"top","text":"客户","color":"default","font":{"bold":false,"italic":false,"underline":false,"transform":"none"}}}},{"left":235,"top":10,"width":200,"height":75,"control":{"type":"dropdown","binding":"部门","label":{"display":"top","text":"部门","color":"default","font":{"bold":false,"italic":false,"underline":false,"transform":"none"}}}},{"left":1045,"top":40,"width":100,"height":30,"control":{"type":"button","action":"preview","text":"","background":"accent"}},{"left":935,"top":40,"width":100,"height":30,"control":{"type":"button","action":"reset","background":"warning","text":""}},{"left":445,"top":10,"width":340,"height":75,"control":{"type":"date-range","binding":["开始日期","结束日期"],"maxRange":["none"],"viewMode":"default","daysViewHeaderFormat":"","label":{"display":"top","text":"日期范围"}}},{"left":795,"top":10,"width":125,"height":75,"control":{"type":"boolean","binding":["显示工时"],"label":{"display":"top","text":"工时显示方式"},"subType":"toggle","text":"布尔型","textTrue":"工时","textFalse":"人天","layout":"horizontal"}}]}DefaultTheme.rdlx-theme
\ No newline at end of file diff --git a/Tables/工时/View_任务工时统计.json b/Tables/工时/View_任务工时统计.json index b3bc5506..bd0e9370 100644 --- a/Tables/工时/View_任务工时统计.json +++ b/Tables/工时/View_任务工时统计.json @@ -94,6 +94,13 @@ "Name": "上报工时", "ColumnType": "System.Double, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" }, + { + "$type": "Forguncy.SaveLoad.BindingColumnSaveData, ServerDesignerCommon", + "DatabaseColumnType": "float", + "MaxLength": -1, + "Name": "上报人天", + "ColumnType": "System.Double, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" + }, { "$type": "Forguncy.SaveLoad.BindingColumnSaveData, ServerDesignerCommon", "DatabaseColumnType": "float", @@ -101,6 +108,13 @@ "Name": "核定工时", "ColumnType": "System.Double, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" }, + { + "$type": "Forguncy.SaveLoad.BindingColumnSaveData, ServerDesignerCommon", + "DatabaseColumnType": "float", + "MaxLength": -1, + "Name": "核定人天", + "ColumnType": "System.Double, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" + }, { "$type": "Forguncy.SaveLoad.BindingColumnSaveData, ServerDesignerCommon", "DatabaseColumnType": "float", @@ -182,7 +196,7 @@ "ConnectionId": "业务表", "SourceTableName": "View_任务工时统计", "SourceTableSchema": "dbo", - "CreateViewSql": "WITH c1 as (\r\n\tSELECT\r\n\t t.[ID],\r\n\t\t[项目ID],\r\n\t\t[任务ID],\r\n\t\t[执行内容],\r\n\t\t[执行人],\r\n\t\t[工时日期],\r\n\t\t[时薪单价],\r\n\t\t[提成系数],\r\n\t\t[请款单ID],\r\n\t\tISNULL([上报工时],0) AS 上报工时,\r\n\t\tROUND(CASE WHEN [工时类型] = '计划' THEN ISNULL([工时],0) ELSE 0 END,1) AS [计划工时],\r\n\t\tROUND(CASE WHEN [工时类型] = '实际' THEN ISNULL([工时],0) ELSE 0 END,1) AS [实际工时]\r\n\tFROM \r\n\t\t[dbo].[任务工时表] t\r\n\tLEFT JOIN [项目表] p ON t.项目ID = p.ID\r\n)\r\n\r\nSELECT\r\n cast(c1.[工时日期] as date) as 日期,\r\n\t\tc1.[执行人],\r\n c1.[项目ID],\r\n\t\txm.[项目名称],\r\n c1.[任务ID],\r\n\t\trw.[任务名称],\r\n\t\trw.[任务说明],\r\n\t\tSTRING_AGG(c1.[执行内容], CHAR(13) + CHAR(10)) AS 执行内容,\r\n\t\tFGC_Creator='Administrator',\r\n AVG(c1.[时薪单价]) AS 时薪单价,\r\n AVG(c1.[提成系数]) AS 提成系数,\r\n SUM(c1.[计划工时]) AS 计划工时,\r\n\t\tSUM(c1.[上报工时]) AS 上报工时,\r\n SUM(c1.[实际工时]) AS 核定工时,\r\n SUM(c1.[实际工时]*c1.[时薪单价] *c1.[提成系数]) as 核定收益\r\nFROM c1\r\nLEFT JOIN [项目表] xm ON c1.[项目ID] = xm.ID\r\nLEFT JOIN [任务表] rw ON c1.[任务ID] = rw.ID\r\nGROUP BY\r\ncast([工时日期] as date),\r\nc1.[执行人],\r\nc1.[项目ID],\r\nxm.[项目名称],\r\nrw.[任务说明],\r\nc1.[任务ID],\r\nrw.[任务名称]", + "CreateViewSql": "WITH c1 as (\r\n\tSELECT\r\n\t t.[ID],\r\n\t\t[项目ID],\r\n\t\t[任务ID],\r\n\t\t[执行内容],\r\n\t\t[执行人],\r\n\t\t[工时日期],\r\n\t\t[时薪单价],\r\n\t\t[提成系数],\r\n\t\t[请款单ID],\r\n\t\tISNULL([上报工时],0) AS 上报工时,\r\n\t\tROUND(CASE WHEN [工时类型] = '计划' THEN ISNULL([工时],0) ELSE 0 END,1) AS [计划工时],\r\n\t\tROUND(CASE WHEN [工时类型] = '实际' THEN ISNULL([工时],0) ELSE 0 END,1) AS [实际工时]\r\n\tFROM \r\n\t\t[dbo].[任务工时表] t\r\n\tLEFT JOIN [项目表] p ON t.项目ID = p.ID\r\n)\r\n\r\nSELECT\r\n cast(c1.[工时日期] as date) as 日期,\r\n\t\tc1.[执行人],\r\n c1.[项目ID],\r\n\t\txm.[项目名称],\r\n c1.[任务ID],\r\n\t\trw.[任务名称],\r\n\t\trw.[任务说明],\r\n\t\tSTRING_AGG(c1.[执行内容], CHAR(13) + CHAR(10)) AS 执行内容,\r\n\t\tFGC_Creator='Administrator',\r\n AVG(c1.[时薪单价]) AS 时薪单价,\r\n AVG(c1.[提成系数]) AS 提成系数,\r\n SUM(c1.[计划工时]) AS 计划工时,\r\n\t\tSUM(c1.[上报工时]) AS 上报工时,\r\n\t\tCEILING(SUM(c1.[上报工时])/8 * 10) / 10 AS 上报人天,\r\n SUM(c1.[实际工时]) AS 核定工时,\r\n\t\tCEILING(SUM(c1.[实际工时])/8 * 10) / 10 AS 核定人天,\r\n SUM(c1.[实际工时]*c1.[时薪单价] *c1.[提成系数]) as 核定收益\r\nFROM c1\r\nLEFT JOIN [项目表] xm ON c1.[项目ID] = xm.ID\r\nLEFT JOIN [任务表] rw ON c1.[任务ID] = rw.ID\r\nGROUP BY\r\ncast([工时日期] as date),\r\nc1.[执行人],\r\nc1.[项目ID],\r\nxm.[项目名称],\r\nrw.[任务说明],\r\nc1.[任务ID],\r\nrw.[任务名称]", "ViewInfo": { "ViewName": "View_任务工时统计", "IsUpdatable": true,