From 647dd1ac7e944eccbfdb91b9b9a18f1d2e4b15b7 Mon Sep 17 00:00:00 2001 From: lzh Date: Wed, 31 Dec 2025 10:50:50 +0800 Subject: [PATCH] Merge branch 'master' of https://gitee.com/yudaocode/yudao-ui-admin-vben into cleaning --- apps/web-antd/src/adapter/component/index.ts | 265 +- apps/web-antd/src/adapter/vxe-table.ts | 5 +- apps/web-antd/src/api/bpm/model/index.ts | 1 + apps/web-antd/src/api/bpm/task/index.ts | 30 +- .../src/api/infra/file-config/index.ts | 1 + .../src/api/iot/device/device/index.ts | 16 +- .../src/api/iot/product/product/index.ts | 21 - apps/web-antd/src/api/iot/statistics/index.ts | 56 +- .../combination/combinationActivity.ts | 1 + .../mall/promotion/seckill/seckillActivity.ts | 1 + .../src/api/system/mail/template/index.ts | 1 - .../src/api/system/social/client/index.ts | 1 + .../src/components/select-modal/index.ts | 2 - .../src/components/upload/file-upload.vue | 57 +- .../src/components/upload/image-upload.vue | 58 +- .../src/components/upload/input-upload.vue | 32 +- apps/web-antd/src/components/upload/typing.ts | 23 +- .../src/components/upload/use-upload.ts | 14 +- .../web-antd/src/router/routes/modules/bpm.ts | 18 - .../web-antd/src/router/routes/modules/iot.ts | 6 +- .../package/designer/plugins/translate/zh.js | 21 +- .../bpmn-process-designer/package/index.ts | 2 - .../package/penal/PropertiesPanel.vue | 5 +- .../components/BoundaryEventTimer.vue | 87 +- .../components/UserTaskCustomConfig.vue | 400 +- .../penal/flow-condition/FlowCondition.vue | 44 +- .../penal/listeners/ElementListeners.vue | 509 +-- .../penal/listeners/ListenerFieldModal.vue | 117 + .../penal/listeners/ProcessListenerDialog.vue | 110 - .../penal/listeners/UserTaskListeners.vue | 771 ++-- .../package/penal/listeners/utilSelf.ts | 3 + .../multi-instance/ElementMultiInstance.vue | 54 +- .../penal/other/ElementOtherConfig.vue | 12 +- .../penal/properties/ElementProperties.vue | 289 +- .../penal/signal-message/SignalAndMessage.vue | 347 +- .../signal-message/SignalMessageModal.vue | 90 + .../task/task-components/CallActivity.vue | 367 +- .../task/task-components/HttpHeaderEditor.vue | 121 + .../ProcessExpressionDialog.vue | 96 - .../task/task-components/ReceiveTask.vue | 145 +- .../penal/task/task-components/ScriptTask.vue | 88 +- .../task/task-components/ServiceTask.vue | 515 ++- .../penal/task/task-components/UserTask.vue | 42 +- .../penal/time-event-config/CycleConfig.vue | 246 +- .../time-event-config/DurationConfig.vue | 12 +- .../time-event-config/TimeEventConfig.vue | 160 +- .../bpmn-process-designer/package/utils.ts | 5 +- .../child-process-node-config.vue | 1 - .../nodes-config/copy-task-node-config.vue | 2 +- .../nodes-config/trigger-node-config.vue | 2 +- .../nodes-config/user-task-node-config.vue | 2 +- .../components/nodes/child-process-node.vue | 2 +- .../components/nodes/copy-task-node.vue | 2 +- .../components/nodes/delay-timer-node.vue | 2 +- .../components/nodes/exclusive-node.vue | 2 +- .../components/nodes/inclusive-node.vue | 2 +- .../nodes/modules/process-instance-modal.vue | 2 +- .../nodes/modules/task-list-modal.vue | 2 +- .../components/nodes/parallel-node.vue | 6 +- .../components/nodes/start-user-node.vue | 2 +- .../styles/simple-process-designer.scss | 1 - .../src/views/bpm/model/form/index.vue | 13 +- .../bpm/model/form/modules/basic-info.vue | 3 +- .../bpm/model/form/modules/form-design.vue | 4 +- .../src/views/bpm/oa/leave/create.vue | 39 +- apps/web-antd/src/views/bpm/oa/leave/data.ts | 2 +- .../web-antd/src/views/bpm/oa/leave/index.vue | 20 +- .../process-expression-select-modal.vue | 92 + .../bpm/processInstance/create/index.vue | 40 +- .../processInstance/create/modules/form.vue | 3 +- .../bpm/processInstance/detail/index.vue | 124 +- .../detail/modules/signature.vue | 25 +- .../detail/modules/task-list.vue | 25 +- .../detail/modules/time-line.vue | 2 +- .../src/views/bpm/processInstance/index.vue | 33 +- .../bpm/processListener/components/data.ts | 36 + .../process-listener-select-modal.vue | 96 + .../src/views/bpm/processListener/data.ts | 16 +- .../src/views/bpm/task/done/index.vue | 6 +- .../src/views/bpm/task/manager/index.vue | 2 +- .../crm/statistics/customer/chartOptions.ts | 148 +- .../crm/statistics/funnel/chartOptions.ts | 62 +- .../statistics/performance/chartOptions.ts | 55 +- .../crm/statistics/portrait/chartOptions.ts | 425 +- .../views/crm/statistics/rank/chartOptions.ts | 120 +- .../views/infra/dataSourceConfig/index.vue | 5 +- .../src/views/infra/fileConfig/data.ts | 12 + .../src/views/iot/device/device/data.ts | 25 +- .../device/{modules => }/detail/index.vue | 37 +- .../modules/config.vue} | 85 +- .../device-realtime-people-counter.vue | 86 +- .../modules}/device-realtime-smart-badge.vue | 128 +- .../modules/header.vue} | 42 +- .../modules/info.vue} | 96 +- .../device/device/detail/modules/message.vue | 244 ++ .../device/detail/modules/simulator.vue | 618 +++ .../modules/sub-device.vue} | 4 +- .../detail/modules/thing-model-event.vue | 256 ++ .../modules/thing-model-property-history.vue} | 373 +- .../modules/thing-model-property.vue} | 284 +- .../detail/modules/thing-model-service.vue | 281 ++ .../modules/thing-model.vue} | 8 +- .../src/views/iot/device/device/index.vue | 264 +- .../iot/device/device/modules/card-view.vue | 391 ++ .../components/device-table-select.vue | 402 -- .../modules/detail/device-details-message.vue | 271 -- .../detail/device-details-simulator.vue | 603 --- .../device-details-thing-model-event.vue | 236 - .../device-details-thing-model-service.vue | 258 -- .../device/modules/device-card-view.vue | 626 --- .../device/modules/device-import-form.vue | 133 - .../modules/{device-form.vue => form.vue} | 15 +- .../{device-group-form.vue => group-form.vue} | 5 +- .../iot/device/device/modules/import-form.vue | 107 + .../src/views/iot/device/group/index.vue | 6 +- .../{device-group-form.vue => form.vue} | 44 +- apps/web-antd/src/views/iot/home/data.ts | 5 +- apps/web-antd/src/views/iot/home/index.vue | 43 +- .../iot/home/modules/device-count-card.vue | 8 +- .../home/modules/device-state-count-card.vue | 8 +- .../iot/home/modules/message-trend-card.vue | 12 +- .../src/views/iot/product/category/data.ts | 4 +- .../src/views/iot/product/category/index.vue | 4 +- .../{product-category-form.vue => form.vue} | 17 +- .../src/views/iot/product/product/data.ts | 268 +- .../product/{modules => }/detail/index.vue | 5 +- .../modules/header.vue} | 79 +- .../modules/info.vue} | 11 +- .../src/views/iot/product/product/index.vue | 220 +- .../{product-card-view.vue => card-view.vue} | 155 +- .../components/product-table-select.vue | 196 - .../iot/product/product/modules/form.vue | 153 + .../product/product/modules/product-form.vue | 172 - .../iot/rule/data/sink/data-sink-form.vue | 1 - .../mall/product/comment/modules/form.vue | 7 +- .../spu/components/spu-and-sku-list.vue | 4 +- .../product/spu/components/spu-select-data.ts | 2 +- .../product/spu/components/spu-showcase.vue | 9 +- .../src/views/mall/product/spu/form/index.vue | 57 +- .../modules/product-property-add-form.vue | 1 - .../mall/promotion/bargain/activity/data.ts | 54 +- .../mall/promotion/bargain/activity/index.vue | 23 +- .../bargain/activity/modules/form.vue | 257 +- .../promotion/combination/activity/data.ts | 28 +- .../promotion/combination/activity/index.vue | 21 +- .../combination/activity/modules/form.vue | 190 +- .../combination/components/showcase.vue | 1 - .../component-container-property.vue | 8 +- .../components/component-container.vue | 5 +- .../components/component-library.vue | 1 - .../components/mobile/menu-swiper/index.vue | 1 - .../components/mobile/user-card/index.vue | 2 +- .../promotion/components/diy-editor/index.vue | 14 +- .../vertical-button-group/index.vue | 1 - .../promotion/coupon/components/select.vue | 22 +- .../mall/promotion/coupon/template/data.ts | 8 - .../coupon/template/modules/form.vue | 24 +- .../mall/promotion/discountActivity/data.ts | 9 +- .../mall/promotion/discountActivity/index.vue | 19 +- .../discountActivity/modules/form.vue | 16 +- .../promotion/diy/template/decorate/index.vue | 40 +- .../mall/promotion/point/activity/data.ts | 3 - .../promotion/point/activity/modules/form.vue | 1 - .../mall/promotion/point/components/index.ts | 4 +- .../{point-showcase.vue => showcase.vue} | 6 +- ...oint-table-select.vue => table-select.vue} | 7 +- .../mall/promotion/rewardActivity/data.ts | 1 + .../mall/promotion/rewardActivity/index.vue | 1 - .../promotion/rewardActivity/modules/form.vue | 26 +- .../modules/reward-rule-coupon-select.vue | 75 +- .../rewardActivity/modules/reward-rule.vue | 166 +- .../mall/promotion/seckill/activity/data.ts | 14 +- .../seckill/activity/modules/form.vue | 335 +- .../promotion/seckill/components/showcase.vue | 1 - .../wx-material-select/wx-material-select.vue | 462 +- .../src/views/mp/components/wx-msg/card.scss | 116 - .../views/mp/components/wx-msg/comment.scss | 109 - .../views/mp/components/wx-reply/tab-news.vue | 2 +- .../mp/material/components/image-table.vue | 100 - .../mp/material/components/video-table.vue | 92 - .../mp/material/components/voice-table.vue | 93 - apps/web-antd/src/views/mp/material/index.vue | 317 +- .../{components => modules}/UploadFile.vue | 1 - .../{components => modules}/UploadVideo.vue | 0 .../material/{components => modules}/data.ts | 13 +- .../{components => modules}/upload.ts | 0 apps/web-antd/src/views/mp/message/data.ts | 94 + apps/web-antd/src/views/mp/message/index.vue | 358 +- .../src/views/mp/message/message-table.vue | 262 -- .../views/pay/app/modules/channel-form.vue | 2 +- .../src/views/system/dept/components/index.ts | 1 + .../system/dept/components/select-modal.vue} | 28 +- .../src/views/system/loginlog/data.ts | 4 +- .../src/views/system/mail/template/data.ts | 8 - .../src/views/system/operatelog/data.ts | 9 + .../src/views/system/social/client/data.ts | 12 + .../src/views/system/user/components/index.ts | 1 + .../system/user/components/select-modal.vue} | 49 +- apps/web-ele/package.json | 7 + apps/web-ele/src/adapter/vxe-table.ts | 1 + apps/web-ele/src/api/bpm/model/index.ts | 1 + apps/web-ele/src/api/bpm/task/index.ts | 19 +- .../src/api/infra/file-config/index.ts | 1 + .../web-ele/src/api/mall/product/spu/index.ts | 7 - .../mall/promotion/bargain/bargainActivity.ts | 13 - .../combination/combinationActivity.ts | 14 +- .../promotion/discount/discountActivity.ts | 13 - .../src/api/mall/promotion/point/index.ts | 11 - .../mall/promotion/seckill/seckillActivity.ts | 14 +- apps/web-ele/src/api/mp/message/index.ts | 37 +- .../src/api/system/mail/template/index.ts | 1 - .../src/api/system/social/client/index.ts | 1 + .../src/components/cron-tab/cron-tab.vue | 235 +- apps/web-ele/src/components/cron-tab/types.ts | 266 ++ .../src/components/upload/file-upload.vue | 553 ++- .../src/components/upload/image-upload.vue | 433 +- .../src/components/upload/input-upload.vue | 37 +- apps/web-ele/src/components/upload/typing.ts | 69 +- .../src/components/upload/use-upload.ts | 14 +- apps/web-ele/src/router/routes/modules/bpm.ts | 18 - .../web-ele/src/router/routes/modules/mall.ts | 15 +- apps/web-ele/src/store/mall/kefu.ts | 28 +- .../components/bpmn-process-designer/index.ts | 2 + .../package/designer/ProcessDesigner.vue | 683 +++ .../package/designer/ProcessViewer.vue | 427 ++ .../package/designer/index.ts | 8 + .../package/designer/index2.ts | 8 + .../plugins/content-pad/contentPadProvider.js | 443 ++ .../designer/plugins/content-pad/index.js | 6 + .../package/designer/plugins/defaultEmpty.js | 26 + .../descriptor/activitiDescriptor.json | 1007 +++++ .../plugins/descriptor/camundaDescriptor.json | 1023 +++++ .../descriptor/flowableDescriptor.json | 1496 +++++++ .../activiti/activitiExtension.js | 94 + .../extension-moddle/activiti/index.js | 11 + .../extension-moddle/camunda/extension.js | 156 + .../plugins/extension-moddle/camunda/index.js | 6 + .../flowable/flowableExtension.js | 94 + .../extension-moddle/flowable/index.js | 10 + .../designer/plugins/palette/CustomPalette.js | 234 + .../package/designer/plugins/palette/index.js | 22 + .../plugins/palette/paletteProvider.js | 219 + .../plugins/translate/customTranslate.js | 44 + .../package/designer/plugins/translate/zh.js | 256 ++ .../bpmn-process-designer/package/index.ts | 9 + .../package/palette/ProcessPalette.vue | 30 + .../package/penal/PropertiesPanel.vue | 399 ++ .../package/penal/base/ElementBaseInfo.vue | 225 + .../custom-config/ElementCustomConfig.vue | 58 + .../components/BoundaryEventTimer.vue | 305 ++ .../components/UserTaskCustomConfig.vue | 663 +++ .../package/penal/custom-config/data.ts | 13 + .../penal/flow-condition/FlowCondition.vue | 234 + .../package/penal/form/ElementForm.vue | 337 ++ .../package/penal/index.js | 7 + .../penal/listeners/ElementListeners.vue | 573 +++ .../penal/listeners/ListenerFieldModal.vue | 111 + .../penal/listeners/UserTaskListeners.vue | 552 +++ .../package/penal/listeners/utilSelf.ts | 101 + .../multi-instance/ElementMultiInstance.vue | 545 +++ .../penal/other/ElementOtherConfig.vue | 73 + .../penal/properties/ElementProperties.vue | 249 ++ .../penal/signal-message/SignalAndMessage.vue | 337 ++ .../signal-message/SignalMessageModal.vue | 85 + .../package/penal/task/ElementTask.vue | 93 + .../package/penal/task/data.ts | 40 + .../task/task-components/CallActivity.vue | 418 ++ .../task/task-components/HttpHeaderEditor.vue | 126 + .../task/task-components/ReceiveTask.vue | 141 + .../penal/task/task-components/ScriptTask.vue | 119 + .../task/task-components/ServiceTask.vue | 487 ++ .../penal/task/task-components/UserTask.vue | 571 +++ .../penal/time-event-config/CycleConfig.vue | 391 ++ .../time-event-config/DurationConfig.vue | 95 + .../time-event-config/TimeEventConfig.vue | 361 ++ .../package/theme/index.scss | 120 + .../package/theme/process-designer.scss | 183 + .../package/theme/process-panel.scss | 127 + .../bpmn-process-designer/package/utils.ts | 94 + .../src/highlight/index.js | 8 + .../modules/custom-renderer/CustomRenderer.js | 30 + .../src/modules/custom-renderer/index.js | 6 + .../src/modules/rules/CustomRules.js | 16 + .../src/modules/rules/index.js | 6 + .../bpmn-process-designer/src/translations.ts | 25 + .../src/utils/directive/clickOutSide.js | 40 + .../bpmn-process-designer/src/utils/index.js | 10 + .../src/utils/xml2json.js | 50 + .../child-process-node-config.vue | 8 +- .../nodes-config/condition-node-config.vue | 5 +- .../nodes-config/modules/condition.vue | 1 + .../nodes-config/trigger-node-config.vue | 3 +- .../nodes-config/user-task-node-config.vue | 12 +- .../components/nodes/exclusive-node.vue | 6 +- .../components/nodes/inclusive-node.vue | 6 +- .../nodes/modules/process-instance-modal.vue | 2 +- .../nodes/modules/task-list-modal.vue | 2 +- .../components/process-node-tree.vue | 10 +- .../styles/simple-process-designer.scss | 1 - .../src/views/bpm/model/form/index.vue | 13 +- .../bpm/model/form/modules/basic-info.vue | 2 +- .../model/form/modules/bpm-model-editor.vue | 79 +- .../bpm/model/form/modules/extra-setting.vue | 1 + .../bpm/model/form/modules/form-design.vue | 4 +- .../bpm/processExpression/components/index.ts | 1 + .../components/select-modal.vue | 92 + .../bpm/processInstance/create/index.vue | 40 +- .../processInstance/create/modules/form.vue | 2 +- .../bpm/processInstance/detail/index.vue | 49 +- .../detail/modules/bpm-viewer.vue | 1 + .../detail/modules/operation-button.vue | 59 +- .../detail/modules/signature.vue | 23 +- .../detail/modules/task-list.vue | 11 +- .../src/views/bpm/processInstance/index.vue | 33 +- .../bpm/processListener/components/data.ts | 36 + .../bpm/processListener/components/index.ts | 1 + .../components/select-modal.vue | 96 + .../src/views/bpm/processListener/data.ts | 16 +- .../web-ele/src/views/bpm/task/done/index.vue | 6 +- .../src/views/bpm/task/manager/index.vue | 2 +- .../src/views/crm/business/status/data.ts | 2 +- .../views/crm/customer/limitConfig/data.ts | 2 +- .../src/views/crm/product/category/data.ts | 2 +- .../crm/statistics/customer/chartOptions.ts | 148 +- .../src/views/crm/statistics/customer/data.ts | 2 +- .../crm/statistics/funnel/chartOptions.ts | 62 +- .../src/views/crm/statistics/funnel/data.ts | 2 +- .../statistics/performance/chartOptions.ts | 55 +- .../views/crm/statistics/performance/data.ts | 2 +- .../crm/statistics/portrait/chartOptions.ts | 425 +- .../src/views/crm/statistics/portrait/data.ts | 2 +- .../views/crm/statistics/rank/chartOptions.ts | 120 +- .../src/views/crm/statistics/rank/data.ts | 2 +- .../src/views/erp/product/category/data.ts | 2 +- .../src/views/erp/product/product/data.ts | 4 +- apps/web-ele/src/views/infra/codegen/data.ts | 3 +- .../views/infra/dataSourceConfig/index.vue | 5 +- .../src/views/infra/demo/demo02/data.ts | 2 +- .../src/views/infra/fileConfig/data.ts | 12 + .../src/views/mall/product/category/data.ts | 2 +- .../src/views/mall/product/comment/data.ts | 22 +- .../src/views/mall/product/comment/index.vue | 21 +- .../mall/product/comment/modules/form.vue | 95 +- .../mall/product/spu/components/index.ts | 5 + .../product/spu/components/property-util.ts | 36 + .../mall/product/spu/components/sku-list.vue | 643 +++ .../spu/components/sku-table-select.vue | 143 +- .../spu/components/spu-and-sku-list.vue | 167 + .../product/spu/components/spu-select-data.ts | 168 + .../product/spu/components/spu-select.vue | 322 ++ .../product/spu/components/spu-showcase.vue | 5 +- .../spu/components/spu-table-select.vue | 93 +- .../views/mall/product/spu/components/type.ts | 32 + .../src/views/mall/product/spu/data.ts | 95 +- .../{modules/form-data.ts => form/data.ts} | 83 +- .../src/views/mall/product/spu/form/index.vue | 399 ++ .../spu/form/modules/product-attributes.vue | 234 + .../modules/product-property-add-form.vue | 146 + .../src/views/mall/product/spu/index.vue | 127 +- .../views/mall/product/spu/modules/detail.vue | 504 --- .../views/mall/product/spu/modules/form.vue | 177 - .../mall/promotion/bargain/activity/data.ts | 71 +- .../mall/promotion/bargain/activity/index.vue | 15 +- .../bargain/activity/modules/form.vue | 264 +- .../mall/promotion/bargain/record/data.ts | 6 +- .../promotion/combination/activity/data.ts | 38 +- .../promotion/combination/activity/index.vue | 17 +- .../combination/activity/modules/form.vue | 194 +- .../combination/components/showcase.vue | 1 - .../mall/promotion/combination/record/data.ts | 6 +- .../promotion/coupon/components/select.vue | 55 +- .../promotion/coupon/components/send-form.vue | 3 +- .../mall/promotion/coupon/template/data.ts | 2 - .../coupon/template/modules/form.vue | 24 +- .../mall/promotion/discountActivity/data.ts | 9 +- .../mall/promotion/discountActivity/index.vue | 17 +- .../discountActivity/modules/form.vue | 17 +- .../promotion/diy/template/decorate/index.vue | 16 +- .../mall/promotion/point/activity/data.ts | 113 +- .../mall/promotion/point/activity/index.vue | 67 +- .../promotion/point/activity/modules/form.vue | 243 +- .../mall/promotion/point/components/index.ts | 1 + .../promotion/point/components/showcase.vue | 18 +- .../point/components/table-select.vue | 7 +- .../mall/promotion/rewardActivity/data.ts | 254 +- .../mall/promotion/rewardActivity/index.vue | 51 +- .../promotion/rewardActivity/modules/form.vue | 90 +- .../modules/reward-rule-coupon-select.vue | 160 + .../rewardActivity/modules/reward-rule.vue | 187 + .../mall/promotion/seckill/activity/data.ts | 117 + .../promotion/seckill/activity/formatter.ts | 11 +- .../mall/promotion/seckill/activity/index.vue | 26 +- .../seckill/activity/modules/form.vue | 250 +- .../promotion/seckill/components/showcase.vue | 1 - .../mall/trade/delivery/pickUpOrder/data.ts | 4 +- .../mall/trade/delivery/pickUpOrder/index.vue | 1 + .../src/views/mall/trade/order/data.ts | 2 +- apps/web-ele/src/views/mp/components/index.ts | 2 +- .../wx-material-select/wx-material-select.vue | 733 +++- .../src/views/mp/components/wx-msg/card.scss | 116 - .../views/mp/components/wx-msg/comment.scss | 109 - .../views/mp/components/wx-reply/tab-news.vue | 2 +- apps/web-ele/src/views/mp/hooks/useUpload.ts | 76 + apps/web-ele/src/views/mp/material/index.vue | 259 ++ .../views/mp/material/modules/UploadFile.vue | 110 + .../views/mp/material/modules/UploadVideo.vue | 169 + .../src/views/mp/material/modules/data.ts | 145 + .../src/views/mp/material/modules/upload.ts | 46 + apps/web-ele/src/views/mp/message/data.ts | 94 + apps/web-ele/src/views/mp/message/index.vue | 239 + .../src/views/mp/modules/wx-msg/card.scss | 116 - .../src/views/mp/modules/wx-msg/comment.scss | 109 - .../views/pay/app/modules/channel-form.vue | 2 +- .../src/views/system/dept/components/index.ts | 3 +- ...dept-select-modal.vue => select-modal.vue} | 2 +- apps/web-ele/src/views/system/dept/data.ts | 3 +- .../web-ele/src/views/system/loginlog/data.ts | 4 +- .../src/views/system/mail/template/data.ts | 8 - apps/web-ele/src/views/system/menu/data.ts | 3 +- .../src/views/system/operatelog/data.ts | 11 +- .../src/views/system/social/client/data.ts | 12 + .../src/views/system/user/components/index.ts | 2 +- ...user-select-modal.vue => select-modal.vue} | 3 +- apps/web-ele/src/views/system/user/data.ts | 3 +- apps/web-ele/tsconfig.json | 3 +- apps/web-naive/src/adapter/vxe-table.ts | 5 +- .../src/api/infra/file-config/index.ts | 1 + .../src/api/system/social/client/index.ts | 1 + .../views/infra/dataSourceConfig/index.vue | 5 +- .../src/views/infra/fileConfig/data.ts | 12 + .../src/views/system/social/client/data.ts | 12 + apps/web-tdesign/src/adapter/vxe-table.ts | 5 +- .../src/api/infra/file-config/index.ts | 1 + .../src/api/system/social/client/index.ts | 1 + apps/web-tdesign/src/bootstrap.ts | 4 +- .../views/infra/dataSourceConfig/index.vue | 5 +- .../src/views/infra/fileConfig/data.ts | 12 + .../src/views/system/social/client/data.ts | 12 + docs/src/_env/adapter/vxe-table.ts | 5 +- docs/src/guide/introduction/thin.md | 4 +- packages/@core/base/design/src/css/global.css | 7 +- .../base/design/src/design-tokens/default.css | 1 + packages/@core/base/shared/src/utils/tree.ts | 37 +- .../__snapshots__/config.test.ts.snap | 1 + packages/@core/preferences/src/config.ts | 1 + packages/@core/preferences/src/preferences.ts | 5 +- packages/@core/preferences/src/types.ts | 2 + .../preferences/src/update-css-variables.ts | 13 + .../ui-kit/menu-ui/src/components/menu.vue | 17 +- .../components/normal-menu/normal-menu.vue | 6 +- packages/constants/src/biz-iot-enum.ts | 44 +- .../api-component/api-component.vue | 15 +- .../src/widgets/preferences/blocks/index.ts | 1 + .../preferences/blocks/theme/font-size.vue | 62 + .../preferences/preferences-drawer.vue | 5 + .../effects/plugins/src/vxe-table/init.ts | 8 +- packages/icons/src/svg/load.ts | 20 +- .../locales/src/langs/en-US/preferences.json | 2 + packages/locales/src/langs/en-US/ui.json | 4 +- .../locales/src/langs/zh-CN/preferences.json | 2 + packages/locales/src/langs/zh-CN/ui.json | 4 +- packages/utils/src/helpers/generate-menus.ts | 13 +- .../src/views/_core/profile/base-setting.vue | 65 - playground/src/views/_core/profile/index.vue | 49 - .../_core/profile/notification-setting.vue | 31 - .../views/_core/profile/password-setting.vue | 66 - .../views/_core/profile/security-setting.vue | 43 - pnpm-lock.yaml | 3897 +++++++++-------- 468 files changed, 33538 insertions(+), 14843 deletions(-) delete mode 100644 apps/web-antd/src/components/select-modal/index.ts create mode 100644 apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/ListenerFieldModal.vue delete mode 100644 apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/ProcessListenerDialog.vue create mode 100644 apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/signal-message/SignalMessageModal.vue create mode 100644 apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/HttpHeaderEditor.vue delete mode 100644 apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/ProcessExpressionDialog.vue create mode 100644 apps/web-antd/src/views/bpm/processExpression/components/process-expression-select-modal.vue create mode 100644 apps/web-antd/src/views/bpm/processListener/components/data.ts create mode 100644 apps/web-antd/src/views/bpm/processListener/components/process-listener-select-modal.vue rename apps/web-antd/src/views/iot/device/device/{modules => }/detail/index.vue (84%) rename apps/web-antd/src/views/iot/device/device/{modules/detail/device-detail-config.vue => detail/modules/config.vue} (85%) rename apps/web-antd/src/views/iot/device/device/{modules/detail => detail/modules}/device-realtime-people-counter.vue (90%) rename apps/web-antd/src/views/iot/device/device/{modules/detail => detail/modules}/device-realtime-smart-badge.vue (85%) rename apps/web-antd/src/views/iot/device/device/{modules/detail/device-details-header.vue => detail/modules/header.vue} (75%) rename apps/web-antd/src/views/iot/device/device/{modules/detail/device-details-info.vue => detail/modules/info.vue} (69%) create mode 100644 apps/web-antd/src/views/iot/device/device/detail/modules/message.vue create mode 100644 apps/web-antd/src/views/iot/device/device/detail/modules/simulator.vue rename apps/web-antd/src/views/iot/device/device/{modules/detail/device-details-sub-device.vue => detail/modules/sub-device.vue} (95%) create mode 100644 apps/web-antd/src/views/iot/device/device/detail/modules/thing-model-event.vue rename apps/web-antd/src/views/iot/device/device/{modules/detail/device-details-thing-model-property-history.vue => detail/modules/thing-model-property-history.vue} (63%) rename apps/web-antd/src/views/iot/device/device/{modules/detail/device-details-thing-model-property.vue => detail/modules/thing-model-property.vue} (53%) create mode 100644 apps/web-antd/src/views/iot/device/device/detail/modules/thing-model-service.vue rename apps/web-antd/src/views/iot/device/device/{modules/detail/device-details-thing-model.vue => detail/modules/thing-model.vue} (81%) create mode 100644 apps/web-antd/src/views/iot/device/device/modules/card-view.vue delete mode 100644 apps/web-antd/src/views/iot/device/device/modules/components/device-table-select.vue delete mode 100644 apps/web-antd/src/views/iot/device/device/modules/detail/device-details-message.vue delete mode 100644 apps/web-antd/src/views/iot/device/device/modules/detail/device-details-simulator.vue delete mode 100644 apps/web-antd/src/views/iot/device/device/modules/detail/device-details-thing-model-event.vue delete mode 100644 apps/web-antd/src/views/iot/device/device/modules/detail/device-details-thing-model-service.vue delete mode 100644 apps/web-antd/src/views/iot/device/device/modules/device-card-view.vue delete mode 100644 apps/web-antd/src/views/iot/device/device/modules/device-import-form.vue rename apps/web-antd/src/views/iot/device/device/modules/{device-form.vue => form.vue} (81%) rename apps/web-antd/src/views/iot/device/device/modules/{device-group-form.vue => group-form.vue} (92%) create mode 100644 apps/web-antd/src/views/iot/device/device/modules/import-form.vue rename apps/web-antd/src/views/iot/device/group/modules/{device-group-form.vue => form.vue} (64%) rename apps/web-antd/src/views/iot/product/category/modules/{product-category-form.vue => form.vue} (82%) rename apps/web-antd/src/views/iot/product/product/{modules => }/detail/index.vue (89%) rename apps/web-antd/src/views/iot/product/product/{modules/detail/product-details-header.vue => detail/modules/header.vue} (57%) rename apps/web-antd/src/views/iot/product/product/{modules/detail/product-details-info.vue => detail/modules/info.vue} (82%) rename apps/web-antd/src/views/iot/product/product/modules/{product-card-view.vue => card-view.vue} (72%) delete mode 100644 apps/web-antd/src/views/iot/product/product/modules/components/product-table-select.vue create mode 100644 apps/web-antd/src/views/iot/product/product/modules/form.vue delete mode 100644 apps/web-antd/src/views/iot/product/product/modules/product-form.vue rename apps/web-antd/src/views/mall/promotion/point/components/{point-showcase.vue => showcase.vue} (95%) rename apps/web-antd/src/views/mall/promotion/point/components/{point-table-select.vue => table-select.vue} (96%) delete mode 100644 apps/web-antd/src/views/mp/components/wx-msg/card.scss delete mode 100644 apps/web-antd/src/views/mp/components/wx-msg/comment.scss delete mode 100644 apps/web-antd/src/views/mp/material/components/image-table.vue delete mode 100644 apps/web-antd/src/views/mp/material/components/video-table.vue delete mode 100644 apps/web-antd/src/views/mp/material/components/voice-table.vue rename apps/web-antd/src/views/mp/material/{components => modules}/UploadFile.vue (99%) rename apps/web-antd/src/views/mp/material/{components => modules}/UploadVideo.vue (100%) rename apps/web-antd/src/views/mp/material/{components => modules}/data.ts (91%) rename apps/web-antd/src/views/mp/material/{components => modules}/upload.ts (100%) create mode 100644 apps/web-antd/src/views/mp/message/data.ts delete mode 100644 apps/web-antd/src/views/mp/message/message-table.vue create mode 100644 apps/web-antd/src/views/system/dept/components/index.ts rename apps/web-antd/src/{components/select-modal/dept-select-modal.vue => views/system/dept/components/select-modal.vue} (85%) create mode 100644 apps/web-antd/src/views/system/user/components/index.ts rename apps/web-antd/src/{components/select-modal/user-select-modal.vue => views/system/user/components/select-modal.vue} (95%) create mode 100644 apps/web-ele/src/components/cron-tab/types.ts create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/index.ts create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessDesigner.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/ProcessViewer.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/index.ts create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/index2.ts create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/content-pad/contentPadProvider.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/content-pad/index.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/defaultEmpty.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/descriptor/activitiDescriptor.json create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/descriptor/camundaDescriptor.json create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/descriptor/flowableDescriptor.json create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/extension-moddle/activiti/activitiExtension.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/extension-moddle/activiti/index.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/extension-moddle/camunda/extension.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/extension-moddle/camunda/index.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/extension-moddle/flowable/flowableExtension.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/extension-moddle/flowable/index.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/palette/CustomPalette.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/palette/index.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/palette/paletteProvider.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/translate/customTranslate.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/translate/zh.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/index.ts create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/palette/ProcessPalette.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/PropertiesPanel.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/base/ElementBaseInfo.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/ElementCustomConfig.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/BoundaryEventTimer.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/UserTaskCustomConfig.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/data.ts create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/flow-condition/FlowCondition.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/form/ElementForm.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/index.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/ElementListeners.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/ListenerFieldModal.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/UserTaskListeners.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/utilSelf.ts create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/multi-instance/ElementMultiInstance.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/other/ElementOtherConfig.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/properties/ElementProperties.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/signal-message/SignalAndMessage.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/signal-message/SignalMessageModal.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/task/ElementTask.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/task/data.ts create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/CallActivity.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/HttpHeaderEditor.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/ReceiveTask.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/ScriptTask.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/ServiceTask.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/UserTask.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/time-event-config/CycleConfig.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/time-event-config/DurationConfig.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/time-event-config/TimeEventConfig.vue create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/theme/index.scss create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/theme/process-designer.scss create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/theme/process-panel.scss create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/utils.ts create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/src/highlight/index.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/src/modules/custom-renderer/CustomRenderer.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/src/modules/custom-renderer/index.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/src/modules/rules/CustomRules.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/src/modules/rules/index.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/src/translations.ts create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/src/utils/directive/clickOutSide.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/src/utils/index.js create mode 100644 apps/web-ele/src/views/bpm/components/bpmn-process-designer/src/utils/xml2json.js create mode 100644 apps/web-ele/src/views/bpm/processExpression/components/index.ts create mode 100644 apps/web-ele/src/views/bpm/processExpression/components/select-modal.vue create mode 100644 apps/web-ele/src/views/bpm/processListener/components/data.ts create mode 100644 apps/web-ele/src/views/bpm/processListener/components/index.ts create mode 100644 apps/web-ele/src/views/bpm/processListener/components/select-modal.vue create mode 100644 apps/web-ele/src/views/mall/product/spu/components/property-util.ts create mode 100644 apps/web-ele/src/views/mall/product/spu/components/sku-list.vue create mode 100644 apps/web-ele/src/views/mall/product/spu/components/spu-and-sku-list.vue create mode 100644 apps/web-ele/src/views/mall/product/spu/components/spu-select-data.ts create mode 100644 apps/web-ele/src/views/mall/product/spu/components/spu-select.vue create mode 100644 apps/web-ele/src/views/mall/product/spu/components/type.ts rename apps/web-ele/src/views/mall/product/spu/{modules/form-data.ts => form/data.ts} (73%) create mode 100644 apps/web-ele/src/views/mall/product/spu/form/index.vue create mode 100644 apps/web-ele/src/views/mall/product/spu/form/modules/product-attributes.vue create mode 100644 apps/web-ele/src/views/mall/product/spu/form/modules/product-property-add-form.vue delete mode 100644 apps/web-ele/src/views/mall/product/spu/modules/detail.vue delete mode 100644 apps/web-ele/src/views/mall/product/spu/modules/form.vue create mode 100644 apps/web-ele/src/views/mall/promotion/rewardActivity/modules/reward-rule-coupon-select.vue create mode 100644 apps/web-ele/src/views/mall/promotion/rewardActivity/modules/reward-rule.vue delete mode 100644 apps/web-ele/src/views/mp/components/wx-msg/card.scss delete mode 100644 apps/web-ele/src/views/mp/components/wx-msg/comment.scss create mode 100644 apps/web-ele/src/views/mp/hooks/useUpload.ts create mode 100644 apps/web-ele/src/views/mp/material/index.vue create mode 100644 apps/web-ele/src/views/mp/material/modules/UploadFile.vue create mode 100644 apps/web-ele/src/views/mp/material/modules/UploadVideo.vue create mode 100644 apps/web-ele/src/views/mp/material/modules/data.ts create mode 100644 apps/web-ele/src/views/mp/material/modules/upload.ts create mode 100644 apps/web-ele/src/views/mp/message/data.ts create mode 100644 apps/web-ele/src/views/mp/message/index.vue delete mode 100644 apps/web-ele/src/views/mp/modules/wx-msg/card.scss delete mode 100644 apps/web-ele/src/views/mp/modules/wx-msg/comment.scss rename apps/web-ele/src/views/system/dept/components/{dept-select-modal.vue => select-modal.vue} (93%) rename apps/web-ele/src/views/system/user/components/{user-select-modal.vue => select-modal.vue} (97%) create mode 100644 packages/effects/layouts/src/widgets/preferences/blocks/theme/font-size.vue delete mode 100644 playground/src/views/_core/profile/base-setting.vue delete mode 100644 playground/src/views/_core/profile/index.vue delete mode 100644 playground/src/views/_core/profile/notification-setting.vue delete mode 100644 playground/src/views/_core/profile/password-setting.vue delete mode 100644 playground/src/views/_core/profile/security-setting.vue diff --git a/apps/web-antd/src/adapter/component/index.ts b/apps/web-antd/src/adapter/component/index.ts index 68e7e88b3..a62b88065 100644 --- a/apps/web-antd/src/adapter/component/index.ts +++ b/apps/web-antd/src/adapter/component/index.ts @@ -3,15 +3,31 @@ * 可用于 vben-form、vben-modal、vben-drawer 等组件使用, */ -import type { Component } from 'vue'; +import type { + UploadChangeParam, + UploadFile, + UploadProps, +} from 'ant-design-vue'; + +import type { Component, Ref } from 'vue'; import type { BaseFormComponentType } from '@vben/common-ui'; import type { Recordable } from '@vben/types'; -import { defineAsyncComponent, defineComponent, h, ref } from 'vue'; +import { + defineAsyncComponent, + defineComponent, + h, + ref, + render, + unref, + watch, +} from 'vue'; import { ApiComponent, globalShareState, IconPicker } from '@vben/common-ui'; +import { IconifyIcon } from '@vben/icons'; import { $t } from '@vben/locales'; +import { isEmpty } from '@vben/utils'; import { notification } from 'ant-design-vue'; @@ -22,9 +38,6 @@ const AutoComplete = defineAsyncComponent( () => import('ant-design-vue/es/auto-complete'), ); const Button = defineAsyncComponent(() => import('ant-design-vue/es/button')); -const Cascader = defineAsyncComponent( - () => import('ant-design-vue/es/cascader'), -); const Checkbox = defineAsyncComponent( () => import('ant-design-vue/es/checkbox'), ); @@ -68,7 +81,14 @@ const TimeRangePicker = defineAsyncComponent(() => const TreeSelect = defineAsyncComponent( () => import('ant-design-vue/es/tree-select'), ); +const Cascader = defineAsyncComponent( + () => import('ant-design-vue/es/cascader'), +); const Upload = defineAsyncComponent(() => import('ant-design-vue/es/upload')); +const Image = defineAsyncComponent(() => import('ant-design-vue/es/image')); +const PreviewGroup = defineAsyncComponent(() => + import('ant-design-vue/es/image').then((res) => res.ImagePreviewGroup), +); const withDefaultPlaceholder = ( component: T, @@ -104,12 +124,223 @@ const withDefaultPlaceholder = ( }); }; +const withPreviewUpload = () => { + return defineComponent({ + name: Upload.name, + emits: ['change', 'update:modelValue'], + setup: ( + props: any, + { attrs, slots, emit }: { attrs: any; emit: any; slots: any }, + ) => { + const previewVisible = ref(false); + + const placeholder = attrs?.placeholder || $t(`ui.placeholder.upload`); + + const listType = attrs?.listType || attrs?.['list-type'] || 'text'; + + const fileList = ref( + attrs?.fileList || attrs?.['file-list'] || [], + ); + + const handleChange = async (event: UploadChangeParam) => { + fileList.value = event.fileList; + emit('change', event); + emit( + 'update:modelValue', + event.fileList?.length ? fileList.value : undefined, + ); + }; + + const handlePreview = async (file: UploadFile) => { + previewVisible.value = true; + await previewImage(file, previewVisible, fileList); + }; + + const renderUploadButton = (): any => { + const isDisabled = attrs.disabled; + + // 如果禁用,不渲染上传按钮 + if (isDisabled) { + return null; + } + + // 否则渲染默认上传按钮 + return isEmpty(slots) + ? createDefaultSlotsWithUpload(listType, placeholder) + : slots; + }; + + // 可以监听到表单API设置的值 + watch( + () => attrs.modelValue, + (res) => { + fileList.value = res; + }, + ); + + return () => + h( + Upload, + { + ...props, + ...attrs, + fileList: fileList.value, + onChange: handleChange, + onPreview: handlePreview, + }, + renderUploadButton(), + ); + }, + }); +}; + +const createDefaultSlotsWithUpload = ( + listType: string, + placeholder: string, +) => { + switch (listType) { + case 'picture-card': { + return { + default: () => placeholder, + }; + } + default: { + return { + default: () => + h( + Button, + { + icon: h(IconifyIcon, { + icon: 'ant-design:upload-outlined', + class: 'mb-1 size-4', + }), + }, + () => placeholder, + ), + }; + } + } +}; + +const previewImage = async ( + file: UploadFile, + visible: Ref, + fileList: Ref, +) => { + // 检查是否为图片文件的辅助函数 + const isImageFile = (file: UploadFile): boolean => { + const imageExtensions = new Set([ + 'bmp', + 'gif', + 'jpeg', + 'jpg', + 'png', + 'webp', + ]); + if (file.url) { + const ext = file.url?.split('.').pop()?.toLowerCase(); + return ext ? imageExtensions.has(ext) : false; + } + if (!file.type) { + const ext = file.name?.split('.').pop()?.toLowerCase(); + return ext ? imageExtensions.has(ext) : false; + } + return file.type.startsWith('image/'); + }; + + // 如果当前文件不是图片,直接打开 + if (!isImageFile(file)) { + if (file.url) { + window.open(file.url, '_blank'); + } else if (file.preview) { + window.open(file.preview, '_blank'); + } else { + console.warn('无法打开文件,没有可用的URL或预览地址'); + } + return; + } + + // 对于图片文件,继续使用预览组 + const [ImageComponent, PreviewGroupComponent] = await Promise.all([ + Image, + PreviewGroup, + ]); + + const getBase64 = (file: File) => { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.addEventListener('load', () => resolve(reader.result)); + reader.addEventListener('error', (error) => reject(error)); + }); + }; + // 从fileList中过滤出所有图片文件 + const imageFiles = (unref(fileList) || []).filter((element) => + isImageFile(element), + ); + + // 为所有没有预览地址的图片生成预览 + for (const imgFile of imageFiles) { + if (!imgFile.url && !imgFile.preview && imgFile.originFileObj) { + imgFile.preview = (await getBase64(imgFile.originFileObj)) as string; + } + } + const container: HTMLElement | null = document.createElement('div'); + document.body.append(container); + + // 用于追踪组件是否已卸载 + let isUnmounted = false; + + const PreviewWrapper = { + setup() { + return () => { + if (isUnmounted) return null; + return h( + PreviewGroupComponent, + { + class: 'hidden', + preview: { + visible: visible.value, + // 设置初始显示的图片索引 + current: imageFiles.findIndex((f) => f.uid === file.uid), + onVisibleChange: (value: boolean) => { + visible.value = value; + if (!value) { + // 延迟清理,确保动画完成 + setTimeout(() => { + if (!isUnmounted && container) { + isUnmounted = true; + render(null, container); + container.remove(); + } + }, 300); + } + }, + }, + }, + () => + // 渲染所有图片文件 + imageFiles.map((imgFile) => + h(ImageComponent, { + key: imgFile.uid, + src: imgFile.url || imgFile.preview, + }), + ), + ); + }; + }, + }; + + render(h(PreviewWrapper), container); +}; + // 这里需要自行根据业务组件库进行适配,需要用到的组件都需要在这里类型说明 export type ComponentType = | 'ApiCascader' | 'ApiSelect' | 'ApiTreeSelect' | 'AutoComplete' + | 'Cascader' | 'Checkbox' | 'CheckboxGroup' | 'DatePicker' @@ -143,21 +374,13 @@ async function initComponentAdapter() { // 如果你的组件体积比较大,可以使用异步加载 // Button: () => // import('xxx').then((res) => res.Button), - ApiCascader: withDefaultPlaceholder( - { - ...ApiComponent, - name: 'ApiCascader', - }, - 'select', - { - component: Cascader, - fieldNames: { label: 'label', value: 'value', children: 'children' }, - loadingSlot: 'suffixIcon', - modelPropName: 'value', - optionsPropName: 'treeData', - visibleEvent: 'onVisibleChange', - }, - ), + ApiCascader: withDefaultPlaceholder(ApiComponent, 'select', { + component: Cascader, + fieldNames: { label: 'label', value: 'value', children: 'children' }, + loadingSlot: 'suffixIcon', + modelPropName: 'value', + visibleEvent: 'onVisibleChange', + }), ApiSelect: withDefaultPlaceholder( { ...ApiComponent, @@ -187,6 +410,7 @@ async function initComponentAdapter() { }, ), AutoComplete, + Cascader, Checkbox, CheckboxGroup, DatePicker, @@ -221,6 +445,7 @@ async function initComponentAdapter() { TimeRangePicker, TreeSelect: withDefaultPlaceholder(TreeSelect, 'select'), Upload, + PreviewUpload: withPreviewUpload(), FileUpload, ImageUpload, }; diff --git a/apps/web-antd/src/adapter/vxe-table.ts b/apps/web-antd/src/adapter/vxe-table.ts index d41f39113..15ab9212a 100644 --- a/apps/web-antd/src/adapter/vxe-table.ts +++ b/apps/web-antd/src/adapter/vxe-table.ts @@ -84,9 +84,10 @@ setupVbenVxeTable({ // 表格配置项可以用 cellRender: { name: 'CellImage' }, vxeUI.renderer.add('CellImage', { - renderTableDefault(_renderOpts, params) { + renderTableDefault(renderOpts, params) { + const { props } = renderOpts; const { column, row } = params; - return h(Image, { src: row[column.field] }); + return h(Image, { src: row[column.field], ...props }); }, }); diff --git a/apps/web-antd/src/api/bpm/model/index.ts b/apps/web-antd/src/api/bpm/model/index.ts index 545a73c03..e0c033a44 100644 --- a/apps/web-antd/src/api/bpm/model/index.ts +++ b/apps/web-antd/src/api/bpm/model/index.ts @@ -30,6 +30,7 @@ export namespace BpmModelApi { deploymentTime: number; suspensionState: number; formType?: number; + formCustomCreatePath?: string; formCustomViewPath?: string; formFields?: string[]; } diff --git a/apps/web-antd/src/api/bpm/task/index.ts b/apps/web-antd/src/api/bpm/task/index.ts index 8572b7e6e..b396594f7 100644 --- a/apps/web-antd/src/api/bpm/task/index.ts +++ b/apps/web-antd/src/api/bpm/task/index.ts @@ -7,13 +7,29 @@ import { requestClient } from '#/api/request'; export namespace BpmTaskApi { /** 流程任务 */ export interface Task { - id: number; // 编号 - name: string; // 监听器名字 - type: string; // 监听器类型 - status: number; // 监听器状态 - event: string; // 监听事件 - valueType: string; // 监听器值类型 - processInstance?: BpmProcessInstanceApi.ProcessInstance; // 流程实例 + id: string; // 编号 + name: string; // 任务名字 + status: number; // 任务状态 + createTime: number; // 创建时间 + endTime: number; // 结束时间 + durationInMillis: number; // 持续时间 + reason: string; // 审批理由 + ownerUser: any; // 负责人 + assigneeUser: any; // 处理人 + taskDefinitionKey: string; // 任务定义的标识 + processInstanceId: string; // 流程实例id + processInstance: BpmProcessInstanceApi.ProcessInstance; // 流程实例 + parentTaskId: any; // 父任务id + children: any; // 子任务 + formId: any; // 表单id + formName: any; // 表单名称 + formConf: any; // 表单配置 + formFields: any; // 表单字段 + formVariables: any; // 表单变量 + buttonsSetting: any; // 按钮设置 + signEnable: any; // 签名设置 + reasonRequire: any; // 原因设置 + nodeType: any; // 节点类型 } } diff --git a/apps/web-antd/src/api/infra/file-config/index.ts b/apps/web-antd/src/api/infra/file-config/index.ts index 1a2fb7707..3b1e82e6c 100644 --- a/apps/web-antd/src/api/infra/file-config/index.ts +++ b/apps/web-antd/src/api/infra/file-config/index.ts @@ -17,6 +17,7 @@ export namespace InfraFileConfigApi { accessSecret?: string; pathStyle?: boolean; enablePublicAccess?: boolean; + region?: string; domain: string; } diff --git a/apps/web-antd/src/api/iot/device/device/index.ts b/apps/web-antd/src/api/iot/device/device/index.ts index c41044756..a0a993028 100644 --- a/apps/web-antd/src/api/iot/device/device/index.ts +++ b/apps/web-antd/src/api/iot/device/device/index.ts @@ -77,14 +77,6 @@ export namespace IotDeviceApi { } } -/** IoT 设备状态枚举 */ -// TODO @haohao:packages/constants/src/biz-iot-enum.ts 枚举; -export enum DeviceStateEnum { - INACTIVE = 0, // 未激活 - OFFLINE = 2, // 离线 - ONLINE = 1, // 在线 -} - /** 查询设备分页 */ export function getDevicePage(params: PageParam) { return requestClient.get>( @@ -154,6 +146,14 @@ export function importDeviceTemplate() { return requestClient.download('/iot/device/get-import-template'); } +/** 导入设备 */ +export function importDevice(file: File, updateSupport: boolean) { + return requestClient.upload('/iot/device/import', { + file, + updateSupport, + }); +} + /** 获取设备属性最新数据 */ export function getLatestDeviceProperties(params: any) { return requestClient.get( diff --git a/apps/web-antd/src/api/iot/product/product/index.ts b/apps/web-antd/src/api/iot/product/product/index.ts index 28b2f7b2e..2833b1e5d 100644 --- a/apps/web-antd/src/api/iot/product/product/index.ts +++ b/apps/web-antd/src/api/iot/product/product/index.ts @@ -27,27 +27,6 @@ export namespace IotProductApi { } } -// TODO @haohao:packages/constants/src/biz-iot-enum.ts 枚举; - -/** IOT 产品设备类型枚举类 */ -export enum DeviceTypeEnum { - DEVICE = 0, // 直连设备 - GATEWAY = 2, // 网关设备 - GATEWAY_SUB = 1, // 网关子设备 -} - -/** IOT 产品定位类型枚举类 */ -export enum LocationTypeEnum { - IP = 1, // IP 定位 - MANUAL = 3, // 手动定位 - MODULE = 2, // 设备定位 -} - -/** IOT 数据格式(编解码器类型)枚举类 */ -export enum CodecTypeEnum { - ALINK = 'Alink', // 阿里云 Alink 协议 -} - /** 查询产品分页 */ export function getProductPage(params: PageParam) { return requestClient.get>( diff --git a/apps/web-antd/src/api/iot/statistics/index.ts b/apps/web-antd/src/api/iot/statistics/index.ts index 9f3a04266..a02b342d2 100644 --- a/apps/web-antd/src/api/iot/statistics/index.ts +++ b/apps/web-antd/src/api/iot/statistics/index.ts @@ -1,21 +1,20 @@ import { requestClient } from '#/api/request'; export namespace IotStatisticsApi { - // TODO @haohao:需要跟后端对齐,必要的 ReqVO、RespVO /** 统计摘要数据 */ - export interface StatisticsSummary { - productCategoryCount: number; - productCount: number; - deviceCount: number; - deviceMessageCount: number; - productCategoryTodayCount: number; - productTodayCount: number; - deviceTodayCount: number; - deviceMessageTodayCount: number; - deviceOnlineCount: number; - deviceOfflineCount: number; - deviceInactiveCount: number; - productCategoryDeviceCounts: Record; + export interface StatisticsSummaryRespVO { + productCategoryCount: number; // 品类数量 + productCount: number; // 产品数量 + deviceCount: number; // 设备数量 + deviceMessageCount: number; // 上报数量 + productCategoryTodayCount: number; // 今日新增品类数量 + productTodayCount: number; // 今日新增产品数量 + deviceTodayCount: number; // 今日新增设备数量 + deviceMessageTodayCount: number; // 今日新增上报数量 + deviceOnlineCount: number; // 在线数量 + deviceOfflineCount: number; // 离线数量 + deviceInactiveCount: number; // 待激活设备数量 + productCategoryDeviceCounts: Record; // 按品类统计的设备数量 } /** 时间戳-数值的键值对类型 */ @@ -30,15 +29,15 @@ export namespace IotStatisticsApi { downstreamCounts: TimeValueItem[]; } - /** 消息统计数据项(按日期) */ - export interface DeviceMessageSummaryByDate { - time: string; - upstreamCount: number; - downstreamCount: number; + /** 设备消息数量统计(按日期) */ + export interface DeviceMessageSummaryByDateRespVO { + time: string; // 时间轴 + upstreamCount: number; // 上行消息数量 + downstreamCount: number; // 下行消息数量 } - /** 消息统计接口参数 */ - export interface DeviceMessageReq { + /** 设备消息统计请求 */ + export interface DeviceMessageReqVO { interval: number; times?: string[]; } @@ -46,26 +45,17 @@ export namespace IotStatisticsApi { /** 获取 IoT 统计摘要数据 */ export function getStatisticsSummary() { - return requestClient.get( + return requestClient.get( '/iot/statistics/get-summary', ); } /** 获取设备消息的数据统计(按日期) */ export function getDeviceMessageSummaryByDate( - params: IotStatisticsApi.DeviceMessageReq, + params: IotStatisticsApi.DeviceMessageReqVO, ) { - return requestClient.get( + return requestClient.get( '/iot/statistics/get-device-message-summary-by-date', { params }, ); } - -// TODO @haohao:貌似这里,没用到?是不是后面哪里用,或者可以删除哈? -/** 获取设备消息统计摘要 */ -export function getDeviceMessageSummary(statType: number) { - return requestClient.get( - '/iot/statistics/get-device-message-summary', - { params: { statType } }, - ); -} diff --git a/apps/web-antd/src/api/mall/promotion/combination/combinationActivity.ts b/apps/web-antd/src/api/mall/promotion/combination/combinationActivity.ts index e497ae204..19af95e95 100644 --- a/apps/web-antd/src/api/mall/promotion/combination/combinationActivity.ts +++ b/apps/web-antd/src/api/mall/promotion/combination/combinationActivity.ts @@ -21,6 +21,7 @@ export namespace MallCombinationActivityApi { limitDuration?: number; // 限制时长 combinationPrice?: number; // 拼团价格 products: CombinationProduct[]; // 商品列表 + picUrl?: any; } /** 拼团活动所需属性 */ diff --git a/apps/web-antd/src/api/mall/promotion/seckill/seckillActivity.ts b/apps/web-antd/src/api/mall/promotion/seckill/seckillActivity.ts index 82297effd..1c18c5e3b 100644 --- a/apps/web-antd/src/api/mall/promotion/seckill/seckillActivity.ts +++ b/apps/web-antd/src/api/mall/promotion/seckill/seckillActivity.ts @@ -31,6 +31,7 @@ export namespace MallSeckillActivityApi { totalStock?: number; // 秒杀总库存 seckillPrice?: number; // 秒杀价格 products?: SeckillProduct[]; // 秒杀商品列表 + picUrl?: any; } } diff --git a/apps/web-antd/src/api/system/mail/template/index.ts b/apps/web-antd/src/api/system/mail/template/index.ts index 9e2a5a78d..57f722cf5 100644 --- a/apps/web-antd/src/api/system/mail/template/index.ts +++ b/apps/web-antd/src/api/system/mail/template/index.ts @@ -14,7 +14,6 @@ export namespace SystemMailTemplateApi { content: string; params: string[]; status: number; - remark: string; createTime: Date; } diff --git a/apps/web-antd/src/api/system/social/client/index.ts b/apps/web-antd/src/api/system/social/client/index.ts index 181cdf86b..55978dd14 100644 --- a/apps/web-antd/src/api/system/social/client/index.ts +++ b/apps/web-antd/src/api/system/social/client/index.ts @@ -12,6 +12,7 @@ export namespace SystemSocialClientApi { clientId: string; clientSecret: string; agentId?: string; + publicKey?: string; status: number; createTime?: Date; } diff --git a/apps/web-antd/src/components/select-modal/index.ts b/apps/web-antd/src/components/select-modal/index.ts deleted file mode 100644 index 2b6e91893..000000000 --- a/apps/web-antd/src/components/select-modal/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as DeptSelectModal } from './dept-select-modal.vue'; -export { default as UserSelectModal } from './user-select-modal.vue'; diff --git a/apps/web-antd/src/components/upload/file-upload.vue b/apps/web-antd/src/components/upload/file-upload.vue index b2a800785..3838642ea 100644 --- a/apps/web-antd/src/components/upload/file-upload.vue +++ b/apps/web-antd/src/components/upload/file-upload.vue @@ -51,12 +51,12 @@ const { getStringAccept } = useUploadType({ maxSizeRef: maxSize, }); -// 计算当前绑定的值,优先使用 modelValue +/** 计算当前绑定的值,优先使用 modelValue */ const currentValue = computed(() => { return props.modelValue === undefined ? props.value : props.modelValue; }); -// 判断是否使用 modelValue +/** 判断是否使用 modelValue */ const isUsingModelValue = computed(() => { return props.modelValue !== undefined; }); @@ -82,19 +82,21 @@ watch( } else { value.push(v); } - fileList.value = value.map((item, i) => { - if (item && isString(item)) { - return { - uid: `${-i}`, - name: item.slice(Math.max(0, item.lastIndexOf('/') + 1)), - status: UploadResultStatus.DONE, - url: item, - }; - } else if (item && isObject(item)) { - return item; - } - return null; - }) as UploadProps['fileList']; + fileList.value = value + .map((item, i) => { + if (item && isString(item)) { + return { + uid: `${-i}`, + name: item.slice(Math.max(0, item.lastIndexOf('/') + 1)), + status: UploadResultStatus.DONE, + url: item, + }; + } else if (item && isObject(item)) { + return item; + } + return null; + }) + .filter(Boolean) as UploadProps['fileList']; } if (!isFirstRender.value) { emit('change', value); @@ -107,6 +109,7 @@ watch( }, ); +/** 处理文件删除 */ async function handleRemove(file: UploadFile) { if (fileList.value) { const index = fileList.value.findIndex((item) => item.uid === file.uid); @@ -120,17 +123,17 @@ async function handleRemove(file: UploadFile) { } } -// 处理文件预览 +/** 处理文件预览 */ function handlePreview(file: UploadFile) { emit('preview', file); } -// 处理文件数量超限 +/** 处理文件数量超限 */ function handleExceed() { message.error($t('ui.upload.maxNumber', [maxNumber.value])); } -// 处理上传错误 +/** 处理上传错误 */ function handleUploadError(error: any) { console.error('上传错误:', error); message.error($t('ui.upload.uploadError')); @@ -138,6 +141,11 @@ function handleUploadError(error: any) { uploadNumber.value = Math.max(0, uploadNumber.value - 1); } +/** + * 上传前校验 + * @param file 待上传的文件 + * @returns 是否允许上传 + */ async function beforeUpload(file: File) { const fileContent = await file.text(); emit('returnText', fileContent); @@ -171,7 +179,8 @@ async function beforeUpload(file: File) { return true; } -async function customRequest(info: UploadRequestOption) { +/** 自定义上传请求 */ +async function customRequest(info: UploadRequestOption) { let { api } = props; if (!api || !isFunction(api)) { api = useUpload(props.directory).httpRequest; @@ -196,7 +205,11 @@ async function customRequest(info: UploadRequestOption) { } } -// 处理上传成功 +/** + * 处理上传成功 + * @param res 上传响应结果 + * @param file 上传的文件 + */ function handleUploadSuccess(res: any, file: File) { // 删除临时文件 const index = fileList.value?.findIndex((item) => item.name === file.name); @@ -228,6 +241,10 @@ function handleUploadSuccess(res: any, file: File) { } } +/** + * 获取当前文件列表的值 + * @returns 文件 URL 列表或字符串 + */ function getValue() { const list = (fileList.value || []) .filter((item) => item?.status === UploadResultStatus.DONE) diff --git a/apps/web-antd/src/components/upload/image-upload.vue b/apps/web-antd/src/components/upload/image-upload.vue index fe962f538..b78d8f15d 100644 --- a/apps/web-antd/src/components/upload/image-upload.vue +++ b/apps/web-antd/src/components/upload/image-upload.vue @@ -55,12 +55,12 @@ const { getStringAccept } = useUploadType({ maxSizeRef: maxSize, }); -// 计算当前绑定的值,优先使用 modelValue +/** 计算当前绑定的值,优先使用 modelValue */ const currentValue = computed(() => { return props.modelValue === undefined ? props.value : props.modelValue; }); -// 判断是否使用 modelValue +/** 判断是否使用 modelValue */ const isUsingModelValue = computed(() => { return props.modelValue !== undefined; }); @@ -89,19 +89,21 @@ watch( } else { value.push(v); } - fileList.value = value.map((item, i) => { - if (item && isString(item)) { - return { - uid: `${-i}`, - name: item.slice(Math.max(0, item.lastIndexOf('/') + 1)), - status: UploadResultStatus.DONE, - url: item, - }; - } else if (item && isObject(item)) { - return item; - } - return null; - }) as UploadProps['fileList']; + fileList.value = value + .map((item, i) => { + if (item && isString(item)) { + return { + uid: `${-i}`, + name: item.slice(Math.max(0, item.lastIndexOf('/') + 1)), + status: UploadResultStatus.DONE, + url: item, + }; + } else if (item && isObject(item)) { + return item; + } + return null; + }) + .filter(Boolean) as UploadProps['fileList']; } if (!isFirstRender.value) { emit('change', value); @@ -114,6 +116,7 @@ watch( }, ); +/** 将文件转换为 Base64 格式 */ function getBase64(file: File) { return new Promise((resolve, reject) => { const reader = new FileReader(); @@ -125,6 +128,7 @@ function getBase64(file: File) { }); } +/** 处理图片预览 */ async function handlePreview(file: UploadFile) { if (!file.url && !file.preview) { file.preview = await getBase64(file.originFileObj!); @@ -138,6 +142,7 @@ async function handlePreview(file: UploadFile) { ); } +/** 处理文件删除 */ async function handleRemove(file: UploadFile) { if (fileList.value) { const index = fileList.value.findIndex((item) => item.uid === file.uid); @@ -151,11 +156,17 @@ async function handleRemove(file: UploadFile) { } } +/** 关闭预览弹窗 */ function handleCancel() { previewOpen.value = false; previewTitle.value = ''; } +/** + * 上传前校验 + * @param file 待上传的文件 + * @returns 是否允许上传 + */ async function beforeUpload(file: File) { // 检查文件数量限制 if (fileList.value!.length >= props.maxNumber) { @@ -186,7 +197,8 @@ async function beforeUpload(file: File) { return true; } -async function customRequest(info: UploadRequestOption) { +/** 自定义上传请求 */ +async function customRequest(info: UploadRequestOption) { let { api } = props; if (!api || !isFunction(api)) { api = useUpload(props.directory).httpRequest; @@ -211,7 +223,11 @@ async function customRequest(info: UploadRequestOption) { } } -// 处理上传成功 +/** + * 处理上传成功 + * @param res 上传响应结果 + * @param file 上传的文件 + */ function handleUploadSuccess(res: any, file: File) { // 删除临时文件 const index = fileList.value?.findIndex((item) => item.name === file.name); @@ -243,14 +259,18 @@ function handleUploadSuccess(res: any, file: File) { } } -// 处理上传错误 +/** 处理上传错误 */ function handleUploadError(error: any) { console.error('上传错误:', error); - message.error('上传错误!!!'); + message.error($t('ui.upload.uploadError')); // 上传失败时减少计数器 uploadNumber.value = Math.max(0, uploadNumber.value - 1); } +/** + * 获取当前文件列表的值 + * @returns 文件 URL 列表或字符串 + */ function getValue() { const list = (fileList.value || []) .filter((item) => item?.status === UploadResultStatus.DONE) diff --git a/apps/web-antd/src/components/upload/input-upload.vue b/apps/web-antd/src/components/upload/input-upload.vue index 66495467a..90b2f4f7c 100644 --- a/apps/web-antd/src/components/upload/input-upload.vue +++ b/apps/web-antd/src/components/upload/input-upload.vue @@ -6,7 +6,7 @@ import type { FileUploadProps } from './typing'; import { computed } from 'vue'; import { useVModel } from '@vueuse/core'; -import { Col, Input, Row, Textarea } from 'ant-design-vue'; +import { Input, Textarea } from 'ant-design-vue'; import FileUpload from './file-upload.vue'; @@ -30,6 +30,7 @@ const modelValue = useVModel(props, 'modelValue', emits, { passive: true, }); +/** 处理文件内容返回 */ function handleReturnText(text: string) { modelValue.value = text; emits('change', modelValue.value); @@ -37,6 +38,7 @@ function handleReturnText(text: string) { emits('update:modelValue', modelValue.value); } +/** 计算输入框属性 */ const inputProps = computed(() => { return { ...props.inputProps, @@ -44,6 +46,7 @@ const inputProps = computed(() => { }; }); +/** 计算文本域属性 */ const textareaProps = computed(() => { return { ...props.textareaProps, @@ -51,6 +54,7 @@ const textareaProps = computed(() => { }; }); +/** 计算文件上传属性 */ const fileUploadProps = computed(() => { return { ...props.fileUploadProps, @@ -58,17 +62,17 @@ const fileUploadProps = computed(() => { });