Compare commits

...

46 Commits

Author SHA1 Message Date
xiaojinfei f7c5f1740b Merge pull request 'fix:下拉框选择bug修复' (#104) from dev-xjf into master 3 weeks ago
肖晋飞 c1198097bc fix:下拉框选择bug修复 3 weeks ago
xiaojinfei 658dc80e53 Merge pull request 'dev-xjf' (#103) from dev-xjf into master 3 weeks ago
肖晋飞 e3a86e7250 fix:下拉框选择bug修复 3 weeks ago
肖晋飞 a59ddb6e8d fix:下拉框选择bug修复 3 weeks ago
xiaojinfei 3109a0eecc Merge pull request 'fix:暂时去除按钮权限' (#102) from dev-xjf into master 3 weeks ago
肖晋飞 16d7eb994a fix:暂时去除按钮权限 3 weeks ago
xiaojinfei 57fc3c9d1a Merge pull request 'dev-xjf' (#101) from dev-xjf into master 3 weeks ago
肖晋飞 7c44f39322 fix:增加图标白名单 3 weeks ago
肖晋飞 e3bad0eb69 fix:集中告警趋势展示错误修复 3 weeks ago
chenjiale c4f4188359 Merge pull request '```' (#100) from cjl-new into master 3 weeks ago
chenjiale 1f80a9b2fd Merge pull request '```' (#99) from cjl-new into master 3 weeks ago
xiaojinfei a0c76f7800 Merge pull request 'dev-xjf' (#98) from dev-xjf into master 3 weeks ago
chenjiale 1776ac265d Merge pull request '```' (#94) from cjl-new into master 3 weeks ago
肖晋飞 774f624f4d Merge branch 'master' into dev-xjf 3 weeks ago
chenjiale 0ea046f9d3 Merge pull request '```' (#93) from cjl-new into master 3 weeks ago
肖晋飞 a9a38bdae3 Merge branch 'master' into dev-xjf 3 weeks ago
肖晋飞 6e389dff96 fix:创建实例只筛选未实例化的模型 3 weeks ago
chenjiale 070e35a9c7 Merge pull request '```' (#92) from cjl-new into master 3 weeks ago
chenjiale a90397695b Merge pull request '```' (#91) from cjl-new into master 3 weeks ago
chenjiale b7d518f06b Merge pull request '```' (#90) from cjl-new into master 3 weeks ago
xiaojinfei 5fc7b86836 Merge pull request 'fix:机组系统子系统下拉框空则全部适配' (#88) from dev-xjf into master 3 weeks ago
肖晋飞 542f9a4777 fix:集中告警增加时间间隔下拉框 3 weeks ago
肖晋飞 c8a15d56ae fix:EXA历史增加时间下拉框 3 weeks ago
xiaojinfei 628a88949b Merge pull request 'fix:机组系统子系统下拉框空则全部适配' (#89) from dev-xjf into master 3 weeks ago
肖晋飞 1176fc3029 fix:机组系统子系统下拉框空则全部适配 3 weeks ago
xiaojinfei 18c591b868 Merge pull request 'fix:机组系统子系统下拉框空则全部适配' (#87) from dev-xjf into master 3 weeks ago
肖晋飞 44b8beccd0 fix:机组系统子系统下拉框空则全部适配 3 weeks ago
xiaojinfei 88bb562605 Merge pull request 'dev-xjf' (#86) from dev-xjf into master 3 weeks ago
肖晋飞 f236164a6d fix:机组系统子系统下拉框空则全部适配 3 weeks ago
肖晋飞 b0500ca8d8 fix:创建模型实例适配ANN 3 weeks ago
肖晋飞 0a7546fea3 Merge branch 'master' into dev-xjf 3 weeks ago
肖晋飞 619fdc7c06 fix:创建模型实例适配ANN 3 weeks ago
chenjiale 7301d89181 Merge pull request 'cjl-new' (#85) from cjl-new into master 3 weeks ago
肖晋飞 67097f9080 Merge branch 'dev-xjf' of http://120.26.116.243:3000/root/alert-front into dev-xjf 3 weeks ago
xjf 9457d23e93 fix:创建模型实例页面优化 3 weeks ago
xjf 51af3336d6 fix:创建模型实例弹窗bug修复 3 weeks ago
xjf be3fdc201a fix:创建模型实例弹窗bug修复 3 weeks ago
肖晋飞 7e2a566381 fix:创建实例的modal初始化问题解决 3 weeks ago
肖晋飞 4085803c04 fix:创建实例的modal初始化问题解决 3 weeks ago
肖晋飞 a7e8d6d6c3 fix:实例详情报错处理 3 weeks ago
xjf fa4f48abd8 fix:曲线美化调整 3 weeks ago
xjf 3d9f55d18b fix:集中告警增加详情功能 3 weeks ago
xjf d0b0a7ec16 Merge branch 'master' into dev-xjf 3 weeks ago
xjf 9fb490a1a2 feat:集中告警增加趋势功能 3 weeks ago
xjf 58f99dac30 fix:告警级别下拉选项 4 weeks ago
  1. 2
      src/api/alert/run/instant/index.ts
  2. 16
      src/api/alert/warn/index.ts
  3. 765
      src/assets/iconify/safelist.ts
  4. 41
      src/views/exa/HistoryLine.vue
  5. 10
      src/views/exa/config/HistoryModal.vue
  6. 14
      src/views/exa/exa.data.ts
  7. 9
      src/views/exa/history/index.vue
  8. 15
      src/views/run/calc/index.vue
  9. 131
      src/views/run/instant/CreateModal.vue
  10. 287
      src/views/run/instant/detail.vue
  11. 200
      src/views/run/instant/detail1.vue
  12. 12
      src/views/run/instant/index.vue
  13. 90
      src/views/run/instant/instant.data.ts
  14. 8
      src/views/run/instant/warnConfig/index.vue
  15. 20
      src/views/run/instant/warnConfig/warn.data.ts
  16. 68
      src/views/run/model/ModelTable.vue
  17. 21
      src/views/run/model/PointTable.vue
  18. 2
      src/views/run/model/model.data.ts
  19. 70
      src/views/warn/alarm/TrendModal.vue
  20. 81
      src/views/warn/alarm/alarm.data.ts
  21. 50
      src/views/warn/alarm/index.vue

2
src/api/alert/run/instant/index.ts

@ -3,7 +3,7 @@ import { defHttp } from '@/utils/http/axios'
export interface InstantPageReqVO extends PageParam {
mpName?: string
algorithmId?: number
}
export interface InstantVO {

16
src/api/alert/warn/index.ts

@ -35,3 +35,19 @@ export function updateWarn(data: WarnVO) {
export function getWarn(id: number) {
return defHttp.get({ url: `/alert/warn/get?id=${id}` })
}
// 查询预警等级列表-不分页
export function getAlarmLevelList() {
return defHttp.get({ url: '/alert/warn/alarmlevel/list'})
}
export interface WarnTrendReqVO {
id?:string,
exaHistoryReqVO?: EXAHistoryReqVO
}
// 查询预警趋势
export function getWarnTrend(data: WarnTrendReqVO) {
return defHttp.post({ url: '/alert/warn/alarm/trend', data })
}

765
src/assets/iconify/safelist.ts

@ -1,28 +1,792 @@
export const iconifySafelist: string[] = [
'ant-design:check-circle-outlined',
'ant-design:chrome-outlined',
'ant-design:check-circle-twotone',
'ant-design:check-outlined',
'ant-design:check-square-filled',
'ant-design:check-square-outlined',
'ant-design:check-square-twotone',
'ant-design:chrome-filled',
'ant-design:account-book-filled',
'ant-design:account-book-outlined',
'ant-design:account-book-twotone',
'ant-design:aim-outlined',
'ant-design:alert-filled',
'ant-design:alert-outlined',
'ant-design:alert-twotone',
'ant-design:alibaba-outlined',
'ant-design:align-center-outlined',
'ant-design:align-left-outlined',
'ant-design:align-right-outlined',
'ant-design:alipay-circle-filled',
'ant-design:alipay-circle-outlined',
'ant-design:alipay-outlined',
'ant-design:alipay-square-filled',
'ant-design:aliwangwang-filled',
'ant-design:aliwangwang-outlined',
'ant-design:aliyun-outlined',
'ant-design:amazon-circle-filled',
'ant-design:amazon-outlined',
'ant-design:amazon-square-filled',
'ant-design:android-filled',
'ant-design:android-outlined',
'ant-design:ant-cloud-outlined',
'ant-design:ant-design-outlined',
'ant-design:apartment-outlined',
'ant-design:api-filled',
'ant-design:api-outlined',
'ant-design:api-twotone',
'ant-design:apple-filled',
'ant-design:apple-outlined',
'ant-design:appstore-add-outlined',
'ant-design:appstore-filled',
'ant-design:appstore-outlined',
'ant-design:appstore-twotone',
'ant-design:area-chart-outlined',
'ant-design:arrow-down-outlined',
'ant-design:arrow-left-outlined',
'ant-design:arrow-right-outlined',
'ant-design:arrow-up-outlined',
'ant-design:arrows-alt-outlined',
'ant-design:audio-filled',
'ant-design:audio-muted-outlined',
'ant-design:audio-outlined',
'ant-design:audio-twotone',
'ant-design:audit-outlined',
'ant-design:backward-filled',
'ant-design:backward-outlined',
'ant-design:bank-filled',
'ant-design:bank-outlined',
'ant-design:bank-twotone',
'ant-design:bar-chart-outlined',
'ant-design:barcode-outlined',
'ant-design:bars-outlined',
'ant-design:behance-circle-filled',
'ant-design:behance-outlined',
'ant-design:behance-square-filled',
'ant-design:behance-square-outlined',
'ant-design:bell-filled',
'ant-design:bell-outlined',
'ant-design:bell-twotone',
'ant-design:bg-colors-outlined',
'ant-design:block-outlined',
'ant-design:bold-outlined',
'ant-design:book-filled',
'ant-design:book-outlined',
'ant-design:book-twotone',
'ant-design:border-bottom-outlined',
'ant-design:border-horizontal-outlined',
'ant-design:border-inner-outlined',
'ant-design:border-left-outlined',
'ant-design:border-outer-outlined',
'ant-design:border-outlined',
'ant-design:border-right-outlined',
'ant-design:border-top-outlined',
'ant-design:border-verticle-outlined',
'ant-design:borderless-table-outlined',
'ant-design:box-plot-filled',
'ant-design:box-plot-outlined',
'ant-design:box-plot-twotone',
'ant-design:branches-outlined',
'ant-design:bug-filled',
'ant-design:bug-outlined',
'ant-design:bug-twotone',
'ant-design:build-filled',
'ant-design:build-outlined',
'ant-design:build-twotone',
'ant-design:bulb-filled',
'ant-design:bulb-outlined',
'ant-design:bulb-twotone',
'ant-design:calculator-filled',
'ant-design:calculator-outlined',
'ant-design:calculator-twotone',
'ant-design:calendar-filled',
'ant-design:calendar-outlined',
'ant-design:calendar-twotone',
'ant-design:camera-filled',
'ant-design:camera-outlined',
'ant-design:camera-twotone',
'ant-design:car-filled',
'ant-design:car-outlined',
'ant-design:car-twotone',
'ant-design:caret-down-filled',
'ant-design:caret-down-outlined',
'ant-design:caret-left-filled',
'ant-design:caret-left-outlined',
'ant-design:caret-right-filled',
'ant-design:caret-right-outlined',
'ant-design:caret-up-filled',
'ant-design:caret-up-outlined',
'ant-design:carry-out-filled',
'ant-design:carry-out-outlined',
'ant-design:carry-out-twotone',
'ant-design:check-circle-filled',
'ant-design:ci-circle-filled',
'ant-design:ci-circle-outlined',
'ant-design:ci-circle-twotone',
'ant-design:ci-outlined',
'ant-design:ci-twotone',
'ant-design:clear-outlined',
'ant-design:clock-circle-filled',
'ant-design:clock-circle-outlined',
'ant-design:clock-circle-twotone',
'ant-design:close-circle-filled',
'ant-design:close-circle-outlined',
'ant-design:close-circle-twotone',
'ant-design:close-outlined',
'ant-design:close-square-filled',
'ant-design:close-square-outlined',
'ant-design:close-square-twotone',
'ant-design:cloud-download-outlined',
'ant-design:cloud-filled',
'ant-design:cloud-outlined',
'ant-design:cloud-server-outlined',
'ant-design:cloud-sync-outlined',
'ant-design:cloud-twotone',
'ant-design:cloud-upload-outlined',
'ant-design:cluster-outlined',
'ant-design:code-filled',
'ant-design:code-outlined',
'ant-design:code-sandbox-circle-filled',
'ant-design:code-sandbox-outlined',
'ant-design:code-sandbox-square-filled',
'ant-design:code-twotone',
'ant-design:codepen-circle-filled',
'ant-design:codepen-circle-outlined',
'ant-design:codepen-outlined',
'ant-design:codepen-square-filled',
'ant-design:coffee-outlined',
'ant-design:column-height-outlined',
'ant-design:column-width-outlined',
'ant-design:comment-outlined',
'ant-design:compass-filled',
'ant-design:compass-outlined',
'ant-design:compass-twotone',
'ant-design:compress-outlined',
'ant-design:console-sql-outlined',
'ant-design:contacts-filled',
'ant-design:contacts-outlined',
'ant-design:contacts-twotone',
'ant-design:container-filled',
'ant-design:container-outlined',
'ant-design:container-twotone',
'ant-design:control-filled',
'ant-design:control-outlined',
'ant-design:control-twotone',
'ant-design:copy-filled',
'ant-design:copy-outlined',
'ant-design:copy-twotone',
'ant-design:copyright-circle-filled',
'ant-design:copyright-circle-outlined',
'ant-design:copyright-circle-twotone',
'ant-design:copyright-outlined',
'ant-design:copyright-twotone',
'ant-design:credit-card-filled',
'ant-design:credit-card-outlined',
'ant-design:credit-card-twotone',
'ant-design:crown-filled',
'ant-design:crown-outlined',
'ant-design:crown-twotone',
'ant-design:customer-service-filled',
'ant-design:customer-service-outlined',
'ant-design:customer-service-twotone',
'ant-design:dash-outlined',
'ant-design:dashboard-filled',
'ant-design:dashboard-outlined',
'ant-design:dashboard-twotone',
'ant-design:database-filled',
'ant-design:database-outlined',
'ant-design:database-twotone',
'ant-design:delete-column-outlined',
'ant-design:delete-filled',
'ant-design:delete-outlined',
'ant-design:delete-row-outlined',
'ant-design:delete-twotone',
'ant-design:delivered-procedure-outlined',
'ant-design:deployment-unit-outlined',
'ant-design:desktop-outlined',
'ant-design:diff-filled',
'ant-design:diff-outlined',
'ant-design:diff-twotone',
'ant-design:dingding-outlined',
'ant-design:dingtalk-circle-filled',
'ant-design:dingtalk-outlined',
'ant-design:dingtalk-square-filled',
'ant-design:disconnect-outlined',
'ant-design:dislike-filled',
'ant-design:dislike-outlined',
'ant-design:dislike-twotone',
'ant-design:dollar-circle-filled',
'ant-design:dollar-circle-outlined',
'ant-design:dollar-circle-twotone',
'ant-design:dollar-outlined',
'ant-design:dollar-twotone',
'ant-design:dot-chart-outlined',
'ant-design:double-left-outlined',
'ant-design:double-right-outlined',
'ant-design:down-circle-filled',
'ant-design:down-circle-outlined',
'ant-design:down-circle-twotone',
'ant-design:down-outlined',
'ant-design:down-square-filled',
'ant-design:down-square-outlined',
'ant-design:down-square-twotone',
'ant-design:download-outlined',
'ant-design:drag-outlined',
'ant-design:dribbble-circle-filled',
'ant-design:dribbble-outlined',
'ant-design:dribbble-square-filled',
'ant-design:dribbble-square-outlined',
'ant-design:dropbox-circle-filled',
'ant-design:dropbox-outlined',
'ant-design:dropbox-square-filled',
'ant-design:edit-filled',
'ant-design:edit-outlined',
'ant-design:edit-twotone',
'ant-design:ellipsis-outlined',
'ant-design:enter-outlined',
'ant-design:environment-filled',
'ant-design:environment-outlined',
'ant-design:environment-twotone',
'ant-design:euro-circle-filled',
'ant-design:euro-circle-outlined',
'ant-design:euro-circle-twotone',
'ant-design:euro-outlined',
'ant-design:euro-twotone',
'ant-design:exception-outlined',
'ant-design:exclamation-circle-filled',
'ant-design:exclamation-circle-outlined',
'ant-design:exclamation-circle-twotone',
'ant-design:exclamation-outlined',
'ant-design:expand-alt-outlined',
'ant-design:expand-outlined',
'ant-design:experiment-filled',
'ant-design:experiment-outlined',
'ant-design:experiment-twotone',
'ant-design:export-outlined',
'ant-design:eye-filled',
'ant-design:eye-invisible-filled',
'ant-design:eye-invisible-outlined',
'ant-design:eye-invisible-twotone',
'ant-design:eye-outlined',
'ant-design:eye-twotone',
'ant-design:facebook-filled',
'ant-design:facebook-outlined',
'ant-design:fall-outlined',
'ant-design:fast-backward-filled',
'ant-design:fast-backward-outlined',
'ant-design:fast-forward-filled',
'ant-design:fast-forward-outlined',
'ant-design:field-binary-outlined',
'ant-design:field-number-outlined',
'ant-design:field-string-outlined',
'ant-design:field-time-outlined',
'ant-design:file-add-filled',
'ant-design:file-add-outlined',
'ant-design:file-add-twotone',
'ant-design:file-done-outlined',
'ant-design:file-excel-filled',
'ant-design:file-excel-outlined',
'ant-design:file-excel-twotone',
'ant-design:file-exclamation-filled',
'ant-design:file-exclamation-outlined',
'ant-design:file-exclamation-twotone',
'ant-design:file-filled',
'ant-design:file-gif-outlined',
'ant-design:file-image-filled',
'ant-design:file-image-outlined',
'ant-design:file-image-twotone',
'ant-design:file-jpg-outlined',
'ant-design:file-markdown-filled',
'ant-design:file-markdown-outlined',
'ant-design:file-markdown-twotone',
'ant-design:file-outlined',
'ant-design:file-pdf-filled',
'ant-design:file-pdf-outlined',
'ant-design:file-pdf-twotone',
'ant-design:file-ppt-filled',
'ant-design:file-ppt-outlined',
'ant-design:file-ppt-twotone',
'ant-design:file-protect-outlined',
'ant-design:file-search-outlined',
'ant-design:file-sync-outlined',
'ant-design:file-text-filled',
'ant-design:file-text-outlined',
'ant-design:file-text-twotone',
'ant-design:file-twotone',
'ant-design:file-unknown-filled',
'ant-design:file-unknown-outlined',
'ant-design:file-unknown-twotone',
'ant-design:file-word-filled',
'ant-design:file-word-outlined',
'ant-design:file-word-twotone',
'ant-design:file-zip-filled',
'ant-design:file-zip-outlined',
'ant-design:file-zip-twotone',
'ant-design:filter-filled',
'ant-design:filter-outlined',
'ant-design:filter-twotone',
'ant-design:fire-filled',
'ant-design:fire-outlined',
'ant-design:fire-twotone',
'ant-design:flag-filled',
'ant-design:flag-outlined',
'ant-design:flag-twotone',
'ant-design:folder-add-filled',
'ant-design:folder-add-outlined',
'ant-design:folder-add-twotone',
'ant-design:folder-filled',
'ant-design:folder-open-filled',
'ant-design:folder-open-outlined',
'ant-design:folder-open-twotone',
'ant-design:folder-outlined',
'ant-design:folder-twotone',
'ant-design:folder-view-outlined',
'ant-design:font-colors-outlined',
'ant-design:font-size-outlined',
'ant-design:fork-outlined',
'ant-design:form-outlined',
'ant-design:format-painter-filled',
'ant-design:format-painter-outlined',
'ant-design:forward-filled',
'ant-design:forward-outlined',
'ant-design:frown-filled',
'ant-design:frown-outlined',
'ant-design:frown-twotone',
'ant-design:fullscreen-exit-outlined',
'ant-design:fullscreen-outlined',
'ant-design:function-outlined',
'ant-design:fund-filled',
'ant-design:fund-outlined',
'ant-design:fund-projection-screen-outlined',
'ant-design:fund-twotone',
'ant-design:fund-view-outlined',
'ant-design:funnel-plot-filled',
'ant-design:funnel-plot-outlined',
'ant-design:funnel-plot-twotone',
'ant-design:gateway-outlined',
'ant-design:gif-outlined',
'ant-design:gift-filled',
'ant-design:gift-outlined',
'ant-design:gift-twotone',
'ant-design:github-filled',
'ant-design:github-outlined',
'ant-design:gitlab-filled',
'ant-design:gitlab-outlined',
'ant-design:global-outlined',
'ant-design:gold-filled',
'ant-design:gold-outlined',
'ant-design:gold-twotone',
'ant-design:golden-filled',
'ant-design:google-circle-filled',
'ant-design:google-outlined',
'ant-design:google-plus-circle-filled',
'ant-design:google-plus-outlined',
'ant-design:google-plus-square-filled',
'ant-design:google-square-filled',
'ant-design:group-outlined',
'ant-design:hdd-filled',
'ant-design:hdd-outlined',
'ant-design:hdd-twotone',
'ant-design:heart-filled',
'ant-design:heart-outlined',
'ant-design:heart-twotone',
'ant-design:heat-map-outlined',
'ant-design:highlight-filled',
'ant-design:highlight-outlined',
'ant-design:highlight-twotone',
'ant-design:history-outlined',
'ant-design:home-filled',
'ant-design:home-outlined',
'ant-design:home-twotone',
'ant-design:hourglass-filled',
'ant-design:hourglass-outlined',
'ant-design:hourglass-twotone',
'ant-design:html5-filled',
'ant-design:html5-outlined',
'ant-design:html5-twotone',
'ant-design:idcard-filled',
'ant-design:idcard-outlined',
'ant-design:idcard-twotone',
'ant-design:ie-circle-filled',
'ant-design:ie-outlined',
'ant-design:ie-square-filled',
'ant-design:import-outlined',
'ant-design:inbox-outlined',
'ant-design:info-circle-filled',
'ant-design:info-circle-outlined',
'ant-design:info-circle-twotone',
'ant-design:info-outlined',
'ant-design:insert-row-above-outlined',
'ant-design:insert-row-below-outlined',
'ant-design:insert-row-left-outlined',
'ant-design:insert-row-right-outlined',
'ant-design:instagram-filled',
'ant-design:instagram-outlined',
'ant-design:insurance-filled',
'ant-design:insurance-outlined',
'ant-design:insurance-twotone',
'ant-design:interaction-filled',
'ant-design:interaction-outlined',
'ant-design:interaction-twotone',
'ant-design:issues-close-outlined',
'ant-design:italic-outlined',
'ant-design:key-outlined',
'ant-design:laptop-outlined',
'ant-design:layout-filled',
'ant-design:layout-outlined',
'ant-design:layout-twotone',
'ant-design:left-circle-filled',
'ant-design:left-circle-outlined',
'ant-design:left-circle-twotone',
'ant-design:left-outlined',
'ant-design:left-square-filled',
'ant-design:left-square-outlined',
'ant-design:left-square-twotone',
'ant-design:like-filled',
'ant-design:like-outlined',
'ant-design:like-twotone',
'ant-design:line-chart-outlined',
'ant-design:line-height-outlined',
'ant-design:line-outlined',
'ant-design:link-outlined',
'ant-design:linkedin-filled',
'ant-design:linkedin-outlined',
'ant-design:loading-3-quarters-outlined',
'ant-design:loading-outlined',
'ant-design:lock-filled',
'ant-design:lock-outlined',
'ant-design:lock-twotone',
'ant-design:login-outlined',
'ant-design:logout-outlined',
'ant-design:mac-command-filled',
'ant-design:mac-command-outlined',
'ant-design:mail-filled',
'ant-design:mail-outlined',
'ant-design:mail-twotone',
'ant-design:man-outlined',
'ant-design:medicine-box-filled',
'ant-design:medicine-box-outlined',
'ant-design:medicine-box-twotone',
'ant-design:medium-circle-filled',
'ant-design:medium-outlined',
'ant-design:medium-square-filled',
'ant-design:medium-workmark-outlined',
'ant-design:meh-filled',
'ant-design:meh-outlined',
'ant-design:meh-twotone',
'ant-design:menu-fold-outlined',
'ant-design:menu-outlined',
'ant-design:menu-unfold-outlined',
'ant-design:merge-cells-outlined',
'ant-design:message-filled',
'ant-design:message-outlined',
'ant-design:message-twotone',
'ant-design:minus-circle-filled',
'ant-design:minus-circle-outlined',
'ant-design:minus-circle-twotone',
'ant-design:minus-outlined',
'ant-design:minus-square-filled',
'ant-design:minus-square-outlined',
'ant-design:minus-square-twotone',
'ant-design:mobile-filled',
'ant-design:mobile-outlined',
'ant-design:mobile-twotone',
'ant-design:money-collect-filled',
'ant-design:money-collect-outlined',
'ant-design:money-collect-twotone',
'ant-design:monitor-outlined',
'ant-design:more-outlined',
'ant-design:node-collapse-outlined',
'ant-design:node-expand-outlined',
'ant-design:node-index-outlined',
'ant-design:notification-filled',
'ant-design:notification-outlined',
'ant-design:notification-twotone',
'ant-design:number-outlined',
'ant-design:one-to-one-outlined',
'ant-design:ordered-list-outlined',
'ant-design:paper-clip-outlined',
'ant-design:partition-outlined',
'ant-design:pause-circle-filled',
'ant-design:pause-circle-outlined',
'ant-design:pause-circle-twotone',
'ant-design:pause-outlined',
'ant-design:pay-circle-filled',
'ant-design:pay-circle-outlined',
'ant-design:percentage-outlined',
'ant-design:phone-filled',
'ant-design:phone-outlined',
'ant-design:phone-twotone',
'ant-design:pic-center-outlined',
'ant-design:pic-left-outlined',
'ant-design:pic-right-outlined',
'ant-design:picture-filled',
'ant-design:picture-outlined',
'ant-design:picture-twotone',
'ant-design:pie-chart-filled',
'ant-design:pie-chart-outlined',
'ant-design:pie-chart-twotone',
'ant-design:play-circle-filled',
'ant-design:play-circle-outlined',
'ant-design:play-circle-twotone',
'ant-design:play-square-filled',
'ant-design:play-square-outlined',
'ant-design:play-square-twotone',
'ant-design:plus-circle-filled',
'ant-design:plus-circle-outlined',
'ant-design:plus-circle-twotone',
'ant-design:plus-outlined',
'ant-design:plus-square-filled',
'ant-design:plus-square-outlined',
'ant-design:plus-square-twotone',
'ant-design:pound-circle-filled',
'ant-design:pound-circle-outlined',
'ant-design:pound-circle-twotone',
'ant-design:pound-outlined',
'ant-design:poweroff-outlined',
'ant-design:printer-filled',
'ant-design:printer-outlined',
'ant-design:printer-twotone',
'ant-design:profile-filled',
'ant-design:profile-outlined',
'ant-design:profile-twotone',
'ant-design:project-filled',
'ant-design:project-outlined',
'ant-design:project-twotone',
'ant-design:property-safety-filled',
'ant-design:property-safety-outlined',
'ant-design:property-safety-twotone',
'ant-design:pull-request-outlined',
'ant-design:pushpin-filled',
'ant-design:pushpin-outlined',
'ant-design:pushpin-twotone',
'ant-design:qq-circle-filled',
'ant-design:qq-outlined',
'ant-design:qq-square-filled',
'ant-design:qrcode-outlined',
'ant-design:question-circle-filled',
'ant-design:question-circle-outlined',
'ant-design:question-circle-twotone',
'ant-design:question-outlined',
'ant-design:radar-chart-outlined',
'ant-design:radius-bottomleft-outlined',
'ant-design:radius-bottomright-outlined',
'ant-design:radius-setting-outlined',
'ant-design:radius-upleft-outlined',
'ant-design:radius-upright-outlined',
'ant-design:read-filled',
'ant-design:read-outlined',
'ant-design:reconciliation-filled',
'ant-design:reconciliation-outlined',
'ant-design:reconciliation-twotone',
'ant-design:red-envelope-filled',
'ant-design:red-envelope-outlined',
'ant-design:red-envelope-twotone',
'ant-design:reddit-circle-filled',
'ant-design:reddit-outlined',
'ant-design:reddit-square-filled',
'ant-design:redo-outlined',
'ant-design:reload-outlined',
'ant-design:rest-filled',
'ant-design:rest-outlined',
'ant-design:rest-twotone',
'ant-design:retweet-outlined',
'ant-design:right-circle-filled',
'ant-design:right-circle-outlined',
'ant-design:right-circle-twotone',
'ant-design:right-outlined',
'ant-design:right-square-filled',
'ant-design:right-square-outlined',
'ant-design:right-square-twotone',
'ant-design:rise-outlined',
'ant-design:robot-filled',
'ant-design:robot-outlined',
'ant-design:rocket-filled',
'ant-design:rocket-outlined',
'ant-design:rocket-twotone',
'ant-design:rollback-outlined',
'ant-design:rotate-left-outlined',
'ant-design:rotate-right-outlined',
'ant-design:safety-certificate-filled',
'ant-design:safety-certificate-outlined',
'ant-design:safety-certificate-twotone',
'ant-design:safety-outlined',
'ant-design:save-filled',
'ant-design:save-outlined',
'ant-design:save-twotone',
'ant-design:scan-outlined',
'ant-design:schedule-filled',
'ant-design:schedule-outlined',
'ant-design:schedule-twotone',
'ant-design:scissor-outlined',
'ant-design:search-outlined',
'ant-design:security-scan-filled',
'ant-design:security-scan-outlined',
'ant-design:security-scan-twotone',
'ant-design:select-outlined',
'ant-design:send-outlined',
'ant-design:setting-filled',
'ant-design:setting-outlined',
'ant-design:setting-twotone',
'ant-design:shake-outlined',
'ant-design:share-alt-outlined',
'ant-design:shop-filled',
'ant-design:shop-outlined',
'ant-design:shop-twotone',
'ant-design:shopping-cart-outlined',
'ant-design:shopping-filled',
'ant-design:shopping-outlined',
'ant-design:shopping-twotone',
'ant-design:shrink-outlined',
'ant-design:signal-filled',
'ant-design:sisternode-outlined',
'ant-design:sketch-circle-filled',
'ant-design:sketch-outlined',
'ant-design:sketch-square-filled',
'ant-design:skin-filled',
'ant-design:skin-outlined',
'ant-design:skin-twotone',
'ant-design:skype-filled',
'ant-design:skype-outlined',
'ant-design:slack-circle-filled',
'ant-design:slack-outlined',
'ant-design:slack-square-filled',
'ant-design:slack-square-outlined',
'ant-design:sliders-filled',
'ant-design:sliders-outlined',
'ant-design:sliders-twotone',
'ant-design:small-dash-outlined',
'ant-design:smile-filled',
'ant-design:smile-outlined',
'ant-design:smile-twotone',
'ant-design:snippets-filled',
'ant-design:snippets-outlined',
'ant-design:snippets-twotone',
'ant-design:solution-outlined',
'ant-design:sort-ascending-outlined',
'ant-design:sort-descending-outlined',
'ant-design:sound-filled',
'ant-design:sound-outlined',
'ant-design:sound-twotone',
'ant-design:split-cells-outlined',
'ant-design:star-filled',
'ant-design:star-outlined',
'ant-design:star-twotone',
'ant-design:step-backward-filled',
'ant-design:step-backward-outlined',
'ant-design:step-forward-filled',
'ant-design:step-forward-outlined',
'ant-design:stock-outlined',
'ant-design:stop-filled',
'ant-design:stop-outlined',
'ant-design:stop-twotone',
'ant-design:strikethrough-outlined',
'ant-design:subnode-outlined',
'ant-design:swap-left-outlined',
'ant-design:swap-outlined',
'ant-design:swap-right-outlined',
'ant-design:switcher-filled',
'ant-design:switcher-outlined',
'ant-design:switcher-twotone',
'ant-design:sync-outlined',
'ant-design:table-outlined',
'ant-design:tablet-filled',
'ant-design:tablet-outlined',
'ant-design:tablet-twotone',
'ant-design:tag-filled',
'ant-design:tag-outlined',
'ant-design:tag-twotone',
'ant-design:tags-filled',
'ant-design:tags-outlined',
'ant-design:tags-twotone',
'ant-design:taobao-circle-filled',
'ant-design:taobao-circle-outlined',
'ant-design:taobao-outlined',
'ant-design:taobao-square-filled',
'ant-design:team-outlined',
'ant-design:thunderbolt-filled',
'ant-design:thunderbolt-outlined',
'ant-design:thunderbolt-twotone',
'ant-design:to-top-outlined',
'ant-design:tool-filled',
'ant-design:tool-outlined',
'ant-design:tool-twotone',
'ant-design:trademark-circle-filled',
'ant-design:trademark-circle-outlined',
'ant-design:trademark-circle-twotone',
'ant-design:trademark-outlined',
'ant-design:transaction-outlined',
'ant-design:translation-outlined',
'ant-design:trophy-filled',
'ant-design:trophy-outlined',
'ant-design:trophy-twotone',
'ant-design:twitter-circle-filled',
'ant-design:twitter-outlined',
'ant-design:twitter-square-filled',
'ant-design:underline-outlined',
'ant-design:undo-outlined',
'ant-design:ungroup-outlined',
'ant-design:unlock-filled',
'ant-design:unlock-outlined',
'ant-design:unlock-twotone',
'ant-design:unordered-list-outlined',
'ant-design:up-circle-filled',
'ant-design:up-circle-outlined',
'ant-design:up-circle-twotone',
'ant-design:up-outlined',
'ant-design:up-square-filled',
'ant-design:up-square-outlined',
'ant-design:up-square-twotone',
'ant-design:upload-outlined',
'ant-design:usb-filled',
'ant-design:usb-outlined',
'ant-design:usb-twotone',
'ant-design:user-add-outlined',
'ant-design:user-delete-outlined',
'ant-design:user-outlined',
'ant-design:user-switch-outlined',
'ant-design:usergroup-add-outlined',
'ant-design:usergroup-delete-outlined',
'ant-design:verified-outlined',
'ant-design:vertical-align-bottom-outlined',
'ant-design:vertical-align-middle-outlined',
'ant-design:vertical-align-top-outlined',
'ant-design:vertical-left-outlined',
'ant-design:vertical-right-outlined',
'ant-design:video-camera-add-outlined',
'ant-design:video-camera-filled',
'ant-design:video-camera-outlined',
'ant-design:video-camera-twotone',
'ant-design:wallet-filled',
'ant-design:wallet-outlined',
'ant-design:wallet-twotone',
'ant-design:warning-filled',
'ant-design:warning-outlined',
'ant-design:warning-twotone',
'ant-design:wechat-filled',
'ant-design:wechat-outlined',
'ant-design:weibo-circle-filled',
'ant-design:weibo-circle-outlined',
'ant-design:weibo-outlined',
'ant-design:weibo-square-filled',
'ant-design:weibo-square-outlined',
'ant-design:whats-app-outlined',
'ant-design:wifi-outlined',
'ant-design:windows-filled',
'ant-design:windows-outlined',
'ant-design:woman-outlined',
'ant-design:yahoo-filled',
'ant-design:yahoo-outlined',
'ant-design:youtube-filled',
'ant-design:youtube-outlined',
'ant-design:yuque-filled',
'ant-design:yuque-outlined',
'ant-design:zhihu-circle-filled',
'ant-design:zhihu-outlined',
'ant-design:zhihu-square-filled',
'ant-design:zoom-in-outlined',
'ant-design:zoom-out-outlined',
'ep:avatar',
'ep:chat-dot-round',
'ep:collection',
@ -35,6 +799,7 @@ export const iconifySafelist: string[] = [
'ep:takeaway-box',
'ep:tools',
'ep:user',
'ep:monitor',
'fa:address-card',
'fa:edit',
'fa:stack-exchange',

41
src/views/exa/HistoryLine.vue

@ -14,21 +14,24 @@ const props = defineProps({
},
height: {
type: String,
default: propTypes.string.def('500px'),
default: '500px',
},
width: {
type: String,
default: '100%',
},
title: {
type: String,
default: '',
},
name: {
type: Array<string>,
default: [],
type: Array as PropType<string[]>,
default: () => [],
},
data: {
type: Array<Array<number>>,
default: () => [[]],
type: Array as PropType<number[][]>,
default: () => [],
},
width: propTypes.string.def('100%'),
// height: propTypes.string.def('70vh'),
})
const chartRef = ref<HTMLDivElement | null>(null)
@ -51,7 +54,7 @@ watch(
const series = ref<any[]>([])
const title = ref<any>({})
for (let i = 0; i < props.data.length; i++) {
for (let i = 0; i < props.data?.length; i++) {
title.value = {
left: 'left',
text: props.title,
@ -70,11 +73,11 @@ watch(
scale: true, //
})
series.value.push({
name: props.name[i],
name: props.name?.[i] || '',
type: 'line',
smooth: true,
showSymbol: false,
data: props.data[i],
data: props.data?.[i] || [],
yAxisIndex: i,
})
}
@ -100,8 +103,12 @@ watch(
position(pt) {
return [pt[0], '10%']
},
confine: true, // tooltip
backgroundColor: 'rgba(255, 255, 255, 0.5)', // 0~1
},
title: title.value,
toolbox: {
feature: {
dataZoom: {
@ -130,15 +137,14 @@ watch(
function convertToCSV(data) {
let csv = ''
//
const name = props.name.join(',')
const name = props.name?.join(',') || ''
csv += `时间,${name}\n`
// CSV
for (let i = 0; i < props.data[0].length; i++) {
for (let i = 0; i < props.data?.[0]?.length || 0; i++) {
let data = ''
for (let j = 0; j < props.data.length; j++)
data += `,${props.data[j][i][1]}`
csv += `${moment(props.data[0][i][0]).format('YYYY-MM-DD HH:mm:ss')}${data}\n`
for (let j = 0; j < props.data?.length || 0; j++)
data += `,${props.data?.[j]?.[i]?.[1] || ''}`
csv += `${moment(props.data?.[0]?.[i]?.[0] || 0).format('YYYY-MM-DD HH:mm:ss')}${data}\n`
// props.data[i].map((item, index) => {
// csv += 'x' + ',' + 'y' + '\n'
// })
@ -156,7 +162,6 @@ watch(
length: 6,
lineStyle: {
type: 'dashed',
// ...
},
},
// boundaryGap: false,
@ -170,6 +175,10 @@ watch(
type: 'slider',
start: 0,
end: 100,
//
showDataShadow: true,
//
height: 30,
},
//
//

10
src/views/exa/config/HistoryModal.vue

@ -10,6 +10,7 @@ import { BasicModal, useModalInner } from '@/components/Modal'
import { BasicForm, useForm } from '@/components/Form'
import { getExaHistorys } from '@/api/alert/exa'
import {EXAHistoryReqVO} from "@/api/alert/warn";
const props = defineProps({
itemName: {
@ -65,14 +66,9 @@ const [registerHistoryModal, { setModalProps }] = useModalInner(async (data) =>
})
async function handleSubmitR() {
const serachFormData = getFieldsValue()
const exaHistoryReqVO = getFieldsValue() as EXAHistoryReqVO
loading.value = true
const exaHistoryReqVO = {
startTime: serachFormData.startTime,
endTime: serachFormData.endTime,
itemName: props.itemName,
interval: 100,
}
exaHistoryReqVO.itemName = props.itemName
historyData.value = await getExaHistorys(exaHistoryReqVO)
loading.value = false

14
src/views/exa/exa.data.ts

@ -127,4 +127,18 @@ export const formHistory: FormSchema[] = [
},
},
},
{
label: '时间间隔',
field: 'interval',
component: 'Select',
defaultValue: 60,
labelWidth:100,
componentProps: {
options: [{ value: 60, label: '60秒' }, { value: 100, label: '100秒' }, { value: 300, label: '300秒' }],
},
required: true,
colProps: {
span: 5,
},
},
]

9
src/views/exa/history/index.vue

@ -7,6 +7,9 @@ import HistoryLine from '../HistoryLine.vue'
import PointModal from './PointModal.vue'
import { getExaHistorys } from '@/api/alert/exa'
import { useModal } from '@/components/Modal'
import {useForm} from "@/components/Form";
import {calcFormSchemas} from "@/views/run/calc/calc.data";
interface FormState {
publishTime: any[]
@ -35,6 +38,7 @@ const state = reactive<RowKeys>({
selectedRowKeys: [],
})
onMounted(() => {
searchForm.publishTime = [moment().subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss'), moment().format('YYYY-MM-DD HH:mm:ss')]
getHistoryChart()
})
@ -44,7 +48,6 @@ const legendName = ref<any[]>([])
async function getHistoryChart() {
state.selectedRowKeys = localStorage.getItem('pointInfo') ? JSON.parse(localStorage.getItem('pointInfo') || '') : []
selectedData.value = localStorage.getItem('pointInfoList') ? JSON.parse(localStorage.getItem('pointInfoList') || '') : []
searchForm.publishTime = [moment().subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss'), moment().format('YYYY-MM-DD HH:mm:ss')]
const pointCodeList = selectedData.value.map(item => (item.itemName))
loading.value = true
@ -53,7 +56,7 @@ async function getHistoryChart() {
message.info('暂无测点')
const pointCode = selectedData.value.map(item => (item.itemName)).join(',')
const pointDesc: any[] = selectedData.value.map(item => (item.descriptor))
const pointDesc: any[] = selectedData.value.map(item => (item.descriptor+'('+item.itemName+')'))
const exaHistoryReqVO = {
startTime: searchForm.publishTime[0],
@ -62,7 +65,7 @@ async function getHistoryChart() {
interval: 100,
}
historyData.value = await getExaHistorys(exaHistoryReqVO)
legendName.value = pointDesc
legendName.value = pointDesc;
loading.value = false
}

15
src/views/run/calc/index.vue

@ -3,7 +3,8 @@ import {Space, Tag,Badge, Button, Divider, Switch} from 'ant-design-vue'
import {onMounted, ref, reactive} from 'vue'
import moment from 'moment'
import HistoryModal from '../../exa/config/HistoryModal.vue'
import {calcFormSchemas, columns, searchFormSchema} from './calc.data'
import {calcFormSchemas, columns} from './calc.data'
import {searchFormSchema} from '../instant/instant.data'
import {BasicTable, TableAction, useTable} from '@/components/Table'
import {BasicForm, useForm} from '@/components/Form'
@ -44,9 +45,8 @@ const [registerTable, {getForm, reload, getDataSource, updateTableDataRecord}] =
style: {
textAlign: 'left',
marginLeft: '10px',
},
},
}
}
},
useSearchForm: true,
showTableSetting: true,
@ -146,28 +146,23 @@ async function handlebeforeCalc(record?: Recordable) {
//
async function handleCalc(formData: any) {
calcLoading.value = true
console.log('点击回算按钮数据::::', formData)
//
for (const record of formData.records) {
updateTableDataRecord(record.mpId, {calcStatus:1})
rowCalcLoading[record.mpId] = true
console.log('行内回算loading状态:', record.mpId, rowCalcLoading[record.mpId])
try {
// -
formData.mpId = record.mpId
// -
console.log(formData)
const res = await calcInstant(formData)
console.log('回算结果:', res)
console.log(record)
res.calcStatus = 2
//
updateTableDataRecord(record.mpId, res)
createMessage.success(t('common.successText'))
} catch (error) {
updateTableDataRecord(record.mpId, {calcStatus:3})
createMessage.error(t('common.failText'))
createMessage.error(t('common.errorText'))
} finally {
rowCalcLoading[record.mpId] = false
}

131
src/views/run/instant/CreateModal.vue

@ -14,21 +14,25 @@ import {useMessage} from '@/hooks/web/useMessage'
const emit = defineEmits(['success'])
const props = defineProps({
isDisabled: {
type: Boolean,
default: true,
}
})
const {createMessage} = useMessage()
const {t} = useI18n()
const current = ref<number>(0)
const state = reactive<any>({
selectedRowKeys: [],
selectedData: [],
pointInfo: [],
type: false,
})
// isDisabled-
const isDisabled = ref<boolean>(true)
const [registerCreateModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
setModalProps({destroyOnClose: true, showCancelBtn: false, showOkBtn: false})
await resetFields()
current.value=0;
state.selectedData=[];
state.selectedRowKeys=[];
})
const current = ref<number>(0)
function next() {
current.value++
@ -36,78 +40,47 @@ function next() {
function prev() {
current.value--
if (current.value == 0) {
console.log(state.selectedRowKeys)
console.log(state.selectedData)
}
}
const steps = [
{
title: '壹',
content: 'First-content',
},
{
title: '贰',
content: 'Second-content',
},
{ key: '壹', title: '壹' },
{ key: '贰', title: '贰' },
]
const items = steps.map(item => ({key: item.title, title: item.title}))
const [registerForm, {validate, resetFields, setFieldsValue, updateSchema, setProps}] = useForm({
const [registerForm, {validate, resetFields,getFieldsValue, setFieldsValue, updateSchema, setProps}] = useForm({
labelWidth: 100,
schemas: createInstantForm,
showSubmitButton: false,
showResetButton: false,
layout: 'horizontal',
actionColOptions: {span: 2},
disabled: true,
actionColOptions: {
span: 0, //
style: { display: 'none' },
},
})
interface instantForms {
modelId?: string
mpName?: string
algorithmId?: string
}
const instantForm = reactive<instantForms>({
modelId: '',
mpName: '',
algorithmId: ''
})
// isDisabled
const isDisabled = ref<boolean>(true)
// isDisabled
watch(() => props.isDisabled, (newVal) => {
if (newVal !== undefined) {
isDisabled.value = newVal
}
}, {immediate: true}) // immediatetrue
const state = reactive<any>({
selectedRowKeys: [],
selectedData: [],
pointInfo: [],
type: false,
})
async function updatempName(selectedRowKeys, selectedRows) {
console.log(selectedRowKeys)
console.log(selectedRows)
console.log(instantForm)
resetFields()
state.selectedRowKeys = selectedRowKeys;
state.selectedData = selectedRows;
//
if (selectedRows.length !== 0) {
state.type = selectedRows[0].algorithm === 'ANN'
console.log(state.type)
console.log(selectedRows)
state.type = selectedRows[0].algorithmId === '2'
state.pointInfo = JSON.parse(selectedRows[0].modelInfo).pointInfo
for (const p of state.pointInfo) {
p.modelName = selectedRows[0].modelName
p.modelDescription = selectedRows[0].description
p.algorithm = selectedRows[0].algorithm
p.algorithm = selectedRows[0].algorithmId
}
}
@ -119,10 +92,7 @@ async function updatempName(selectedRowKeys, selectedRows) {
else
setProps({disabled: false})
instantForm.modelId = selectedRows.length !== 0 ? `${selectedRows[0].modelId}` : ``
instantForm.mpName = selectedRows.length !== 0 ? `${selectedRows[0].modelName}-实例` : ``
setFieldsValue(instantForm)
const versionData = selectedRows.length !== 0 ? await getModelVersionList({modelId: selectedRows[0].modelId}) : []
const versionList = [] as any
@ -144,65 +114,61 @@ async function updatempName(selectedRowKeys, selectedRows) {
componentProps: {
options: versionList,
},
defaultValue: versionList[0]?.value
})
updateSchema({
field: 'calcGroup',
componentProps: {
options: calcGroupList,
},
defaultValue: calcGroupList[0]?.value
})
instantForm.modelId = selectedRows.length !== 0 ? `${selectedRows[0].modelId}` : ``
instantForm.mpName = selectedRows.length !== 0 ? `${selectedRows[0].modelName}-实例` : ``
instantForm.algorithmId=selectedRows.length !== 0 ? `${selectedRows[0].algorithmId}` : ``
setFieldsValue(instantForm)
}
function onCanel() {
current.value = 0
state.selectedData=[];
state.selectedRowKeys=[];
closeModal()
}
const loading = ref<boolean>(false)
const pointRef = ref()
async function CompleteCreate() {
async function handleSubmit() {
try {
loading.value = true
// confirmLoading
setModalProps({confirmLoading: true, loading: true})
const values = await validate()
console.log(values)
// if (unref(isUpdate)) {
// await updateDemo02Category(values)
// } else {
// await createDemo02Category(values)
// }
//
//
const pointInfoNew = pointRef.value.getPointTableData()
values.pointInfo = pointInfoNew
console.log(values)
await createInstant(values)
emit('success')
createMessage.success(t('common.saveSuccessText'))
} finally {
closeModal()
}
catch (e) {
}finally {
loading.value = false
// confirmLoading
setModalProps({confirmLoading: false, loading: false})
}
}
</script>
<template>
<BasicModal v-bind="$attrs" title="新增模型实例" width="60%" height="500px" @cancel="onCanel"
<BasicModal v-bind="$attrs" title="新增模型实例" width="65%"
:body-style="{ height: '500px', overflowY: 'auto' }"
@cancel="onCanel"
@register="registerCreateModal">
<Card title="实例信息">
<BasicForm @register="registerForm" ref="instantFormRef"/>
</Card>
<Divider/>
<Steps :current="current" :items="items"/>
<Steps :current="current" :items="steps"/>
<div class="steps-content">
<ModalTable v-if="current === 0" :selectedRowKeys="state.selectedRowKeys"
:selected-data="state.selectedData" @success="updatempName"/>
@ -219,7 +185,7 @@ async function CompleteCreate() {
v-if="current === steps.length - 1"
type="primary"
:loading="loading"
@click="CompleteCreate"
@click="handleSubmit"
>
完成
</a-button>
@ -233,7 +199,7 @@ async function CompleteCreate() {
<style scoped>
.steps-content {
margin-top: 16px;
margin-top: 5px;
text-align: center;
background-color: #fafafa;
border: 1px dashed #e9e9e9;
@ -241,11 +207,16 @@ async function CompleteCreate() {
}
.steps-action {
margin-top: 24px;
margin-top: 16px;
}
[data-theme='dark'] .steps-content {
background-color: #2f2f2f;
border: 1px dashed #404040;
}
:deep(.ant-card-body){
padding:12px
}
</style>

287
src/views/run/instant/detail.vue

@ -1,195 +1,210 @@
<script lang="ts" setup>
import { onMounted, reactive, ref } from 'vue'
import type { Dayjs } from 'dayjs'
import { onMounted, ref } from 'vue'
import moment from 'moment'
import { Card, Descriptions, DescriptionsItem, Form, FormItem, RangePicker, Space, Switch, message } from 'ant-design-vue'
import { mount } from 'sortablejs'
import { number } from 'vue-types'
import { useRoute } from 'vue-router'
import HistoryLine from '../../exa/HistoryLine.vue'
import { detailColumns, instantForm } from './instant.data'
import { getExaHistorys } from '@/api/alert/exa'
import { useModal } from '@/components/Modal'
import { BasicTable, TableAction, useTable } from '@/components/Table'
import { getInstant, getInstantChart, getInstantPage, getInstantPoint } from '@/api/alert/run/instant'
import { Card, Descriptions, DescriptionsItem, message } from 'ant-design-vue'
import { useRoute, useRouter } from 'vue-router'
import { useI18n } from '@/hooks/web/useI18n'
import { router } from '@/router'
import { BasicForm, useForm } from '@/components/Form'
import PropsPanel from '@/components/FormDesign/src/components/VFormDesign/modules/PropsPanel.vue'
import { BasicTable, useTable } from '@/components/Table'
import HistoryLine from '../../exa/HistoryLine.vue'
import { detailColumns, instantForm } from './instant.data'
import { getInstant, getInstantChart, getInstantPoint } from '@/api/alert/run/instant'
import echarts from '@/utils/lib/echarts'
/* =======================
* 类型定义严格 TS 核心
* ======================= */
interface BasicInfo {
mpName?: string
createName?: string
createTime?: string
updateName?: string
updateTime?: string
algorithmShortname?: string
modelInfo?: string
}
interface ModelInfo {
sampling?: string | number
rate?: number
principal?: number
precision?: number
pointInfo?: any[]
}
interface HistoryItem {
title: string
name: string
seriesData: any[]
}
/* ======================= */
defineOptions({ name: 'InstantDetail' })
const route = useRoute()
// const props = defineProps({
// id: {
// type: Number,
// default: null,
// },
// })
const router = useRouter()
const { t } = useI18n()
const loadingBasic = ref<boolean>(false)
const loadingChart = ref<boolean>(false)
const basicInfo = ref<any>({})
const modelInfo = ref<any>({})
const pointInfo = ref<any>({})
const pointList = ref<any>([])
const historyList = ref<any>([])
const instantId = ref<number | null>(Number(route.query.mpId) || null)
const loadingBasic = ref(false)
const loadingChart = ref(false)
const basicInfo = ref<BasicInfo>({})
const modelInfo = ref<ModelInfo>({})
const pointInfo = ref<any[]>([])
const pointList = ref<any[]>([])
const historyList = ref<HistoryItem[]>([])
/* =======================
* 表单
* ======================= */
const [registerForm, { getFieldsValue, setProps }] = useForm({
labelWidth: 100,
// baseColProps: { span: 24 },
schemas: instantForm,
showResetButton: false,
layout: 'horizontal',
// model: { time: [moment().subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss'), moment().format('YYYY-MM-DD HH:mm:ss')] },
fieldMapToTime: [
// datastartTimeendTime
['time', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss'],
],
actionColOptions: { span: 2 },
})
const instantId = ref<any>(route.query.mpId) // URLquery
onMounted(async () => {
loadingBasic.value = true
basicInfo.value = await getInstant(instantId.value)
loadingBasic.value = false
modelInfo.value = JSON.parse(basicInfo.value.modelInfo)
pointInfo.value = modelInfo.value.pointInfo
console.log(modelInfo.value)
pointList.value = await getInstantPoint(instantId.value)
getChartsData()
fieldMapToTime: [['time', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss']],
})
function handleSubmitR() {
getChartsData()
}
async function getChartsData() {
setProps({
submitButtonOptions: {
loading: true,
},
})
loadingChart.value = true
console.log(getFieldsValue())
const instantForm = getFieldsValue()
historyList.value = await getInstantChart({ ...{ id: instantId.value }, ...instantForm })
echarts.connect('async')
loadingChart.value = false
setProps({
submitButtonOptions: {
loading: false,
},
})
}
/* =======================
* 表格
* ======================= */
const [registerTable] = useTable({
title: '测点列表',
size: 'small',
dataSource: pointList,
columns: detailColumns,
useSearchForm: false,
showTableSetting: true,
showIndexColumn: false,
actionColumn: {
width: 140,
title: t('common.action'),
dataIndex: 'action',
fixed: 'right',
},
})
function handleDetail(record) {
console.log(record)
router.push('/run/instant/detail')
/* =======================
* 生命周期
* ======================= */
onMounted(async () => {
if (!instantId.value) return
try {
loadingBasic.value = true
const res = await getInstant(instantId.value)
if (!res) return
basicInfo.value = res
if (res.modelInfo) {
try {
const parsed: ModelInfo = JSON.parse(res.modelInfo)
modelInfo.value = parsed
pointInfo.value = Array.isArray(parsed.pointInfo) ? parsed.pointInfo : []
} catch (e) {
console.error('modelInfo JSON 解析失败', e)
}
}
pointList.value = (await getInstantPoint(instantId.value)) || []
await getChartsData()
} catch (e) {
message.error('加载实例详情失败')
} finally {
loadingBasic.value = false
}
})
/* =======================
* 事件
* ======================= */
async function getChartsData() {
if (!instantId.value) return
loadingChart.value = true
setProps({ submitButtonOptions: { loading: true } })
try {
const formValue = getFieldsValue() || {}
const res = await getInstantChart({ id: instantId.value, ...formValue })
historyList.value = Array.isArray(res) ? res : []
if (historyList.value.length) {
echarts.connect('async')
}
} catch (e) {
historyList.value = []
message.error('获取图表数据失败')
} finally {
loadingChart.value = false
setProps({ submitButtonOptions: { loading: false } })
}
}
function config(value) {
console.log(value)
function handleDetail(record: any) {
router.push('/run/instant/detail')
}
</script>
<template>
<div>
<Card :loading="loadingBasic">
<Descriptions size="small" title="模型基本信息" bordered :column="{ xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 }">
<DescriptionsItem label="实例名称" :span="4">
{{ basicInfo.mpName }}
</DescriptionsItem>
<DescriptionsItem label="创建人">
{{ basicInfo.createName }}
</DescriptionsItem>
<DescriptionsItem label="创建时间">
{{ moment(basicInfo.createTime).format("YYYY-MM-DD HH:mm:ss") }}
</DescriptionsItem>
<DescriptionsItem label="最近修改人">
{{ basicInfo.updateName }}
</DescriptionsItem>
<DescriptionsItem label="最近修改时间">
{{ moment(basicInfo.updateTime).format("YYYY-MM-DD HH:mm:ss") }}
</DescriptionsItem>
<DescriptionsItem label="算法">
{{ basicInfo.algorithmShortname }}
</DescriptionsItem>
<DescriptionsItem label="训练采样间隔">
{{ modelInfo.sampling }}
</DescriptionsItem>
<DescriptionsItem label="参数个数">
{{ pointInfo.length }}
</DescriptionsItem>
<DescriptionsItem label="最小主元贡献率">
{{ modelInfo.rate }}
</DescriptionsItem>
<DescriptionsItem label="主元个数">
{{ modelInfo.principal }}
</DescriptionsItem>
<DescriptionsItem label="模型精度">
{{ modelInfo.precision }}
</DescriptionsItem>
<Descriptions
size="small"
title="模型基本信息"
bordered
:column="{ xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 }"
>
<DescriptionsItem label="实例名称" :span="4">{{ basicInfo.mpName || '-' }}</DescriptionsItem>
<DescriptionsItem label="创建人">{{ basicInfo.createName || '-' }}</DescriptionsItem>
<DescriptionsItem label="创建时间">{{ basicInfo.createTime ? moment(basicInfo.createTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</DescriptionsItem>
<DescriptionsItem label="最近修改人">{{ basicInfo.updateName || '-' }}</DescriptionsItem>
<DescriptionsItem label="最近修改时间">{{ basicInfo.updateTime ? moment(basicInfo.updateTime).format('YYYY-MM-DD HH:mm:ss') : '-' }}</DescriptionsItem>
<DescriptionsItem label="算法">{{ basicInfo.algorithmShortname || '-' }}</DescriptionsItem>
<DescriptionsItem label="训练采样间隔">{{ modelInfo.sampling ?? '-' }}</DescriptionsItem>
<DescriptionsItem label="参数个数">{{ pointInfo.length }}</DescriptionsItem>
<DescriptionsItem label="最小主元贡献率">{{ modelInfo.rate ?? '-' }}</DescriptionsItem>
<DescriptionsItem label="主元个数">{{ modelInfo.principal ?? '-' }}</DescriptionsItem>
<DescriptionsItem label="模型精度">{{ modelInfo.precision ?? '-' }}</DescriptionsItem>
</Descriptions>
</Card>
<Card>
<BasicTable @register="registerTable">
<template #detail="{ record }">
<a class="click-status" @click="handleDetail(record)">
{{ record.mpName }}
</a>
<!-- <SlidersOutlined class="click-status" /> -->
<a class="click-status" @click="handleDetail(record)">{{ record.mpName }}</a>
</template>
</BasicTable>
</Card>
<Card>
<BasicForm @register="registerForm" @submit="handleSubmitR">
<!-- 添加button的插槽 -->
<template #configButton="{ field }">
<a-button style="margin-left:20px" @click="config">
故障配置
</a-button>
</template>
</BasicForm>
<BasicForm @register="registerForm" @submit="getChartsData" />
</Card>
<Card :loading="loadingChart">
<div>
<div v-for="(item, index) in historyList" :key="index">
<div style="border:1px solid #ccc">
<HistoryLine :is-async="index !== 0" :title="item.title" :data="item.seriesData" :name="item.name" height="250px" />
</div>
<div v-if="historyList.length">
<div v-for="(item, index) in historyList" :key="index" style="border:1px solid #ccc">
<HistoryLine
:is-async="index !== 0"
:title="item.title"
:data="item.seriesData"
:name="item.name"
height="250px"
/>
</div>
</div>
<div v-else class="empty">暂无数据</div>
</Card>
</div>
</template>
<style lang="less" scoped>
:deep(.ant-table-body){
height:100% !important;
max-height:100% !important
:deep(.ant-table-body) {
height: 100% !important;
max-height: 100% !important;
}
</style>

200
src/views/run/instant/detail1.vue

@ -0,0 +1,200 @@
<script lang="ts" setup>
import { onMounted, reactive, ref } from 'vue'
import type { Dayjs } from 'dayjs'
import moment from 'moment'
import { Card, Descriptions, DescriptionsItem, Form, FormItem, RangePicker, Space, Switch, message } from 'ant-design-vue'
import { mount } from 'sortablejs'
import { number } from 'vue-types'
import { useRoute } from 'vue-router'
import HistoryLine from '../../exa/HistoryLine.vue'
import { detailColumns, instantForm } from './instant.data'
import { getExaHistorys } from '@/api/alert/exa'
import { useModal } from '@/components/Modal'
import { BasicTable, TableAction, useTable } from '@/components/Table'
import { getInstant, getInstantChart, getInstantPage, getInstantPoint } from '@/api/alert/run/instant'
import { useI18n } from '@/hooks/web/useI18n'
import { router } from '@/router'
import { BasicForm, useForm } from '@/components/Form'
import PropsPanel from '@/components/FormDesign/src/components/VFormDesign/modules/PropsPanel.vue'
import echarts from '@/utils/lib/echarts'
defineOptions({ name: 'InstantDetail' })
const route = useRoute()
// const props = defineProps({
// id: {
// type: Number,
// default: null,
// },
// })
const { t } = useI18n()
const loadingBasic = ref<boolean>(false)
const loadingChart = ref<boolean>(false)
const basicInfo = ref<any>({})
const modelInfo = ref<any>({})
const pointInfo = ref<any>({})
const pointList = ref<any>([])
const historyList = ref<any>([])
const [registerForm, { getFieldsValue, setProps }] = useForm({
labelWidth: 100,
// baseColProps: { span: 24 },
schemas: instantForm,
showResetButton: false,
layout: 'horizontal',
// model: { time: [moment().subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss'), moment().format('YYYY-MM-DD HH:mm:ss')] },
fieldMapToTime: [
// datastartTimeendTime
['time', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss'],
],
actionColOptions: {
span: 2,
style:{
marginLeft:'5px'
}},
})
const instantId = ref<any>(route.query.mpId) // URLquery
onMounted(async () => {
loadingBasic.value = true
basicInfo.value = await getInstant(instantId.value)
loadingBasic.value = false
modelInfo.value = JSON.parse(basicInfo.value.modelInfo)
pointInfo.value = modelInfo.value.pointInfo
console.log(modelInfo.value)
pointList.value = await getInstantPoint(instantId.value)
getChartsData()
})
function handleSubmitR() {
getChartsData()
}
async function getChartsData() {
setProps({
submitButtonOptions: {
loading: true,
},
})
loadingChart.value = true
console.log(getFieldsValue())
const instantForm = getFieldsValue()
historyList.value = await getInstantChart({ ...{ id: instantId.value }, ...instantForm })
echarts.connect('async')
loadingChart.value = false
setProps({
submitButtonOptions: {
loading: false,
},
})
}
const [registerTable] = useTable({
title: '测点列表',
size: 'small',
dataSource: pointList,
columns: detailColumns,
useSearchForm: false,
showTableSetting: true,
showIndexColumn: false,
actionColumn: {
width: 140,
title: t('common.action'),
dataIndex: 'action',
fixed: 'right',
},
})
function handleDetail(record) {
console.log(record)
router.push('/run/instant/detail')
}
function handleFaultConfig(field) {
console.log(field)
}
</script>
<template>
<div>
<Card :loading="loadingBasic">
<Descriptions size="small" title="模型基本信息" bordered :column="{ xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 }">
<DescriptionsItem label="实例名称" :span="4">
{{ basicInfo.mpName }}
</DescriptionsItem>
<DescriptionsItem label="创建人">
{{ basicInfo.createName }}
</DescriptionsItem>
<DescriptionsItem label="创建时间">
{{ moment(basicInfo.createTime).format("YYYY-MM-DD HH:mm:ss") }}
</DescriptionsItem>
<DescriptionsItem label="最近修改人">
{{ basicInfo.updateName }}
</DescriptionsItem>
<DescriptionsItem label="最近修改时间">
{{ moment(basicInfo.updateTime).format("YYYY-MM-DD HH:mm:ss") }}
</DescriptionsItem>
<DescriptionsItem label="算法">
{{ basicInfo.algorithmShortname }}
</DescriptionsItem>
<DescriptionsItem label="训练采样间隔">
{{ modelInfo.sampling }}
</DescriptionsItem>
<DescriptionsItem label="参数个数">
{{ pointInfo.length }}
</DescriptionsItem>
<DescriptionsItem label="最小主元贡献率">
{{ modelInfo.rate }}
</DescriptionsItem>
<DescriptionsItem label="主元个数">
{{ modelInfo.principal }}
</DescriptionsItem>
<DescriptionsItem label="模型精度">
{{ modelInfo.precision }}
</DescriptionsItem>
</Descriptions>
</Card>
<Card>
<BasicTable @register="registerTable">
<template #detail="{ record }">
<a class="click-status" @click="handleDetail(record)">
{{ record.mpName }}
</a>
<!-- <SlidersOutlined class="click-status" /> -->
</template>
</BasicTable>
</Card>
<Card>
<BasicForm @register="registerForm" @submit="handleSubmitR">
<!-- 添加button的插槽 -->
<template #configButton="{ field }">
<a-button @click="handleFaultConfig(field)">
故障配置
</a-button>
</template>
</BasicForm>
</Card>
<Card :loading="loadingChart">
<div>
<div v-for="(item, index) in historyList" :key="index">
<div style="border:1px solid #ccc">
<HistoryLine :is-async="index !== 0" :title="item.title" :data="item.seriesData" :name="item.name" height="250px" />
</div>
</div>
</div>
</Card>
</div>
</template>
<style lang="less" scoped>
:deep(.ant-table-body){
height:100% !important;
max-height:100% !important
}
</style>

12
src/views/run/instant/index.vue

@ -35,7 +35,10 @@ const [registerTable, { getForm, reload, getDataSource, updateTableDataRecord }]
schemas: searchFormSchema,
showResetButton: false,
actionColOptions: {
span: 5
span: 3,
style: {
marginLeft: '5px',
},
},
},
@ -225,14 +228,13 @@ function handleWarnConfig(record: Recordable) {
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{ icon: IconEnum.WARN, label: t('action.warnConfig'), auth: 'run:instant:warnConfig', onClick: handleWarnConfig.bind(null, record) },
{ icon: IconEnum.WARN, label: t('action.warnConfig'), onClick: handleWarnConfig.bind(null, record) },
{ icon: IconEnum.EDIT, label: t('action.edit'), auth: 'run:instant:update', onClick: handleEdit.bind(null, record) },
{ icon: IconEnum.EDIT, label: t('action.edit'), onClick: handleEdit.bind(null, record) },
{
icon: IconEnum.DELETE,
danger: true,
label: t('action.delete'),
auth: 'run:instant:delete',
popConfirm: {
title: t('common.delMessage'),
placement: 'left',
@ -245,7 +247,7 @@ function handleWarnConfig(record: Recordable) {
</template>
</BasicTable>
<HistoryModal :item-name="itemName" :legend-name="legendName" @register="registerHistoryModal" />
<CreateModal :is-disabled="true" @register="registerCreateModal" @success="reload" />
<CreateModal @register="registerCreateModal" @success="reload" />
<UpdateModal @register="registerUpdateModal" @success="reload" />
</div>
</template>

90
src/views/run/instant/instant.data.ts

@ -6,6 +6,7 @@ import { DICT_TYPE, getDictOptions } from '@/utils/dict'
import { getModelVersionList } from '@/api/alert/run/model/index'
import { optionListApi, subSystemListApi } from '@/api/alert/model/select'
import type { systemSelectParams } from '@/api/alert/model/model/optionsModel'
import {setObjToUrlParams} from "@/utils";
export const columns: BasicColumn[] = [
{
@ -96,20 +97,21 @@ export const columns: BasicColumn[] = [
const optionList = await optionListApi()
const systemOptions = ref<any>([])
systemOptions.value = optionList.systems
// systemOptions.value = optionList.systems
export const searchFormSchema: FormSchema[] = [
{
label: '机组',
field: 'unit',
component: 'Select',
defaultValue: optionList.units[0].id || null,
// defaultValue: optionList.units[0].id || null,
defaultValue: null,
colProps: { span: 4 },
componentProps: ({ schema, tableAction, formActionType, formModel }) => {
return {
// xxxx props
allowClear: false,
placeholder: '请选择机组',
placeholder: '全部机组',
options: optionList.units.map(unit => ({ value: unit.id, label: unit.name })),
onChange: async (e: any) => {
// const { reload } = tableAction
@ -120,8 +122,13 @@ export const searchFormSchema: FormSchema[] = [
unitId: e,
typeId: formModel.type,
}
//如果typeId是空,则不设置system'Options
if (!param.typeId || !param.unitId) {
systemOptions.value = []
return
}
systemOptions.value = await subSystemListApi(param)
formModel.system = systemOptions.value[0].id
// formModel.system = systemOptions.value[0].id
},
}
},
@ -130,12 +137,13 @@ export const searchFormSchema: FormSchema[] = [
label: '系统',
field: 'type',
component: 'Select',
defaultValue: optionList.types[0].id || null,
// defaultValue: optionList.types[0].id || null,
defaultValue: null,
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
allowClear: false,
placeholder: '请选择系统',
placeholder: '全部系统',
options: optionList.types.map(type => ({ value: type.id, label: type.name })),
onChange: async (e: any) => {
// const { reload } = tableAction
@ -146,6 +154,11 @@ export const searchFormSchema: FormSchema[] = [
unitId: formModel.unit,
typeId: e,
}
//如果typeId是空,则不设置system'Options
if (!param.typeId || !param.unitId) {
systemOptions.value = []
return
}
systemOptions.value = await subSystemListApi(param)
},
}
@ -155,12 +168,12 @@ export const searchFormSchema: FormSchema[] = [
label: '子系统',
field: 'system',
component: 'Select',
defaultValue: systemOptions.value[0].id || null,
// defaultValue: systemOptions.value[0].id || null,
defaultValue: null,
colProps: { span: 4 },
componentProps: () => {
return {
allowClear: false,
placeholder: '请选择子系统',
placeholder: '全部子系统',
options: systemOptions.value.map(system => ({ value: system.id, label: system.name })),
}
},
@ -170,10 +183,21 @@ export const searchFormSchema: FormSchema[] = [
label: '模型实例名称',
field: 'mpName',
component: 'Input',
labelWidth: 120,
labelWidth: 100,
defaultValue: '',
colProps: { span: 7 },
colProps: { span: 5 },
}, {
label: '算法',
field: 'algorithmId',
component: 'Select',
labelWidth: 40,
componentProps: {
placeholder: '全部算法',
options: [{ value: 1, label: "主成分分析(PCA)" }, { value: 2, label: "神经网络(ANN)" }],
},
defaultValue: null,
colProps: { span: 3 },
},
{
label: '状态1',
@ -269,6 +293,9 @@ export const instantForm: FormSchema[] = [
onChange: (e: any) => {
console.log(e)
},
colProps: {
span: 8,
},
},
},
{
@ -276,6 +303,7 @@ export const instantForm: FormSchema[] = [
field: 'interval',
component: 'Select',
defaultValue: 300,
labelWidth:100,
componentProps: {
options: [{ value: 1, label: '1秒' }, { value: 10, label: '10秒' }, { value: 100, label: '100秒' }, { value: 300, label: '300秒' }],
@ -285,24 +313,17 @@ export const instantForm: FormSchema[] = [
span: 3,
},
},
{
label: '',
field: '0',
component: 'Input',
slot: 'configButton',
colProps: {
span: 2,
},
},
{
label: '复盘',
field: 'fp',
labelWidth:100,
component: 'RadioGroup',
defaultValue: 0,
colProps: {
span: 5,
},
componentProps: {
options: [
{
label: '是',
@ -317,6 +338,15 @@ export const instantForm: FormSchema[] = [
required: true,
},
{
label: '',
field: 'faultConfig',
component: 'Input',
slot: 'configButton',
colProps: {
span: 2,
}
}
]
export const searchFormSchemaModel: FormSchema[] = [
@ -342,6 +372,16 @@ export const createInstantForm: FormSchema[] = [
span: 12,
},
},
{
label: '算法id',
field: 'algorithmId',
component: 'Input',
required: true,
show: false,
colProps: {
span: 12,
},
},
{
label: '实例名称',
field: 'mpName',
@ -412,7 +452,7 @@ export const createInstantForm: FormSchema[] = [
],
},
colProps: {
span: 6,
span: 12,
},
required: true,

8
src/views/run/instant/warnConfig/index.vue

@ -23,7 +23,7 @@ const [registerUpdateModal, { openModal: openUpdateModal }] = useModal()
const [registerTable, { getForm, reload, getDataSource, updateTableDataRecord }] = useTable({
title: '预警测点列表',
api: getWarnPage,
rowKey: 'id',
rowKey: 'warnId',
immediate: true,
columns,
formConfig: {
@ -37,9 +37,9 @@ const [registerTable, { getForm, reload, getDataSource, updateTableDataRecord }]
},
beforeFetch: (params) => {
//
//
params.mpId = route.query.mpId
getForm().setFieldsValue(params)
// getForm().setFieldsValue(params)
return params
},
useSearchForm: !route.query.mpId,
@ -77,7 +77,7 @@ onMounted(async () => {
<TableAction
:actions="[
{ icon: IconEnum.WARN, label: t('action.warnConfig'), auth: 'run:instant:warnConfig', onClick: handleWarnConfig.bind(null, record) },
{ icon: IconEnum.WARN, label: t('action.warnConfig'), onClick: handleWarnConfig.bind(null, record) },
]"
/>

20
src/views/run/instant/warnConfig/warn.data.ts

@ -1,5 +1,7 @@
import type { BasicColumn, FormSchema } from '@/components/Table'
import {getAlarmLevelList} from "@/api/alert/warn";
const alarmLevelList = await getAlarmLevelList();
console.log(alarmLevelList)
export const columns: BasicColumn[] = [
{
title: '编号',
@ -68,12 +70,6 @@ export const columns: BasicColumn[] = [
dataIndex: 'warnConstraintName',
width: 120,
},
{
title: '报警类型',
dataIndex: 'alarmModelRuleName',
width: 120,
},
{
title: '告警延时',
@ -191,7 +187,11 @@ export const updateWarnForm: FormSchema[] = [
field: 'alarmLevel',
component: 'Select',
componentProps: {
options: [],
options: alarmLevelList,
fieldNames: {
label: 'alarmLevelName',
value: 'alarmLevel',
},
},
required: true,
colProps: {
@ -204,7 +204,7 @@ export const updateWarnForm: FormSchema[] = [
component: 'Input',
required: true,
colProps: {
span: 12,
span: 24,
},
},
{
@ -264,7 +264,7 @@ export const updateWarnForm: FormSchema[] = [
component: 'Input',
required: true,
colProps: {
span: 12,
span: 24,
},
},
]

68
src/views/run/model/ModelTable.vue

@ -10,35 +10,44 @@ import { useI18n } from '@/hooks/web/useI18n'
defineOptions({ name: 'ModelTable' })
const emit = defineEmits(['success'])
const props = defineProps({
selectedRowKeys: { type: Array<number>, default: [] },
selectedData: { type: Array<Recordable>, default: [] },
import { defineProps } from 'vue'
const props = defineProps({
selectedRowKeys: {
type: Array as () => number[],
default: () => [],
},
selectedData: {
type: Array as () => Record<string, any>[],
default: () => [],
},
})
const selectedData = ref<Recordable[]>(props.selectedData)
const selectedData = ref<Recordable[]>()
interface RowKeys {
selectedRowKeys: number[]
}
const state = reactive<RowKeys>({
selectedRowKeys: props.selectedRowKeys
selectedRowKeys: []
})
const { t } = useI18n()
watch(
() => props.selectedRowKeys,
() => {
setSelectedRowKeys(props.selectedRowKeys)
setSelectedRows(props.selectedData)
state.selectedRowKeys = props.selectedRowKeys
console.log(state.selectedRowKeys)
selectedData.value=props.selectedData
},
)
// watch(
// () => props.selectedRowKeys,
// () => {
// setSelectedRowKeys(props.selectedRowKeys)
// setSelectedRows(props.selectedData)
// state.selectedRowKeys = props.selectedRowKeys
// console.log(state.selectedRowKeys)
// selectedData.value=props.selectedData
// },
// )
const [registerTable, { getSelectRows,setSelectedRowKeys,setSelectedRows }] = useTable({
title: '模型列表(已下装)',
api: getModelPage,
searchInfo: {status:1},
//:status:1----;instant_num-----
searchInfo: {status:1,instantNum:0},
rowKey: 'modelId',
rowSelection: {
type: 'radio', async onChange(selectedRowKeys, selectedRows) {
@ -56,6 +65,9 @@ const [registerTable, { getSelectRows,setSelectedRowKeys,setSelectedRows }] = us
showResetButton: false,
actionColOptions: {
span: 2,
style: {
marginLeft: '10px',
},
},
},
useSearchForm: true,
@ -63,11 +75,21 @@ const [registerTable, { getSelectRows,setSelectedRowKeys,setSelectedRows }] = us
showIndexColumn: false,
})
onMounted(async () => {
setSelectedRowKeys(props.selectedRowKeys)
setSelectedRows(props.selectedData)
})
onMounted(() => {
setSelectedRowKeys([...props.selectedRowKeys])
setSelectedRows([...props.selectedData])
})
function parseModelInfo(modelInfo?: string) {
if (!modelInfo) return null
try {
return JSON.parse(modelInfo)
} catch {
return null
}
}
// watch(
// () => props.selectedRowKeys,
@ -81,12 +103,14 @@ onMounted(async () => {
<div>
<BasicTable @register="registerTable">
<template #pointNumber="{ record }">
{{ (JSON.parse(record.modelInfo)).pointInfo.length }}
{{ parseModelInfo(record.modelInfo)?.pointInfo?.length ?? 0 }}
</template>
<template #precision="{ record }">
{{ (JSON.parse(record.modelInfo)).precision }}
{{ parseModelInfo(record.modelInfo)?.precision ?? '-' }}
</template>
</BasicTable>
</div>
</template>

21
src/views/run/model/PointTable.vue

@ -1,5 +1,5 @@
<script lang="ts" setup>
import { defineExpose, onMounted, reactive, ref, watch } from 'vue'
import {defineExpose, h, onMounted, reactive, ref, watch} from 'vue'
import { autoCompleteProps } from 'ant-design-vue/es/auto-complete'
import PointModal from '../../exa/history/PointModal.vue'
import { columns } from './point.data'
@ -7,7 +7,7 @@ import { BasicTable, TableAction, useTable } from '@/components/Table'
import { useI18n } from '@/hooks/web/useI18n'
import { IconEnum } from '@/enums/appEnum'
import { useModal } from '@/components/Modal'
import {Tag} from 'ant-design-vue'
defineOptions({ name: 'ModelTable' })
const props = defineProps({
data: {
@ -54,7 +54,16 @@ onMounted(() => {
title: '测点类型',
dataIndex: 'type',
width: 80,
slots: { customRender: 'type' },
// slots: { customRender: 'type' },
customRender: ({ record }) => {
return h(
Tag,
{
color: record.type ? 'default' : 'blue',
},
() => (record.type ? '输出' : '输入'),
)
}
}])
}
})
@ -85,9 +94,9 @@ defineExpose({ getPointTableData })
<template>
<div>
<BasicTable @register="registerTable">
<template #type="{ record }">
{{ record.type ? '输入' : '输出' }}
</template>
<!-- <template #type="{ record }">-->
<!-- {{ record.type ? '输出' : '输入' }}-->
<!-- </template>-->
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction

2
src/views/run/model/model.data.ts

@ -51,6 +51,6 @@ export const searchFormSchema: FormSchema[] = [
field: 'modelName',
component: 'Input',
defaultValue: '',
colProps: { span: 6 },
colProps: { span: 10 },
},
]

70
src/views/warn/alarm/TrendModal.vue

@ -0,0 +1,70 @@
<script lang="ts" setup>
import { ref } from 'vue'
import moment from 'moment'
import { Card } from 'ant-design-vue'
import { formHistory } from '../../exa/exa.data'
import HistoryLine from '../../exa/HistoryLine.vue'
import { BasicModal, useModalInner } from '@/components/Modal'
import { BasicForm, useForm } from '@/components/Form'
import { getExaHistorys } from '@/api/alert/exa'
import {WarnTrendReqVO, getWarnTrend, EXAHistoryReqVO} from "@/api/alert/warn";
const props = defineProps<{
warnId: string,
}>()
const loading = ref(true)
const [registerForm, { getFieldsValue }] = useForm({
labelWidth: 100,
// baseColProps: { span: 24 },
schemas: formHistory,
showResetButton: false,
layout: 'horizontal',
model: { time: [moment().subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss'), moment().format('YYYY-MM-DD HH:mm:ss')] },
fieldMapToTime: [
// datastartTimeendTime
['time', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss'],
],
actionColOptions: { span: 3 },
})
const trendData = ref([])
const legendName = ref([])
const title = ref('')
const [registerHistoryModal, { setModalProps }] = useModalInner(async (data) => {
console.log(543)
setModalProps({ confirmLoading: false, showCancelBtn: false, showOkBtn: false })
handleSubmitR()
})
async function handleSubmitR() {
const serachFormData = getFieldsValue() as EXAHistoryReqVO
loading.value = true
//
const params:WarnTrendReqVO={
id:props.warnId,
...serachFormData
}
console.log(params.exaHistoryReqVO)
const result = await getWarnTrend(params)
console.log(result)
trendData.value=result.valueList;
legendName.value=result.tagList;
title.value=result.gzpName;
loading.value = false
}
</script>
<template>
<BasicModal :min-height="300" v-bind="$attrs" :title="title" width="60%" @register="registerHistoryModal">
<BasicForm @register="registerForm" @submit="handleSubmitR" />
<Card :loading="loading">
<HistoryLine :data="trendData" :name="legendName" height="40vh" />
</Card>
</BasicModal>
</template>

81
src/views/warn/alarm/alarm.data.ts

@ -4,6 +4,7 @@ import {h, ref} from "vue";
import {systemSelectParams} from "@/api/alert/model/model/optionsModel";
import {FileItem, UploadResultStatus} from "@/components/Upload/src/typing";
import {Progress} from "ant-design-vue";
import moment from "moment/moment";
const optionList = await optionListApi()
const systemOptions = ref<any>([])
@ -13,14 +14,15 @@ export const searchFormSchema: FormSchema[] = [
label: '机组',
field: 'unit',
component: 'Select',
defaultValue: optionList.units[0].id || null,
// defaultValue: optionList.units[0].id || null,
defaultValue: null,
colProps: { span: 4 },
componentProps: ({ schema, tableAction, formActionType, formModel }) => {
return {
// xxxx props
allowClear: false,
placeholder: '请选择机组',
placeholder: '全部机组',
options: optionList.units.map(unit => ({ value: unit.id, label: unit.name })),
onChange: async (e: any) => {
// const { reload } = tableAction
@ -31,8 +33,13 @@ export const searchFormSchema: FormSchema[] = [
unitId: e,
typeId: formModel.type,
}
//如果typeId是空,则不设置system'Options
if (!param.typeId || !param.unitId) {
systemOptions.value = []
return
}
systemOptions.value = await subSystemListApi(param)
formModel.system = systemOptions.value[0].id
// formModel.system = systemOptions.value[0].id
},
}
},
@ -41,12 +48,13 @@ export const searchFormSchema: FormSchema[] = [
label: '系统',
field: 'type',
component: 'Select',
defaultValue: optionList.types[0].id || null,
// defaultValue: optionList.types[0].id || null,
defaultValue: null,
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
allowClear: false,
placeholder: '请选择系统',
placeholder: '全部系统',
options: optionList.types.map(type => ({ value: type.id, label: type.name })),
onChange: async (e: any) => {
// const { reload } = tableAction
@ -57,6 +65,11 @@ export const searchFormSchema: FormSchema[] = [
unitId: formModel.unit,
typeId: e,
}
//如果typeId是空,则不设置system'Options
if (!param.typeId || !param.unitId) {
systemOptions.value = []
return
}
systemOptions.value = await subSystemListApi(param)
},
}
@ -66,12 +79,12 @@ export const searchFormSchema: FormSchema[] = [
label: '子系统',
field: 'system',
component: 'Select',
defaultValue: systemOptions.value[0].id || null,
// defaultValue: systemOptions.value[0].id || null,
defaultValue: null,
colProps: { span: 4 },
componentProps: () => {
return {
allowClear: false,
placeholder: '请选择子系统',
placeholder: '全部子系统',
options: systemOptions.value.map(system => ({ value: system.id, label: system.name })),
}
},
@ -81,10 +94,11 @@ export const searchFormSchema: FormSchema[] = [
label: '模型实例名称',
field: 'mpName',
component: 'Input',
labelWidth: 120,
labelWidth: 100,
defaultValue: '',
colProps: { span: 7 },
}
colProps: { span: 5 },
},
]
export const columns: BasicColumn[] = [
@ -134,7 +148,7 @@ export const columns: BasicColumn[] = [
{
title: '偏差值',
dataIndex: 'biasValue',
width: 50
width: 40
},
{
title: '安全区间',
@ -189,3 +203,42 @@ export const columns: BasicColumn[] = [
width: 100,
}
]
// export const formTrend: FormSchema[] = [
// {
// label: '时间',
// field: 'time',
// show: true,
// component: 'RangePicker',
// componentProps: {
// placeholder: ['开始时间', '结束时间'],
// defaultValue: [moment().subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss'), moment().format('YYYY-MM-DD HH:mm:ss')],
// valueFormat: 'YYYY-MM-DD HH:mm:ss',
// showTime: {
// defaultValue: [moment().subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss'), moment().format('YYYY-MM-DD HH:mm:ss')],
// },
// onChange: (e: any) => {
// console.log(e)
// },
// colProps: {
// span: 8,
// },
// },
// },
// {
// label: '时间间隔',
// field: 'interval',
// component: 'Select',
// defaultValue: 60,
// labelWidth:100,
// componentProps: {
// options: [{ value: 60, label: '60秒' }, { value: 100, label: '100秒' }, { value: 300, label: '300秒' }],
// },
// required: true,
// colProps: {
// span: 5,
// },
// },
// ]

50
src/views/warn/alarm/index.vue

@ -1,17 +1,18 @@
<script lang="ts" setup>
import { Switch } from 'ant-design-vue'
import { onMounted } from 'vue'
import { onMounted,ref } from 'vue'
import { useRoute } from 'vue-router'
import { columns, searchFormSchema } from './alarm.data'
// import UpdateModal from './UpdateModal.vue'
import UpdateModal from '../../run/instant/warnConfig/UpdateModal.vue'
import TrendModal from './TrendModal.vue'
import { BasicTable, TableAction, useTable } from '@/components/Table'
import { getWarnPageReal, updateWarn } from '@/api/alert/warn'
import {getWarnPageReal, updateWarn, warnTrendReqVO} from '@/api/alert/warn'
import { useI18n } from '@/hooks/web/useI18n'
import { useMessage } from '@/hooks/web/useMessage'
import { IconEnum } from '@/enums/appEnum'
import { useModal } from '@/components/Modal'
import {router} from "@/router";
defineOptions({ name: 'Warn' })
@ -20,6 +21,8 @@ const route = useRoute()
const { createMessage } = useMessage()
const { t } = useI18n()
const [registerUpdateModal, { openModal: openUpdateModal }] = useModal()
const [registerTrendModal, { openModal: openTrendModal }] = useModal()
const [registerTable, { getForm, reload, getDataSource, updateTableDataRecord }] = useTable({
title: '集中告警列表',
api: getWarnPageReal,
@ -32,11 +35,15 @@ const [registerTable, { getForm, reload, getDataSource, updateTableDataRecord }]
labelWidth: 80,
schemas: searchFormSchema,
showResetButton: false,
submitButtonOptions:{
preIcon: IconEnum.SEARCH,
},
actionColOptions: {
span: 4,
span: 2,
style: {
marginLeft: '10px'
}
textAlign: 'left',
marginLeft: '10px',
},
},
},
showTableSetting: true,
@ -55,13 +62,25 @@ async function updateStatus(record) {
console.log(record)
reload()
}
function handleWarnConfig(record: Recordable) {
function handleUpdate(record: Recordable) {
openUpdateModal(true, { record, isUpdate: true })
}
function handleDetail(record) {
console.log(record)
router.push(`/run/instant/detail?mpId=${record.mpId}`)
}
const warnId=ref<string>();
async function handleTrend(record: Recordable) {
console.log(record)
warnId.value=record.warnId;
openTrendModal(true, { record })
}
onMounted(async () => {
const { setFieldsValue } = getForm()
await setFieldsValue({ system: null })
// const { setFieldsValue } = getForm()
// await setFieldsValue({ system: null })
})
</script>
@ -72,17 +91,16 @@ onMounted(async () => {
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{ icon: IconEnum.EDIT, label: t('action.edit'), auth: 'run:instant:warnConfig', onClick: handleWarnConfig.bind(null, record) },
{ icon: IconEnum.TREND, label: t('action.trend'), auth: 'run:instant:warnConfig', onClick: handleWarnConfig.bind(null, record) },
{ icon: IconEnum.DETAIL, label: t('action.detail'), auth: 'run:instant:warnConfig', onClick: handleWarnConfig.bind(null, record) },
{ icon: IconEnum.EDIT, label: t('action.edit'), onClick: handleUpdate.bind(null, record) },
{ icon: IconEnum.TREND, label: t('action.trend'), onClick: handleTrend.bind(null, record) },
{ icon: IconEnum.DETAIL, label: t('action.detail'), onClick: handleDetail.bind(null, record) }
]"
/>
</template>
</template>
</BasicTable>
<!-- <UpdateModal @register="registerUpdateModal" @success="reload" />-->
<UpdateModal @register="registerUpdateModal" @success="reload" />
<TrendModal @register="registerTrendModal" :warnId="warnId"/>
</div>
</template>

Loading…
Cancel
Save