Browse Source

视图

han_v3
herenshan112 5 months ago
parent
commit
71af48ab5c
  1. 7
      package.json
  2. 28
      src/api/DesignForm/types.ts
  3. 25
      src/api/chart/index.ts
  4. 67
      src/api/chart/type.ts
  5. 61
      src/api/chart/unitData.ts
  6. 1
      src/assets/icons/bingtu.svg
  7. 1
      src/assets/icons/leidatu.svg
  8. 1
      src/assets/icons/paiming.svg
  9. 1
      src/assets/icons/paiming1.svg
  10. 1
      src/assets/icons/zhexiantu.svg
  11. 1
      src/assets/icons/zhibiao.svg
  12. 1
      src/assets/icons/zhu.svg
  13. 1
      src/components/DesignForm/app/index.vue
  14. 135
      src/components/DesignForm/dragControlApp.vue
  15. 130
      src/components/DesignForm/dragControlNew.vue
  16. 99
      src/components/DesignForm/echarts/index.ts
  17. 12
      src/components/DesignForm/public/form/formGroup.vue
  18. 30
      src/store/DesignForm/designForm.ts
  19. 1
      src/utils/workflow/const.ts
  20. 15
      src/views/redirect/index.vue
  21. 186
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/dataBoard.vue
  22. 223
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/bar.vue
  23. 201
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/barRace.vue
  24. 169
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/bar_test.vue
  25. 216
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/line.vue
  26. 217
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/pie copy.vue
  27. 216
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/pie.vue
  28. 222
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/radar.vue
  29. 23
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/target.vue
  30. 284
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/container.vue
  31. 105
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/left.vue
  32. 396
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/right.vue
  33. 731
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/dimMea.vue
  34. 106
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/dimension.vue
  35. 255
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/filterPage.vue
  36. 131
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/measurement.vue
  37. 99
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/searchPage.vue
  38. 6
      src/views/sysworkflow/lowcodepage/appPage/createAppFormPage.vue
  39. 2
      src/views/sysworkflow/lowcodepage/runApp/regularPage/myCreate.vue
  40. 196
      vite.config.ts.timestamp-1750983981695-d6c3d4d4250da.mjs

7
package.json

@ -50,12 +50,13 @@
"@wangeditor/editor-for-vue": "5.1.10",
"@wecom/jssdk": "^1.3.2",
"appsys": "file:",
"axios": "^1.4.0",
"axios": "^1.10.0",
"clipboard": "^2.0.11",
"compressorjs": "^1.2.1",
"dayjs": "^1.11.11",
"echarts": "^5.4.3",
"echarts": "^5.6.0",
"element-plus": "^2.3.4",
"element-resize-detector": "^1.2.4",
"font-awesome": "^4.7.0",
"html2canvas": "^1.4.1",
"jquery": "^3.7.1",
@ -74,7 +75,7 @@
"screenfull": "^6.0.0",
"sortablejs": "^1.15.2",
"spark-md5": "^3.0.2",
"tinymce": "^6.8.1",
"tinymce": "^6.8.6",
"ts-md5": "^1.3.1",
"uuid": "^9.0.1",
"vue": "^3.3.1",

28
src/api/DesignForm/types.ts

@ -142,7 +142,8 @@ export interface formStruct{
previewVisible: boolean; // 预览窗口
designType: any; // 当前页面设计类型,有效值search
formDict: any;
formOtherData:formOtherData
formOtherData:formOtherData;
echatsViews:echatsViews[];
}
export interface DrawerStruct{
@ -215,4 +216,29 @@ export interface appSetUpContent{
groupKey:string;
appdescribe?:string;
}
//图标结构
export interface echatsViews {
uuid:string;
type:string;
title:string;
y:string[];
x:string[];
filter:string[];
timelength:number;
search:searchInfo;
}
//图标结构搜索条件
export interface searchInfo{
state:boolean;
searchBut:string[];
factor:searchFactor[];
}
//搜索控件
export interface searchButConfig{
searchBut:boolean;
resetBut:boolean;
}
//收缩结构体
export interface searchFactor{
}

25
src/api/chart/index.ts

@ -0,0 +1,25 @@
import request from '@/utils/request';
//获取维度及度量字段
export function dimMeaFormTable(data?: any) {
return request({
url: "/systemapi/chart/dimMeaFormTable",
method: 'post',
data: data
});
}
//将图表信息写入数据库
export function countChartValue(data?: any) {
return request({
url: "/systemapi/chart/countChartValue",
method: 'post',
data: data
});
}
//获取图表设定信息
export function getChartCont(data?: any) {
return request({
url: "/systemapi/chart/getChartCont",
method: 'post',
data: data
});
}

67
src/api/chart/type.ts

@ -0,0 +1,67 @@
export interface dimMeaInfo {
title:string;
type:number;
field:string;
}
export interface dimSetInfo{
title: string;
type: string;
field: string;
options: any,
oldTitle: string;
timeType: string;
sort: number;
}
export interface maeSetInfo extends dimSetInfo{
method:number;
format:number;
}
/**
@ 作者: 秦东
@ 时间: 2025-07-03 16:46:48
@ 功能: 过滤器结构体
*/
export interface filterInfo {
type:number; //字段类型 1:文本;2:数值;3:时间
lable:string; //名称
field:string; //字段
conditions:string; //文本类型条件值
method:number; //聚合方式 1:求和;2:平均值;3:计数;4:去重计数;5:最大值;6:求和;
modality:number; //条件形式。 1:单条件;2:或条件;3:且条件
modalityList:modalityListInfo[]; //条件列表
startTime:number; //开始时间
endTime:number; //结束时间
}
/**
@ 作者: 秦东
@ 时间: 2025-07-03 16:52:33
@ 功能: 过滤数字类型聚合条件列表
*/
export interface modalityListInfo{
equation:number; //表达式。1:等于;2:不等于;3:大于;4:小于;5:大于等于;6:小于等于;7:为空;8:不为空
value:string; //等式值
}
/**
@ 作者: 秦东
@ 时间: 2025-07-07 14:32:41
@ 功能: 搜索结构
*/
export interface searchInfo{
lable: string;
type: number;
field: string;
options: any;
oldTitle: string;
timeType: string;
sort: number;
isTime: boolean;
value: string;
startTime: string;
endTime: string;
coor: string;
}

61
src/api/chart/unitData.ts

@ -0,0 +1,61 @@
export const matchList = [
{
label:"求和",
value:1
},
{
label:"平均值",
value:2
},
{
label:"计数",
value:3
},
{
label:"去重计数",
value:4
},
{
label:"最大值",
value:5
},
{
label:"最小值",
value:6
}
]
//表达式
export const expList = [
{
label:"等于",
value:1
},
{
label:"不等于",
value:2
},
{
label:"大于",
value:3
},
{
label:"小于",
value:4
},
{
label:"大于等于",
value:5
},
{
label:"小于等于",
value:6
},
{
label:"为空",
value:7
},
{
label:"不为空",
value:8
}
]

1
src/assets/icons/bingtu.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750650211630" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14825" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 106.666667C288.213333 106.666667 106.666667 288.213333 106.666667 512s181.546667 405.333333 405.333333 405.333333 405.333333-181.546667 405.333333-405.333333H512V106.666667z" fill="#2953FF" p-id="14826"></path><path d="M798.72 225.28a404.522667 404.522667 0 0 0-249.813333-116.906667v366.72h366.72c-8.32-91.093333-47.146667-179.84-116.906667-249.813333z" fill="#FCCA1E" p-id="14827"></path></svg>

After

Width:  |  Height:  |  Size: 735 B

1
src/assets/icons/leidatu.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750658995523" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="42002" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M246.9 920L83 415.7 512 104l429 311.7L777.1 920z" fill="#FFFFFF" p-id="42003"></path><path d="M246.9 920L83 415.7 512 104l429 311.7L777.1 920z" fill="#FFFFFF" p-id="42004"></path><path d="M512 104l-48.8 35.4L871 435.7 713.6 920h63.5L941 415.7z" fill="#EEEEEE" p-id="42005"></path><path d="M777.1 940H246.9c-8.7 0-16.3-5.6-19-13.8L64 421.9c-2.7-8.2 0.3-17.3 7.3-22.4l429-311.7c7-5.1 16.5-5.1 23.5 0l429 311.7c7 5.1 9.9 14.1 7.3 22.4L796.2 926.2c-2.7 8.2-10.4 13.8-19.1 13.8z m-515.7-40h501.2l154.9-476.7L512 128.7 106.5 423.3 261.4 900z" fill="#202D47" p-id="42006"></path><path d="M304.5 831.7l-80-384.3L512 238.6l287.5 208.8-109.8 338z" fill="#227CE5" p-id="42007"></path><path d="M515 233.6l-60.6 44 268.1 194.8-102.9 316.8 73.1-8.8 109.8-338z" fill="#2571CB" p-id="42008"></path><path d="M304.5 851.7c-9.4 0-17.6-6.6-19.6-15.9l-80-384.3c-1.6-7.7 1.5-15.6 7.8-20.3L500.2 222.4c7-5.1 16.5-5.1 23.5 0l287.5 208.9c7 5.1 9.9 14.1 7.3 22.4l-109.8 338c-2.4 7.4-8.9 12.7-16.6 13.7l-385.2 46.3h-2.4zM246.7 456l73.6 353.6L674.6 767 776 455 512 263.3 246.7 456z" fill="#202D47" p-id="42009"></path><path d="M394.4 714.6l5.8-223.1L512 368.1l126.6 142-32 138.5z" fill="#2DCD54" p-id="42010"></path><path d="M512 368.1l-26.3 29 82.9 93-32 138.5-141.1 43.9-1.1 42.1 212.2-66 32-138.5z" fill="#31B952" p-id="42011"></path><path d="M394.4 734.6c-4.3 0-8.6-1.4-12.1-4.1-5.1-3.9-8.1-10-7.9-16.5l5.9-223c0.1-4.8 2-9.4 5.2-12.9l111.8-123.4c3.8-4.2 9.3-6.6 14.9-6.6 5.7 0 11.1 2.5 14.9 6.7l126.6 142c4.3 4.8 6 11.5 4.6 17.8l-32.1 138.5c-1.6 6.9-6.8 12.5-13.5 14.6l-212.2 66c-2.2 0.6-4.2 0.9-6.1 0.9zM420 499.5l-4.9 187.7 174.6-54.3 27.1-117.2L511.9 398 420 499.5z" fill="#202D47" p-id="42012"></path><path d="M265.9 906.9l-33.1-22.4 258.9-382c2.8-4.2 7.2-7.2 12.1-8.3l432.8-98 8.8 39-425.1 96.2-254.4 375.5z" fill="#202D47" p-id="42013"></path><path d="M744.2 917.8L495.8 531.3l-402.4-96.1 9.3-38.9 410.2 98c5 1.2 9.4 4.3 12.2 8.6l252.8 393.3-33.7 21.6z" fill="#202D47" p-id="42014"></path><path d="M492 104h40v409.7h-40z" fill="#202D47" p-id="42015"></path></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

1
src/assets/icons/paiming.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750650628130" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="39874" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M51.2 665.6h358.4v204.8H51.2v102.4h972.8v51.2H0V0h51.2v153.6h870.4v204.8H51.2v51.2h460.8v204.8H51.2v51.2z" fill="#B4B4B4" p-id="39875"></path></svg>

After

Width:  |  Height:  |  Size: 482 B

1
src/assets/icons/paiming1.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750650530737" class="icon" viewBox="0 0 1170 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="29042" xmlns:xlink="http://www.w3.org/1999/xlink" width="228.515625" height="200"><path d="M438.857143 877.714286v146.285714H0v-146.285714h438.857143z m292.571428-292.571429v146.285714H0V585.142857h731.428571z m219.428572-292.571428v146.285714H0V292.571429h950.857143z m219.428571-292.571429v146.285714H0V0h1170.285714z" fill="#2D8CF0" p-id="29043"></path></svg>

After

Width:  |  Height:  |  Size: 612 B

1
src/assets/icons/zhexiantu.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750650061902" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7834" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M875.328 427.328L630.624 672H336v-16l11.68 10.944-240 256-23.36-21.888L329.056 640H624v16l-11.328-11.328 240-240 22.656 22.656zM880 416q0 1.6-0.32 3.136t-0.896 2.976q-0.608 1.472-1.472 2.784-0.896 1.28-1.984 2.432-1.12 1.088-2.432 1.984-1.312 0.864-2.784 1.472-1.44 0.608-2.976 0.896-1.568 0.32-3.136 0.32-1.6 0-3.136-0.32t-2.976-0.896q-1.472-0.608-2.784-1.472-1.28-0.896-2.432-1.984-1.088-1.12-1.984-2.432-0.864-1.312-1.472-2.784-0.608-1.44-0.896-2.976-0.32-1.568-0.32-3.136 0-1.6 0.32-3.136t0.896-2.976q0.608-1.472 1.472-2.784 0.896-1.28 1.984-2.432 1.12-1.088 2.432-1.984 1.312-0.864 2.784-1.472 1.44-0.608 2.976-0.896 1.568-0.32 3.136-0.32 1.6 0 3.136 0.32t2.976 0.896q1.472 0.608 2.784 1.472 1.28 0.896 2.432 1.984 1.088 1.12 1.984 2.432 0.864 1.312 1.472 2.784 0.608 1.44 0.896 2.976 0.32 1.568 0.32 3.136z m-768 496q0 1.6-0.32 3.136t-0.896 2.976q-0.608 1.472-1.472 2.784-0.896 1.28-1.984 2.432-1.12 1.088-2.432 1.984-1.312 0.864-2.784 1.472-1.44 0.608-2.976 0.896Q97.568 928 96 928q-1.6 0-3.136-0.32t-2.976-0.896q-1.472-0.608-2.784-1.472-1.28-0.896-2.432-1.984-1.088-1.12-1.984-2.432-0.864-1.312-1.472-2.784-0.608-1.44-0.896-2.976-0.32-1.568-0.32-3.136 0-1.6 0.32-3.136t0.896-2.976q0.608-1.472 1.472-2.784 0.896-1.28 1.984-2.432 1.12-1.088 2.432-1.984 1.312-0.864 2.784-1.472 1.44-0.608 2.976-0.896Q94.432 896 96 896q1.6 0 3.136 0.32t2.976 0.896q1.472 0.608 2.784 1.472 1.28 0.896 2.432 1.984 1.088 1.12 1.984 2.432 0.864 1.312 1.472 2.784 0.608 1.44 0.896 2.976 0.32 1.568 0.32 3.136z" fill="#1F4690" p-id="7835"></path><path d="M873.6 654.656l-256-112 6.4-14.656v16h-288v-16l6.4 14.656-256 112-12.8-29.312L332.64 512h294.72l259.04 113.344-12.8 29.312zM896 640q0 1.6-0.32 3.136t-0.896 2.976q-0.608 1.472-1.472 2.784-0.896 1.28-1.984 2.432-1.12 1.088-2.432 1.984-1.312 0.864-2.784 1.472-1.44 0.608-2.976 0.896-1.568 0.32-3.136 0.32-1.6 0-3.136-0.32t-2.976-0.896q-1.472-0.608-2.784-1.472-1.28-0.896-2.432-1.984-1.088-1.12-1.984-2.432-0.864-1.312-1.472-2.784-0.608-1.44-0.896-2.976Q864 641.568 864 640q0-1.6 0.32-3.136t0.896-2.976q0.608-1.472 1.472-2.784 0.896-1.28 1.984-2.432 1.12-1.088 2.432-1.984 1.312-0.864 2.784-1.472 1.44-0.608 2.976-0.896 1.568-0.32 3.136-0.32 1.6 0 3.136 0.32t2.976 0.896q1.472 0.608 2.784 1.472 1.28 0.896 2.432 1.984 1.088 1.12 1.984 2.432 0.864 1.312 1.472 2.784 0.608 1.44 0.896 2.976 0.32 1.568 0.32 3.136zM96 640q0 1.6-0.32 3.136t-0.896 2.976q-0.608 1.472-1.472 2.784-0.896 1.28-1.984 2.432-1.12 1.088-2.432 1.984-1.312 0.864-2.784 1.472-1.44 0.608-2.976 0.896-1.568 0.32-3.136 0.32-1.6 0-3.136-0.32t-2.976-0.896q-1.472-0.608-2.784-1.472-1.28-0.896-2.432-1.984-1.088-1.12-1.984-2.432-0.864-1.312-1.472-2.784-0.608-1.44-0.896-2.976Q64 641.568 64 640q0-1.6 0.32-3.136t0.896-2.976q0.608-1.472 1.472-2.784 0.896-1.28 1.984-2.432 1.12-1.088 2.432-1.984 1.312-0.864 2.784-1.472 1.44-0.608 2.976-0.896 1.568-0.32 3.136-0.32 1.6 0 3.136 0.32t2.976 0.896q1.472 0.608 2.784 1.472 1.28 0.896 2.432 1.984 1.088 1.12 1.984 2.432 0.864 1.312 1.472 2.784 0.608 1.44 0.896 2.976 0.32 1.568 0.32 3.136z" fill="#FFA500" p-id="7836"></path><path d="M416 368q0 44.16-80 128-80-83.84-80-128a80 80 0 0 1 160 0z" fill="#3A5BA0" p-id="7837"></path><path d="M928 240q0 44.16-80 128-80-83.84-80-128a80 80 0 0 1 160 0z" fill="#FFA500" p-id="7838"></path></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

1
src/assets/icons/zhibiao.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750649952578" class="icon" viewBox="0 0 1375 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5746" xmlns:xlink="http://www.w3.org/1999/xlink" width="268.5546875" height="200"><path d="M190.197474 125.068206m12.506821 0l350.190976 0q12.506821 0 12.506821 12.50682l0 100.054565q0 12.506821-12.506821 12.506821l-350.190976 0q-12.506821 0-12.506821-12.506821l0-100.054565q0-12.506821 12.506821-12.50682Z" fill="#2E74FF" opacity=".6" p-id="5747"></path><path d="M190.197474 781.676286m12.506821 0l1006.799057 0q12.506821 0 12.50682 12.506821l0 68.787513q0 12.506821-12.50682 12.506821l-1006.799057 0q-12.506821 0-12.506821-12.506821l0-68.787513q0-12.506821 12.506821-12.506821Z" fill="#000000" opacity=".116" p-id="5748"></path><path d="M418.97849 679.620631c24.513368 0 26.764596-4.002183 26.764596-27.014733 0-23.262686-2.251228-27.264869-26.764596-27.264869-25.013641 0-26.51446 4.002183-26.51446 27.264869 0 23.01255 1.500818 27.014732 26.51446 27.014733zM858.687034 354.349494a90.267978 90.267978 0 0 0-64.097455 26.764596 99.491758 99.491758 0 0 0-30.141438 63.347046 8.754774 8.754774 0 0 0 8.69224 9.598985h45.962566a9.067445 9.067445 0 0 0 8.848576-7.128887c2.407563-10.943468 6.847484-18.572629 13.132161-23.262687a30.32904 30.32904 0 0 1 19.416839-7.128887c10.224326 0.218869 18.385026 3.439376 24.857306 9.724053 6.566081 6.628615 10.005456 15.320855 10.255593 26.389391 0 10.630797-3.28304 19.010367-9.849121 25.420113-6.441013 6.503547-15.414656 9.692786-27.796409 9.692786h-12.506821a12.506821 12.506821 0 0 0-12.50682 12.50682v32.079995c0 6.878751 5.628069 12.506821 12.50682 12.506821h15.883663c11.006002 0 19.666975 3.220506 26.639527 9.817854 7.128888 6.878751 10.974735 17.009276 11.224872 30.735511-0.250136 13.132162-4.064717 22.918749-11.162337 29.547364a34.174887 34.174887 0 0 1-25.638983 10.724599c-9.567718 0-16.727873-2.43883-22.105805-7.379024a54.310868 54.310868 0 0 1-14.382844-21.793135 9.255047 9.255047 0 0 0-8.660973-5.972007h-45.868764a8.69224 8.69224 0 0 0-8.535906 10.255593c5.096529 27.640073 16.509003 49.151805 34.393757 64.222523 17.978555 15.16452 38.927479 22.856215 62.409035 22.856215 29.953835-0.312671 54.779874-10.067991 73.946577-29.109625 19.260504-18.385026 29.015824-43.461202 29.328494-74.696986a96.92786 96.92786 0 0 0-8.973644-40.959837l-2.313762-4.439921a81.638271 81.638271 0 0 0-15.977463-19.885845l-0.218869-0.187603a3.939648 3.939648 0 0 1 0-5.909472c7.504092-7.066354 13.132162-14.820582 16.884207-23.262687 4.721325-12.413019 7.00382-24.888573 7.00382-37.801865a98.30361 98.30361 0 0 0-26.264323-66.942757c-17.290679-18.697697-40.428298-28.765687-68.787514-30.172705l-5.628069-0.156335zM592.729495 354.349494c-26.420658 0.312671-48.932936 9.817854-66.911491 28.140346-17.665884 18.603896-26.983465 41.897849-28.20288 69.662991a8.754774 8.754774 0 0 0 8.754774 9.129979h45.837498c4.56499 0 8.37957-3.439376 8.879842-7.941831 1.344483-12.381752 5.440467-21.574266 12.100349-27.827676a31.235784 31.235784 0 0 1 23.043817-8.973643c10.568263 0.218869 18.291225 3.50191 23.888028 10.005456 5.784405 6.972552 8.69224 15.289588 8.69224 25.076175 0 3.81458-0.469006 7.910564-1.469552 12.319219-1.188148 3.595711-3.908381 8.442104-8.004365 13.851303l-119.033665 150.488319a12.506821 12.506821 0 0 0-2.688966 7.785496v36.738785c0 6.910018 5.596802 12.506821 12.506821 12.506821h169.936424a12.506821 12.506821 0 0 0 12.506821-12.506821V635.659156a12.506821 12.506821 0 0 0-12.506821-12.50682h-70.038195a12.506821 12.506821 0 0 1-9.817854-20.292317l71.976752-91.143455a94.739166 94.739166 0 0 0 20.386118-59.657534c-0.312671-27.733875-9.661519-50.934027-28.077812-69.225252-17.103077-17.415748-39.333951-26.920931-66.098547-28.296682l-5.628069-0.187602zM302.977729 356.913392H262.174226a12.506821 12.506821 0 0 0-7.441558 2.43883l-41.585178 30.641711a12.506821 12.506821 0 0 0-5.065263 10.06799v39.021281a12.506821 12.506821 0 0 0 19.948379 10.06799l3.752046-2.782767a12.506821 12.506821 0 0 1 19.948379 10.036723v216.399263c0 6.910018 5.628069 12.506821 12.506821 12.506821H302.977729a12.506821 12.506821 0 0 0 12.50682-12.506821v-303.3842a12.506821 12.506821 0 0 0-12.50682-12.506821z" fill="#2E74FF" p-id="5749"></path><path d="M1002.296602 662.580087a5.471734 5.471734 0 0 0-1.313217 6.190877 5.94074 5.94074 0 0 0 5.503001 3.470642h207.050415a5.909473 5.909473 0 0 0 5.440467-3.501909 5.471734 5.471734 0 0 0-1.313216-6.15961l-103.49394-98.116007a6.097075 6.097075 0 0 0-8.317036 0l-103.556474 98.116007z" fill="#FF8D1A" p-id="5750"></path></svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

1
src/assets/icons/zhu.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1750650026882" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6790" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M897.4 892.4h-72.6c-20.6 0-37.5-16.9-37.5-37.5V608.4c0-20.6 16.9-37.5 37.5-37.5h72.6c20.6 0 37.5 16.9 37.5 37.5V855c0 20.6-16.9 37.4-37.5 37.4z" fill="#D9D9D9" p-id="6791"></path><path d="M659.2 892.4h-72.6c-20.6 0-37.5-16.9-37.5-37.5V330.4c0-20.6 16.9-37.5 37.5-37.5h72.6c20.6 0 37.5 16.9 37.5 37.5V855c-0.1 20.6-16.9 37.4-37.5 37.4z" fill="#FFAD40" p-id="6792"></path><path d="M420.9 892.4h-72.6c-20.6 0-37.5-16.9-37.5-37.5V82.7c0-20.6 16.9-37.5 37.5-37.5h72.6c20.6 0 37.5 16.9 37.5 37.5V855c-0.1 20.6-16.9 37.4-37.5 37.4z" fill="#D9D9D9" p-id="6793"></path><path d="M182.6 892.4H110c-20.6 0-37.5-16.9-37.5-37.5V506.3c0-20.6 16.9-37.5 37.5-37.5h72.6c20.6 0 37.5 16.9 37.5 37.5V855c0 20.6-16.9 37.4-37.5 37.4z" fill="#FFAD40" p-id="6794"></path><path d="M0.3 939.7h1022.2v37.5H0.3z" fill="#D9D9D9" p-id="6795"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

1
src/components/DesignForm/app/index.vue

@ -38,6 +38,7 @@ import {
softDeletion,
retractRunWorkFlow,
recallSendMsg,
recalSendMsg,
} from "@/api/taskapi/management";
import { formatNumber } from "@/api/DesignForm/utils";

135
src/components/DesignForm/dragControlApp.vue

@ -3,109 +3,108 @@
@ 时间: 2024-05-09 15:12:45
@ 备注: 自定义表单组件页面(App专用)
-->
<script lang='ts' setup>
import { jsonParseStringify } from '@/utils/DesignForm'
import controlListData from '@/components/DesignForm/assembly'
import Draggable from 'vuedraggable-es'
import '@/assets/iconfont/iconfont.css'
<script lang="ts" setup>
import { jsonParseStringify } from "@/utils/DesignForm";
import controlListData from "@/components/DesignForm/assembly";
import Draggable from "vuedraggable-es";
import "@/assets/iconfont/iconfont.css";
//
import FormVersion from '@/components/DesignForm/formVersion.vue';
import FormVersion from "@/components/DesignForm/formVersion.vue";
const props = withDefaults(
defineProps<{
tableKey?: number | string,
signCode?: number | string,
tableKey?: number | string;
signCode?: number | string;
}>(),
{}
)
const designType = inject('formDesignType') as string // ( app.provide())
);
const designType = inject("formDesignType") as string; // ( app.provide())
const isSearch = computed(() => {
return designType === 'search'
})
return designType === "search";
});
//
const searchField = [
'input',
'radio',
'checkbox',
'select',
'datePicker',
'timePicker',
'inputNumber',
'cascader',
'component',
'button'
]
"input",
"radio",
"checkbox",
"select",
"datePicker",
"timePicker",
"inputNumber",
"cascader",
"component",
"button",
];
/**
@ 作者: 秦东
@ 时间: 2024-05-09 10:58:56
@ 功能: 表单组件数据
*/
const controlList = computed(() => {
if (designType === 'search') {
if (designType === "search") {
//
const temp: any = []
const temp: any = [];
controlListData.forEach((item: any) => {
if (item.children) {
const filter = item.children.filter((ch: any) => {
return searchField.includes(ch.type)
})
return searchField.includes(ch.type);
});
if (filter && filter.length) {
temp.push({ title: item.title, children: filter })
temp.push({ title: item.title, children: filter });
}
}
})
return temp
});
return temp;
} else {
return controlListData
return controlListData;
}
})
const tableVersion = ref() //
});
const tableVersion = ref(); //
const emits = defineEmits<{
(e: 'versionUpdateForm', value: string): void
(e: 'versionPreviewPage', value: string): void
}>()
(e: "versionUpdateForm", value: string): void;
(e: "versionPreviewPage", value: string): void;
}>();
/**
@ 作者: 秦东
@ 时间: 2024-05-09 11:36:59
@ 功能: 启用和禁用版本
*/
const enableOrDisable = (val?:any) =>{
const enableOrDisable = (val?: any) => {
// console.log("",val)
emits('versionUpdateForm', val)
}
emits("versionUpdateForm", val);
};
/**
@ 作者: 秦东
@ 时间: 2024-05-21 09:05:20
@ 功能: 预览版本
*/
const previewPage = (val?:any) =>{
emits('versionPreviewPage', val)
}
const previewPage = (val?: any) => {
emits("versionPreviewPage", val);
};
/**
@ 作者: 秦东
@ 时间: 2024-05-09 11:40:15
@ 功能: 打开版本选择页面
*/
const useVersionClick = () => {
tableVersion.value.open()
}
tableVersion.value.open();
};
const activities = [
{
content: 'Event start',
timestamp: '2018-04-15',
content: "Event start",
timestamp: "2018-04-15",
},
{
content: 'Approved',
timestamp: '2018-04-13',
content: "Approved",
timestamp: "2018-04-13",
},
{
content: 'Success',
timestamp: '2018-04-11',
content: "Success",
timestamp: "2018-04-11",
},
]
];
/**
@ 作者: 秦东
@ 时间: 2024-05-15 10:15:14
@ -113,19 +112,15 @@ const activities = [
*/
const clone = (origin: any) => {
// console.log("",origin)
return jsonParseStringify(origin)
}
return jsonParseStringify(origin);
};
</script>
<template>
<div class="components-list">
<div v-for="(list, index) in controlList" :key="index">
<div class="title">
{{ list.title }}
<div
v-if="index === 0 && !isSearch"
class="template"
@click="useVersionClick"
>
<div v-if="index === 0 && !isSearch" class="template" @click="useVersionClick">
版本
</div>
</div>
@ -138,27 +133,31 @@ const clone = (origin: any) => {
:clone="clone"
:item-key="key123"
>
<template #item="{ element }">
<li class="fontIcon" :class="[element.type]">
<i v-if="element.iconFont==''" :class="`icon-${element.icon}`"></i>
<i v-if="element.iconFont!=''" :class="`fa ${element.iconFont} `"></i>
<i v-if="element.iconFont == ''" :class="`icon-${element.icon}`"></i>
<i v-if="element.iconFont != ''" :class="`fa ${element.iconFont} `"></i>
<span :title="element.label">{{ element.label }}</span>
</li>
</template>
</draggable>
</div>
</div>
<FormVersion ref="tableVersion" :table-key="props.tableKey" :sign-code="props.signCode" @enableOrDisable="enableOrDisable" @previewPage="previewPage" />
<FormVersion
ref="tableVersion"
:table-key="props.tableKey"
:sign-code="props.signCode"
@enableOrDisable="enableOrDisable"
@previewPage="previewPage"
/>
</template>
<style lang='scss' scoped>
.tab_pane_body{
<style lang="scss" scoped>
.tab_pane_body {
text-align: center;
}
.fontIcon{
.fontIcon {
height: 35px;
i{
i {
padding: 3px 0px 0 0px;
}
}

130
src/components/DesignForm/dragControlNew.vue

@ -3,100 +3,99 @@
@ 时间: 2024-05-09 10:47:19
@ 备注: 自定义表单组件
-->
<script lang='ts' setup>
import { jsonParseStringify } from '@/utils/DesignForm'
import controlListData from '@/components/DesignForm/assembly'
import Draggable from 'vuedraggable-es'
import '@/assets/iconfont/iconfont.css'
<script lang="ts" setup>
import { jsonParseStringify } from "@/utils/DesignForm";
import controlListData from "@/components/DesignForm/assembly";
import Draggable from "vuedraggable-es";
import "@/assets/iconfont/iconfont.css";
//
import FormVersion from '@/components/DesignForm/formVersion.vue';
import FormVersion from "@/components/DesignForm/formVersion.vue";
const props = withDefaults(
defineProps<{
tableKey?: number | string,
signCode?: number | string,
tableKey?: number | string;
signCode?: number | string;
}>(),
{}
)
const designType = inject('formDesignType') as string // ( app.provide())
);
const designType = inject("formDesignType") as string; // ( app.provide())
const isSearch = computed(() => {
return designType === 'search'
})
return designType === "search";
});
//
const searchField = [
'input',
'radio',
'checkbox',
'select',
'datePicker',
'timePicker',
'inputNumber',
'cascader',
'component',
'button'
]
"input",
"radio",
"checkbox",
"select",
"datePicker",
"timePicker",
"inputNumber",
"cascader",
"component",
"button",
];
/**
@ 作者: 秦东
@ 时间: 2024-05-09 10:58:56
@ 功能: 表单组件数据
*/
const controlList = computed(() => {
if (designType === 'search') {
if (designType === "search") {
//
const temp: any = []
const temp: any = [];
controlListData.forEach((item: any) => {
if (item.children) {
const filter = item.children.filter((ch: any) => {
return searchField.includes(ch.type)
})
return searchField.includes(ch.type);
});
if (filter && filter.length) {
temp.push({ title: item.title, children: filter })
temp.push({ title: item.title, children: filter });
}
}
})
return temp
});
return temp;
} else {
return controlListData
return controlListData;
}
})
const tableVersion = ref() //
});
const tableVersion = ref(); //
const emits = defineEmits<{
(e: 'versionUpdateForm', value: string): void
}>()
(e: "versionUpdateForm", value: string): void;
}>();
/**
@ 作者: 秦东
@ 时间: 2024-05-09 11:36:59
@ 功能: 启用和禁用版本
*/
const enableOrDisable = (val?:any) =>{
console.log("启用和禁用版本",val)
emits('versionUpdateForm', val)
}
const enableOrDisable = (val?: any) => {
console.log("启用和禁用版本", val);
emits("versionUpdateForm", val);
};
/**
@ 作者: 秦东
@ 时间: 2024-05-09 11:40:15
@ 功能: 打开版本选择页面
*/
const useVersionClick = () => {
tableVersion.value.open()
}
tableVersion.value.open();
};
const activities = [
{
content: 'Event start',
timestamp: '2018-04-15',
content: "Event start",
timestamp: "2018-04-15",
},
{
content: 'Approved',
timestamp: '2018-04-13',
content: "Approved",
timestamp: "2018-04-13",
},
{
content: 'Success',
timestamp: '2018-04-11',
content: "Success",
timestamp: "2018-04-11",
},
]
];
/**
@ 作者: 秦东
@ -105,21 +104,15 @@ const activities = [
*/
const clone = (origin: any) => {
// console.log("new--->",origin)
return jsonParseStringify(origin)
}
return jsonParseStringify(origin);
};
</script>
<template>
<div class="components-list">
<div v-for="(list, index) in controlList" :key="index">
<div class="title">
{{ list.title }}
<div
v-if="index === 0 && !isSearch"
class="template"
@click="useVersionClick"
>
<div v-if="index === 0 && !isSearch" class="template" @click="useVersionClick">
版本
</div>
</div>
@ -132,26 +125,29 @@ const clone = (origin: any) => {
:clone="clone"
item-key="key123"
>
<template #item="{ element }">
<li class="fontIcon" :class="[element.type]">
<i v-if="element.iconFont==''" :class="`icon-${element.icon}`"></i>
<i v-if="element.iconFont!=''" :class="`fa ${element.iconFont} `"></i>
<i v-if="element.iconFont == ''" :class="`icon-${element.icon}`"></i>
<i v-if="element.iconFont != ''" :class="`fa ${element.iconFont} `"></i>
<span :title="element.label">{{ element.label }}</span>
</li>
</template>
</draggable>
</div>
</div>
<FormVersion ref="tableVersion" :table-key="props.tableKey" :sign-code="props.signCode" @enableOrDisable="enableOrDisable" />
<FormVersion
ref="tableVersion"
:table-key="props.tableKey"
:sign-code="props.signCode"
@enableOrDisable="enableOrDisable"
/>
</template>
<style lang='scss' scoped>
.tab_pane_body{
<style lang="scss" scoped>
.tab_pane_body {
text-align: center;
}
.fontIcon{
i{
.fontIcon {
i {
padding: 4px 0px 0 0px;
}
}

99
src/components/DesignForm/echarts/index.ts

@ -0,0 +1,99 @@
//表单组件
export const echartsUnitList = [
{
uuid:"",
icon: "bingtu",
type: "pie",
title: "饼图",
widthBox: 0,
y: [],
x: [],
filter: [],
timelength: 1,
search: {
state: false,
searchBut: ['search'],
factor: [],
},
},
{
uuid:"",
icon: "zhexiantu",
type: "line",
title: "折线图",
widthBox: 0,
y: [],
x: [],
filter: [],
timelength: 1,
search: {
state: false,
searchBut: ['search'],
factor: [],
},
},
{
uuid:"",
icon: "zhibiao",
type: "target",
title: "指标图",
widthBox: 0,
y: [],
x: [],
filter: [],
timelength: 1,
search: {
state: false,
searchBut: ['search'],
factor: [],
},
},
{
uuid:"",
icon: "zhu",
type: "bar",
title: "柱图",
widthBox: 0,
y: [],
x: [],
filter: [],
timelength: 1,
search: {
state: false,
searchBut: ['search'],
factor: [],
},
},
{
uuid:"",
icon: "paiming1",
type: "barRace",
title: "排行榜",
widthBox: 0,
y: [],
x: [],
filter: [],
timelength: 1,
search: {
state: false,
searchBut: ['search'],
factor: [],
},
},
{
uuid:"",
icon: "leidatu",
type: "radar",
title: "雷达图",
widthBox: 0,
y: [],
x: [],
filter: [],
timelength: 1,
search: {
state: false,
searchBut: ['search'],
factor: [],
},
}
]

12
src/components/DesignForm/public/form/formGroup.vue

@ -52,7 +52,7 @@ watch(
() => props.data,
(v: FormList[]) => {
dataList.value = v;
// console.log("++++++++++>",v)
console.log("监听表单变化++++++++++>", v);
},
{
deep: true,
@ -142,11 +142,11 @@ const draggableAdd = (evt: any) => {
const key = new Date().getTime().toString();
const obj: any = dataList.value[newIndex];
const isNested = evt.target && evt.target.getAttribute("data-type"); //
// console.log("-----1------->",newIndex)
// console.log("-----2------->",key)
// console.log("-----3------->",obj)
// console.log("-----4------->",isNested)
// console.log("-----4------->",dataList.value)
console.log("设计拖拽事件-----1------->", newIndex);
console.log("设计拖拽事件-----2------->", key);
console.log("设计拖拽事件-----3------->", obj);
console.log("设计拖拽事件-----4------->", isNested);
console.log("设计拖拽事件-----4------->", dataList.value);
if (
(isNested === "not-nested" && notNested(obj.type)) ||
((isNested === "not-table" || isNested === "not-flex") &&

30
src/store/DesignForm/designForm.ts

@ -29,3 +29,33 @@ export const useDesignFormStore = defineStore('designForm', {
},
}
})
//图表
export const useDesignEchartsStore = defineStore('designEcharts', {
state: () => {
return {
controlAttr: {},
activeKey: '',
columnsCheck: getStorage('echartsColumns', true) || [], // 表格勾选的列
//type: 1, //当前表单状态 1新增;2查看(表单模式) ;3查看; 4设计
//isEdit: false, //编辑状态,type=1新增模式下有编辑状态,主要用于控制编辑模式下某些字段的禁用状态,即可新增但不能修改
//model: {}, // 给form-group提供联动条件设置
//hideField: [], // 设置了使用v-if隐藏的字段
}
},
actions: {
setControlAttr(data: any) {
this.controlAttr = data
},
setActiveKey(key: string) {
this.activeKey = key
},
setColumnsCheck(path: string, data: string[]) {
this.columnsCheck[path] = data
setStorage('echartsColumns', this.columnsCheck, 0)
},
getColumnsCheck(path: string) {
return this.columnsCheck[path] || []
},
}
})

1
src/utils/workflow/const.ts

@ -3,6 +3,7 @@
*/
export let bgColors = ['87, 106, 149', '255, 148, 62', '50, 150, 250','255,102,0','255,255,255']
export let placeholderList = ["发起人", "审核人", "抄送人", "执行人"];
export let timeSearch = [{value: 1, label: '近一天'},{value: 2, label: '近一周'},{value: 3, label: '近一月'},{value: 4, label: '近三月'},{value: 5, label: '近半年'},{value: 6, label: '近一年'}]
export let setTypes = [
{value: 1, label: '指定成员'},

15
src/views/redirect/index.vue

@ -1,15 +0,0 @@
<template>
<div />
</template>
<script setup lang="ts">
import { useRoute, useRouter } from 'vue-router';
const route = useRoute();
const router = useRouter();
const { params, query } = route;
const { path } = params;
router.replace({ path: '/' + path, query });
</script>

186
src/views/sysworkflow/lowcodepage/appPage/appPageForm/dataBoard.vue

@ -0,0 +1,186 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-23 10:55:32
@ 备注: 数据看板
-->
<script lang="ts" setup>
import { echatsViews } from "@/api/DesignForm/types";
import { dimMeaInfo } from "@/api/chart/index";
import { dimMeaFormTable, countChartValue, getChartCont } from "@/api/chart/index";
//
import LeftPath from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/left.vue";
import ContainerPath from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/container.vue";
import RightPath from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/right.vue";
const props = defineProps({
appCont: {
type: Object,
default() {
return {};
},
},
formKey: {
type: String,
default: "",
},
groupKey: {
type: String,
default: "",
},
menuId: {
type: String,
default: "",
},
appPageKey: {
type: String,
default: "",
},
formVersion: {
type: String,
default: "",
},
state: {
type: Object,
default() {
return {};
},
},
});
const butLoading = ref(false);
const echartsInfo = reactive<echatsViews>({
uuid: "12332",
icon: "zhu",
type: "bar",
title: "柱图",
widthBox: 0,
y: [],
x: [],
filter: [],
timelength: 1,
search: {
state: false,
searchBut: ["search"],
factor: [],
},
});
const dimAry = ref<dimMeaInfo[]>([]);
const meaAry = ref<dimMeaInfo[]>([]);
/**
@ 作者: 秦东
@ 时间: 2025-06-27 13:06:25
@ 功能: 获取维度义量化字段
*/
const dimMeaList = () => {
console.log("获取维度义量化字段", props);
dimMeaFormTable({ id: props.state.formData.form.name }).then((data) => {
console.log("获取维度义量化字段", data);
dimAry.value = data.data.dimList;
meaAry.value = data.data.meaList;
});
/*获取视图数据*/
getChartCont({ id: props.state.formData.form.name }).then((data) => {
console.log("获取视图数据", data);
if (data.code == 0) {
props.state.echatsViews = data.data;
}
});
};
onMounted(() => {
dimMeaList();
// props.state.echatsViews.push(echartsInfo);
});
/**
@ 作者: 秦东
@ 时间: 2025-07-08 09:08:35
@ 功能: 提交数据
*/
const saveChart = () => {
console.log("提交图标设置", props);
butLoading.value = true;
countChartValue({
tableKey: props.state.formData.form.name,
chartList: props.state.echatsViews,
})
.then((data) => {
console.log("获取视图数据", data);
butLoading.value = false;
})
.finally(() => {
butLoading.value = false;
});
};
</script>
<template>
<div class="common-layout">
<el-container>
<el-aside width="250px">
<LeftPath />
</el-aside>
<el-main>
<div class="chartBut">
<el-button type="primary" v-loading="butLoading" @click="saveChart()"
>保存</el-button
>
<!-- <el-button type="warning">另存为新版本</el-button> -->
</div>
<div class="design-form">
<ContainerPath
:echats-views="props.state.echatsViews"
:table-key="props.state.formData.form.name"
:dim-ary="dimAry"
:mea-ary="meaAry"
:types="5"
/>
</div>
</el-main>
<el-aside width="250px"
><RightPath :dim-ary="dimAry" :mea-ary="meaAry" />
</el-aside>
</el-container>
</div>
</template>
<style scoped>
.common-layout {
width: 100%;
.el-aside {
height: calc(100vh - 40px);
padding: 0 0px;
overflow: hidden;
.cardBox {
padding: 0px;
margin-bottom: 20px;
}
:deep .el-card__body {
text-align: center;
padding: 0 0 10px 0;
cursor: position;
}
}
.el-main {
padding: 0px;
border-right: 1px solid rgb(221.7, 222.6, 224.4);
border-left: 1px solid rgb(221.7, 222.6, 224.4);
background-color: rgb(232.8, 233.4, 234.6);
.drawingBoard {
/* background-color: rgb(232.8, 233.4, 234.6); */
/* height: 100%; */
}
}
.tubiaoRow {
margin-top: 20px;
}
.svgClass {
width: 100%;
}
}
.chartBut {
background-color: #ffffff;
padding: 5px;
text-align: right;
}
.design-form {
padding: 10px 10px 0 10px;
}
</style>

223
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/bar.vue

@ -0,0 +1,223 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-26 15:20:37
@ 备注: 柱状图
-->
<script lang="ts" setup>
import { echatsViews } from "@/api/DesignForm/types";
import * as echarts from "echarts";
const props = withDefaults(
defineProps<{
uuid: string;
data: echatsViews;
tableKey: string;
kuandu: string | number;
}>(),
{
uuid: () => {
return "";
},
data: () => {
return [];
},
kuandu: () => {
return "";
},
}
);
var myChart = ref<any>();
/**
@ 作者: 秦东
@ 时间: 2025-06-26 11:34:21
@ 功能: 画图
*/
const drawPictures = () => {
if (props.uuid && props.uuid != "") {
myChart.value = echarts.init(document.getElementById(props.uuid) as HTMLDivElement);
myChart.value.setOption({
grid: {
left: "2%",
right: "2%",
bottom: "15%",
top: "15%",
containLabel: true,
},
xAxis: {
data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
},
yAxis: {},
legend: {
data: ["销量", "销量科技"],
},
series: [
{
name: "销量",
type: "bar",
data: [5, 20, 36, 10, 10, 20],
},
{
name: "销量科技",
type: "bar",
data: [15, 21, 26, 70, 18, 29],
},
],
});
console.log("画图完毕---->", props);
// myChart.value.resize();
}
};
watch(
() => props.kuandu,
(val: any) => {
console.log("画图完毕--改变-->", val);
drawPictures();
},
{ deep: true }
);
/**
@ 作者: 秦东
@ 时间: 2025-06-26 09:47:45
@ 功能: 判断是否有收缩条件
*/
const searBut = (val: string) => {
if (props.data.search.searchBut && Array.isArray(props.data.search.searchBut)) {
if (props.data.search.searchBut.includes(val)) {
return true;
}
}
return false;
};
onMounted(() => {
nextTick(() => {
drawPictures();
});
});
</script>
<template>
<div>
<el-space wrap class="spaceBox">
<svg-icon icon-class="zydq" :size="20" />
<el-text>{{ props.data.title }}</el-text>
</el-space>
<el-form
v-if="props.data.search"
:inline="true"
label-width="auto"
class="demo-form-inline"
>
<el-form-item v-for="item in props.data.search.factor" :label="item.lable">
<el-date-picker
v-if="item.type == 3 && item.timeType == 'ymdhms'"
v-model="item.value"
type="daterange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'year'"
v-model="item.value"
type="yearrange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'month'"
v-model="item.value"
type="monthrange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'day'"
v-model="item.value"
type="daterange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'hour'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'minute'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'second'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-select
v-else-if="item.options != null"
v-model="item.value"
clearable
placeholder="请选择"
>
<el-option
v-for="item in item.options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input v-else v-model="item.value" />
</el-form-item>
<el-form-item v-if="props.data.search.state">
<el-button v-if="searBut('search')" type="primary" @click="onSubmit"
>查询</el-button
>
<el-button v-if="searBut('reset')" @click="resetForm(ruleFormRef)"
>重置</el-button
>
</el-form-item>
</el-form>
<div class="barBox" :id="props.uuid"></div>
{{ props }}
</div>
</template>
<style lang="scss" scoped>
.barBox {
height: 250px;
width: 100%;
}
.spaceBox {
margin-top: 15px;
span {
font-size: 20px;
}
}
.demo-form-inline {
padding: 10px 0 0px 0;
}
.demo-form-inline .el-input {
--el-input-width: 200px;
}
.demo-form-inline .el-select {
--el-select-width: 200px;
}
</style>

201
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/barRace.vue

@ -0,0 +1,201 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-25 16:00:09
@ 备注: 排行榜
-->
<script lang="ts" setup>
import { echatsViews } from "@/api/DesignForm/types";
import * as echarts from "echarts";
const props = withDefaults(
defineProps<{
uuid: string;
data: echatsViews;
tableKey: string;
}>(),
{
uuid: () => {
return "";
},
data: () => {
return [];
},
}
);
var myChart = ref<any>();
/**
@ 作者: 秦东
@ 时间: 2025-06-26 11:34:21
@ 功能: 画图
*/
const drawPictures = () => {
if (props.uuid && props.uuid != "") {
myChart.value = echarts.init(document.getElementById(props.uuid) as HTMLDivElement);
myChart.value.setOption({
grid: {
left: "2%",
right: "2%",
bottom: "5%",
top: "15%",
containLabel: true,
},
xAxis: {
max: "dataMax",
},
yAxis: {
type: "category",
data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
inverse: true,
},
series: [
{
realtimeSort: true,
name: "销量",
type: "bar",
data: [5, 26, 36, 10, 15, 20],
},
],
});
console.log("画图完毕---->", props);
}
};
/**
@ 作者: 秦东
@ 时间: 2025-06-26 09:47:45
@ 功能: 判断是否有收缩条件
*/
const searBut = (val: string) => {
if (props.data.search.searchBut && Array.isArray(props.data.search.searchBut)) {
if (props.data.search.searchBut.includes(val)) {
return true;
}
}
return false;
};
onMounted(() => {
nextTick(() => {
drawPictures();
});
});
</script>
<template>
<div>
<el-space wrap class="spaceBox">
<svg-icon icon-class="zydq" :size="20" />
<el-text>{{ props.data.title }}</el-text>
</el-space>
<el-form :inline="true" label-width="auto" class="demo-form-inline">
<el-form-item v-for="item in props.data.search.factor" :label="item.lable">
<el-date-picker
v-if="item.type == 3 && item.timeType == 'ymdhms'"
v-model="item.value"
type="daterange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'year'"
v-model="item.value"
type="yearrange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'month'"
v-model="item.value"
type="monthrange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'day'"
v-model="item.value"
type="daterange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'hour'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'minute'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'second'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-select
v-else-if="item.options != null"
v-model="item.value"
clearable
placeholder="请选择"
>
<el-option
v-for="item in item.options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input v-else v-model="item.value" />
</el-form-item>
<el-form-item v-if="props.data.search.state">
<el-button v-if="searBut('search')" type="primary" @click="onSubmit"
>查询</el-button
>
<el-button v-if="searBut('reset')" @click="resetForm(ruleFormRef)"
>重置</el-button
>
</el-form-item>
</el-form>
<div class="barBox" :id="props.uuid"></div>
</div>
</template>
<style lang="scss" scoped>
.barBox {
height: 250px;
width: 100%;
}
.spaceBox {
margin-top: 15px;
span {
font-size: 20px;
}
}
.demo-form-inline {
padding: 10px 0 0px 0;
}
.demo-form-inline .el-input {
--el-input-width: 200px;
}
.demo-form-inline .el-select {
--el-select-width: 200px;
}
</style>

169
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/bar_test.vue

@ -0,0 +1,169 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-25 15:59:41
@ 备注: 柱状图
-->
<script lang="ts" setup>
import { echatsViews } from "@/api/DesignForm/types";
import * as echarts from "echarts";
import { AnalysisCss } from "@/components/DesignForm/public/form/calculate/cssInfo.ts";
import elementResizeDetectorMaker from "element-resize-detector";
const props = withDefaults(
defineProps<{
uuid: string;
data: echatsViews;
tableKey: string;
}>(),
{
uuid: () => {
return "";
},
data: () => {
return [];
},
}
);
var myChart = ref<any>();
const erd = elementResizeDetectorMaker();
/**
@ 作者: 秦东
@ 时间: 2025-06-26 11:34:21
@ 功能: 画图
*/
const drawPictures = () => {
if (props.uuid && props.uuid != "") {
myChart.value = echarts.init(document.getElementById(props.uuid) as HTMLDivElement);
myChart.value.setOption({
grid: {
left: "2%",
right: "2%",
bottom: "15%",
top: "15%",
containLabel: true,
},
xAxis: {
data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
},
yAxis: {},
legend: {
data: ["销量", "销量科技"],
},
series: [
{
name: "销量",
type: "bar",
data: [5, 20, 36, 10, 10, 20],
},
{
name: "销量科技",
type: "bar",
data: [15, 21, 26, 70, 18, 29],
},
],
});
console.log("画图完毕---->", props);
}
};
onMounted(() => {
nextTick(() => {
drawPictures();
});
});
/**
@ 作者: 秦东
@ 时间: 2025-06-26 09:47:45
@ 功能: 判断是否有收缩条件
*/
const searBut = (val: string) => {
if (props.data.search.searchBut && Array.isArray(props.data.search.searchBut)) {
if (props.data.search.searchBut.includes(val)) {
return true;
}
}
return false;
};
//
const getFormItemStyle = (ele: echatsViews) => {
// console.log("311---->", ele);
if (ele.widthBox == 0) {
return { width: "100%", margin: "0 5px" };
}
if (ele.widthBox > 24) {
ele.widthBox = 24;
}
if (ele.widthBox < 0) {
ele.widthBox = 0;
}
if (ele.widthBox) {
if (ele.styles?.divStyle) {
ele.styles.divStyle.width = (ele.widthBox / 24) * 100 + "%";
console.log("返回栅格宽度311--2-->", ele.styles.divStyle);
return AnalysisCss(ele.styles.divStyle);
}
return { width: (ele.widthBox / 24) * 100 + "%" };
}
if (ele.styles?.divStyle) {
// console.log("3",AnalysisCss(ele.styles.divStyle))1
return AnalysisCss(ele.styles.divStyle);
}
};
watch(
() => props.data,
(v: echatsViews) => {
// myChart.value.resize();
// console.log("", myChart.value);
},
{
deep: true,
}
);
</script>
<template>
<div>
<el-space wrap class="spaceBox">
<svg-icon icon-class="zydq" :size="20" />
<el-text>{{ props.data.title }}</el-text>
</el-space>
<el-form :inline="true" label-width="auto" class="demo-form-inline">
<el-form-item label="名称">
<el-input />
</el-form-item>
<el-form-item v-if="props.data.search.state">
<el-button v-if="searBut('search')" type="primary" @click="onSubmit"
>查询</el-button
>
<el-button v-if="searBut('reset')" @click="resetForm(ruleFormRef)"
>重置</el-button
>
</el-form-item>
</el-form>
<div class="barBox" :id="props.uuid"></div>
{{ props.data }}
</div>
</template>
<style lang="scss" scoped>
.barBox {
height: 250px;
width: 100%;
}
.spaceBox {
margin-top: 15px;
span {
font-size: 20px;
}
}
.demo-form-inline {
padding: 10px 0 0px 0;
}
.demo-form-inline .el-input {
--el-input-width: 200px;
}
.demo-form-inline .el-select {
--el-select-width: 200px;
}
</style>

216
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/line.vue

@ -0,0 +1,216 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-25 15:58:38
@ 备注: 折线图
-->
<script lang="ts" setup>
import { echatsViews } from "@/api/DesignForm/types";
import * as echarts from "echarts";
const props = withDefaults(
defineProps<{
uuid: string;
data: echatsViews;
tableKey: string;
}>(),
{
uuid: () => {
return "";
},
data: () => {
return [];
},
}
);
var myChartPie = ref<any>();
/**
@ 作者: 秦东
@ 时间: 2025-06-26 11:34:21
@ 功能: 画图
*/
const drawPie = () => {
if (props.uuid && props.uuid != "") {
myChartPie.value = echarts.init(
document.getElementById(props.uuid) as HTMLDivElement
);
myChartPie.value.setOption({
grid: {
left: "2%",
right: "2%",
bottom: "5%",
top: "15%",
containLabel: true,
},
xAxis: {
type: "category",
data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
},
legend: {
data: ["销量", "销量科技"],
},
yAxis: {
type: "value",
},
series: [
{
name: "销量",
data: [820, 932, 901, 934, 1290, 1330, 1320],
type: "line",
smooth: true,
},
{
name: "销量科技",
data: [822, 942, 951, 4, 1290, 1330, 1320],
type: "line",
smooth: true,
},
],
});
console.log("画图完毕---->", props);
}
};
/**
@ 作者: 秦东
@ 时间: 2025-06-26 09:47:45
@ 功能: 判断是否有收缩条件
*/
const searBut = (val: string) => {
if (props.data.search.searchBut && Array.isArray(props.data.search.searchBut)) {
if (props.data.search.searchBut.includes(val)) {
return true;
}
}
return false;
};
onMounted(() => {
nextTick(() => {
drawPie();
});
});
</script>
<template>
<div>
<el-space wrap class="spaceBox">
<svg-icon icon-class="zydq" :size="20" />
<el-text>{{ props.data.title }}</el-text>
</el-space>
<el-form
v-if="props.data.search"
:inline="true"
label-width="auto"
class="demo-form-inline"
>
<el-form-item v-for="item in props.data.search.factor" :label="item.lable">
<el-date-picker
v-if="item.type == 3 && item.timeType == 'ymdhms'"
v-model="item.value"
type="daterange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'year'"
v-model="item.value"
type="yearrange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'month'"
v-model="item.value"
type="monthrange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'day'"
v-model="item.value"
type="daterange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'hour'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'minute'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'second'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-select
v-else-if="item.options != null"
v-model="item.value"
clearable
placeholder="请选择"
>
<el-option
v-for="item in item.options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input v-else v-model="item.value" />
</el-form-item>
<el-form-item v-if="props.data.search.state">
<el-button v-if="searBut('search')" type="primary" @click="onSubmit"
>查询</el-button
>
<el-button v-if="searBut('reset')" @click="resetForm(ruleFormRef)"
>重置</el-button
>
</el-form-item>
</el-form>
<div class="barBox" :id="props.uuid"></div>
</div>
</template>
<style lang="scss" scoped>
.barBox {
height: 250px;
width: 100%;
}
.spaceBox {
margin-top: 15px;
span {
font-size: 20px;
}
}
.demo-form-inline {
padding: 10px 0 0px 0;
}
.demo-form-inline .el-input {
--el-input-width: 200px;
}
.demo-form-inline .el-select {
--el-select-width: 200px;
}
</style>

217
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/pie copy.vue

@ -0,0 +1,217 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-25 15:58:06
@ 备注: 饼状图
-->
<script lang="ts" setup>
import { echatsViews } from "@/api/DesignForm/types";
import * as echarts from "echarts";
const props = withDefaults(
defineProps<{
uuid: string;
data: echatsViews;
tableKey: string;
}>(),
{
uuid: () => {
return "";
},
data: () => {
return [];
},
}
);
var myChartPie = ref<any>();
/**
@ 作者: 秦东
@ 时间: 2025-06-26 11:34:21
@ 功能: 画图
*/
const drawPie = () => {
if (props.uuid && props.uuid != "") {
myChartPie.value = echarts.init(
document.getElementById(props.uuid) as HTMLDivElement
);
myChartPie.value.setOption({
grid: {
left: "2%",
right: "2%",
bottom: "5%",
top: "15%",
containLabel: true,
},
legend: {
data: ["Allocated Budget", "Actual Spending"],
},
radar: {
// shape: 'circle',
indicator: [
{ name: "Sales", max: 6500 },
{ name: "Administration", max: 16000 },
{ name: "Information Technology", max: 30000 },
{ name: "Customer Support", max: 38000 },
{ name: "Development", max: 52000 },
{ name: "Marketing", max: 25000 },
],
},
series: [
{
name: "Budget vs spending",
type: "radar",
data: [
{
value: [4200, 3000, 20000, 35000, 50000, 18000],
name: "Allocated Budget",
},
{
value: [5000, 14000, 28000, 26000, 42000, 21000],
name: "Actual Spending",
},
],
},
],
});
console.log("画图完毕---->", props);
}
};
/**
@ 作者: 秦东
@ 时间: 2025-06-26 09:47:45
@ 功能: 判断是否有收缩条件
*/
const searBut = (val: string) => {
if (props.data.search.searchBut && Array.isArray(props.data.search.searchBut)) {
if (props.data.search.searchBut.includes(val)) {
return true;
}
}
return false;
};
onMounted(() => {
nextTick(() => {
drawPie();
});
});
</script>
<template>
<div>
<el-space wrap class="spaceBox">
<svg-icon icon-class="zydq" :size="20" />
<el-text>{{ props.data.title }}</el-text>
</el-space>
<el-form :inline="true" label-width="auto" class="demo-form-inline">
<el-form-item v-for="item in props.data.search.factor" :label="item.lable">
<el-date-picker
v-if="item.type == 3 && item.timeType == 'ymdhms'"
v-model="item.value"
type="daterange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'year'"
v-model="item.value"
type="yearrange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'month'"
v-model="item.value"
type="monthrange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'day'"
v-model="item.value"
type="daterange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'hour'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'minute'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'second'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-select
v-else-if="item.options != null"
v-model="item.value"
clearable
placeholder="请选择"
>
<el-option
v-for="item in item.options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input v-else v-model="item.value" />
</el-form-item>
<el-form-item v-if="props.data.search.state">
<el-button v-if="searBut('search')" type="primary" @click="onSubmit"
>查询</el-button
>
<el-button v-if="searBut('reset')" @click="resetForm(ruleFormRef)"
>重置</el-button
>
</el-form-item>
</el-form>
<div class="barBox" :id="props.uuid"></div>
</div>
</template>
<style lang="scss" scoped>
.barBox {
height: 250px;
width: 100%;
}
.spaceBox {
margin-top: 15px;
span {
font-size: 20px;
}
}
.demo-form-inline {
padding: 10px 0 0px 0;
}
.demo-form-inline .el-input {
--el-input-width: 200px;
}
.demo-form-inline .el-select {
--el-select-width: 200px;
}
</style>

216
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/pie.vue

@ -0,0 +1,216 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-25 15:58:06
@ 备注: 饼状图
-->
<script lang="ts" setup>
import { echatsViews } from "@/api/DesignForm/types";
import * as echarts from "echarts";
const props = withDefaults(
defineProps<{
uuid: string;
data: echatsViews;
tableKey: string;
}>(),
{
uuid: () => {
return "";
},
data: () => {
return [];
},
}
);
var myChartPie = ref<any>();
/**
@ 作者: 秦东
@ 时间: 2025-06-26 11:34:21
@ 功能: 画图
*/
const drawPie = () => {
if (props.uuid && props.uuid != "") {
myChartPie.value = echarts.init(
document.getElementById(props.uuid) as HTMLDivElement
);
myChartPie.value.setOption({
grid: {
left: "2%",
right: "2%",
bottom: "5%",
top: "15%",
containLabel: true,
},
legend: {
left: "center",
},
series: [
{
name: "Access From",
type: "pie",
radius: "50%",
data: [
{ value: 1048, name: "Search Engine" },
{ value: 735, name: "Direct" },
{ value: 580, name: "Email" },
{ value: 484, name: "Union Ads" },
{ value: 300, name: "Video Ads" },
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: "rgba(0, 0, 0, 0.5)",
},
},
},
],
});
console.log("画图完毕---->", props);
}
};
/**
@ 作者: 秦东
@ 时间: 2025-06-26 09:47:45
@ 功能: 判断是否有收缩条件
*/
const searBut = (val: string) => {
if (props.data.search.searchBut && Array.isArray(props.data.search.searchBut)) {
if (props.data.search.searchBut.includes(val)) {
return true;
}
}
return false;
};
onMounted(() => {
nextTick(() => {
drawPie();
});
});
</script>
<template>
<div>
<el-space wrap class="spaceBox">
<svg-icon icon-class="zydq" :size="20" />
<el-text>{{ props.data.title }}</el-text>
</el-space>
<el-form
v-if="props.data.search"
:inline="true"
label-width="auto"
class="demo-form-inline"
>
<el-form-item v-for="item in props.data.search.factor" :label="item.lable">
<el-date-picker
v-if="item.type == 3 && item.timeType == 'ymdhms'"
v-model="item.value"
type="daterange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'year'"
v-model="item.value"
type="yearrange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'month'"
v-model="item.value"
type="monthrange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'day'"
v-model="item.value"
type="daterange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'hour'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'minute'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'second'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-select
v-else-if="item.options != null"
v-model="item.value"
clearable
placeholder="请选择"
>
<el-option
v-for="item in item.options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input v-else v-model="item.value" />
</el-form-item>
<el-form-item v-if="props.data.search.state">
<el-button v-if="searBut('search')" type="primary" @click="onSubmit"
>查询</el-button
>
<el-button v-if="searBut('reset')" @click="resetForm(ruleFormRef)"
>重置</el-button
>
</el-form-item>
</el-form>
<div class="barBox" :id="props.uuid"></div>
</div>
</template>
<style lang="scss" scoped>
.barBox {
height: 250px;
width: 100%;
}
.spaceBox {
margin-top: 15px;
span {
font-size: 20px;
}
}
.demo-form-inline {
padding: 10px 0 0px 0;
}
.demo-form-inline .el-input {
--el-input-width: 200px;
}
.demo-form-inline .el-select {
--el-select-width: 200px;
}
</style>

222
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/radar.vue

@ -0,0 +1,222 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-25 16:00:36
@ 备注: 雷达图
-->
<script lang="ts" setup>
import { echatsViews } from "@/api/DesignForm/types";
import * as echarts from "echarts";
const props = withDefaults(
defineProps<{
uuid: string;
data: echatsViews;
tableKey: string;
}>(),
{
uuid: () => {
return "";
},
data: () => {
return [];
},
}
);
var myChartPie = ref<any>();
/**
@ 作者: 秦东
@ 时间: 2025-06-26 11:34:21
@ 功能: 画图
*/
const drawPie = () => {
if (props.uuid && props.uuid != "") {
myChartPie.value = echarts.init(
document.getElementById(props.uuid) as HTMLDivElement
);
myChartPie.value.setOption({
grid: {
left: "2%",
right: "2%",
bottom: "5%",
top: "5%",
containLabel: true,
},
legend: {
data: ["Allocated Budget", "Actual Spending"],
},
radar: {
// shape: 'circle',
indicator: [
{ name: "Sales", max: 6500 },
{ name: "Administration", max: 16000 },
{ name: "Information Technology", max: 30000 },
{ name: "Customer Support", max: 38000 },
{ name: "Development", max: 52000 },
{ name: "Marketing", max: 25000 },
],
},
series: [
{
name: "Budget vs spending",
type: "radar",
data: [
{
value: [4200, 3000, 20000, 35000, 50000, 18000],
name: "Allocated Budget",
},
{
value: [5000, 14000, 28000, 26000, 42000, 21000],
name: "Actual Spending",
},
],
},
],
});
console.log("画图完毕---->", props);
}
};
/**
@ 作者: 秦东
@ 时间: 2025-06-26 09:47:45
@ 功能: 判断是否有收缩条件
*/
const searBut = (val: string) => {
if (props.data.search.searchBut && Array.isArray(props.data.search.searchBut)) {
if (props.data.search.searchBut.includes(val)) {
return true;
}
}
return false;
};
onMounted(() => {
nextTick(() => {
drawPie();
});
});
</script>
<template>
<div>
<el-space wrap class="spaceBox">
<svg-icon icon-class="zydq" :size="20" />
<el-text>{{ props.data.title }}</el-text>
</el-space>
<el-form
v-if="props.data.search"
:inline="true"
label-width="auto"
class="demo-form-inline"
>
<el-form-item v-for="item in props.data.search.factor" :label="item.lable">
<el-date-picker
v-if="item.type == 3 && item.timeType == 'ymdhms'"
v-model="item.value"
type="daterange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'year'"
v-model="item.value"
type="yearrange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'month'"
v-model="item.value"
type="monthrange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'day'"
v-model="item.value"
type="daterange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'hour'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'minute'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-date-picker
v-else-if="item.type == 3 && item.timeType == 'second'"
v-model="item.value"
type="datetimerange"
range-separator="To"
start-placeholder="起始时间"
end-placeholder="结束时间"
value-format="x"
/>
<el-select
v-else-if="item.options != null"
v-model="item.value"
clearable
placeholder="请选择"
>
<el-option
v-for="item in item.options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input v-else v-model="item.value" />
</el-form-item>
<el-form-item v-if="props.data.search.state">
<el-button v-if="searBut('search')" type="primary" @click="onSubmit"
>查询</el-button
>
<el-button v-if="searBut('reset')" @click="resetForm(ruleFormRef)"
>重置</el-button
>
</el-form-item>
</el-form>
<div class="barBox" :id="props.uuid"></div>
</div>
</template>
<style lang="scss" scoped>
.barBox {
height: 400px;
width: 100%;
}
.spaceBox {
margin-top: 15px;
span {
font-size: 20px;
}
}
.demo-form-inline {
padding: 10px 0 0px 0;
}
.demo-form-inline .el-input {
--el-input-width: 200px;
}
.demo-form-inline .el-select {
--el-select-width: 200px;
}
</style>

23
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/target.vue

@ -0,0 +1,23 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-25 15:59:10
@ 备注: 指标图
-->
<script lang="ts" setup>
import { echatsViews } from "@/api/DesignForm/types";
const props = withDefaults(
defineProps<{
data: echatsViews;
tableKey: string;
}>(),
{
data: () => {
return [];
},
}
);
</script>
<template>
<div>指标图</div>
</template>
<style lang="scss" scoped></style>

284
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/container.vue

@ -0,0 +1,284 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-24 14:02:25
@ 备注: 画板
-->
<script lang="ts" setup>
import { echatsViews } from "@/api/DesignForm/types";
import { Md5 } from "ts-md5";
import Draggable from "vuedraggable-es";
import { useDesignEchartsStore } from "@/store/DesignForm/designForm";
import { jsonParseStringify } from "@/utils/DesignForm";
import { AnalysisCss } from "@/components/DesignForm/public/form/calculate/cssInfo.ts";
//
import BarPage from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/bar.vue";
import BarRacePage from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/barRace.vue";
import LinePage from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/line.vue";
import PiePage from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/pie.vue";
import RadarPage from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/radar.vue";
import TargetPage from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/chart/target.vue";
const props = defineProps({
tableKey: {
type: String,
default: "",
},
types: {
type: Number,
default: 5,
},
echatsViews: {
type: Array,
default() {
return [];
},
},
dimAry: {
type: Array,
default() {
return [];
},
},
meaAry: {
type: Array,
default() {
return [];
},
},
});
const dataList = computed({
get: () => {
return props.echatsViews;
},
set: (newVal: any) => {
return newVal;
},
});
const type = computed({
get: () => {
return props.types;
},
set: (newVal: any) => {
return newVal;
},
});
const state = reactive({
clone: true, // clone
gridAdd: false,
});
const store = useDesignEchartsStore() as any; //
const activeKey = computed(() => {
return store.activeKey;
});
const pickEcharts = ref<echatsViews>();
const draggableAdd = (evt: any) => {
const newIndex = evt.newIndex;
const key = new Date().getTime().toString();
const obj: any = dataList.value[newIndex];
// console.log("-----1------->", evt);
// console.log("-----2------->", key);
// console.log("-----3------->", obj);
// console.log("-----4------->", newIndex);
if (!obj.uuid) {
obj.uuid = obj.type + key;
}
groupClick(obj);
};
//
const linksIf = (obj: FormList) => {
// console.log("-----1------->", obj);
return true;
};
const getGroupName = (item: any) => {
// console.log("-----1------->", item);
if (item.uuid) {
return item.uuid;
} else {
let md5Object: any = new Md5();
md5Object.appendAsciiStr(JSON.stringify(item));
let md5Str = md5Object.end();
// item.uuid = md5Str;
return md5Str;
}
};
const groupClick = (item: any, ele?: string) => {
store.setActiveKey(getGroupName(item));
store.setControlAttr(item);
// grid
state.gridAdd = item.type === "grid";
// state.clone = !notNested(item.type)
// state.clone = !notNestedTableFlex(item.type);
pickEcharts.value = item;
console.log("点击激活当前--->", item, ele);
};
//
const click = (action: string, index: number, item?: any) => {
// if (type.value !== 5) {
// return; //
// }
// console.log("--->", action, index, item);
if (action === "clone") {
const key = item.type + new Date().getTime().toString();
const newItem = jsonParseStringify(item);
dataList.value.splice(index, 0, Object.assign(newItem, { uuid: key }));
} else if (action === "del") {
dataList.value.splice(index, 1);
//
store.setActiveKey("");
store.setControlAttr({});
} else if (action === "gridAdd") {
item.columns.push({
list: [],
attr: { span: 12 },
});
} else if (action === "delGridChild") {
item.splice(index, 1);
}
};
const kuandu = ref(0);
//
const getFormItemStyle = (ele: echatsViews) => {
console.log("返回栅格宽度311---->", ele);
if (ele.widthBox == 0) {
kuandu.value = "auto";
return { width: "auto", margin: "0 5px" };
}
if (ele.widthBox > 24) {
ele.widthBox = 24;
}
if (ele.widthBox < 0) {
ele.widthBox = 0;
}
if (ele.widthBox) {
if (ele.styles?.divStyle) {
ele.styles.divStyle.width = (ele.widthBox / 24) * 100 + "%";
console.log("返回栅格宽度311--2-->", ele.styles.divStyle);
kuandu.value = (ele.widthBox / 24) * 100 + "%";
return AnalysisCss(ele.styles.divStyle);
}
kuandu.value = (ele.widthBox / 24) * 100 + "%";
console.log("返回栅格宽度311--5-->", kuandu.value);
return { width: (ele.widthBox / 24) * 100 + "%" };
}
if (ele.styles?.divStyle) {
console.log("返回栅格宽度3", AnalysisCss(ele.styles.divStyle));
return AnalysisCss(ele.styles.divStyle);
}
};
</script>
<template>
<draggable
itemKey="id"
:list="dataList"
name="fade"
class="drag"
v-bind="{
group: 'echartsform',
ghostClass: 'ghost',
animation: 200,
handle: '.drag-move',
disabled: type !== 5,
}"
@add="draggableAdd"
>
<template #item="{ element }">
<div
class="group"
:class="{
['group-' + element.type]: true,
active: activeKey === getGroupName(element),
}"
:style="getFormItemStyle(element)"
@click.stop="groupClick(element)"
v-if="linksIf(element)"
>
<BarPage
v-if="element.type == 'bar'"
:data="element"
:table-key="tableKey"
:uuid="element.uuid"
:kuandu="kuandu"
/>
<BarRacePage
v-if="element.type == 'barRace'"
:data="element"
:uuid="element.uuid"
:table-key="tableKey"
:kuandu="kuandu"
/>
<LinePage
v-if="element.type == 'line'"
:data="element"
:table-key="tableKey"
:uuid="element.uuid"
:kuandu="kuandu"
/>
<PiePage
v-if="element.type == 'pie'"
:data="element"
:table-key="tableKey"
:uuid="element.uuid"
:kuandu="kuandu"
/>
<RadarPage
v-if="element.type == 'radar'"
:data="element"
:table-key="tableKey"
:uuid="element.uuid"
:kuandu="kuandu"
/>
<TargetPage
v-if="element.type == 'target'"
:data="element"
:uuid="element.uuid"
:table-key="tableKey"
:dim-ary="props.dimAry"
:mea-ary="props.meaAry"
:kuandu="kuandu"
/>
<template v-if="type === 5">
<div class="drag-control">
<div class="item-control">
<i
class="icon-plus"
@click.stop="click('gridAdd', index, element)"
v-if="state.gridAdd"
title="添加列"
></i>
<i
class="icon-clone"
@click.stop="click('clone', index, element)"
v-if="state.clone"
title="克隆"
></i>
<i class="icon-del" @click.stop="click('del', index)"></i>
</div>
<div class="drag-move icon-move"></div>
</div>
<!-- <div class="tooltip" style="display: black;">{{ element.name }}</div> -->
<div class="tooltip" style="display: black"></div>
</template>
</div>
</template>
</draggable>
</template>
<style lang="scss" scoped>
.drag {
background: #ffffff;
border: 1px dashed #999;
height: calc(100vh - 105px);
overflow-y: auto;
overflow-x: hidden;
position: relative;
}
.tiaojian {
width: 100%;
height: 50px;
}
</style>

105
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/left.vue

@ -0,0 +1,105 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-24 14:00:19
@ 备注:
-->
<script lang="ts" setup>
import Draggable from "vuedraggable-es";
import { echartsUnitList } from "@/components/DesignForm/echarts/index";
import { jsonParseStringify } from "@/utils/DesignForm";
/**
@ 作者: 秦东
@ 时间: 2024-05-15 10:15:14
@ 功能: 克隆选中的组件数据结构
*/
const clone = (origin: any) => {
console.log("new--->克隆选中的组件数据结构", origin);
origin.uuid = origin.type + "_" + new Date().getTime().toString();
return jsonParseStringify(origin);
};
</script>
<template>
<!-- <el-col v-for="item in echartsUnitList" :span="12">
<el-card class="cardBox" style="width: 100%" shadow="always">
<svg-icon :icon-class="item.icon" :size="90" />
<el-text class="mx-1" size="large">{{ item.title }}</el-text>
</el-card>
</el-col> -->
<div class="echartLeft">
<!-- <div>
<el-button type="danger" text>切换版本</el-button>
</div> -->
<draggable
v-model="echartsUnitList"
tag="ul"
:group="{ name: 'echartsform', pull: 'clone', put: false }"
ghost-class="ghost"
:sort="false"
:clone="clone"
item-key="key123"
>
<template #item="{ element }">
<li :span="12">
<el-card class="cardBox" style="width: 100%" shadow="always">
<svg-icon :icon-class="element.icon" :size="100" />
<el-text class="mx-1" size="large">{{ element.title }}</el-text>
</el-card>
</li>
</template>
</draggable>
</div>
</template>
<style lang="scss" scoped>
.echartLeft {
width: 100%;
ul {
position: relative;
overflow: hidden;
margin: 0;
padding-top: 25px;
li {
width: 46%;
position: relative;
float: left;
left: 0;
text-align: center;
margin-left: 3%;
cursor: pointer;
}
}
}
.common-layout {
width: 100%;
.el-aside {
height: calc(100vh - 40px);
padding: 0 0px;
.cardBox {
padding: 0px;
margin-bottom: 20px;
}
:deep .el-card__body {
text-align: center;
padding: 0 0 10px 0;
cursor: position;
}
}
.el-main {
padding: 10px;
border-right: 1px solid rgb(221.7, 222.6, 224.4);
border-left: 1px solid rgb(221.7, 222.6, 224.4);
.drawingBoard {
background-color: rgb(232.8, 233.4, 234.6);
height: 100%;
}
}
.tubiaoRow {
margin-top: 20px;
overflow: hidden;
}
.svgClass {
width: 100%;
}
}
</style>

396
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/right.vue

@ -0,0 +1,396 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-24 13:57:09
@ 备注: 图表面板右侧
-->
<script lang="ts" setup>
import { echatsViews } from "@/api/DesignForm/types";
import { timeSearch } from "@/utils/workflow/const";
import { useDesignEchartsStore } from "@/store/DesignForm/designForm";
import { dimSetInfo, MaeSetInfo, filterInfo, searchInfo } from "@/api/chart/type";
//
import DimensionPage from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/dimension.vue";
import MeasurementPage from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/measurement.vue";
import DimMeaPage from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/dimMea.vue";
import FilterPage from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/filterPage.vue";
import SearchPage from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/searchPage.vue";
const props = defineProps({
dimAry: {
type: Array,
default() {
return [];
},
},
meaAry: {
type: Array,
default() {
return [];
},
},
});
const pickDimInfo = ref<dimSetInfo>("");
const pickMeaInfo = ref<MaeSetInfo>("");
const pickFilpage = ref<filterInfo>("");
const pickSearInfo = ref<searchInfo>("");
const store = useDesignEchartsStore() as any; //
const openDim = ref(false);
const openMea = ref(false);
const openDimMea = ref(false);
const openFilpage = ref(false);
const openSearch = ref(false);
const dimMeaType = ref(1);
const controlData = computed(() => {
// console.log("--------1--------->", store.controlAttr);
return store.controlAttr;
});
/**
@ 作者: 秦东
@ 时间: 2025-06-27 15:01:25
@ 功能: 选择维度与度量字段
*/
const pickDim = (val: number) => {
openDimMea.value = true;
dimMeaType.value = val;
};
// const controlDatas = reactive<echatsViews>({
// uuid: "",
// type: "cyl",
// title: "",
// y: [],
// x: [],
// filter: [],
// timelength: 1,
// search: {
// state: false,
// echatsViews: [],
// factor: [],
// },
// });
/**
@ 作者: 秦东
@ 时间: 2025-06-30 11:06:51
@ 功能: 删除维度
*/
const delDim = (index: number) => {
if (
controlData.value.x &&
Array.isArray(controlData.value.x) &&
controlData.value.x.length > 0
) {
controlData.value.x.splice(index, 1);
}
};
/**
@ 作者: 秦东
@ 时间: 2025-06-30 13:02:10
@ 功能: 打开设置维度
*/
const setDimInfo = (val: dimSetInfo) => {
pickDimInfo.value = val;
openDim.value = true;
};
/**
@ 作者: 秦东
@ 时间: 2025-07-02 16:49:04
@ 功能: 删除度量
*/
const delMea = (index: number) => {
if (
controlData.value.y &&
Array.isArray(controlData.value.y) &&
controlData.value.y.length > 0
) {
controlData.value.y.splice(index, 1);
}
};
/**
@ 作者: 秦东
@ 时间: 2025-07-04 16:59:11
@ 功能: 删除过滤条件
*/
const delMeaDim = (index: number) => {
if (
controlData.value.filter &&
Array.isArray(controlData.value.filter) &&
controlData.value.filter.length > 0
) {
controlData.value.filter.splice(index, 1);
}
};
/**
@ 作者: 秦东
@ 时间: 2025-07-07 14:30:19
@ 功能: 删除搜索条件
*/
const delSearch = (index: number) => {
if (
controlData.value.search.factor &&
Array.isArray(controlData.value.search.factor) &&
controlData.value.search.factor.length > 0
) {
controlData.value.search.factor.splice(index, 1);
}
};
/**
@ 作者: 秦东
@ 时间: 2025-07-02 16:50:02
@ 功能: 打开度量设置
*/
const setMeaInfo = (val: dimSetInfo) => {
pickMeaInfo.value = val;
openMea.value = true;
};
/**
@ 作者: 秦东
@ 时间: 2025-07-07 09:09:35
@ 功能: 打开过滤条件设置
*/
const setFilInfo = (val: dimSetInfo) => {
pickFilpage.value = val;
openFilpage.value = true;
console.log("打开过滤条件设置", openFilpage.value, pickFilpage.value);
};
/**
@ 作者: 秦东
@ 时间: 2025-07-07 14:31:56
@ 功能: 设置搜索条件配置
*/
const setSearch = (val: searchInfo) => {
pickSearInfo.value = val;
console.log("设置搜索条件配置", val);
openSearch.value = true;
};
</script>
<template>
<div class="echartsRight">
<el-divider content-position="left">配置属性</el-divider>
<div v-if="controlData.icon">
<div class="arttBoxTitle">
<el-text class="mx-1" size="large">图表名称</el-text>
<el-text class="mx-1" type="primary"></el-text>
</div>
<div class="arttBoxInfo">
<el-input v-model="controlData.title" placeholder="请输入图表名称" clearable />
</div>
<div class="arttBoxTitle">
<el-text class="mx-1" size="large">表单栅格</el-text>
<el-text class="mx-1" type="primary"></el-text>
</div>
<div class="arttBoxInfo">
<el-input
v-model="controlData.widthBox"
placeholder="表单区域栅格宽,0为自动宽"
clearable
/>
</div>
<div class="arttBoxTitle">
<el-text class="mx-1" size="large">看板标签/维度</el-text>
<el-text class="mx-1 shouxing" type="primary" @click="pickDim(1)">添加</el-text>
</div>
<div class="arttBoxInfo">
<div
v-if="controlData.x && Array.isArray(controlData.x) && controlData.x.length < 1"
class="arttInXuquan"
>
<el-text class="mx-1" type="info">未设置维度字段</el-text>
</div>
<div v-for="(item, index) in controlData.x" class="dimListBox">
<div class="dimListTitle">{{ item.title }}</div>
<el-space wrap>
<svg-icon
icon-class="set"
:size="20"
class="setBut"
@click="setDimInfo(item)"
/>
<svg-icon icon-class="sc" :size="20" class="setBut" @click="delDim(index)" />
</el-space>
</div>
</div>
<div class="arttBoxTitle">
<el-text class="mx-1" size="large">看板指标/度量</el-text>
<el-text class="mx-1 shouxing" type="primary" @click="pickDim(2)">添加</el-text>
</div>
<div class="arttBoxInfo">
<div
v-if="controlData.y && Array.isArray(controlData.y) && controlData.y.length < 1"
class="arttInXuquan"
>
<el-text class="mx-1" type="info">未设置度量字段</el-text>
</div>
<div v-for="(item, index) in controlData.y" class="dimListBox">
<div class="dimListTitle">{{ item.title }}</div>
<el-space wrap>
<svg-icon
icon-class="set"
:size="20"
class="setBut"
@click="setMeaInfo(item)"
/>
<svg-icon icon-class="sc" :size="20" class="setBut" @click="delMea(index)" />
</el-space>
</div>
</div>
<div class="arttBoxTitle">
<el-text class="mx-1" size="large">过滤器</el-text>
<el-text class="mx-1 shouxing" type="primary" @click="pickDim(3)">添加</el-text>
</div>
<div class="arttBoxInfo">
<div v-if="controlData.filter.length < 1" class="arttInXuquan">
<el-text class="mx-1" type="info">未设置过滤器</el-text>
</div>
<div v-for="(item, index) in controlData.filter" class="dimListBox">
<div class="dimListTitle">{{ item.lable }}</div>
<el-space wrap>
<svg-icon
icon-class="set"
:size="20"
class="setBut"
@click="setFilInfo(item)"
/>
<svg-icon
icon-class="sc"
:size="20"
class="setBut"
@click="delMeaDim(index)"
/>
</el-space>
</div>
</div>
<div class="arttBoxTitle">
<el-text class="mx-1" size="large">数据时间范围</el-text>
<el-text class="mx-1" type="primary"></el-text>
</div>
<div class="arttBoxInfo">
<el-select
v-model="controlData.timelength"
placeholder="请选择时间范围"
style="width: 240px"
>
<el-option
v-for="item in timeSearch"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
<div class="arttBoxTitle">
<el-text class="mx-1" size="large">查询条件</el-text>
<el-text class="mx-1" type="primary"
><el-switch v-model="controlData.search.state"
/></el-text>
</div>
<div v-if="controlData.search.state" class="arttBoxInfo">
<el-text class="mx-1">按钮显示</el-text>
<el-checkbox-group v-model="controlData.search.searchBut">
<el-checkbox label="查询" value="search" />
<el-checkbox label="重置" value="reset" />
</el-checkbox-group>
<div class="arttBoxTitle">
<el-text class="mx-1">设置查询条件</el-text>
<el-text class="mx-1 shouxing" type="primary" @click="pickDim(4)">添加</el-text>
</div>
<div class="arttBoxInfo">
<div v-if="controlData.search.factor.length < 1" class="arttInXuquan">
<el-text class="mx-1" type="info">未设置查询条件</el-text>
</div>
<div v-for="(item, index) in controlData.search.factor" class="dimListBox">
<div class="dimListTitle">{{ item.oldTitle }}</div>
<el-space wrap>
<svg-icon
icon-class="set"
:size="20"
class="setBut"
@click="setSearch(item)"
/>
<svg-icon
icon-class="sc"
:size="20"
class="setBut"
@click="delSearch(index)"
/>
</el-space>
</div>
</div>
</div>
</div>
<DimensionPage
v-if="openDim"
v-model:is-show="openDim"
v-model:dim-info="pickDimInfo"
/>
<MeasurementPage
v-if="openMea"
v-model:is-show="openMea"
v-model:mea-info="pickMeaInfo"
/>
<DimMeaPage
v-if="openDimMea"
v-model:is-show="openDimMea"
:dim-mea-type="dimMeaType"
:dim-ary="dimAry"
:mea-ary="meaAry"
/>
<FilterPage
v-if="openFilpage"
v-model:is-show="openFilpage"
v-model:dim-info="pickFilpage"
/>
<SearchPage
v-if="openSearch"
v-model:is-show="openSearch"
v-model:dim-info="pickSearInfo"
/>
</div>
</template>
<style lang="scss" scoped>
.echartsRight {
width: 100%;
padding: 0px 10px;
}
.arttBoxTitle {
display: flex;
align-items: center;
justify-content: space-between;
}
.arttBoxInfo {
margin: 10px 0;
}
.arttInXuquan {
width: 10;
text-align: center;
border: 1px dashed rgb(199.5, 201, 204);
padding: 5px 0;
}
.shouxing {
cursor: pointer;
}
.dimListBox {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 5px;
svg :hover {
color: #409eff;
}
}
.dimListTitle {
width: 170px;
background-color: #f8f8f8;
height: 30px;
display: flex;
align-items: center;
padding: 5px 10px;
border-radius: 5px;
color: #4e4e4e;
font-size: 14px;
}
.setBut {
cursor: pointer;
}
</style>

731
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/dimMea.vue

@ -0,0 +1,731 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-27 14:50:32
@ 备注: 维度与计量字段
-->
<script lang="ts" setup>
import type { CollapseIconPositionType } from "element-plus";
import { useDesignEchartsStore } from "@/store/DesignForm/designForm";
import { dimMeaInfo, filterInfo } from "@/api/chart/type";
const store = useDesignEchartsStore() as any; //
const props = defineProps({
isShow: {
type: Boolean,
default: false,
},
dimMeaType: {
type: Number,
default: 1,
},
dimAry: {
type: Array,
default() {
return [];
},
},
meaAry: {
type: Array,
default() {
return [];
},
},
});
const drawTitle = ref("");
const leftPick = ref<CollapseIconPositionType>("right");
const checkDimList = ref<any>([]);
const checkMeaList = ref<any>([]);
//
const controlData = computed(() => {
return store.controlAttr;
});
const emits = defineEmits(["update:isShow"]);
const openClose = computed({
get: () => {
switch (props.dimMeaType) {
case 2:
drawTitle.value = "添加度量";
break;
case 3:
drawTitle.value = "添加过滤器";
break;
case 4:
drawTitle.value = "添加查询条件";
break;
default:
drawTitle.value = "添加维度";
break;
}
huanyuan();
return props.isShow;
},
set: (newVal: any) => {
emits("update:isShow", newVal);
},
});
/**
@ 作者: 秦东
@ 时间: 2025-06-27 14:39:42
@ 功能: 关闭
*/
const handleClose = () => {
emits("update:isShow", false);
};
/**
@ 作者: 秦东
@ 时间: 2025-06-27 15:52:20
@ 功能: 返回时间题目
*/
const timeTitle = (field: dimMeaInfo, typ: string) => {
return field.title + "(" + typ + ")";
};
/**
@ 作者: 秦东
@ 时间: 2025-06-27 15:52:20
@ 功能: 返回时间值
*/
const timeVal = (field: dimMeaInfo, typ: string) => {
return field.field + "|#$#|" + typ;
};
/**
@ 作者: 秦东
@ 时间: 2025-06-30 08:34:44
@ 功能: 维度组装
*/
const dimMakecont = (val: number) => {
if (Array.isArray(checkDimList.value)) {
let fieldAry = new Array();
checkDimList.value.forEach((item: any) => {
let valAry = item.split("|#$#|");
if (Array.isArray(valAry) && valAry.length > 1) {
switch (val) {
case 3:
break;
case 4:
break;
default:
props.dimAry.forEach((itemDim) => {
if (itemDim.field == valAry[0]) {
let isNew = true;
if (
Array.isArray(controlData.value.x) &&
controlData.value.x.length > 0
) {
controlData.value.x.forEach((xItem: any) => {
if (xItem.field == item) {
isNew = false;
fieldAry.push(xItem);
}
});
}
if (isNew) {
fieldAry.push({
title: itemDim.title + "(" + valAry[valAry.length - 1] + ")",
type: itemDim.type,
field: itemDim.field,
options: itemDim.options,
oldTitle: itemDim.title + "(" + valAry[valAry.length - 1] + ")",
timeType: valAry[valAry.length - 1],
sort: 1,
});
}
}
});
}
} else {
switch (val) {
case 3:
break;
case 4:
break;
default:
props.dimAry.forEach((itemDim) => {
console.log("维度组装-----1------->", itemDim.field == item, itemDim, item);
if (itemDim.field == item) {
let isNew = true;
if (
Array.isArray(controlData.value.x) &&
controlData.value.x.length > 0
) {
controlData.value.x.forEach((xItem: any) => {
if (xItem.field == item) {
isNew = false;
fieldAry.push(xItem);
}
});
}
if (isNew) {
fieldAry.push({
title: itemDim.title,
type: itemDim.type,
field: itemDim.field,
options: itemDim.options,
oldTitle: itemDim.title,
timeType: "",
sort: 1,
});
}
}
});
}
}
});
controlData.value.x = fieldAry;
console.log("维度组装", controlData.value);
}
};
/**
@ 作者: 秦东
@ 时间: 2025-06-30 14:21:28
@ 功能: 组装度量
*/
const meaMakecont = (val: number) => {
// "--->",
// Array.isArray(checkMeaList.value),
// checkMeaList.value.length,
// checkMeaList.value
// );
if (Array.isArray(checkMeaList.value) && checkMeaList.value.length > 0) {
let fieldAry = new Array();
checkMeaList.value.forEach((item: any) => {
let valAry = item.split("|#$#|");
if (Array.isArray(valAry) && valAry.length > 1) {
switch (val) {
case 3:
break;
case 4:
break;
default:
props.meaAry.forEach((itemDim) => {
if (itemDim.field == valAry[0]) {
let isNew = true;
if (
Array.isArray(controlData.value.y) &&
controlData.value.y.length > 0
) {
controlData.value.y.forEach((yItem: any) => {
if (yItem.field == item) {
isNew = false;
fieldAry.push(yItem);
}
});
}
if (isNew) {
fieldAry.push({
title: itemDim.title + "(" + valAry[valAry.length - 1] + ")",
type: itemDim.type,
field: itemDim.field,
options: itemDim.options,
oldTitle: itemDim.title + "(" + valAry[valAry.length - 1] + ")",
timeType: valAry[valAry.length - 1],
sort: 1,
});
}
}
});
}
} else {
switch (val) {
case 3:
break;
case 4:
break;
default:
props.meaAry.forEach((itemDim) => {
console.log("维度组装-----1------->", itemDim.field == item, itemDim, item);
if (itemDim.field == item) {
let isNew = true;
if (
Array.isArray(controlData.value.y) &&
controlData.value.y.length > 0
) {
controlData.value.y.forEach((xItem: any) => {
if (xItem.field == item) {
isNew = false;
fieldAry.push(xItem);
}
});
}
if (isNew) {
fieldAry.push({
title: itemDim.title,
type: itemDim.type,
field: itemDim.field,
options: itemDim.options,
oldTitle: itemDim.title,
timeType: "",
sort: 1,
});
}
}
});
}
}
});
controlData.value.y = fieldAry;
}
};
/**
@ 作者: 秦东
@ 时间: 2025-07-03 09:34:59
@ 功能: 组装过滤器
*/
const meaDimCont = () => {
console.log("维度数据--->", checkDimList.value, props.dimAry);
console.log("量度数据--->", checkMeaList.value);
let fieldAry = new Array();
if (Array.isArray(checkDimList.value) && checkDimList.value.length > 0) {
checkDimList.value.forEach((item: any) => {
let valAry = item.split("|#$#|");
if (Array.isArray(valAry) && valAry.length > 1) {
props.dimAry.forEach((itemDim) => {
if (itemDim.field == valAry[0]) {
fieldAry.push({
lable: itemDim.title + "(" + valAry[valAry.length - 1] + ")",
type: 3,
field: itemDim.field,
options: itemDim.options,
oldTitle: itemDim.title + "(" + valAry[valAry.length - 1] + ")",
timeType: valAry[valAry.length - 1],
sort: 1,
conditions: "",
method: 1,
modality: 1,
modalityList: [],
startTime: "",
endTime: "",
meadim: 1,
});
}
});
} else {
props.dimAry.forEach((itemDim) => {
if (itemDim.field == item) {
fieldAry.push({
lable: itemDim.title,
type: itemDim.type,
field: itemDim.field,
options: itemDim.options,
oldTitle: itemDim.title,
timeType: "",
sort: 1,
conditions: "",
method: 1,
modality: 1,
modalityList: [],
startTime: "",
endTime: "",
meadim: 1,
});
}
});
}
});
}
let fieldMeaAry = new Array();
if (Array.isArray(checkMeaList.value) && checkMeaList.value.length > 0) {
checkMeaList.value.forEach((item: any) => {
let valAry = item.split("|#$#|");
if (Array.isArray(valAry) && valAry.length > 1) {
props.meaAry.forEach((itemDim) => {
if (itemDim.field == valAry[0]) {
fieldMeaAry.push({
lable: itemDim.title + "(" + valAry[valAry.length - 1] + ")",
type: 3,
field: itemDim.field,
options: itemDim.options,
oldTitle: itemDim.title + "(" + valAry[valAry.length - 1] + ")",
timeType: valAry[valAry.length - 1],
sort: 1,
conditions: "",
method: 1,
modality: 1,
modalityList: [],
startTime: "",
endTime: "",
meadim: 2,
});
}
});
} else {
props.meaAry.forEach((itemDim) => {
if (itemDim.field == item) {
fieldMeaAry.push({
lable: itemDim.title,
type: itemDim.type,
field: itemDim.field,
options: itemDim.options,
oldTitle: itemDim.title,
timeType: "",
sort: 1,
conditions: "",
method: 1,
modality: 1,
modalityList: [],
startTime: "",
endTime: "",
meadim: 2,
});
}
});
}
});
}
console.log("量度数据-23-->", fieldAry);
console.log("量度数据--34->", fieldMeaAry);
controlData.value.filter.splice(0, controlData.value.filter.length);
console.log("量度数据--55->", controlData.value.filter);
controlData.value.filter.push(...fieldAry, ...fieldMeaAry);
console.log("量度数据--66->", controlData.value.filter);
};
/**
@ 作者: 秦东
@ 时间: 2025-07-07 14:07:17
@ 功能: 组装搜索条件
*/
const searchList = () => {
let fieldAry = new Array();
if (Array.isArray(checkDimList.value) && checkDimList.value.length > 0) {
checkDimList.value.forEach((item: any) => {
let valAry = item.split("|#$#|");
if (Array.isArray(valAry) && valAry.length > 1) {
props.dimAry.forEach((itemDim) => {
if (itemDim.field == valAry[0]) {
fieldAry.push({
lable: itemDim.title + "(" + valAry[valAry.length - 1] + ")",
type: itemDim.type,
field: itemDim.field,
options: itemDim.options,
oldTitle: itemDim.title + "(" + valAry[valAry.length - 1] + ")",
timeType: valAry[valAry.length - 1],
sort: 1,
isTime: true,
value: "",
startTime: "",
endTime: "",
coor: "Y",
});
}
});
} else {
props.dimAry.forEach((itemDim) => {
if (itemDim.field == item) {
fieldAry.push({
lable: itemDim.title,
type: itemDim.type,
field: itemDim.field,
options: itemDim.options,
oldTitle: itemDim.title,
timeType: "",
sort: 1,
isTime: false,
value: "",
startTime: "",
endTime: "",
coor: "Y",
});
}
});
}
});
}
let fieldMeaAry = new Array();
if (Array.isArray(checkMeaList.value) && checkMeaList.value.length > 0) {
checkMeaList.value.forEach((item: any) => {
let valAry = item.split("|#$#|");
if (Array.isArray(valAry) && valAry.length > 1) {
props.meaAry.forEach((itemDim) => {
if (itemDim.field == valAry[0]) {
fieldMeaAry.push({
lable: itemDim.title + "(" + valAry[valAry.length - 1] + ")",
type: 3,
field: itemDim.field,
options: itemDim.options,
oldTitle: itemDim.title + "(" + valAry[valAry.length - 1] + ")",
timeType: valAry[valAry.length - 1],
sort: 1,
isTime: true,
value: "",
startTime: "",
endTime: "",
coor: "X",
});
}
});
} else {
props.meaAry.forEach((itemDim) => {
if (itemDim.field == item) {
fieldMeaAry.push({
lable: itemDim.title,
type: itemDim.type,
field: itemDim.field,
options: itemDim.options,
oldTitle: itemDim.title,
timeType: "",
sort: 1,
isTime: false,
value: "",
startTime: "",
endTime: "",
coor: "X",
});
}
});
}
});
}
console.log("量度数据-23-->", fieldAry);
console.log("量度数据--34->", fieldMeaAry);
controlData.value.search.factor.splice(0, controlData.value.search.factor.length);
console.log("量度数据--55->", controlData.value.search.factor);
controlData.value.search.factor.push(...fieldAry, ...fieldMeaAry);
console.log("量度数据--66->", controlData.value.search);
};
/**
@ 作者: 秦东
@ 时间: 2025-06-27 16:12:49
@ 功能: 确定选择
*/
const pickDimMeaSet = () => {
console.log("确定选择", props.dimMeaType);
switch (props.dimMeaType) {
case 2:
drawTitle.value = "添加度量";
meaMakecont(props.dimMeaType);
break;
case 3:
drawTitle.value = "添加过滤器";
meaDimCont();
break;
case 4:
drawTitle.value = "添加查询条件";
searchList();
break;
default:
drawTitle.value = "添加维度";
dimMakecont(props.dimMeaType);
break;
}
handleClose();
};
/**
@ 作者: 秦东
@ 时间: 2025-06-30 14:28:37
@ 功能: 初始化加载
*/
onMounted(() => {
huanyuan();
});
/**
@ 作者: 秦东
@ 时间: 2025-06-30 15:45:56
@ 功能: 还原数据
*/
const huanyuan = () => {
switch (props.dimMeaType) {
case 2:
checkMeaList.value.splice(0, checkMeaList.value.length);
if (
controlData.value.y &&
Array.isArray(controlData.value.y) &&
controlData.value.y.length > 0
) {
controlData.value.y.forEach((item: any) => {
if (item.timeType != "") {
checkMeaList.value.push(timeVal(item, item.timeType));
} else {
checkMeaList.value.push(item.field);
}
});
}
break;
case 3:
checkMeaList.value.splice(0, checkMeaList.value.length);
checkDimList.value.splice(0, checkDimList.value.length);
if (
controlData.value.filter &&
Array.isArray(controlData.value.filter) &&
controlData.value.filter.length > 0
) {
controlData.value.filter.forEach((item: any) => {
if (item.meadim == 1) {
if (item.timeType != "") {
checkDimList.value.push(timeVal(item, item.timeType));
} else {
checkDimList.value.push(item.field);
}
} else {
if (item.timeType != "") {
checkMeaList.value.push(timeVal(item, item.timeType));
} else {
checkMeaList.value.push(item.field);
}
}
});
}
break;
case 4:
drawTitle.value = "添加查询条件";
checkMeaList.value.splice(0, checkMeaList.value.length);
checkDimList.value.splice(0, checkDimList.value.length);
if (
controlData.value.search.factor &&
Array.isArray(controlData.value.search.factor) &&
controlData.value.search.factor.length > 0
) {
controlData.value.search.factor.forEach((item: any) => {
if (item.meadim == 1) {
if (item.timeType != "") {
checkDimList.value.push(timeVal(item, item.timeType));
} else {
checkDimList.value.push(item.field);
}
} else {
if (item.timeType != "") {
checkMeaList.value.push(timeVal(item, item.timeType));
} else {
checkMeaList.value.push(item.field);
}
}
});
}
break;
default:
checkDimList.value.splice(0, checkDimList.value.length);
if (
controlData.value.x &&
Array.isArray(controlData.value.x) &&
controlData.value.x.length > 0
) {
controlData.value.x.forEach((item: any) => {
if (item.timeType != "") {
checkDimList.value.push(timeVal(item, item.timeType));
} else {
checkDimList.value.push(item.field);
}
});
}
break;
}
};
</script>
<template>
<el-drawer
v-model="openClose"
:title="drawTitle"
direction="rtl"
:before-close="handleClose"
>
<div class="drawBodyBox">
<el-divider
v-if="props.dimMeaType == 3 || props.dimMeaType == 4"
content-position="left"
>维度</el-divider
>
<el-checkbox-group
v-if="props.dimMeaType == 1 || props.dimMeaType == 3 || props.dimMeaType == 4"
v-model="checkDimList"
>
<div v-for="(item, index) in props.dimAry">
<el-checkbox v-if="item.type == 1" :label="item.title" :value="item.field" />
<el-collapse v-if="item.type == 3" :expand-icon-position="leftPick">
<el-collapse-item :title="item.title" :name="index">
<el-checkbox
:label="timeTitle(item, 'ymdhms')"
:value="timeVal(item, 'ymdhms')"
/>
<el-checkbox
:label="timeTitle(item, 'year')"
:value="timeVal(item, 'year')"
/>
<el-checkbox
:label="timeTitle(item, 'month')"
:value="timeVal(item, 'month')"
/>
<el-checkbox
:label="timeTitle(item, 'day')"
:value="timeVal(item, 'day')"
/>
<el-checkbox
:label="timeTitle(item, 'hour')"
:value="timeVal(item, 'hour')"
/>
<el-checkbox
:label="timeTitle(item, 'minute')"
:value="timeVal(item, 'minute')"
/>
<el-checkbox
:label="timeTitle(item, 'second')"
:value="timeVal(item, 'second')"
/>
</el-collapse-item>
</el-collapse>
</div>
</el-checkbox-group>
<el-divider
v-if="props.dimMeaType == 3 || props.dimMeaType == 4"
content-position="left"
>度量</el-divider
>
<el-checkbox-group
v-if="props.dimMeaType == 2 || props.dimMeaType == 3 || props.dimMeaType == 4"
v-model="checkMeaList"
>
<div v-for="(item, index) in props.meaAry">
<el-checkbox v-if="item.type == 2" :label="item.title" :value="item.field" />
<el-collapse v-if="item.type == 3" :expand-icon-position="leftPick">
<el-collapse-item :title="item.title" :name="index">
<el-checkbox
:label="timeTitle(item, 'ymdhms')"
:value="timeVal(item, 'ymdhms')"
/>
<el-checkbox
:label="timeTitle(item, 'year')"
:value="timeVal(item, 'year')"
/>
<el-checkbox
:label="timeTitle(item, 'onth')"
:value="timeVal(item, 'onth')"
/>
<el-checkbox
:label="timeTitle(item, 'day')"
:value="timeVal(item, 'day')"
/>
<el-checkbox
:label="timeTitle(item, 'hour')"
:value="timeVal(item, 'hour')"
/>
<el-checkbox
:label="timeTitle(item, 'minute')"
:value="timeVal(item, 'minute')"
/>
<el-checkbox
:label="timeTitle(item, 'second')"
:value="timeVal(item, 'second')"
/>
</el-collapse-item>
</el-collapse>
</div>
</el-checkbox-group>
<el-button class="drawBut" type="primary" @click="pickDimMeaSet()">确定</el-button>
</div>
</el-drawer>
</template>
<style lang="scss" scoped>
.drawBodyBox {
padding: 0 10px;
}
.drawBut {
width: 100%;
margin-top: 20px;
}
</style>

106
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/dimension.vue

@ -0,0 +1,106 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-27 13:50:00
@ 备注: 维度弹窗
-->
<script lang="ts" setup>
import { dimSetInfo } from "@/api/chart/type";
import { useDesignEchartsStore } from "@/store/DesignForm/designForm";
const store = useDesignEchartsStore() as any; //
const props = defineProps({
isShow: {
type: Boolean,
default: false,
},
dimInfo: {
type: Object,
default() {
return "";
},
},
});
//
const controlData = computed(() => {
return store.controlAttr;
});
const emits = defineEmits(["update:isShow", "update:dimInfo"]);
const openClose = computed({
get: () => {
return props.isShow;
},
set: (newVal: any) => {
emits("update:isShow", newVal);
},
});
const dimConter = reactive<dimSetInfo>({
title: "",
type: "",
field: "",
options: [],
oldTitle: "",
timeType: "",
sort: 1,
});
/**
@ 作者: 秦东
@ 时间: 2025-06-27 14:39:42
@ 功能: 关闭
*/
const handleClose = () => {
emits("update:isShow", false);
};
onMounted(() => {
dimConter.title = props.dimInfo.title;
dimConter.type = props.dimInfo.type;
dimConter.field = props.dimInfo.field;
dimConter.options = props.dimInfo.options;
dimConter.oldTitle = props.dimInfo.oldTitle;
dimConter.timeType = props.dimInfo.timeType;
dimConter.sort = props.dimInfo.sort;
});
/**
@ 作者: 秦东
@ 时间: 2025-06-30 14:11:06
@ 功能: 确定选择
*/
const pickDimConst = () => {
props.dimInfo.oldTitle = dimConter.oldTitle;
props.dimInfo.sort = dimConter.sort;
emits("update:dimInfo", dimConter);
handleClose();
};
</script>
<template>
<el-dialog
v-model="openClose"
title="设置维度字段"
width="500"
:before-close="handleClose"
draggable
>
<el-form :model="dimConter" label-width="auto">
<el-form-item label="字段原名">
<el-input v-model="dimConter.title" autocomplete="off" disabled />
</el-form-item>
<el-form-item label="显示名称">
<el-input v-model="dimConter.oldTitle" autocomplete="off" />
</el-form-item>
<el-form-item label="排序">
<el-select v-model="dimConter.sort" placeholder="请选择排序方式">
<el-option label="不排序" :value="1" />
<el-option label="升序" :value="2" />
<el-option label="降序" :value="3" />
</el-select>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="pickDimConst"> 确定 </el-button>
</div>
</template>
</el-dialog>
</template>
<style lang="scss" scoped></style>

255
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/filterPage.vue

@ -0,0 +1,255 @@
<!--
@ 作者: 秦东
@ 时间: 2025-07-07 08:28:46
@ 备注: 过滤条件配置
-->
<script lang="ts" setup>
import { matchList, expList } from "@/api/chart/unitData";
import { filterInfo } from "@/api/chart/type";
const props = defineProps({
isShow: {
type: Boolean,
default: false,
},
dimInfo: {
type: Object,
default() {
return "";
},
},
});
const emits = defineEmits(["update:isShow", "update:dimInfo"]);
const openClose = computed({
get: () => {
return props.isShow;
},
set: (newVal: any) => {
emits("update:isShow", newVal);
},
});
/**
@ 作者: 秦东
@ 时间: 2025-06-27 14:39:42
@ 功能: 关闭
*/
const handleClose = () => {
emits("update:isShow", false);
};
const dimConter = reactive<filterInfo>({
lable: "",
type: 0,
field: "",
options: null,
oldTitle: "",
timeType: "",
sort: 1,
conditions: "",
method: 0,
modality: 0,
modalityList: [],
startTime: "",
endTime: "",
meadim: "",
});
const pickModality = (val: number | string) => {
console.log("改变选择---2->", val);
switch (val) {
case 2:
dimConter.modalityList = [
{
equation: "",
value: "",
},
{
equation: "",
value: "",
},
];
break;
case 3:
dimConter.modalityList = [
{
equation: "",
value: "",
},
{
equation: "",
value: "",
},
];
break;
default:
dimConter.modalityList = [
{
equation: "",
value: "",
},
];
}
};
onMounted(() => {
dimConter.lable = props.dimInfo.lable;
dimConter.type = props.dimInfo.type;
dimConter.field = props.dimInfo.field;
dimConter.options = props.dimInfo.options;
dimConter.oldTitle = props.dimInfo.oldTitle;
dimConter.timeType = props.dimInfo.timeType;
dimConter.sort = props.dimInfo.sort;
dimConter.conditions = props.dimInfo.conditions;
dimConter.method = props.dimInfo.method;
dimConter.modality = props.dimInfo.modality;
if (
Array.isArray(props.dimInfo.modalityList) &&
props.dimInfo.modalityList.length > 0
) {
console.log("初始化加载---2->", dimConter);
console.log("初始化加载---21->", props.dimInfo.modalityList);
dimConter.modalityList.splice(0, dimConter.modalityList.length);
dimConter.modalityList = props.dimInfo.modalityList;
} else {
console.log("初始化加载---3->", dimConter);
if (dimConter.modality == 1) {
dimConter.modalityList = [
{
equation: "",
value: "",
},
];
} else {
dimConter.modalityList = [
{
equation: "",
value: "",
},
{
equation: "",
value: "",
},
];
}
}
dimConter.startTime = props.dimInfo.startTime;
dimConter.endTime = props.dimInfo.endTime;
dimConter.meadim = props.dimInfo.meadim;
console.log("初始化加载", dimConter);
});
/**
@ 作者: 秦东
@ 时间: 2025-07-07 13:21:09
@ 功能: 提交过滤条件
*/
const pickFilterConst = () => {
console.log("提交过滤条件", dimConter);
props.dimInfo.conditions = dimConter.conditions;
props.dimInfo.method = dimConter.method;
props.dimInfo.modality = dimConter.modality;
props.dimInfo.modalityList = dimConter.modalityList;
props.dimInfo.startTime = dimConter.startTime;
props.dimInfo.endTime = dimConter.endTime;
props.dimInfo.meadim = dimConter.meadim;
emits("update:dimInfo", dimConter);
handleClose();
};
</script>
<template>
<el-dialog
v-model="openClose"
title="设置过滤器"
width="500"
:before-close="handleClose"
draggable
>
<el-form :model="dimConter" label-width="auto">
<el-form-item label="字段原名">
<el-text>{{ dimConter.lable }}</el-text>
</el-form-item>
<el-form-item label="字段类型">
<el-text v-if="dimConter.type == 1">文本</el-text>
<el-text v-if="dimConter.type == 2">数值</el-text>
<el-text v-if="dimConter.type == 3">时间</el-text>
</el-form-item>
<el-form-item v-if="dimConter.type == 1" label="过滤条件">
<el-input v-model="dimConter.conditions" />
</el-form-item>
<el-form-item v-if="dimConter.type == 2" label="聚合方式">
<el-select
v-model="dimConter.method"
clearable
placeholder="请选择聚合方式"
style="width: 240px"
>
<el-option
v-for="item in matchList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item v-if="dimConter.type == 2" label="条件形式">
<el-radio-group
v-model="dimConter.modality"
@change="pickModality(dimConter.modality)"
>
<el-radio :value="1">单条件</el-radio>
<el-radio :value="2">或条件</el-radio>
<el-radio :value="3">且条件</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="dimConter.type == 2" label="过滤条件">
<div v-for="item in dimConter.modalityList">
<el-space wrap>
<el-select
v-model="item.equation"
clearable
placeholder=""
style="min-width: 120px"
>
<el-option
v-for="items in expList"
:key="items.value"
:label="items.label"
:value="items.value"
/>
</el-select>
<el-input v-model="item.value" />
</el-space>
</div>
</el-form-item>
<el-form-item v-if="dimConter.type == 3" label="开始于">
<el-date-picker
v-model="dimConter.startTime"
type="datetime"
placeholder="请选择时间"
format="YYYY/MM/DD hh:mm:ss"
value-format="x"
/>
</el-form-item>
<el-form-item v-if="dimConter.type == 3" label="结束于">
<el-date-picker
v-model="dimConter.endTime"
type="datetime"
placeholder="请选择时间"
format="YYYY/MM/DD hh:mm:ss"
value-format="x"
/>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="pickFilterConst"> 确定 </el-button>
</div>
</template>
</el-dialog>
</template>
<style lang="scss" scoped></style>

131
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/measurement.vue

@ -0,0 +1,131 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-27 13:51:11
@ 备注: 度量弹窗
-->
<script lang="ts" setup>
import { maeSetInfo } from "@/api/chart/type";
import { useDesignEchartsStore } from "@/store/DesignForm/designForm";
const store = useDesignEchartsStore() as any; //
const props = defineProps({
isShow: {
type: Boolean,
default: false,
},
meaInfo: {
type: Array,
default() {
return [];
},
},
});
//
const controlData = computed(() => {
return store.controlAttr;
});
const emits = defineEmits(["update:isShow", "update:meaInfo"]);
const openClose = computed({
get: () => {
return props.isShow;
},
set: (newVal: any) => {
emits("update:isShow", newVal);
},
});
/**
@ 作者: 秦东
@ 时间: 2025-06-27 14:39:42
@ 功能: 关闭
*/
const handleClose = () => {
emits("update:isShow", false);
};
const meaConter = reactive<maeSetInfo>({
title: "",
type: "",
field: "",
options: [],
oldTitle: "",
timeType: "",
sort: 1,
method: 1,
format: 1,
});
onMounted(() => {
meaConter.title = props.meaInfo.title;
meaConter.type = props.meaInfo.type;
meaConter.field = props.meaInfo.field;
meaConter.options = props.meaInfo.options;
meaConter.oldTitle = props.meaInfo.oldTitle;
meaConter.timeType = props.meaInfo.timeType;
meaConter.sort = props.meaInfo.sort;
meaConter.method = props.meaInfo.method;
meaConter.format = props.meaInfo.format;
});
/**
@ 作者: 秦东
@ 时间: 2025-07-03 08:58:51
@ 功能: 提交度量字段设置
*/
const pickMeaConst = () => {
props.meaInfo.oldTitle = meaConter.oldTitle;
props.meaInfo.sort = meaConter.sort;
props.meaInfo.method = meaConter.method;
props.meaInfo.format = meaConter.format;
emits("update:meaInfo", meaConter);
handleClose();
};
</script>
<template>
<el-dialog
v-model="openClose"
title="设置度量字段"
width="500"
:before-close="handleClose"
draggable
>
<el-form :model="meaConter" label-width="auto">
<el-form-item label="字段原名">
<el-input v-model="meaConter.title" autocomplete="off" disabled />
</el-form-item>
<el-form-item label="显示名称">
<el-input v-model="meaConter.oldTitle" autocomplete="off" />
</el-form-item>
<el-form-item label="排序">
<el-select v-model="meaConter.sort" placeholder="请选择排序方式">
<el-option label="不排序" :value="1" />
<el-option label="升序" :value="2" />
<el-option label="降序" :value="3" />
</el-select>
</el-form-item>
<el-form-item label="聚合方式">
<el-select v-model="meaConter.method" placeholder="请选择聚合方式">
<el-option label="求和" :value="1" />
<el-option label="平均值" :value="2" />
<el-option label="计数" :value="3" />
<el-option label="去重计数" :value="4" />
<el-option label="最大值" :value="5" />
<el-option label="最小值" :value="6" />
</el-select>
</el-form-item>
<el-form-item label="数据展示格式">
<el-select v-model="meaConter.format" placeholder="请选择数据展示格式">
<el-option label="自动(原始值)" :value="1" />
<el-option label="整数" :value="2" />
<el-option label="保留1位小数" :value="3" />
<el-option label="保留2位小数" :value="4" />
<el-option label="百分比" :value="5" />
<el-option label="百分比1位小数" :value="6" />
<el-option label="百分比2位小数" :value="7" />
</el-select>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="pickMeaConst"> 确定 </el-button>
</div>
</template>
</el-dialog>
</template>
<style lang="scss" scoped></style>

99
src/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/winBox/searchPage.vue

@ -0,0 +1,99 @@
<!--
@ 作者: 秦东
@ 时间: 2025-07-07 14:37:36
@ 备注: 搜索条件
-->
<script lang="ts" setup>
import { dimSetInfo } from "@/api/chart/type";
import { useDesignEchartsStore } from "@/store/DesignForm/designForm";
const store = useDesignEchartsStore() as any; //
const props = defineProps({
isShow: {
type: Boolean,
default: false,
},
dimInfo: {
type: Object,
default() {
return "";
},
},
});
//
const controlData = computed(() => {
return store.controlAttr;
});
const emits = defineEmits(["update:isShow", "update:dimInfo"]);
const openClose = computed({
get: () => {
return props.isShow;
},
set: (newVal: any) => {
emits("update:isShow", newVal);
},
});
const dimConter = reactive<dimSetInfo>({
title: "",
type: "",
field: "",
options: [],
oldTitle: "",
timeType: "",
sort: 1,
});
/**
@ 作者: 秦东
@ 时间: 2025-06-27 14:39:42
@ 功能: 关闭
*/
const handleClose = () => {
emits("update:isShow", false);
};
onMounted(() => {
dimConter.lable = props.dimInfo.lable;
dimConter.type = props.dimInfo.type;
dimConter.field = props.dimInfo.field;
dimConter.options = props.dimInfo.options;
dimConter.oldTitle = props.dimInfo.oldTitle;
dimConter.timeType = props.dimInfo.timeType;
dimConter.sort = props.dimInfo.sort;
});
/**
@ 作者: 秦东
@ 时间: 2025-06-30 14:11:06
@ 功能: 确定选择
*/
const pickDimConst = () => {
props.dimInfo.lable = dimConter.lable;
props.dimInfo.sort = dimConter.sort;
emits("update:dimInfo", dimConter);
handleClose();
};
</script>
<template>
<el-dialog
v-model="openClose"
title="设置查询字段"
width="500"
:before-close="handleClose"
draggable
>{{ dimConter }}
<el-form :model="dimConter" label-width="auto">
<el-form-item label="字段原名">
<el-input v-model="dimConter.oldTitle" autocomplete="off" disabled />
</el-form-item>
<el-form-item label="显示名称">
<el-input v-model="dimConter.lable" autocomplete="off" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="pickDimConst"> 确定 </el-button>
</div>
</template>
</el-dialog>
</template>
<style lang="scss" scoped></style>

6
src/views/sysworkflow/lowcodepage/appPage/createAppFormPage.vue

@ -14,6 +14,7 @@ import PageFlow from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/pageFl
import PageList from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/pageList.vue";
import PrintSetupPage from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/printSetupPage.vue";
import AiPage from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/aiPage.vue";
import DataBpard from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/dataBoard.vue";
const props = defineProps({
appCont: {
@ -116,6 +117,7 @@ const state = reactive<formStruct>({
source: route.source || "",
formName: formConfigCont.formName,
},
echatsViews: [],
});
const appPageInfo = ref();
/**
@ -222,7 +224,7 @@ onBeforeMount(() => {
<el-tab-pane label="① 页面管理" :name="1"> </el-tab-pane>
<el-tab-pane label="② 流程设计" :name="2"> </el-tab-pane>
<el-tab-pane label="③ 列表设计" :name="3"> </el-tab-pane>
<!-- <el-tab-pane label="④ AI设置" :name="4"> </el-tab-pane> -->
<el-tab-pane label="④ 数据看板" :name="4"> </el-tab-pane>
<el-tab-pane label="⑤ 打印设计" :name="5"> </el-tab-pane>
</el-tabs>
</div>
@ -265,7 +267,7 @@ onBeforeMount(() => {
v-model:app-page-key="appPageKey"
v-model:form-version="formVersion"
/>
<AiPage
<DataBpard
v-if="tabsActive == 4"
v-model:state="state"
:form-Key="props.formKey"

2
src/views/sysworkflow/lowcodepage/runApp/regularPage/myCreate.vue

@ -8,7 +8,9 @@ import {
softDeletion,
retractRunWorkFlow,
recallSendMsg,
recalSendMsg,
} from "@/api/taskapi/management";
import { gainAppAllTaskList } from "@/api/DesignForm/requestapi";
//

196
vite.config.ts.timestamp-1750983981695-d6c3d4d4250da.mjs

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save