From b789158aa0c17654e13a467f4fb00fb814c2431c Mon Sep 17 00:00:00 2001 From: cuckooent Date: Fri, 1 Nov 2024 09:44:33 +0800 Subject: [PATCH] =?UTF-8?q?{"Message":"1","MessageType":2,"Modules":[{"Sta?= =?UTF-8?q?te":1,"Type":7,"Name":"Table/=E9=9C=80=E6=B1=82=E5=8F=8D?= =?UTF-8?q?=E9=A6=88=E7=99=BB=E8=AE=B0=E8=A1=A8"},{"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"}],"Ve?= =?UTF-8?q?rsion":"v1"}?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .collaboration | 23 +---- Pages/工作台/工作台首页.json | 136 +++++++++++++++++++++++++++- Tables/需求反馈/需求反馈登记表.json | 12 +++ 3 files changed, 145 insertions(+), 26 deletions(-) diff --git a/.collaboration b/.collaboration index 8e336fcc..c048255e 100644 --- a/.collaboration +++ b/.collaboration @@ -138,16 +138,7 @@ }, { "ModuleName": "Table/需求反馈登记表", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2024-11-01T09:23:16.7566891+08:00", - "ModuleType": 7, - "ToRemoveFiles": [ - "Tables\\需求反馈\\需求反馈登记表.json" - ] + "ModuleType": 7 }, { "ModuleName": "TableView/反馈收集任务匿名视图", @@ -2279,17 +2270,7 @@ }, { "ModuleName": "PCPage/工作台首页", - "State": 1, - "LockedBy": { - "UserName": "cuckooent", - "Email": "phoben@qq.com" - }, - "LockDateTime": "2024-11-01T09:10:40.6649153+08:00", - "ModuleType": 1, - "ToRemoveFiles": [ - "Pages\\工作台\\工作台首页.json", - "Pages\\工作台\\工作台首页.rd" - ] + "ModuleType": 1 }, { "ModuleName": "PCPage/项目负荷 (2)", diff --git a/Pages/工作台/工作台首页.json b/Pages/工作台/工作台首页.json index 3465a8f6..dfae2351 100644 --- a/Pages/工作台/工作台首页.json +++ b/Pages/工作台/工作台首页.json @@ -336,6 +336,15 @@ }, "ColumnName": "日期" }, + { + "GUID": "800c06fe-a05a-4977-b6fc-65bb5b043fa0", + "BindingInfo": { + "TableName": "任务工时表", + "ColumnName": "工时类型", + "GUID": "05ce48bf-f222-4108-8c93-8bf9e0087fe0" + }, + "ColumnName": "工时类型" + }, { "GUID": "edd13b7b-55f0-41ed-919f-758450e718b6", "BindingInfo": { @@ -352,7 +361,7 @@ "ColumnBindingInfo": { "TableName": "任务工时表", "ColumnName": "工时日期", - "GUID": "6dd90d8a-2da5-49e3-802e-9598cd8ecb7d" + "GUID": "dd32edc3-f14d-460a-a04b-d2267e25bc82" }, "Value": { "$type": "Forguncy.Model.FormulaReferObject, ServerDesignerCommon", @@ -378,7 +387,7 @@ ], "JSONDataSources": [], "ImageDataSource": [], - "Config": "{\"option\":\"let completeXAxisData = [];\\nlet completeYAxisData = []\\n\\n// 打印数据源以进行检查\\nconsole.log(\\\"Context['工时表']:\\\", Context[\\\"工时表\\\"]);\\n\\n// 拆分数据源\\nconst splitData = ForguncyEchartsHelper.splitDataSource(Context[\\\"工时表\\\"]);\\nconsole.log(\\\"拆分后的数据:\\\", splitData);\\n\\n// 使用正确的键名\\nconst { \\\"日期\\\": xData, \\\"总工时\\\": yAxisData } = splitData;\\nconsole.log(\\\"xData:\\\", xData);\\nconsole.log(\\\"yAxisData:\\\", yAxisData);\\n\\n// 生成完整的日期范围\\nfunction getDateRange(startDate, endDate) {\\n const dateList = [];\\n let currentDate = new Date(startDate);\\n\\n while (currentDate <= endDate) {\\n const year = currentDate.getFullYear();\\n const month = (\\\"0\\\" + (currentDate.getMonth() + 1)).slice(-2);\\n const day = (\\\"0\\\" + currentDate.getDate()).slice(-2);\\n\\n dateList.push(`${year}-${month}-${day}`);\\n\\n currentDate.setDate(currentDate.getDate() + 1);\\n }\\n return dateList;\\n}\\n\\n// 转换 Excel 日期数字为日期字符串\\nfunction getDateFormat(value) {\\n // 检查是否为数字类型\\n if (typeof value === \\\"number\\\") {\\n // Excel 日期格式的起始日期是 1899-12-30\\n const excelEpoch = new Date(Date.UTC(1899, 11, 30));\\n // 将整数日期转换为毫秒数\\n const date = new Date(\\n excelEpoch.getTime() + value * 24 * 60 * 60 * 1000,\\n );\\n const year = date.getUTCFullYear();\\n const month = (date.getUTCMonth() + 1).toString().padStart(2, \\\"0\\\");\\n const day = date.getUTCDate().toString().padStart(2, \\\"0\\\");\\n return `${year}-${month}-${day}`;\\n } else if (typeof value === \\\"string\\\") {\\n // 如果已经是字符串,则直接返回\\n return value;\\n } else {\\n // 其他情况返回空字符串\\n return \\\"\\\";\\n }\\n}\\n\\n// 检查 xData 和 yAxisData 是否存在并且是数组\\nif (Array.isArray(xData) && Array.isArray(yAxisData)) {\\n\\n // 批量处理日期\\n const xAxisData = xData.map((item) => getDateFormat(item));\\n\\n // 将日期字符串转换为 Date 对象\\n const dateObjects = xAxisData.map((dateStr) => new Date(dateStr));\\n\\n // 检查是否成功转换为有效的日期对象\\n if (dateObjects.some((date) => isNaN(date))) {\\n console.error(\\\"日期格式不正确,请检查日期数据。\\\");\\n return;\\n }\\n\\n // 获取最小和最大日期\\n const timestamps = dateObjects.map((date) => date.getTime());\\n const minTimestamp = Math.min(...timestamps);\\n const maxTimestamp = Math.max(...timestamps);\\n const minDate = new Date(minTimestamp);\\n const maxDate = new Date(maxTimestamp);\\n\\n // 生成完整的日期范围\\n const completeDateRange = getDateRange(minDate, maxDate);\\n\\n // 将原始数据映射为日期和值的键值对\\n const dataMap = {};\\n xAxisData.forEach((date, index) => {\\n dataMap[date] = yAxisData[index];\\n });\\n\\n // 补全缺失的数据\\n completeYAxisData = completeDateRange.map((date) => {\\n return dataMap[date] !== undefined ? dataMap[date] : 0;\\n });\\n\\n // 更新图表的数据\\n completeXAxisData = completeDateRange;\\n} else {\\n console.error(\\\"数据格式不正确,请检查数据源。\\\");\\n}\\n\\n// 配置 Echarts 图表\\noption = {\\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\",\\n title: {\\n text: \\\"报工趋势图 (近30天)\\\",\\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 xAxis: {\\n type: \\\"category\\\",\\n data: completeXAxisData,\\n axisLabel: {\\n color: \\\"#abacac\\\",\\n },\\n axisLine: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n axisTick: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n },\\n yAxis: {\\n type: \\\"value\\\",\\n axisLabel: {\\n color: \\\"#abacac\\\",\\n },\\n axisLine: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n axisTick: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n splitLine: {\\n show: true,\\n lineStyle: {\\n color: \\\"#f8fafc\\\",\\n },\\n },\\n },\\n tooltip: {\\n trigger: \\\"axis\\\",\\n backgroundColor: \\\"#FFFFFF\\\",\\n textStyle: {\\n color: \\\"#000000\\\",\\n },\\n },\\n series: [\\n {\\n data: completeYAxisData,\\n type: \\\"line\\\",\\n lineStyle: {\\n width: 3,\\n shadowColor: \\\"rgba(0, 0, 0, 0.1)\\\",\\n shadowBlur: 10,\\n shadowOffsetX: 0,\\n shadowOffsetY: 4,\\n },\\n smooth: true,\\n symbolSize: 8,\\n symbol: \\\"none\\\",\\n itemStyle: {\\n color: \\\"#2196f3\\\",\\n },\\n areaStyle: {\\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\\n {\\n offset: 0,\\n color: \\\"rgba(33,150,243,0.3)\\\",\\n },\\n {\\n offset: 1,\\n color: \\\"rgba(33,150,243,0)\\\",\\n },\\n ]),\\n },\\n },\\n ],\\n};\\n\",\"graphTheme\":null,\"displayMode\":\"canvas\",\"jsCode\":\"\\n async ({Context,JSONContext,ImageContext,echarts,myChart,dat,Forguncy,d3,setInterval,setTimeout,ForguncyEchartsHelper,PublicResource})=>{\\n var datGUI=undefined;\\n var option={};\\n let completeXAxisData = [];\\nlet completeYAxisData = [];\\n// 打印数据源以进行检查\\nconsole.log(\\\"Context['工时表']:\\\", Context[\\\"工时表\\\"]);\\n// 拆分数据源\\nconst splitData = ForguncyEchartsHelper.splitDataSource(Context[\\\"工时表\\\"]);\\nconsole.log(\\\"拆分后的数据:\\\", splitData);\\n// 使用正确的键名\\nconst { \\\"日期\\\": xData, \\\"总工时\\\": yAxisData } = splitData;\\nconsole.log(\\\"xData:\\\", xData);\\nconsole.log(\\\"yAxisData:\\\", yAxisData);\\n// 生成完整的日期范围\\nfunction getDateRange(startDate, endDate) {\\n const dateList = [];\\n let currentDate = new Date(startDate);\\n while (currentDate <= endDate) {\\n const year = currentDate.getFullYear();\\n const month = (\\\"0\\\" + (currentDate.getMonth() + 1)).slice(-2);\\n const day = (\\\"0\\\" + currentDate.getDate()).slice(-2);\\n dateList.push(`${year}-${month}-${day}`);\\n currentDate.setDate(currentDate.getDate() + 1);\\n }\\n return dateList;\\n}\\n// 转换 Excel 日期数字为日期字符串\\nfunction getDateFormat(value) {\\n // 检查是否为数字类型\\n if (typeof value === \\\"number\\\") {\\n // Excel 日期格式的起始日期是 1899-12-30\\n const excelEpoch = new Date(Date.UTC(1899, 11, 30));\\n // 将整数日期转换为毫秒数\\n const date = new Date(excelEpoch.getTime() + value * 24 * 60 * 60 * 1000);\\n const year = date.getUTCFullYear();\\n const month = (date.getUTCMonth() + 1).toString().padStart(2, \\\"0\\\");\\n const day = date.getUTCDate().toString().padStart(2, \\\"0\\\");\\n return `${year}-${month}-${day}`;\\n }\\n else if (typeof value === \\\"string\\\") {\\n // 如果已经是字符串,则直接返回\\n return value;\\n }\\n else {\\n // 其他情况返回空字符串\\n return \\\"\\\";\\n }\\n}\\n// 检查 xData 和 yAxisData 是否存在并且是数组\\nif (Array.isArray(xData) && Array.isArray(yAxisData)) {\\n // 批量处理日期\\n const xAxisData = xData.map((item) => getDateFormat(item));\\n // 将日期字符串转换为 Date 对象\\n const dateObjects = xAxisData.map((dateStr) => new Date(dateStr));\\n // 检查是否成功转换为有效的日期对象\\n if (dateObjects.some((date) => isNaN(date))) {\\n console.error(\\\"日期格式不正确,请检查日期数据。\\\");\\n return;\\n }\\n // 获取最小和最大日期\\n const timestamps = dateObjects.map((date) => date.getTime());\\n const minTimestamp = Math.min(...timestamps);\\n const maxTimestamp = Math.max(...timestamps);\\n const minDate = new Date(minTimestamp);\\n const maxDate = new Date(maxTimestamp);\\n // 生成完整的日期范围\\n const completeDateRange = getDateRange(minDate, maxDate);\\n // 将原始数据映射为日期和值的键值对\\n const dataMap = {};\\n xAxisData.forEach((date, index) => {\\n dataMap[date] = yAxisData[index];\\n });\\n // 补全缺失的数据\\n completeYAxisData = completeDateRange.map((date) => {\\n return dataMap[date] !== undefined ? dataMap[date] : 0;\\n });\\n // 更新图表的数据\\n completeXAxisData = completeDateRange;\\n}\\nelse {\\n console.error(\\\"数据格式不正确,请检查数据源。\\\");\\n}\\n// 配置 Echarts 图表\\noption = {\\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\",\\n title: {\\n text: \\\"报工趋势图 (近30天)\\\",\\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 xAxis: {\\n type: \\\"category\\\",\\n data: completeXAxisData,\\n axisLabel: {\\n color: \\\"#abacac\\\",\\n },\\n axisLine: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n axisTick: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n },\\n yAxis: {\\n type: \\\"value\\\",\\n axisLabel: {\\n color: \\\"#abacac\\\",\\n },\\n axisLine: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n axisTick: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n splitLine: {\\n show: true,\\n lineStyle: {\\n color: \\\"#f8fafc\\\",\\n },\\n },\\n },\\n tooltip: {\\n trigger: \\\"axis\\\",\\n backgroundColor: \\\"#FFFFFF\\\",\\n textStyle: {\\n color: \\\"#000000\\\",\\n },\\n },\\n series: [\\n {\\n data: completeYAxisData,\\n type: \\\"line\\\",\\n lineStyle: {\\n width: 3,\\n shadowColor: \\\"rgba(0, 0, 0, 0.1)\\\",\\n shadowBlur: 10,\\n shadowOffsetX: 0,\\n shadowOffsetY: 4,\\n },\\n smooth: true,\\n symbolSize: 8,\\n symbol: \\\"none\\\",\\n itemStyle: {\\n color: \\\"#2196f3\\\",\\n },\\n areaStyle: {\\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\\n {\\n offset: 0,\\n color: \\\"rgba(33,150,243,0.3)\\\",\\n },\\n {\\n offset: 1,\\n color: \\\"rgba(33,150,243,0)\\\",\\n },\\n ]),\\n },\\n },\\n ],\\n};\\n\\n return {\\n option,\\n datGUI,\\n };\\n }\\n \"}" + "Config": "{\"option\":\"let completeXAxisData = []; \\nlet completePlanData = []; // 计划工时数据 \\nlet completeActualData = []; // 实际工时数据 \\n\\n// 打印数据源以进行检查 \\nconsole.log(\\\"Context['工时表']:\\\", Context[\\\"工时表\\\"]); \\n\\n// 按工时类型分组数据 \\nconst groupedData = {}; \\nContext[\\\"工时表\\\"].forEach(item => { \\n if (!groupedData[item[\\\"工时类型\\\"]]) { \\n groupedData[item[\\\"工时类型\\\"]] = { \\n dates: [], \\n hours: [] \\n }; \\n } \\n groupedData[item[\\\"工时类型\\\"]].dates.push(item[\\\"日期\\\"]); \\n groupedData[item[\\\"工时类型\\\"]].hours.push(item[\\\"总工时\\\"]); \\n}); \\n\\n// 日期格式化函数保持不变 \\nfunction getDateFormat(value) { \\n if (typeof value === \\\"number\\\") { \\n const excelEpoch = new Date(Date.UTC(1899, 11, 30)); \\n const date = new Date(excelEpoch.getTime() + value * 24 * 60 * 60 * 1000); \\n const year = date.getUTCFullYear(); \\n const month = (date.getUTCMonth() + 1).toString().padStart(2, \\\"0\\\"); \\n const day = date.getUTCDate().toString().padStart(2, \\\"0\\\"); \\n return `${year}-${month}-${day}`; \\n } else if (typeof value === \\\"string\\\") { \\n return value; \\n } \\n return \\\"\\\"; \\n} \\n\\n// 生成日期范围函数保持不变 \\nfunction getDateRange(startDate, endDate) { \\n const dateList = []; \\n let currentDate = new Date(startDate); \\n while (currentDate <= endDate) { \\n const year = currentDate.getFullYear(); \\n const month = (\\\"0\\\" + (currentDate.getMonth() + 1)).slice(-2); \\n const day = (\\\"0\\\" + currentDate.getDate()).slice(-2); \\n dateList.push(`${year}-${month}-${day}`); \\n currentDate.setDate(currentDate.getDate() + 1); \\n } \\n return dateList; \\n} \\n\\n// 获取所有日期并找出最大最小日期 \\nconst allDates = []; \\nObject.values(groupedData).forEach(data => { \\n data.dates.forEach(date => { \\n allDates.push(new Date(getDateFormat(date))); \\n }); \\n}); \\n\\nif (allDates.length > 0) { \\n const minDate = new Date(Math.min(...allDates)); \\n const maxDate = new Date(Math.max(...allDates)); \\n completeXAxisData = getDateRange(minDate, maxDate); \\n\\n // 处理每种类型的数据 \\n Object.entries(groupedData).forEach(([type, data]) => { \\n // 格式化日期 \\n const formattedDates = data.dates.map(date => getDateFormat(date)); \\n \\n // 创建日期-工时映射 \\n const dataMap = {}; \\n formattedDates.forEach((date, index) => { \\n dataMap[date] = data.hours[index]; \\n }); \\n\\n // 补全数据 \\n const completeData = completeXAxisData.map(date => { \\n return dataMap[date] !== undefined ? dataMap[date] : 0; \\n }); \\n\\n // 根据类型存储数据 \\n if (type === \\\"计划\\\") { \\n completePlanData = completeData; \\n } else if (type === \\\"实际\\\") { \\n completeActualData = completeData; \\n } \\n }); \\n} \\n\\n// 配置 Echarts 图表 \\noption = { \\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\", \\n title: { \\n text: \\\"报工趋势图 (近30天)\\\", \\n left: \\\"center\\\", \\n top: 24, \\n textStyle: { \\n fontSize: 16, \\n fontWeight: \\\"bold\\\", \\n }, \\n }, \\n legend: { \\n data: ['计划工时', '实际工时'], \\n top: 60, \\n textStyle: { \\n color: '#666' \\n } \\n }, \\n grid: { \\n top: 100, // 增加top值以适应legend \\n left: \\\"24px\\\", \\n right: \\\"24px\\\", \\n bottom: \\\"24px\\\", \\n containLabel: true, \\n }, \\n xAxis: { \\n type: \\\"category\\\", \\n data: completeXAxisData, \\n axisLabel: { \\n color: \\\"#abacac\\\", \\n }, \\n axisLine: { \\n lineStyle: { \\n color: \\\"#f5f6f6\\\", \\n }, \\n }, \\n axisTick: { \\n lineStyle: { \\n color: \\\"#f5f6f6\\\", \\n }, \\n }, \\n }, \\n yAxis: { \\n type: \\\"value\\\", \\n axisLabel: { \\n color: \\\"#abacac\\\", \\n }, \\n axisLine: { \\n lineStyle: { \\n color: \\\"#f5f6f6\\\", \\n }, \\n }, \\n axisTick: { \\n lineStyle: { \\n color: \\\"#f5f6f6\\\", \\n }, \\n }, \\n splitLine: { \\n show: true, \\n lineStyle: { \\n color: \\\"#f8fafc\\\", \\n }, \\n }, \\n }, \\n tooltip: { \\n trigger: \\\"axis\\\", \\n backgroundColor: \\\"#FFFFFF\\\", \\n textStyle: { \\n color: \\\"#000000\\\", \\n }, \\n }, \\n series: [ \\n { \\n name: '计划工时', \\n data: completePlanData, \\n type: \\\"line\\\", \\n lineStyle: { \\n width: 3, \\n shadowColor: \\\"rgba(0, 0, 0, 0.1)\\\", \\n shadowBlur: 10, \\n shadowOffsetX: 0, \\n shadowOffsetY: 4, \\n }, \\n smooth: true, \\n symbolSize: 8, \\n symbol: \\\"none\\\", \\n itemStyle: { \\n color: \\\"#2196f3\\\", // 蓝色 \\n }, \\n areaStyle: { \\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ \\n { \\n offset: 0, \\n color: \\\"rgba(33,150,243,0.3)\\\", \\n }, \\n { \\n offset: 1, \\n color: \\\"rgba(33,150,243,0)\\\", \\n }, \\n ]), \\n }, \\n }, \\n { \\n name: '实际工时', \\n data: completeActualData, \\n type: \\\"line\\\", \\n lineStyle: { \\n width: 3, \\n shadowColor: \\\"rgba(0, 0, 0, 0.1)\\\", \\n shadowBlur: 10, \\n shadowOffsetX: 0, \\n shadowOffsetY: 4, \\n }, \\n smooth: true, \\n symbolSize: 8, \\n symbol: \\\"none\\\", \\n itemStyle: { \\n color: \\\"#ff5722\\\", // 橙色 \\n }, \\n areaStyle: { \\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ \\n { \\n offset: 0, \\n color: \\\"rgba(255,87,34,0.3)\\\", \\n }, \\n { \\n offset: 1, \\n color: \\\"rgba(255,87,34,0)\\\", \\n }, \\n ]), \\n }, \\n } \\n ], \\n};\",\"graphTheme\":null,\"displayMode\":\"canvas\",\"jsCode\":\"\\n async ({Context,JSONContext,ImageContext,echarts,myChart,dat,Forguncy,d3,setInterval,setTimeout,ForguncyEchartsHelper,PublicResource})=>{\\n var datGUI=undefined;\\n var option={};\\n let completeXAxisData = [];\\nlet completePlanData = []; // 计划工时数据 \\nlet completeActualData = []; // 实际工时数据 \\n// 打印数据源以进行检查 \\nconsole.log(\\\"Context['工时表']:\\\", Context[\\\"工时表\\\"]);\\n// 按工时类型分组数据 \\nconst groupedData = {};\\nContext[\\\"工时表\\\"].forEach(item => {\\n if (!groupedData[item[\\\"工时类型\\\"]]) {\\n groupedData[item[\\\"工时类型\\\"]] = {\\n dates: [],\\n hours: []\\n };\\n }\\n groupedData[item[\\\"工时类型\\\"]].dates.push(item[\\\"日期\\\"]);\\n groupedData[item[\\\"工时类型\\\"]].hours.push(item[\\\"总工时\\\"]);\\n});\\n// 日期格式化函数保持不变 \\nfunction getDateFormat(value) {\\n if (typeof value === \\\"number\\\") {\\n const excelEpoch = new Date(Date.UTC(1899, 11, 30));\\n const date = new Date(excelEpoch.getTime() + value * 24 * 60 * 60 * 1000);\\n const year = date.getUTCFullYear();\\n const month = (date.getUTCMonth() + 1).toString().padStart(2, \\\"0\\\");\\n const day = date.getUTCDate().toString().padStart(2, \\\"0\\\");\\n return `${year}-${month}-${day}`;\\n }\\n else if (typeof value === \\\"string\\\") {\\n return value;\\n }\\n return \\\"\\\";\\n}\\n// 生成日期范围函数保持不变 \\nfunction getDateRange(startDate, endDate) {\\n const dateList = [];\\n let currentDate = new Date(startDate);\\n while (currentDate <= endDate) {\\n const year = currentDate.getFullYear();\\n const month = (\\\"0\\\" + (currentDate.getMonth() + 1)).slice(-2);\\n const day = (\\\"0\\\" + currentDate.getDate()).slice(-2);\\n dateList.push(`${year}-${month}-${day}`);\\n currentDate.setDate(currentDate.getDate() + 1);\\n }\\n return dateList;\\n}\\n// 获取所有日期并找出最大最小日期 \\nconst allDates = [];\\nObject.values(groupedData).forEach(data => {\\n data.dates.forEach(date => {\\n allDates.push(new Date(getDateFormat(date)));\\n });\\n});\\nif (allDates.length > 0) {\\n const minDate = new Date(Math.min(...allDates));\\n const maxDate = new Date(Math.max(...allDates));\\n completeXAxisData = getDateRange(minDate, maxDate);\\n // 处理每种类型的数据 \\n Object.entries(groupedData).forEach(([type, data]) => {\\n // 格式化日期 \\n const formattedDates = data.dates.map(date => getDateFormat(date));\\n // 创建日期-工时映射 \\n const dataMap = {};\\n formattedDates.forEach((date, index) => {\\n dataMap[date] = data.hours[index];\\n });\\n // 补全数据 \\n const completeData = completeXAxisData.map(date => {\\n return dataMap[date] !== undefined ? dataMap[date] : 0;\\n });\\n // 根据类型存储数据 \\n if (type === \\\"计划\\\") {\\n completePlanData = completeData;\\n }\\n else if (type === \\\"实际\\\") {\\n completeActualData = completeData;\\n }\\n });\\n}\\n// 配置 Echarts 图表 \\noption = {\\n backgroundColor: \\\"rgba(0, 0, 0, 0)\\\",\\n title: {\\n text: \\\"报工趋势图 (近30天)\\\",\\n left: \\\"center\\\",\\n top: 24,\\n textStyle: {\\n fontSize: 16,\\n fontWeight: \\\"bold\\\",\\n },\\n },\\n legend: {\\n data: ['计划工时', '实际工时'],\\n top: 60,\\n textStyle: {\\n color: '#666'\\n }\\n },\\n grid: {\\n top: 100,\\n left: \\\"24px\\\",\\n right: \\\"24px\\\",\\n bottom: \\\"24px\\\",\\n containLabel: true,\\n },\\n xAxis: {\\n type: \\\"category\\\",\\n data: completeXAxisData,\\n axisLabel: {\\n color: \\\"#abacac\\\",\\n },\\n axisLine: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n axisTick: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n },\\n yAxis: {\\n type: \\\"value\\\",\\n axisLabel: {\\n color: \\\"#abacac\\\",\\n },\\n axisLine: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n axisTick: {\\n lineStyle: {\\n color: \\\"#f5f6f6\\\",\\n },\\n },\\n splitLine: {\\n show: true,\\n lineStyle: {\\n color: \\\"#f8fafc\\\",\\n },\\n },\\n },\\n tooltip: {\\n trigger: \\\"axis\\\",\\n backgroundColor: \\\"#FFFFFF\\\",\\n textStyle: {\\n color: \\\"#000000\\\",\\n },\\n },\\n series: [\\n {\\n name: '计划工时',\\n data: completePlanData,\\n type: \\\"line\\\",\\n lineStyle: {\\n width: 3,\\n shadowColor: \\\"rgba(0, 0, 0, 0.1)\\\",\\n shadowBlur: 10,\\n shadowOffsetX: 0,\\n shadowOffsetY: 4,\\n },\\n smooth: true,\\n symbolSize: 8,\\n symbol: \\\"none\\\",\\n itemStyle: {\\n color: \\\"#2196f3\\\", // 蓝色 \\n },\\n areaStyle: {\\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\\n {\\n offset: 0,\\n color: \\\"rgba(33,150,243,0.3)\\\",\\n },\\n {\\n offset: 1,\\n color: \\\"rgba(33,150,243,0)\\\",\\n },\\n ]),\\n },\\n },\\n {\\n name: '实际工时',\\n data: completeActualData,\\n type: \\\"line\\\",\\n lineStyle: {\\n width: 3,\\n shadowColor: \\\"rgba(0, 0, 0, 0.1)\\\",\\n shadowBlur: 10,\\n shadowOffsetX: 0,\\n shadowOffsetY: 4,\\n },\\n smooth: true,\\n symbolSize: 8,\\n symbol: \\\"none\\\",\\n itemStyle: {\\n color: \\\"#ff5722\\\", // 橙色 \\n },\\n areaStyle: {\\n color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\\n {\\n offset: 0,\\n color: \\\"rgba(255,87,34,0.3)\\\",\\n },\\n {\\n offset: 1,\\n color: \\\"rgba(255,87,34,0)\\\",\\n },\\n ]),\\n },\\n }\\n ],\\n};\\n\\n return {\\n option,\\n datGUI,\\n };\\n }\\n \"}" } }, "7,1": { @@ -493,6 +502,123 @@ "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 \"}" } + }, + "9,1": { + "CellType": { + "$type": "EchartsCustomCellType.EchartsCustomCellTypeCellType, EchartsCustomCellType", + "EChartTitle": "Echarts图表", + "DataSourceBinding": "DataSources", + "DataSources": [ + { + "Name": "反馈表", + "BindingTableOptions": { + "$type": "ServerDesignerCommon.Model.BindingDataSourceModel, ServerDesignerCommon", + "TableName": "需求反馈登记表", + "BindingInfos": [ + { + "GUID": "6df7e763-12bb-4fe1-9cd0-98d22dfb9605", + "BindingInfo": { + "TableName": "需求反馈登记表", + "ColumnName": "反馈类型", + "GUID": "97755fad-2aa0-4c76-bbca-06ff729db4a3", + "RelationBinding": { + "RelatedTable": "反馈类型表", + "RelatedColumn": "ID", + "DisplayColumn": "反馈类型" + } + }, + "ColumnName": "类型" + }, + { + "GUID": "8eb3cbbe-ce8c-4ce0-94bf-c013574f2780", + "BindingInfo": { + "TableName": "需求反馈登记表", + "ColumnName": "项目ID", + "GUID": "9e7f3c48-3723-4caf-8b82-f9b35af544ca", + "RelationBinding": { + "RelatedTable": "项目表", + "RelatedColumn": "ID", + "DisplayColumn": "项目名称" + } + }, + "ColumnName": "项目" + }, + { + "GUID": "b9060268-2b70-4d98-b0bf-7ec2cc332651", + "BindingInfo": { + "TableName": "需求反馈登记表", + "ColumnName": "关联任务", + "GUID": "6edee59c-b5dd-4d12-a4cc-a0cfc853c0e9", + "RelationBinding": { + "RelatedTable": "任务平行视图", + "RelatedColumn": "ID", + "DisplayColumn": "任务名称" + } + }, + "ColumnName": "任务" + }, + { + "GUID": "9a6c4709-4d81-4b34-b035-b7ff704e8d11", + "BindingInfo": { + "TableName": "需求反馈登记表", + "ColumnName": "数量", + "GUID": "dbb1d825-96dd-41ac-b450-bd4331fdd93f" + }, + "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\":\"// 处理数据,生成节点和链接 \\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 { nodes, links } = processData(Context[\\\"工时表\\\"]); \\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: function(params) { \\n if (params.dataType === 'node') { \\n return `${params.name}\\\\n数量: ${params.value}`; \\n } \\n return `${params.source} → ${params.target}\\\\n数量: ${params.value}`; \\n } \\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 // 处理数据,生成节点和链接 \\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 { nodes, links } = processData(Context[\\\"工时表\\\"]);\\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: function (params) {\\n if (params.dataType === 'node') {\\n return `${params.name}\\\\n数量: ${params.value}`;\\n }\\n return `${params.source} → ${params.target}\\\\n数量: ${params.value}`;\\n }\\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 \"}" + } } }, "StyleDatas": { @@ -522,12 +648,12 @@ }, "Spans": [ "1,38,3,1", - "9,1,1,36", "5,38,5,1", "1,1,1,36", "3,1,1,36", "5,1,1,36", - "7,1,1,36" + "7,1,1,36", + "9,1,1,36" ], "PageInfo": { "$type": "Forguncy.Model.Pages.NormalPage, ServerDesignerCommon", @@ -629,4 +755,4 @@ "Size": "1152,254" } ] -}//4C/zbKQY4FYd+Q2u24Iny4u4IaPGTuxgOMGsVAvj9szhhvo2lLoBCb7CYdqal+VTP9EN1ec+YI7akqeYOiQGXfOblRN4xrpmNHQZc2bz6mCMWBiNdmgOZ3P3HFgs9Yh8wLlESMoRu8YYkq4UbFjY5DOM240Bn4Q+C0B60JLPcSDQBivYl73DfGqGuKxKX6sd+rDS42gRt9NfGuRMAZSBri+XY8B4YBhM5orafvpnN70dBvURY7wGhkV7pWzCgkaUkUqqe1IpNHRXY7S9MxJnhpkJ7+fmrWCDe4c/cQW1QXOHXhOZtTeh95qvcfmKm5AqB/cvjiUu6WYZ0Hxx0vDujuU45e4v+Rj0/HoFqD11ZdvI8AcBdll42D4Bn4EpIfqu/ckYzWSfqZk2UWaKEtlo0Zsj45iI3tGkYRB/HUYIlD0tHiS90renRCuIQo+IUICZEFh697jYrQhobvos7YNTx+Iu79rTt7Nj81knI2pykNYnk9uVBSrUDyRPssVm+QFfCJtTNxfO2V2m4mYTyo7+lqf0iwI2rahzkmavAlnr08YRicmP0rkL7NM/J9pTu0C+3u6x2+22nPXb7UHCl81G1o9efkb/ApzKnJbr3M8itv6uI2AEAdCCVormMLXvPyKwP9GMIPIg5dM/07gcJidM38RJvfZQFmk8ypeAVUSyvazy5yMMEqmyKbaKkPebjknJgAVGbSIQCy/k2hk0KjsHpYCp/J7RHL5Fi+hissRoBzNzo7ONzkCimI/g3xMm7MhZ3WhiQARz727CflWWKOjeLMSClkp3h8va3n+gvgmT8AW2tGvsmOHHor0wsU+Db4Q2U2bqQF74+IAZ/jMiqBEVNl9erzqjY4ISSZYTa0GT3GW9Z+0OpRSMWmJqSCnBThvG4+xFLPLkoBRCp/0JSpdv9w==|920 \ No newline at end of file +}//IQqcyQKyecg6I0rAgI3RCrXGqrGYd49pii7OwyD90tQy8w/rCBEUsKZcQGOveEYLfUtRZQiDf/yyd2dPFw7syBMg/gYE5V4YzAd7h3pBxn5Ol1VJdikD46Pr+rM0MWY0YcSpfFn0AcVGAY+efla/9xVwvsS7EtcPohtgykhB76xDCuiirEKLSETKE3CAfecfOpHswIIzwnCI+FKk0nZe9cpyYHiYSFJbKd0ZvzplO+z6XIWKz9Qi7l7pOWcWAJOrP7+HP0VZFmDUvvJMMuWrDRZOhaZ7qn8bXh4F0fjCx6G1QrQNxAXIvH/gpeqwJvSbL4NZNIOai96ynOsp9bMI3hv7pJTlSYSRyHmoXpYVKiEdOEOq5zgkv6cAc2vDRHScqp3f/IwveWHAYNqsSyOz3vJi0aV134a0jCvnh20cK+FCh+Z7vsgVxhZ1XEgTMmu+5U+4Ce8U95bbZN0aUretum6E/i82UAT0ENWKGWo9qZ3hNFfvLFBbP323ncgxhbNqGuGLp5nnxwymJm5G8A+BuyolkPNOwz5r7k2Bz2mILr57CBdjc6xUkFoUR9xnA38Hyf5S89I5gjdA0OvTLQg6/T9fZ3omoA4DdBIyWrdgv4ymdoUoP1+j4W0QwCy/aK5Zuuno3+//taZr38UAAqRpxDGalccGJ2tk03/evz1vOR5nRZum+FnkkLJjh76aUjryx8Si3yx0WBL60oNesErxueAgzOHRRKs8IMAtlSskDIvyk71kghMTQxnqh0rIxOigLniZ92IOGvY9wOZ1E/60RvU3IjXOHG7o9KsAq1UVZRKK8oZ4Rf4873LRyK/bJ4sk9eAHfIQGGZe+vTnWeaNAFnf2BVWK5uum6IU5yy/Qy7SUD7wYoR24iCzW2+CCwPdg1uwdR6wvJoP+ALU8A41HiQ==|920 \ No newline at end of file diff --git a/Tables/需求反馈/需求反馈登记表.json b/Tables/需求反馈/需求反馈登记表.json index 3376ec0e..d3811f90 100644 --- a/Tables/需求反馈/需求反馈登记表.json +++ b/Tables/需求反馈/需求反馈登记表.json @@ -154,6 +154,18 @@ "Name": "处理用时", "ColumnType": "System.Int32, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" }, + { + "$type": "Forguncy.SaveLoad.StatisticColumnSaveData, ServerDesignerCommon", + "BindingInfo": { + "TableName": "需求反馈登记表", + "ColumnName": "ID", + "GUID": "22a4f347-2eb3-4a06-9393-1667a6c1bc62" + }, + "AggregateFunction": 1, + "DataColumnName": "ID", + "Name": "数量", + "ColumnType": "System.Int32, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" + }, { "$type": "Forguncy.SaveLoad.UserExtraBingingColumnSaveData, ServerDesignerCommon", "ColumnType": "System.String, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",