From fb5c4cb53cf52979f0edbedc70963d17779ae900 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=BB=E7=A0=96-JAVA=5CAdministrator?= <591141169@qq.com> Date: Tue, 7 May 2024 13:43:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E5=9F=BA=E7=A1=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 19 + .env | 17 + .env.development | 38 + .env.production | 37 + .env.test | 37 + .eslintignore | 8 + .eslintrc-auto-import.json | 259 +++ .eslintrc.js | 72 + .gitignore | 13 + .prettierignore | 11 + .stylelintignore | 6 + Dockerfile | 7 + Dockerfile_prod | 7 + LICENSE | 21 + README.md | 45 + build/vite/index.ts | 107 + build/vite/optimize.ts | 112 + index.html | 152 ++ nginx.conf | 60 + nginx_prod.conf | 60 + package.json | 134 ++ postcss.config.js | 5 + prettier.config.js | 22 + public/favicon.ico | Bin 0 -> 4286 bytes public/home.png | Bin 0 -> 74352 bytes public/logo.gif | Bin 0 -> 6334 bytes src/App.vue | 75 + src/api/bpm/activity/index.ts | 8 + src/api/bpm/definition/index.ts | 21 + src/api/bpm/form/index.ts | 56 + src/api/bpm/leave/index.ts | 27 + src/api/bpm/model/index.ts | 59 + src/api/bpm/processInstance/index.ts | 41 + src/api/bpm/task/index.ts | 53 + src/api/bpm/taskAssignRule/index.ts | 29 + src/api/bpm/userGroup/index.ts | 47 + src/api/eam/basic/basciYearEquipment/index.ts | 52 + .../eam/basic/basicMonthEquipment/index.ts | 54 + src/api/eam/basic/classType/index.ts | 54 + src/api/eam/basic/deviceMaintenance/index.ts | 61 + .../eam/basic/deviceMoldItemsHistory/index.ts | 60 + src/api/eam/basic/factoryArea/index.ts | 49 + src/api/eam/basic/fixedAssets/index.ts | 87 + src/api/eam/basic/inspection/index.ts | 89 + src/api/eam/basic/item/index.ts | 80 + src/api/eam/basic/location/index.ts | 55 + src/api/eam/basic/locationArea/index.ts | 48 + src/api/eam/basic/moldInspection/index.ts | 63 + src/api/eam/basic/moldMaintenance/index.ts | 61 + src/api/eam/basic/moldMilestone/index.ts | 53 + src/api/eam/basic/rel/index.ts | 57 + src/api/eam/basic/supplier/index.ts | 59 + src/api/eam/device/deviceAccounts/index.ts | 72 + src/api/eam/device/deviceAllot/index.ts | 59 + .../device/deviceInspectionDetail/index.ts | 59 + .../eam/device/deviceInspectionMain/index.ts | 76 + .../eam/device/deviceInternalAudit/index.ts | 59 + .../device/deviceMaintainOrderDetail/index.ts | 60 + .../device/deviceMaintainOrderMain/index.ts | 76 + .../eam/device/deviceMaintainPlan/index.ts | 55 + .../device/deviceMaintenanceDetail/index.ts | 51 + .../eam/device/deviceMaintenanceMain/index.ts | 94 + src/api/eam/device/deviceRepair/index.ts | 68 + .../deviceSpotInspectionRecordDetail/index.ts | 54 + .../deviceSpotInspectionRecordMain/index.ts | 56 + src/api/eam/device/problemSolving/index.ts | 55 + src/api/eam/item/adjustRecordDetail/index.ts | 46 + src/api/eam/item/adjustRecordMain/index.ts | 46 + .../eam/item/applicationRecordDetail/index.ts | 57 + .../eam/item/applicationRecordMain/index.ts | 67 + src/api/eam/item/countJobDetail/index.ts | 51 + src/api/eam/item/countJobMain/index.ts | 56 + src/api/eam/item/countRecordDetail/index.ts | 51 + src/api/eam/item/countRecordMain/index.ts | 61 + src/api/eam/item/countadjustPlan/index.ts | 51 + src/api/eam/item/itemAccounts/index.ts | 63 + src/api/eam/item/itemApplyDetail/index.ts | 57 + src/api/eam/item/itemApplyMain/index.ts | 63 + src/api/eam/item/itemInLocation/index.ts | 50 + src/api/eam/item/itemLocationRecord/index.ts | 56 + src/api/eam/item/itemLocationReplace/index.ts | 49 + src/api/eam/item/itemMaintenance/index.ts | 52 + src/api/eam/item/itemOrderDetail/index.ts | 65 + src/api/eam/item/itemOrderMain/index.ts | 71 + src/api/eam/item/itemOutLocation/index.ts | 50 + src/api/eam/item/replaceItemDes/index.ts | 55 + src/api/eam/item/transaction/index.ts | 53 + src/api/eam/mold/moldAccounts/index.ts | 72 + .../eam/mold/moldInspectionDetail/index.ts | 60 + src/api/eam/mold/moldInspectionMain/index.ts | 70 + .../eam/mold/moldMaintainOrderDetail/index.ts | 60 + .../eam/mold/moldMaintainOrderMain/index.ts | 80 + src/api/eam/mold/moldMaintainPlan/index.ts | 55 + .../eam/mold/moldMaintenanceDetail/index.ts | 51 + src/api/eam/mold/moldMaintenanceMain/index.ts | 92 + src/api/eam/mold/moldRepair/index.ts | 62 + .../moldSpotInspectionRecordMain/index.ts | 57 + src/api/eam/upload/index.ts | 10 + src/api/home/index.ts | 16 + src/api/infra/apiAccessLog/index.ts | 30 + src/api/infra/apiErrorLog/index.ts | 48 + src/api/infra/codegen/index.ts | 123 ++ src/api/infra/config/index.ts | 48 + src/api/infra/dataSourceConfig/index.ts | 35 + src/api/infra/dbDoc/index.ts | 16 + src/api/infra/file/index.ts | 23 + src/api/infra/fileConfig/index.ts | 61 + src/api/infra/job/index.ts | 63 + src/api/infra/jobLog/index.ts | 33 + src/api/infra/redis/index.ts | 8 + src/api/infra/redis/types.ts | 176 ++ src/api/login/index.ts | 72 + src/api/login/oauth2/index.ts | 41 + src/api/login/types.ts | 28 + src/api/mes/index.ts | 0 src/api/redis/index.ts | 21 + src/api/scp/index.ts | 0 src/api/system/area/index.ts | 19 + src/api/system/dept/index.ts | 73 + src/api/system/dict/dict.data.ts | 49 + src/api/system/dict/dict.type.ts | 44 + src/api/system/errorCode/index.ts | 40 + src/api/system/loginLog/index.ts | 24 + src/api/system/mail/account/index.ts | 41 + src/api/system/mail/log/index.ts | 30 + src/api/system/mail/template/index.ts | 50 + src/api/system/menu/index.ts | 49 + src/api/system/notice/index.ts | 37 + src/api/system/notify/message/index.ts | 48 + src/api/system/notify/template/index.ts | 49 + src/api/system/oauth2/client.ts | 47 + src/api/system/oauth2/token.ts | 22 + src/api/system/operatelog/index.ts | 33 + src/api/system/permission/index.ts | 42 + src/api/system/post/index.ts | 46 + src/api/system/role/index.ts | 72 + src/api/system/sensitiveWord/index.ts | 58 + src/api/system/serialNumber/index.ts | 42 + src/api/system/sms/smsChannel/index.ts | 43 + src/api/system/sms/smsLog/index.ts | 39 + src/api/system/sms/smsTemplate/index.ts | 60 + src/api/system/sysconfig/index.ts | 50 + src/api/system/tenant/index.ts | 62 + src/api/system/tenantPackage/index.ts | 42 + src/api/system/user/index.ts | 76 + src/api/system/user/profile.ts | 77 + src/api/system/user/socialUser.ts | 31 + src/assets/imgs/Eyes-closed.png | Bin 0 -> 6454 bytes src/assets/imgs/avatar.gif | Bin 0 -> 6334 bytes src/assets/imgs/avatar.jpg | Bin 0 -> 6264 bytes src/assets/imgs/code.png | Bin 0 -> 4871 bytes src/assets/imgs/eye.png | Bin 0 -> 8173 bytes src/assets/imgs/icon1.png | Bin 0 -> 19605 bytes src/assets/imgs/icon2.png | Bin 0 -> 21783 bytes src/assets/imgs/icon3.png | Bin 0 -> 10459 bytes src/assets/imgs/icon4.png | Bin 0 -> 10750 bytes src/assets/imgs/icon5.png | Bin 0 -> 6387 bytes src/assets/imgs/icon6.png | Bin 0 -> 5382 bytes src/assets/imgs/logo.png | Bin 0 -> 16773 bytes src/assets/imgs/logo1.png | Bin 0 -> 4927 bytes src/assets/imgs/logo_w.png | Bin 0 -> 17324 bytes src/assets/imgs/profile.jpg | Bin 0 -> 7885 bytes src/assets/imgs/wechat.png | Bin 0 -> 1881 bytes src/assets/svgs/403.svg | 1 + src/assets/svgs/404.svg | 1 + src/assets/svgs/500.svg | 1 + src/assets/svgs/icon.svg | 1 + src/assets/svgs/login-bg.svg | 1 + src/assets/svgs/login-box-bg.svg | 1 + src/assets/svgs/member_balance.svg | 1 + .../svgs/member_expenditure_balance.svg | 1 + src/assets/svgs/member_level.svg | 1 + src/assets/svgs/member_point.svg | 1 + src/assets/svgs/member_recharge_balance.svg | 1 + src/assets/svgs/message.svg | 1 + src/assets/svgs/money.svg | 1 + src/assets/svgs/pay/icon/alipay_app.svg | 1 + src/assets/svgs/pay/icon/alipay_bar.svg | 2 + src/assets/svgs/pay/icon/alipay_pc.svg | 1 + src/assets/svgs/pay/icon/alipay_qr.svg | 2 + src/assets/svgs/pay/icon/alipay_wap.svg | 1 + src/assets/svgs/pay/icon/mock.svg | 1 + src/assets/svgs/pay/icon/wx_app.svg | 2 + src/assets/svgs/pay/icon/wx_bar.svg | 1 + src/assets/svgs/pay/icon/wx_lite.svg | 1 + src/assets/svgs/pay/icon/wx_native.svg | 1 + src/assets/svgs/pay/icon/wx_pub.svg | 2 + src/assets/svgs/peoples.svg | 1 + src/assets/svgs/shopping.svg | 1 + src/components/Annex/index.ts | 3 + src/components/Annex/src/Annex.vue | 127 ++ src/components/Backtop/index.ts | 3 + src/components/Backtop/src/Backtop.vue | 17 + src/components/BasicForm/index.ts | 3 + src/components/BasicForm/src/BasicForm.vue | 621 ++++++ src/components/Card/index.ts | 3 + src/components/Card/src/CardTitle.vue | 37 + src/components/ChangeRecord/index.ts | 3 + .../ChangeRecord/src/ChangeRecord.vue | 128 ++ src/components/ConfigGlobal/index.ts | 3 + .../ConfigGlobal/src/ConfigGlobal.vue | 63 + src/components/ContentDetailWrap/index.ts | 3 + .../src/ContentDetailWrap.vue | 58 + src/components/ContentWrap/index.ts | 3 + .../ContentWrap/src/ContentWrap.vue | 34 + src/components/CountTo/index.ts | 3 + src/components/CountTo/src/CountTo.vue | 182 ++ src/components/Crontab/index.ts | 2 + src/components/Crontab/src/Crontab.vue | 1011 +++++++++ src/components/Cropper/index.ts | 4 + src/components/Cropper/src/CopperModal.vue | 261 +++ src/components/Cropper/src/Cropper.vue | 183 ++ src/components/Cropper/src/CropperAvatar.vue | 142 ++ src/components/Cropper/src/types.ts | 8 + src/components/Descriptions/index.ts | 4 + .../Descriptions/src/Descriptions.vue | 186 ++ .../src/DescriptionsItemLabel.vue | 29 + src/components/Detail/index.ts | 3 + src/components/Detail/src/Detail.vue | 622 ++++++ .../Detail/src/DetailDeviceLedger.vue | 1020 +++++++++ src/components/Detail/src/approveDetail.vue | 576 +++++ src/components/DetailTable/index.ts | 3 + .../DetailTable/src/DetailTable.vue | 104 + src/components/Dialog/index.ts | 3 + src/components/Dialog/src/Dialog.vue | 162 ++ src/components/DictTag/index.ts | 3 + src/components/DictTag/src/DictTag.vue | 84 + src/components/DocAlert/index.vue | 34 + src/components/Echart/index.ts | 3 + src/components/Echart/src/Echart.vue | 115 + src/components/Editor/index.ts | 8 + src/components/Editor/src/Editor.vue | 202 ++ src/components/Error/index.ts | 3 + src/components/Error/src/Error.vue | 58 + src/components/Form/index.ts | 15 + src/components/Form/src/Form.vue | 372 ++++ src/components/Form/src/componentMap.ts | 55 + .../Form/src/components/useRenderCheckbox.tsx | 26 + .../Form/src/components/useRenderRadio.tsx | 26 + .../Form/src/components/useRenderSelect.tsx | 57 + src/components/Form/src/helper.ts | 148 ++ src/components/Form/src/types.ts | 17 + src/components/HeaderSearch/index.vue | 190 ++ src/components/Highlight/index.ts | 3 + src/components/Highlight/src/Highlight.vue | 65 + src/components/Icon/index.ts | 4 + src/components/Icon/src/Icon.vue | 85 + src/components/Icon/src/IconSelect.vue | 229 ++ src/components/Icon/src/data.ts | 1961 +++++++++++++++++ src/components/ImageViewer/index.ts | 33 + .../ImageViewer/src/ImageViewer.vue | 35 + src/components/ImageViewer/src/types.ts | 9 + src/components/ImportForm/index.ts | 3 + src/components/ImportForm/src/ImportForm.vue | 335 +++ .../ImportForm/src/SYMonthImportForm.vue | 335 +++ src/components/Infotip/index.ts | 3 + src/components/Infotip/src/Infotip.vue | 54 + src/components/InputPassword/index.ts | 3 + .../InputPassword/src/InputPassword.vue | 152 ++ src/components/Pagination/index.vue | 87 + src/components/Qrcode/index.ts | 3 + src/components/Qrcode/src/Qrcode.vue | 253 +++ src/components/Remarks/index.ts | 3 + src/components/Remarks/src/Remarks.vue | 119 + src/components/RouterSearch/index.vue | 76 + src/components/Search/index.ts | 3 + src/components/Search/src/Search.vue | 186 ++ src/components/SearchHigh/index.ts | 3 + src/components/SearchHigh/src/SearchHigh.vue | 342 +++ src/components/SearchTable/index.ts | 3 + .../SearchTable/src/SearchTable.vue | 176 ++ src/components/SearchTableCount/index.ts | 3 + .../SearchTableCount/src/SearchTableCount.vue | 222 ++ src/components/SearchTableItem/index.ts | 3 + .../SearchTableItem/src/SearchTableItem.vue | 144 ++ src/components/Sticky/index.ts | 3 + src/components/Sticky/src/Sticky.vue | 143 ++ src/components/Table/index.ts | 12 + src/components/Table/src/Table.vue | 342 +++ src/components/Table/src/helper.ts | 8 + src/components/Table/src/types.ts | 26 + src/components/TableForm/index.ts | 3 + src/components/TableForm/src/TableForm.vue | 475 ++++ src/components/TableFormCountPlan/index.ts | 3 + .../src/TableFormCountPlan.vue | 203 ++ src/components/TableHead/index.ts | 3 + src/components/TableHead/src/TableHead.vue | 160 ++ src/components/Tabs/index.ts | 3 + src/components/Tabs/src/Tabs.vue | 60 + src/components/Tooltip/index.ts | 3 + src/components/Tooltip/src/Tooltip.vue | 17 + src/components/UploadFile/index.ts | 5 + src/components/UploadFile/src/Preview.vue | 66 + src/components/UploadFile/src/UploadFile.vue | 202 ++ src/components/UploadFile/src/UploadImg.vue | 272 +++ src/components/UploadFile/src/UploadImgs.vue | 311 +++ src/components/Verifition/index.ts | 3 + src/components/Verifition/src/Verify.vue | 441 ++++ .../Verifition/src/Verify/VerifyPoints.vue | 250 +++ .../Verifition/src/Verify/VerifySlide.vue | 376 ++++ src/components/Verifition/src/Verify/index.ts | 4 + src/components/Verifition/src/utils/ase.ts | 14 + src/components/Verifition/src/utils/util.ts | 97 + src/components/XButton/index.ts | 5 + src/components/XButton/src/ButtonBase.vue | 97 + src/components/XButton/src/XButton.vue | 50 + src/components/XButton/src/XTextButton.vue | 49 + .../package/designer/ProcessDesigner.vue | 704 ++++++ .../package/designer/ProcessViewer.vue | 635 ++++++ .../package/designer/index.ts | 8 + .../package/designer/index2.ts | 8 + .../plugins/content-pad/contentPadProvider.js | 423 ++++ .../designer/plugins/content-pad/index.js | 6 + .../package/designer/plugins/defaultEmpty.js | 24 + .../descriptor/activitiDescriptor.json | 994 +++++++++ .../plugins/descriptor/camundaDescriptor.json | 1010 +++++++++ .../descriptor/flowableDescriptor.json | 1207 ++++++++++ .../activiti/activitiExtension.js | 83 + .../extension-moddle/activiti/index.js | 11 + .../extension-moddle/camunda/extension.js | 151 ++ .../plugins/extension-moddle/camunda/index.js | 8 + .../flowable/flowableExtension.js | 83 + .../extension-moddle/flowable/index.js | 10 + .../designer/plugins/palette/CustomPalette.js | 221 ++ .../package/designer/plugins/palette/index.js | 22 + .../plugins/palette/paletteProvider.js | 213 ++ .../plugins/translate/customTranslate.js | 44 + .../package/designer/plugins/translate/zh.js | 240 ++ .../bpmnProcessDesigner/package/index.ts | 11 + .../package/palette/ProcessPalette.vue | 45 + .../package/penal/PropertiesPanel.vue | 211 ++ .../package/penal/base/ElementBaseInfo.vue | 184 ++ .../penal/flow-condition/FlowCondition.vue | 191 ++ .../package/penal/form/ElementForm.vue | 465 ++++ .../package/penal/index.js | 7 + .../penal/listeners/ElementListeners.vue | 403 ++++ .../penal/listeners/UserTaskListeners.vue | 451 ++++ .../package/penal/listeners/template.js | 178 ++ .../package/penal/listeners/utilSelf.ts | 62 + .../multi-instance/ElementMultiInstance.vue | 254 +++ .../penal/other/ElementOtherConfig.vue | 55 + .../penal/properties/ElementProperties.vue | 169 ++ .../penal/signal-message/SignalAndMessage.vue | 113 + .../package/penal/task/ElementTask.vue | 86 + .../task/task-components/ReceiveTask.vue | 125 ++ .../penal/task/task-components/ScriptTask.vue | 99 + .../penal/task/task-components/UserTask.vue | 98 + .../package/theme/element-variables.scss | 70 + .../package/theme/index.scss | 2 + .../package/theme/process-designer.scss | 161 ++ .../package/theme/process-panel.scss | 107 + .../bpmnProcessDesigner/package/utils.ts | 77 + .../src/highlight/index.js | 5 + .../modules/custom-renderer/CustomRenderer.js | 14 + .../src/modules/custom-renderer/index.js | 6 + .../src/modules/rules/CustomRules.js | 16 + .../src/modules/rules/index.js | 6 + .../bpmnProcessDesigner/src/translations.ts | 25 + .../src/utils/directive/clickOutSide.js | 39 + .../bpmnProcessDesigner/src/utils/index.js | 10 + .../bpmnProcessDesigner/src/utils/xml2json.js | 50 + src/components/iFrame/index.ts | 3 + src/components/iFrame/src/IFrame.vue | 68 + src/components/index.ts | 6 + src/components/rowDrop/index.vue | 236 ++ src/config/axios/config.ts | 28 + src/config/axios/errorCode.ts | 6 + src/config/axios/index.ts | 61 + src/config/axios/service.ts | 239 ++ src/directives/index.ts | 13 + src/directives/permission/hasPermi.ts | 27 + src/directives/permission/hasRole.ts | 30 + src/hooks/event/useScrollTo.ts | 60 + src/hooks/web/useCache.ts | 27 + src/hooks/web/useConfigGlobal.ts | 9 + src/hooks/web/useCrudSchemas.ts | 374 ++++ src/hooks/web/useDesign.ts | 18 + src/hooks/web/useEmitt.ts | 22 + src/hooks/web/useForm.ts | 94 + src/hooks/web/useI18n.ts | 53 + src/hooks/web/useIcon.ts | 8 + src/hooks/web/useIntro.ts | 47 + src/hooks/web/useLocale.ts | 35 + src/hooks/web/useMessage.ts | 95 + src/hooks/web/useNProgress.ts | 33 + src/hooks/web/usePageLoading.ts | 18 + src/hooks/web/useTable.ts | 242 ++ src/hooks/web/useTimeAgo.ts | 49 + src/hooks/web/useTitle.ts | 24 + src/hooks/web/useValidator.ts | 62 + src/hooks/web/useWatermark.ts | 55 + src/layout/Layout.vue | 78 + src/layout/components/AppView.vue | 61 + src/layout/components/Breadcrumb/index.ts | 3 + .../components/Breadcrumb/src/Breadcrumb.vue | 128 ++ .../components/Breadcrumb/src/helper.ts | 31 + src/layout/components/Collapse/index.ts | 3 + .../components/Collapse/src/Collapse.vue | 36 + src/layout/components/ContextMenu/index.ts | 10 + .../ContextMenu/src/ContextMenu.vue | 76 + src/layout/components/Footer/index.ts | 3 + src/layout/components/Footer/src/Footer.vue | 24 + src/layout/components/LocaleDropdown/index.ts | 3 + .../LocaleDropdown/src/LocaleDropdown.vue | 52 + src/layout/components/Logo/index.ts | 3 + src/layout/components/Logo/src/Logo.vue | 88 + src/layout/components/Menu/index.ts | 3 + src/layout/components/Menu/src/Menu.vue | 290 +++ .../Menu/src/components/useRenderMenuItem.tsx | 59 + .../src/components/useRenderMenuTitle.tsx | 22 + src/layout/components/Menu/src/helper.ts | 54 + src/layout/components/Message/index.ts | 3 + src/layout/components/Message/src/Message.vue | 125 ++ src/layout/components/Screenfull/index.ts | 3 + .../components/Screenfull/src/Screenfull.vue | 32 + src/layout/components/Setting/index.ts | 3 + src/layout/components/Setting/src/Setting.vue | 299 +++ .../src/components/ColorRadioPicker.vue | 67 + .../src/components/InterfaceDisplay.vue | 224 ++ .../src/components/LayoutRadioPicker.vue | 172 ++ src/layout/components/SizeDropdown/index.ts | 3 + .../SizeDropdown/src/SizeDropdown.vue | 40 + src/layout/components/TabMenu/index.ts | 3 + src/layout/components/TabMenu/src/TabMenu.vue | 240 ++ src/layout/components/TabMenu/src/helper.ts | 51 + src/layout/components/TagsView/index.ts | 3 + .../components/TagsView/src/TagsView.vue | 585 +++++ src/layout/components/TagsView/src/helper.ts | 21 + src/layout/components/ThemeSwitch/index.ts | 3 + .../ThemeSwitch/src/ThemeSwitch.vue | 46 + src/layout/components/ToolHeader.vue | 91 + src/layout/components/UserInfo/index.ts | 3 + .../components/UserInfo/src/UserInfo.vue | 78 + src/layout/components/useRenderLayout.tsx | 306 +++ src/locales/en-US.ts | 460 ++++ src/locales/zh-CN.ts | 468 ++++ src/main.ts | 76 + src/permission.ts | 70 + src/plugins/animate.css/index.ts | 1 + src/plugins/echarts/index.ts | 45 + src/plugins/elementPlus/index.ts | 17 + src/plugins/formCreate/index.ts | 43 + src/plugins/svgIcon/index.ts | 3 + src/plugins/tongji/index.ts | 23 + src/plugins/unocss/index.ts | 1 + src/plugins/vueI18n/helper.ts | 3 + src/plugins/vueI18n/index.ts | 42 + src/router/index.ts | 28 + src/router/modules/remaining.ts | 370 ++++ src/store/index.ts | 10 + src/store/modules/app.ts | 274 +++ src/store/modules/dict.ts | 104 + src/store/modules/locale.ts | 59 + src/store/modules/permission.ts | 67 + src/store/modules/tagsView.ts | 140 ++ src/store/modules/user.ts | 91 + src/styles/global.module.scss | 6 + src/styles/index.scss | 35 + src/styles/theme.scss | 6 + src/styles/var.css | 66 + src/styles/variables.scss | 4 + src/types/components.d.ts | 56 + src/types/configGlobal.d.ts | 4 + src/types/contextMenu.d.ts | 7 + src/types/descriptions.d.ts | 13 + src/types/elementPlus.d.ts | 3 + src/types/form.d.ts | 44 + src/types/icon.d.ts | 5 + src/types/infoTip.d.ts | 4 + src/types/layout.d.ts | 1 + src/types/localeDropdown.d.ts | 10 + src/types/qrcode.d.ts | 9 + src/types/table.d.ts | 44 + src/types/tableForm.d.ts | 44 + src/types/theme.d.ts | 16 + src/utils/Logger.ts | 100 + src/utils/auth.ts | 92 + src/utils/color.ts | 153 ++ src/utils/constants.ts | 360 +++ src/utils/dict.ts | 311 +++ src/utils/disposition/defaultButtons.ts | 1103 +++++++++ src/utils/disposition/formFields.ts | 1954 ++++++++++++++++ src/utils/disposition/tableDetailsColumns.ts | 1431 ++++++++++++ src/utils/disposition/tableSummaryColumns.ts | 100 + src/utils/disposition/tabsList.ts | 61 + src/utils/domUtils.ts | 289 +++ src/utils/download.ts | 38 + src/utils/filt.ts | 157 ++ src/utils/formCreate.ts | 54 + src/utils/formRules.ts | 7 + src/utils/formatTime.ts | 232 ++ src/utils/formatter.ts | 12 + src/utils/index.ts | 245 ++ src/utils/is.ts | 105 + src/utils/jsencrypt.ts | 31 + src/utils/permission.ts | 45 + src/utils/propTypes.ts | 28 + src/utils/routerHelper.ts | 238 ++ src/utils/tree.ts | 399 ++++ src/utils/tsxHelper.ts | 16 + src/utils/validator.ts | 803 +++++++ src/views/bpm/definition/index.vue | 174 ++ src/views/bpm/form/editor/index.vue | 119 + src/views/bpm/form/index.vue | 165 ++ src/views/bpm/group/UserGroupForm.vue | 132 ++ src/views/bpm/group/index.vue | 149 ++ src/views/bpm/model/ModelForm.vue | 230 ++ src/views/bpm/model/ModelImportForm.vue | 140 ++ src/views/bpm/model/editor/index.vue | 105 + src/views/bpm/model/index.vue | 314 +++ src/views/bpm/oa/leave/create.vue | 89 + src/views/bpm/oa/leave/detail.vue | 51 + src/views/bpm/oa/leave/index.vue | 175 ++ .../bpm/processInstance/create/index.vue | 133 ++ .../detail/ProcessInstanceBpmnViewer.vue | 57 + .../detail/ProcessInstanceTaskList.vue | 97 + .../detail/TaskReturnDialogForm.vue | 90 + .../detail/TaskUpdateAssigneeForm.vue | 83 + .../bpm/processInstance/detail/index.vue | 285 +++ src/views/bpm/processInstance/index.vue | 186 ++ src/views/bpm/task/done/TaskDetail.vue | 51 + src/views/bpm/task/done/index.vue | 125 ++ src/views/bpm/task/todo/index.vue | 112 + .../bpm/taskAssignRule/TaskAssignRuleForm.vue | 250 +++ src/views/bpm/taskAssignRule/index.vue | 136 ++ .../basciYearEquipment.data.ts | 98 + .../eam/basic/basciYearEquipment/index.vue | 274 +++ .../basicMonthEquipment.data.ts | 71 + .../eam/basic/basicMonthEquipment/index.vue | 242 ++ .../eam/basic/classType/classType.data.ts | 176 ++ src/views/eam/basic/classType/index.vue | 244 ++ .../eam/basic/deviceItem/deviceItem.data.ts | 43 + src/views/eam/basic/deviceItem/index.vue | 228 ++ .../deviceMaintenance.data.ts | 225 ++ .../eam/basic/deviceMaintenance/index.vue | 352 +++ .../deviceMoldItemsHistory.data.ts | 183 ++ .../basic/deviceMoldItemsHistory/index.vue | 244 ++ .../eam/basic/factoryArea/factoryArea.data.ts | 85 + src/views/eam/basic/factoryArea/index.vue | 203 ++ .../eam/basic/fixedAssets/fixedAssets.data.ts | 239 ++ src/views/eam/basic/fixedAssets/index.vue | 260 +++ src/views/eam/basic/inspection/index.vue | 314 +++ .../eam/basic/inspection/inspection.data.ts | 166 ++ src/views/eam/basic/item/index.vue | 250 +++ src/views/eam/basic/item/item.data.ts | 312 +++ src/views/eam/basic/location/index.vue | 217 ++ src/views/eam/basic/location/location.data.ts | 152 ++ src/views/eam/basic/locationArea/index.vue | 219 ++ .../basic/locationArea/locationArea.data.ts | 100 + src/views/eam/basic/moldInspection/index.vue | 224 ++ .../moldInspection/moldInspection.data.ts | 166 ++ src/views/eam/basic/moldMaintenance/index.vue | 359 +++ .../moldMaintenance/moldMaintenance.data.ts | 224 ++ src/views/eam/basic/supplier/index.vue | 209 ++ src/views/eam/basic/supplier/supplier.data.ts | 105 + .../deviceAccounts/deviceAccounts.data.ts | 367 +++ src/views/eam/device/deviceAccounts/index.vue | 455 ++++ .../device/deviceAllot/deviceAllot.data.ts | 138 ++ src/views/eam/device/deviceAllot/index.vue | 231 ++ .../deviceInternalAudit.data.ts | 332 +++ .../eam/device/deviceInternalAudit/index.vue | 244 ++ .../deviceMaintainPlan.data.ts | 115 + .../eam/device/deviceMaintainPlan/index.vue | 244 ++ .../device/deviceRepair/deviceRepair.data.ts | 255 +++ src/views/eam/device/deviceRepair/index.vue | 329 +++ .../deviceSpotInspectionRecordMain.data.ts | 264 +++ .../deviceSpotInspectionRecordMain/index.vue | 552 +++++ .../deviceInspectionMain.data.ts | 656 ++++++ .../eam/device/deviceinspectionjob/index.vue | 691 ++++++ .../deviceMaintainOrderMain.data.ts | 538 +++++ .../eam/device/devicemaintainjob/index.vue | 659 ++++++ .../deviceMaintenanceMain.data.ts | 948 ++++++++ .../eam/device/devicemaintenancejob/index.vue | 1232 +++++++++++ src/views/eam/device/problemSolving/index.vue | 260 +++ .../problemSolving/problemSolving.data.ts | 82 + .../item/adjustRecord/adjustRecord.data.ts | 189 ++ src/views/eam/item/adjustRecord/index.vue | 322 +++ .../applicationRecordMain.data.ts | 329 +++ .../eam/item/applicationRecord/index.vue | 309 +++ .../eam/item/countRecord/countRecord.data.ts | 242 ++ src/views/eam/item/countRecord/index.vue | 339 +++ .../countadjustPlan/countadjustPlan.data.ts | 78 + src/views/eam/item/countadjustPlan/index.vue | 244 ++ .../countadjustWork/countadjustWork.data.ts | 156 ++ src/views/eam/item/countadjustWork/index.vue | 306 +++ src/views/eam/item/itemAccounts/index.vue | 288 +++ .../item/itemAccounts/itemAccounts.data.ts | 312 +++ src/views/eam/item/itemApplyMain/index.vue | 362 +++ .../item/itemApplyMain/itemApplyMain.data.ts | 337 +++ src/views/eam/item/itemInLocation/index.vue | 224 ++ .../itemInLocation/itemInLocation.data.ts | 53 + .../eam/item/itemLocationRecord/index.vue | 244 ++ .../itemLocationRecord.data.ts | 111 + .../eam/item/itemLocationReplace/index.vue | 244 ++ .../itemLocationReplace.data.ts | 55 + src/views/eam/item/itemMaintenance/index.vue | 243 ++ .../itemMaintenance/itemMaintenance.data.ts | 110 + src/views/eam/item/itemOrderMain/index.vue | 304 +++ .../item/itemOrderMain/itemOrderMain.data.ts | 310 +++ src/views/eam/item/itemOutLocation/index.vue | 243 ++ .../itemOutLocation/itemOutLocation.data.ts | 53 + src/views/eam/item/replaceItemDes/index.vue | 217 ++ .../replaceItemDes/replaceItemDes.data.ts | 81 + src/views/eam/item/transaction/index.vue | 241 ++ .../eam/item/transaction/transaction.data.ts | 94 + src/views/eam/mold/moldAccounts/index.vue | 477 ++++ .../mold/moldAccounts/moldAccounts.data.ts | 343 +++ src/views/eam/mold/moldMaintainPlan/index.vue | 244 ++ .../moldMaintainPlan/moldMaintainPlan.data.ts | 116 + src/views/eam/mold/moldRepair/index.vue | 308 +++ .../eam/mold/moldRepair/moldRepair.data.ts | 195 ++ .../moldSpotInspectionRecordMain/index.vue | 539 +++++ .../moldSpotInspectionRecordMain.data.ts | 265 +++ .../eam/mold/moldinspectionjob/index.vue | 680 ++++++ .../moldInspectionMain.data.ts | 646 ++++++ src/views/eam/mold/moldmaintainjob/index.vue | 648 ++++++ .../moldMaintainOrderMain.data.ts | 580 +++++ .../eam/mold/moldmaintenancejob/index.vue | 1188 ++++++++++ .../moldMaintenanceMain.data.ts | 899 ++++++++ src/views/error/403.vue | 8 + src/views/error/404.vue | 7 + src/views/error/500.vue | 7 + src/views/home/echarts-data.ts | 740 +++++++ src/views/home/index.vue | 742 +++++++ src/views/home/types.ts | 55 + .../infra/apiAccessLog/ApiAccessLogDetail.vue | 67 + src/views/infra/apiAccessLog/index.vue | 167 ++ .../infra/apiErrorLog/ApiErrorLogDetail.vue | 81 + src/views/infra/apiErrorLog/index.vue | 249 +++ src/views/infra/build/index.vue | 143 ++ src/views/infra/codegen/PreviewCode.vue | 222 ++ .../codegen/components/BasicInfoForm.vue | 87 + .../codegen/components/ColumInfoForm.vue | 153 ++ .../codegen/components/GenerateInfoForm.vue | 391 ++++ src/views/infra/codegen/components/index.ts | 4 + src/views/infra/codegen/editTable.vue | 83 + src/views/infra/codegen/importTable.vue | 151 ++ src/views/infra/codegen/index.vue | 258 +++ src/views/infra/config/ConfigForm.vue | 131 ++ src/views/infra/config/index.vue | 169 ++ src/views/infra/customInterface/index.vue | 21 + .../dataSourceConfig/DataSourceConfigForm.vue | 111 + src/views/infra/dataSourceConfig/index.vue | 87 + src/views/infra/dbDoc/index.vue | 57 + src/views/infra/druid/index.vue | 25 + src/views/infra/file/FileForm.vue | 104 + src/views/infra/file/index.vue | 164 ++ src/views/infra/fileConfig/FileConfigForm.vue | 195 ++ src/views/infra/fileConfig/index.vue | 168 ++ src/views/infra/job/JobDetail.vue | 73 + src/views/infra/job/JobForm.vue | 131 ++ src/views/infra/job/index.vue | 255 +++ src/views/infra/job/logger/JobLogDetail.vue | 59 + src/views/infra/job/logger/index.vue | 196 ++ src/views/infra/redis/index.vue | 266 +++ src/views/infra/server/index.vue | 28 + src/views/infra/skywalking/index.vue | 25 + src/views/infra/swagger/index.vue | 26 + src/views/infra/testDemo/index.vue | 4 + src/views/infra/webSocket/index.vue | 118 + src/views/login/components/LoginForm.vue | 278 +++ src/views/login/components/LoginFormTitle.vue | 26 + src/views/login/components/MobileForm.vue | 225 ++ src/views/login/components/QrCodeForm.vue | 30 + src/views/login/components/RegisterForm.vue | 142 ++ src/views/login/components/SSOLogin.vue | 199 ++ src/views/login/components/index.ts | 8 + src/views/login/components/useLogin.ts | 42 + src/views/login/login.vue | 104 + src/views/profile/components/BasicInfo.vue | 92 + src/views/profile/components/ProfileUser.vue | 99 + src/views/profile/components/ResetPwd.vue | 73 + src/views/profile/components/UserAvatar.vue | 39 + src/views/profile/components/UserSocial.vue | 94 + src/views/profile/components/index.ts | 7 + src/views/profile/index.vue | 64 + src/views/redirect/redirect.vue | 28 + src/views/report/goview/index.vue | 10 + src/views/report/jmreport/index.vue | 13 + src/views/system/area/AreaForm.vue | 72 + src/views/system/area/index.vue | 73 + src/views/system/dept/DeptForm.vue | 286 +++ src/views/system/dept/index.vue | 165 ++ src/views/system/dict/DictTypeForm.vue | 124 ++ src/views/system/dict/data/DictDataForm.vue | 183 ++ src/views/system/dict/data/index.vue | 210 ++ src/views/system/dict/index.vue | 175 ++ src/views/system/errorCode/ErrorCodeForm.vue | 112 + src/views/system/errorCode/index.vue | 171 ++ src/views/system/loginlog/LoginLogDetail.vue | 51 + src/views/system/loginlog/index.vue | 140 ++ .../system/mail/account/MailAccountDetail.vue | 28 + .../system/mail/account/MailAccountForm.vue | 68 + src/views/system/mail/account/account.data.ts | 76 + src/views/system/mail/account/index.vue | 80 + src/views/system/mail/log/MailLogDetail.vue | 33 + src/views/system/mail/log/index.vue | 62 + src/views/system/mail/log/log.data.ts | 133 ++ .../system/mail/template/MailTemplateForm.vue | 74 + .../mail/template/MailTemplateSendForm.vue | 115 + src/views/system/mail/template/index.vue | 84 + .../system/mail/template/template.data.ts | 113 + src/views/system/menu/MenuForm.vue | 256 +++ src/views/system/menu/index.vue | 276 +++ src/views/system/notice/NoticeForm.vue | 132 ++ src/views/system/notice/index.vue | 136 ++ .../notify/message/NotifyMessageDetail.vue | 66 + src/views/system/notify/message/index.vue | 142 ++ .../notify/my/MyNotifyMessageDetail.vue | 48 + src/views/system/notify/my/index.vue | 216 ++ .../notify/template/NotifyTemplateForm.vue | 141 ++ .../template/NotifyTemplateSendForm.vue | 129 ++ src/views/system/notify/template/index.vue | 164 ++ src/views/system/oauth2/client/ClientForm.vue | 266 +++ src/views/system/oauth2/client/index.vue | 150 ++ src/views/system/oauth2/token/index.vue | 122 + .../system/operatelog/OperateLogDetail.vue | 82 + src/views/system/operatelog/index.vue | 159 ++ src/views/system/post/PostForm.vue | 125 ++ src/views/system/post/index.vue | 157 ++ src/views/system/role/RoleAssignMenuForm.vue | 160 ++ .../system/role/RoleDataPermissionForm.vue | 167 ++ src/views/system/role/RoleForm.vue | 126 ++ src/views/system/role/index.vue | 264 +++ src/views/system/role/role.data.ts | 83 + .../sensitiveWord/SensitiveWordForm.vue | 131 ++ .../sensitiveWord/SensitiveWordTestForm.vue | 91 + src/views/system/sensitiveWord/index.vue | 191 ++ .../system/serialNumber/SerialNumberForm.vue | 124 ++ src/views/system/serialNumber/index.vue | 182 ++ .../system/sms/channel/SmsChannelForm.vue | 144 ++ src/views/system/sms/channel/index.vue | 144 ++ src/views/system/sms/log/SmsLogDetail.vue | 89 + src/views/system/sms/log/index.vue | 193 ++ .../system/sms/template/SmsTemplateForm.vue | 163 ++ .../sms/template/SmsTemplateSendForm.vue | 120 + src/views/system/sms/template/index.vue | 213 ++ src/views/system/sysconfig/config.data.ts | 100 + src/views/system/sysconfig/index.vue | 243 ++ src/views/system/tenant/TenantForm.vue | 188 ++ src/views/system/tenant/index.vue | 192 ++ .../tenantPackage/TenantPackageForm.vue | 194 ++ src/views/system/tenantPackage/index.vue | 138 ++ src/views/system/user/DeptTree.vue | 63 + src/views/system/user/UserAssignRoleForm.vue | 96 + src/views/system/user/UserForm.vue | 218 ++ src/views/system/user/UserImportForm.vue | 135 ++ src/views/system/user/index.vue | 260 +++ stylelint.config.js | 233 ++ tsconfig.json | 45 + types/components.d.ts | 8 + types/custom-types.d.ts | 27 + types/env.d.ts | 32 + types/global.d.ts | 50 + types/router.d.ts | 81 + uno.config.ts | 105 + vite.config.ts | 81 + 757 files changed, 99889 insertions(+) create mode 100644 .editorconfig create mode 100644 .env create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .env.test create mode 100644 .eslintignore create mode 100644 .eslintrc-auto-import.json create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .stylelintignore create mode 100644 Dockerfile create mode 100644 Dockerfile_prod create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build/vite/index.ts create mode 100644 build/vite/optimize.ts create mode 100644 index.html create mode 100644 nginx.conf create mode 100644 nginx_prod.conf create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 prettier.config.js create mode 100644 public/favicon.ico create mode 100644 public/home.png create mode 100644 public/logo.gif create mode 100644 src/App.vue create mode 100644 src/api/bpm/activity/index.ts create mode 100644 src/api/bpm/definition/index.ts create mode 100644 src/api/bpm/form/index.ts create mode 100644 src/api/bpm/leave/index.ts create mode 100644 src/api/bpm/model/index.ts create mode 100644 src/api/bpm/processInstance/index.ts create mode 100644 src/api/bpm/task/index.ts create mode 100644 src/api/bpm/taskAssignRule/index.ts create mode 100644 src/api/bpm/userGroup/index.ts create mode 100644 src/api/eam/basic/basciYearEquipment/index.ts create mode 100644 src/api/eam/basic/basicMonthEquipment/index.ts create mode 100644 src/api/eam/basic/classType/index.ts create mode 100644 src/api/eam/basic/deviceMaintenance/index.ts create mode 100644 src/api/eam/basic/deviceMoldItemsHistory/index.ts create mode 100644 src/api/eam/basic/factoryArea/index.ts create mode 100644 src/api/eam/basic/fixedAssets/index.ts create mode 100644 src/api/eam/basic/inspection/index.ts create mode 100644 src/api/eam/basic/item/index.ts create mode 100644 src/api/eam/basic/location/index.ts create mode 100644 src/api/eam/basic/locationArea/index.ts create mode 100644 src/api/eam/basic/moldInspection/index.ts create mode 100644 src/api/eam/basic/moldMaintenance/index.ts create mode 100644 src/api/eam/basic/moldMilestone/index.ts create mode 100644 src/api/eam/basic/rel/index.ts create mode 100644 src/api/eam/basic/supplier/index.ts create mode 100644 src/api/eam/device/deviceAccounts/index.ts create mode 100644 src/api/eam/device/deviceAllot/index.ts create mode 100644 src/api/eam/device/deviceInspectionDetail/index.ts create mode 100644 src/api/eam/device/deviceInspectionMain/index.ts create mode 100644 src/api/eam/device/deviceInternalAudit/index.ts create mode 100644 src/api/eam/device/deviceMaintainOrderDetail/index.ts create mode 100644 src/api/eam/device/deviceMaintainOrderMain/index.ts create mode 100644 src/api/eam/device/deviceMaintainPlan/index.ts create mode 100644 src/api/eam/device/deviceMaintenanceDetail/index.ts create mode 100644 src/api/eam/device/deviceMaintenanceMain/index.ts create mode 100644 src/api/eam/device/deviceRepair/index.ts create mode 100644 src/api/eam/device/deviceSpotInspectionRecordDetail/index.ts create mode 100644 src/api/eam/device/deviceSpotInspectionRecordMain/index.ts create mode 100644 src/api/eam/device/problemSolving/index.ts create mode 100644 src/api/eam/item/adjustRecordDetail/index.ts create mode 100644 src/api/eam/item/adjustRecordMain/index.ts create mode 100644 src/api/eam/item/applicationRecordDetail/index.ts create mode 100644 src/api/eam/item/applicationRecordMain/index.ts create mode 100644 src/api/eam/item/countJobDetail/index.ts create mode 100644 src/api/eam/item/countJobMain/index.ts create mode 100644 src/api/eam/item/countRecordDetail/index.ts create mode 100644 src/api/eam/item/countRecordMain/index.ts create mode 100644 src/api/eam/item/countadjustPlan/index.ts create mode 100644 src/api/eam/item/itemAccounts/index.ts create mode 100644 src/api/eam/item/itemApplyDetail/index.ts create mode 100644 src/api/eam/item/itemApplyMain/index.ts create mode 100644 src/api/eam/item/itemInLocation/index.ts create mode 100644 src/api/eam/item/itemLocationRecord/index.ts create mode 100644 src/api/eam/item/itemLocationReplace/index.ts create mode 100644 src/api/eam/item/itemMaintenance/index.ts create mode 100644 src/api/eam/item/itemOrderDetail/index.ts create mode 100644 src/api/eam/item/itemOrderMain/index.ts create mode 100644 src/api/eam/item/itemOutLocation/index.ts create mode 100644 src/api/eam/item/replaceItemDes/index.ts create mode 100644 src/api/eam/item/transaction/index.ts create mode 100644 src/api/eam/mold/moldAccounts/index.ts create mode 100644 src/api/eam/mold/moldInspectionDetail/index.ts create mode 100644 src/api/eam/mold/moldInspectionMain/index.ts create mode 100644 src/api/eam/mold/moldMaintainOrderDetail/index.ts create mode 100644 src/api/eam/mold/moldMaintainOrderMain/index.ts create mode 100644 src/api/eam/mold/moldMaintainPlan/index.ts create mode 100644 src/api/eam/mold/moldMaintenanceDetail/index.ts create mode 100644 src/api/eam/mold/moldMaintenanceMain/index.ts create mode 100644 src/api/eam/mold/moldRepair/index.ts create mode 100644 src/api/eam/mold/moldSpotInspectionRecordMain/index.ts create mode 100644 src/api/eam/upload/index.ts create mode 100644 src/api/home/index.ts create mode 100644 src/api/infra/apiAccessLog/index.ts create mode 100644 src/api/infra/apiErrorLog/index.ts create mode 100644 src/api/infra/codegen/index.ts create mode 100644 src/api/infra/config/index.ts create mode 100644 src/api/infra/dataSourceConfig/index.ts create mode 100644 src/api/infra/dbDoc/index.ts create mode 100644 src/api/infra/file/index.ts create mode 100644 src/api/infra/fileConfig/index.ts create mode 100644 src/api/infra/job/index.ts create mode 100644 src/api/infra/jobLog/index.ts create mode 100644 src/api/infra/redis/index.ts create mode 100644 src/api/infra/redis/types.ts create mode 100644 src/api/login/index.ts create mode 100644 src/api/login/oauth2/index.ts create mode 100644 src/api/login/types.ts create mode 100644 src/api/mes/index.ts create mode 100644 src/api/redis/index.ts create mode 100644 src/api/scp/index.ts create mode 100644 src/api/system/area/index.ts create mode 100644 src/api/system/dept/index.ts create mode 100644 src/api/system/dict/dict.data.ts create mode 100644 src/api/system/dict/dict.type.ts create mode 100644 src/api/system/errorCode/index.ts create mode 100644 src/api/system/loginLog/index.ts create mode 100644 src/api/system/mail/account/index.ts create mode 100644 src/api/system/mail/log/index.ts create mode 100644 src/api/system/mail/template/index.ts create mode 100644 src/api/system/menu/index.ts create mode 100644 src/api/system/notice/index.ts create mode 100644 src/api/system/notify/message/index.ts create mode 100644 src/api/system/notify/template/index.ts create mode 100644 src/api/system/oauth2/client.ts create mode 100644 src/api/system/oauth2/token.ts create mode 100644 src/api/system/operatelog/index.ts create mode 100644 src/api/system/permission/index.ts create mode 100644 src/api/system/post/index.ts create mode 100644 src/api/system/role/index.ts create mode 100644 src/api/system/sensitiveWord/index.ts create mode 100644 src/api/system/serialNumber/index.ts create mode 100644 src/api/system/sms/smsChannel/index.ts create mode 100644 src/api/system/sms/smsLog/index.ts create mode 100644 src/api/system/sms/smsTemplate/index.ts create mode 100644 src/api/system/sysconfig/index.ts create mode 100644 src/api/system/tenant/index.ts create mode 100644 src/api/system/tenantPackage/index.ts create mode 100644 src/api/system/user/index.ts create mode 100644 src/api/system/user/profile.ts create mode 100644 src/api/system/user/socialUser.ts create mode 100644 src/assets/imgs/Eyes-closed.png create mode 100644 src/assets/imgs/avatar.gif create mode 100644 src/assets/imgs/avatar.jpg create mode 100644 src/assets/imgs/code.png create mode 100644 src/assets/imgs/eye.png create mode 100644 src/assets/imgs/icon1.png create mode 100644 src/assets/imgs/icon2.png create mode 100644 src/assets/imgs/icon3.png create mode 100644 src/assets/imgs/icon4.png create mode 100644 src/assets/imgs/icon5.png create mode 100644 src/assets/imgs/icon6.png create mode 100644 src/assets/imgs/logo.png create mode 100644 src/assets/imgs/logo1.png create mode 100644 src/assets/imgs/logo_w.png create mode 100644 src/assets/imgs/profile.jpg create mode 100644 src/assets/imgs/wechat.png create mode 100644 src/assets/svgs/403.svg create mode 100644 src/assets/svgs/404.svg create mode 100644 src/assets/svgs/500.svg create mode 100644 src/assets/svgs/icon.svg create mode 100644 src/assets/svgs/login-bg.svg create mode 100644 src/assets/svgs/login-box-bg.svg create mode 100644 src/assets/svgs/member_balance.svg create mode 100644 src/assets/svgs/member_expenditure_balance.svg create mode 100644 src/assets/svgs/member_level.svg create mode 100644 src/assets/svgs/member_point.svg create mode 100644 src/assets/svgs/member_recharge_balance.svg create mode 100644 src/assets/svgs/message.svg create mode 100644 src/assets/svgs/money.svg create mode 100644 src/assets/svgs/pay/icon/alipay_app.svg create mode 100644 src/assets/svgs/pay/icon/alipay_bar.svg create mode 100644 src/assets/svgs/pay/icon/alipay_pc.svg create mode 100644 src/assets/svgs/pay/icon/alipay_qr.svg create mode 100644 src/assets/svgs/pay/icon/alipay_wap.svg create mode 100644 src/assets/svgs/pay/icon/mock.svg create mode 100644 src/assets/svgs/pay/icon/wx_app.svg create mode 100644 src/assets/svgs/pay/icon/wx_bar.svg create mode 100644 src/assets/svgs/pay/icon/wx_lite.svg create mode 100644 src/assets/svgs/pay/icon/wx_native.svg create mode 100644 src/assets/svgs/pay/icon/wx_pub.svg create mode 100644 src/assets/svgs/peoples.svg create mode 100644 src/assets/svgs/shopping.svg create mode 100644 src/components/Annex/index.ts create mode 100644 src/components/Annex/src/Annex.vue create mode 100644 src/components/Backtop/index.ts create mode 100644 src/components/Backtop/src/Backtop.vue create mode 100644 src/components/BasicForm/index.ts create mode 100644 src/components/BasicForm/src/BasicForm.vue create mode 100644 src/components/Card/index.ts create mode 100644 src/components/Card/src/CardTitle.vue create mode 100644 src/components/ChangeRecord/index.ts create mode 100644 src/components/ChangeRecord/src/ChangeRecord.vue create mode 100644 src/components/ConfigGlobal/index.ts create mode 100644 src/components/ConfigGlobal/src/ConfigGlobal.vue create mode 100644 src/components/ContentDetailWrap/index.ts create mode 100644 src/components/ContentDetailWrap/src/ContentDetailWrap.vue create mode 100644 src/components/ContentWrap/index.ts create mode 100644 src/components/ContentWrap/src/ContentWrap.vue create mode 100644 src/components/CountTo/index.ts create mode 100644 src/components/CountTo/src/CountTo.vue create mode 100644 src/components/Crontab/index.ts create mode 100644 src/components/Crontab/src/Crontab.vue create mode 100644 src/components/Cropper/index.ts create mode 100644 src/components/Cropper/src/CopperModal.vue create mode 100644 src/components/Cropper/src/Cropper.vue create mode 100644 src/components/Cropper/src/CropperAvatar.vue create mode 100644 src/components/Cropper/src/types.ts create mode 100644 src/components/Descriptions/index.ts create mode 100644 src/components/Descriptions/src/Descriptions.vue create mode 100644 src/components/Descriptions/src/DescriptionsItemLabel.vue create mode 100644 src/components/Detail/index.ts create mode 100644 src/components/Detail/src/Detail.vue create mode 100644 src/components/Detail/src/DetailDeviceLedger.vue create mode 100644 src/components/Detail/src/approveDetail.vue create mode 100644 src/components/DetailTable/index.ts create mode 100644 src/components/DetailTable/src/DetailTable.vue create mode 100644 src/components/Dialog/index.ts create mode 100644 src/components/Dialog/src/Dialog.vue create mode 100644 src/components/DictTag/index.ts create mode 100644 src/components/DictTag/src/DictTag.vue create mode 100644 src/components/DocAlert/index.vue create mode 100644 src/components/Echart/index.ts create mode 100644 src/components/Echart/src/Echart.vue create mode 100644 src/components/Editor/index.ts create mode 100644 src/components/Editor/src/Editor.vue create mode 100644 src/components/Error/index.ts create mode 100644 src/components/Error/src/Error.vue create mode 100644 src/components/Form/index.ts create mode 100644 src/components/Form/src/Form.vue create mode 100644 src/components/Form/src/componentMap.ts create mode 100644 src/components/Form/src/components/useRenderCheckbox.tsx create mode 100644 src/components/Form/src/components/useRenderRadio.tsx create mode 100644 src/components/Form/src/components/useRenderSelect.tsx create mode 100644 src/components/Form/src/helper.ts create mode 100644 src/components/Form/src/types.ts create mode 100644 src/components/HeaderSearch/index.vue create mode 100644 src/components/Highlight/index.ts create mode 100644 src/components/Highlight/src/Highlight.vue create mode 100644 src/components/Icon/index.ts create mode 100644 src/components/Icon/src/Icon.vue create mode 100644 src/components/Icon/src/IconSelect.vue create mode 100644 src/components/Icon/src/data.ts create mode 100644 src/components/ImageViewer/index.ts create mode 100644 src/components/ImageViewer/src/ImageViewer.vue create mode 100644 src/components/ImageViewer/src/types.ts create mode 100644 src/components/ImportForm/index.ts create mode 100644 src/components/ImportForm/src/ImportForm.vue create mode 100644 src/components/ImportForm/src/SYMonthImportForm.vue create mode 100644 src/components/Infotip/index.ts create mode 100644 src/components/Infotip/src/Infotip.vue create mode 100644 src/components/InputPassword/index.ts create mode 100644 src/components/InputPassword/src/InputPassword.vue create mode 100644 src/components/Pagination/index.vue create mode 100644 src/components/Qrcode/index.ts create mode 100644 src/components/Qrcode/src/Qrcode.vue create mode 100644 src/components/Remarks/index.ts create mode 100644 src/components/Remarks/src/Remarks.vue create mode 100644 src/components/RouterSearch/index.vue create mode 100644 src/components/Search/index.ts create mode 100644 src/components/Search/src/Search.vue create mode 100644 src/components/SearchHigh/index.ts create mode 100644 src/components/SearchHigh/src/SearchHigh.vue create mode 100644 src/components/SearchTable/index.ts create mode 100644 src/components/SearchTable/src/SearchTable.vue create mode 100644 src/components/SearchTableCount/index.ts create mode 100644 src/components/SearchTableCount/src/SearchTableCount.vue create mode 100644 src/components/SearchTableItem/index.ts create mode 100644 src/components/SearchTableItem/src/SearchTableItem.vue create mode 100644 src/components/Sticky/index.ts create mode 100644 src/components/Sticky/src/Sticky.vue create mode 100644 src/components/Table/index.ts create mode 100644 src/components/Table/src/Table.vue create mode 100644 src/components/Table/src/helper.ts create mode 100644 src/components/Table/src/types.ts create mode 100644 src/components/TableForm/index.ts create mode 100644 src/components/TableForm/src/TableForm.vue create mode 100644 src/components/TableFormCountPlan/index.ts create mode 100644 src/components/TableFormCountPlan/src/TableFormCountPlan.vue create mode 100644 src/components/TableHead/index.ts create mode 100644 src/components/TableHead/src/TableHead.vue create mode 100644 src/components/Tabs/index.ts create mode 100644 src/components/Tabs/src/Tabs.vue create mode 100644 src/components/Tooltip/index.ts create mode 100644 src/components/Tooltip/src/Tooltip.vue create mode 100644 src/components/UploadFile/index.ts create mode 100644 src/components/UploadFile/src/Preview.vue create mode 100644 src/components/UploadFile/src/UploadFile.vue create mode 100644 src/components/UploadFile/src/UploadImg.vue create mode 100644 src/components/UploadFile/src/UploadImgs.vue create mode 100644 src/components/Verifition/index.ts create mode 100644 src/components/Verifition/src/Verify.vue create mode 100644 src/components/Verifition/src/Verify/VerifyPoints.vue create mode 100644 src/components/Verifition/src/Verify/VerifySlide.vue create mode 100644 src/components/Verifition/src/Verify/index.ts create mode 100644 src/components/Verifition/src/utils/ase.ts create mode 100644 src/components/Verifition/src/utils/util.ts create mode 100644 src/components/XButton/index.ts create mode 100644 src/components/XButton/src/ButtonBase.vue create mode 100644 src/components/XButton/src/XButton.vue create mode 100644 src/components/XButton/src/XTextButton.vue create mode 100644 src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue create mode 100644 src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue create mode 100644 src/components/bpmnProcessDesigner/package/designer/index.ts create mode 100644 src/components/bpmnProcessDesigner/package/designer/index2.ts create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/content-pad/contentPadProvider.js create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/content-pad/index.js create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/defaultEmpty.js create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/activitiDescriptor.json create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/camundaDescriptor.json create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/activiti/activitiExtension.js create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/activiti/index.js create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/camunda/extension.js create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/camunda/index.js create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/flowable/flowableExtension.js create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/flowable/index.js create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/palette/CustomPalette.js create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/palette/index.js create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/palette/paletteProvider.js create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/translate/customTranslate.js create mode 100644 src/components/bpmnProcessDesigner/package/designer/plugins/translate/zh.js create mode 100644 src/components/bpmnProcessDesigner/package/index.ts create mode 100644 src/components/bpmnProcessDesigner/package/palette/ProcessPalette.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/base/ElementBaseInfo.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/flow-condition/FlowCondition.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/form/ElementForm.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/index.js create mode 100644 src/components/bpmnProcessDesigner/package/penal/listeners/ElementListeners.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/listeners/UserTaskListeners.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/listeners/template.js create mode 100644 src/components/bpmnProcessDesigner/package/penal/listeners/utilSelf.ts create mode 100644 src/components/bpmnProcessDesigner/package/penal/multi-instance/ElementMultiInstance.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/other/ElementOtherConfig.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/properties/ElementProperties.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/signal-message/SignalAndMessage.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/task/ElementTask.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/task/task-components/ReceiveTask.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/task/task-components/ScriptTask.vue create mode 100644 src/components/bpmnProcessDesigner/package/penal/task/task-components/UserTask.vue create mode 100644 src/components/bpmnProcessDesigner/package/theme/element-variables.scss create mode 100644 src/components/bpmnProcessDesigner/package/theme/index.scss create mode 100644 src/components/bpmnProcessDesigner/package/theme/process-designer.scss create mode 100644 src/components/bpmnProcessDesigner/package/theme/process-panel.scss create mode 100644 src/components/bpmnProcessDesigner/package/utils.ts create mode 100644 src/components/bpmnProcessDesigner/src/highlight/index.js create mode 100644 src/components/bpmnProcessDesigner/src/modules/custom-renderer/CustomRenderer.js create mode 100644 src/components/bpmnProcessDesigner/src/modules/custom-renderer/index.js create mode 100644 src/components/bpmnProcessDesigner/src/modules/rules/CustomRules.js create mode 100644 src/components/bpmnProcessDesigner/src/modules/rules/index.js create mode 100644 src/components/bpmnProcessDesigner/src/translations.ts create mode 100644 src/components/bpmnProcessDesigner/src/utils/directive/clickOutSide.js create mode 100644 src/components/bpmnProcessDesigner/src/utils/index.js create mode 100644 src/components/bpmnProcessDesigner/src/utils/xml2json.js create mode 100644 src/components/iFrame/index.ts create mode 100644 src/components/iFrame/src/IFrame.vue create mode 100644 src/components/index.ts create mode 100644 src/components/rowDrop/index.vue create mode 100644 src/config/axios/config.ts create mode 100644 src/config/axios/errorCode.ts create mode 100644 src/config/axios/index.ts create mode 100644 src/config/axios/service.ts create mode 100644 src/directives/index.ts create mode 100644 src/directives/permission/hasPermi.ts create mode 100644 src/directives/permission/hasRole.ts create mode 100644 src/hooks/event/useScrollTo.ts create mode 100644 src/hooks/web/useCache.ts create mode 100644 src/hooks/web/useConfigGlobal.ts create mode 100644 src/hooks/web/useCrudSchemas.ts create mode 100644 src/hooks/web/useDesign.ts create mode 100644 src/hooks/web/useEmitt.ts create mode 100644 src/hooks/web/useForm.ts create mode 100644 src/hooks/web/useI18n.ts create mode 100644 src/hooks/web/useIcon.ts create mode 100644 src/hooks/web/useIntro.ts create mode 100644 src/hooks/web/useLocale.ts create mode 100644 src/hooks/web/useMessage.ts create mode 100644 src/hooks/web/useNProgress.ts create mode 100644 src/hooks/web/usePageLoading.ts create mode 100644 src/hooks/web/useTable.ts create mode 100644 src/hooks/web/useTimeAgo.ts create mode 100644 src/hooks/web/useTitle.ts create mode 100644 src/hooks/web/useValidator.ts create mode 100644 src/hooks/web/useWatermark.ts create mode 100644 src/layout/Layout.vue create mode 100644 src/layout/components/AppView.vue create mode 100644 src/layout/components/Breadcrumb/index.ts create mode 100644 src/layout/components/Breadcrumb/src/Breadcrumb.vue create mode 100644 src/layout/components/Breadcrumb/src/helper.ts create mode 100644 src/layout/components/Collapse/index.ts create mode 100644 src/layout/components/Collapse/src/Collapse.vue create mode 100644 src/layout/components/ContextMenu/index.ts create mode 100644 src/layout/components/ContextMenu/src/ContextMenu.vue create mode 100644 src/layout/components/Footer/index.ts create mode 100644 src/layout/components/Footer/src/Footer.vue create mode 100644 src/layout/components/LocaleDropdown/index.ts create mode 100644 src/layout/components/LocaleDropdown/src/LocaleDropdown.vue create mode 100644 src/layout/components/Logo/index.ts create mode 100644 src/layout/components/Logo/src/Logo.vue create mode 100644 src/layout/components/Menu/index.ts create mode 100644 src/layout/components/Menu/src/Menu.vue create mode 100644 src/layout/components/Menu/src/components/useRenderMenuItem.tsx create mode 100644 src/layout/components/Menu/src/components/useRenderMenuTitle.tsx create mode 100644 src/layout/components/Menu/src/helper.ts create mode 100644 src/layout/components/Message/index.ts create mode 100644 src/layout/components/Message/src/Message.vue create mode 100644 src/layout/components/Screenfull/index.ts create mode 100644 src/layout/components/Screenfull/src/Screenfull.vue create mode 100644 src/layout/components/Setting/index.ts create mode 100644 src/layout/components/Setting/src/Setting.vue create mode 100644 src/layout/components/Setting/src/components/ColorRadioPicker.vue create mode 100644 src/layout/components/Setting/src/components/InterfaceDisplay.vue create mode 100644 src/layout/components/Setting/src/components/LayoutRadioPicker.vue create mode 100644 src/layout/components/SizeDropdown/index.ts create mode 100644 src/layout/components/SizeDropdown/src/SizeDropdown.vue create mode 100644 src/layout/components/TabMenu/index.ts create mode 100644 src/layout/components/TabMenu/src/TabMenu.vue create mode 100644 src/layout/components/TabMenu/src/helper.ts create mode 100644 src/layout/components/TagsView/index.ts create mode 100644 src/layout/components/TagsView/src/TagsView.vue create mode 100644 src/layout/components/TagsView/src/helper.ts create mode 100644 src/layout/components/ThemeSwitch/index.ts create mode 100644 src/layout/components/ThemeSwitch/src/ThemeSwitch.vue create mode 100644 src/layout/components/ToolHeader.vue create mode 100644 src/layout/components/UserInfo/index.ts create mode 100644 src/layout/components/UserInfo/src/UserInfo.vue create mode 100644 src/layout/components/useRenderLayout.tsx create mode 100644 src/locales/en-US.ts create mode 100644 src/locales/zh-CN.ts create mode 100644 src/main.ts create mode 100644 src/permission.ts create mode 100644 src/plugins/animate.css/index.ts create mode 100644 src/plugins/echarts/index.ts create mode 100644 src/plugins/elementPlus/index.ts create mode 100644 src/plugins/formCreate/index.ts create mode 100644 src/plugins/svgIcon/index.ts create mode 100644 src/plugins/tongji/index.ts create mode 100644 src/plugins/unocss/index.ts create mode 100644 src/plugins/vueI18n/helper.ts create mode 100644 src/plugins/vueI18n/index.ts create mode 100644 src/router/index.ts create mode 100644 src/router/modules/remaining.ts create mode 100644 src/store/index.ts create mode 100644 src/store/modules/app.ts create mode 100644 src/store/modules/dict.ts create mode 100644 src/store/modules/locale.ts create mode 100644 src/store/modules/permission.ts create mode 100644 src/store/modules/tagsView.ts create mode 100644 src/store/modules/user.ts create mode 100644 src/styles/global.module.scss create mode 100644 src/styles/index.scss create mode 100644 src/styles/theme.scss create mode 100644 src/styles/var.css create mode 100644 src/styles/variables.scss create mode 100644 src/types/components.d.ts create mode 100644 src/types/configGlobal.d.ts create mode 100644 src/types/contextMenu.d.ts create mode 100644 src/types/descriptions.d.ts create mode 100644 src/types/elementPlus.d.ts create mode 100644 src/types/form.d.ts create mode 100644 src/types/icon.d.ts create mode 100644 src/types/infoTip.d.ts create mode 100644 src/types/layout.d.ts create mode 100644 src/types/localeDropdown.d.ts create mode 100644 src/types/qrcode.d.ts create mode 100644 src/types/table.d.ts create mode 100644 src/types/tableForm.d.ts create mode 100644 src/types/theme.d.ts create mode 100644 src/utils/Logger.ts create mode 100644 src/utils/auth.ts create mode 100644 src/utils/color.ts create mode 100644 src/utils/constants.ts create mode 100644 src/utils/dict.ts create mode 100644 src/utils/disposition/defaultButtons.ts create mode 100644 src/utils/disposition/formFields.ts create mode 100644 src/utils/disposition/tableDetailsColumns.ts create mode 100644 src/utils/disposition/tableSummaryColumns.ts create mode 100644 src/utils/disposition/tabsList.ts create mode 100644 src/utils/domUtils.ts create mode 100644 src/utils/download.ts create mode 100644 src/utils/filt.ts create mode 100644 src/utils/formCreate.ts create mode 100644 src/utils/formRules.ts create mode 100644 src/utils/formatTime.ts create mode 100644 src/utils/formatter.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/is.ts create mode 100644 src/utils/jsencrypt.ts create mode 100644 src/utils/permission.ts create mode 100644 src/utils/propTypes.ts create mode 100644 src/utils/routerHelper.ts create mode 100644 src/utils/tree.ts create mode 100644 src/utils/tsxHelper.ts create mode 100644 src/utils/validator.ts create mode 100644 src/views/bpm/definition/index.vue create mode 100644 src/views/bpm/form/editor/index.vue create mode 100644 src/views/bpm/form/index.vue create mode 100644 src/views/bpm/group/UserGroupForm.vue create mode 100644 src/views/bpm/group/index.vue create mode 100644 src/views/bpm/model/ModelForm.vue create mode 100644 src/views/bpm/model/ModelImportForm.vue create mode 100644 src/views/bpm/model/editor/index.vue create mode 100644 src/views/bpm/model/index.vue create mode 100644 src/views/bpm/oa/leave/create.vue create mode 100644 src/views/bpm/oa/leave/detail.vue create mode 100644 src/views/bpm/oa/leave/index.vue create mode 100644 src/views/bpm/processInstance/create/index.vue create mode 100644 src/views/bpm/processInstance/detail/ProcessInstanceBpmnViewer.vue create mode 100644 src/views/bpm/processInstance/detail/ProcessInstanceTaskList.vue create mode 100644 src/views/bpm/processInstance/detail/TaskReturnDialogForm.vue create mode 100644 src/views/bpm/processInstance/detail/TaskUpdateAssigneeForm.vue create mode 100644 src/views/bpm/processInstance/detail/index.vue create mode 100644 src/views/bpm/processInstance/index.vue create mode 100644 src/views/bpm/task/done/TaskDetail.vue create mode 100644 src/views/bpm/task/done/index.vue create mode 100644 src/views/bpm/task/todo/index.vue create mode 100644 src/views/bpm/taskAssignRule/TaskAssignRuleForm.vue create mode 100644 src/views/bpm/taskAssignRule/index.vue create mode 100644 src/views/eam/basic/basciYearEquipment/basciYearEquipment.data.ts create mode 100644 src/views/eam/basic/basciYearEquipment/index.vue create mode 100644 src/views/eam/basic/basicMonthEquipment/basicMonthEquipment.data.ts create mode 100644 src/views/eam/basic/basicMonthEquipment/index.vue create mode 100644 src/views/eam/basic/classType/classType.data.ts create mode 100644 src/views/eam/basic/classType/index.vue create mode 100644 src/views/eam/basic/deviceItem/deviceItem.data.ts create mode 100644 src/views/eam/basic/deviceItem/index.vue create mode 100644 src/views/eam/basic/deviceMaintenance/deviceMaintenance.data.ts create mode 100644 src/views/eam/basic/deviceMaintenance/index.vue create mode 100644 src/views/eam/basic/deviceMoldItemsHistory/deviceMoldItemsHistory.data.ts create mode 100644 src/views/eam/basic/deviceMoldItemsHistory/index.vue create mode 100644 src/views/eam/basic/factoryArea/factoryArea.data.ts create mode 100644 src/views/eam/basic/factoryArea/index.vue create mode 100644 src/views/eam/basic/fixedAssets/fixedAssets.data.ts create mode 100644 src/views/eam/basic/fixedAssets/index.vue create mode 100644 src/views/eam/basic/inspection/index.vue create mode 100644 src/views/eam/basic/inspection/inspection.data.ts create mode 100644 src/views/eam/basic/item/index.vue create mode 100644 src/views/eam/basic/item/item.data.ts create mode 100644 src/views/eam/basic/location/index.vue create mode 100644 src/views/eam/basic/location/location.data.ts create mode 100644 src/views/eam/basic/locationArea/index.vue create mode 100644 src/views/eam/basic/locationArea/locationArea.data.ts create mode 100644 src/views/eam/basic/moldInspection/index.vue create mode 100644 src/views/eam/basic/moldInspection/moldInspection.data.ts create mode 100644 src/views/eam/basic/moldMaintenance/index.vue create mode 100644 src/views/eam/basic/moldMaintenance/moldMaintenance.data.ts create mode 100644 src/views/eam/basic/supplier/index.vue create mode 100644 src/views/eam/basic/supplier/supplier.data.ts create mode 100644 src/views/eam/device/deviceAccounts/deviceAccounts.data.ts create mode 100644 src/views/eam/device/deviceAccounts/index.vue create mode 100644 src/views/eam/device/deviceAllot/deviceAllot.data.ts create mode 100644 src/views/eam/device/deviceAllot/index.vue create mode 100644 src/views/eam/device/deviceInternalAudit/deviceInternalAudit.data.ts create mode 100644 src/views/eam/device/deviceInternalAudit/index.vue create mode 100644 src/views/eam/device/deviceMaintainPlan/deviceMaintainPlan.data.ts create mode 100644 src/views/eam/device/deviceMaintainPlan/index.vue create mode 100644 src/views/eam/device/deviceRepair/deviceRepair.data.ts create mode 100644 src/views/eam/device/deviceRepair/index.vue create mode 100644 src/views/eam/device/deviceSpotInspectionRecordMain/deviceSpotInspectionRecordMain.data.ts create mode 100644 src/views/eam/device/deviceSpotInspectionRecordMain/index.vue create mode 100644 src/views/eam/device/deviceinspectionjob/deviceInspectionMain.data.ts create mode 100644 src/views/eam/device/deviceinspectionjob/index.vue create mode 100644 src/views/eam/device/devicemaintainjob/deviceMaintainOrderMain.data.ts create mode 100644 src/views/eam/device/devicemaintainjob/index.vue create mode 100644 src/views/eam/device/devicemaintenancejob/deviceMaintenanceMain.data.ts create mode 100644 src/views/eam/device/devicemaintenancejob/index.vue create mode 100644 src/views/eam/device/problemSolving/index.vue create mode 100644 src/views/eam/device/problemSolving/problemSolving.data.ts create mode 100644 src/views/eam/item/adjustRecord/adjustRecord.data.ts create mode 100644 src/views/eam/item/adjustRecord/index.vue create mode 100644 src/views/eam/item/applicationRecord/applicationRecordMain.data.ts create mode 100644 src/views/eam/item/applicationRecord/index.vue create mode 100644 src/views/eam/item/countRecord/countRecord.data.ts create mode 100644 src/views/eam/item/countRecord/index.vue create mode 100644 src/views/eam/item/countadjustPlan/countadjustPlan.data.ts create mode 100644 src/views/eam/item/countadjustPlan/index.vue create mode 100644 src/views/eam/item/countadjustWork/countadjustWork.data.ts create mode 100644 src/views/eam/item/countadjustWork/index.vue create mode 100644 src/views/eam/item/itemAccounts/index.vue create mode 100644 src/views/eam/item/itemAccounts/itemAccounts.data.ts create mode 100644 src/views/eam/item/itemApplyMain/index.vue create mode 100644 src/views/eam/item/itemApplyMain/itemApplyMain.data.ts create mode 100644 src/views/eam/item/itemInLocation/index.vue create mode 100644 src/views/eam/item/itemInLocation/itemInLocation.data.ts create mode 100644 src/views/eam/item/itemLocationRecord/index.vue create mode 100644 src/views/eam/item/itemLocationRecord/itemLocationRecord.data.ts create mode 100644 src/views/eam/item/itemLocationReplace/index.vue create mode 100644 src/views/eam/item/itemLocationReplace/itemLocationReplace.data.ts create mode 100644 src/views/eam/item/itemMaintenance/index.vue create mode 100644 src/views/eam/item/itemMaintenance/itemMaintenance.data.ts create mode 100644 src/views/eam/item/itemOrderMain/index.vue create mode 100644 src/views/eam/item/itemOrderMain/itemOrderMain.data.ts create mode 100644 src/views/eam/item/itemOutLocation/index.vue create mode 100644 src/views/eam/item/itemOutLocation/itemOutLocation.data.ts create mode 100644 src/views/eam/item/replaceItemDes/index.vue create mode 100644 src/views/eam/item/replaceItemDes/replaceItemDes.data.ts create mode 100644 src/views/eam/item/transaction/index.vue create mode 100644 src/views/eam/item/transaction/transaction.data.ts create mode 100644 src/views/eam/mold/moldAccounts/index.vue create mode 100644 src/views/eam/mold/moldAccounts/moldAccounts.data.ts create mode 100644 src/views/eam/mold/moldMaintainPlan/index.vue create mode 100644 src/views/eam/mold/moldMaintainPlan/moldMaintainPlan.data.ts create mode 100644 src/views/eam/mold/moldRepair/index.vue create mode 100644 src/views/eam/mold/moldRepair/moldRepair.data.ts create mode 100644 src/views/eam/mold/moldSpotInspectionRecordMain/index.vue create mode 100644 src/views/eam/mold/moldSpotInspectionRecordMain/moldSpotInspectionRecordMain.data.ts create mode 100644 src/views/eam/mold/moldinspectionjob/index.vue create mode 100644 src/views/eam/mold/moldinspectionjob/moldInspectionMain.data.ts create mode 100644 src/views/eam/mold/moldmaintainjob/index.vue create mode 100644 src/views/eam/mold/moldmaintainjob/moldMaintainOrderMain.data.ts create mode 100644 src/views/eam/mold/moldmaintenancejob/index.vue create mode 100644 src/views/eam/mold/moldmaintenancejob/moldMaintenanceMain.data.ts create mode 100644 src/views/error/403.vue create mode 100644 src/views/error/404.vue create mode 100644 src/views/error/500.vue create mode 100644 src/views/home/echarts-data.ts create mode 100644 src/views/home/index.vue create mode 100644 src/views/home/types.ts create mode 100644 src/views/infra/apiAccessLog/ApiAccessLogDetail.vue create mode 100644 src/views/infra/apiAccessLog/index.vue create mode 100644 src/views/infra/apiErrorLog/ApiErrorLogDetail.vue create mode 100644 src/views/infra/apiErrorLog/index.vue create mode 100644 src/views/infra/build/index.vue create mode 100644 src/views/infra/codegen/PreviewCode.vue create mode 100644 src/views/infra/codegen/components/BasicInfoForm.vue create mode 100644 src/views/infra/codegen/components/ColumInfoForm.vue create mode 100644 src/views/infra/codegen/components/GenerateInfoForm.vue create mode 100644 src/views/infra/codegen/components/index.ts create mode 100644 src/views/infra/codegen/editTable.vue create mode 100644 src/views/infra/codegen/importTable.vue create mode 100644 src/views/infra/codegen/index.vue create mode 100644 src/views/infra/config/ConfigForm.vue create mode 100644 src/views/infra/config/index.vue create mode 100644 src/views/infra/customInterface/index.vue create mode 100644 src/views/infra/dataSourceConfig/DataSourceConfigForm.vue create mode 100644 src/views/infra/dataSourceConfig/index.vue create mode 100644 src/views/infra/dbDoc/index.vue create mode 100644 src/views/infra/druid/index.vue create mode 100644 src/views/infra/file/FileForm.vue create mode 100644 src/views/infra/file/index.vue create mode 100644 src/views/infra/fileConfig/FileConfigForm.vue create mode 100644 src/views/infra/fileConfig/index.vue create mode 100644 src/views/infra/job/JobDetail.vue create mode 100644 src/views/infra/job/JobForm.vue create mode 100644 src/views/infra/job/index.vue create mode 100644 src/views/infra/job/logger/JobLogDetail.vue create mode 100644 src/views/infra/job/logger/index.vue create mode 100644 src/views/infra/redis/index.vue create mode 100644 src/views/infra/server/index.vue create mode 100644 src/views/infra/skywalking/index.vue create mode 100644 src/views/infra/swagger/index.vue create mode 100644 src/views/infra/testDemo/index.vue create mode 100644 src/views/infra/webSocket/index.vue create mode 100644 src/views/login/components/LoginForm.vue create mode 100644 src/views/login/components/LoginFormTitle.vue create mode 100644 src/views/login/components/MobileForm.vue create mode 100644 src/views/login/components/QrCodeForm.vue create mode 100644 src/views/login/components/RegisterForm.vue create mode 100644 src/views/login/components/SSOLogin.vue create mode 100644 src/views/login/components/index.ts create mode 100644 src/views/login/components/useLogin.ts create mode 100644 src/views/login/login.vue create mode 100644 src/views/profile/components/BasicInfo.vue create mode 100644 src/views/profile/components/ProfileUser.vue create mode 100644 src/views/profile/components/ResetPwd.vue create mode 100644 src/views/profile/components/UserAvatar.vue create mode 100644 src/views/profile/components/UserSocial.vue create mode 100644 src/views/profile/components/index.ts create mode 100644 src/views/profile/index.vue create mode 100644 src/views/redirect/redirect.vue create mode 100644 src/views/report/goview/index.vue create mode 100644 src/views/report/jmreport/index.vue create mode 100644 src/views/system/area/AreaForm.vue create mode 100644 src/views/system/area/index.vue create mode 100644 src/views/system/dept/DeptForm.vue create mode 100644 src/views/system/dept/index.vue create mode 100644 src/views/system/dict/DictTypeForm.vue create mode 100644 src/views/system/dict/data/DictDataForm.vue create mode 100644 src/views/system/dict/data/index.vue create mode 100644 src/views/system/dict/index.vue create mode 100644 src/views/system/errorCode/ErrorCodeForm.vue create mode 100644 src/views/system/errorCode/index.vue create mode 100644 src/views/system/loginlog/LoginLogDetail.vue create mode 100644 src/views/system/loginlog/index.vue create mode 100644 src/views/system/mail/account/MailAccountDetail.vue create mode 100644 src/views/system/mail/account/MailAccountForm.vue create mode 100644 src/views/system/mail/account/account.data.ts create mode 100644 src/views/system/mail/account/index.vue create mode 100644 src/views/system/mail/log/MailLogDetail.vue create mode 100644 src/views/system/mail/log/index.vue create mode 100644 src/views/system/mail/log/log.data.ts create mode 100644 src/views/system/mail/template/MailTemplateForm.vue create mode 100644 src/views/system/mail/template/MailTemplateSendForm.vue create mode 100644 src/views/system/mail/template/index.vue create mode 100644 src/views/system/mail/template/template.data.ts create mode 100644 src/views/system/menu/MenuForm.vue create mode 100644 src/views/system/menu/index.vue create mode 100644 src/views/system/notice/NoticeForm.vue create mode 100644 src/views/system/notice/index.vue create mode 100644 src/views/system/notify/message/NotifyMessageDetail.vue create mode 100644 src/views/system/notify/message/index.vue create mode 100644 src/views/system/notify/my/MyNotifyMessageDetail.vue create mode 100644 src/views/system/notify/my/index.vue create mode 100644 src/views/system/notify/template/NotifyTemplateForm.vue create mode 100644 src/views/system/notify/template/NotifyTemplateSendForm.vue create mode 100644 src/views/system/notify/template/index.vue create mode 100644 src/views/system/oauth2/client/ClientForm.vue create mode 100644 src/views/system/oauth2/client/index.vue create mode 100644 src/views/system/oauth2/token/index.vue create mode 100644 src/views/system/operatelog/OperateLogDetail.vue create mode 100644 src/views/system/operatelog/index.vue create mode 100644 src/views/system/post/PostForm.vue create mode 100644 src/views/system/post/index.vue create mode 100644 src/views/system/role/RoleAssignMenuForm.vue create mode 100644 src/views/system/role/RoleDataPermissionForm.vue create mode 100644 src/views/system/role/RoleForm.vue create mode 100644 src/views/system/role/index.vue create mode 100644 src/views/system/role/role.data.ts create mode 100644 src/views/system/sensitiveWord/SensitiveWordForm.vue create mode 100644 src/views/system/sensitiveWord/SensitiveWordTestForm.vue create mode 100644 src/views/system/sensitiveWord/index.vue create mode 100644 src/views/system/serialNumber/SerialNumberForm.vue create mode 100644 src/views/system/serialNumber/index.vue create mode 100644 src/views/system/sms/channel/SmsChannelForm.vue create mode 100644 src/views/system/sms/channel/index.vue create mode 100644 src/views/system/sms/log/SmsLogDetail.vue create mode 100644 src/views/system/sms/log/index.vue create mode 100644 src/views/system/sms/template/SmsTemplateForm.vue create mode 100644 src/views/system/sms/template/SmsTemplateSendForm.vue create mode 100644 src/views/system/sms/template/index.vue create mode 100644 src/views/system/sysconfig/config.data.ts create mode 100644 src/views/system/sysconfig/index.vue create mode 100644 src/views/system/tenant/TenantForm.vue create mode 100644 src/views/system/tenant/index.vue create mode 100644 src/views/system/tenantPackage/TenantPackageForm.vue create mode 100644 src/views/system/tenantPackage/index.vue create mode 100644 src/views/system/user/DeptTree.vue create mode 100644 src/views/system/user/UserAssignRoleForm.vue create mode 100644 src/views/system/user/UserForm.vue create mode 100644 src/views/system/user/UserImportForm.vue create mode 100644 src/views/system/user/index.vue create mode 100644 stylelint.config.js create mode 100644 tsconfig.json create mode 100644 types/components.d.ts create mode 100644 types/custom-types.d.ts create mode 100644 types/env.d.ts create mode 100644 types/global.d.ts create mode 100644 types/router.d.ts create mode 100644 uno.config.ts create mode 100644 vite.config.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..dccf841 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +root = true + +[*] +charset=utf-8 +end_of_line=lf +insert_final_newline=true +indent_style=space +indent_size=2 +max_line_length = 100 + +[*.{yml,yaml,json}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab diff --git a/.env b/.env new file mode 100644 index 0000000..2308eb6 --- /dev/null +++ b/.env @@ -0,0 +1,17 @@ +# 标题 +VITE_APP_TITLE=闻荫管理系统 + +# 项目本地运行端口号 +VITE_PORT=80 + +# open 运行 npm run dev 时自动打开浏览器 +VITE_OPEN=true + +# 租户开关 +VITE_APP_TENANT_ENABLE=true + +# 验证码的开关 +VITE_APP_CAPTCHA_ENABLE=true + +# 百度统计 +VITE_APP_BAIDU_CODE = a1ff8825baa73c3a78eb96aa40325abc diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..5c1f646 --- /dev/null +++ b/.env.development @@ -0,0 +1,38 @@ +# 开发环境 +NODE_ENV=development + +VITE_DEV=false + +# 请求路径 +VITE_BASE_URL='http://localhost:12080' +# VITE_BASE_URL='http://192.168.0.165:12080' + +# 上传路径 +VITE_UPLOAD_URL='http://localhost:12080/admin-api/infra/file/upload' + +# 接口前缀 +VITE_API_BASEPATH=/dev-api + +# 接口地址 +VITE_API_URL=/admin-api + +# 打包路径 +VITE_BASE_PATH=/ + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=false + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 输出路径 +VITE_OUT_DIR=dist + +# 自定义接口路径 +VITE_INTERFACE_URL='http://localhost:12080/magic/web/index.html' + +# 积木报表请求路径 +VITE_JMREPORT_BASE_URL='http://localhost:12080' \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..edd9cb1 --- /dev/null +++ b/.env.production @@ -0,0 +1,37 @@ +# 生产环境 +NODE_ENV=test + +VITE_DEV=false + +# 请求路径 +VITE_BASE_URL='http://10.62.139.32:80/api' + +# 上传路径 +VITE_UPLOAD_URL='http://10.62.139.32:80/api/admin-api/infra/file/upload' + +# 接口前缀 +VITE_API_BASEPATH= + +# 接口地址 +VITE_API_URL=/admin-api + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=true + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 打包路径 +VITE_BASE_PATH=/ + +# 输出路径 +VITE_OUT_DIR=eam + +# 自定义接口路径 +VITE_INTERFACE_URL='http://10.62.139.32:80/magic/web/index.html' + +# 积木报表请求路径 +VITE_JMREPORT_BASE_URL='http://10.62.139.32:80' diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..f8d316c --- /dev/null +++ b/.env.test @@ -0,0 +1,37 @@ +# 生产环境 +NODE_ENV=test + +VITE_DEV=false + +# 请求路径 +VITE_BASE_URL='http://dev.ccwin-in.com:25200/api' + +# 上传路径 +VITE_UPLOAD_URL='http://dev.ccwin-in.com:25200/api/admin-api/infra/file/upload' + +# 接口前缀 +VITE_API_BASEPATH= + +# 接口地址 +VITE_API_URL=/admin-api + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=true + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 打包路径 +VITE_BASE_PATH=/ + +# 输出路径 +VITE_OUT_DIR=eam + +# 自定义接口路径 +VITE_INTERFACE_URL='http://dev.ccwin-in.com:25210/magic/web/index.html' + +# 积木报表请求路径 +VITE_JMREPORT_BASE_URL='http://dev.ccwin-in.com:25210' diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..1e85c0f --- /dev/null +++ b/.eslintignore @@ -0,0 +1,8 @@ +/build/ +/config/ +/dist/ +/*.js +/test/unit/coverage/ +/node_modules/* +/dist* +/src/main.ts diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json new file mode 100644 index 0000000..024c96a --- /dev/null +++ b/.eslintrc-auto-import.json @@ -0,0 +1,259 @@ +{ + "globals": { + "EffectScope": true, + "ElMessage": true, + "ElMessageBox": true, + "ElTag": true, + "asyncComputed": true, + "autoResetRef": true, + "computed": true, + "computedAsync": true, + "computedEager": true, + "computedInject": true, + "computedWithControl": true, + "controlledComputed": true, + "controlledRef": true, + "createApp": true, + "createEventHook": true, + "createGlobalState": true, + "createInjectionState": true, + "createReactiveFn": true, + "createSharedComposable": true, + "createUnrefFn": true, + "customRef": true, + "debouncedRef": true, + "debouncedWatch": true, + "defineAsyncComponent": true, + "defineComponent": true, + "eagerComputed": true, + "effectScope": true, + "extendRef": true, + "getCurrentInstance": true, + "getCurrentScope": true, + "h": true, + "ignorableWatch": true, + "inject": true, + "isDefined": true, + "isProxy": true, + "isReactive": true, + "isReadonly": true, + "isRef": true, + "makeDestructurable": true, + "markRaw": true, + "nextTick": true, + "onActivated": true, + "onBeforeMount": true, + "onBeforeUnmount": true, + "onBeforeUpdate": true, + "onClickOutside": true, + "onDeactivated": true, + "onErrorCaptured": true, + "onKeyStroke": true, + "onLongPress": true, + "onMounted": true, + "onRenderTracked": true, + "onRenderTriggered": true, + "onScopeDispose": true, + "onServerPrefetch": true, + "onStartTyping": true, + "onUnmounted": true, + "onUpdated": true, + "pausableWatch": true, + "provide": true, + "reactify": true, + "reactifyObject": true, + "reactive": true, + "reactiveComputed": true, + "reactiveOmit": true, + "reactivePick": true, + "readonly": true, + "ref": true, + "refAutoReset": true, + "refDebounced": true, + "refDefault": true, + "refThrottled": true, + "refWithControl": true, + "resolveComponent": true, + "resolveRef": true, + "resolveUnref": true, + "shallowReactive": true, + "shallowReadonly": true, + "shallowRef": true, + "syncRef": true, + "syncRefs": true, + "templateRef": true, + "throttledRef": true, + "throttledWatch": true, + "toRaw": true, + "toReactive": true, + "toRef": true, + "toRefs": true, + "triggerRef": true, + "tryOnBeforeMount": true, + "tryOnBeforeUnmount": true, + "tryOnMounted": true, + "tryOnScopeDispose": true, + "tryOnUnmounted": true, + "unref": true, + "unrefElement": true, + "until": true, + "useActiveElement": true, + "useArrayEvery": true, + "useArrayFilter": true, + "useArrayFind": true, + "useArrayFindIndex": true, + "useArrayJoin": true, + "useArrayMap": true, + "useArrayReduce": true, + "useArraySome": true, + "useAsyncQueue": true, + "useAsyncState": true, + "useAttrs": true, + "useBase64": true, + "useBattery": true, + "useBluetooth": true, + "useBreakpoints": true, + "useBroadcastChannel": true, + "useBrowserLocation": true, + "useCached": true, + "useClipboard": true, + "useColorMode": true, + "useConfirmDialog": true, + "useCounter": true, + "useCssModule": true, + "useCssVar": true, + "useCssVars": true, + "useCurrentElement": true, + "useCycleList": true, + "useDark": true, + "useDateFormat": true, + "useDebounce": true, + "useDebounceFn": true, + "useDebouncedRefHistory": true, + "useDeviceMotion": true, + "useDeviceOrientation": true, + "useDevicePixelRatio": true, + "useDevicesList": true, + "useDisplayMedia": true, + "useDocumentVisibility": true, + "useDraggable": true, + "useDropZone": true, + "useElementBounding": true, + "useElementByPoint": true, + "useElementHover": true, + "useElementSize": true, + "useElementVisibility": true, + "useEventBus": true, + "useEventListener": true, + "useEventSource": true, + "useEyeDropper": true, + "useFavicon": true, + "useFetch": true, + "useFileDialog": true, + "useFileSystemAccess": true, + "useFocus": true, + "useFocusWithin": true, + "useFps": true, + "useFullscreen": true, + "useGamepad": true, + "useGeolocation": true, + "useIdle": true, + "useImage": true, + "useInfiniteScroll": true, + "useIntersectionObserver": true, + "useInterval": true, + "useIntervalFn": true, + "useKeyModifier": true, + "useLastChanged": true, + "useLocalStorage": true, + "useMagicKeys": true, + "useManualRefHistory": true, + "useMediaControls": true, + "useMediaQuery": true, + "useMemoize": true, + "useMemory": true, + "useMounted": true, + "useMouse": true, + "useMouseInElement": true, + "useMousePressed": true, + "useMutationObserver": true, + "useNavigatorLanguage": true, + "useNetwork": true, + "useNow": true, + "useObjectUrl": true, + "useOffsetPagination": true, + "useOnline": true, + "usePageLeave": true, + "useParallax": true, + "usePermission": true, + "usePointer": true, + "usePointerSwipe": true, + "usePreferredColorScheme": true, + "usePreferredDark": true, + "usePreferredLanguages": true, + "useRafFn": true, + "useRefHistory": true, + "useResizeObserver": true, + "useRoute": true, + "useRouter": true, + "useScreenOrientation": true, + "useScreenSafeArea": true, + "useScriptTag": true, + "useScroll": true, + "useScrollLock": true, + "useSessionStorage": true, + "useShare": true, + "useSlots": true, + "useSpeechRecognition": true, + "useSpeechSynthesis": true, + "useStepper": true, + "useStorage": true, + "useStorageAsync": true, + "useStyleTag": true, + "useSupported": true, + "useSwipe": true, + "useTemplateRefsList": true, + "useTextDirection": true, + "useTextSelection": true, + "useTextareaAutosize": true, + "useThrottle": true, + "useThrottleFn": true, + "useThrottledRefHistory": true, + "useTimeAgo": true, + "useTimeout": true, + "useTimeoutFn": true, + "useTimeoutPoll": true, + "useTimestamp": true, + "useTitle": true, + "useToggle": true, + "useTransition": true, + "useUrlSearchParams": true, + "useUserMedia": true, + "useVModel": true, + "useVModels": true, + "useVibrate": true, + "useVirtualList": true, + "useWakeLock": true, + "useWebNotification": true, + "useWebSocket": true, + "useWebWorker": true, + "useWebWorkerFn": true, + "useWindowFocus": true, + "useWindowScroll": true, + "useWindowSize": true, + "watch": true, + "watchArray": true, + "watchAtMost": true, + "watchDebounced": true, + "watchEffect": true, + "watchIgnorable": true, + "watchOnce": true, + "watchPausable": true, + "watchPostEffect": true, + "watchSyncEffect": true, + "watchThrottled": true, + "watchTriggerable": true, + "watchWithFilter": true, + "whenever": true + } +} diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..3e4af63 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,72 @@ +// @ts-check +const { defineConfig } = require('eslint-define-config') +module.exports = defineConfig({ + root: true, + env: { + browser: true, + node: true, + es6: true + }, + parser: 'vue-eslint-parser', + plugins: ['vue'], + parserOptions: { + parser: '@typescript-eslint/parser', + ecmaVersion: 2020, + sourceType: 'module', + jsxPragma: 'React', + ecmaFeatures: { + jsx: true + } + }, + extends: [ + 'plugin:vue/vue3-recommended', + 'plugin:@typescript-eslint/recommended', + // 'prettier', + // 'plugin:prettier/recommended', + '@unocss' + ], + rules: { + 'vue/script-setup-uses-vars': 'error', + 'vue/no-reserved-component-names': 'off', + 'vue/no-setup-props-destructure': 'off', + '@typescript-eslint/ban-ts-ignore': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-function': 'off', + 'vue/custom-event-name-casing': 'off', + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-unused-vars': 'off', + 'no-unused-vars': 'off', + 'space-before-function-paren': 'off', + + 'vue/attributes-order': 'off', + 'vue/one-component-per-file': 'off', + 'vue/html-closing-bracket-newline': 'off', + 'vue/max-attributes-per-line': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/singleline-html-element-content-newline': 'off', + 'vue/attribute-hyphenation': 'off', + 'vue/require-default-prop': 'off', + 'vue/require-explicit-emits': 'off', + 'vue/html-self-closing': [ + 'error', + { + html: { + void: 'always', + normal: 'never', + component: 'always' + }, + svg: 'always', + math: 'always' + } + ], + 'vue/multi-word-component-names': 'off', + 'vue/no-v-html': 'off' + } +}) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7d4b4de --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local +/dist* +*-lock.* +pnpm-debug +auto-*.d.ts +.idea +.history +.vscode/ +/eam/ diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..f68ea86 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,11 @@ +/node_modules/** +/dist/ +/dist* +/public/* +/docs/* +/vite.config.ts +/src/types/env.d.ts +/src/types/auto-components.d.ts +/src/types/auto-imports.d.ts +/docs/**/* +CHANGELOG diff --git a/.stylelintignore b/.stylelintignore new file mode 100644 index 0000000..aa605b4 --- /dev/null +++ b/.stylelintignore @@ -0,0 +1,6 @@ +/dist/* +/public/* +public/* +/dist* +/src/types/env.d.ts +/docs/**/* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0166bd1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +# 设置基础镜像 +FROM win-nginx + +WORKDIR /opt/eam +COPY nginx.conf /usr/local/nginx/conf/nginx.conf +# 将dist文件中的内容复制到 /opt/eam 这个目录下面 +COPY eam/ /opt/eam diff --git a/Dockerfile_prod b/Dockerfile_prod new file mode 100644 index 0000000..a1078c3 --- /dev/null +++ b/Dockerfile_prod @@ -0,0 +1,7 @@ +# 设置基础镜像 +FROM win-nginx + +WORKDIR /opt/eam +COPY nginx_prod.conf /usr/local/nginx/conf/nginx.conf +# 将dist文件中的内容复制到 /opt/eam 这个目录下面 +COPY eam/ /opt/eam diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9861118 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-present Archer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a51323c --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +**xxxx.data.ts 文件配置说明** +**form表单查询弹窗配置** +form: { + labelMessage: '信息提示说明!!!', + componentProps: { + isSearchList: true, // 开启查询弹窗 + searchListPlaceholder: '请选择物品代码', // 输入框占位文本 + searchField: 'itemCode', // 查询弹窗赋值字段 + searchTitle: '生产线物品关系信息', // 查询弹窗标题 + searchAllSchemas: Productionlineitem.allSchemas, // 查询弹窗所需类 + searchPage: ProductionlineitemApi.getProductionlineitemPage, // 查询弹窗所需分页方法 + searchCondition: [{ + key:'productionLineCode', // 查询列表中字段 + value:'prodLine', // 指主表某字段 + isMainValue: true // 表示查询条件是主表的字段的值 + }, + { + key:'available', // 查询列表中字段 + value:'TRUE', // 指查询具体值 + isMainValue: false // 表示查询条件不是主表的字段的值 + } + ] + } +} +**tableForm明细列表查询弹窗配置** +tableForm:{ + isInpuFocusShow: true, // 开启查询弹窗 【**与form表单中唯一不同属性**】 + searchListPlaceholder: '请选择从仓库代码', // 输入框占位文本 + searchField: 'code', // 查询弹窗赋值字段 + searchTitle: '仓库基础信息', // 查询弹窗标题 + searchAllSchemas: Warehouse.allSchemas, // 查询弹窗所需类 + searchPage: WarehouseApi.getWarehousePage, // 查询弹窗所需分页方法 + searchCondition: [{ + key: 'available', // 查询列表中字段 + value: 'TRUE', // 指查询具体值 + isMainValue: false // 表示查询条件不是主表的字段的值 + }, + { + key: 'available', // 查询列表中字段 + value: 'TRUE', // 指查询具体值 + action: '==', // 查询拼接条件 + isSearch: true, // 使用自定义拼接条件 + isMainValue: false // 拼接条件必须要 false 同时不能与 isMainValue: true 同用 + }] +}, \ No newline at end of file diff --git a/build/vite/index.ts b/build/vite/index.ts new file mode 100644 index 0000000..0206710 --- /dev/null +++ b/build/vite/index.ts @@ -0,0 +1,107 @@ +import { resolve } from 'path' +import Vue from '@vitejs/plugin-vue' +import VueJsx from '@vitejs/plugin-vue-jsx' +import progress from 'vite-plugin-progress' +import EslintPlugin from 'vite-plugin-eslint' +import PurgeIcons from 'vite-plugin-purge-icons' +import { ViteEjsPlugin } from 'vite-plugin-ejs' +// @ts-ignore +import ElementPlus from 'unplugin-element-plus/vite' +import AutoImport from 'unplugin-auto-import/vite' +import Components from 'unplugin-vue-components/vite' +import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' +import viteCompression from 'vite-plugin-compression' +import topLevelAwait from 'vite-plugin-top-level-await' +import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite' +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' +import UnoCSS from 'unocss/vite' + +export function createVitePlugins() { + const root = process.cwd() + + // 路径查找 + function pathResolve(dir: string) { + return resolve(root, '.', dir) + } + + return [ + Vue(), + VueJsx(), + UnoCSS(), + progress(), + PurgeIcons(), + ElementPlus({}), + AutoImport({ + include: [ + /\.[tj]sx?$/, // .ts, .tsx, .js, .jsx + /\.vue$/, + /\.vue\?vue/, // .vue + /\.md$/ // .md + ], + imports: [ + 'vue', + 'vue-router', + // 可额外添加需要 autoImport 的组件 + { + '@/hooks/web/useI18n': ['useI18n'], + '@/hooks/web/useMessage': ['useMessage'], + '@/hooks/web/useTable': ['useTable'], + '@/hooks/web/useCrudSchemas': ['useCrudSchemas'], + '@/utils/formRules': ['required'], + '@/utils/dict': ['DICT_TYPE'] + } + ], + dts: 'src/types/auto-imports.d.ts', + resolvers: [ElementPlusResolver()], + eslintrc: { + enabled: false, // Default `false` + filepath: './.eslintrc-auto-import.json', // Default `./.eslintrc-auto-import.json` + globalsPropValue: true // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable') + } + }), + Components({ + // 要搜索组件的目录的相对路径 + dirs: ['src/components'], + // 组件的有效文件扩展名 + extensions: ['vue', 'md'], + // 搜索子目录 + deep: true, + include: [/\.vue$/, /\.vue\?vue/], + // 生成自定义 `auto-components.d.ts` 全局声明 + dts: 'src/types/auto-components.d.ts', + // 自定义组件的解析器 + resolvers: [ElementPlusResolver()], + exclude: [/[\\/]node_modules[\\/]/] + }), + EslintPlugin({ + cache: false, + include: ['src/**/*.vue', 'src/**/*.ts', 'src/**/*.tsx'] // 检查的文件 + }), + VueI18nPlugin({ + runtimeOnly: true, + compositionOnly: true, + include: [resolve(__dirname, 'src/locales/**')] + }), + createSvgIconsPlugin({ + iconDirs: [pathResolve('src/assets/svgs')], + symbolId: 'icon-[dir]-[name]', + svgoOptions: true + }), + viteCompression({ + verbose: true, // 是否在控制台输出压缩结果 + disable: false, // 是否禁用 + threshold: 10240, // 体积大于 threshold 才会被压缩,单位 b + algorithm: 'gzip', // 压缩算法,可选 [ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw'] + ext: '.gz', // 生成的压缩包后缀 + deleteOriginFile: false //压缩后是否删除源文件 + }), + ViteEjsPlugin(), + topLevelAwait({ + // https://juejin.cn/post/7152191742513512485 + // The export name of top-level await promise for each chunk module + promiseExportName: '__tla', + // The function to generate import names of top-level await promise in each chunk module + promiseImportName: (i) => `__tla_${i}` + }) + ] +} diff --git a/build/vite/optimize.ts b/build/vite/optimize.ts new file mode 100644 index 0000000..3dda50b --- /dev/null +++ b/build/vite/optimize.ts @@ -0,0 +1,112 @@ +const include = [ + 'qs', + 'url', + 'vue', + 'sass', + 'mitt', + 'axios', + 'pinia', + 'dayjs', + 'qrcode', + 'unocss', + 'vue-router', + 'vue-types', + 'vue-i18n', + 'crypto-js', + 'cropperjs', + 'lodash-es', + 'nprogress', + 'web-storage-cache', + '@iconify/iconify', + '@vueuse/core', + '@zxcvbn-ts/core', + 'echarts/core', + 'echarts/charts', + 'echarts/components', + 'echarts/renderers', + 'echarts-wordcloud', + '@wangeditor/editor', + '@wangeditor/editor-for-vue', + 'element-plus', + 'element-plus/es', + 'element-plus/es/locale/lang/zh-cn', + 'element-plus/es/locale/lang/en', + 'element-plus/es/components/avatar/style/css', + 'element-plus/es/components/space/style/css', + 'element-plus/es/components/backtop/style/css', + 'element-plus/es/components/form/style/css', + 'element-plus/es/components/radio-group/style/css', + 'element-plus/es/components/radio/style/css', + 'element-plus/es/components/checkbox/style/css', + 'element-plus/es/components/checkbox-group/style/css', + 'element-plus/es/components/switch/style/css', + 'element-plus/es/components/time-picker/style/css', + 'element-plus/es/components/date-picker/style/css', + 'element-plus/es/components/descriptions/style/css', + 'element-plus/es/components/descriptions-item/style/css', + 'element-plus/es/components/link/style/css', + 'element-plus/es/components/tooltip/style/css', + 'element-plus/es/components/drawer/style/css', + 'element-plus/es/components/dialog/style/css', + 'element-plus/es/components/checkbox-button/style/css', + 'element-plus/es/components/option-group/style/css', + 'element-plus/es/components/radio-button/style/css', + 'element-plus/es/components/cascader/style/css', + 'element-plus/es/components/color-picker/style/css', + 'element-plus/es/components/input-number/style/css', + 'element-plus/es/components/rate/style/css', + 'element-plus/es/components/select-v2/style/css', + 'element-plus/es/components/tree-select/style/css', + 'element-plus/es/components/slider/style/css', + 'element-plus/es/components/time-select/style/css', + 'element-plus/es/components/autocomplete/style/css', + 'element-plus/es/components/image-viewer/style/css', + 'element-plus/es/components/upload/style/css', + 'element-plus/es/components/col/style/css', + 'element-plus/es/components/form-item/style/css', + 'element-plus/es/components/alert/style/css', + 'element-plus/es/components/breadcrumb/style/css', + 'element-plus/es/components/select/style/css', + 'element-plus/es/components/input/style/css', + 'element-plus/es/components/breadcrumb-item/style/css', + 'element-plus/es/components/tag/style/css', + 'element-plus/es/components/pagination/style/css', + 'element-plus/es/components/table/style/css', + 'element-plus/es/components/table-v2/style/css', + 'element-plus/es/components/table-column/style/css', + 'element-plus/es/components/card/style/css', + 'element-plus/es/components/row/style/css', + 'element-plus/es/components/button/style/css', + 'element-plus/es/components/menu/style/css', + 'element-plus/es/components/sub-menu/style/css', + 'element-plus/es/components/menu-item/style/css', + 'element-plus/es/components/option/style/css', + 'element-plus/es/components/dropdown/style/css', + 'element-plus/es/components/dropdown-menu/style/css', + 'element-plus/es/components/dropdown-item/style/css', + 'element-plus/es/components/skeleton/style/css', + 'element-plus/es/components/skeleton/style/css', + 'element-plus/es/components/backtop/style/css', + 'element-plus/es/components/menu/style/css', + 'element-plus/es/components/sub-menu/style/css', + 'element-plus/es/components/menu-item/style/css', + 'element-plus/es/components/dropdown/style/css', + 'element-plus/es/components/tree/style/css', + 'element-plus/es/components/dropdown-menu/style/css', + 'element-plus/es/components/dropdown-item/style/css', + 'element-plus/es/components/badge/style/css', + 'element-plus/es/components/breadcrumb/style/css', + 'element-plus/es/components/breadcrumb-item/style/css', + 'element-plus/es/components/image/style/css', + 'element-plus/es/components/collapse-transition/style/css', + 'element-plus/es/components/timeline/style/css', + 'element-plus/es/components/timeline-item/style/css', + 'element-plus/es/components/collapse/style/css', + 'element-plus/es/components/collapse-item/style/css', + 'element-plus/es/components/button-group/style/css', + 'element-plus/es/components/text/style/css' +] + +const exclude = ['@iconify/json'] + +export { include, exclude } diff --git a/index.html b/index.html new file mode 100644 index 0000000..2fe32f5 --- /dev/null +++ b/index.html @@ -0,0 +1,152 @@ + + + + + + + + + + + %VITE_APP_TITLE% + + +
+ +
+
+
+ +
%VITE_APP_TITLE%
+
+
+
+
+
+
+
+
+ + + diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..d5aa0a2 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,60 @@ +user root; +worker_processes 2; + +events { + worker_connections 1024; +} + +http { + include mime.types; + charset utf-8,gbk; + default_type application/octet-stream; + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for" "$request_time $upstream_response_time"'; + + proxy_cache_path /opt/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g; + access_log logs/access.log main; + sendfile on; + #tcp_nopush on; + keepalive_timeout 600s; + client_max_body_size 200m; + gzip on; + gzip_min_length 10k; + gzip_comp_level 9; + gzip_buffers 4 16k; + gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png; + gzip_vary on; + gzip_disable "MSIE [1-6]\."; + upstream eam { + server localhost:25210 weight=10 max_fails=3 fail_timeout=10s; + } + server { + listen 25200; + server_name_in_redirect off; + server_name dev.ccwin-in.com; + location /api/ { + proxy_pass http://eam/; + proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header; + proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $http_x_forwarded_for; + } + location /profile/ { + proxy_cache my_zone; + proxy_cache_valid 200 304 12h; + proxy_cache_key $host$uri$is_args$args; + alias /opt/profile/; + index index.html index.htm; + } + location / { + proxy_cache my_zone; + proxy_cache_valid 200 304 12h; + proxy_cache_key $host$uri$is_args$args; + try_files $uri $uri/ /index.html; + root /opt/eam; + index index.html index.htm; + } + } +} \ No newline at end of file diff --git a/nginx_prod.conf b/nginx_prod.conf new file mode 100644 index 0000000..8cb1610 --- /dev/null +++ b/nginx_prod.conf @@ -0,0 +1,60 @@ +user root; +worker_processes 2; + +events { + worker_connections 1024; +} + +http { + include mime.types; + charset utf-8,gbk; + default_type application/octet-stream; + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for" "$request_time $upstream_response_time"'; + + proxy_cache_path /opt/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g; + access_log logs/access.log main; + sendfile on; + #tcp_nopush on; + keepalive_timeout 600s; + client_max_body_size 200m; + gzip on; + gzip_min_length 10k; + gzip_comp_level 9; + gzip_buffers 4 16k; + gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png; + gzip_vary on; + gzip_disable "MSIE [1-6]\."; + upstream eam { + server localhost:90 weight=10 max_fails=3 fail_timeout=10s; + } + server { + listen 80; + server_name_in_redirect off; + server_name dev.ccwin-in.com; + location /api/ { + proxy_pass http://eam/; + proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header; + proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $http_x_forwarded_for; + } + location /profile/ { + proxy_cache my_zone; + proxy_cache_valid 200 304 12h; + proxy_cache_key $host$uri$is_args$args; + alias /opt/profile/; + index index.html index.htm; + } + location / { + proxy_cache my_zone; + proxy_cache_valid 200 304 12h; + proxy_cache_key $host$uri$is_args$args; + try_files $uri $uri/ /index.html; + root /opt/eam; + index index.html index.htm; + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..cf2eff1 --- /dev/null +++ b/package.json @@ -0,0 +1,134 @@ +{ + "name": "yudao-ui-admin-vue3", + "version": "1.8.2-snapshot", + "description": "基于vue3、vite4、element-plus、typesScript", + "author": "xingyu", + "private": false, + "scripts": { + "dev": "vite", + "test": "vite build --mode test", + "prod": "vite build --mode production", + "preview": "vite preview", + "lint": "eslint --fix --ext .js,.vue src" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.1.0", + "@form-create/designer": "^3.1.3", + "@form-create/element-ui": "^3.1.24", + "@iconify/iconify": "^3.1.1", + "@kjgl77/datav-vue3": "^1.7.1", + "@videojs-player/vue": "^1.0.0", + "@vueuse/core": "^10.4.1", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.10", + "@zxcvbn-ts/core": "^3.0.4", + "animate.css": "^4.1.1", + "axios": "^1.5.0", + "benz-amr-recorder": "^1.1.5", + "bpmn-js-token-simulation": "^0.10.0", + "camunda-bpmn-moddle": "^7.0.1", + "cropperjs": "^1.6.1", + "crypto-js": "^4.1.1", + "dayjs": "^1.11.10", + "diagram-js": "^12.3.0", + "echarts": "^5.4.3", + "echarts-wordcloud": "^2.1.0", + "element-plus": "2.3.14", + "fast-xml-parser": "^4.3.0", + "highlight.js": "^11.8.0", + "intro.js": "^7.2.0", + "jsencrypt": "^3.3.2", + "lodash-es": "^4.17.21", + "min-dash": "^4.1.1", + "mitt": "^3.0.1", + "nprogress": "^0.2.0", + "pinia": "^2.1.6", + "qrcode": "^1.5.3", + "qs": "^6.11.2", + "sortablejs": "^1.15.0", + "steady-xml": "^0.1.0", + "url": "^0.11.3", + "video.js": "^7.21.5", + "vue": "^3.3.4", + "vue-dompurify-html": "^4.1.4", + "vue-i18n": "^9.4.1", + "vue-router": "^4.2.5", + "vue-types": "^5.1.1", + "vuedraggable": "^4.1.0", + "web-storage-cache": "^1.1.1", + "xml-js": "^1.6.11" + }, + "devDependencies": { + "@commitlint/cli": "^17.7.1", + "@commitlint/config-conventional": "^17.7.0", + "@iconify/json": "^2.2.119", + "@intlify/unplugin-vue-i18n": "^1.2.0", + "@purge-icons/generated": "^0.9.0", + "@types/intro.js": "^5.1.1", + "@types/lodash-es": "^4.17.9", + "@types/node": "^20.6.0", + "@types/nprogress": "^0.2.0", + "@types/qrcode": "^1.5.2", + "@types/qs": "^6.9.8", + "@typescript-eslint/eslint-plugin": "^6.7.2", + "@typescript-eslint/parser": "^6.7.2", + "@unocss/eslint-config": "^0.56.1", + "@unocss/transformer-variant-group": "^0.56.1", + "@vitejs/plugin-legacy": "^4.1.1", + "@vitejs/plugin-vue": "^4.3.4", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "@vue-macros/volar": "^0.14.3", + "autoprefixer": "^10.4.16", + "bpmn-js": "8.9.0", + "bpmn-js-properties-panel": "0.46.0", + "consola": "^3.2.3", + "eslint": "^8.49.0", + "eslint-config-prettier": "^9.0.0", + "eslint-define-config": "^1.23.0", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-vue": "^9.17.0", + "lint-staged": "^14.0.1", + "postcss": "^8.4.30", + "postcss-html": "^1.5.0", + "postcss-scss": "^4.0.8", + "prettier": "^3.0.3", + "rimraf": "^5.0.1", + "rollup": "^3.29.2", + "sass": "^1.68.0", + "stylelint": "^15.10.3", + "stylelint-config-html": "^1.1.0", + "stylelint-config-recommended": "^13.0.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-order": "^6.0.3", + "terser": "^5.20.0", + "typescript": "5.2.2", + "unocss": "^0.56.1", + "unplugin-auto-import": "^0.16.6", + "unplugin-element-plus": "^0.8.0", + "unplugin-vue-components": "^0.25.2", + "vite": "4.4.9", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-ejs": "^1.6.4", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-progress": "^0.0.7", + "vite-plugin-purge-icons": "^0.9.2", + "vite-plugin-svg-icons": "^2.0.1", + "vite-plugin-top-level-await": "^1.3.1", + "vue-eslint-parser": "^9.3.1", + "vue-tsc": "^1.8.13" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://gitee.com/yudaocode/yudao-ui-admin-vue3" + }, + "bugs": { + "url": "https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues" + }, + "homepage": "https://gitee.com/yudaocode/yudao-ui-admin-vue3", + "packageManager": "pnpm@8.6.0", + "engines": { + "node": ">= 16.0.0", + "pnpm": ">=8.6.0" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..961986e --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +} diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000..b014bbf --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,22 @@ +module.exports = { + printWidth: 100, // 每行代码长度(默认80) + tabWidth: 2, // 每个tab相当于多少个空格(默认2)ab进行缩进(默认false) + useTabs: false, // 是否使用tab + semi: false, // 声明结尾使用分号(默认true) + vueIndentScriptAndStyle: false, + singleQuote: true, // 使用单引号(默认false) + quoteProps: 'as-needed', + bracketSpacing: true, // 对象字面量的大括号间使用空格(默认true) + trailingComma: 'none', // 多行使用拖尾逗号(默认none) + jsxSingleQuote: false, + // 箭头函数参数括号 默认avoid 可选 avoid| always + // avoid 能省略括号的时候就省略 例如x => x + // always 总是有括号 + arrowParens: 'always', + insertPragma: false, + requirePragma: false, + proseWrap: 'never', + htmlWhitespaceSensitivity: 'strict', + endOfLine: 'auto', + rangeStart: 0 +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5a7de08267811feb034bb0c54ab38ca417731aab GIT binary patch literal 4286 zcmcJTdr*|u8OGm?f3Tad7j|KHxq~xpVq;A@HfgF7QY~O)Go9%q6O&2POq*#slbPnf zwzf$$rcG^ZYDE+@N@~3q7I49+L1DRyKt#F7{U!nn%U;+^j39aYobU7VmKqZ!%ltTJ zSayHU`<%1G3`F1^k7e(&;Z`VJu(?k;=T7X%N)jqMq!dMyZeDC3iF!z6rw+67kxV&jDKh*=XMMH7BzC%0ZZgW^F*GR;m`LJ8Nxh;MnV_2 zo#Aeu7~L8}V>!_RD+rBki)NV^cA^7!L1e&FY)JDI!(TGDXW-mnR@`bh?a0EnGI=P9 zy>>$Z2m|CjGIt$Z+!8}0*)asCbu>FBggr}a!3yv^PwX`@<_>sE4e5ZqN9V>rmTRUF zbU(T+S`C+7@m92s-#UA`Fo4_`PSqdlNi_8Le1D!YO<=@vm4O z$%$c4iIKfW(ZR8ZbU?mO?%glC2lvBQG7OL4g2E>3CE|D(x!lD@#>|2OxWk0scT#t^ zS6+JEa8?X~2srB%*M&`SJoL{S_(0yf@}t;S27g&Z0Hpg)z+Z89e{|ZcvsAWtlnyU! zrooK~1ov;@oE;J_FsSek>;)U+*tyTdzLW6F6!^;ZVSuI_-@Jq7m6vJu4@{*G56tUW zpGZTSVx!<}kX-N$2;dyp7%$QPemsxlS=d(&zn~%_Fjb*XpK`!o{mnXPeP))mj8zZ^lWb$NF4{~3AH+q%ce-ErK%W3!iN7WAAnu?S-NPqStq)-K z^r;$jQ1|uDpfTeToz0w~uIE_Ym=?0w^$yVAEIfqUV+#(N3e zk2~QhGcbJDsny&3bvhLwfBl_1IF%8kGpjCBvvt~9zrr8d9#JR!m$M(Jd}05>Eb4nd zJ`&DTz3>To1b>z3MIY{C28N5L>h#j;Kcx$R41YcR4PV_s^-rhhbVi8kGeYX7r!U!S zQoWp`s}X+Qa=*iY4)hJLtt9w=1?Lsv?f#1(Q9@*K9WgR|GWA#mr*$@egH|Q{flqJW zfn&Lc>e2!ND{_P?Q{22wTP^vKVHzF$V&C_+Q16C#BfNFp?VUHBP>oj2B zhz=UjK_mQU{=dKMNf%Wv_mX3|SB)O*b?E`FSmwIXFFL5s)z(Cu`t>S;|CO%wi8Gz> zcD{3+@uDaWG)hk4Wq*?l=C;AD68_*>&6hq4$5NbB{u8&riVPuS;Bxqt{>2%98FcW< z-UZpz{a%6r-kQ#JN!+2ZHi^e>j@Xfb z(FH3R_9nI5>KFImbdI(Z5j@?YYO33 z34gFFoDTl5j|!g{5?GNTRI+4*l?*4In&hHK`i1Yt`Ne(~9lZ9R?`G5acM|n*SGN8s znFXUbf8oK55?7tV%W!hALlXom0foB5=@9%tUGVsTz3@jvj0}t(u4OpB%*i{yd6`D*|GZP1pkYzYvxb4teMYa#Zj_Lo>g|rUJiD`FX%!C-Qg-g2Nw4TGLa#a|M&na z8A`8a_#|~g>R_v;>eddvKnJhy{!TWvy`7|kyQ1Zf^VxYMQp~8#D(_{d@N%#l^n?dP zJ>eOEc0bbbz}_Ep9p1mVhmnEN1LG{D9z=$tSMNjqf-V*rZoG@=pcx%l%Ab3d&aIih z8eE{+mp&i+1G+xk}WiODJh<6N)JDmfKzAKZd|2|w0ncYeRMI&V=sBLj;JI14`X znA}4Vday6K$fZk1`Dluh#aSF*>g2+Oy}Ud24Cm@=8E1fdP!-j*CXKqY;$HSP>1S?o zig|DLDt@t+^XG}oKAp^97_-1JPiEbH%mN~Xwb-w{LX;}_oG4M?Bhm>5iNXX9qIrUK L_}7DgzT)vecywrn literal 0 HcmV?d00001 diff --git a/public/home.png b/public/home.png new file mode 100644 index 0000000000000000000000000000000000000000..ccd41455a9ef128c5798691a1d74b472c6d6344a GIT binary patch literal 74352 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�BJed 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 z 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 literal 0 HcmV?d00001 diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..c0d50c3 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,75 @@ + + + diff --git a/src/api/bpm/activity/index.ts b/src/api/bpm/activity/index.ts new file mode 100644 index 0000000..870d0d6 --- /dev/null +++ b/src/api/bpm/activity/index.ts @@ -0,0 +1,8 @@ +import request from '@/config/axios' + +export const getActivityList = async (params) => { + return await request.get({ + url: '/bpm/activity/list', + params + }) +} diff --git a/src/api/bpm/definition/index.ts b/src/api/bpm/definition/index.ts new file mode 100644 index 0000000..c0e51fa --- /dev/null +++ b/src/api/bpm/definition/index.ts @@ -0,0 +1,21 @@ +import request from '@/config/axios' + +export const getProcessDefinitionBpmnXML = async (id: number) => { + return await request.get({ + url: '/bpm/process-definition/get-bpmn-xml?id=' + id + }) +} + +export const getProcessDefinitionPage = async (params) => { + return await request.get({ + url: '/bpm/process-definition/page', + params + }) +} + +export const getProcessDefinitionList = async (params) => { + return await request.get({ + url: '/bpm/process-definition/list', + params + }) +} diff --git a/src/api/bpm/form/index.ts b/src/api/bpm/form/index.ts new file mode 100644 index 0000000..142ed24 --- /dev/null +++ b/src/api/bpm/form/index.ts @@ -0,0 +1,56 @@ +import request from '@/config/axios' + +export type FormVO = { + id: number + name: string + conf: string + fields: string[] + status: number + remark: string + createTime: string +} + +// 创建工作流的表单定义 +export const createForm = async (data: FormVO) => { + return await request.post({ + url: '/bpm/form/create', + data: data + }) +} + +// 更新工作流的表单定义 +export const updateForm = async (data: FormVO) => { + return await request.put({ + url: '/bpm/form/update', + data: data + }) +} + +// 删除工作流的表单定义 +export const deleteForm = async (id: number) => { + return await request.delete({ + url: '/bpm/form/delete?id=' + id + }) +} + +// 获得工作流的表单定义 +export const getForm = async (id: number) => { + return await request.get({ + url: '/bpm/form/get?id=' + id + }) +} + +// 获得工作流的表单定义分页 +export const getFormPage = async (params) => { + return await request.get({ + url: '/bpm/form/page', + params + }) +} + +// 获得动态表单的精简列表 +export const getSimpleFormList = async () => { + return await request.get({ + url: '/bpm/form/list-all-simple' + }) +} diff --git a/src/api/bpm/leave/index.ts b/src/api/bpm/leave/index.ts new file mode 100644 index 0000000..d4fe8d5 --- /dev/null +++ b/src/api/bpm/leave/index.ts @@ -0,0 +1,27 @@ +import request from '@/config/axios' + +export type LeaveVO = { + id: number + result: number + type: number + reason: string + processInstanceId: string + startTime: string + endTime: string + createTime: string +} + +// 创建请假申请 +export const createLeave = async (data: LeaveVO) => { + return await request.post({ url: '/bpm/oa/leave/create', data: data }) +} + +// 获得请假申请 +export const getLeave = async (id: number) => { + return await request.get({ url: '/bpm/oa/leave/get?id=' + id }) +} + +// 获得请假申请分页 +export const getLeavePage = async (params: PageParam) => { + return await request.get({ url: '/bpm/oa/leave/page', params }) +} diff --git a/src/api/bpm/model/index.ts b/src/api/bpm/model/index.ts new file mode 100644 index 0000000..2e1d4e6 --- /dev/null +++ b/src/api/bpm/model/index.ts @@ -0,0 +1,59 @@ +import request from '@/config/axios' + +export type ProcessDefinitionVO = { + id: string + version: number + deploymentTIme: string + suspensionState: number +} + +export type ModelVO = { + id: number + formName: string + key: string + name: string + description: string + category: string + formType: number + formId: number + formCustomCreatePath: string + formCustomViewPath: string + processDefinition: ProcessDefinitionVO + status: number + remark: string + createTime: string + bpmnXml: string +} + +export const getModelPage = async (params) => { + return await request.get({ url: '/bpm/model/page', params }) +} + +export const getModel = async (id: number) => { + return await request.get({ url: '/bpm/model/get?id=' + id }) +} + +export const updateModel = async (data: ModelVO) => { + return await request.put({ url: '/bpm/model/update', data: data }) +} + +// 任务状态修改 +export const updateModelState = async (id: number, state: number) => { + const data = { + id: id, + state: state + } + return await request.put({ url: '/bpm/model/update-state', data: data }) +} + +export const createModel = async (data: ModelVO) => { + return await request.post({ url: '/bpm/model/create', data: data }) +} + +export const deleteModel = async (id: number) => { + return await request.delete({ url: '/bpm/model/delete?id=' + id }) +} + +export const deployModel = async (id: number) => { + return await request.post({ url: '/bpm/model/deploy?id=' + id }) +} diff --git a/src/api/bpm/processInstance/index.ts b/src/api/bpm/processInstance/index.ts new file mode 100644 index 0000000..10cd3bc --- /dev/null +++ b/src/api/bpm/processInstance/index.ts @@ -0,0 +1,41 @@ +import request from '@/config/axios' + +export type Task = { + id: string + name: string +} + +export type ProcessInstanceVO = { + id: number + name: string + processDefinitionId: string + category: string + result: number + tasks: Task[] + fields: string[] + status: number + remark: string + businessKey: string + createTime: string + endTime: string +} + +export const getMyProcessInstancePage = async (params) => { + return await request.get({ url: '/bpm/process-instance/my-page', params }) +} + +export const createProcessInstance = async (data) => { + return await request.post({ url: '/bpm/process-instance/create', data: data }) +} + +export const cancelProcessInstance = async (id: number, reason: string) => { + const data = { + id: id, + reason: reason + } + return await request.delete({ url: '/bpm/process-instance/cancel', data: data }) +} + +export const getProcessInstance = async (id: number) => { + return await request.get({ url: '/bpm/process-instance/get?id=' + id }) +} diff --git a/src/api/bpm/task/index.ts b/src/api/bpm/task/index.ts new file mode 100644 index 0000000..e6478d3 --- /dev/null +++ b/src/api/bpm/task/index.ts @@ -0,0 +1,53 @@ +import request from '@/config/axios' + +export type TaskVO = { + id: number +} + +export const getTodoTaskPage = async (params) => { + return await request.get({ url: '/bpm/task/todo-page', params }) +} + +export const getDoneTaskPage = async (params) => { + return await request.get({ url: '/bpm/task/done-page', params }) +} + +export const completeTask = async (data) => { + return await request.put({ url: '/bpm/task/complete', data }) +} + +export const approveTask = async (data) => { + return await request.put({ url: '/bpm/task/approve', data }) +} + +export const rejectTask = async (data) => { + return await request.put({ url: '/bpm/task/reject', data }) +} +export const backTask = async (data) => { + return await request.put({ url: '/bpm/task/back', data }) +} + +export const updateTaskAssignee = async (data) => { + return await request.put({ url: '/bpm/task/update-assignee', data }) +} + +export const getTaskListByProcessInstanceId = async (processInstanceId) => { + return await request.get({ + url: '/bpm/task/list-by-process-instance-id?processInstanceId=' + processInstanceId + }) +} + +// 导出任务 +export const exportTask = async (params) => { + return await request.download({ url: '/bpm/task/export', params }) +} + +// 获取所有可回退的节点 +export const getReturnList = async (params) => { + return await request.get({ url: '/bpm/task/get-return-list', params }) +} + +// 回退 +export const returnTask = async (data) => { + return await request.put({ url: '/bpm/task/return', data }) +} diff --git a/src/api/bpm/taskAssignRule/index.ts b/src/api/bpm/taskAssignRule/index.ts new file mode 100644 index 0000000..5fbe342 --- /dev/null +++ b/src/api/bpm/taskAssignRule/index.ts @@ -0,0 +1,29 @@ +import request from '@/config/axios' + +export type TaskAssignVO = { + id: number + modelId: string + processDefinitionId: string + taskDefinitionKey: string + taskDefinitionName: string + options: string[] + type: number +} + +export const getTaskAssignRuleList = async (params) => { + return await request.get({ url: '/bpm/task-assign-rule/list', params }) +} + +export const createTaskAssignRule = async (data: TaskAssignVO) => { + return await request.post({ + url: '/bpm/task-assign-rule/create', + data: data + }) +} + +export const updateTaskAssignRule = async (data: TaskAssignVO) => { + return await request.put({ + url: '/bpm/task-assign-rule/update', + data: data + }) +} diff --git a/src/api/bpm/userGroup/index.ts b/src/api/bpm/userGroup/index.ts new file mode 100644 index 0000000..035762b --- /dev/null +++ b/src/api/bpm/userGroup/index.ts @@ -0,0 +1,47 @@ +import request from '@/config/axios' + +export type UserGroupVO = { + id: number + name: string + description: string + memberUserIds: number[] + status: number + remark: string + createTime: string +} + +// 创建用户组 +export const createUserGroup = async (data: UserGroupVO) => { + return await request.post({ + url: '/bpm/user-group/create', + data: data + }) +} + +// 更新用户组 +export const updateUserGroup = async (data: UserGroupVO) => { + return await request.put({ + url: '/bpm/user-group/update', + data: data + }) +} + +// 删除用户组 +export const deleteUserGroup = async (id: number) => { + return await request.delete({ url: '/bpm/user-group/delete?id=' + id }) +} + +// 获得用户组 +export const getUserGroup = async (id: number) => { + return await request.get({ url: '/bpm/user-group/get?id=' + id }) +} + +// 获得用户组分页 +export const getUserGroupPage = async (params) => { + return await request.get({ url: '/bpm/user-group/page', params }) +} + +// 获取用户组精简信息列表 +export const getSimpleUserGroupList = async (): Promise => { + return await request.get({ url: '/bpm/user-group/list-all-simple' }) +} diff --git a/src/api/eam/basic/basciYearEquipment/index.ts b/src/api/eam/basic/basciYearEquipment/index.ts new file mode 100644 index 0000000..342b7ae --- /dev/null +++ b/src/api/eam/basic/basciYearEquipment/index.ts @@ -0,0 +1,52 @@ +import request from '@/config/axios' + +export interface BasciYearEquipmentVO { + id: number + name: string + type: string + factoryType: string + yearIndex: Date + goal: number + actual: number +} + +// 查询首页年设备指标列表 +export const getBasciYearEquipmentPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/basci-year-equipment/senior', data }) + } else { + return await request.get({ url: `/eam/basci-year-equipment/page`, params }) + } +} + +// 查询首页年设备指标详情 +export const getBasciYearEquipment = async (id: number) => { + return await request.get({ url: `/eam/basci-year-equipment/get?id=` + id }) +} + +// 新增首页年设备指标 +export const createBasciYearEquipment = async (data: BasciYearEquipmentVO) => { + return await request.post({ url: `/eam/basci-year-equipment/create`, data }) +} + +// 修改首页年设备指标 +export const updateBasciYearEquipment = async (data: BasciYearEquipmentVO) => { + return await request.put({ url: `/eam/basci-year-equipment/update`, data }) +} + +// 删除首页年设备指标 +export const deleteBasciYearEquipment = async (id: number) => { + return await request.delete({ url: `/eam/basci-year-equipment/delete?id=` + id }) +} + +// 导出首页年设备指标 Excel +export const exportBasciYearEquipment = async (params) => { + return await request.download({ url: `/eam/basci-year-equipment/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/basci-year-equipment/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/basic/basicMonthEquipment/index.ts b/src/api/eam/basic/basicMonthEquipment/index.ts new file mode 100644 index 0000000..a0a3bff --- /dev/null +++ b/src/api/eam/basic/basicMonthEquipment/index.ts @@ -0,0 +1,54 @@ +import request from '@/config/axios' + +export interface BasicMonthEquipmentVO { + id: number + name: string + type: string + factoryType: string + monthIndex: string + actual: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询首页月设备实现指标列表 +export const getBasicMonthEquipmentPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/basic-month-equipment/senior', data }) + } else { + return await request.get({ url: `/eam/basic-month-equipment/page`, params }) + } +} + +// 查询首页月设备实现指标详情 +export const getBasicMonthEquipment = async (id: number) => { + return await request.get({ url: `/eam/basic-month-equipment/get?id=` + id }) +} + +// 新增首页月设备实现指标 +export const createBasicMonthEquipment = async (data: BasicMonthEquipmentVO) => { + return await request.post({ url: `/eam/basic-month-equipment/create`, data }) +} + +// 修改首页月设备实现指标 +export const updateBasicMonthEquipment = async (data: BasicMonthEquipmentVO) => { + return await request.put({ url: `/eam/basic-month-equipment/update`, data }) +} + +// 删除首页月设备实现指标 +export const deleteBasicMonthEquipment = async (id: number) => { + return await request.delete({ url: `/eam/basic-month-equipment/delete?id=` + id }) +} + +// 导出首页月设备实现指标 Excel +export const exportBasicMonthEquipment = async (params) => { + return await request.download({ url: `/eam/basic-month-equipment/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/basic-month-equipment/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/basic/classType/index.ts b/src/api/eam/basic/classType/index.ts new file mode 100644 index 0000000..89d153f --- /dev/null +++ b/src/api/eam/basic/classType/index.ts @@ -0,0 +1,54 @@ +import request from '@/config/axios' + +export interface ClassTypeVO { + workerRoleId: string + engineerRoleId: string + type: string + describes: string + factoryAreaNumber: string + siteId: string + available: string + deptId: number + concurrencyStamp: number +} + +// 查询厂区班组角色数据维护列表 +export const getClassTypePage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/class-type/senior', data }) + } else { + return await request.get({ url: `/eam/class-type/page`, params }) + } +} + +// 查询厂区班组角色数据维护详情 +export const getClassType = async (id: number) => { + return await request.get({ url: `/eam/class-type/get?id=` + id }) +} + +// 新增厂区班组角色数据维护 +export const createClassType = async (data: ClassTypeVO) => { + return await request.post({ url: `/eam/class-type/create`, data }) +} + +// 修改厂区班组角色数据维护 +export const updateClassType = async (data: ClassTypeVO) => { + return await request.put({ url: `/eam/class-type/update`, data }) +} + +// 删除厂区班组角色数据维护 +export const deleteClassType = async (id: number) => { + return await request.delete({ url: `/eam/class-type/delete?id=` + id }) +} + +// 导出厂区班组角色数据维护 Excel +export const exportClassType = async (params) => { + return await request.download({ url: `/eam/class-type/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/class-type/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/basic/deviceMaintenance/index.ts b/src/api/eam/basic/deviceMaintenance/index.ts new file mode 100644 index 0000000..85247fe --- /dev/null +++ b/src/api/eam/basic/deviceMaintenance/index.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' + +export interface DeviceMoldItemsVO { + name: string + deviceNumber: string + type: "DEVICE" + status: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询项记录表(设备 模具 保养 维修 巡检点检)列表 +export const getDeviceMoldItemsPage = async (params) => { + params.type="DEVICE" + params.status="MAINTAIN" + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-mold-items/senior', data }) + } else { + return await request.get({ url: `/eam/device-mold-items/page`, params }) + } +} + + +// 查询项记录表(设备 模具 保养 维修 巡检点检)详情 +export const getDeviceMoldItems = async (id: number) => { + return await request.get({ url: `/eam/device-mold-items/get?id=` + id }) +} + +// 查询供应商发票申请主详情 +export const getNumber = async (params) => { + return await request.get({ url: `/eam/device-mold-items/getNumber`, params}) +} + +// 新增项记录表(设备 模具 保养 维修 巡检点检) +export const createDeviceMoldItems = async (data: DeviceMoldItemsVO) => { + data.type="DEVICE" + data.status="MAINTAIN" + return await request.post({ url: `/eam/device-mold-items/create`, data }) +} + +// 修改项记录表(设备 模具 保养 维修 巡检点检) +export const updateDeviceMoldItems = async (data: DeviceMoldItemsVO) => { + data.type="DEVICE" + data.status="MAINTAIN" + return await request.put({ url: `/eam/device-mold-items/update`, data }) +} + +// 删除项记录表(设备 模具 保养 维修 巡检点检) +export const deleteDeviceMoldItems = async (id: number,remark: string) => { + return await request.delete({ url: `/eam/device-mold-items/delete?id=` + id + `&remark=` + remark }) +} + +// 导出项记录表(设备 模具 保养 维修 巡检点检) Excel +export const exportDeviceMoldItems = async (params) => { + return await request.download({ url: `/eam/device-mold-items/export-excel`, params }) +} + + diff --git a/src/api/eam/basic/deviceMoldItemsHistory/index.ts b/src/api/eam/basic/deviceMoldItemsHistory/index.ts new file mode 100644 index 0000000..10c620e --- /dev/null +++ b/src/api/eam/basic/deviceMoldItemsHistory/index.ts @@ -0,0 +1,60 @@ +import request from '@/config/axios' + +export interface DeviceMoldItemsHistoryVO { + id: number + name: string + deviceNumber: string + executionCycle: string + equipmentParts: string + type: string + status: string + peoples: number + estimatedMinutes: number + remark: string + siteId: string + available: string + concurrencyStamp: number + peopleNum: number + maintenanceTime: number +} + +// 查询项记录历史表(设备 模具 保养 维修 巡检点检)列表 +export const getDeviceMoldItemsHistoryPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/record/device-mold-items-history/senior', data }) + } else { + return await request.get({ url: `/record/device-mold-items-history/page`, params }) + } +} + +// 查询项记录历史表(设备 模具 保养 维修 巡检点检)详情 +export const getDeviceMoldItemsHistory = async (id: number) => { + return await request.get({ url: `/record/device-mold-items-history/get?id=` + id }) +} + +// 新增项记录历史表(设备 模具 保养 维修 巡检点检) +export const createDeviceMoldItemsHistory = async (data: DeviceMoldItemsHistoryVO) => { + return await request.post({ url: `/record/device-mold-items-history/create`, data }) +} + +// 修改项记录历史表(设备 模具 保养 维修 巡检点检) +export const updateDeviceMoldItemsHistory = async (data: DeviceMoldItemsHistoryVO) => { + return await request.put({ url: `/record/device-mold-items-history/update`, data }) +} + +// 删除项记录历史表(设备 模具 保养 维修 巡检点检) +export const deleteDeviceMoldItemsHistory = async (id: number) => { + return await request.delete({ url: `/record/device-mold-items-history/delete?id=` + id }) +} + +// 导出项记录历史表(设备 模具 保养 维修 巡检点检) Excel +export const exportDeviceMoldItemsHistory = async (params) => { + return await request.download({ url: `/record/device-mold-items-history/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/record/device-mold-items-history/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/basic/factoryArea/index.ts b/src/api/eam/basic/factoryArea/index.ts new file mode 100644 index 0000000..402ee57 --- /dev/null +++ b/src/api/eam/basic/factoryArea/index.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +export interface FactoryAreaVO { + number: string + name: string + description: string + leader: string + leaderPhone: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询厂区列表 +export const getFactoryAreaPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/factory-area/senior', data }) + } else { + return await request.get({ url: `/eam/factory-area/page`, params }) + } +} + +// 查询厂区详情 +export const getFactoryArea = async (id: number) => { + return await request.get({ url: `/eam/factory-area/get?id=` + id }) +} + +// 新增厂区 +export const createFactoryArea = async (data: FactoryAreaVO) => { + return await request.post({ url: `/eam/factory-area/create`, data }) +} + +// 修改厂区 +export const updateFactoryArea = async (data: FactoryAreaVO) => { + return await request.put({ url: `/eam/factory-area/update`, data }) +} + +// 删除厂区 +export const deleteFactoryArea = async (id: number) => { + return await request.delete({ url: `/eam/factory-area/delete?id=` + id }) +} + +// 导出厂区 Excel +export const exportFactoryArea = async (params) => { + return await request.download({ url: `/eam/factory-area/export-excel`, params }) +} + diff --git a/src/api/eam/basic/fixedAssets/index.ts b/src/api/eam/basic/fixedAssets/index.ts new file mode 100644 index 0000000..6911147 --- /dev/null +++ b/src/api/eam/basic/fixedAssets/index.ts @@ -0,0 +1,87 @@ +import request from '@/config/axios' +import { getStrDictOptions } from '@/utils/dict' +import { useUserStore } from '@/store/modules/user' + +export interface FixedAssetsVO { + number: string + name: string + accountingUnit: string + specifications: string + locationNumber: string + purchaseDate: Date + purchaseDept: string + supplierNumber: string + productionDate: Date + purchasePrice: number + manageDept: string + unit: string + qty: number + siteId: string + available: string + concurrencyStamp: number +} + +export const getFixedAssetsPage = async (params) => { + const userStore = useUserStore() // 用户信息 + const deviceMoldTypeList = getStrDictOptions(DICT_TYPE.SPECIAL_DEPT_ROLE) + + // 查找第一个同时存在于userStore.roles和deviceMoldTypeList中的值 + const matchingRole = userStore.roles.find(role => + deviceMoldTypeList.some(deviceMold => deviceMold.value === role) + ); + + const admin = userStore.roles.find(role => { + if (role == 'gdzc_admin') { + return true; + } else { + return false; + } + }); + + // 如果找到了匹配的角色,将它作为manageDept的值加入到params中 + if (matchingRole) { + params.manageDept = matchingRole; // 这里只添加第一个匹配的角色 + } else if(admin){ + params.manageDept = null; + } else { + params.manageDept = 'bukenengpipeidedao@3&*#@'; + } + + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/fixed-assets/senior', data }) + } else { + return await request.get({ url: `/eam/fixed-assets/page`, params }) + } +} + +// 查询固定资产详情 +export const getFixedAssets = async (id: number) => { + return await request.get({ url: `/eam/fixed-assets/get?id=` + id }) +} + +// 新增固定资产 +export const createFixedAssets = async (data: FixedAssetsVO) => { + return await request.post({ url: `/eam/fixed-assets/create`, data }) +} + +// 修改固定资产 +export const updateFixedAssets = async (data: FixedAssetsVO) => { + return await request.put({ url: `/eam/fixed-assets/update`, data }) +} + +// 删除固定资产 +export const deleteFixedAssets = async (id: number) => { + return await request.delete({ url: `/eam/fixed-assets/delete?id=` + id }) +} + +// 导出固定资产 Excel +export const exportFixedAssets = async (params) => { + return await request.download({ url: `/eam/fixed-assets/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/fixed-assets/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/basic/inspection/index.ts b/src/api/eam/basic/inspection/index.ts new file mode 100644 index 0000000..4931600 --- /dev/null +++ b/src/api/eam/basic/inspection/index.ts @@ -0,0 +1,89 @@ +import request from '@/config/axios' + +export interface DeviceMoldItemsVO { + name: string + deviceNumber: string + type: string + status: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询设备项记录表(设备 模具 保养 维修 巡检点检)列表 +export const getDeviceMoldItemsPage = async (params) => { + params.type="DEVICE" + params.status="INSPECTION" + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-mold-items/senior', data }) + } else { + return await request.get({ url: `/eam/device-mold-items/page`, params }) + } +} + +// 查询模具项记录表(设备 模具 保养 维修 巡检点检)列表 +export const getMoldItemsPage = async (params) => { + params.type="MOLD" + params.status="INSPECTION" + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-mold-items/senior', data }) + } else { + return await request.get({ url: `/eam/device-mold-items/page`, params }) + } +} + + +// 查询项记录表(设备 模具 保养 维修 巡检点检)详情 +export const getDeviceMoldItems = async (id: number) => { + return await request.get({ url: `/eam/device-mold-items/get?id=` + id }) +} + +// 查询供应商发票申请主详情 +export const getNumber = async (params) => { + return await request.get({ url: `/eam/device-mold-items/getNumber`, params}) +} + +// 新增设备项记录表(设备 模具 保养 维修 巡检点检) +export const createDeviceMoldItems = async (data: DeviceMoldItemsVO) => { + data.type="DEVICE" + data.status="INSPECTION" + return await request.post({ url: `/eam/device-mold-items/create`, data }) +} +//新增模具 +export const creatMoldItems = async (data: DeviceMoldItemsVO) => { + debugger + data.type="MOLD" + data.status="INSPECTION" + return await request.post({ url: `/eam/device-mold-items/create`, data }) +} + +// 修改项记录表(设备 模具 保养 维修 巡检点检) +export const updateDeviceMoldItems = async (data: DeviceMoldItemsVO) => { + data.type="DEVICE" + data.status="INSPECTION" + return await request.put({ url: `/eam/device-mold-items/update`, data }) +} + +// 修改模具项记录表(设备 模具 保养 维修 巡检点检) +export const updateMoldItems = async (data: DeviceMoldItemsVO) => { + debugger + data.type="MOLD" + data.status="INSPECTION" + return await request.put({ url: `/eam/device-mold-items/update`, data }) +} + +// 删除项记录表(设备 模具 保养 维修 巡检点检) +export const deleteDeviceMoldItems = async (id: number, remark: string) => { + return await request.delete({ url: `/eam/device-mold-items/delete?id=` + id + `&remark=` + remark }) +} + +// 导出项记录表(设备 模具 保养 维修 巡检点检) Excel +export const exportDeviceMoldItems = async (params) => { + return await request.download({ url: `/eam/device-mold-items/export-excel`, params }) +} + + diff --git a/src/api/eam/basic/item/index.ts b/src/api/eam/basic/item/index.ts new file mode 100644 index 0000000..35d3e10 --- /dev/null +++ b/src/api/eam/basic/item/index.ts @@ -0,0 +1,80 @@ +import request from '@/config/axios' + +export interface ItemVO { + number : string + name : string + brand : string + specifications : string + isConstant : string + subject : string + classification : string + uom : string + singlePrice : number + reprocurement : number + safetyStock : number + cost : string + purchaser : string + financer : string + isFramework : string + isRadeIn : string + siteId : string + available : string + concurrencyStamp : number +} + +// 查询备件列表 +export const getItemPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = { ...params } + return await request.post({ url: '/eam/item/senior', data }) + } else { + return await request.get({ url: `/eam/item/page`, params }) + } +} + +// 生成标签 +export const genDevice = async (data) => { + return await request.post({ url: `/eam/item/genDevice`, data }) +} + +// 查询备件详情 +export const getItem = async (id : number) => { + return await request.get({ url: `/eam/item/get?id=` + id }) +} + +// 新增备件 +export const createItem = async (data : ItemVO) => { + return await request.post({ url: `/eam/item/create`, data }) +} + +// 修改备件 +export const updateItem = async (data : ItemVO) => { + return await request.put({ url: `/eam/item/update`, data }) +} + +// 删除备件 +export const deleteItem = async (id : number) => { + return await request.delete({ url: `/eam/item/delete?id=` + id }) +} + +// 导出备件 Excel +export const exportItem = async (params) => { + return await request.download({ url: `/eam/item/export-excel`, params }) +} + +// 修改备件 +export const getItemList = async (params) => { + return await request.get({ url: `/eam/item/getListByNumber`, params }) +} + +// // 删除备件 +// export const getaaa = async () => { +// return await request.get({ url: `/eam/producePlan/produce`}) +// } + +// 备件不分页 + +export const getItemNoPage = async (params) => { + return await request.get({ url: `/eam/item/noPage`, params }) +} diff --git a/src/api/eam/basic/location/index.ts b/src/api/eam/basic/location/index.ts new file mode 100644 index 0000000..66eab6e --- /dev/null +++ b/src/api/eam/basic/location/index.ts @@ -0,0 +1,55 @@ +import request from '@/config/axios' + +export interface LocationVO { + number: string + name: string + description: string + areaNumber: string + type: string + isInAccount: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询库位列表 +export const getLocationPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/location/senior', data }) + } else { + return await request.get({ url: `/eam/location/page`, params }) + } +} + +// 查询库位详情 +export const getLocation = async (id: number) => { + return await request.get({ url: `/eam/location/get?id=` + id }) +} + +// 新增库位 +export const createLocation = async (data: LocationVO) => { + return await request.post({ url: `/eam/location/create`, data }) +} + +// 修改库位 +export const updateLocation = async (data: LocationVO) => { + return await request.put({ url: `/eam/location/update`, data }) +} + +// 删除库位 +export const deleteLocation = async (id: number) => { + return await request.delete({ url: `/eam/location/delete?id=` + id }) +} + +// 导出库位 Excel +export const exportLocation = async (params) => { + return await request.download({ url: `/eam/location/export-excel`, params }) +} + + +// 查询库位列表 +export const getLocationNoPage = async (params) => { + return await request.get({ url: `/eam/location/noPage`, params }) +} diff --git a/src/api/eam/basic/locationArea/index.ts b/src/api/eam/basic/locationArea/index.ts new file mode 100644 index 0000000..e1dd72e --- /dev/null +++ b/src/api/eam/basic/locationArea/index.ts @@ -0,0 +1,48 @@ +import request from '@/config/axios' + +export interface LocationAreaVO { + number: string + name: string + description: string + type: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询库区列表 +export const getLocationAreaPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/location-area/senior', data }) + } else { + return await request.get({ url: `/eam/location-area/page`, params }) + } +} + +// 查询库区详情 +export const getLocationArea = async (id: number) => { + return await request.get({ url: `/eam/location-area/get?id=` + id }) +} + +// 新增库区 +export const createLocationArea = async (data: LocationAreaVO) => { + return await request.post({ url: `/eam/location-area/create`, data }) +} + +// 修改库区 +export const updateLocationArea = async (data: LocationAreaVO) => { + return await request.put({ url: `/eam/location-area/update`, data }) +} + +// 删除库区 +export const deleteLocationArea = async (id: number) => { + return await request.delete({ url: `/eam/location-area/delete?id=` + id }) +} + +// 导出库区 Excel +export const exportLocationArea = async (params) => { + return await request.download({ url: `/eam/location-area/export-excel`, params }) +} + diff --git a/src/api/eam/basic/moldInspection/index.ts b/src/api/eam/basic/moldInspection/index.ts new file mode 100644 index 0000000..1e2d672 --- /dev/null +++ b/src/api/eam/basic/moldInspection/index.ts @@ -0,0 +1,63 @@ +import request from '@/config/axios' + +export interface DeviceMoldItemsVO { + name: string + deviceNumber: string + type: string + status: string + siteId: string + available: string + concurrencyStamp: number +} + + +// 查询模具项记录表(设备 模具 保养 维修 巡检点检)列表 +export const getMoldItemsPage = async (params) => { + params.type="MOLD" + params.status="INSPECTION" + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-mold-items/senior', data }) + } else { + return await request.get({ url: `/eam/device-mold-items/page`, params }) + } +} + + +// 查询项记录表(设备 模具 保养 维修 巡检点检)详情 +export const getDeviceMoldItems = async (id: number) => { + return await request.get({ url: `/eam/device-mold-items/get?id=` + id }) +} + +// 查询供应商发票申请主详情 +export const getNumber = async (params) => { + return await request.get({ url: `/eam/device-mold-items/getNumber`, params}) +} + +//新增模具 +export const creatMoldItems = async (data: DeviceMoldItemsVO) => { + data.type="MOLD" + data.status="INSPECTION" + return await request.post({ url: `/eam/device-mold-items/create`, data }) +} + + +// 修改模具项记录表(设备 模具 保养 维修 巡检点检) +export const updateMoldItems = async (data: DeviceMoldItemsVO) => { + data.type="MOLD" + data.status="INSPECTION" + return await request.put({ url: `/eam/device-mold-items/update`, data }) +} + +// 删除项记录表(设备 模具 保养 维修 巡检点检) +export const deleteDeviceMoldItems = async (id: number) => { + return await request.delete({ url: `/eam/device-mold-items/delete?id=` + id }) +} + +// 导出项记录表(设备 模具 保养 维修 巡检点检) Excel +export const exportDeviceMoldItems = async (params) => { + return await request.download({ url: `/eam/device-mold-items/export-excel`, params }) +} + + diff --git a/src/api/eam/basic/moldMaintenance/index.ts b/src/api/eam/basic/moldMaintenance/index.ts new file mode 100644 index 0000000..4a1fdbc --- /dev/null +++ b/src/api/eam/basic/moldMaintenance/index.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' + +export interface DeviceMoldItemsVO { + name: string + deviceNumber: string + type: "MOLD" + status: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询项记录表(设备 模具 保养 维修 巡检点检)列表 +export const getDeviceMoldItemsPage = async (params) => { + params.type="MOLD" + params.status="MAINTAIN" + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-mold-items/senior', data }) + } else { + return await request.get({ url: `/eam/device-mold-items/page`, params }) + } +} + + +// 查询项记录表(设备 模具 保养 维修 巡检点检)详情 +export const getDeviceMoldItems = async (id: number) => { + return await request.get({ url: `/eam/device-mold-items/get?id=` + id }) +} + +// 查询供应商发票申请主详情 +export const getNumber = async (params) => { + return await request.get({ url: `/eam/device-mold-items/getNumber`, params}) +} + +// 新增项记录表(设备 模具 保养 维修 巡检点检) +export const createDeviceMoldItems = async (data: DeviceMoldItemsVO) => { + data.type="MOLD" + data.status="MAINTAIN" + return await request.post({ url: `/eam/device-mold-items/create`, data }) +} + +// 修改项记录表(设备 模具 保养 维修 巡检点检) +export const updateDeviceMoldItems = async (data: DeviceMoldItemsVO) => { + data.type="MOLD" + data.status="MAINTAIN" + return await request.put({ url: `/eam/device-mold-items/update`, data }) +} + +// 删除项记录表(设备 模具 保养 维修 巡检点检) +export const deleteDeviceMoldItems = async (id: number, remark: string) => { + return await request.delete({ url: `/eam/device-mold-items/delete?id=` + id + `&remark=` + remark }) +} + +// 导出项记录表(设备 模具 保养 维修 巡检点检) Excel +export const exportDeviceMoldItems = async (params) => { + return await request.download({ url: `/eam/device-mold-items/export-excel`, params }) +} + + diff --git a/src/api/eam/basic/moldMilestone/index.ts b/src/api/eam/basic/moldMilestone/index.ts new file mode 100644 index 0000000..4322b0d --- /dev/null +++ b/src/api/eam/basic/moldMilestone/index.ts @@ -0,0 +1,53 @@ +import request from '@/config/axios' + +export interface MoldMilestoneVO { + id: number + number: string + moldNumber: string + milestoneStage: string + milestoneDate: localdate + siteId: string + available: string + concurrencyStamp: number +} + +// 查询模具里程碑列表 +export const getMoldMilestonePage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/basic/mold-milestone/senior', data }) + } else { + return await request.get({ url: `/basic/mold-milestone/page`, params }) + } +} + +// 查询模具里程碑详情 +export const getMoldMilestone = async (id: number) => { + return await request.get({ url: `/basic/mold-milestone/get?id=` + id }) +} + +// 新增模具里程碑 +export const createMoldMilestone = async (data: MoldMilestoneVO) => { + return await request.post({ url: `/basic/mold-milestone/create`, data }) +} + +// 修改模具里程碑 +export const updateMoldMilestone = async (data: MoldMilestoneVO) => { + return await request.put({ url: `/basic/mold-milestone/update`, data }) +} + +// 删除模具里程碑 +export const deleteMoldMilestone = async (id: number) => { + return await request.delete({ url: `/basic/mold-milestone/delete?id=` + id }) +} + +// 导出模具里程碑 Excel +export const exportMoldMilestone = async (params) => { + return await request.download({ url: `/basic/mold-milestone/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/basic/mold-milestone/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/basic/rel/index.ts b/src/api/eam/basic/rel/index.ts new file mode 100644 index 0000000..70fe0d1 --- /dev/null +++ b/src/api/eam/basic/rel/index.ts @@ -0,0 +1,57 @@ +import request from '@/config/axios' + +export interface DeviceItemVO { + itemNumber: string + deviceNumber: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询设备备件关系列表 +export const getDeviceItemPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/rel/device-item/senior', data }) + } else { + return await request.get({ url: `/rel/device-item/page`, params }) + } +} + +// 查询设备备件关系详情 +export const getDeviceItem = async (id: number) => { + return await request.get({ url: `/rel/device-item/get?id=` + id }) +} + +// 新增设备备件关系 +export const createDeviceItem = async (data: DeviceItemVO) => { + return await request.post({ url: `/rel/device-item/create`, data }) +} + +// 修改设备备件关系 +export const updateDeviceItem = async (data: DeviceItemVO) => { + return await request.put({ url: `/rel/device-item/update`, data }) +} + +// 删除设备备件关系 +export const deleteDeviceItem = async (id: number) => { + return await request.delete({ url: `/rel/device-item/delete?id=` + id }) +} + +// 导出设备备件关系 Excel +export const exportDeviceItem = async (params) => { + return await request.download({ url: `/rel/device-item/export-excel`, params }) +} + +// 新增设备备件关系 +export const createDeviceItemBatch = async (data: Array) => { + return await request.post({url: `/rel/device-item/createBatch `, data }); +}; + + + +// 查询设备备件关系列表 +export const getDeviceItemNoPage = async (params) => { + return await request.get({ url: `/rel/device-item/noPage`, params }) +} \ No newline at end of file diff --git a/src/api/eam/basic/supplier/index.ts b/src/api/eam/basic/supplier/index.ts new file mode 100644 index 0000000..f09e101 --- /dev/null +++ b/src/api/eam/basic/supplier/index.ts @@ -0,0 +1,59 @@ +import request from '@/config/axios' + +export interface SupplierVO { + number: string + name: string + shortName: string + address: string + country: string + city: string + phone: string + fax: string + postId: string + contacts: string + available: string + remark: string + siteId: string +} + +// 查询供应商列表 +export const getSupplierPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/supplier/senior', data }) + } else { + return await request.get({ url: `/eam/supplier/page`, params }) + } +} + +// 查询供应商详情 +export const getSupplier = async (id: number) => { + return await request.get({ url: `/eam/supplier/get?id=` + id }) +} + +// 新增供应商 +export const createSupplier = async (data: SupplierVO) => { + return await request.post({ url: `/eam/supplier/create`, data }) +} + +// 修改供应商 +export const updateSupplier = async (data: SupplierVO) => { + return await request.put({ url: `/eam/supplier/update`, data }) +} + +// 删除供应商 +export const deleteSupplier = async (id: number) => { + return await request.delete({ url: `/eam/supplier/delete?id=` + id }) +} + +// 导出供应商 Excel +export const exportSupplier = async (params) => { + return await request.download({ url: `/eam/supplier/export-excel`, params }) +} + +// 查询供应商列表 +export const getSupplierNoPage = async (params) => { + return await request.get({ url: `/eam/supplier/noPage`, params }) +} + diff --git a/src/api/eam/device/deviceAccounts/index.ts b/src/api/eam/device/deviceAccounts/index.ts new file mode 100644 index 0000000..cba18c7 --- /dev/null +++ b/src/api/eam/device/deviceAccounts/index.ts @@ -0,0 +1,72 @@ +import request from '@/config/axios' + +export interface DeviceAccountsVO { + number: string + name: string + specification: string + type: string + factoryAreaNumber: string + purchaseTime: Date + deptId: number + purchaser: number + supplierNumber: string + productionDate: Date + purchasePrice: number + siteId: string + available: string + concurrencyStamp: number +} + +// 查询设备台账列表 +export const getDeviceAccountsPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-accounts/senior', data }) + } else { + return await request.get({ url: `/eam/device-accounts/page`, params }) + } +} + +// 查询设备台账详情 +export const getDeviceAccounts = async (id: number) => { + return await request.get({ url: `/eam/device-accounts/get?id=` + id }) +} + +// 新增设备台账 +export const createDeviceAccounts = async (data: DeviceAccountsVO) => { + return await request.post({ url: `/eam/device-accounts/create`, data }) +} + +// 修改设备台账 +export const updateDeviceAccounts = async (data: DeviceAccountsVO) => { + return await request.put({ url: `/eam/device-accounts/update`, data }) +} + +// 删除设备台账 +export const deleteDeviceAccounts = async (id: number) => { + return await request.delete({ url: `/eam/device-accounts/delete?id=` + id }) +} + +// 导出设备台账 Excel +export const exportDeviceAccounts = async (params) => { + return await request.download({ url: `/eam/device-accounts/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/device-accounts/get-import-template' }) +} + + +// 查询设备台账列表 +export const getDeviceAccountsNoPage = async (params) => { + return await request.get({ url: `/eam/device-accounts/selectData`, params }) +} + + +// 查询设备台账全部列表 +export const getDeviceAccountsAllNoPage = async (data: DeviceAccountsVO) => { + return await request.post({ url: `/eam/device-accounts/noPage`,data }) +} + diff --git a/src/api/eam/device/deviceAllot/index.ts b/src/api/eam/device/deviceAllot/index.ts new file mode 100644 index 0000000..59def69 --- /dev/null +++ b/src/api/eam/device/deviceAllot/index.ts @@ -0,0 +1,59 @@ +import request from '@/config/axios' + +export interface DeviceAccountsVO { + number: string + name: string + specification: string + type: string + factoryAreaNumber: string + purchaseTime: Date + deptId: number + purchaser: number + supplierNumber: string + productionDate: Date + purchasePrice: number + siteId: string + available: string + concurrencyStamp: number +} + +// 查询备件台账列表 +export const getDeviceAccountsPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-accounts/senior', data }) + } else { + return await request.get({ url: `/eam/device-accounts/page`, params }) + } +} + +// 查询备件台账详情 +export const getDeviceAccounts = async (id: number) => { + return await request.get({ url: `/eam/device-accounts/get?id=` + id }) +} + +// 新增备件台账 +export const createDeviceAccounts = async (data: DeviceAccountsVO) => { + return await request.post({ url: `/eam/device-accounts/create`, data }) +} + +// 修改备件台账 +export const updateDeviceAccounts = async (data: DeviceAccountsVO) => { + return await request.put({ url: `/eam/device-accounts/update`, data }) +} + +// 删除备件台账 +export const deleteDeviceAccounts = async (id: number) => { + return await request.delete({ url: `/eam/device-accounts/delete?id=` + id }) +} + +// 导出备件台账 Excel +export const exportDeviceAccounts = async (params) => { + return await request.download({ url: `/eam/device-accounts/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/device-accounts/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/device/deviceInspectionDetail/index.ts b/src/api/eam/device/deviceInspectionDetail/index.ts new file mode 100644 index 0000000..bc303c4 --- /dev/null +++ b/src/api/eam/device/deviceInspectionDetail/index.ts @@ -0,0 +1,59 @@ +import request from '@/config/axios' + +export interface DeviceInspectionDetailVO { + id: number + number: string + siteId: string + available: string + concurrencyStamp: number + name: string + peoples: string + estimatedMinutes: number + actualMinutes: number + chargePeoples: string + completionTime: Date + engineer: string + uncompleted: string + status: string +} + +// 查询检修工单子列表 +export const getDeviceInspectionDetailPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-inspection-job-detail/senior', data }) + } else { + return await request.get({ url: `/eam/device-inspection-job-detail/page`, params }) + } +} + +// 查询检修工单子详情 +export const getDeviceInspectionDetail = async (id: number) => { + return await request.get({ url: `/eam/device-inspection-job-detail/get?id=` + id }) +} + +// 新增检修工单子 +export const createDeviceInspectionDetail = async (data: DeviceInspectionDetailVO) => { + return await request.post({ url: `/eam/device-inspection-job-detail/create`, data }) +} + +// 修改检修工单子 +export const updateDeviceInspectionDetail = async (data: DeviceInspectionDetailVO) => { + return await request.put({ url: `/eam/device-inspection-job-detail/update`, data }) +} + +// 删除检修工单子 +export const deleteDeviceInspectionDetail = async (id: number) => { + return await request.delete({ url: `/eam/device-inspection-job-detail/delete?id=` + id }) +} + +// 导出检修工单子 Excel +export const exportDeviceInspectionDetail = async (params) => { + return await request.download({ url: `/eam/device-inspection-job-detail/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/device-inspection-job-detail/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/device/deviceInspectionMain/index.ts b/src/api/eam/device/deviceInspectionMain/index.ts new file mode 100644 index 0000000..2330bb9 --- /dev/null +++ b/src/api/eam/device/deviceInspectionMain/index.ts @@ -0,0 +1,76 @@ +import request from '@/config/axios' + +export interface DeviceInspectionMainVO { + number: string + maintenanceNumber: string + deviceNumber: string + factoryAreaNumber: string + describe: string + maintenance: number + maintenancePhone: string + status: string + type: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询检修工单主列表 +export const getDeviceInspectionMainPage = async (params) => { + params.type = 'DEVICE' + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-inspection-job-main/senior', data }) + } else { + return await request.get({ url: `/eam/device-inspection-job-main/page`, params }) + } +} + +// 查询检修工单主详情 +export const getDeviceInspectionMain = async (id: number) => { + return await request.get({ url: `/eam/device-inspection-job-main/get?id=` + id }) +} + +// 新增检修工单主 +export const createDeviceInspectionMain = async (data: DeviceInspectionMainVO) => { + return await request.post({ url: `/eam/device-inspection-job-main/createPC`, data }) +} + +// 修改检修工单主 +export const updateDeviceInspectionMain = async (data: DeviceInspectionMainVO) => { + return await request.put({ url: `/eam/device-inspection-job-main/update`, data }) +} + +// 删除检修工单主 +export const deleteDeviceInspectionMain = async (id: number) => { + return await request.delete({ url: `/eam/device-inspection-job-main/delete?id=` + id }) +} + +// 导出检修工单主 Excel +export const exportDeviceInspectionMain = async (params) => { + return await request.download({ url: `/eam/device-inspection-job-main/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: `/eam/device-inspection-job-main/get-import-template` }) +} + + +// 检修完成 +export const finishInspection = (id: number) => { + return request.get({ url: `/eam/device-inspection-job-main/orderClickFinish?id=` + id }) +} + + +// 查询检修工单主列表 +export const getDeviceInspectionMainNoPage = async (params) => { + return await request.get({ url: `/eam/device-inspection-job-main/noPage`, params }) +} + + +//验证 +export const verifyOrder = async (id: number,verifyContent: string) => { + return await request.get({ url: `/eam/device-inspection-job-main/orderClickVerify?id=`+id+`&verifyContent=` + verifyContent }) +} diff --git a/src/api/eam/device/deviceInternalAudit/index.ts b/src/api/eam/device/deviceInternalAudit/index.ts new file mode 100644 index 0000000..ed90b3e --- /dev/null +++ b/src/api/eam/device/deviceInternalAudit/index.ts @@ -0,0 +1,59 @@ +import request from '@/config/axios' + +export interface DeviceInternalAuditVO { + id: number + number: string + describes: string + personer: string + fitOut: number + coating: number + injectionMolding: number + business: number + laboratory: number + it: number + qualityDepartment: number + materialFlow: number + moldPre: number + available: string +} + +// 查询设备内审业务说明列表 +export const getDeviceInternalAuditPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-internal-audit/senior', data }) + } else { + return await request.get({ url: `/eam/device-internal-audit/page`, params }) + } +} + +// 查询设备内审业务说明详情 +export const getDeviceInternalAudit = async (id: number) => { + return await request.get({ url: `/eam/device-internal-audit/get?id=` + id }) +} + +// 新增设备内审业务说明 +export const createDeviceInternalAudit = async (data: DeviceInternalAuditVO) => { + return await request.post({ url: `/eam/device-internal-audit/create`, data }) +} + +// 修改设备内审业务说明 +export const updateDeviceInternalAudit = async (data: DeviceInternalAuditVO) => { + return await request.put({ url: `/eam/device-internal-audit/update`, data }) +} + +// 删除设备内审业务说明 +export const deleteDeviceInternalAudit = async (id: number) => { + return await request.delete({ url: `/eam/device-internal-audit/delete?id=` + id }) +} + +// 导出设备内审业务说明 Excel +export const exportDeviceInternalAudit = async (params) => { + return await request.download({ url: `/eam/device-internal-audit/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/device-internal-audit/get-import-template' }) +} diff --git a/src/api/eam/device/deviceMaintainOrderDetail/index.ts b/src/api/eam/device/deviceMaintainOrderDetail/index.ts new file mode 100644 index 0000000..165d18c --- /dev/null +++ b/src/api/eam/device/deviceMaintainOrderDetail/index.ts @@ -0,0 +1,60 @@ +import request from '@/config/axios' + +export interface DeviceMaintainOrderDetailVO { + id: number + siteId: string + available: string + concurrencyStamp: number + name: string + number: string + peoples: number + estimatedMinutes: number + actualMinutes: number + chargePeoples: string + completionTime: Date + engineer: string + uncompleted: string + status: string + contents: string +} + +// 查询保养工单子列表 +export const getDeviceMaintainOrderDetailPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-maintain-job-detail/senior', data }) + } else { + return await request.get({ url: `/eam/device-maintain-job-detail/page`, params }) + } +} + +// 查询保养工单子详情 +export const getDeviceMaintainOrderDetail = async (id: number) => { + return await request.get({ url: `/eam/device-maintain-job-detail/get?id=` + id }) +} + +// 新增保养工单子 +export const createDeviceMaintainOrderDetail = async (data: DeviceMaintainOrderDetailVO) => { + return await request.post({ url: `/eam/device-maintain-job-detail/create`, data }) +} + +// 修改保养工单子 +export const updateDeviceMaintainOrderDetail = async (data: DeviceMaintainOrderDetailVO) => { + return await request.put({ url: `/eam/device-maintain-job-detail/update`, data }) +} + +// 删除保养工单子 +export const deleteDeviceMaintainOrderDetail = async (id: number) => { + return await request.delete({ url: `/eam/device-maintain-job-detail/delete?id=` + id }) +} + +// 导出保养工单子 Excel +export const exportDeviceMaintainOrderDetail = async (params) => { + return await request.download({ url: `/eam/device-maintain-job-detail/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/device-maintain-job-detail/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/device/deviceMaintainOrderMain/index.ts b/src/api/eam/device/deviceMaintainOrderMain/index.ts new file mode 100644 index 0000000..a79189c --- /dev/null +++ b/src/api/eam/device/deviceMaintainOrderMain/index.ts @@ -0,0 +1,76 @@ +import request from '@/config/axios' + +export interface DeviceMaintainOrderMainVO { + number: string + name: string + planNumber: string + deviceNumber: string + factoryAreaNumber: string + engineer: number + receiveTime: Date + assignTime: Date + worker: number + finishedTime: Date + verifyTime: Date + status: string + type: string + siteId: string + available: string + concurrencyStamp: number +} +// 查询保养工单主列表 +export const getDeviceMaintainOrderMainPage = async (params) => { + params.type = 'DEVICE' + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-maintain-job-main/senior', data }) + } else { + return await request.get({ url: `/eam/device-maintain-job-main/page`, params }) + } +} + +// 查询保养工单主详情 +export const getDeviceMaintainOrderMain = async (id: number) => { + return await request.get({ url: `/eam/device-maintain-job-main/get?id=` + id }) +} + +// 新增保养工单主 +export const createDeviceMaintainOrderMain = async (data: DeviceMaintainOrderMainVO) => { + return await request.post({ url: `/eam/device-maintain-job-main/create`, data }) +} + +// 修改保养工单主 +export const updateDeviceMaintainOrderMain = async (data: DeviceMaintainOrderMainVO) => { + return await request.put({ url: `/eam/device-maintain-job-main/update`, data }) +} + +// 删除保养工单主 +export const deleteDeviceMaintainOrderMain = async (id: number) => { + return await request.delete({ url: `/eam/device-maintain-job-main/delete?id=` + id }) +} + +// 导出保养工单主 Excel +export const exportDeviceMaintainOrderMain = async (params) => { + return await request.download({ url: `/eam/device-maintain-job-main/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/device-maintain-job-main/get-import-template' }) +} + +// 保养接单 +export const orderClick = (id: number) => { + return request.get({ url: '/eam/device-maintain-job-main/orderClick?id=' + id }) +} + +// 保养完成 +export const orderClickFinish = (id: number) => { + return request.get({ url: '/eam/device-maintain-job-main/orderClickFinish?id=' + id }) +} + +// 验证 +export const orderClickApprove = (id: number,status: string,verifyContent: string) => { + return request.get({ url: '/eam/device-maintain-job-main/orderClickVerify?id=' + id + '&status=' + status + '&verifyContent=' + verifyContent }) +} diff --git a/src/api/eam/device/deviceMaintainPlan/index.ts b/src/api/eam/device/deviceMaintainPlan/index.ts new file mode 100644 index 0000000..016d33f --- /dev/null +++ b/src/api/eam/device/deviceMaintainPlan/index.ts @@ -0,0 +1,55 @@ +import request from '@/config/axios' + +export interface DeviceMaintainPlanVO { + number: string + name: string + maintenanceType: string + cycle: string + times: number + type: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询保养计划列表 +export const getDeviceMaintainPlanPage = async (params) => { + params.type = 'DEVICE' + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-maintain-plan/senior', data }) + } else { + return await request.get({ url: `/eam/device-maintain-plan/page`, params }) + } +} + +// 查询保养计划详情 +export const getDeviceMaintainPlan = async (id: number) => { + return await request.get({ url: `/eam/device-maintain-plan/get?id=` + id }) +} + +// 新增保养计划 +export const createDeviceMaintainPlan = async (data: DeviceMaintainPlanVO) => { + return await request.post({ url: `/eam/device-maintain-plan/create`, data }) +} + +// 修改保养计划 +export const updateDeviceMaintainPlan = async (data: DeviceMaintainPlanVO) => { + return await request.put({ url: `/eam/device-maintain-plan/update`, data }) +} + +// 删除保养计划 +export const deleteDeviceMaintainPlan = async (id: number) => { + return await request.delete({ url: `/eam/device-maintain-plan/delete?id=` + id }) +} + +// 导出保养计划 Excel +export const exportDeviceMaintainPlan = async (params) => { + return await request.download({ url: `/eam/device-maintain-plan/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/device-maintain-plan/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/device/deviceMaintenanceDetail/index.ts b/src/api/eam/device/deviceMaintenanceDetail/index.ts new file mode 100644 index 0000000..b3b9c78 --- /dev/null +++ b/src/api/eam/device/deviceMaintenanceDetail/index.ts @@ -0,0 +1,51 @@ +import request from '@/config/axios' + +export interface DeviceMaintenanceDetailVO { +  describes: string +  describes1: string +  workOut: string +  maintenances: string +} + +// 查询维修工单子列表 +export const getDeviceMaintenanceDetailPage = async (params) => { +  if (params.isSearch) { +    delete params.isSearch +    const data = {...params} +    return await request.post({ url: '/wms/purchasereceipt-request-detail/senior', data }) +  } else { +    return await request.get({ url: `/eam/device-maintenance-job-detail/page`, params }) +  } +} + +// 查询维修工单子详情 +export const getPurchasereceiptRequestDetail = async (id) => { +  return await request.get({ url: `/eam/device-maintenance-job-detail/selectListByNumber?id=` + id }) +} + +// 新增维修工单子 +export const createDeviceMaintenanceDetail = async (data: DeviceMaintenanceDetailVO) => { +  return await request.post({ url: `/eam/device-maintenance-job-detail/create`, data }) +} + +// 修改维修工单子 +export const updateDeviceMaintenanceDetail = async (data: DeviceMaintenanceDetailVO) => { +  return await request.put({ url: `/eam/device-maintenance-job-detail/update`, data }) +} + +// 删除维修工单子 +export const deleteDeviceMaintenanceDetail = async (id: number) => { +  return await request.delete({ url: `/eam/device-maintenance-job-detail/delete?id=` + id }) +} + + + +// 导出维修工单子 Excel +export const exportPurchasereceiptRequestDetail = async (params) => { +  return await request.download({ url: `/wms/purchasereceipt-request-detail/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { +  return request.download({ url: '/wms/purchasereceipt-request-detail/get-import-template' }) +} diff --git a/src/api/eam/device/deviceMaintenanceMain/index.ts b/src/api/eam/device/deviceMaintenanceMain/index.ts new file mode 100644 index 0000000..8684350 --- /dev/null +++ b/src/api/eam/device/deviceMaintenanceMain/index.ts @@ -0,0 +1,94 @@ +import request from '@/config/axios' + +export interface DeviceMaintenanceMainVO { + id: number + number: string + requestNumber: string + describe: string + deviceNumber: string + factoryAreaNumber: string + maintenance: number + maintenancePhone: string + status: string + type: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询维修工单主列表 +export const getDeviceMaintenanceMainPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-maintenance-job-main/senior', data }) + } else { + return await request.get({ url: `/eam/device-maintenance-job-main/page`, params }) + } +} + +// 查询维修工单主详情 +export const getDeviceMaintenanceMain = async (id: number) => { + return await request.get({ url: `/eam/device-maintenance-job-main/get?id=` + id }) +} + +// 新增维修工单主 +export const createDeviceMaintenanceMain = async (data: DeviceMaintenanceMainVO) => { + return await request.post({ url: `/eam/device-maintenance-job-main/createPC`, data }) +} + +// 修改维修工单主 +export const updateDeviceMaintenanceMain = async (data: DeviceMaintenanceMainVO) => { + return await request.put({ url: `/eam/device-maintenance-job-main/update`, data }) +} +// 删除维修工单主 +export const deleteDeviceMaintenanceMain = async (id: number) => { + return await request.delete({ url: `/eam/device-maintenance-job-main/delete?id=` + id }) +} + +// 导出维修工单主 Excel +export const exportDeviceMaintenanceMain = async (params) => { + return await request.download({ url: `/eam/device-maintenance-job-main/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/device-maintenance-job-main/get-import-template' }) +} + +// 修改维修工单主 +export const orderStepChange = async (data: DeviceMaintenanceMainVO) => { + return await request.get({ url: `/eam/device-maintenance-job-main/orderClick?number=`+data.number+`&status=`+data.status+`&id=`+data.id+`&requestNumber=`+data.requestNumber }) +} + +// 修改维修工单主 +export const orderTurnTo = async (data: DeviceMaintenanceMainVO) => { + return await request.get({ url: `/eam/device-maintenance-job-main/turnTo?deviceNumber=`+data.deviceNumber +`&id=`+data.id + `&receiverType=`+ data.type +`&receiverUserId=` + data.maintenance }) +} + + +// 查询维修工单主列表不分页 +export const getDeviceMainTempList = async (type: String) => { + return await request.get({ url: `/eam/device-maintenance-job-main/getList?type=` + type }) +} + + + +// 完成维修工单 +export const finishOrder = async (params) => { + return await request.get({ url: `/eam/device-maintenance-job-main/orderClickFinish`, params}) +} + + + +// 校验维修工单 +export const verifyOrder = async (params) => { + return await request.get({ url: `/eam/device-maintenance-job-main/orderClickVerify`, params}) +} + + +// 确认维修工单 +export const confirmOrder = async (params) => { + return await request.get({ url: `/eam/device-maintenance-job-main/orderClickConfirm`, params}) +} + diff --git a/src/api/eam/device/deviceRepair/index.ts b/src/api/eam/device/deviceRepair/index.ts new file mode 100644 index 0000000..1751735 --- /dev/null +++ b/src/api/eam/device/deviceRepair/index.ts @@ -0,0 +1,68 @@ +import request from '@/config/axios' + +export interface DeviceRepairVO { + id: number + number: string + describe: string + deviceNumber: string + factoryAreaNumber: string + declarer: number + declarerPhone: string + faultType: string + type: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询报修申请列表 +export const getDeviceRepairPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = { ...params } + return await request.post({ url: '/eam/device-repair-request/senior', data }) + } else { + return await request.get({ url: `/eam/device-repair-request/page`, params }) + } +} + +// 查询报修申请详情 +export const getDeviceRepair = async (id: number) => { + return await request.get({ url: `/eam/device-repair-request/get?id=` + id }) +} + +// 新增报修申请 +export const createDeviceRepair = async (data: DeviceRepairVO) => { + return await request.post({ url: `/eam/device-repair-request/create`, data }) +} + +// 修改报修申请 +export const updateDeviceRepair = async (data: DeviceRepairVO) => { + return await request.put({ url: `/eam/device-repair-request/update`, data }) +} + +// 删除报修申请 +export const deleteDeviceRepair = async (id: number) => { + return await request.delete({ url: `/eam/device-repair-request/delete?id=` + id }) +} + +// 导出报修申请 Excel +export const exportDeviceRepair = async (params) => { + return await request.download({ url: `/eam/device-repair-request/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/device-repair-request/get-import-template' }) +} + +// 撤销申请 +export const cancel = (id: Number) => { + return request.delete({ url: '/eam/device-repair-request/cancel?id=' + id }) +} + + +// 根据单号查询申请工单信息 +export const getOrderByNumber = (number: Number) => { + return request.get({ url: '/eam/device-repair-request/getOrderByNumber?number=' + number }) +} diff --git a/src/api/eam/device/deviceSpotInspectionRecordDetail/index.ts b/src/api/eam/device/deviceSpotInspectionRecordDetail/index.ts new file mode 100644 index 0000000..f9650b2 --- /dev/null +++ b/src/api/eam/device/deviceSpotInspectionRecordDetail/index.ts @@ -0,0 +1,54 @@ +import request from '@/config/axios' + +export interface DeviceSpotInspectionRecordDetailVO { + id: number + number: string + isConform: string + siteId: string + available: string + concurrencyStamp: number + masterId: number + name: string + equipmentPosition: string +} + +// 查询巡检点检记录子列表 +export const getDeviceSpotInspectionRecordDetailPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-spot-inspection-record-detail/senior', data }) + } else { + return await request.get({ url: `/eam/device-spot-inspection-record-detail/page`, params }) + } +} + +// 查询巡检点检记录子详情 +export const getDeviceSpotInspectionRecordDetail = async (id: number) => { + return await request.get({ url: `/eam/device-spot-inspection-record-detail/get?id=` + id }) +} + +// 新增巡检点检记录子 +export const createDeviceSpotInspectionRecordDetail = async (data: DeviceSpotInspectionRecordDetailVO) => { + return await request.post({ url: `/eam/device-spot-inspection-record-detail/create`, data }) +} + +// 修改巡检点检记录子 +export const updateDeviceSpotInspectionRecordDetail = async (data: DeviceSpotInspectionRecordDetailVO) => { + return await request.put({ url: `/eam/device-spot-inspection-record-detail/update`, data }) +} + +// 删除巡检点检记录子 +export const deleteDeviceSpotInspectionRecordDetail = async (id: number) => { + return await request.delete({ url: `/eam/device-spot-inspection-record-detail/delete?id=` + id }) +} + +// 导出巡检点检记录子 Excel +export const exportDeviceSpotInspectionRecordDetail = async (params) => { + return await request.download({ url: `/eam/device-spot-inspection-record-detail/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/device-spot-inspection-record-detail/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/device/deviceSpotInspectionRecordMain/index.ts b/src/api/eam/device/deviceSpotInspectionRecordMain/index.ts new file mode 100644 index 0000000..cbf0cd4 --- /dev/null +++ b/src/api/eam/device/deviceSpotInspectionRecordMain/index.ts @@ -0,0 +1,56 @@ +import request from '@/config/axios' + +export interface DeviceSpotInspectionRecordMainVO { + number: string + deviceNumber: string + describe: string + maintenance: number + maintenancePhone: string + status: string + type: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询检修工单主列表 +export const getDeviceSpotInspectionRecordMainPage = async (params) => { + params.type = 'DEVICE' + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/device-spot-inspection-record-main/senior', data }) + } else { + return await request.get({ url: `/eam/device-spot-inspection-record-main/page`, params }) + } +} + +// 查询检修工单主详情 +export const getDeviceSpotInspectionRecordMain = async (id: number) => { + return await request.get({ url: `/eam/device-spot-inspection-record-main/get?id=` + id }) +} + +// 新增检修工单主 +export const createDeviceSpotInspectionRecordMain = async (data: DeviceSpotInspectionRecordMainVO) => { + return await request.post({ url: `/eam/device-spot-inspection-record-main/create`, data }) +} + +// 修改检修工单主 +export const updateDeviceSpotInspectionRecordMain = async (data: DeviceSpotInspectionRecordMainVO) => { + return await request.put({ url: `/eam/device-spot-inspection-record-main/update`, data }) +} + +// 删除检修工单主 +export const deleteDeviceSpotInspectionRecordMain = async (id: number) => { + return await request.delete({ url: `/eam/device-spot-inspection-record-main/delete?id=` + id }) +} + +// 导出检修工单主 Excel +export const exportDeviceSpotInspectionRecordMain = async (params) => { + return await request.download({ url: `/eam/device-spot-inspection-record-main/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/device-spot-inspection-record-main/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/device/problemSolving/index.ts b/src/api/eam/device/problemSolving/index.ts new file mode 100644 index 0000000..9c97bc3 --- /dev/null +++ b/src/api/eam/device/problemSolving/index.ts @@ -0,0 +1,55 @@ +import request from '@/config/axios' + +export interface AttachmentFileVO { + itemNumber: string + qty: number + areaNumber: string + isInAccount: string + siteId: string + available: string + funcCode: string + concurrencyStamp: number +} + +// 查询备件台账列表 +export const getProblemSolvingPage = async (params) => { + params.funcCode="problem_solving" + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/attachment-file/senior', data }) + } else { + return await request.get({ url: `/eam/attachment-file/page`, params }) + } +} + +// 查询备件台账详情 +export const getProblemSolving = async (id: number) => { + return await request.get({ url: `/eam/attachment-file/get?id=` + id }) +} + +// 新增备件台账 +export const createProblemSolving = async (data: AttachmentFileVO) => { + data.funcCode="problem_solving" + return await request.post({ url: `/eam/attachment-file/create`, data }) +} + +// 修改备件台账 +export const updateProblemSolving = async (data: AttachmentFileVO) => { + return await request.put({ url: `/eam/attachment-file/update`, data }) +} + +// 删除备件台账 +export const deleteProblemSolving = async (id: number) => { + return await request.delete({ url: `/eam/attachment-file/delete?id=` + id }) +} + +// 导出备件台账 Excel +export const exportProblemSolving = async (params) => { + return await request.download({ url: `/eam/attachment-file/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/attachment-file/get-import-template' }) +} diff --git a/src/api/eam/item/adjustRecordDetail/index.ts b/src/api/eam/item/adjustRecordDetail/index.ts new file mode 100644 index 0000000..d8f18cb --- /dev/null +++ b/src/api/eam/item/adjustRecordDetail/index.ts @@ -0,0 +1,46 @@ +import request from '@/config/axios' + +export interface AdjustRecordDetailVO { + number: string + planNumber: string + requestNumber: string + requestTime: Date + jobNumber: string + recordNumber: string +} + +// 查询备件盘点调整记录主列表 +export const getAdjustRecordDetailPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/adjustRecordDetail/senior', data }) + } else { + return await request.get({ url: `/eam/adjustRecordDetail/page`, params }) + } +} + +// 查询备件盘点调整记录主详情 +export const getAdjustRecordDetail = async (id: number) => { + return await request.get({ url: `/eam/adjustRecordDetail/get?id=` + id }) +} + +// 新增备件盘点调整记录主 +export const createAdjustRecordDetail = async (data: AdjustRecordDetailVO) => { + return await request.post({ url: `/eam/adjustRecordDetail/create`, data }) +} + +// 修改备件盘点调整记录主 +export const updateAdjustRecordDetail = async (data: AdjustRecordDetailVO) => { + return await request.put({ url: `/eam/adjustRecordDetail/update`, data }) +} + +// 删除备件盘点调整记录主 +export const deleteAdjustRecordDetail = async (id: number) => { + return await request.delete({ url: `/eam/adjustRecordDetail/delete?id=` + id }) +} + +// 导出备件盘点调整记录主 Excel +export const exportAdjustRecordDetail = async (params) => { + return await request.download({ url: `/eam/adjustRecordDetail/export-excel`, params }) +} diff --git a/src/api/eam/item/adjustRecordMain/index.ts b/src/api/eam/item/adjustRecordMain/index.ts new file mode 100644 index 0000000..9eb4297 --- /dev/null +++ b/src/api/eam/item/adjustRecordMain/index.ts @@ -0,0 +1,46 @@ +import request from '@/config/axios' + +export interface AdjustRecordMainVO { + number: string + planNumber: string + requestNumber: string + requestTime: Date + jobNumber: string + recordNumber: string +} + +// 查询备件盘点调整记录主列表 +export const getAdjustRecordMainPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/adjustRecordMain/senior', data }) + } else { + return await request.get({ url: `/eam/adjustRecordMain/page`, params }) + } +} + +// 查询备件盘点调整记录主详情 +export const getAdjustRecordMain = async (id: number) => { + return await request.get({ url: `/eam/adjustRecordMain/get?id=` + id }) +} + +// 新增备件盘点调整记录主 +export const createAdjustRecordMain = async (data: AdjustRecordMainVO) => { + return await request.post({ url: `/eam/adjustRecordMain/create`, data }) +} + +// 修改备件盘点调整记录主 +export const updateAdjustRecordMain = async (data: AdjustRecordMainVO) => { + return await request.put({ url: `/eam/adjustRecordMain/update`, data }) +} + +// 删除备件盘点调整记录主 +export const deleteAdjustRecordMain = async (id: number) => { + return await request.delete({ url: `/eam/adjustRecordMain/delete?id=` + id }) +} + +// 导出备件盘点调整记录主 Excel +export const exportAdjustRecordMain = async (params) => { + return await request.download({ url: `/eam/adjustRecordMain/export-excel`, params }) +} diff --git a/src/api/eam/item/applicationRecordDetail/index.ts b/src/api/eam/item/applicationRecordDetail/index.ts new file mode 100644 index 0000000..9a45b46 --- /dev/null +++ b/src/api/eam/item/applicationRecordDetail/index.ts @@ -0,0 +1,57 @@ +import request from '@/config/axios' + +export interface ItemApplyDetailVO { + number : string + name : string + type : string + applyId : number + applyDeptId : number + approveId : number + approveTime : Date + outId : number + outTime : Date + siteId : string + available : string + concurrencyStamp : number +} + +// 查询备件申领记录主列表 +export const getApplicationRecordDetailPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = { ...params } + return await request.post({ url: '/eam/item-apply-request-detail/senior', data }) + } else { + return await request.get({ url: `/eam/item-apply-request-detail/page`, params }) + } +} + +// 查询备件申领记录主详情 +export const getApplicationRecordDetail = async (id : number) => { + return await request.get({ url: `/eam/item-apply-request-detail/get?id=` + id }) +} + +// 新增备件申领记录主 +export const createApplicationRecordDetail = async (data : ItemApplyDetailVO) => { + return await request.post({ url: `/eam/item-apply-request-detail/create`, data }) +} + +// 修改备件申领记录主 +export const updateApplicationRecordDetail = async (data : ItemApplyDetailVO) => { + return await request.put({ url: `/eam/item-apply-request-detail/update`, data }) +} + +// 删除备件申领记录主 +export const deleteApplicationRecordDetail = async (id : number) => { + return await request.delete({ url: `/eam/item-apply-request-detail/delete?id=` + id }) +} + +// 导出备件申领记录主 Excel +export const exportApplicationRecordDetail = async (params) => { + return await request.download({ url: `/eam/item-apply-request-detail/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/item-apply-request-detail/get-import-template' }) +} diff --git a/src/api/eam/item/applicationRecordMain/index.ts b/src/api/eam/item/applicationRecordMain/index.ts new file mode 100644 index 0000000..207b15a --- /dev/null +++ b/src/api/eam/item/applicationRecordMain/index.ts @@ -0,0 +1,67 @@ +import request from '@/config/axios' + +export interface ItemApplyMainVO { + number: string + name: string + type: string + applyId: number + applyDeptId: number + approveId: number + approveTime: Date + outId: number + outTime: Date + siteId: string + available: string + concurrencyStamp: number +} + +// 查询备件申领记录主列表 +export const getApplicationRecordMainPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/item-apply-request-main/senior', data }) + } else { + return await request.get({ url: `/eam/item-apply-request-main/page`, params }) + } +} + +// 查询备件申领记录主详情 +export const getApplicationRecordMain = async (id: number) => { + return await request.get({ url: `/eam/item-apply-request-main/get?id=` + id }) +} + +// 新增备件申领记录主 +export const createApplicationRecordMain = async (data: ItemApplyMainVO) => { + return await request.post({ url: `/eam/item-apply-request-main/create`, data }) +} + +// 修改备件申领记录主 +export const updateApplicationRecordMain = async (data: ItemApplyMainVO) => { + return await request.put({ url: `/eam/item-apply-request-main/update`, data }) +} + +// 删除备件申领记录主 +export const deleteApplicationRecordMain = async (id: number) => { + return await request.delete({ url: `/eam/item-apply-request-main/delete?id=` + id }) +} + +// 审批通过备件申领记录主 +export const agreeApplicationRecordMain = async (id: number) => { + return await request.get({ url: `/eam/item-apply-request-main/agree?id=` + id }) +} + +// 审批驳回备件申领记录主 +export const disAgreeApplicationRecordMain = async (id: number) => { + return await request.get({ url: `/eam/item-apply-request-main/disAgree?id=` + id }) +} + +// 导出备件申领记录主 Excel +export const exportApplicationRecordMain = async (params) => { + return await request.download({ url: `/eam/item-apply-request-main/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/item-apply-request-main/get-import-template' }) +} diff --git a/src/api/eam/item/countJobDetail/index.ts b/src/api/eam/item/countJobDetail/index.ts new file mode 100644 index 0000000..5f06e89 --- /dev/null +++ b/src/api/eam/item/countJobDetail/index.ts @@ -0,0 +1,51 @@ +import request from '@/config/axios' + +export interface CountJobDetailVO { + id : number + number : string + name : string + classification : string + isInAccount : string + status : string +} + +// 查询备件盘点计划列表 +export const getCountJobDetailPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = { ...params } + return await request.post({ url: '/eam/countJobDetail/senior', data }) + } else { + return await request.get({ url: `/eam/countJobDetail/page`, params }) + } +} + +// 查询备件盘点计划详情 +export const getCountJobDetail = async (id : number) => { + return await request.get({ url: `/eam/countJobDetail/get?id=` + id }) +} + +// 新增备件盘点计划 +export const createCountJobDetail = async (data : CountJobDetailVO) => { + return await request.post({ url: `/eam/countJobDetail/create`, data }) +} + +// 修改备件盘点计划 +export const updateCountJobDetail = async (data : CountJobDetailVO) => { + return await request.put({ url: `/eam/countJobDetail/update`, data }) +} + +// 删除备件盘点计划 +export const deleteCountJobDetail = async (id : number) => { + return await request.delete({ url: `/eam/countJobDetail/delete?id=` + id }) +} + +// 导出备件盘点计划 Excel +export const exportCountJobDetail = async (params) => { + return await request.download({ url: `/eam/countJobDetail/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/countJobDetail/get-import-template' }) +} diff --git a/src/api/eam/item/countJobMain/index.ts b/src/api/eam/item/countJobMain/index.ts new file mode 100644 index 0000000..2ead754 --- /dev/null +++ b/src/api/eam/item/countJobMain/index.ts @@ -0,0 +1,56 @@ +import request from '@/config/axios' + +export interface CountJobMainVO { + id : number + number : string + name : string + classification : string + isInAccount : string + status : string +} + +// 查询备件盘点计划列表 +export const getCountJobMainPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = { ...params } + return await request.post({ url: '/eam/countJobMain/senior', data }) + } else { + return await request.get({ url: `/eam/countJobMain/page`, params }) + } +} + +// 查询备件盘点计划详情 +export const getCountJobMain = async (id : number) => { + return await request.get({ url: `/eam/countJobMain/get?id=` + id }) +} + +// 新增备件盘点计划 +export const createCountJobMain = async (data : CountJobMainVO) => { + return await request.post({ url: `/eam/countJobMain/create`, data }) +} + +// 修改备件盘点计划 +export const updateCountJobMain = async (data : CountJobMainVO) => { + return await request.put({ url: `/eam/countJobMain/update`, data }) +} + +// 删除备件盘点计划 +export const deleteCountJobMain = async (id : number) => { + return await request.delete({ url: `/eam/countJobMain/delete?id=` + id }) +} + +// 导出备件盘点计划 Excel +export const handleMainExport = async (id : number) => { + return await request.download({ url: `/eam/countJobMain/handleMainExport?id=` + id }) +} + +// 导出备件盘点计划 Excel +export const exportCountJobMain = async (params) => { + return await request.download({ url: `/eam/countJobMain/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/countJobMain/get-import-template' }) +} diff --git a/src/api/eam/item/countRecordDetail/index.ts b/src/api/eam/item/countRecordDetail/index.ts new file mode 100644 index 0000000..0387608 --- /dev/null +++ b/src/api/eam/item/countRecordDetail/index.ts @@ -0,0 +1,51 @@ +import request from '@/config/axios' + +export interface CountRecordDetailVO { + id : number + number : string + name : string + classification : string + isInAccount : string + status : string +} + +// 查询备件盘点计划列表 +export const getCountRecordDetailPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = { ...params } + return await request.post({ url: '/eam/countRecordDetail/senior', data }) + } else { + return await request.get({ url: `/eam/countRecordDetail/page`, params }) + } +} + +// 查询备件盘点计划详情 +export const getCountRecordDetail = async (id : number) => { + return await request.get({ url: `/eam/countRecordDetail/get?id=` + id }) +} + +// 新增备件盘点计划 +export const createCountRecordDetail = async (data : CountRecordDetailVO) => { + return await request.post({ url: `/eam/countRecordDetail/create`, data }) +} + +// 修改备件盘点计划 +export const updateCountRecordDetail = async (data : CountRecordDetailVO) => { + return await request.put({ url: `/eam/countRecordDetail/update`, data }) +} + +// 删除备件盘点计划 +export const deleteCountRecordDetail = async (id : number) => { + return await request.delete({ url: `/eam/countRecordDetail/delete?id=` + id }) +} + +// 导出备件盘点计划 Excel +export const exportCountRecordDetail = async (params) => { + return await request.download({ url: `/eam/countRecordDetail/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/countRecordDetail/get-import-template' }) +} diff --git a/src/api/eam/item/countRecordMain/index.ts b/src/api/eam/item/countRecordMain/index.ts new file mode 100644 index 0000000..512ae4c --- /dev/null +++ b/src/api/eam/item/countRecordMain/index.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' + +export interface CountRecordMainVO { + id : number + number : string + name : string + classification : string + isInAccount : string + status : string +} + +// 查询备件盘点计划列表 +export const getCountRecordMainPage = async (params) => { + params.status="CANGENERATE" + if (params.isSearch) { + delete params.isSearch + const data = { ...params } + return await request.post({ url: '/eam/countRecordMain/senior', data }) + } else { + return await request.get({ url: `/eam/countRecordMain/page`, params }) + } +} + +// 查询备件盘点计划详情 +export const getCountRecordMain = async (id : number) => { + return await request.get({ url: `/eam/countRecordMain/get?id=` + id }) +} + +// 新增备件盘点计划 +export const createCountRecordMain = async (data : CountRecordMainVO) => { + return await request.post({ url: `/eam/countRecordMain/create`, data }) +} + +// 修改备件盘点计划 +export const updateCountRecordMain = async (data : CountRecordMainVO) => { + return await request.put({ url: `/eam/countRecordMain/update`, data }) +} + +// 删除备件盘点计划 +export const deleteCountRecordMain = async (id : number) => { + return await request.delete({ url: `/eam/countRecordMain/delete?id=` + id }) +} +// 盘点调整 +export const adjustCountRecordMain = async (id : number) => { + return await request.get({ url: `/eam/countRecordMain/adjust?number=` + id }) +} + +// 导出备件盘点计划 Excel +export const handleMainExport = async (id : number) => { + return await request.download({ url: `/eam/countRecordMain/handleMainExport?id=` + id }) +} + +// 导出备件盘点计划 Excel +export const exportCounRecordMain = async (params) => { + return await request.download({ url: `/eam/countRecordMain/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/countRecordMain/get-import-template' }) +} diff --git a/src/api/eam/item/countadjustPlan/index.ts b/src/api/eam/item/countadjustPlan/index.ts new file mode 100644 index 0000000..4a9470f --- /dev/null +++ b/src/api/eam/item/countadjustPlan/index.ts @@ -0,0 +1,51 @@ +import request from '@/config/axios' + +export interface CountadjustPlanVO { + id : number + number : string + name : string + classification : string + isInAccount : string + status : string +} + +// 查询备件盘点计划列表 +export const getCountadjustPlanPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = { ...params } + return await request.post({ url: '/eam/countadjust-plan/senior', data }) + } else { + return await request.get({ url: `/eam/countadjust-plan/page`, params }) + } +} + +// 查询备件盘点计划详情 +export const getCountadjustPlan = async (id : number) => { + return await request.get({ url: `/eam/countadjust-plan/get?id=` + id }) +} + +// 新增备件盘点计划 +export const createCountadjustPlan = async (data : CountadjustPlanVO) => { + return await request.post({ url: `/eam/countadjust-plan/create`, data }) +} + +// 修改备件盘点计划 +export const updateCountadjustPlan = async (data : CountadjustPlanVO) => { + return await request.put({ url: `/eam/countadjust-plan/update`, data }) +} + +// 删除备件盘点计划 +export const deleteCountadjustPlan = async (id : number) => { + return await request.delete({ url: `/eam/countadjust-plan/delete?id=` + id }) +} + +// 导出备件盘点计划 Excel +export const exportCountadjustPlan = async (params) => { + return await request.download({ url: `/eam/countadjust-plan/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/countadjust-plan/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/item/itemAccounts/index.ts b/src/api/eam/item/itemAccounts/index.ts new file mode 100644 index 0000000..88fb3d1 --- /dev/null +++ b/src/api/eam/item/itemAccounts/index.ts @@ -0,0 +1,63 @@ +import request from '@/config/axios' + +export interface ItemAccountsVO { + itemNumber: string + qty: number + areaNumber: string + isInAccount: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询备件台账列表 +export const getItemAccountsPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/item-accounts/senior', data }) + } else { + return await request.get({ url: `/eam/item-accounts/page`, params }) + } +} + +// 查询备件台账详情 +export const getItemAccounts = async (id: number) => { + return await request.get({ url: `/eam/item-accounts/get?id=` + id }) +} + +// 新增备件台账 +export const createItemAccounts = async (data: ItemAccountsVO) => { + return await request.post({ url: `/eam/item-accounts/create`, data }) +} + +// 修改备件台账 +export const updateItemAccounts = async (data: ItemAccountsVO) => { + return await request.put({ url: `/eam/item-accounts/update`, data }) +} + +// 删除备件台账 +export const deleteItemAccounts = async (id: number) => { + return await request.delete({ url: `/eam/item-accounts/delete?id=` + id }) +} + +// 导出备件台账 Excel +export const exportItemAccounts = async (params) => { + return await request.download({ url: `/eam/item-accounts/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/item-accounts/get-import-template' }) +} + +// 更改备件库位 +export const replaceLocation = async (data: Array) => { + return await request.post({url: `/eam/item-accounts/replaceLocation `, data }); +}; + +// 备件不分页 + +export const getItemAccountsNoPage = async (params) => { + return await request.get({ url: `/eam/item-accounts/noPage`, params }) +} diff --git a/src/api/eam/item/itemApplyDetail/index.ts b/src/api/eam/item/itemApplyDetail/index.ts new file mode 100644 index 0000000..0941c11 --- /dev/null +++ b/src/api/eam/item/itemApplyDetail/index.ts @@ -0,0 +1,57 @@ +import request from '@/config/axios' + +export interface ItemApplyDetailVO { + number: string + name: string + type: string + applyId: number + applyDeptId: number + approveId: number + approveTime: Date + outId: number + outTime: Date + siteId: string + available: string + concurrencyStamp: number +} + +// 查询备件申领记录主列表 +export const getItemApplyDetailPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/item-apply-request-detail/senior', data }) + } else { + return await request.get({ url: `/eam/item-apply-request-detail/page`, params }) + } +} + +// 查询备件申领记录主详情 +export const getItemApplyDetail = async (id: number) => { + return await request.get({ url: `/eam/item-apply-request-detail/get?id=` + id }) +} + +// 新增备件申领记录主 +export const createItemApplyDetail = async (data: ItemApplyDetailVO) => { + return await request.post({ url: `/eam/item-apply-request-detail/create`, data }) +} + +// 修改备件申领记录主 +export const updateItemApplyDetail = async (data: ItemApplyDetailVO) => { + return await request.put({ url: `/eam/item-apply-request-detail/update`, data }) +} + +// 删除备件申领记录主 +export const deleteItemApplyDetail = async (id: number) => { + return await request.delete({ url: `/eam/item-apply-request-detail/delete?id=` + id }) +} + +// 导出备件申领记录主 Excel +export const exportItemApplyDetail = async (params) => { + return await request.download({ url: `/eam/item-apply-request-detail/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/item-apply-request-detail/get-import-template' }) +} diff --git a/src/api/eam/item/itemApplyMain/index.ts b/src/api/eam/item/itemApplyMain/index.ts new file mode 100644 index 0000000..eeccb6e --- /dev/null +++ b/src/api/eam/item/itemApplyMain/index.ts @@ -0,0 +1,63 @@ +import request from '@/config/axios' + +export interface ItemApplyMainVO { + number: string + name: string + type: string + applyId: number + applyDeptId: number + approveId: number + approveTime: Date + outId: number + outTime: Date + siteId: string + available: string + concurrencyStamp: number +} + +// 查询备件申领记录主列表 +export const getItemApplyMainPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/item-apply-request-main/senior', data }) + } else { + return await request.get({ url: `/eam/item-apply-request-main/page`, params }) + } +} + +// 查询备件申领记录主详情 +export const getItemApplyMain = async (id: number) => { + return await request.get({ url: `/eam/item-apply-request-main/get?id=` + id }) +} + +// 新增备件申领记录主 +export const createItemApplyMain = async (data: ItemApplyMainVO) => { + return await request.post({ url: `/eam/item-apply-request-main/create`, data }) +} + +// 修改备件申领记录主 +export const updateItemApplyMain = async (data: ItemApplyMainVO) => { + return await request.put({ url: `/eam/item-apply-request-main/update`, data }) +} + +// 删除备件申领记录主 +export const deleteItemApplyMain = async (id: number) => { + return await request.delete({ url: `/eam/item-apply-request-main/delete?id=` + id }) +} + +// 撤销备件申领记录主 +export const backoutItemApplyMain = async (id: number) => { + return await request.get({ url: `/eam/item-apply-request-main/backout?id=` + id }) +} + + +// 导出备件申领记录主 Excel +export const exportItemApplyMain = async (params) => { + return await request.download({ url: `/eam/item-apply-request-main/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/item-apply-request-main/get-import-template' }) +} diff --git a/src/api/eam/item/itemInLocation/index.ts b/src/api/eam/item/itemInLocation/index.ts new file mode 100644 index 0000000..9589db3 --- /dev/null +++ b/src/api/eam/item/itemInLocation/index.ts @@ -0,0 +1,50 @@ +import request from '@/config/axios' + +export interface ItemInLocationVO { + number: string + itemNumber: string + locationNumber: string + type: string + qty: number +} + +// 查询备件入库记录列表 +export const getItemInLocationPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/item-in-location/senior', data }) + } else { + return await request.get({ url: `/eam/item-in-location/page`, params }) + } +} + +// 查询备件入库记录详情 +export const getItemInLocation = async (id: number) => { + return await request.get({ url: `/eam/item-in-location/get?id=` + id }) +} + +// 新增备件入库记录 +export const createItemInLocation = async (data: ItemInLocationVO) => { + return await request.post({ url: `/eam/item-in-location/create`, data }) +} + +// 修改备件入库记录 +export const updateItemInLocation = async (data: ItemInLocationVO) => { + return await request.put({ url: `/eam/item-in-location/update`, data }) +} + +// 删除备件入库记录 +export const deleteItemInLocation = async (id: number) => { + return await request.delete({ url: `/eam/item-in-location/delete?id=` + id }) +} + +// 导出备件入库记录 Excel +export const exportItemInLocation = async (params) => { + return await request.download({ url: `/eam/item-in-location/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/item-in-location/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/item/itemLocationRecord/index.ts b/src/api/eam/item/itemLocationRecord/index.ts new file mode 100644 index 0000000..51cd22e --- /dev/null +++ b/src/api/eam/item/itemLocationRecord/index.ts @@ -0,0 +1,56 @@ +import request from '@/config/axios' + +export interface ItemLocationRecordVO { + itemNumber: string + locationNumber: string + transactionType: string + inventoryAction: string + businessType: string + inventoryStatus: string + uom: string + qty: number + siteId: string + available: string + concurrencyStamp: number +} + +// 查询备件库存记录列表 +export const getItemLocationRecordPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/item-location-record/senior', data }) + } else { + return await request.get({ url: `/eam/item-location-record/page`, params }) + } +} + +// 查询备件库存记录详情 +export const getItemLocationRecord = async (id: number) => { + return await request.get({ url: `/eam/item-location-record/get?id=` + id }) +} + +// 新增备件库存记录 +export const createItemLocationRecord = async (data: ItemLocationRecordVO) => { + return await request.post({ url: `/eam/item-location-record/create`, data }) +} + +// 修改备件库存记录 +export const updateItemLocationRecord = async (data: ItemLocationRecordVO) => { + return await request.put({ url: `/eam/item-location-record/update`, data }) +} + +// 删除备件库存记录 +export const deleteItemLocationRecord = async (id: number) => { + return await request.delete({ url: `/eam/item-location-record/delete?id=` + id }) +} + +// 导出备件库存记录 Excel +export const exportItemLocationRecord = async (params) => { + return await request.download({ url: `/eam/item-location-record/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/item-location-record/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/item/itemLocationReplace/index.ts b/src/api/eam/item/itemLocationReplace/index.ts new file mode 100644 index 0000000..7bdab64 --- /dev/null +++ b/src/api/eam/item/itemLocationReplace/index.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +export interface ItemLocationReplaceVO { + locationNumber: string + describe: string + oldItemNumber: string + itemNumber: string +} + +// 查询备件库位变更记录列表 +export const getItemLocationReplacePage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/item-location-replace/senior', data }) + } else { + return await request.get({ url: `/eam/item-location-replace/page`, params }) + } +} + +// 查询备件库位变更记录详情 +export const getItemLocationReplace = async (id: number) => { + return await request.get({ url: `/eam/item-location-replace/get?id=` + id }) +} + +// 新增备件库位变更记录 +export const createItemLocationReplace = async (data: ItemLocationReplaceVO) => { + return await request.post({ url: `/eam/item-location-replace/create`, data }) +} + +// 修改备件库位变更记录 +export const updateItemLocationReplace = async (data: ItemLocationReplaceVO) => { + return await request.put({ url: `/eam/item-location-replace/update`, data }) +} + +// 删除备件库位变更记录 +export const deleteItemLocationReplace = async (id: number) => { + return await request.delete({ url: `/eam/item-location-replace/delete?id=` + id }) +} + +// 导出备件库位变更记录 Excel +export const exportItemLocationReplace = async (params) => { + return await request.download({ url: `/eam/item-location-replace/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/item-location-replace/get-import-template' }) +} diff --git a/src/api/eam/item/itemMaintenance/index.ts b/src/api/eam/item/itemMaintenance/index.ts new file mode 100644 index 0000000..d6fe941 --- /dev/null +++ b/src/api/eam/item/itemMaintenance/index.ts @@ -0,0 +1,52 @@ +import request from '@/config/axios' + +export interface ItemMaintenanceVO { + number: string + itemNumber: string + qty: number + result: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询备件维修记录列表 +export const getItemMaintenancePage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/item-maintenance-record/senior', data }) + } else { + return await request.get({ url: `/eam/item-maintenance-record/page`, params }) + } +} + +// 查询备件维修记录详情 +export const getItemMaintenance = async (id: number) => { + return await request.get({ url: `/eam/item-maintenance-record/get?id=` + id }) +} + +// 新增备件维修记录 +export const createItemMaintenance = async (data: ItemMaintenanceVO) => { + return await request.post({ url: `/eam/item-maintenance-record/create`, data }) +} + +// 修改备件维修记录 +export const updateItemMaintenance = async (data: ItemMaintenanceVO) => { + return await request.put({ url: `/eam/item-maintenance-record/update`, data }) +} + +// 删除备件维修记录 +export const deleteItemMaintenance = async (id: number) => { + return await request.delete({ url: `/eam/item-maintenance-record/delete?id=` + id }) +} + +// 导出备件维修记录 Excel +export const exportItemMaintenance = async (params) => { + return await request.download({ url: `/eam/item-maintenance-record/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/item-maintenance-record/get-import-template' }) +} diff --git a/src/api/eam/item/itemOrderDetail/index.ts b/src/api/eam/item/itemOrderDetail/index.ts new file mode 100644 index 0000000..339c348 --- /dev/null +++ b/src/api/eam/item/itemOrderDetail/index.ts @@ -0,0 +1,65 @@ +import request from '@/config/axios' + +export interface ItemOrderDetailVO { + number: string + date: string + phone: string + fax: string + purchaser: string + supplierNumber: string + supplierName: string + supplierAddress: string + shipTo: string + invoiceTo: string + contacts: string + contactsPhone: string + paymentType: string + registLocation: string + bank: string + account: string + dutyParagraph: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询备件采购订单主列表 +export const getItemOrderDetailPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/item-order-detail/senior', data }) + } else { + return await request.get({ url: `/eam/item-order-detail/page`, params }) + } +} + +// 查询备件采购订单主详情 +export const getItemOrderDetail = async (id: number) => { + return await request.get({ url: `/eam/item-order-detail/get?id=` + id }) +} + +// 新增备件采购订单主 +export const createItemOrderDetail = async (data: ItemOrderDetailVO) => { + return await request.post({ url: `/eam/item-order-detail/create`, data }) +} + +// 修改备件采购订单主 +export const updateItemOrderDetail = async (data: ItemOrderDetailVO) => { + return await request.put({ url: `/eam/item-order-detail/update`, data }) +} + +// 删除备件采购订单主 +export const deleteItemOrderDetail = async (id: number) => { + return await request.delete({ url: `/eam/item-order-detail/delete?id=` + id }) +} + +// 导出备件采购订单主 Excel +export const exportItemOrderDetail = async (params) => { + return await request.download({ url: `/eam/item-order-detail/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/item-order-detail/get-import-template' }) +} diff --git a/src/api/eam/item/itemOrderMain/index.ts b/src/api/eam/item/itemOrderMain/index.ts new file mode 100644 index 0000000..125851b --- /dev/null +++ b/src/api/eam/item/itemOrderMain/index.ts @@ -0,0 +1,71 @@ +import request from '@/config/axios' + +export interface ItemOrderMainVO { + number: string + date: string + phone: string + fax: string + purchaser: string + supplierNumber: string + supplierName: string + supplierAddress: string + shipTo: string + invoiceTo: string + contacts: string + contactsPhone: string + paymentType: string + registLocation: string + bank: string + account: string + dutyParagraph: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询备件采购订单主列表 +export const getItemOrderMainPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/item-order-main/senior', data }) + } else { + return await request.get({ url: `/eam/item-order-main/page`, params }) + } +} + +// 查询备件采购订单主详情 +export const getItemOrderMain = async (id: number) => { + return await request.get({ url: `/eam/item-order-main/get?id=` + id }) +} + +// 新增备件采购订单主 +export const createItemOrderMain = async (data: ItemOrderMainVO) => { + return await request.post({ url: `/eam/item-order-main/create`, data }) +} + +// 修改备件采购订单主 +export const updateItemOrderMain = async (data: ItemOrderMainVO) => { + return await request.put({ url: `/eam/item-order-main/update`, data }) +} + +// 删除备件采购订单主 +export const deleteItemOrderMain = async (id: number) => { + return await request.delete({ url: `/eam/item-order-main/delete?id=` + id }) +} + +// 关闭采购订单主 +export const closeItemOrderMain = async (id: number) => { + return await request.post({ url: `/eam/item-order-main/close?id=` + id }) +} + + +// 导出备件采购订单主 Excel +export const exportItemOrderMain = async (params) => { + return await request.download({ url: `/eam/item-order-main/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/item-order-main/get-import-template' }) +} diff --git a/src/api/eam/item/itemOutLocation/index.ts b/src/api/eam/item/itemOutLocation/index.ts new file mode 100644 index 0000000..a6660ae --- /dev/null +++ b/src/api/eam/item/itemOutLocation/index.ts @@ -0,0 +1,50 @@ +import request from '@/config/axios' + +export interface ItemOutLocationVO { + number: string + itemNumber: string + locationNumber: string + type: string + qty: number +} + +// 查询备件出库记录列表 +export const getItemOutLocationPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/item-out-location/senior', data }) + } else { + return await request.get({ url: `/eam/item-out-location/page`, params }) + } +} + +// 查询备件出库记录详情 +export const getItemOutLocation = async (id: number) => { + return await request.get({ url: `/eam/item-out-location/get?id=` + id }) +} + +// 新增备件出库记录 +export const createItemOutLocation = async (data: ItemOutLocationVO) => { + return await request.post({ url: `/eam/item-out-location/create`, data }) +} + +// 修改备件出库记录 +export const updateItemOutLocation = async (data: ItemOutLocationVO) => { + return await request.put({ url: `/eam/item-out-location/update`, data }) +} + +// 删除备件出库记录 +export const deleteItemOutLocation = async (id: number) => { + return await request.delete({ url: `/eam/item-out-location/delete?id=` + id }) +} + +// 导出备件出库记录 Excel +export const exportItemOutLocation = async (params) => { + return await request.download({ url: `/eam/item-out-location/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/item-out-location/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/eam/item/replaceItemDes/index.ts b/src/api/eam/item/replaceItemDes/index.ts new file mode 100644 index 0000000..92cd7f2 --- /dev/null +++ b/src/api/eam/item/replaceItemDes/index.ts @@ -0,0 +1,55 @@ +import request from '@/config/axios' + +export interface AttachmentFileVO { + itemNumber: string + qty: number + areaNumber: string + isInAccount: string + siteId: string + funcCode: string + available: string + concurrencyStamp: number +} + +// 查询备件台账列表 +export const getReplaceItemDesPage = async (params) => { + params.funcCode="Replace_Item_Des" + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/attachment-file/senior', data }) + } else { + return await request.get({ url: `/eam/attachment-file/page`, params }) + } +} + +// 查询备件台账详情 +export const getReplaceItemDes = async (id: number) => { + return await request.get({ url: `/eam/attachment-file/get?id=` + id }) +} + +// 新增备件台账 +export const createReplaceItemDes = async (data: AttachmentFileVO) => { + data.funcCode="Replace_Item_Des" + return await request.post({ url: `/eam/attachment-file/create`, data }) +} + +// 修改备件台账 +export const updateReplaceItemDes = async (data: AttachmentFileVO) => { + return await request.put({ url: `/eam/attachment-file/update`, data }) +} + +// 删除备件台账 +export const deleteReplaceItemDes = async (id: number) => { + return await request.delete({ url: `/eam/attachment-file/delete?id=` + id }) +} + +// 导出备件台账 Excel +export const exportReplaceItemDes = async (params) => { + return await request.download({ url: `/eam/attachment-file/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/attachment-file/get-import-template' }) +} diff --git a/src/api/eam/item/transaction/index.ts b/src/api/eam/item/transaction/index.ts new file mode 100644 index 0000000..c11588a --- /dev/null +++ b/src/api/eam/item/transaction/index.ts @@ -0,0 +1,53 @@ +import request from '@/config/axios' + +export interface TransactionVO { + itemNumber: string + locationNumber: string + transactionType: string + inventoryAction: string + businessType: string + inventoryStatus: string + uom: string + qty: number +} + +// 查询库存事务列表 +export const getTransactionPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/transaction/senior', data }) + } else { + return await request.get({ url: `/eam/transaction/page`, params }) + } +} + +// 查询库存事务详情 +export const getTransaction = async (id: number) => { + return await request.get({ url: `/eam/transaction/get?id=` + id }) +} + +// 新增库存事务 +export const createTransaction = async (data: TransactionVO) => { + return await request.post({ url: `/eam/transaction/create`, data }) +} + +// 修改库存事务 +export const updateTransaction = async (data: TransactionVO) => { + return await request.put({ url: `/eam/transaction/update`, data }) +} + +// 删除库存事务 +export const deleteTransaction = async (id: number) => { + return await request.delete({ url: `/eam/transaction/delete?id=` + id }) +} + +// 导出库存事务 Excel +export const exportTransaction = async (params) => { + return await request.download({ url: `/eam/transaction/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/transaction/get-import-template' }) +} diff --git a/src/api/eam/mold/moldAccounts/index.ts b/src/api/eam/mold/moldAccounts/index.ts new file mode 100644 index 0000000..c0e8e00 --- /dev/null +++ b/src/api/eam/mold/moldAccounts/index.ts @@ -0,0 +1,72 @@ +import request from '@/config/axios' + +export interface MoldAccountsVO { + number: string + name: string + specification: string + type: string + factoryAreaNumber: string + purchaseTime: Date + deptId: number + purchaser: number + supplierNumber: string + productionDate: Date + purchasePrice: number + siteId: string + available: string + concurrencyStamp: number + status: string +} + +// 查询设备台账列表 +export const getMoldAccountsPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/mold-accounts/senior', data }) + } else { + return await request.get({ url: `/eam/mold-accounts/page`, params }) + } +} + +// 查询设备台账详情 +export const getMoldAccounts = async (id: number) => { + return await request.get({ url: `/eam/mold-accounts/get?id=` + id }) +} + +// 新增设备台账 +export const createMoldAccounts = async (data: MoldAccountsVO) => { + return await request.post({ url: `/eam/mold-accounts/create`, data }) +} + +// 修改设备台账 +export const updateMoldAccounts = async (data: MoldAccountsVO) => { + return await request.put({ url: `/eam/mold-accounts/update`, data }) +} + +// 删除设备台账 +export const deleteMoldAccounts = async (id: number) => { + return await request.delete({ url: `/eam/mold-accounts/delete?id=` + id }) +} + +// 导出设备台账 Excel +export const exportMoldAccounts = async (params) => { + return await request.download({ url: `/eam/mold-accounts/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/mold-accounts/get-import-template' }) +} + + +// 查询模具台账列表 +export const getMoldAccountsNoPage = async (params) => { + return await request.get({ url: `/eam/mold-accounts/selectData`, params }) +} + + +// 查询模具台账全部列表 +export const getMoldAccountsAllNoPage = async (data: MoldAccountsVO) => { + return await request.post({ url: `/eam/mold-accounts/noPage`,data }) +} diff --git a/src/api/eam/mold/moldInspectionDetail/index.ts b/src/api/eam/mold/moldInspectionDetail/index.ts new file mode 100644 index 0000000..bdf92e7 --- /dev/null +++ b/src/api/eam/mold/moldInspectionDetail/index.ts @@ -0,0 +1,60 @@ +import request from '@/config/axios' + +export interface MoldInspectionDetailVO { + id: number + number: string + masterId: number + siteId: string + available: string + concurrencyStamp: number + name: string + peoples: string + estimatedMinutes: number + actualMinutes: number + chargePeoples: string + completionTime: Date + engineer: string + uncompleted: string + status: string +} + +// 查询检修工单子列表 +export const getMoldInspectionDetailPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/mold-inspection-job-detail/senior', data }) + } else { + return await request.get({ url: `/eam/mold-inspection-job-detail/page`, params }) + } +} + +// 查询检修工单子详情 +export const getMoldInspectionDetail = async (id: number) => { + return await request.get({ url: `/eam/mold-inspection-job-detail/get?id=` + id }) +} + +// 新增检修工单子 +export const createMoldInspectionDetail = async (data: MoldInspectionDetailVO) => { + return await request.post({ url: `/eam/mold-inspection-job-detail/create`, data }) +} + +// 修改检修工单子 +export const updateMoldInspectionDetail = async (data: MoldInspectionDetailVO) => { + return await request.put({ url: `/eam/mold-inspection-job-detail/update`, data }) +} + +// 删除检修工单子 +export const deleteMoldInspectionDetail = async (id: number) => { + return await request.delete({ url: `/eam/mold-inspection-job-detail/delete?id=` + id }) +} + +// 导出检修工单子 Excel +export const exportMoldInspectionDetail = async (params) => { + return await request.download({ url: `/eam/mold-inspection-job-detail/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/mold-inspection-job-detail/get-import-template' }) +} diff --git a/src/api/eam/mold/moldInspectionMain/index.ts b/src/api/eam/mold/moldInspectionMain/index.ts new file mode 100644 index 0000000..10190c7 --- /dev/null +++ b/src/api/eam/mold/moldInspectionMain/index.ts @@ -0,0 +1,70 @@ +import request from '@/config/axios' + +export interface MoldInspectionMainVO { + number: string + maintenanceNumber: string + deviceNumber: string + factoryAreaNumber: string + describe: string + maintenance: number + maintenancePhone: string + status: string + type: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询检修工单主列表 +export const getMoldInspectionMainPage = async (params) => { + params.type = 'MOLD' + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/mold-inspection-job-main/senior', data }) + } else { + return await request.get({ url: `/eam/mold-inspection-job-main/page`, params }) + } +} + +// 查询检修工单主详情 +export const getMoldInspectionMain = async (id: number) => { + return await request.get({ url: `/eam/mold-inspection-job-main/get?id=` + id }) +} + +// 新增检修工单主 +export const createMoldInspectionMain = async (data: MoldInspectionMainVO) => { + return await request.post({ url: `/eam/mold-inspection-job-main/createPC`, data }) +} + +// 修改检修工单主 +export const updateMoldInspectionMain = async (data: MoldInspectionMainVO) => { + return await request.put({ url: `/eam/mold-inspection-job-main/update`, data }) +} + +// 删除检修工单主 +export const deleteMoldInspectionMain = async (id: number) => { + return await request.delete({ url: `/eam/mold-inspection-job-main/delete?id=` + id }) +} + +// 导出检修工单主 Excel +export const exportMoldInspectionMain = async (params) => { + return await request.download({ url: `/eam/mold-inspection-job-main/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/mold-inspection-job-main/get-import-template' }) +} + + +// 查询检修工单主列表 +export const getMoldInspectionMainNoPage = async (params) => { + return await request.get({ url: `/eam/mold-inspection-job-main/noPage`, params }) +} + + +//验证 +export const verifyOrder = async (id: number,verifyContent: string) => { + return await request.get({ url: `/eam/mold-inspection-job-main/onVerify?id=`+id+`&verifyContent=` + verifyContent }) +} diff --git a/src/api/eam/mold/moldMaintainOrderDetail/index.ts b/src/api/eam/mold/moldMaintainOrderDetail/index.ts new file mode 100644 index 0000000..109d62f --- /dev/null +++ b/src/api/eam/mold/moldMaintainOrderDetail/index.ts @@ -0,0 +1,60 @@ +import request from '@/config/axios' + +export interface MoldMaintainOrderDetailVO { + id: number + siteId: string + available: string + concurrencyStamp: number + name: string + number: string + peoples: number + estimatedMinutes: number + actualMinutes: number + chargePeoples: string + completionTime: Date + engineer: string + uncompleted: string + status: string + contents: string +} + +// 查询保养工单子列表 +export const getMoldMaintainOrderDetailPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/mold-maintain-job-detail/senior', data }) + } else { + return await request.get({ url: `/eam/mold-maintain-job-detail/page`, params }) + } +} + +// 查询保养工单子详情 +export const getMoldMaintainOrderDetail = async (id: number) => { + return await request.get({ url: `/eam/mold-maintain-job-detail/get?id=` + id }) +} + +// 新增保养工单子 +export const createMoldMaintainOrderDetail = async (data: MoldMaintainOrderDetailVO) => { + return await request.post({ url: `/eam/mold-maintain-job-detail/create`, data }) +} + +// 修改保养工单子 +export const updateMoldMaintainOrderDetail = async (data: MoldMaintainOrderDetailVO) => { + return await request.put({ url: `/eam/mold-maintain-job-detail/update`, data }) +} + +// 删除保养工单子 +export const deleteMoldMaintainOrderDetail = async (id: number) => { + return await request.delete({ url: `/eam/mold-maintain-job-detail/delete?id=` + id }) +} + +// 导出保养工单子 Excel +export const exportMoldMaintainOrderDetail = async (params) => { + return await request.download({ url: `/eam/mold-maintain-job-detail/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/mold-maintain-job-detail/get-import-template' }) +} diff --git a/src/api/eam/mold/moldMaintainOrderMain/index.ts b/src/api/eam/mold/moldMaintainOrderMain/index.ts new file mode 100644 index 0000000..e5b8864 --- /dev/null +++ b/src/api/eam/mold/moldMaintainOrderMain/index.ts @@ -0,0 +1,80 @@ +import request from '@/config/axios' + +export interface MoldMaintainOrderMainVO { + number: string + name: string + planNumber: string + deviceNumber: string + factoryAreaNumber: string + engineer: number + receiveTime: Date + assignTime: Date + worker: number + finishedTime: Date + verifyTime: Date + status: string + type: string + siteId: string + available: string + concurrencyStamp: number +} +// 查询保养工单主列表 +export const getMoldMaintainOrderMainPage = async (params) => { + params.type = 'MOLD' + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/mold-maintain-job-main/senior', data }) + } else { + params.type = 'MOLD' + return await request.get({ url: `/eam/mold-maintain-job-main/page`, params }) + } +} + +// 查询保养工单主详情 +export const getMoldMaintainOrderMain = async (id: number) => { + return await request.get({ url: `/eam/mold-maintain-job-main/get?id=` + id }) +} + +// 新增保养工单主 +export const createMoldMaintainOrderMain = async (data: MoldMaintainOrderMainVO) => { + return await request.post({ url: `/eam/mold-maintain-job-main/create`, data }) +} + +// 修改保养工单主 +export const updateMoldMaintainOrderMain = async (data: MoldMaintainOrderMainVO) => { + return await request.put({ url: `/eam/mold-maintain-job-main/update`, data }) +} + +// 删除保养工单主 +export const deleteMoldMaintainOrderMain = async (id: number) => { + return await request.delete({ url: `/eam/mold-maintain-job-main/delete?id=` + id }) +} + +// 导出保养工单主 Excel +export const exportMoldMaintainOrderMain = async (params) => { + return await request.download({ url: `/eam/mold-maintain-job-main/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/mold-maintain-job-main/get-import-template' }) +} + +// 保养接单 +export const orderClick = (id: number) => { + return request.get({ url: '/eam/mold-maintain-job-main/orderClick?id=' + id }) +} + +// 保养完成 +export const orderClickFinish = (id: number) => { + return request.get({ url: '/eam/mold-maintain-job-main/orderClickFinish?id=' + id }) +} + +// 验证 +export const orderClickApprove = (id: number,status: string,verifyContent: string) => { + return request.get({ url: '/eam/mold-maintain-job-main/orderClickVerify?id=' + id + '&status=' + status + '&verifyContent=' + verifyContent }) +} + + + diff --git a/src/api/eam/mold/moldMaintainPlan/index.ts b/src/api/eam/mold/moldMaintainPlan/index.ts new file mode 100644 index 0000000..b35edfc --- /dev/null +++ b/src/api/eam/mold/moldMaintainPlan/index.ts @@ -0,0 +1,55 @@ +import request from '@/config/axios' + +export interface MoldMaintainPlanVO { + number: string + name: string + maintenanceType: string + cycle: string + times: number + type: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询保养计划列表 +export const getMoldMaintainPlanPage = async (params) => { + params.type = 'MOLD' + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/mold-maintain-plan/senior', data }) + } else { + return await request.get({ url: `/eam/mold-maintain-plan/page`, params }) + } +} + +// 查询保养计划详情 +export const getMoldMaintainPlan = async (id: number) => { + return await request.get({ url: `/eam/mold-maintain-plan/get?id=` + id }) +} + +// 新增保养计划 +export const createMoldMaintainPlan = async (data: MoldMaintainPlanVO) => { + return await request.post({ url: `/eam/mold-maintain-plan/create`, data }) +} + +// 修改保养计划 +export const updateMoldMaintainPlan = async (data: MoldMaintainPlanVO) => { + return await request.put({ url: `/eam/mold-maintain-plan/update`, data }) +} + +// 删除保养计划 +export const deleteMoldMaintainPlan = async (id: number) => { + return await request.delete({ url: `/eam/mold-maintain-plan/delete?id=` + id }) +} + +// 导出保养计划 Excel +export const exportMoldMaintainPlan = async (params) => { + return await request.download({ url: `/eam/mold-maintain-plan/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/mold-maintain-plan/get-import-template' }) +} diff --git a/src/api/eam/mold/moldMaintenanceDetail/index.ts b/src/api/eam/mold/moldMaintenanceDetail/index.ts new file mode 100644 index 0000000..cc35288 --- /dev/null +++ b/src/api/eam/mold/moldMaintenanceDetail/index.ts @@ -0,0 +1,51 @@ +import request from '@/config/axios' + +export interface MoldMaintenanceDetailVO { +  describes: string +  describes1: string +  workOut: string +  maintenances: string +} + +// 查询维修工单子列表 +export const getMoldMaintenanceDetailPage = async (params) => { +  if (params.isSearch) { +    delete params.isSearch +    const data = {...params} +    return await request.post({ url: '/wms/purchasereceipt-request-detail/senior', data }) +  } else { +    return await request.get({ url: `/eam/mold-maintenance-job-detail/page`, params }) +  } +} + +// 查询维修工单子详情 +export const getPurchasereceiptRequestDetail = async (id) => { +  return await request.get({ url: `/eam/mold-maintenance-job-detail/selectListByNumber?id=` + id }) +} + +// 新增维修工单子 +export const createMoldMaintenanceDetail = async (data: MoldMaintenanceDetailVO) => { +  return await request.post({ url: `/eam/mold-maintenance-job-detail/create`, data }) +} + +// 修改维修工单子 +export const updateMoldMaintenanceDetail = async (data: MoldMaintenanceDetailVO) => { +  return await request.put({ url: `/eam/mold-maintenance-job-detail/update`, data }) +} + +// 删除维修工单子 +export const deleteMoldMaintenanceDetail = async (id: number) => { +  return await request.delete({ url: `/eam/mold-maintenance-job-detail/delete?id=` + id }) +} + + + +// 导出维修工单子 Excel +export const exportPurchasereceiptRequestDetail = async (params) => { +  return await request.download({ url: `/wms/purchasereceipt-request-detail/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { +  return request.download({ url: '/wms/purchasereceipt-request-detail/get-import-template' }) +} diff --git a/src/api/eam/mold/moldMaintenanceMain/index.ts b/src/api/eam/mold/moldMaintenanceMain/index.ts new file mode 100644 index 0000000..9adbda2 --- /dev/null +++ b/src/api/eam/mold/moldMaintenanceMain/index.ts @@ -0,0 +1,92 @@ +import request from '@/config/axios' + +export interface MoldMaintenanceMainVO { + id: number + number: string + requestNumber: string + describe: string + deviceNumber: string + factoryAreaNumber: string + maintenance: number + maintenancePhone: string + status: string + type: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询维修工单主列表 +export const getMoldMaintenanceMainPage = async (params) => { + params.type = 'MOLD' + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/mold-maintenance-job-main/senior', data }) + } else { + return await request.get({ url: `/eam/mold-maintenance-job-main/page`, params }) + } +} + +// 查询维修工单主详情 +export const getMoldMaintenanceMain = async (id: number) => { + return await request.get({ url: `/eam/mold-maintenance-job-main/get?id=` + id }) +} + +// 新增维修工单主 +export const createMoldMaintenanceMain = async (data: MoldMaintenanceMainVO) => { + return await request.post({ url: `/eam/mold-maintenance-job-main/createPC`, data }) +} + +// 修改维修工单主 +export const updateMoldMaintenanceMain = async (data: MoldMaintenanceMainVO) => { + return await request.put({ url: `/eam/mold-maintenance-job-main/update`, data }) +} +// 删除维修工单主 +export const deleteMoldMaintenanceMain = async (id: number) => { + return await request.delete({ url: `/eam/mold-maintenance-job-main/delete?id=` + id }) +} + +// 导出维修工单主 Excel +export const exportMoldMaintenanceMain = async (params) => { + return await request.download({ url: `/eam/mold-maintenance-job-main/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/mold-maintenance-job-main/get-import-template' }) +} + +// 修改维修工单主 +export const orderStepChange = async (data: MoldMaintenanceMainVO) => { + return await request.get({ url: `/eam/mold-maintenance-job-main/orderClick?number=`+data.number+`&status=`+data.status+`&id=`+data.id+`&requestNumber=`+data.requestNumber }) +} + +// 修改维修工单主 +export const orderTurnTo = async (data: MoldMaintenanceMainVO) => { + return await request.get({ url: `/eam/mold-maintenance-job-main/turnTo?deviceNumber=`+data.deviceNumber +`&id=`+data.id + `&receiverType=`+ data.type +`&receiverUserId=` + data.maintenance }) +} + + +// 查询维修工单主列表不分页 +export const getMoldMainTempList = async (type: String) => { + return await request.get({ url: `/eam/mold-maintenance-job-main/getList?type=` + type }) +} + + +// 完成维修工单 +export const finishOrder = async (params) => { + return await request.get({ url: `/eam/mold-maintenance-job-main/orderClickFinish`, params}) +} + + +// 申请人确认工单 +export const confirmOrder = async (params) => { + return await request.get({ url: `/eam/mold-maintenance-job-main/orderClickConfirm`, params}) +} + + +// 校验维修工单 +export const verifyOrder = async (params) => { + return await request.get({ url: `/eam/mold-maintenance-job-main/orderClickVerify`, params}) +} diff --git a/src/api/eam/mold/moldRepair/index.ts b/src/api/eam/mold/moldRepair/index.ts new file mode 100644 index 0000000..028f2b4 --- /dev/null +++ b/src/api/eam/mold/moldRepair/index.ts @@ -0,0 +1,62 @@ +import request from '@/config/axios' + +export interface MoldRepairVO { + number: string + describe: string + deviceNumber: string + factoryAreaNumber: string + declarer: number + declarerPhone: string + faultType: string + type: string + siteId: string + available: string + concurrencyStamp: number +} + +// 查询报修申请列表 +export const getMoldRepairPage = async (params) => { + params.type = 'MOLD' + if (params.isSearch) { + delete params.isSearch + const data = { ...params } + return await request.post({ url: '/eam/mold-repair-request/senior', data }) + } else { + return await request.get({ url: `/eam/mold-repair-request/page`, params }) + } +} + +// 查询报修申请详情 +export const getMoldRepair = async (id: number) => { + return await request.get({ url: `/eam/mold-repair-request/get?id=` + id }) +} + +// 新增报修申请 +export const createMoldRepair = async (data: MoldRepairVO) => { + return await request.post({ url: `/eam/mold-repair-request/create`, data }) +} + +// 修改报修申请 +export const updateMoldRepair = async (data: MoldRepairVO) => { + return await request.put({ url: `/eam/mold-repair-request/update`, data }) +} + +// 删除报修申请 +export const deleteMoldRepair = async (id: number) => { + return await request.delete({ url: `/eam/mold-repair-request/delete?id=` + id }) +} + +// 导出报修申请 Excel +export const exportMoldRepair = async (params) => { + return await request.download({ url: `/eam/mold-repair-request/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/mold-repair-request/get-import-template' }) +} + +// 撤销申请 +export const rejected = (id: Number) => { + return request.delete({ url: '/eam/mold-repair-request/cancel?id=' + id }) +} diff --git a/src/api/eam/mold/moldSpotInspectionRecordMain/index.ts b/src/api/eam/mold/moldSpotInspectionRecordMain/index.ts new file mode 100644 index 0000000..8f448dc --- /dev/null +++ b/src/api/eam/mold/moldSpotInspectionRecordMain/index.ts @@ -0,0 +1,57 @@ +import request from '@/config/axios' + +export interface DeviceSpotInspectionRecordMainVO { + number: string + deviceNumber: string + describe: string + maintenance: number + maintenancePhone: string + status: string + type: string + siteId: string + available: string + approveOpinion?: string + concurrencyStamp: number +} + +// 查询检修工单主列表 +export const getDeviceSpotInspectionRecordMainPage = async (params) => { + params.type = 'MOLD' + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/eam/mold-spot-inspection-record-main/senior', data }) + } else { + return await request.get({ url: `/eam/mold-spot-inspection-record-main/page`, params }) + } +} + +// 查询检修工单主详情 +export const getDeviceSpotInspectionRecordMain = async (id: number) => { + return await request.get({ url: `/eam/mold-spot-inspection-record-main/get?id=` + id }) +} + +// 新增检修工单主 +export const createDeviceSpotInspectionRecordMain = async (data: DeviceSpotInspectionRecordMainVO) => { + return await request.post({ url: `/eam/mold-spot-inspection-record-main/create`, data }) +} + +// 修改检修工单主 +export const updateDeviceSpotInspectionRecordMain = async (data: DeviceSpotInspectionRecordMainVO) => { + return await request.put({ url: `/eam/mold-spot-inspection-record-main/update`, data }) +} + +// 删除检修工单主 +export const deleteDeviceSpotInspectionRecordMain = async (id: number) => { + return await request.delete({ url: `/eam/mold-spot-inspection-record-main/delete?id=` + id }) +} + +// 导出检修工单主 Excel +export const exportDeviceSpotInspectionRecordMain = async (params) => { + return await request.download({ url: `/eam/mold-spot-inspection-record-main/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/eam/mold-spot-inspection-record-main/get-import-template' }) +} diff --git a/src/api/eam/upload/index.ts b/src/api/eam/upload/index.ts new file mode 100644 index 0000000..ac7d070 --- /dev/null +++ b/src/api/eam/upload/index.ts @@ -0,0 +1,10 @@ +import request from '@/config/axios' +// 上传图片 +export const uploadImage = async (data) => { + return await request.post({ url: `/eam/attachment-file/upload`, data }) +} + +// 查询图片 +export const getImage = async (data) => { + return await request.post({ url: `/eam/attachment-file/listNoPage`, data }) +} \ No newline at end of file diff --git a/src/api/home/index.ts b/src/api/home/index.ts new file mode 100644 index 0000000..62ed75b --- /dev/null +++ b/src/api/home/index.ts @@ -0,0 +1,16 @@ +import request from '@/config/axios' + +// 首页获取设备停机状态/设备总数/月设备保养完成率/月汇总停机时间 +export const getData = async () => { + return await request.get({ url: `/eam/home-page/select` }) +} + +// 获取年度指标 +export const getYearTarget = async () => { + return await request.get({ url: `/eam/home-page/selectYearIndex` }) +} + +// 获取年度指标 +export const getChartsData = async (factory) => { + return await request.get({ url: `/eam/home-page/selectMonthGraphByFactory?factory=`+factory }) +} diff --git a/src/api/infra/apiAccessLog/index.ts b/src/api/infra/apiAccessLog/index.ts new file mode 100644 index 0000000..c6b4b45 --- /dev/null +++ b/src/api/infra/apiAccessLog/index.ts @@ -0,0 +1,30 @@ +import request from '@/config/axios' + +export interface ApiAccessLogVO { + id: number + traceId: string + userId: number + userType: number + applicationName: string + requestMethod: string + requestParams: string + requestUrl: string + userIp: string + userAgent: string + beginTime: Date + endTIme: Date + duration: number + resultCode: number + resultMsg: string + createTime: Date +} + +// 查询列表API 访问日志 +export const getApiAccessLogPage = (params: PageParam) => { + return request.get({ url: '/infra/api-access-log/page', params }) +} + +// 导出API 访问日志 +export const exportApiAccessLog = (params) => { + return request.download({ url: '/infra/api-access-log/export-excel', params }) +} diff --git a/src/api/infra/apiErrorLog/index.ts b/src/api/infra/apiErrorLog/index.ts new file mode 100644 index 0000000..59ee214 --- /dev/null +++ b/src/api/infra/apiErrorLog/index.ts @@ -0,0 +1,48 @@ +import request from '@/config/axios' + +export interface ApiErrorLogVO { + id: number + traceId: string + userId: number + userType: number + applicationName: string + requestMethod: string + requestParams: string + requestUrl: string + userIp: string + userAgent: string + exceptionTime: Date + exceptionName: string + exceptionMessage: string + exceptionRootCauseMessage: string + exceptionStackTrace: string + exceptionClassName: string + exceptionFileName: string + exceptionMethodName: string + exceptionLineNumber: number + processUserId: number + processStatus: number + processTime: Date + resultCode: number + createTime: Date +} + +// 查询列表API 访问日志 +export const getApiErrorLogPage = (params: PageParam) => { + return request.get({ url: '/infra/api-error-log/page', params }) +} + +// 更新 API 错误日志的处理状态 +export const updateApiErrorLogPage = (id: number, processStatus: number) => { + return request.put({ + url: '/infra/api-error-log/update-status?id=' + id + '&processStatus=' + processStatus + }) +} + +// 导出API 访问日志 +export const exportApiErrorLog = (params) => { + return request.download({ + url: '/infra/api-error-log/export-excel', + params + }) +} diff --git a/src/api/infra/codegen/index.ts b/src/api/infra/codegen/index.ts new file mode 100644 index 0000000..64701ef --- /dev/null +++ b/src/api/infra/codegen/index.ts @@ -0,0 +1,123 @@ +import request from '@/config/axios' + +export type CodegenTableVO = { + id: number + tableId: number + isParentMenuIdValid: boolean + dataSourceConfigId: number + scene: number + tableName: string + tableComment: string + remark: string + moduleName: string + businessName: string + className: string + classComment: string + author: string + createTime: Date + updateTime: Date + templateType: number + parentMenuId: number +} + +export type CodegenColumnVO = { + id: number + tableId: number + columnName: string + dataType: string + columnComment: string + nullable: number + primaryKey: number + autoIncrement: string + ordinalPosition: number + javaType: string + javaField: string + dictType: string + example: string + createOperation: number + updateOperation: number + listOperation: number + listOperationCondition: string + listOperationResult: number + htmlType: string +} + +export type DatabaseTableVO = { + name: string + comment: string +} + +export type CodegenDetailVO = { + table: CodegenTableVO + columns: CodegenColumnVO[] +} + +export type CodegenPreviewVO = { + filePath: string + code: string +} + +export type CodegenUpdateReqVO = { + table: CodegenTableVO | any + columns: CodegenColumnVO[] +} + +export type CodegenCreateListReqVO = { + dataSourceConfigId: number + tableNames: string[] +} + +// 查询列表代码生成表定义 +export const getCodegenTablePage = (params: PageParam) => { + return request.get({ url: '/infra/codegen/table/page', params }) +} + +// 查询详情代码生成表定义 +export const getCodegenTable = (id: number) => { + return request.get({ url: '/infra/codegen/detail?tableId=' + id }) +} + +// 新增代码生成表定义 +export const createCodegenTable = (data: CodegenCreateListReqVO) => { + return request.post({ url: '/infra/codegen/create', data }) +} + +// 修改代码生成表定义 +export const updateCodegenTable = (data: CodegenUpdateReqVO) => { + return request.put({ url: '/infra/codegen/update', data }) +} + +// 基于数据库的表结构,同步数据库的表和字段定义 +export const syncCodegenFromDB = (id: number) => { + return request.put({ url: '/infra/codegen/sync-from-db?tableId=' + id }) +} + +// 基于 SQL 建表语句,同步数据库的表和字段定义 +export const syncCodegenFromSQL = (id: number, sql: string) => { + return request.put({ url: '/infra/codegen/sync-from-sql?tableId=' + id + '&sql=' + sql }) +} + +// 预览生成代码 +export const previewCodegen = (id: number) => { + return request.get({ url: '/infra/codegen/preview?tableId=' + id }) +} + +// 下载生成代码 +export const downloadCodegen = (id: number) => { + return request.download({ url: '/infra/codegen/download?tableId=' + id }) +} + +// 获得表定义 +export const getSchemaTableList = (params) => { + return request.get({ url: '/infra/codegen/db/table/list', params }) +} + +// 基于数据库的表结构,创建代码生成器的表定义 +export const createCodegenList = (data) => { + return request.post({ url: '/infra/codegen/create-list', data }) +} + +// 删除代码生成表定义 +export const deleteCodegenTable = (id: number) => { + return request.delete({ url: '/infra/codegen/delete?tableId=' + id }) +} diff --git a/src/api/infra/config/index.ts b/src/api/infra/config/index.ts new file mode 100644 index 0000000..5ef59f3 --- /dev/null +++ b/src/api/infra/config/index.ts @@ -0,0 +1,48 @@ +import request from '@/config/axios' + +export interface ConfigVO { + id: number | undefined + category: string + name: string + key: string + value: string + type: number + visible: boolean + remark: string + createTime: Date +} + +// 查询参数列表 +export const getConfigPage = (params: PageParam) => { + return request.get({ url: '/infra/config/page', params }) +} + +// 查询参数详情 +export const getConfig = (id: number) => { + return request.get({ url: '/infra/config/get?id=' + id }) +} + +// 根据参数键名查询参数值 +export const getConfigKey = (configKey: string) => { + return request.get({ url: '/infra/config/get-value-by-key?key=' + configKey }) +} + +// 新增参数 +export const createConfig = (data: ConfigVO) => { + return request.post({ url: '/infra/config/create', data }) +} + +// 修改参数 +export const updateConfig = (data: ConfigVO) => { + return request.put({ url: '/infra/config/update', data }) +} + +// 删除参数 +export const deleteConfig = (id: number) => { + return request.delete({ url: '/infra/config/delete?id=' + id }) +} + +// 导出参数 +export const exportConfig = (params) => { + return request.download({ url: '/infra/config/export', params }) +} diff --git a/src/api/infra/dataSourceConfig/index.ts b/src/api/infra/dataSourceConfig/index.ts new file mode 100644 index 0000000..b413f34 --- /dev/null +++ b/src/api/infra/dataSourceConfig/index.ts @@ -0,0 +1,35 @@ +import request from '@/config/axios' + +export interface DataSourceConfigVO { + id: number | undefined + name: string + url: string + username: string + password: string + createTime?: Date +} + +// 新增数据源配置 +export const createDataSourceConfig = (data: DataSourceConfigVO) => { + return request.post({ url: '/infra/data-source-config/create', data }) +} + +// 修改数据源配置 +export const updateDataSourceConfig = (data: DataSourceConfigVO) => { + return request.put({ url: '/infra/data-source-config/update', data }) +} + +// 删除数据源配置 +export const deleteDataSourceConfig = (id: number) => { + return request.delete({ url: '/infra/data-source-config/delete?id=' + id }) +} + +// 查询数据源配置详情 +export const getDataSourceConfig = (id: number) => { + return request.get({ url: '/infra/data-source-config/get?id=' + id }) +} + +// 查询数据源配置列表 +export const getDataSourceConfigList = () => { + return request.get({ url: '/infra/data-source-config/list' }) +} diff --git a/src/api/infra/dbDoc/index.ts b/src/api/infra/dbDoc/index.ts new file mode 100644 index 0000000..1a1a36b --- /dev/null +++ b/src/api/infra/dbDoc/index.ts @@ -0,0 +1,16 @@ +import request from '@/config/axios' + +// 导出Html +export const exportHtml = () => { + return request.download({ url: '/infra/db-doc/export-html' }) +} + +// 导出Word +export const exportWord = () => { + return request.download({ url: '/infra/db-doc/export-word' }) +} + +// 导出Markdown +export const exportMarkdown = () => { + return request.download({ url: '/infra/db-doc/export-markdown' }) +} diff --git a/src/api/infra/file/index.ts b/src/api/infra/file/index.ts new file mode 100644 index 0000000..82d5400 --- /dev/null +++ b/src/api/infra/file/index.ts @@ -0,0 +1,23 @@ +import request from '@/config/axios' + +export interface FilePageReqVO extends PageParam { + path?: string + type?: string + createTime?: Date[] +} + +// 查询文件列表 +export const getFilePage = (params: FilePageReqVO) => { + return request.get({ url: '/infra/file/page', params }) +} + +// 删除文件 +export const deleteFile = (id: number) => { + return request.delete({ url: '/infra/file/delete?id=' + id }) +} + + +// 删除文件 +export const selectList = () => { + return request.get({ url: '/infra/file/selectList' }) +} diff --git a/src/api/infra/fileConfig/index.ts b/src/api/infra/fileConfig/index.ts new file mode 100644 index 0000000..b72f18b --- /dev/null +++ b/src/api/infra/fileConfig/index.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' + +export interface FileClientConfig { + basePath: string + host?: string + port?: number + username?: string + password?: string + mode?: string + endpoint?: string + bucket?: string + accessKey?: string + accessSecret?: string + domain: string +} + +export interface FileConfigVO { + id: number + name: string + storage: any + master: boolean + visible: boolean + config: FileClientConfig + remark: string + createTime: Date +} + +// 查询文件配置列表 +export const getFileConfigPage = (params: PageParam) => { + return request.get({ url: '/infra/file-config/page', params }) +} + +// 查询文件配置详情 +export const getFileConfig = (id: number) => { + return request.get({ url: '/infra/file-config/get?id=' + id }) +} + +// 更新文件配置为主配置 +export const updateFileConfigMaster = (id: number) => { + return request.put({ url: '/infra/file-config/update-master?id=' + id }) +} + +// 新增文件配置 +export const createFileConfig = (data: FileConfigVO) => { + return request.post({ url: '/infra/file-config/create', data }) +} + +// 修改文件配置 +export const updateFileConfig = (data: FileConfigVO) => { + return request.put({ url: '/infra/file-config/update', data }) +} + +// 删除文件配置 +export const deleteFileConfig = (id: number) => { + return request.delete({ url: '/infra/file-config/delete?id=' + id }) +} + +// 测试文件配置 +export const testFileConfig = (id: number) => { + return request.get({ url: '/infra/file-config/test?id=' + id }) +} diff --git a/src/api/infra/job/index.ts b/src/api/infra/job/index.ts new file mode 100644 index 0000000..033b2cb --- /dev/null +++ b/src/api/infra/job/index.ts @@ -0,0 +1,63 @@ +import request from '@/config/axios' + +export interface JobVO { + id: number + name: string + status: number + handlerName: string + handlerParam: string + cronExpression: string + retryCount: number + retryInterval: number + monitorTimeout: number + createTime: Date +} + +// 任务列表 +export const getJobPage = (params: PageParam) => { + return request.get({ url: '/infra/job/page', params }) +} + +// 任务详情 +export const getJob = (id: number) => { + return request.get({ url: '/infra/job/get?id=' + id }) +} + +// 新增任务 +export const createJob = (data: JobVO) => { + return request.post({ url: '/infra/job/create', data }) +} + +// 修改定时任务调度 +export const updateJob = (data: JobVO) => { + return request.put({ url: '/infra/job/update', data }) +} + +// 删除定时任务调度 +export const deleteJob = (id: number) => { + return request.delete({ url: '/infra/job/delete?id=' + id }) +} + +// 导出定时任务调度 +export const exportJob = (params) => { + return request.download({ url: '/infra/job/export-excel', params }) +} + +// 任务状态修改 +export const updateJobStatus = (id: number, status: number) => { + const params = { + id, + status + } + return request.put({ url: '/infra/job/update-status', params }) +} + +// 定时任务立即执行一次 +export const runJob = (id: number) => { + return request.put({ url: '/infra/job/trigger?id=' + id }) +} + +// 获得定时任务的下 n 次执行时间 +export const getJobNextTimes = (id: number) => { + return request.get({ url: '/infra/job/get_next_times?id=' + id }) +} diff --git a/src/api/infra/jobLog/index.ts b/src/api/infra/jobLog/index.ts new file mode 100644 index 0000000..f429cd9 --- /dev/null +++ b/src/api/infra/jobLog/index.ts @@ -0,0 +1,33 @@ +import request from '@/config/axios' + +export interface JobLogVO { + id: number + jobId: number + handlerName: string + handlerParam: string + cronExpression: string + executeIndex: string + beginTime: string + endTime: string + duration: string + status: number + createTime: string +} + +// 任务日志列表 +export const getJobLogPage = (params: PageParam) => { + return request.get({ url: '/infra/job-log/page', params }) +} + +// 任务日志详情 +export const getJobLog = (id: number) => { + return request.get({ url: '/infra/job-log/get?id=' + id }) +} + +// 导出定时任务日志 +export const exportJobLog = (params) => { + return request.download({ + url: '/infra/job-log/export-excel', + params + }) +} diff --git a/src/api/infra/redis/index.ts b/src/api/infra/redis/index.ts new file mode 100644 index 0000000..f27be77 --- /dev/null +++ b/src/api/infra/redis/index.ts @@ -0,0 +1,8 @@ +import request from '@/config/axios' + +/** + * 获取redis 监控信息 + */ +export const getCache = () => { + return request.get({ url: '/infra/redis/get-monitor-info' }) +} diff --git a/src/api/infra/redis/types.ts b/src/api/infra/redis/types.ts new file mode 100644 index 0000000..548bfe9 --- /dev/null +++ b/src/api/infra/redis/types.ts @@ -0,0 +1,176 @@ +export interface RedisMonitorInfoVO { + info: RedisInfoVO + dbSize: number + commandStats: RedisCommandStatsVO[] +} + +export interface RedisInfoVO { + io_threaded_reads_processed: string + tracking_clients: string + uptime_in_seconds: string + cluster_connections: string + current_cow_size: string + maxmemory_human: string + aof_last_cow_size: string + master_replid2: string + mem_replication_backlog: string + aof_rewrite_scheduled: string + total_net_input_bytes: string + rss_overhead_ratio: string + hz: string + current_cow_size_age: string + redis_build_id: string + errorstat_BUSYGROUP: string + aof_last_bgrewrite_status: string + multiplexing_api: string + client_recent_max_output_buffer: string + allocator_resident: string + mem_fragmentation_bytes: string + aof_current_size: string + repl_backlog_first_byte_offset: string + tracking_total_prefixes: string + redis_mode: string + redis_git_dirty: string + aof_delayed_fsync: string + allocator_rss_bytes: string + repl_backlog_histlen: string + io_threads_active: string + rss_overhead_bytes: string + total_system_memory: string + loading: string + evicted_keys: string + maxclients: string + cluster_enabled: string + redis_version: string + repl_backlog_active: string + mem_aof_buffer: string + allocator_frag_bytes: string + io_threaded_writes_processed: string + instantaneous_ops_per_sec: string + used_memory_human: string + total_error_replies: string + role: string + maxmemory: string + used_memory_lua: string + rdb_current_bgsave_time_sec: string + used_memory_startup: string + used_cpu_sys_main_thread: string + lazyfree_pending_objects: string + aof_pending_bio_fsync: string + used_memory_dataset_perc: string + allocator_frag_ratio: string + arch_bits: string + used_cpu_user_main_thread: string + mem_clients_normal: string + expired_time_cap_reached_count: string + unexpected_error_replies: string + mem_fragmentation_ratio: string + aof_last_rewrite_time_sec: string + master_replid: string + aof_rewrite_in_progress: string + lru_clock: string + maxmemory_policy: string + run_id: string + latest_fork_usec: string + tracking_total_items: string + total_commands_processed: string + expired_keys: string + errorstat_ERR: string + used_memory: string + module_fork_in_progress: string + errorstat_WRONGPASS: string + aof_buffer_length: string + dump_payload_sanitizations: string + mem_clients_slaves: string + keyspace_misses: string + server_time_usec: string + executable: string + lazyfreed_objects: string + db0: string + used_memory_peak_human: string + keyspace_hits: string + rdb_last_cow_size: string + aof_pending_rewrite: string + used_memory_overhead: string + active_defrag_hits: string + tcp_port: string + uptime_in_days: string + used_memory_peak_perc: string + current_save_keys_processed: string + blocked_clients: string + total_reads_processed: string + expire_cycle_cpu_milliseconds: string + sync_partial_err: string + used_memory_scripts_human: string + aof_current_rewrite_time_sec: string + aof_enabled: string + process_supervised: string + master_repl_offset: string + used_memory_dataset: string + used_cpu_user: string + rdb_last_bgsave_status: string + tracking_total_keys: string + atomicvar_api: string + allocator_rss_ratio: string + client_recent_max_input_buffer: string + clients_in_timeout_table: string + aof_last_write_status: string + mem_allocator: string + used_memory_scripts: string + used_memory_peak: string + process_id: string + master_failover_state: string + errorstat_NOAUTH: string + used_cpu_sys: string + repl_backlog_size: string + connected_slaves: string + current_save_keys_total: string + gcc_version: string + total_system_memory_human: string + sync_full: string + connected_clients: string + module_fork_last_cow_size: string + total_writes_processed: string + allocator_active: string + total_net_output_bytes: string + pubsub_channels: string + current_fork_perc: string + active_defrag_key_hits: string + rdb_changes_since_last_save: string + instantaneous_input_kbps: string + used_memory_rss_human: string + configured_hz: string + expired_stale_perc: string + active_defrag_misses: string + used_cpu_sys_children: string + number_of_cached_scripts: string + sync_partial_ok: string + used_memory_lua_human: string + rdb_last_save_time: string + pubsub_patterns: string + slave_expires_tracked_keys: string + redis_git_sha1: string + used_memory_rss: string + rdb_last_bgsave_time_sec: string + os: string + mem_not_counted_for_evict: string + active_defrag_running: string + rejected_connections: string + aof_rewrite_buffer_length: string + total_forks: string + active_defrag_key_misses: string + allocator_allocated: string + aof_base_size: string + instantaneous_output_kbps: string + second_repl_offset: string + rdb_bgsave_in_progress: string + used_cpu_user_children: string + total_connections_received: string + migrate_cached_sockets: string +} + +export interface RedisCommandStatsVO { + command: string + calls: number + usec: number +} diff --git a/src/api/login/index.ts b/src/api/login/index.ts new file mode 100644 index 0000000..444f0f2 --- /dev/null +++ b/src/api/login/index.ts @@ -0,0 +1,72 @@ +import request from '@/config/axios' +import { getRefreshToken } from '@/utils/auth' +import type { UserLoginVO } from './types' + +export interface SmsCodeVO { + mobile: string + scene: number +} + +export interface SmsLoginVO { + mobile: string + code: string +} + +// 登录 +export const login = (data: UserLoginVO) => { + return request.post({ url: '/system/auth/login', data }) +} + +// 刷新访问令牌 +export const refreshToken = () => { + return request.post({ url: '/system/auth/refresh-token?refreshToken=' + getRefreshToken() }) +} + +// 使用租户名,获得租户编号 +export const getTenantIdByName = (name: string) => { + return request.get({ url: '/system/tenant/get-id-by-name?name=' + name }) +} + +// 登出 +export const loginOut = () => { + return request.post({ url: '/system/auth/logout' }) +} + +// 获取用户权限信息 +export const getInfo = () => { + return request.get({ url: '/system/auth/get-permission-info' }) +} + +//获取登录验证码 +export const sendSmsCode = (data: SmsCodeVO) => { + return request.post({ url: '/system/auth/send-sms-code', data }) +} + +// 短信验证码登录 +export const smsLogin = (data: SmsLoginVO) => { + return request.post({ url: '/system/auth/sms-login', data }) +} + +// 社交授权的跳转 +export const socialAuthRedirect = (type: number, redirectUri: string) => { + return request.get({ + url: '/system/auth/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri + }) +} +// 获取验证图片以及 token +export const getCode = (data) => { + return request.postOriginal({ url: 'system/captcha/get', data }) +} + +// 滑动或者点选验证 +export const reqCheck = (data) => { + return request.postOriginal({ url: 'system/captcha/check', data }) +} + +// 获取验证码 +export const getCodeImg = () => { + return request.get({ + url: 'system/captcha/captchaImage', headers: { + isToken: false + }}) +} \ No newline at end of file diff --git a/src/api/login/oauth2/index.ts b/src/api/login/oauth2/index.ts new file mode 100644 index 0000000..aef1820 --- /dev/null +++ b/src/api/login/oauth2/index.ts @@ -0,0 +1,41 @@ +import request from '@/config/axios' + +// 获得授权信息 +export const getAuthorize = (clientId: string) => { + return request.get({ url: '/system/oauth2/authorize?clientId=' + clientId }) +} + +// 发起授权 +export const authorize = ( + responseType: string, + clientId: string, + redirectUri: string, + state: string, + autoApprove: boolean, + checkedScopes: string[], + uncheckedScopes: string[] +) => { + // 构建 scopes + const scopes = {} + for (const scope of checkedScopes) { + scopes[scope] = true + } + for (const scope of uncheckedScopes) { + scopes[scope] = false + } + // 发起请求 + return request.post({ + url: '/system/oauth2/authorize', + headers: { + 'Content-type': 'application/x-www-form-urlencoded' + }, + params: { + response_type: responseType, + client_id: clientId, + redirect_uri: redirectUri, + state: state, + auto_approve: autoApprove, + scope: JSON.stringify(scopes) + } + }) +} diff --git a/src/api/login/types.ts b/src/api/login/types.ts new file mode 100644 index 0000000..b2173f7 --- /dev/null +++ b/src/api/login/types.ts @@ -0,0 +1,28 @@ +export type UserLoginVO = { + username: string + password: string + captchaVerification: string +} + +export type TokenType = { + id: number // 编号 + accessToken: string // 访问令牌 + refreshToken: string // 刷新令牌 + userId: number // 用户编号 + userType: number //用户类型 + clientId: string //客户端编号 + expiresTime: number //过期时间 +} + +export type UserVO = { + id: number + username: string + nickname: string + deptId: number + email: string + mobile: string + sex: number + avatar: string + loginIp: string + loginDate: string +} diff --git a/src/api/mes/index.ts b/src/api/mes/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/api/redis/index.ts b/src/api/redis/index.ts new file mode 100644 index 0000000..b716359 --- /dev/null +++ b/src/api/redis/index.ts @@ -0,0 +1,21 @@ +import request from '@/config/axios' + +export interface RedisVO { + key: string + value: string +} + +// 加入缓存 +export const addRedis = async (data:RedisVO) => { + return await request.post({ url: `/infra/redis/set`, data }) +} + +// 获取缓存 +export const getRedis = async (key) => { + return await request.get({ url: `/infra/redis/get?key=` + key}) +} + +// 删除物料清单 +export const deleteRedis = async (key) => { + return await request.delete({ url: `/infra/redis/delete?key=` + key}) +} \ No newline at end of file diff --git a/src/api/scp/index.ts b/src/api/scp/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/api/system/area/index.ts b/src/api/system/area/index.ts new file mode 100644 index 0000000..b7da941 --- /dev/null +++ b/src/api/system/area/index.ts @@ -0,0 +1,19 @@ +import request from '@/config/axios' + +// 获得地区树 +export const getAreaTree = async () => { + return await request.get({ url: '/system/area/tree' }) +} + +export const getChildrenArea = async (id: number) => { + return await request.get({ url: '/system/area/get-children?id=' + id }) +} + +export const getAreaListByIds = async (ids) => { + return await request.get({ url: '/system/area/get-by-ids?ids=' + ids }) +} + +// 获得 IP 对应的地区名 +export const getAreaByIp = async (ip: string) => { + return await request.get({ url: '/system/area/get-by-ip?ip=' + ip }) +} diff --git a/src/api/system/dept/index.ts b/src/api/system/dept/index.ts new file mode 100644 index 0000000..b028457 --- /dev/null +++ b/src/api/system/dept/index.ts @@ -0,0 +1,73 @@ +import request from '@/config/axios' + +export interface DeptVO { + id?: number + name: string + parentId: number + status: number + sort: number + leaderUserId: number + phone: string + email: string + createTime: Date +} + +// 查询部门(精简)列表 +export const getSimpleDeptList = async (): Promise => { + return await request.get({ url: '/system/dept/list-all-simple' }) +} + +// 查询部门列表 +export const getDeptPage = async (params: PageParam) => { + return await request.get({ url: '/system/dept/list', params }) +} + +// 查询部门分页 +export const getDeptPages = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/system/dept/senior', data }) + } else { + return await request.get({ url: `/system/dept/page`, params }) + } +} + + +// 查询部门详情 +export const getDept = async (id: number) => { + return await request.get({ url: '/system/dept/get?id=' + id }) +} + +// 新增部门 +export const createDept = async (data: DeptVO) => { + return await request.post({ url: '/system/dept/create', data: data }) +} + +// 修改部门 +export const updateDept = async (params: DeptVO) => { + return await request.put({ url: '/system/dept/update', data: params }) +} + +// 删除部门 +export const deleteDept = async (id: number) => { + return await request.delete({ url: '/system/dept/delete?id=' + id }) +} + + +// 查询厂区列表 +export const selectAllFactoryArea = async () => { + return await request.get({ url: '/system/dept/selectAllFactoryArea'}) +} + +// 查询厂区级部门列表 +export const selectAllFactoryAreaDept = async () => { + return await request.get({ url: '/system/dept/selectAllFactoryAreaDept'}) +} + + +// 查询厂区--班组下人员列表 +export const selecUserByType = async (data) => { + return await request.get({ url: '/system/dept/selecUserByType?classType=' + data.classType + '&factoryAreaNumber=' + data.factoryAreaNumber + '&flag=' + data.flag}) +} + diff --git a/src/api/system/dict/dict.data.ts b/src/api/system/dict/dict.data.ts new file mode 100644 index 0000000..87e7dce --- /dev/null +++ b/src/api/system/dict/dict.data.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +export type DictDataVO = { + id: number | undefined + sort: number | undefined + label: string + value: string + dictType: string + status: number + colorType: string + cssClass: string + remark: string + createTime: Date +} + +// 查询字典数据(精简)列表 +export const listSimpleDictData = () => { + return request.get({ url: '/system/dict-data/list-all-simple' }) +} + +// 查询字典数据列表 +export const getDictDataPage = (params: PageParam) => { + return request.get({ url: '/system/dict-data/page', params }) +} + +// 查询字典数据详情 +export const getDictData = (id: number) => { + return request.get({ url: '/system/dict-data/get?id=' + id }) +} + +// 新增字典数据 +export const createDictData = (data: DictDataVO) => { + return request.post({ url: '/system/dict-data/create', data }) +} + +// 修改字典数据 +export const updateDictData = (data: DictDataVO) => { + return request.put({ url: '/system/dict-data/update', data }) +} + +// 删除字典数据 +export const deleteDictData = (id: number) => { + return request.delete({ url: '/system/dict-data/delete?id=' + id }) +} + +// 导出字典类型数据 +export const exportDictData = (params) => { + return request.get({ url: '/system/dict-data/export', params }) +} diff --git a/src/api/system/dict/dict.type.ts b/src/api/system/dict/dict.type.ts new file mode 100644 index 0000000..ed2969f --- /dev/null +++ b/src/api/system/dict/dict.type.ts @@ -0,0 +1,44 @@ +import request from '@/config/axios' + +export type DictTypeVO = { + id: number | undefined + name: string + type: string + status: number + remark: string + createTime: Date +} + +// 查询字典(精简)列表 +export const getSimpleDictTypeList = () => { + return request.get({ url: '/system/dict-type/list-all-simple' }) +} + +// 查询字典列表 +export const getDictTypePage = (params: PageParam) => { + return request.get({ url: '/system/dict-type/page', params }) +} + +// 查询字典详情 +export const getDictType = (id: number) => { + return request.get({ url: '/system/dict-type/get?id=' + id }) +} + +// 新增字典 +export const createDictType = (data: DictTypeVO) => { + return request.post({ url: '/system/dict-type/create', data }) +} + +// 修改字典 +export const updateDictType = (data: DictTypeVO) => { + return request.put({ url: '/system/dict-type/update', data }) +} + +// 删除字典 +export const deleteDictType = (id: number) => { + return request.delete({ url: '/system/dict-type/delete?id=' + id }) +} +// 导出字典类型 +export const exportDictType = (params) => { + return request.get({ url: '/system/dict-type/export', params }) +} diff --git a/src/api/system/errorCode/index.ts b/src/api/system/errorCode/index.ts new file mode 100644 index 0000000..8a86a63 --- /dev/null +++ b/src/api/system/errorCode/index.ts @@ -0,0 +1,40 @@ +import request from '@/config/axios' + +export interface ErrorCodeVO { + id: number | undefined + type: number + applicationName: string + code: number | undefined + message: string + memo: string + createTime: Date +} + +// 查询错误码列表 +export const getErrorCodePage = (params: PageParam) => { + return request.get({ url: '/system/error-code/page', params }) +} + +// 查询错误码详情 +export const getErrorCode = (id: number) => { + return request.get({ url: '/system/error-code/get?id=' + id }) +} + +// 新增错误码 +export const createErrorCode = (data: ErrorCodeVO) => { + return request.post({ url: '/system/error-code/create', data }) +} + +// 修改错误码 +export const updateErrorCode = (data: ErrorCodeVO) => { + return request.put({ url: '/system/error-code/update', data }) +} + +// 删除错误码 +export const deleteErrorCode = (id: number) => { + return request.delete({ url: '/system/error-code/delete?id=' + id }) +} +// 导出错误码 +export const excelErrorCode = (params) => { + return request.download({ url: '/system/error-code/export-excel', params }) +} diff --git a/src/api/system/loginLog/index.ts b/src/api/system/loginLog/index.ts new file mode 100644 index 0000000..f275c3e --- /dev/null +++ b/src/api/system/loginLog/index.ts @@ -0,0 +1,24 @@ +import request from '@/config/axios' + +export interface LoginLogVO { + id: number + logType: number + traceId: number + userId: number + userType: number + username: string + status: number + userIp: string + userAgent: string + createTime: Date +} + +// 查询登录日志列表 +export const getLoginLogPage = (params: PageParam) => { + return request.get({ url: '/system/login-log/page', params }) +} + +// 导出登录日志 +export const exportLoginLog = (params) => { + return request.download({ url: '/system/login-log/export', params }) +} diff --git a/src/api/system/mail/account/index.ts b/src/api/system/mail/account/index.ts new file mode 100644 index 0000000..9e10c92 --- /dev/null +++ b/src/api/system/mail/account/index.ts @@ -0,0 +1,41 @@ +import request from '@/config/axios' + +export interface MailAccountVO { + id: number + mail: string + username: string + password: string + host: string + port: number + sslEnable: boolean +} + +// 查询邮箱账号列表 +export const getMailAccountPage = async (params: PageParam) => { + return await request.get({ url: '/system/mail-account/page', params }) +} + +// 查询邮箱账号详情 +export const getMailAccount = async (id: number) => { + return await request.get({ url: '/system/mail-account/get?id=' + id }) +} + +// 新增邮箱账号 +export const createMailAccount = async (data: MailAccountVO) => { + return await request.post({ url: '/system/mail-account/create', data }) +} + +// 修改邮箱账号 +export const updateMailAccount = async (data: MailAccountVO) => { + return await request.put({ url: '/system/mail-account/update', data }) +} + +// 删除邮箱账号 +export const deleteMailAccount = async (id: number) => { + return await request.delete({ url: '/system/mail-account/delete?id=' + id }) +} + +// 获得邮箱账号精简列表 +export const getSimpleMailAccountList = async () => { + return request.get({ url: '/system/mail-account/list-all-simple' }) +} diff --git a/src/api/system/mail/log/index.ts b/src/api/system/mail/log/index.ts new file mode 100644 index 0000000..13172a7 --- /dev/null +++ b/src/api/system/mail/log/index.ts @@ -0,0 +1,30 @@ +import request from '@/config/axios' + +export interface MailLogVO { + id: number + userId: number + userType: number + toMail: string + accountId: number + fromMail: string + templateId: number + templateCode: string + templateNickname: string + templateTitle: string + templateContent: string + templateParams: string + sendStatus: number + sendTime: Date + sendMessageId: string + sendException: string +} + +// 查询邮件日志列表 +export const getMailLogPage = async (params: PageParam) => { + return await request.get({ url: '/system/mail-log/page', params }) +} + +// 查询邮件日志详情 +export const getMailLog = async (id: number) => { + return await request.get({ url: '/system/mail-log/get?id=' + id }) +} diff --git a/src/api/system/mail/template/index.ts b/src/api/system/mail/template/index.ts new file mode 100644 index 0000000..fb7ce5e --- /dev/null +++ b/src/api/system/mail/template/index.ts @@ -0,0 +1,50 @@ +import request from '@/config/axios' + +export interface MailTemplateVO { + id: number + name: string + code: string + accountId: number + nickname: string + title: string + content: string + params: string + status: number + remark: string +} + +export interface MailSendReqVO { + mail: string + templateCode: string + templateParams: Map +} + +// 查询邮件模版列表 +export const getMailTemplatePage = async (params: PageParam) => { + return await request.get({ url: '/system/mail-template/page', params }) +} + +// 查询邮件模版详情 +export const getMailTemplate = async (id: number) => { + return await request.get({ url: '/system/mail-template/get?id=' + id }) +} + +// 新增邮件模版 +export const createMailTemplate = async (data: MailTemplateVO) => { + return await request.post({ url: '/system/mail-template/create', data }) +} + +// 修改邮件模版 +export const updateMailTemplate = async (data: MailTemplateVO) => { + return await request.put({ url: '/system/mail-template/update', data }) +} + +// 删除邮件模版 +export const deleteMailTemplate = async (id: number) => { + return await request.delete({ url: '/system/mail-template/delete?id=' + id }) +} + +// 发送邮件 +export const sendMail = (data: MailSendReqVO) => { + return request.post({ url: '/system/mail-template/send-mail', data }) +} diff --git a/src/api/system/menu/index.ts b/src/api/system/menu/index.ts new file mode 100644 index 0000000..4bb9a87 --- /dev/null +++ b/src/api/system/menu/index.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +export interface MenuVO { + id: number + name: string + permission: string + type: number + sort: number + parentId: number + path: string + icon: string + component: string + componentName?: string + status: number + visible: boolean + keepAlive: boolean + alwaysShow?: boolean + createTime: Date +} + +// 查询菜单(精简)列表 +export const getSimpleMenusList = () => { + return request.get({ url: '/system/menu/list-all-simple' }) +} + +// 查询菜单列表 +export const getMenuList = (params) => { + return request.get({ url: '/system/menu/list', params }) +} + +// 获取菜单详情 +export const getMenu = (id: number) => { + return request.get({ url: '/system/menu/get?id=' + id }) +} + +// 新增菜单 +export const createMenu = (data: MenuVO) => { + return request.post({ url: '/system/menu/create', data }) +} + +// 修改菜单 +export const updateMenu = (data: MenuVO) => { + return request.put({ url: '/system/menu/update', data }) +} + +// 删除菜单 +export const deleteMenu = (id: number) => { + return request.delete({ url: '/system/menu/delete?id=' + id }) +} diff --git a/src/api/system/notice/index.ts b/src/api/system/notice/index.ts new file mode 100644 index 0000000..62bf525 --- /dev/null +++ b/src/api/system/notice/index.ts @@ -0,0 +1,37 @@ +import request from '@/config/axios' + +export interface NoticeVO { + id: number | undefined + title: string + type: number + content: string + status: number + remark: string + creator: string + createTime: Date +} + +// 查询公告列表 +export const getNoticePage = (params: PageParam) => { + return request.get({ url: '/system/notice/page', params }) +} + +// 查询公告详情 +export const getNotice = (id: number) => { + return request.get({ url: '/system/notice/get?id=' + id }) +} + +// 新增公告 +export const createNotice = (data: NoticeVO) => { + return request.post({ url: '/system/notice/create', data }) +} + +// 修改公告 +export const updateNotice = (data: NoticeVO) => { + return request.put({ url: '/system/notice/update', data }) +} + +// 删除公告 +export const deleteNotice = (id: number) => { + return request.delete({ url: '/system/notice/delete?id=' + id }) +} diff --git a/src/api/system/notify/message/index.ts b/src/api/system/notify/message/index.ts new file mode 100644 index 0000000..29036b9 --- /dev/null +++ b/src/api/system/notify/message/index.ts @@ -0,0 +1,48 @@ +import request from '@/config/axios' +import qs from 'qs' + +export interface NotifyMessageVO { + id: number + userId: number + userType: number + templateId: number + templateCode: string + templateNickname: string + templateContent: string + templateType: number + templateParams: string + readStatus: boolean + readTime: Date +} + +// 查询站内信消息列表 +export const getNotifyMessagePage = async (params: PageParam) => { + return await request.get({ url: '/system/notify-message/page', params }) +} + +// 获得我的站内信分页 +export const getMyNotifyMessagePage = async (params: PageParam) => { + return await request.get({ url: '/system/notify-message/my-page', params }) +} + +// 批量标记已读 +export const updateNotifyMessageRead = async (ids) => { + return await request.put({ + url: '/system/notify-message/update-read?' + qs.stringify({ ids: ids }, { indices: false }) + }) +} + +// 标记所有站内信为已读 +export const updateAllNotifyMessageRead = async () => { + return await request.put({ url: '/system/notify-message/update-all-read' }) +} + +// 获取当前用户的最新站内信列表 +export const getUnreadNotifyMessageList = async () => { + return await request.get({ url: '/system/notify-message/get-unread-list' }) +} + +// 获得当前用户的未读站内信数量 +export const getUnreadNotifyMessageCount = async () => { + return await request.get({ url: '/system/notify-message/get-unread-count' }) +} diff --git a/src/api/system/notify/template/index.ts b/src/api/system/notify/template/index.ts new file mode 100644 index 0000000..cd0e122 --- /dev/null +++ b/src/api/system/notify/template/index.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +export interface NotifyTemplateVO { + id?: number + name: string + nickname: string + code: string + content: string + type: number + params: string + status: number + remark: string +} + +export interface NotifySendReqVO { + userId: number | null + templateCode: string + templateParams: Map +} + +// 查询站内信模板列表 +export const getNotifyTemplatePage = async (params: PageParam) => { + return await request.get({ url: '/system/notify-template/page', params }) +} + +// 查询站内信模板详情 +export const getNotifyTemplate = async (id: number) => { + return await request.get({ url: '/system/notify-template/get?id=' + id }) +} + +// 新增站内信模板 +export const createNotifyTemplate = async (data: NotifyTemplateVO) => { + return await request.post({ url: '/system/notify-template/create', data }) +} + +// 修改站内信模板 +export const updateNotifyTemplate = async (data: NotifyTemplateVO) => { + return await request.put({ url: '/system/notify-template/update', data }) +} + +// 删除站内信模板 +export const deleteNotifyTemplate = async (id: number) => { + return await request.delete({ url: '/system/notify-template/delete?id=' + id }) +} + +// 发送站内信 +export const sendNotify = (data: NotifySendReqVO) => { + return request.post({ url: '/system/notify-template/send-notify', data }) +} diff --git a/src/api/system/oauth2/client.ts b/src/api/system/oauth2/client.ts new file mode 100644 index 0000000..6f71aca --- /dev/null +++ b/src/api/system/oauth2/client.ts @@ -0,0 +1,47 @@ +import request from '@/config/axios' + +export interface OAuth2ClientVO { + id: number + clientId: string + secret: string + name: string + logo: string + description: string + status: number + accessTokenValiditySeconds: number + refreshTokenValiditySeconds: number + redirectUris: string[] + autoApprove: boolean + authorizedGrantTypes: string[] + scopes: string[] + authorities: string[] + resourceIds: string[] + additionalInformation: string + isAdditionalInformationJson: boolean + createTime: Date +} + +// 查询 OAuth2 客户端的列表 +export const getOAuth2ClientPage = (params: PageParam) => { + return request.get({ url: '/system/oauth2-client/page', params }) +} + +// 查询 OAuth2 客户端的详情 +export const getOAuth2Client = (id: number) => { + return request.get({ url: '/system/oauth2-client/get?id=' + id }) +} + +// 新增 OAuth2 客户端 +export const createOAuth2Client = (data: OAuth2ClientVO) => { + return request.post({ url: '/system/oauth2-client/create', data }) +} + +// 修改 OAuth2 客户端 +export const updateOAuth2Client = (data: OAuth2ClientVO) => { + return request.put({ url: '/system/oauth2-client/update', data }) +} + +// 删除 OAuth2 +export const deleteOAuth2Client = (id: number) => { + return request.delete({ url: '/system/oauth2-client/delete?id=' + id }) +} diff --git a/src/api/system/oauth2/token.ts b/src/api/system/oauth2/token.ts new file mode 100644 index 0000000..ac89ae8 --- /dev/null +++ b/src/api/system/oauth2/token.ts @@ -0,0 +1,22 @@ +import request from '@/config/axios' + +export interface OAuth2TokenVO { + id: number + accessToken: string + refreshToken: string + userId: number + userType: number + clientId: string + createTime: Date + expiresTime: Date +} + +// 查询 token列表 +export const getAccessTokenPage = (params: PageParam) => { + return request.get({ url: '/system/oauth2-token/page', params }) +} + +// 删除 token +export const deleteAccessToken = (accessToken: string) => { + return request.delete({ url: '/system/oauth2-token/delete?accessToken=' + accessToken }) +} diff --git a/src/api/system/operatelog/index.ts b/src/api/system/operatelog/index.ts new file mode 100644 index 0000000..848a533 --- /dev/null +++ b/src/api/system/operatelog/index.ts @@ -0,0 +1,33 @@ +import request from '@/config/axios' + +export type OperateLogVO = { + id: number + userNickname: string + traceId: string + userId: number + module: string + name: string + type: number + content: string + exts: Map + requestMethod: string + requestUrl: string + userIp: string + userAgent: string + javaMethod: string + javaMethodArgs: string + startTime: Date + duration: number + resultCode: number + resultMsg: string + resultData: string +} + +// 查询操作日志列表 +export const getOperateLogPage = (params: PageParam) => { + return request.get({ url: '/system/operate-log/page', params }) +} +// 导出操作日志 +export const exportOperateLog = (params) => { + return request.download({ url: '/system/operate-log/export', params }) +} diff --git a/src/api/system/permission/index.ts b/src/api/system/permission/index.ts new file mode 100644 index 0000000..b3c7696 --- /dev/null +++ b/src/api/system/permission/index.ts @@ -0,0 +1,42 @@ +import request from '@/config/axios' + +export interface PermissionAssignUserRoleReqVO { + userId: number + roleIds: number[] +} + +export interface PermissionAssignRoleMenuReqVO { + roleId: number + menuIds: number[] +} + +export interface PermissionAssignRoleDataScopeReqVO { + roleId: number + dataScope: number + dataScopeDeptIds: number[] +} + +// 查询角色拥有的菜单权限 +export const getRoleMenuList = async (roleId: number) => { + return await request.get({ url: '/system/permission/list-role-menus?roleId=' + roleId }) +} + +// 赋予角色菜单权限 +export const assignRoleMenu = async (data: PermissionAssignRoleMenuReqVO) => { + return await request.post({ url: '/system/permission/assign-role-menu', data }) +} + +// 赋予角色数据权限 +export const assignRoleDataScope = async (data: PermissionAssignRoleDataScopeReqVO) => { + return await request.post({ url: '/system/permission/assign-role-data-scope', data }) +} + +// 查询用户拥有的角色数组 +export const getUserRoleList = async (userId: number) => { + return await request.get({ url: '/system/permission/list-user-roles?userId=' + userId }) +} + +// 赋予用户角色 +export const assignUserRole = async (data: PermissionAssignUserRoleReqVO) => { + return await request.post({ url: '/system/permission/assign-user-role', data }) +} diff --git a/src/api/system/post/index.ts b/src/api/system/post/index.ts new file mode 100644 index 0000000..405db38 --- /dev/null +++ b/src/api/system/post/index.ts @@ -0,0 +1,46 @@ +import request from '@/config/axios' + +export interface PostVO { + id?: number + name: string + code: string + sort: number + status: number + remark: string + createTime?: Date +} + +// 查询岗位列表 +export const getPostPage = async (params: PageParam) => { + return await request.get({ url: '/system/post/page', params }) +} + +// 获取岗位精简信息列表 +export const getSimplePostList = async (): Promise => { + return await request.get({ url: '/system/post/list-all-simple' }) +} + +// 查询岗位详情 +export const getPost = async (id: number) => { + return await request.get({ url: '/system/post/get?id=' + id }) +} + +// 新增岗位 +export const createPost = async (data: PostVO) => { + return await request.post({ url: '/system/post/create', data }) +} + +// 修改岗位 +export const updatePost = async (data: PostVO) => { + return await request.put({ url: '/system/post/update', data }) +} + +// 删除岗位 +export const deletePost = async (id: number) => { + return await request.delete({ url: '/system/post/delete?id=' + id }) +} + +// 导出岗位 +export const exportPost = async (params) => { + return await request.download({ url: '/system/post/export', params }) +} diff --git a/src/api/system/role/index.ts b/src/api/system/role/index.ts new file mode 100644 index 0000000..d174e95 --- /dev/null +++ b/src/api/system/role/index.ts @@ -0,0 +1,72 @@ +import request from '@/config/axios' + +export interface RoleVO { + id: number + name: string + code: string + sort: number + status: number + type: number + dataScope: number + dataScopeDeptIds: number[] + createTime: Date +} + +export interface UpdateStatusReqVO { + id: number + status: number +} + +// 查询角色列表 +export const getRolePage = async (params: PageParam) => { + return await request.get({ url: '/system/role/page', params }) +} + +// 查询角色分页 +export const getRolePages = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/system/role/senior', data }) + } else { + return await request.get({ url: `/system/role/page`, params }) + } +} + +// 查询角色(精简)列表 +export const getSimpleRoleList = async (): Promise => { + return await request.get({ url: '/system/role/list-all-simple' }) +} + +// 查询角色详情 +export const getRole = async (id: number) => { + return await request.get({ url: '/system/role/get?id=' + id }) +} + +// 新增角色 +export const createRole = async (data: RoleVO) => { + return await request.post({ url: '/system/role/create', data }) +} + +// 修改角色 +export const updateRole = async (data: RoleVO) => { + return await request.put({ url: '/system/role/update', data }) +} + +// 修改角色状态 +export const updateRoleStatus = async (data: UpdateStatusReqVO) => { + return await request.put({ url: '/system/role/update-status', data }) +} + +// 删除角色 +export const deleteRole = async (id: number) => { + return await request.delete({ url: '/system/role/delete?id=' + id }) +} + +// 导出角色 +export const exportRole = (params) => { + return request.download({ + url: '/system/role/export-excel', + params + }) +} diff --git a/src/api/system/sensitiveWord/index.ts b/src/api/system/sensitiveWord/index.ts new file mode 100644 index 0000000..1116226 --- /dev/null +++ b/src/api/system/sensitiveWord/index.ts @@ -0,0 +1,58 @@ +import request from '@/config/axios' +import qs from 'qs' + +export interface SensitiveWordVO { + id: number + name: string + status: number + description: string + tags: string[] + createTime: Date +} + +export interface SensitiveWordTestReqVO { + text: string + tag: string[] +} + +// 查询敏感词列表 +export const getSensitiveWordPage = (params: PageParam) => { + return request.get({ url: '/system/sensitive-word/page', params }) +} + +// 查询敏感词详情 +export const getSensitiveWord = (id: number) => { + return request.get({ url: '/system/sensitive-word/get?id=' + id }) +} + +// 新增敏感词 +export const createSensitiveWord = (data: SensitiveWordVO) => { + return request.post({ url: '/system/sensitive-word/create', data }) +} + +// 修改敏感词 +export const updateSensitiveWord = (data: SensitiveWordVO) => { + return request.put({ url: '/system/sensitive-word/update', data }) +} + +// 删除敏感词 +export const deleteSensitiveWord = (id: number) => { + return request.delete({ url: '/system/sensitive-word/delete?id=' + id }) +} + +// 导出敏感词 +export const exportSensitiveWord = (params) => { + return request.download({ url: '/system/sensitive-word/export-excel', params }) +} + +// 获取所有敏感词的标签数组 +export const getSensitiveWordTagList = () => { + return request.get({ url: '/system/sensitive-word/get-tags' }) +} + +// 获得文本所包含的不合法的敏感词数组 +export const validateText = (query: SensitiveWordTestReqVO) => { + return request.get({ + url: '/system/sensitive-word/validate-text?' + qs.stringify(query, { arrayFormat: 'repeat' }) + }) +} diff --git a/src/api/system/serialNumber/index.ts b/src/api/system/serialNumber/index.ts new file mode 100644 index 0000000..33fa754 --- /dev/null +++ b/src/api/system/serialNumber/index.ts @@ -0,0 +1,42 @@ +import request from '@/config/axios' + +export interface SerialNumberVO { + id: number + ruleCode: string + ruleName: string + prefix: string + pattern: string + length: byte + separator: string + remark: string +} + +// 查询流水号规则列表 +export const getSerialNumberPage = async (params) => { + return await request.get({ url: `/system/serial-number/page`, params }) +} + +// 查询流水号规则详情 +export const getSerialNumber = async (id: number) => { + return await request.get({ url: `/system/serial-number/get?id=` + id }) +} + +// 新增流水号规则 +export const createSerialNumber = async (data: SerialNumberVO) => { + return await request.post({ url: `/system/serial-number/create`, data }) +} + +// 修改流水号规则 +export const updateSerialNumber = async (data: SerialNumberVO) => { + return await request.put({ url: `/system/serial-number/update`, data }) +} + +// 删除流水号规则 +export const deleteSerialNumber = async (id: number) => { + return await request.delete({ url: `/system/serial-number/delete?id=` + id }) +} + +// 导出流水号规则 Excel +export const exportSerialNumber = async (params) => { + return await request.download({ url: `/system/serial-number/export-excel`, params }) +} diff --git a/src/api/system/sms/smsChannel/index.ts b/src/api/system/sms/smsChannel/index.ts new file mode 100644 index 0000000..f335628 --- /dev/null +++ b/src/api/system/sms/smsChannel/index.ts @@ -0,0 +1,43 @@ +import request from '@/config/axios' + +export interface SmsChannelVO { + id: number + code: string + status: number + signature: string + remark: string + apiKey: string + apiSecret: string + callbackUrl: string + createTime: Date +} + +// 查询短信渠道列表 +export const getSmsChannelPage = (params: PageParam) => { + return request.get({ url: '/system/sms-channel/page', params }) +} + +// 获得短信渠道精简列表 +export function getSimpleSmsChannelList() { + return request.get({ url: '/system/sms-channel/list-all-simple' }) +} + +// 查询短信渠道详情 +export const getSmsChannel = (id: number) => { + return request.get({ url: '/system/sms-channel/get?id=' + id }) +} + +// 新增短信渠道 +export const createSmsChannel = (data: SmsChannelVO) => { + return request.post({ url: '/system/sms-channel/create', data }) +} + +// 修改短信渠道 +export const updateSmsChannel = (data: SmsChannelVO) => { + return request.put({ url: '/system/sms-channel/update', data }) +} + +// 删除短信渠道 +export const deleteSmsChannel = (id: number) => { + return request.delete({ url: '/system/sms-channel/delete?id=' + id }) +} diff --git a/src/api/system/sms/smsLog/index.ts b/src/api/system/sms/smsLog/index.ts new file mode 100644 index 0000000..3d54fac --- /dev/null +++ b/src/api/system/sms/smsLog/index.ts @@ -0,0 +1,39 @@ +import request from '@/config/axios' + +export interface SmsLogVO { + id: number | null + channelId: number | null + channelCode: string + templateId: number | null + templateCode: string + templateType: number | null + templateContent: string + templateParams: Map | null + apiTemplateId: string + mobile: string + userId: number | null + userType: number | null + sendStatus: number | null + sendTime: Date | null + sendCode: number | null + sendMsg: string + apiSendCode: string + apiSendMsg: string + apiRequestId: string + apiSerialNo: string + receiveStatus: number | null + receiveTime: Date | null + apiReceiveCode: string + apiReceiveMsg: string + createTime: Date | null +} + +// 查询短信日志列表 +export const getSmsLogPage = (params: PageParam) => { + return request.get({ url: '/system/sms-log/page', params }) +} + +// 导出短信日志 +export const exportSmsLog = (params) => { + return request.download({ url: '/system/sms-log/export-excel', params }) +} diff --git a/src/api/system/sms/smsTemplate/index.ts b/src/api/system/sms/smsTemplate/index.ts new file mode 100644 index 0000000..35cb489 --- /dev/null +++ b/src/api/system/sms/smsTemplate/index.ts @@ -0,0 +1,60 @@ +import request from '@/config/axios' + +export interface SmsTemplateVO { + id: number | null + type: number | null + status: number + code: string + name: string + content: string + remark: string + apiTemplateId: string + channelId: number | null + channelCode?: string + params?: string[] + createTime?: Date +} + +export interface SendSmsReqVO { + mobile: string + templateCode: string + templateParams: Map +} + +// 查询短信模板列表 +export const getSmsTemplatePage = (params: PageParam) => { + return request.get({ url: '/system/sms-template/page', params }) +} + +// 查询短信模板详情 +export const getSmsTemplate = (id: number) => { + return request.get({ url: '/system/sms-template/get?id=' + id }) +} + +// 新增短信模板 +export const createSmsTemplate = (data: SmsTemplateVO) => { + return request.post({ url: '/system/sms-template/create', data }) +} + +// 修改短信模板 +export const updateSmsTemplate = (data: SmsTemplateVO) => { + return request.put({ url: '/system/sms-template/update', data }) +} + +// 删除短信模板 +export const deleteSmsTemplate = (id: number) => { + return request.delete({ url: '/system/sms-template/delete?id=' + id }) +} + +// 导出短信模板 +export const exportSmsTemplate = (params) => { + return request.download({ + url: '/system/sms-template/export-excel', + params + }) +} + +// 发送短信 +export const sendSms = (data: SendSmsReqVO) => { + return request.post({ url: '/system/sms-template/send-sms', data }) +} diff --git a/src/api/system/sysconfig/index.ts b/src/api/system/sysconfig/index.ts new file mode 100644 index 0000000..54ac7ee --- /dev/null +++ b/src/api/system/sysconfig/index.ts @@ -0,0 +1,50 @@ +import request from '@/config/axios' + +export interface ConfigVO { + configName: string + configKey: string + configValue: string + configType: string + createBy: string +} + +// 查询系统参数列表 +export const getConfigPage = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '/sys/config/senior', data }) + } else { + return await request.get({ url: `/sys/config/page`, params }) + } +} + +// 查询系统参数详情 +export const getConfig = async (id: number) => { + return await request.get({ url: `/sys/config/get?id=` + id }) +} + +// 新增系统参数 +export const createConfig = async (data: ConfigVO) => { + return await request.post({ url: `/sys/config/create`, data }) +} + +// 修改系统参数 +export const updateConfig = async (data: ConfigVO) => { + return await request.put({ url: `/sys/config/update`, data }) +} + +// 删除系统参数 +export const deleteConfig = async (id: number) => { + return await request.delete({ url: `/sys/config/delete?id=` + id }) +} + +// 导出系统参数 Excel +export const exportConfig = async (params) => { + return await request.download({ url: `/sys/config/export-excel`, params }) +} + +// 下载用户导入模板 +export const importTemplate = () => { + return request.download({ url: '/sys/config/get-import-template' }) +} \ No newline at end of file diff --git a/src/api/system/tenant/index.ts b/src/api/system/tenant/index.ts new file mode 100644 index 0000000..176c375 --- /dev/null +++ b/src/api/system/tenant/index.ts @@ -0,0 +1,62 @@ +import request from '@/config/axios' + +export interface TenantVO { + id: number + name: string + contactName: string + contactMobile: string + status: number + domain: string + packageId: number + username: string + password: string + expireTime: Date + accountCount: number + createTime: Date +} + +export interface TenantPageReqVO extends PageParam { + name?: string + contactName?: string + contactMobile?: string + status?: number + createTime?: Date[] +} + +export interface TenantExportReqVO { + name?: string + contactName?: string + contactMobile?: string + status?: number + createTime?: Date[] +} + +// 查询租户列表 +export const getTenantPage = (params: TenantPageReqVO) => { + return request.get({ url: '/system/tenant/page', params }) +} + +// 查询租户详情 +export const getTenant = (id: number) => { + return request.get({ url: '/system/tenant/get?id=' + id }) +} + +// 新增租户 +export const createTenant = (data: TenantVO) => { + return request.post({ url: '/system/tenant/create', data }) +} + +// 修改租户 +export const updateTenant = (data: TenantVO) => { + return request.put({ url: '/system/tenant/update', data }) +} + +// 删除租户 +export const deleteTenant = (id: number) => { + return request.delete({ url: '/system/tenant/delete?id=' + id }) +} + +// 导出租户 +export const exportTenant = (params: TenantExportReqVO) => { + return request.download({ url: '/system/tenant/export-excel', params }) +} diff --git a/src/api/system/tenantPackage/index.ts b/src/api/system/tenantPackage/index.ts new file mode 100644 index 0000000..01d139e --- /dev/null +++ b/src/api/system/tenantPackage/index.ts @@ -0,0 +1,42 @@ +import request from '@/config/axios' + +export interface TenantPackageVO { + id: number + name: string + status: number + remark: string + creator: string + updater: string + updateTime: string + menuIds: number[] + createTime: Date +} + +// 查询租户套餐列表 +export const getTenantPackagePage = (params: PageParam) => { + return request.get({ url: '/system/tenant-package/page', params }) +} + +// 获得租户 +export const getTenantPackage = (id: number) => { + return request.get({ url: '/system/tenant-package/get?id=' + id }) +} + +// 新增租户套餐 +export const createTenantPackage = (data: TenantPackageVO) => { + return request.post({ url: '/system/tenant-package/create', data }) +} + +// 修改租户套餐 +export const updateTenantPackage = (data: TenantPackageVO) => { + return request.put({ url: '/system/tenant-package/update', data }) +} + +// 删除租户套餐 +export const deleteTenantPackage = (id: number) => { + return request.delete({ url: '/system/tenant-package/delete?id=' + id }) +} +// 获取租户套餐精简信息列表 +export const getTenantPackageList = () => { + return request.get({ url: '/system/tenant-package/get-simple-list' }) +} diff --git a/src/api/system/user/index.ts b/src/api/system/user/index.ts new file mode 100644 index 0000000..6224f0e --- /dev/null +++ b/src/api/system/user/index.ts @@ -0,0 +1,76 @@ +import request from '@/config/axios' + +export interface UserVO { + id: number + username: string + nickname: string + deptId: number + postIds: string[] + email: string + mobile: string + sex: number + avatar: string + loginIp: string + status: number + remark: string + loginDate: Date + createTime: Date +} + +// 查询用户管理列表 +export const getUserPage = (params: PageParam) => { + return request.get({ url: '/system/user/page', params }) +} + +// 查询用户详情 +export const getUser = (id: number) => { + return request.get({ url: '/system/user/get?id=' + id }) +} + +// 新增用户 +export const createUser = (data: UserVO) => { + return request.post({ url: '/system/user/create', data }) +} + +// 修改用户 +export const updateUser = (data: UserVO) => { + return request.put({ url: '/system/user/update', data }) +} + +// 删除用户 +export const deleteUser = (id: number) => { + return request.delete({ url: '/system/user/delete?id=' + id }) +} + +// 导出用户 +export const exportUser = (params) => { + return request.download({ url: '/system/user/export', params }) +} + +// 下载用户导入模板 +export const importUserTemplate = () => { + return request.download({ url: '/system/user/get-import-template' }) +} + +// 用户密码重置 +export const resetUserPwd = (id: number, password: string) => { + const data = { + id, + password + } + return request.put({ url: '/system/user/update-password', data: data }) +} + +// 用户状态修改 +export const updateUserStatus = (id: number, status: number) => { + const data = { + id, + status + } + return request.put({ url: '/system/user/update-status', data: data }) +} + +// 获取用户精简信息列表 +export const getSimpleUserList = (): Promise => { + return request.get({ url: '/system/user/list-all-simple' }) +} diff --git a/src/api/system/user/profile.ts b/src/api/system/user/profile.ts new file mode 100644 index 0000000..b2623c8 --- /dev/null +++ b/src/api/system/user/profile.ts @@ -0,0 +1,77 @@ +import request from '@/config/axios' + +export interface ProfileDept { + id: number + name: string +} +export interface ProfileRole { + id: number + name: string +} +export interface ProfilePost { + id: number + name: string +} +export interface SocialUser { + id: number + type: number + openid: string + token: string + rawTokenInfo: string + nickname: string + avatar: string + rawUserInfo: string + code: string + state: string +} +export interface ProfileVO { + id: number + username: string + nickname: string + dept: ProfileDept + roles: ProfileRole[] + posts: ProfilePost[] + socialUsers: SocialUser[] + email: string + mobile: string + sex: number + avatar: string + status: number + remark: string + loginIp: string + loginDate: Date + createTime: Date +} + +export interface UserProfileUpdateReqVO { + nickname: string + email: string + mobile: string + sex: number +} + +// 查询用户个人信息 +export const getUserProfile = () => { + return request.get({ url: '/system/user/profile/get' }) +} + +// 修改用户个人信息 +export const updateUserProfile = (data: UserProfileUpdateReqVO) => { + return request.put({ url: '/system/user/profile/update', data }) +} + +// 用户密码重置 +export const updateUserPassword = (oldPassword: string, newPassword: string) => { + return request.put({ + url: '/system/user/profile/update-password', + data: { + oldPassword: oldPassword, + newPassword: newPassword + } + }) +} + +// 用户头像上传 +export const uploadAvatar = (data) => { + return request.upload({ url: '/system/user/profile/update-avatar', data: data }) +} diff --git a/src/api/system/user/socialUser.ts b/src/api/system/user/socialUser.ts new file mode 100644 index 0000000..79f4d40 --- /dev/null +++ b/src/api/system/user/socialUser.ts @@ -0,0 +1,31 @@ +import request from '@/config/axios' + +// 社交绑定,使用 code 授权码 +export const socialBind = (type, code, state) => { + return request.post({ + url: '/system/social-user/bind', + data: { + type, + code, + state + } + }) +} + +// 取消社交绑定 +export const socialUnbind = (type, openid) => { + return request.delete({ + url: '/system/social-user/unbind', + data: { + type, + openid + } + }) +} + +// 社交授权的跳转 +export const socialAuthRedirect = (type, redirectUri) => { + return request.get({ + url: '/system/auth/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri + }) +} diff --git a/src/assets/imgs/Eyes-closed.png b/src/assets/imgs/Eyes-closed.png new file mode 100644 index 0000000000000000000000000000000000000000..450f114645d1ce69dd4e9bbce541cd392b4024ee GIT binary patch literal 6454 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 literal 0 HcmV?d00001 diff --git a/src/assets/imgs/avatar.jpg b/src/assets/imgs/avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d46a70a46430e31744420865138cc7eedb8b77e1 GIT binary patch literal 6264 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 BLq7lj literal 0 HcmV?d00001 diff --git a/src/assets/imgs/code.png b/src/assets/imgs/code.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4c16f913928a6490c26c7b0b96c05c55f8a9c1 GIT binary patch literal 4871 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 literal 0 HcmV?d00001 diff --git a/src/assets/imgs/eye.png b/src/assets/imgs/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..e149f7cba7a8e287485690484717c5f7a108e5a3 GIT binary patch literal 8173 zcmdU!Ra6}9lg5ESa2o;yw}D{6-DQwLgA5)t1Hs)LhF}4LySux?1cm^~;2K;)AUFgF z1Yf@If6ngS@6}#(zZYHIr%rd*TTeZ|=rHOaM+4Cjl!NSNExqef9oIIRV&DOiV>8H-gfx!Q6vSKN0om=X_=Mhe<}MBt;v_ zmoW4xCzH#s{0xxwnz!wMZ|Cz{5|^E=S4OQJE8SODe}ixH12v9%KWn;-F>DYilcItl z-8#oaE?67NyDXvd^iXtaY#o9Sof9G#poe=O!zVtpco-XIU!^ye2%t;!=@tr9B}B@z zjal)h$W>|=tdfr*OcqE~mwlS2NGAdjbZy1HM4oLFkv{~eN^-)O)M#u>8_F4OC^>$S zAxwqY&j>>t1BR{-w+-IAMhw;MvcLe>+YZJC~Gc2X1fp77uevoy_;`4g`ZB}^cS7B!Q(b%^B zn>X+y{g39Lf-N)OyuD6p3`p5CB_;ZK6=EF1*wcb}3bA*=v|WyE4vo{3cof^p3l$|^OT4E6@i$f72RLuPZ*Qx^hS+KcT?PVwZlqj;Dj{RxH`$uL8i9yuOj>4-LK??s(_>=l6TatPghi51r-=_I?wIUYz&?kmetob&!?4qcDV~0ik6x-7yF|K9p8NtR{@3iCM4tNQ z-kDr^ke~2@tb=tD7D**PF;x3)1}l#i%)5%OQ)f{xP6vLzKf-zQ>wKF~Z*eY+Hf1CeG;nFHX|4R8z~FP2S$IHjI%x>$1APMlbBdH6WCv+w*tp7ZkU0DMYogNc5Mi4^ zuMH{^Q%fy9f+(9X*bZMU0ucJS&6knYfw-bTf)UXbkO+xY*cVz}iE)f2x33e+ti&0% zXu_6}H8tZ zjd)rf{jt`dp%nFe7}bk>!BuzD^i}WnUc;*%5)5QEc_&`GJ+!NqL+I+rC$hXNsx8N8uRZ_h$v_UWT1diArj|uL%j%3n_H~bd;8@ z@Cj%J*+r;R@K`Q|(9XTeDRZGj09DoM*f=Y0+*+A01x6d}m@m-oF*nduQT#xge#A~- zcieserLrSKKR9~wxf zBF)3CfD*)w?6lo!2gkv#n}Q5d{I$^^y+W(m;kr64h0Jr!PP5NUeRHj}2$22#SeTjl zb9Z={sM$Pb^xF%{x$4Gai#iJ(^Xb9PU|D1?PUw#3U!0{^(|igkxa{|5wE`FAa&q-0 zHuNhQ9|o}OL54=Zw~uu%+6yjr?L7`rtujp`_e6QhBi3dR4Xd8KzLHch-R;{zq-6N{ z&rAa7pi~Xft`fu`gpbJ!+O0*86y~_Mtoy>e1bAgpSVLZQ)(YyS*1P0~aUhB^t~Bkl z$#*?@rSl{$u_}>v#_c9OP2&pJ5-#tiLjkP%0l$-HvstmvL)U;Ven|vE9@y)sY40qm zE&K|sF-($)6r~k>P@r*+Hk@Pg&l|ARH@mW2oDEVEfG@&-USjvksGAbG*RXxN@FIccs=?&?; zYMg?h@x2#I5qSk$$Mpm8V`Fq-cxO^-_=tO;3EVpVj_WxoO|(FD(Pbm(h5MdJA`4PsGJHV?qNOUVT8yP~g5oOFzCDus9R zFCDjyS;0;hgfRGM0tZ=R;w0{D0EH!dQ>CQRMXQz7OdVv1rqa`t7vrXiR;8$0hzJ+m zl*^{oI)~oJu#zXd5AdL=!wQUMF4y9G+G{WD8BJd1KKiG=(_Vj#7uYGu5Exy-hVEAr zCRy$S`&GIoVwkjp8cWk~g(jGNYaK3`sGDA8@>G+b6a3IX8i)YH&p;$pi>eFLmvGj6 z)5t6+@e};ZYz|L>^J30G)>Y$CJnpXug=@2DRNk8 z6xg*)EShY}^J8#YUpoh!Q%z3aNUTTZF>bTiR!@)^Zp0P?VN=3k?$wJ}SX=hOl8KWO zF+)^@0Vw|Y*wK6b#e5FvqUZ8v&jHh^S(Myw&PDtj?4BPgH1^Grnn_tDJ4Pg#)*$qg z8rU$E2yf1kSv?fw5IeSiJ+)p6B;i%Mn=I*TDmL*}efDR*$3Tb|Cy}>ON036yq)1y= zoPPR-22pktQc={#*WyMJl5R)q-JWb$)`=6Zh0rR-<9x|OY-HBfyUt1nDh93R4lYt0 zVcaAgfqm4Qs;jswsXNwmfC=1t#%7WE!cN&=7GcA;L;O}_duPi|vmUL0@g7CO6|po- zfX_P|c{7|=r4fsPCixRW}u$Gs)W-Fr2~3K4Ye>Md79my1pux-4%d zHqP~(_o=pm3^$T?EtX|1H35_KZ&(j(bgzdqe#dDCI3h&W+#bu1IKC#K6O(e)+)Phl zm&Yp`7?kn1jPJ8Dbx;{fs>*~%kXL+5$o$IofVH(S7eiD?(;cM}7L{aW4XtYl#IJP( z1QnFrCX6&1rCtqT8EKNZ*cD)2g^E7fDIL!Vp{X~XvNqh4qIfn1Bkz)_^D9PM4@`du(f7(ks%d2} zgg_p657XOJ+S(PKgvo@qg|7oapR=6VgMi|7CecyqAKDZ`8^ppY)wN0O(0WZS_krU@ zKgS*kR^%Wwo7J8D-Yu~D%$TK6fBrLw>Lk>)^i@D@eF9i$)y$ss3+pX&z!|H`jQ1yI z#I%amc!Ihtc~~!L7ajMR1S05d)Z+3R9Ysb2kruxqB6wY)rfa&d+fRiyIUZ z`(2vNTWn71(BX_zVi(60xid1exMOmvJd1&s9ikKSO#4ishVBlX(kz|uu>4wc*xkgHcS9a?4=O>Ee90FWh z$bpginH&ix>VKnvqnJ06p^L5tSYN!1MOpl|9LJzXweK?hiJL`GL9<=tk+coNfOx#(#kRHa;bJb$ z44R|>CdXC21aUA$!ymE1cPt$#fCnJ1ahMu}13& zh`H~m(qj?72o4w_ZoDcSEBCgX&r-4$_`+Ks7fKGuYA&?Ga94d;%@u1Jc10#Nn2{-Q z2|o`tHGB*>hu?XvI`|5*|BlPaG!{{UT~kh21?iS4a+R;@028SuKgiUV#3m~4-&ZVe z)pMMzUpwq^0XfnA66G%Z#SvKztl;lOyDz_3Pgg~hS@*_o-<;0mrbCXQXO4t2m^SR< z1g7ZEdYkIvi$U3aMKRpsKUG&lVR6N_r##5un7)J~M)bB%R(?>YE@<@f@5(pR2apfz z(WDQrF@*~`>n}zoj1y;+4OvGShdCkE*gd7GuEnhhofdD{Vp74?UXi{QnL#09;W%52 zana_}&3AvO=*GN(76sPg2nSWrGG7P735Ff~o8PTdh>v2b4N(v?;<0o*nX%^$IZG^` zp+!^Q&yE>(5LLmu67`qEp+e3pCm-cLmSWXm2a0-U!;gR;tGV(JgjMjI6t#@vnI9Nc zQ(*TbJT$addI7wm(R?#!p>;3*W>?^k_kWZ%d!F5a7yHy=MCH|wCs~(clZwrC@Wb_T z?AKmiLpcK9<_i&hog{Z(?qTPgDQ;c+%F+=`mDe`?2R@lTo;l0i4g&#W|Zm2WgP zxyy9d-oWabJ7T~1(M#M9DoMV*?={@{z{L0|`W}(ndy2flNO4ZseVa|wGHy8M>n0x# zJXdD0>SO=aj=P6lMv}Lba*@p&^{-tYFY8!s>?vJ8+GShDwV}6_!)MJ{(r|vWi z=`0==NrH7h@?UIofLUX-l^8KQvemrxGqV!yONxDR&6FsVU*YOr`?Q)Jj{?Y|-$MBc zI#heRYd$QQ@gwXgj+LdhET9Es4o5#kT6Koq)kX zUJ`uRW+a-&8$GyG zCd&KiUPIhpXZ$Hsyd$>IGHvcl>&-G(puBS=>k8wE>$Y+&m2VH^QnWMEqgAM7$C@#~ ze`_nybKsHmag!H95bdFNnbz<iHS>+VSGr%BGdd~1tVpY7mqChNV4e*}uJVemLqXw~(98Ss~~E zD4?{IGS~M-58Zq6S1VkKr8bl4^MSd;p*#-reLZ`e_W*n$H4Y7d-3TGXfMq;4(|9Mu;4YJ+fR3E(PS9n*5=f$%y9N*X`)sAEDr_ z+Er=M*LL^WXsCl7LS4E``+$N8DRNX`%>IE^4h{5VVt+vBw%* zvb;KH=+I;Uui;&dy=j4b-|Pb3K>?@FGEl%qb$HvL7U^&0j*gg2ui)4KSvtXM=*YJ7 zlwoml42(HiY{)U8t|y(hkLTyQXsr_FT*-f47{uGEX5{3U-0<6=OU>qe@9&_OHqGf# zp(yZej|2A9lckvEi@4EKYBS}FAFv{Jbjf}8{vd!>sd1^TF0kJYu6eK zxIYUe!w3U<7?#RkTP|>?FTYDB-z^UX?OV-93`EA9f!ZIG=vqkQ*LfDGPZxkIQdk>G<3+aF zoLUsnKCszMLnew%1>)TM4(i}hk-uWJXKLWN*uI2aw3e_G2F|8AL|4q5RGfFZE9^esmj-JsGu%R#!XO5F`c~Y(_vO!&)rZQjV+*pA; z9D=r?3IaT>ZNFOgy~%)UDCU3_MH2UcKB!ZKY_pr(Phoe2{Kq6Y6?QhLhaiJIa?{`7 zyK`-v#pV+K_VpK!_=5LFhU^;?1?kNZT+Rk35=xojZ zd4Bz@kh`(hc}PWW3shJmT=FL%a7zMn5p`mUI^&87+mQcj4ljU^K1e<)fd#`vK0)B@11EOu z8C~=~jcg`)g)d(R%3sy&!zJrj#MOZ(ywNM~?km|XW$Oq*v18lW)-I2nl!$fkOibntLt3{w;&?F6MUC_TB#x^Tr<|sV1Pwm`k88 z`!JY@z11RivHch5!J;U)r6x6*4f{!}-u~?UUX_SrCoQv}#tR8k-Nz>7mk!aau9f0gHiFZ4VFGk!7wfCm>8mg zf3X4I?BzOdF~_19{(k(KWc&7K$3a1$Vc@a@?@7?SV0}#)8S(qL6%8l2#-{mD3*g%TJN z;N0>j-9a3YAU?v1expT7RxlbR|DepLaBW>`_TW_#r1dCC3J{`IpV1_7?e2q+npJ6q zQAv-GtL1*AEyvdy;X=>)zDc5JeJ+{Gg2YG- z;-z|wZl6_NFd(kiN#I?H8cI`aB$dG=QnApYwJmKvAfZ7sH5@z2egIu1c?&*X73CQ3 zrISwi&gYfrg5Rs<((d~2o3G83wb=N5>5VY1Y+SkQ!Y205jS+E{(JV<2#dhvE8UK#2 z{i~;?eyCIfu@fT_O|437xt>hnI*%>wkTjLWpTxA3lSr@@lD7mjyTK$&>8@y|&*9FV z{xE?9aC+9?gy2ZXXfkD7v0VNTyp&uvF&-n1L@eY=p`%wae|fM}Yr+vR+~JzXqgd^|Pd18yak?lW699 zbNsXz7ast9OW~Ff#HsRfB-iodUS-{XyiS?n#o-?)YX7>OLS!^eNicjyu9^1l2XUmX zdepLe+B?N))uhjRZ75874EEn5M-ER1V+F}Ith@R=Xr$h|e2f@h$scJncd5&e)H%p% z1+IM1U3+l&K7oZdf1rCa#3v%6l-JCKB&HGw?9`~~9ltP%4My>-V>E(kk|!a6up(0iSBSf6CwTCHJSg>Ws)h>?>u z&uML@eB)zauC=SWvQ63bfq?`lU^?EVJ^ZH)4)uH#{l?UKYOx~)mOR4L zA2fD1dN3L~D(!bXex#*@aMU0}lQiBu{1_CwwD^Lix0sfsW4`T%T&rKw?uos;oO=O= zj90L%3%yg4#HOLpVb&@~`iBKbD#A)X(m786u1^(J5KYgt#|ArHVhVl>lu2PqIyiFWJ3%04n+iZ*%_ z5$S$*bv?Fe__M1<^8>~>yyz5{4q`x7LvXXuMv~-_h*(iMJpAOPlz;QVyMOv2MOYct+LXkLcsAM$+UvPm(HwB+7z!sPc49X5@JpReLP;o<-9L4O}( XP-B+mvrlZE_&o|(K?77LXCC%nXl$K0 literal 0 HcmV?d00001 diff --git a/src/assets/imgs/icon1.png b/src/assets/imgs/icon1.png new file mode 100644 index 0000000000000000000000000000000000000000..e9cf7d11bdfe495142406c4378d251a4d3cd6e25 GIT binary patch literal 19605 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 R!v9_XT}^$BN;TU{{{!@W^m_mR literal 0 HcmV?d00001 diff --git a/src/assets/imgs/icon3.png b/src/assets/imgs/icon3.png new file mode 100644 index 0000000000000000000000000000000000000000..2c3e20197a192e5466b1eed9186792cf7a0967cc GIT binary patch literal 10459 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 G68k^BKaHUP literal 0 HcmV?d00001 diff --git a/src/assets/imgs/icon6.png b/src/assets/imgs/icon6.png new file mode 100644 index 0000000000000000000000000000000000000000..976d00b74d6d9c696b11761d864a99eb72f0c9e1 GIT binary patch literal 5382 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